diff --git a/.appveyor.yml b/.appveyor.yml index 2b72b508a288f..ee4818c7917e0 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,5 +1,5 @@ version: '{branch}.{build}' -image: Previous Visual Studio 2019 +image: Visual Studio 2019 configuration: Release platform: x64 shallow_clone: true diff --git a/.clang-tidy b/.clang-tidy index 77f4f5274f2a0..6bebf2ef578c9 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -35,8 +35,6 @@ readability-*,\ -modernize-return-braced-init-list,\ -modernize-use-default-member-init,\ -modernize-use-emplace,\ --modernize-use-transparent-functors,\ --performance-for-range-copy,\ -performance-inefficient-vector-operation,\ -performance-noexcept-move-constructor,\ -performance-implicit-conversion-in-loop,\ diff --git a/.gitignore b/.gitignore index 5776d2ca2ed77..e5a0613ca1770 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,9 @@ Cataclysm.exe.lastcodeanalysissucceeded #Visual Studio 2017 /msvc-full-features/PredictedInputCache_Debug_x64.dat +#vcpkg +/msvc-full-features/vcpkg_installed + # PVS Studio /msvc-full-features/*PVS-Studio* diff --git a/CMakeLists.txt b/CMakeLists.txt index c861a2084ca0b..8f3dfebb451e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ set(PREFIX "" CACHE STRING "Location of Data & GFX directories") include(CTest) include(GetGitRevisionDescription) -git_describe(GIT_VERSION) +git_describe(GIT_VERSION --tags --always --match "[0-9A-Z]*.[0-9A-Z]*") MESSAGE("\n * Cataclysm: Dark Days Ahead is a turn-based survival game set in a post-apocalyptic world.") MESSAGE(" _________ __ .__ ") diff --git a/build-scripts/build.sh b/build-scripts/build.sh index c7cdd1a135996..eebe7f135dedc 100755 --- a/build-scripts/build.sh +++ b/build-scripts/build.sh @@ -124,7 +124,6 @@ then else remaining_cpp_files="$all_cpp_files" fi - set -x function analyze_files_in_random_order { @@ -142,6 +141,7 @@ then echo "Analyzing remaining files" analyze_files_in_random_order "$remaining_cpp_files" + set -x else # Regular build make -j$num_jobs diff --git a/build-scripts/clang-tidy-wrapper.sh b/build-scripts/clang-tidy-wrapper.sh index b1ea138356676..4ff613644422e 100755 --- a/build-scripts/clang-tidy-wrapper.sh +++ b/build-scripts/clang-tidy-wrapper.sh @@ -5,7 +5,6 @@ set -o pipefail plugin=build/tools/clang-tidy-plugin/libCataAnalyzerPlugin.so -set -x if [ -f "$plugin" ] then LD_PRELOAD=$plugin "$CATA_CLANG_TIDY" "$@" diff --git a/data/core/basic.json b/data/core/basic.json index 8ea36066cbbf7..b825d6e455bfe 100644 --- a/data/core/basic.json +++ b/data/core/basic.json @@ -12,8 +12,8 @@ "category": "food", "name": { "str_sp": "water" }, "description": "Water, the stuff of life, the best thirst-quencher available. It would be safer to drink once purified.", - "weight": 250, - "volume": 1, + "weight": "250 g", + "volume": "250 ml", "price": 50, "symbol": "~", "color": "light_blue", diff --git a/data/json/achievements.json b/data/json/achievements.json index e1b584009534c..66decd2db0948 100644 --- a/data/json/achievements.json +++ b/data/json/achievements.json @@ -73,7 +73,7 @@ "id": "achievement_marathon", "type": "achievement", "name": "Pheidippides was a hack", - "description": "Run a marathon…plus a little bit more.", + "description": "Run a marathon… plus a little bit more.", "requirements": [ { "event_statistic": "num_moves_ran", "is": ">=", "target": 42196 } ] }, { @@ -181,5 +181,545 @@ "description": "Return to the location you started the game" } ] + }, + { + "id": "achievement_cut_1_tree", + "type": "achievement", + "name": "Timber", + "description": "If a tree falls in a forest and no one is around to hear it, does it make a sound?", + "requirements": [ { "event_statistic": "num_cuts_tree", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_cut_1_tree" ] + }, + { + "id": "achievement_cut_100_trees", + "type": "achievement", + "name": "Lumberjack", + "description": "What is a forest for a man with an axe?", + "requirements": [ { "event_statistic": "num_cuts_tree", "is": ">=", "target": 100 } ], + "hidden_by": [ "achievement_cut_1_tree" ] + }, + { + "id": "achievement_cut_1000_trees", + "type": "achievement", + "name": "Deforestation", + "description": "If you cut down the trees you will find the wolf.", + "requirements": [ { "event_statistic": "num_cuts_tree", "is": ">=", "target": 1000 } ], + "hidden_by": [ "achievement_cut_100_trees" ] + }, + { + "id": "achievement_exhume_1_grave", + "type": "achievement", + "name": "Grave Digger", + "description": "That's exactly what we need: more dead bodies.", + "requirements": [ { "event_statistic": "num_exhumed_graves", "is": ">=", "target": 1, "visible": "when_achievement_completed" } ], + "hidden_by": [ "achievement_exhume_1_grave" ] + }, + { + "id": "achievement_exhume_10_graves", + "type": "achievement", + "name": "Grave Robber", + "description": "Hey, what if they turned down there? You've gotta check.", + "requirements": [ { "event_statistic": "num_exhumed_graves", "is": ">=", "target": 10 } ], + "hidden_by": [ "achievement_exhume_1_grave" ] + }, + { + "id": "achievement_bury_1_corpse", + "type": "achievement", + "name": "Funeral", + "description": "It's a privilege to be buried when billions will not be.", + "requirements": [ { "event_statistic": "num_buried_corpses", "is": ">=", "target": 1, "visible": "when_achievement_completed" } ], + "hidden_by": [ "achievement_bury_1_corpse" ] + }, + { + "id": "achievement_bury_10_corpses", + "type": "achievement", + "name": "Undertaker", + "description": "Leave no one to rot among the living dead.", + "requirements": [ { "event_statistic": "num_buried_corpses", "is": ">=", "target": 10 } ], + "hidden_by": [ "achievement_bury_1_corpse" ] + }, + { + "id": "achievement_bury_100_corpses", + "type": "achievement", + "name": "Funeral House", + "description": "You cannot bury the whole world, can you?", + "requirements": [ { "event_statistic": "num_buried_corpses", "is": ">=", "target": 100 } ], + "hidden_by": [ "achievement_bury_10_corpses" ] + }, + { + "id": "achievement_install_1_cbm", + "type": "achievement", + "name": "Cyberpunk", + "description": "Spiritus quidem promptus; caro vero infirma.", + "requirements": [ { "event_statistic": "num_installs_cbm", "is": ">=", "target": 1, "visible": "when_achievement_completed" } ] + }, + { + "id": "achievement_install_10_cbms", + "type": "achievement", + "name": "Clockwork Man", + "description": "By most mechanical and dirty hand. I shall have such revenges on you… both. The things I will do, what they are, yet I know not. But they will be the terrors of the earth.", + "requirements": [ { "event_statistic": "num_installs_cbm", "is": ">=", "target": 10 } ], + "hidden_by": [ "achievement_install_1_cbm" ] + }, + { + "id": "achievement_crosses_mutation_threshold", + "type": "achievement", + "name": "Homo Evolutis", + "description": "World of man has ended. Long live the world of transhumanism.", + "requirements": [ + { + "event_statistic": "num_crosses_mutation_threshold", + "is": ">=", + "target": 1, + "visible": "when_achievement_completed" + } + ] + }, + { + "id": "achievement_break_major_limbs", + "type": "achievement", + "name": "Broken But Not Defeated", + "description": "Does your medical insurance cover that?", + "requirements": [ + { "event_statistic": "num_broken_right_leg", "is": ">=", "target": 1, "visible": "when_requirement_completed" }, + { "event_statistic": "num_broken_left_leg", "is": ">=", "target": 1, "visible": "when_requirement_completed" }, + { "event_statistic": "num_broken_right_arm", "is": ">=", "target": 1, "visible": "when_requirement_completed" }, + { "event_statistic": "num_broken_left_arm", "is": ">=", "target": 1, "visible": "when_requirement_completed" } + ] + }, + { + "id": "achievement_lvl_7_barter", + "type": "achievement", + "name": "Free Trader", + "description": "Extraordinary gizmos for obscenely low prices!", + "requirements": [ { "event_statistic": "num_gains_barter_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_barter", + "type": "achievement", + "name": "Cut-Me-Own-Throat Dibbler", + "description": "My Innuit friend, I'm selling you this ice for such a low price, that it's cutting me own throat.", + "requirements": [ { "event_statistic": "num_gains_barter_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_barter" ] + }, + { + "id": "achievement_lvl_7_speech", + "type": "achievement", + "name": "Eloquent", + "description": "We're frends, aren't we?", + "requirements": [ { "event_statistic": "num_gains_speech_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_speech", + "type": "achievement", + "name": "Silver Tongue", + "description": "Legend has it that you convinced a zombie hulk to go away.", + "requirements": [ { "event_statistic": "num_gains_speech_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_speech" ] + }, + { + "id": "achievement_lvl_7_computer", + "type": "achievement", + "name": "HackerMan", + "description": "This OS has a back door. There is always a back door.", + "requirements": [ { "event_statistic": "num_gains_computer_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_computer", + "type": "achievement", + "name": "Still not quite like Kevin", + "description": "It's not cheating. It's debugging.", + "requirements": [ { "event_statistic": "num_gains_computer_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_computer" ] + }, + { + "id": "achievement_lvl_7_firstaid", + "type": "achievement", + "name": "MD", + "description": "Is there a doctor in the house?", + "requirements": [ { "event_statistic": "num_gains_firstaid_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_firstaid", + "type": "achievement", + "name": "Dr House", + "description": "It's lupus.", + "requirements": [ { "event_statistic": "num_gains_firstaid_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_firstaid" ] + }, + { + "id": "achievement_lvl_7_mechanics", + "type": "achievement", + "name": "Engineer", + "description": "Just give me my wrench.", + "requirements": [ { "event_statistic": "num_gains_mechanics_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_mechanics", + "type": "achievement", + "name": "MacGyver", + "description": "This whole deal is holding on faith, spit and duct tape.", + "requirements": [ { "event_statistic": "num_gains_mechanics_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_mechanics" ] + }, + { + "id": "achievement_lvl_7_traps", + "type": "achievement", + "name": "Trapper", + "description": "A good trap doesn't discriminate between beavers and zombeavers.", + "requirements": [ { "event_statistic": "num_gains_traps_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_traps", + "type": "achievement", + "name": "Minesweeper", + "description": "All it takes is one mistake.", + "requirements": [ { "event_statistic": "num_gains_traps_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_traps" ] + }, + { + "id": "achievement_lvl_7_driving", + "type": "achievement", + "name": "Ace Driver", + "description": "No turn is too sharp.", + "requirements": [ { "event_statistic": "num_gains_driving_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_driving", + "type": "achievement", + "name": "The Stig", + "description": "Formula One is for Sunday drivers.", + "requirements": [ { "event_statistic": "num_gains_driving_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_driving" ] + }, + { + "id": "achievement_lvl_7_swimming", + "type": "achievement", + "name": "Swimmer", + "description": "Like a fish to water.", + "requirements": [ { "event_statistic": "num_gains_swimming_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_swimming", + "type": "achievement", + "name": "Michael Phelps", + "description": "Faster then Jaws.", + "requirements": [ { "event_statistic": "num_gains_swimming_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_swimming" ] + }, + { + "id": "achievement_lvl_7_fabrication", + "type": "achievement", + "name": "Do-It-Yourselfer", + "description": "Take this thing, put it in that thing, and voila.", + "requirements": [ { "event_statistic": "num_gains_fabrication_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_fabrication", + "type": "achievement", + "name": "Jack of All Trades", + "description": "With a right ammount of glue, there is nothing I can't do.", + "requirements": [ { "event_statistic": "num_gains_fabrication_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_fabrication" ] + }, + { + "id": "achievement_lvl_7_cooking", + "type": "achievement", + "name": "Master Chef", + "description": "Glazed tenderloin is a cakewalk.", + "requirements": [ { "event_statistic": "num_gains_cooking_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_cooking", + "type": "achievement", + "name": "Hell's Kitchen", + "description": "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee.", + "requirements": [ { "event_statistic": "num_gains_cooking_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_cooking" ] + }, + { + "id": "achievement_lvl_7_tailor", + "type": "achievement", + "name": "Tailor", + "description": "A needle, a thread and a dream.", + "requirements": [ { "event_statistic": "num_gains_tailor_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_tailor", + "type": "achievement", + "name": "Fashion Designer", + "description": "Male, feamale and mutant fashion alike.", + "requirements": [ { "event_statistic": "num_gains_tailor_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_tailor" ] + }, + { + "id": "achievement_lvl_7_survival", + "type": "achievement", + "name": "Survivalist", + "description": "Survival is my game.", + "requirements": [ { "event_statistic": "num_gains_survival_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_survival", + "type": "achievement", + "name": "Bear Grylls", + "description": "So you say you can survive on your own urine?", + "requirements": [ { "event_statistic": "num_gains_survival_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_survival" ] + }, + { + "id": "achievement_lvl_7_electronics", + "type": "achievement", + "name": "Ohm's Law", + "description": "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile.", + "requirements": [ { "event_statistic": "num_gains_electronics_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_electronics", + "type": "achievement", + "name": "Nicola Tesla", + "description": "One does not simply taste a 9V battery.", + "requirements": [ { "event_statistic": "num_gains_electronics_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_electronics" ] + }, + { + "id": "achievement_lvl_7_archery", + "type": "achievement", + "name": "Bull's Eye", + "description": "Better then Legolas.", + "requirements": [ { "event_statistic": "num_gains_archery_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_archery", + "type": "achievement", + "name": "Robin Hood", + "description": "Wilhelm Tell? Never heard of.", + "requirements": [ { "event_statistic": "num_gains_archery_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_archery" ] + }, + { + "id": "achievement_lvl_7_gun", + "type": "achievement", + "name": "Eagle Eye", + "description": "Only me and my target.", + "requirements": [ { "event_statistic": "num_gains_gun_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_gun", + "type": "achievement", + "name": "Deadshot", + "description": "Don't run. You'll die tired.", + "requirements": [ { "event_statistic": "num_gains_gun_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_gun" ] + }, + { + "id": "achievement_lvl_7_launcher", + "type": "achievement", + "name": "Gunner", + "description": "Caliber makes the difference.", + "requirements": [ { "event_statistic": "num_gains_launcher_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_launcher", + "type": "achievement", + "name": "Rocket Man", + "description": "I'm sending you to the moon. In pieces.", + "requirements": [ { "event_statistic": "num_gains_launcher_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_launcher" ] + }, + { + "id": "achievement_lvl_7_pistol", + "type": "achievement", + "name": "Small But Deadly", + "description": "Caliber doesn't count when you're on the recieving side of the barrel.", + "requirements": [ { "event_statistic": "num_gains_pistol_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_pistol", + "type": "achievement", + "name": "Dirty Harry", + "description": "But being this is a .44 Magnum, the most powerful handgun in the world and would blow your head clean off, you've gotta ask yourself one question: Do I feel lucky? Well, do ya, punk?", + "requirements": [ { "event_statistic": "num_gains_pistol_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_pistol" ] + }, + { + "id": "achievement_lvl_7_rifle", + "type": "achievement", + "name": "Rifleman", + "description": "This is my rifle. There are many like it, but this one is mine. My rifle is my best friend. It is my life. I must master it as I must master my life.", + "requirements": [ { "event_statistic": "num_gains_rifle_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_rifle", + "type": "achievement", + "name": "Soldier", + "description": "Without me, my rifle is useless. Without my rifle, I am useless. I will keep my rifle clean and ready, even as I am clean and ready. We will become part of each other.", + "requirements": [ { "event_statistic": "num_gains_rifle_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_rifle" ] + }, + { + "id": "achievement_lvl_7_shotgun", + "type": "achievement", + "name": "Double Barrel, Double Fun", + "description": "When you want to hit your target nine times with one shot.", + "requirements": [ { "event_statistic": "num_gains_shotgun_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_shotgun", + "type": "achievement", + "name": "Elmer Fudd", + "description": "What's up doc? Hunting wabbits?", + "requirements": [ { "event_statistic": "num_gains_shotgun_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_shotgun" ] + }, + { + "id": "achievement_lvl_7_smg", + "type": "achievement", + "name": "Spray'n'Pray", + "description": "One will hit. It's a matter of statistics.", + "requirements": [ { "event_statistic": "num_gains_smg_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_smg", + "type": "achievement", + "name": "SMG Goes BRRRT!", + "description": "We definitely need more ammo.", + "requirements": [ { "event_statistic": "num_gains_smg_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_smg" ] + }, + { + "id": "achievement_lvl_7_throw", + "type": "achievement", + "name": "Yeet!", + "description": "And never come back.", + "requirements": [ { "event_statistic": "num_gains_throw_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_throw", + "type": "achievement", + "name": "Kobe Bryant", + "description": "Frag out!", + "requirements": [ { "event_statistic": "num_gains_throw_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_throw" ] + }, + { + "id": "achievement_lvl_7_melee", + "type": "achievement", + "name": "Brawler", + "description": "Bottle in left hand, chair leg in right hand.", + "requirements": [ { "event_statistic": "num_gains_melee_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_melee", + "type": "achievement", + "name": "Street Fighter", + "description": "It's winning that matters, not the style.", + "requirements": [ { "event_statistic": "num_gains_melee_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_melee" ] + }, + { + "id": "achievement_lvl_7_bashing", + "type": "achievement", + "name": "Batter", + "description": "Every strike brings me closer to a home run.", + "requirements": [ { "event_statistic": "num_gains_bashing_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_bashing", + "type": "achievement", + "name": "Stone Age", + "description": "Cudgel was humanity's first tool. And it may be it's last, so why not master it?", + "requirements": [ { "event_statistic": "num_gains_bashing_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_bashing" ] + }, + { + "id": "achievement_lvl_7_cutting", + "type": "achievement", + "name": "Way of the Sword", + "description": "When the sword is once drawn, the passions of men observe no bounds of moderation.", + "requirements": [ { "event_statistic": "num_gains_cutting_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_cutting", + "type": "achievement", + "name": "Miyamoto Musashi", + "description": "The sword has to be more than a simple weapon; it has to be an answer to life's questions.", + "requirements": [ { "event_statistic": "num_gains_cutting_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_cutting" ] + }, + { + "id": "achievement_lvl_7_dodge", + "type": "achievement", + "name": "Elusive", + "description": "A strongest of blows is nothing if it doesn't land.", + "requirements": [ { "event_statistic": "num_gains_dodge_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_dodge", + "type": "achievement", + "name": "Neo", + "description": "But can you dodge a bullet?", + "requirements": [ { "event_statistic": "num_gains_dodge_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_dodge" ] + }, + { + "id": "achievement_lvl_7_stabbing", + "type": "achievement", + "name": "Cold Steel", + "description": "While you were partying, I studied the blade.", + "requirements": [ { "event_statistic": "num_gains_stabbing_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_stabbing", + "type": "achievement", + "name": "Jack the Ripper", + "description": "Is this a dagger which I see before me, the handle toward my hand? Come, let me clutch thee.", + "requirements": [ { "event_statistic": "num_gains_stabbing_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_stabbing" ] + }, + { + "id": "achievement_lvl_7_unarmed", + "type": "achievement", + "name": "Road to Shaolin", + "description": "I feel an army in my fist.", + "requirements": [ { "event_statistic": "num_gains_unarmed_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_unarmed", + "type": "achievement", + "name": "Mr Miyagi", + "description": "To be your own weapon.", + "requirements": [ { "event_statistic": "num_gains_unarmed_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_unarmed" ] + }, + { + "id": "achievement_lvl_7_lockpick", + "type": "achievement", + "name": "Burglar", + "description": "Crowbar? Such a barbarity.", + "requirements": [ { "event_statistic": "num_gains_lockpick_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_lockpick", + "type": "achievement", + "name": "Locksmith", + "description": "If there is a lock, there is a key.", + "requirements": [ { "event_statistic": "num_gains_lockpick_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_lockpick" ] + }, + { + "id": "achievement_lvl_7_chemistry", + "type": "achievement", + "name": "Periodic Table", + "description": "It's somewhat like cooking. Just don't lick the spoon.", + "requirements": [ { "event_statistic": "num_gains_chemistry_level_7", "is": ">=", "target": 1 } ] + }, + { + "id": "achievement_lvl_10_chemistry", + "type": "achievement", + "name": "Heisenberg", + "description": "You all know who I am. I'm the cook. Say my name.", + "requirements": [ { "event_statistic": "num_gains_chemistry_level_10", "is": ">=", "target": 1 } ], + "hidden_by": [ "achievement_lvl_7_chemistry" ] } ] diff --git a/data/json/anatomy.json b/data/json/anatomy.json index 980cbf0cc0d01..4109d3fddc2a9 100644 --- a/data/json/anatomy.json +++ b/data/json/anatomy.json @@ -7,6 +7,6 @@ { "id": "default_anatomy", "type": "anatomy", - "parts": [ "torso" ] + "parts": [ "torso", "head" ] } ] diff --git a/data/json/artifact/relic_procgen_data.json b/data/json/artifact/relic_procgen_data.json new file mode 100644 index 0000000000000..b9c8593b5ea80 --- /dev/null +++ b/data/json/artifact/relic_procgen_data.json @@ -0,0 +1,125 @@ +[ + { + "type": "relic_procgen_data", + "id": "cult", + "passive_add_procgen_values": [ + { "weight": 100, "min_value": -1, "max_value": 1, "type": "STRENGTH", "increment": 1, "power_per_increment": 250 }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "DEXTERITY", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "PERCEPTION", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "INTELLIGENCE", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -100, + "max_value": 25, + "type": "SPEED", + "increment": 5, + "power_per_increment": 200 + } + ], + "type_weights": [ { "weight": 100, "value": "passive_enchantment_add" } ], + "items": [ { "weight": 100, "item": "spoon" } ] + }, + { + "type": "relic_procgen_data", + "id": "netherum_tunnels", + "passive_add_procgen_values": [ + { "weight": 100, "min_value": -1, "max_value": 1, "type": "STRENGTH", "increment": 1, "power_per_increment": 250 }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "DEXTERITY", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "PERCEPTION", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "INTELLIGENCE", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -100, + "max_value": 25, + "type": "SPEED", + "increment": 5, + "power_per_increment": 200 + } + ], + "type_weights": [ { "weight": 100, "value": "passive_enchantment_add" } ], + "items": [ { "weight": 100, "item": "spoon" } ] + }, + { + "type": "relic_procgen_data", + "id": "alien_reality", + "passive_add_procgen_values": [ + { "weight": 100, "min_value": -1, "max_value": 1, "type": "STRENGTH", "increment": 1, "power_per_increment": 250 }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "DEXTERITY", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "PERCEPTION", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "INTELLIGENCE", + "increment": 1, + "power_per_increment": 250 + }, + { + "weight": 100, + "min_value": -100, + "max_value": 25, + "type": "SPEED", + "increment": 5, + "power_per_increment": 200 + } + ], + "type_weights": [ { "weight": 100, "value": "passive_enchantment_add" } ], + "items": [ { "weight": 100, "item": "spoon" } ] + } +] diff --git a/data/json/ascii_arts.json b/data/json/ascii_arts.json index 67d8c18292ba8..942de32c24045 100644 --- a/data/json/ascii_arts.json +++ b/data/json/ascii_arts.json @@ -219,5 +219,502 @@ " ║ HEAVY ║", " ╚═══════════════╝" ] + }, + { + "type": "ascii_art", + "id": "mp3", + "picture": [ + "", + "", + "            /\\         /\\", + "           /  \\       /  \\", + "          /    \\     /    \\", + "         /      \\   /      \\", + "         ║       \\ /       ║", + "      ___║        |        ║___", + "     |   /        |        \\   |", + "     |__/         |         \\__|", + "                  |", + "                  |", + "                  |", + "     ╔═══════════════════════════╗", + "     ║  ╔═════════════════════╗  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ║                     ║  ║", + "     ║  ╚═════════════════════╝  ║", + "     ║                           ║", + "     ║         .........         ║", + "     ║      ...         ...      ║", + "     ║     .     MENU      .     ║", + "     ║    .      .....      .    ║", + "     ║   .      .     .      .   ║", + "     ║   .  ⏮  .   ⏯   .  ⏭  .   ║", + "     ║   .      .     .      .   ║", + "     ║    .      .....      .    ║", + "     ║     .               .     ║", + "     ║      ...   VOL   ...      ║", + "     ║         .........         ║", + "     ║                           ║", + "     ╚═╦═════════════════════════╝", + "       ║          |", + "       \\          |", + "        \\        /", + "         \\      /", + "          \\    /", + "           \\  /", + "            \\/" + ] + }, + { + "type": "ascii_art", + "id": "lajatang", + "picture": [ + "", + "  .                  .", + " ..                  ..", + " ..                  ..", + " ...                ...", + " ....              ....", + "  ....            ....", + "    .....      .....", + "      ............", + "        ........", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "           ||", + "          ||", + "          ||", + "           ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "          ||", + "           ||", + "           ||", + "           ||", + "           ||", + "           ||", + "          ||", + "          ||", + "       ........", + "     ............", + "    .....      .....", + "  ....            ....", + " ....              ....", + " ...                ...", + " ..                  ..", + " ..                  ..", + "  .                  ." + ] + }, + { + "type": "ascii_art", + "id": "wristwatch", + "picture": [ + "", + "   _____", + "       /     \\", + "        │  o  │", + "        │     │", + "        │  o  │", + "        │     │", + "        │  o  │", + "        │     │", + "        │  o  │", + "        │     │", + "        │  o  │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "       .........", + "    ...   12    ...", + "   .   11  │   1   .", + "  . 10     │      2 .", + " .         │         .", + " . 9       └───     3.", + " .                   .", + "  . 8             4 .", + "   .   7       5   .", + "    ...    6    ...", + "       .........", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        │     │", + "        └─────┘", + "        ║  ║  ║", + "        ╚══╩══╝" + ] + }, + { + "type": "ascii_art", + "id": "mobile_memory_card", + "picture": [ + "", + "", + " ______________", + "   /  ╔╗╔╗╔╗╔╗╔╗╔╗|", + "  /╔╗ ╚╝╚╝╚╝╚╝╚╝╚╝|", + " / ╚╝            |", + " |                |", + " |                |", + " |                |", + " |                |", + " |                |", + " | MADE IN CHINA  |", + " |________________|" + ] + }, + { + "type": "ascii_art", + "id": "halberd", + "picture": [ + "", + "        .", + "        .", + "        .", + "        .", + "       ...", + "       ...", + "       ...", + "       ...      ...", + "       ...     .......", + "       ...    ..........", + "      .....  ............", + "     .....................", + "    .......................", + "   ........................", + "  .........................", + " ...    ..  ..............", + " .      ..   ............", + "        ..    ..........", + "        ..     .......", + "        ..      ...", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        ..", + "        .." + ] + }, + { + "type": "ascii_art", + "id": "1st_aid", + "picture": [ + "", + "", + "            ╔═══════════╗", + "   ════════════════════════════════╗", + "  /         ║           ║          / ║", + " ╔═════════╩═══════════╩═════════╗  ║", + "  ║                               ║  ║", + "  ║             ╔═══╗             ║  ║", + "  ║             ║   ║             ║  ║", + " ║         ╔═══╝   ╚═══╗         ║  ║", + " ║         ║           ║         ║  ║", + "  ║         ╚═══╗   ╔═══╝         ║  ║", + " ║             ║   ║             ║  ║", + " ║             ╚═══╝             ║  ║", + "  ║                               ║ /", + "  ╚═══════════════════════════════╝" + ] + }, + { + "type": "ascii_art", + "id": "thermometer", + "picture": [ + "", + "", + "         :::::::::", + "      :::         :::", + "    ::      ┌─┐      ::", + "   :120_____│ │------50:", + "  :     ____│ │----     :", + " :      ____│ │----      :", + " :100 ______│ │------ 40 :", + " :      ____│ │----      :", + " :      ____│ │----      :", + " : 80 ______│ │------ 30 :", + " :      ____│ │----      :", + " :      ----│ │----      :", + " :      ----││------ 20 :", + " : 60 ------││----      :", + " :      ----││----      :", + " :      ----││------ 10 :", + " :      ----││----      :", + " : 40 ------││----      :", + " :      ____││______ 0  :", + " :      ____││____      :", + " : 20 ______││____      :", + " :      ____││____      :", + " :      ____││------ -10:", + " :      ____││----      :", + " :  0 ------││----      :", + " :          ││------ -20:", + " :          ││          :", + " :          ││          :", + " :  °F      ││      °C  :", + " :          ││          :", + " :          ││          :", + " :::::::::::::::::::::::::" + ] + }, + { + "type": "ascii_art", + "id": "umbrella", + "picture": [ + "", + "", + "                :::::::::::", + "           :::::###########:::::", + "         ::####:###########:####::", + "       ::#####:#############:#####::", + "      :######:###############:######:", + "     :#######:###############:#######:", + "    :#######:#################:#######:", + "   :##:::::::#####:::::::#####:::::::##:", + "  :#::       ::#::  I|I  ::#::       ::#:", + "  :::         :::   I|I   :::         :::", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                    I|I", + "                J   JJJ", + "                JJJJJJJ", + "                 JJJJJ" + ] + }, + { + "type": "ascii_art", + "id": "badge_deputy", + "picture": [ + "", + "                   ⚪", + "                  / \\", + "                 /   \\", + "                /     \\", + "      ⚪ _______/       \\_______ ⚪", + "       \\                        /", + "        \\          /", + "         \\    ════════════    /", + "          \\     DEPUTY     /", + "         /    SHERIFF     \\", + "        /     ════════════    \\", + "       /            \\", + "      /_______           _______\\", + "     ⚪         \\       /         ⚪", + "                \\     /", + "                 \\   /", + "                  \\ /", + "                   ⚪" + ] + }, + { + "type": "ascii_art", + "id": "box_cigarette", + "picture": [ + "", + "                     ╔══╗", + "                ╔══╗   ", + "┌───────────────    ───────────────┐", + "│          ╔══╗                     │", + "│                   ╔══╗          │", + "│     ╔══╗                      │", + "│                             │", + "│                    ╔══╗     │", + "│                           │", + "├─┐                       ┌─┤", + "│ └┐                     ┌┘ │", + "│                         │", + "│                         │", + "│ └──╨──╨─╨──╨─╨──╨─╨──╨─╨──╨─╨──╨──┘ │", + "│                                       │", + "│ _________ .__ │", + "│ \\_ ___ \\|__| ____ ______ │", + "│ / \\ \\/| |/ ___\\/ ___/ │", + "│ \\ \\___| / /_/ >___ \\ │", + "│ \\______ /__\\___ /____ > │", + "│ \\/ /_____/ \\/ │", + "│ ________ __ │", + "│ \\______ \\ _____ _______| | __ │", + "│ | | \\\\__ \\\\_ __ \\ |/ / │", + "│ | ` \\/ __ \\| | \\/ < │", + "│ /_______ (____ /__| |__|_ \\ │", + "│ \\/ \\/ \\/ │", + "│ .____ │", + "│ | | __ __ ____ ____ _____ │", + "│ | | | | \\/ \\ / ___\\/ ___/│", + "│ | |___| | / | \\/ /_/ >___ \\ │", + "│ |_______ \\____/|___| /\\___ /____ >│", + "│ \\/ \\//_____/ \\/ │", + "│ _____ .__ ._ │", + "│ / _ \\ | |__ ____ _____ __| |│", + "│ / /_\\ \\| | \\_/ __ \\\\__ \\ / __ |│", + "│/ | \\ Y \\ ___/ / __ \\_/ /_/ |│", + "│\\____|__ /___| /\\___ >____ /\\____ |│", + "│ \\/ \\/ \\/ \\/ \\/│", + "│                                       │", + "└───────────────────────────────────────┘" + ] + }, + { + "type": "ascii_art", + "id": "textbook_chemistry", + "picture": [ + "", + "   /════════════════════════════════════╗", + "  /───────────────────────────────────┐│", + " /───────────────────────────────────┐││", + "╔═══════════════════════════════════╗│││", + "   Textbook by K.M. Pozdro     │││", + "     ╔═╗╦ ╦╔═╗╔╦╗╦╔═╗╔╦╗╦═╗╦ ╦     │││", + "     ║ ╠═╣║╣ ║║║║╚═╗ ║ ╠╦╝╚╦╝     │││", + "     ╚═╝╩ ╩╚═╝╩ ╩╩╚═╝ ╩ ╩╚═ ╩      │││", + "                        _____     │││", + "                             \\\\   │││", + "                              \\\\  │││", + "                //            /   │││", + "               //            /    │││", + " \\             \\             \\\\   │││", + "  \\             \\_____        \\\\  │││", + "  /       ///   /     \\       /   │││", + " /       ///   /       \\     /    │││", + " \\       /     \\      //     \\    │││", + "  \\_____/       \\____//       \\   │││", + "  /     \\       /             /   │││", + " /       \\_____/        _____/    │││", + " \\       //    \\             \\    │││", + "  \\_____//      \\_____        \\   │││", + "        \\       /    \\\\       //  │││", + "         \\_____/      \\\\     //   │││", + " \\       /     \\       /     \\    │││", + "  \\_____/       \\_____/       \\   │││", + "  /     \\       /             /   │││", + " /       \\_____/        _____/    │││", + "               \\       /          │││", + "                \\_____/           │││", + "                                 ││/", + "                                 │/", + "╚═══════════════════════════════════╝" + ] + }, + { + "type": "ascii_art", + "id": "electrohack", + "picture": [ + "", + "                     ┌────┐", + "                     │□  □│", + "                         ", + "      ╔════════════════════════╗", + "      001100010011001100110011", + "      001101110100100000110100", + "      011110000011000001110010", + "       ╚════════════════════════╝", + "        ╚╝╚╝╚╝               ", + "                             ", + "                             ╚══──", + "                            ╚════──", + "                           ╚══════──" + ] + }, + { + "type": "ascii_art", + "id": "manual_first_aid", + "picture": [ + "   /════════════════════════════════════╗", + "  /───────────────────────────────────┐│║", + " /───────────────────────────────────┐││║", + "╔═══════════════════════════════════╗│││║", + "║                                   │││║", + "║                                   │││║", + "╔╦╗╦ ╦╔═╗ ╔╗ ╦╔═╗ ╔╗ ╔═╗╔═╗╦╔═  │││║", + "║ ╠═╣║╣ ╠╩╗║║ ╦ ╠╩╗║ ║║ ║╠╩╗  │││║", + "╩ ╩ ╩╚═╝ ╚═╝╩╚═╝ ╚═╝╚═╝╚═╝╩ ╩ │││║", + "║  ╔═╗╔═╗ ╔═╗╦╦═╗╔═╗╔╦╗ ╔═╗╦╔╦╗   │││║", + "║  ║ ║╠╣ ╠╣ ║╠╦╝╚═╗ ║ ╠═╣║ ║║   │││║", + "║  ╚═╝╚ ╚ ╩╩╚═╚═╝ ╩ ╩ ╩╩═╩╝   │││║", + "║                                   │││║", + "║              │││║", + "║              │││║", + "║              │││║", + "║              ╔═════╗          │││║", + "║              ║     ║          │││║", + "║              ║     ║          │││║", + "║              ║     ║          │││║", + "║       ╔══════╝     ╚══════╗   │││║", + "║       ║                   ║   │││║", + "║       ║                   ║   │││║", + "║       ╚══════╗     ╔══════╝   │││║", + "║              ║     ║          │││║", + "║              ║     ║              │││║", + "║              ║     ║              │││║", + "║              ╚═════╝              │││║", + "║                                   │││║", + "║                                   │││║", + "║             By C. Red             │││║", + "║                                   ││/", + "║                                   │/", + "╚═══════════════════════════════════╝" + ] } ] diff --git a/data/json/body_parts.json b/data/json/body_parts.json index 9c7ceeb2bc38d..c55f0943ac93b 100644 --- a/data/json/body_parts.json +++ b/data/json/body_parts.json @@ -19,6 +19,7 @@ "hot_morale_mod": 2, "cold_morale_mod": 2, "squeamish_penalty": 6, + "base_hp": 60, "bionic_slots": 80 }, { @@ -41,6 +42,7 @@ "hot_morale_mod": 2, "cold_morale_mod": 2, "squeamish_penalty": 7, + "base_hp": 60, "bionic_slots": 18 }, { @@ -60,6 +62,7 @@ "legacy_id": "EYES", "stylish_bonus": 2, "squeamish_penalty": 8, + "base_hp": 60, "bionic_slots": 4 }, { @@ -81,6 +84,7 @@ "hot_morale_mod": 2, "cold_morale_mod": 2, "squeamish_penalty": 9, + "base_hp": 60, "bionic_slots": 4 }, { @@ -105,6 +109,8 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 5, + "is_limb": true, + "base_hp": 60, "bionic_slots": 20 }, { @@ -128,6 +134,8 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 5, + "is_limb": true, + "base_hp": 60, "bionic_slots": 20 }, { @@ -151,6 +159,7 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 3, + "base_hp": 60, "bionic_slots": 5 }, { @@ -174,6 +183,7 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 3, + "base_hp": 60, "bionic_slots": 5 }, { @@ -198,6 +208,8 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 5, + "is_limb": true, + "base_hp": 60, "bionic_slots": 30 }, { @@ -222,6 +234,8 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 5, + "is_limb": true, + "base_hp": 60, "bionic_slots": 30 }, { @@ -245,6 +259,7 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 3, + "base_hp": 60, "bionic_slots": 7 }, { @@ -268,6 +283,7 @@ "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, "squeamish_penalty": 3, + "base_hp": 60, "bionic_slots": 7 }, { @@ -284,6 +300,7 @@ "hit_size_relative": [ 0, 0, 0 ], "hit_difficulty": 0, "side": "both", + "base_hp": 60, "legacy_id": "NUM_BP" } ] diff --git a/data/json/conducts.json b/data/json/conducts.json index 3b5eabcfefd2b..73ee21818e1be 100644 --- a/data/json/conducts.json +++ b/data/json/conducts.json @@ -19,5 +19,66 @@ "name": "Merciful", "hidden_by": [ "conduct_zero_kills" ], "requirements": [ { "event_statistic": "num_avatar_character_kills", "is": "<=", "target": 0, "description": "Kill no characters" } ] + }, + { + "id": "conduct_zero_cut_trees", + "type": "conduct", + "name": "The Elven Path", + "requirements": [ { "event_statistic": "num_cuts_tree", "is": "<=", "target": 0, "description": "Cut no trees" } ] + }, + { + "id": "conduct_pure_human", + "type": "conduct", + "name": "Homo Sapiens", + "requirements": [ + { "event_statistic": "num_installs_cbm", "is": "<=", "target": 0, "description": "Install no bionic implants" }, + { + "event_statistic": "num_installs_faulty_cbm", + "is": "<=", + "target": 0, + "description": "Install no faulty bionic implants" + }, + { "event_statistic": "num_gains_mutation", "is": "<=", "target": 0, "description": "No mutations" } + ] + }, + { + "id": "conduct_no_cbm", + "type": "conduct", + "name": "Clean on X-ray", + "requirements": [ + { "event_statistic": "num_installs_cbm", "is": "<=", "target": 0, "description": "Install no bionic implants" }, + { + "event_statistic": "num_installs_faulty_cbm", + "is": "<=", + "target": 0, + "description": "Install no faulty bionic implants" + } + ], + "hidden_by": [ "conduct_pure_human" ] + }, + { + "id": "conduct_no_mutations", + "type": "conduct", + "name": "Pure Blood", + "requirements": [ { "event_statistic": "num_gains_mutation", "is": "<=", "target": 0, "description": "No mutations" } ], + "hidden_by": [ "conduct_pure_human" ] + }, + { + "id": "conduct_no_broken_bones", + "type": "conduct", + "name": "Structural Integrity", + "requirements": [ { "event_statistic": "num_broken_bone", "is": "<=", "target": 0, "description": "Break no bones" } ] + }, + { + "id": "conduct_no_skill_levels_gained", + "type": "conduct", + "name": "Teacher, Leave Them Kids Alone", + "requirements": [ { "event_statistic": "num_gains_skill_level", "is": "<=", "target": 0, "description": "Gain no skill levels" } ] + }, + { + "id": "conduct_no_books_read", + "type": "conduct", + "name": "Self-Imposed Illiteracy", + "requirements": [ { "event_statistic": "num_reads_book", "is": "<=", "target": 0, "description": "Read no books" } ] } ] diff --git a/data/json/construction.json b/data/json/construction.json index e1004bb1146bd..98ad90a7e180e 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -115,10 +115,24 @@ "pre_terrain": "t_door_frame", "post_terrain": "f_beaded_door" }, + { + "type": "construction", + "id": "constr_sdoor_frame", + "description": "Build Makeshift Door", + "//": "Step 1: door frame", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 1 ] ], + "time": "60 m", + "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], + "components": [ [ [ "2x4", 12 ] ], [ [ "nail", 24 ] ] ], + "pre_special": "check_empty", + "post_terrain": "t_door_frame" + }, { "type": "construction", "id": "constr_door_makeshift", "description": "Build Makeshift Door", + "//": "Step 2: Makeshift Door", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "30 m", @@ -2145,10 +2159,24 @@ "pre_special": "check_empty", "post_terrain": "f_mailbox" }, + { + "type": "construction", + "id": "constr_mbdoor_frame", + "description": "Build Bar Door", + "//": "step 1: door frame", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 6 ] ], + "time": "90 m", + "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M", "level": 1 } ] ], + "components": [ [ [ "spike", 8 ] ], [ [ "steel_chunk", 4 ], [ "scrap", 12 ] ] ], + "pre_special": "check_empty", + "post_terrain": "t_mdoor_frame" + }, { "type": "construction", "id": "constr_door_bar", "description": "Build Bar Door", + "//": "step 2: Bar Door", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "180 m", @@ -2435,17 +2463,6 @@ "pre_flags": "CHIP", "post_terrain": "t_wall" }, - { - "type": "construction", - "id": "constr_revert_carpet", - "description": "Remove Carpet", - "category": "DECORATE", - "required_skills": [ [ "fabrication", 0 ] ], - "time": "10 m", - "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], - "pre_flags": "RUG", - "post_terrain": "t_floor" - }, { "type": "construction", "id": "constr_carpet_red", @@ -2626,6 +2643,40 @@ "pre_terrain": "t_rock", "post_special": "done_mine_upstair" }, + { + "type": "construction", + "id": "constr_concrete_ramp_low", + "description": "Build Low End of a Concrete Ramp", + "//": "Builds a low end of a concrete ramp going up on this level and down on the level above.", + "pre_note": "Build a concrete ramp leading to the next z-level above, and the corresponding ramp down leading from the z-level above to this level. The high end of a ramp must be built adjacent to allow moving between z-levels in both directions.", + "category": "DIG", + "required_skills": [ [ "fabrication", 3 ] ], + "time": "150 m", + "tools": [ [ [ "con_mix", 125 ] ] ], + "qualities": [ [ { "id": "SMOOTH", "level": 1 } ] ], + "components": [ [ [ "concrete", 5 ] ], [ [ "water", 5 ] ] ], + "pre_terrain": "t_pit_shallow", + "pre_special": "check_ramp_low", + "post_terrain": "t_ramp_up_low", + "post_special": "done_ramp_low" + }, + { + "type": "construction", + "id": "constr_concrete_ramp_high", + "description": "Build High End of a Concrete Ramp", + "//": "Builds a high end of a concrete ramp going up on this level and down on the level above.", + "pre_note": "Build a concrete ramp leading to the next z-level above, and the corresponding ramp down leading from the z-level above to this level. It must be built next to a low end of a ramp to allow moving between z-levels in both directions.", + "category": "DIG", + "required_skills": [ [ "fabrication", 3 ] ], + "time": "150 m", + "tools": [ [ [ "con_mix", 125 ] ] ], + "qualities": [ [ { "id": "SMOOTH", "level": 1 } ] ], + "components": [ [ [ "concrete", 5 ] ], [ [ "water", 5 ] ] ], + "pre_terrain": "t_pit_shallow", + "pre_special": "check_ramp_high", + "post_terrain": "t_ramp_up_high", + "post_special": "done_ramp_high" + }, { "type": "construction", "id": "constr_veh", @@ -3174,6 +3225,91 @@ "pre_special": "check_empty", "post_terrain": "t_junk_floor" }, + { + "type": "construction", + "id": "constr_scrap_bridge_1", + "description": "Build Scrap Metal Bridge Using Bolts", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 4 ] ], + "time": "180 m", + "qualities": [ + [ { "id": "SAW_M", "level": 1 } ], + [ { "id": "HAMMER", "level": 1 } ], + [ { "id": "WRENCH", "level": 2 } ], + [ { "id": "DRILL", "level": 1 } ] + ], + "components": [ + [ [ "wire", 16 ], [ "spike", 16 ], [ "nail", 32 ] ], + [ [ "sheet_metal_small", 10 ], [ "scrap", 10 ] ], + [ [ "sheet_metal", 2 ], [ "steel_plate", 2 ], [ "frame", 2 ], [ "hdframe", 1 ], [ "xlframe", 4 ] ], + [ [ "rebar", 2 ], [ "pipe", 4 ] ] + ], + "pre_special": "check_empty", + "post_terrain": "f_scrap_bridge" + }, + { + "type": "construction", + "id": "constr_scrap_bridge_2", + "description": "Build Scrap Metal Bridge Using Welder", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 4 ] ], + "time": "120 m", + "qualities": [ [ { "id": "SAW_M", "level": 1 } ] ], + "using": [ [ "welding_standard", 2 ] ], + "components": [ + [ [ "wire", 2 ] ], + [ [ "sheet_metal_small", 10 ], [ "scrap", 10 ] ], + [ [ "sheet_metal", 2 ], [ "steel_plate", 2 ], [ "frame", 2 ], [ "hdframe", 1 ], [ "xlframe", 4 ] ], + [ [ "rebar", 2 ], [ "pipe", 4 ] ] + ], + "pre_special": "check_empty", + "post_terrain": "f_scrap_bridge" + }, + { + "type": "construction", + "id": "constr_metal_bench", + "description": "Build Scrap Metal Bench", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 2 ] ], + "time": "90 m", + "qualities": [ [ { "id": "SAW_M", "level": 1 } ], [ { "id": "WRENCH", "level": 2 } ], [ { "id": "DRILL", "level": 1 } ] ], + "components": [ + [ [ "pipe_fittings", 1 ], [ "steel_chunk", 2 ] ], + [ [ "sheet_metal_small", 3 ], [ "scrap", 3 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "pipe", 1 ] ] + ], + "pre_special": "check_empty", + "post_terrain": "f_metal_bench" + }, + { + "type": "construction", + "id": "constr_metal_table", + "description": "Build Scrap Metal Table", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 2 ] ], + "time": "90 m", + "qualities": [ [ { "id": "SAW_M", "level": 1 } ], [ { "id": "WRENCH", "level": 2 } ], [ { "id": "DRILL", "level": 1 } ] ], + "components": [ + [ [ "pipe_fittings", 2 ], [ "steel_chunk", 3 ] ], + [ [ "sheet_metal_small", 4 ], [ "scrap", 4 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "pipe", 1 ] ] + ], + "pre_special": "check_empty", + "post_terrain": "f_metal_table" + }, + { + "type": "construction", + "id": "constr_ground_cable", + "description": "Lay down decorative ground cable", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 0 ] ], + "time": "1 m", + "components": [ [ [ "cable", 4 ] ] ], + "pre_special": "check_empty", + "post_terrain": "f_ground_cable" + }, { "type": "construction", "id": "constr_pillow_fort", diff --git a/data/json/effects.json b/data/json/effects.json index aecbe27f76858..85d00550d67e7 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -934,15 +934,97 @@ { "type": "effect_type", "id": "bleed", - "name": [ "Bleeding", "Bad Bleeding", "Heavy Bleeding" ], - "desc": [ "You are slowly losing blood.", "You are losing blood.", "You are rapidly losing blood." ], + "name": [ + "Minor Bleeding", + "Minor Bleeding", + "Minor Bleeding", + "Minor Bleeding", + "Minor Bleeding", + "Bleeding", + "Bleeding", + "Bleeding", + "Bleeding", + "Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Bad Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding", + "Heavy Arterial Bleeding" + ], + "desc": [ + "Tis but a scratch.", + "Tis but a scratch.", + "Tis but a scratch.", + "Tis but a scratch.", + "Tis but a scratch.", + "You are slowly losing blood.", + "You are slowly losing blood.", + "You are slowly losing blood.", + "You are slowly losing blood.", + "You are slowly losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "You are rapidly losing blood.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain.", + "Blood is gushing from you like a fountain." + ], "main_parts_only": true, "apply_message": "You're bleeding!", "rating": "bad", - "max_intensity": 3, - "int_decay_tick": 120, - "int_add_val": 1, - "base_mods": { "str_mod": [ -1 ], "per_mod": [ -1 ] }, + "max_intensity": 40, + "int_dur_factor": 60, + "max_duration": 2400, + "scaling_mods": { "str_mod": [ -0.1 ], "per_mod": [ -0.1 ] }, "show_in_info": true }, { @@ -1310,7 +1392,7 @@ "name": [ "High" ], "desc": [ "You are high as a kite." ], "apply_message": "You feel lightheaded.", - "base_mods": { "int_mod": [ -1 ], "per_mod": [ -1 ] } + "base_mods": { "int_mod": [ -1 ], "per_mod": [ -1 ], "vomit_tick": [ 60 ] } }, { "type": "effect_type", @@ -1594,16 +1676,75 @@ { "type": "effect_type", "id": "anemia", - "name": [ "Iron deficiency", "Early anemia", "Anemia" ], - "desc": [ "A lack of iron in your diet will result in progressively worsening anemia." ], + "name": [ "Early iron deficiency", "Iron deficiency", "Acute iron deficiency" ], + "desc": [ + "A lack of iron in your diet has hampered efficiency and regeneration of your red blood cells.", + "Prolonged lack of iron in your diet has compromised efficiency and regeneration of your red blood cells.", + "Severe lack of iron in your diet results in your red blood cells dying faster then they are regenerating." + ], "apply_message": "You begin feeling increasingly tired and listless.", - "remove_message": "You no longer feel anemic.", + "remove_message": "You are no longer in risk of becoming anemic.", "decay_messages": [ - [ "Your iron deficiency is nearly resolved.", "good" ], - [ "Your feel stronger as your anemia starts to improve.", "good" ] + [ "Your irom deficiency is nearly resolved.", "good" ], + [ "Your feel stronger as your iron deficiency starts to improve.", "good" ] ], "max_intensity": 3, - "rating": "bad" + "rating": "bad", + "base_mods": { + "str_mod": [ -1 ], + "stamina_min": [ -100 ], + "stamina_max": [ -200 ], + "stamina_chance": [ 900 ], + "fatigue_min": [ 10 ], + "fatigue_max": [ 20 ], + "fatigue_chance": [ 900 ], + "h_mod_min": [ -1 ], + "h_mod_min_val": [ 0 ], + "h_mod_chance": [ 900 ] + }, + "scaling_mods": { + "str_mod": [ -2 ], + "stamina_max": [ -500 ], + "fatigue_max": [ 20 ], + "stamina_chance": [ -300 ], + "fatigue_chance": [ -300 ], + "h_mod_min": [ -1 ], + "h_mod_min_val": [ -50 ], + "h_mod_chance": [ -200 ] + } + }, + { + "type": "effect_type", + "id": "redcells_anemia", + "name": [ "Early anemia", "Anemia", "Acute anemia" ], + "desc": [ "Loss of red blood cells results in progressively worsening anemia." ], + "apply_message": "You begin feeling increasingly tired and listless.", + "remove_message": "You no longer feel anemic.", + "decay_messages": [ [ "Your anemia is nearly resolved.", "good" ], [ "Your feel stronger as your anemia starts to improve.", "good" ] ], + "max_intensity": 3, + "rating": "bad", + "base_mods": { + "str_mod": [ -1 ], + "stamina_min": [ -100 ], + "stamina_max": [ -200 ], + "stamina_chance": [ 900 ], + "fatigue_min": [ 10 ], + "fatigue_max": [ 20 ], + "fatigue_chance": [ 900 ], + "h_mod_min": [ -1 ], + "h_mod_min_val": [ 0 ], + "h_mod_chance": [ 900 ] + }, + "scaling_mods": { + "str_mod": [ -2 ], + "stamina_max": [ -500 ], + "fatigue_max": [ 20 ], + "stamina_chance": [ -300 ], + "fatigue_chance": [ -300 ], + "h_mod_min": [ -1 ], + "h_mod_min_val": [ -50 ], + "h_mod_chance": [ -200 ] + } }, { "type": "effect_type", @@ -1682,6 +1823,27 @@ "//": "No morale_mod is currently possible in effects, for some reason. As soon as it's implemented, it goes here.", "rating": "bad" }, + { + "type": "effect_type", + "id": "hypovolemia", + "name": [ "Mild hypovolemic shock", "Moderate hypovolemic shock", "Advanced hypovolemic shock", "Severe hypovolemic shock" ], + "desc": [ + "You've lost some blood and look somewhat pale.", + "You've lost large amount of blood, and you're not feeling well.", + "You've lost an awful lot of blood, and your condition is severe. Seek medical attention.", + "You've lost tremendous amount of blood, and you're standing on death's door. Transfusion might save you." + ], + "apply_message": "You have lost lot of blood, and your condition worsens.", + "remove_message": "You are no longer in shock.", + "decay_messages": [ + [ "Your blood level increase, and you feel better, but still look pale.", "good" ], + [ "Your feel stronger as your blood levels starts to improve.", "good" ], + [ "You're not dying from lack of blood, but you're not out of the woods yet.", "good" ] + ], + "max_intensity": 4, + "scaling_mods": { "str_mod": [ -1 ], "per_mod": [ -1 ], "dex_mod": [ -1 ], "int_mod": [ -1 ], "speed_mod": [ -10 ] }, + "rating": "bad" + }, { "type": "effect_type", "id": "cough_suppress" diff --git a/data/json/emit.json b/data/json/emit.json index 4c9045aef0390..ccdb67bb86dca 100644 --- a/data/json/emit.json +++ b/data/json/emit.json @@ -331,5 +331,27 @@ "field": "fd_fog", "intensity": 2, "qty": 200 + }, + { + "id": "emit_extinguisher_burst", + "type": "emit", + "field": "fd_extinguisher", + "intensity": 1, + "qty": 10 + }, + { + "id": "emit_rad_leak", + "type": "emit", + "field": "fd_nuke_gas", + "intensity": 1, + "qty": 1 + }, + { + "id": "emit_rad_cloud", + "//": "Negative, negative, it's a large reactor leak, very dangerous", + "type": "emit", + "field": "fd_nuke_gas", + "intensity": 3, + "qty": 100 } ] diff --git a/data/json/field_type.json b/data/json/field_type.json index 2d0e71aced560..d0439ec43ce28 100644 --- a/data/json/field_type.json +++ b/data/json/field_type.json @@ -76,9 +76,32 @@ "id": "fd_web", "type": "field_type", "legacy_enum_id": 5, - "intensity_levels": [ { "name": "cobwebs", "sym": "}" }, { "name": "webs" }, { "name": "thick webs", "transparent": false } ], + "intensity_levels": [ + { + "name": "cobwebs", + "sym": "}", + "effects": [ + { "effect_id": "webbed", "intensity": 1, "min_duration": "1 m", "immune_in_vehicle": true, "is_environmental": false } + ] + }, + { + "name": "webs", + "effects": [ + { "effect_id": "webbed", "intensity": 2, "min_duration": "1 m", "immune_in_vehicle": true, "is_environmental": false } + ] + }, + { + "name": "thick webs", + "transparent": false, + "effects": [ + { "effect_id": "webbed", "intensity": 3, "min_duration": "1 m", "immune_in_vehicle": true, "is_environmental": false } + ] + } + ], "description_affix": "covered_in", "immunity_data": { "traits": [ "WEB_WALKER" ] }, + "immune_mtypes": [ "mon_spider_web", "mon_spider_web_s" ], + "decrease_intensity_on_contact": true, "priority": 2, "phase": "solid", "display_items": false, @@ -239,6 +262,93 @@ "display_items": false, "display_field": true }, + { + "id": "fd_extinguisher", + "type": "field_type", + "intensity_levels": [ + { + "name": "extinguisher mist", + "sym": "%", + "color": "white", + "dangerous": true, + "translucency": 0.1, + "convection_temperature_mod": -10, + "effects": [ + { + "effect_id": "poison", + "body_part": "MOUTH", + "intensity": 2, + "min_duration": "2 minutes", + "max_duration": "2 minutes", + "immune_inside_vehicle": true, + "message": "You feel sick from inhaling the extinguisher mist", + "message_type": "bad" + } + ] + }, + { + "name": "extinguisher cloud", + "color": "white", + "convection_temperature_mod": -20, + "translucency": 0.4, + "effects": [ + { + "effect_id": "poison", + "body_part": "MOUTH", + "intensity": 2, + "min_duration": "2 minutes", + "max_duration": "2 minutes", + "immune_inside_vehicle": true, + "message": "You feel sick from inhaling the extinguisher cloud", + "message_type": "bad" + } + ] + }, + { + "name": "thick extinguisher cloud", + "color": "white", + "convection_temperature_mod": -30, + "translucency": 0.7, + "effects": [ + { + "effect_id": "poison", + "body_part": "MOUTH", + "intensity": 5, + "min_duration": "3 minutes", + "max_duration": "3 minutes", + "//": "won't be applied outside of vehicles, so it could apply harsher effect", + "immune_outside_vehicle": true, + "message": "You feel sick from inhaling the thick extinguisher cloud", + "message_type": "bad" + }, + { + "effect_id": "badpoison", + "body_part": "MOUTH", + "intensity": 5, + "min_duration": "3 minutes", + "max_duration": "3 minutes", + "//": "won't be applied inside of vehicles, so it could apply lesser effect", + "immune_inside_vehicle": true, + "message": "You feel sick from inhaling the thick extinguisher cloud", + "message_type": "bad" + } + ] + } + ], + "description_affix": "on", + "decay_amount_factor": 3, + "priority": 4, + "half_life": "10 seconds", + "phase": "gas", + "display_items": false, + "display_field": true, + "looks_like": "fd_fog", + "gas_absorption_factor": 15, + "has_fume": true, + "percent_spread": 90, + "dirty_transparency_cache": true, + "immunity_data": { "body_part_env_resistance": [ [ "MOUTH", 15 ] ] } + }, { "id": "fd_rubble", "type": "field_type", diff --git a/data/json/flags.json b/data/json/flags.json index 01fdfd4ff8054..794d6fbbaf6cf 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -245,6 +245,12 @@ "context": [ "ARMOR", "TOOL_ARMOR" ], "info": "This gear is equipped with an accurate hygrometer (which is used to measure humidity)." }, + { + "id": "BURNOUT", + "type": "json_flag", + "context": [ "TOOL" ], + "//": "You can visually inspect how much it is burned out (candle, torch)." + }, { "id": "IRREMOVABLE", "type": "json_flag", @@ -338,12 +344,6 @@ "context": [ "GENERIC", "TOOL" ], "info": "As a weapon, this item needs considerable space to use properly and does 70% of its normal damage to adjacent enemies." }, - { - "id": "POWERED", - "type": "json_flag", - "context": [ "TOOL" ], - "//": "If turned ON, it uses its own source of power, instead of relying on power of the user." - }, { "id": "PSYSHIELD_PARTIAL", "type": "json_flag", @@ -615,6 +615,12 @@ "context": [ "SPELL" ], "//": "This makes the spell's effects permanent." }, + { + "id": "NO_FAIL", + "type": "json_flag", + "context": [ "SPELL" ], + "//": "Spellcasting never fails for this spell" + }, { "id": "IGNORE_WALLS", "type": "json_flag", diff --git a/data/json/furniture_and_terrain/furniture-alien.json b/data/json/furniture_and_terrain/furniture-alien.json new file mode 100644 index 0000000000000..000bc9d0ade37 --- /dev/null +++ b/data/json/furniture_and_terrain/furniture-alien.json @@ -0,0 +1,625 @@ +[ + { + "type": "furniture", + "id": "f_alien_tendril", + "name": "glowing tendril", + "description": "A willowy tendril growing from the floor, gently waving back and forth. A faint light spills from it.", + "symbol": "i", + "color": "blue", + "move_cost_mod": 4, + "coverage": 10, + "light_emitted": 15, + "required_str": -1, + "flags": [ "TRANSPARENT" ], + "bash": { + "str_min": 8, + "str_max": 20, + "sound": "splorch!", + "sound_fail": "whump!", + "furn_set": "f_alien_scar", + "items": [ { "item": "fetid_goop", "count": [ 3, 5 ], "prob": 100 } ] + } + }, + { + "type": "furniture", + "id": "f_alien_anemone", + "name": "wafting anemone", + "description": "A fleshy white protuberance growing from the floor, with a cluster of tendrils pouring out of it. It looks almost exactly like a sea anemone, even waving gently as though underwater.", + "symbol": "V", + "color": "white", + "move_cost_mod": 6, + "coverage": 30, + "required_str": -1, + "light_emitted": 3, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_hot_air_migo_seep" ], + "bash": { + "str_min": 13, + "str_max": 26, + "sound": "splorch!", + "sound_fail": "whump!", + "furn_set": "f_alien_scar", + "items": [ { "item": "fetid_goop", "count": [ 3, 7 ], "prob": 100 } ] + } + }, + { + "type": "furniture", + "id": "f_alien_gasper", + "name": "gasping tube", + "description": "This is a meaty green stalactite with a thickened hide like that of a starfish, extending from the floor to the ceiling. In the center is a series of ports somewhat like mouths, from which pour bursts of a vile-smelling gas.", + "symbol": "{", + "color": "green", + "move_cost_mod": 6, + "coverage": 40, + "required_str": -1, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_migo_atmosphere", "emit_hot_air_migo_blast" ], + "//": "TODO: Make a custom toxic gas emission that is not visible to the player", + "bash": { + "str_min": 30, + "str_max": 60, + "sound": "splorch!", + "sound_fail": "whump!", + "furn_set": "f_alien_scar", + "items": [ { "item": "fetid_goop", "count": [ 15, 25 ], "prob": 100 } ] + } + }, + { + "type": "furniture", + "id": "f_alien_zapper", + "name": "twitching frond", + "description": "A spine resembling moth antennae juts from the ground, swaying gently in the air. Every so often, a cascade of energy arcs along it and discharges into the ceiling.", + "symbol": "F", + "color": "light_blue", + "move_cost_mod": 4, + "coverage": 20, + "required_str": -1, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_glimmer", "emit_shock_burst" ], + "//": "TODO: Make a custom toxic gas emission that is not visible to the player", + "bash": { "str_min": 30, "str_max": 60, "sound": "splorch!", "sound_fail": "whump!", "furn_set": "f_alien_scar" } + }, + { + "type": "furniture", + "id": "f_alien_scar", + "name": "scarred lump", + "description": "This is a pile of nondescript alien flesh, twitching and belching strange gases out of injured orifices.", + "symbol": "{", + "color": "green", + "move_cost_mod": 6, + "coverage": 40, + "required_str": -1, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_hot_air_migo_seep", "emit_shock_burst" ], + "//": "TODO: Make a custom toxic gas emission that is not visible to the player", + "bash": { + "str_min": 250, + "str_max": 600, + "sound": "splorch!", + "sound_fail": "splat!", + "items": [ { "item": "fetid_goop", "count": [ 6, 13 ], "prob": 100 } ] + } + }, + { + "type": "furniture", + "id": "f_alien_pod", + "name": "slimy pod", + "description": "This is a slick, translucent pod suspended on a thin stalk. It is covered in a thick mucus, obscuring whatever is floating in the gel-like substance inside.", + "symbol": "0", + "color": "magenta", + "move_cost_mod": -1, + "coverage": 40, + "required_str": -1, + "flags": [ "TRANSPARENT" ], + "bash": { + "str_min": 25, + "str_max": 60, + "sound": "splorch!", + "sound_fail": "whump.", + "items": [ { "item": "fetid_goop", "count": [ 5, 10 ], "prob": 100 } ] + } + }, + { + "type": "furniture", + "id": "f_alien_pod_organ", + "name": "organ pod", + "description": "This is a translucent pod suspended on a thin stalk. Inside you can see the dimly outlined shape of human organs, floating in some kind of preservative goo.", + "symbol": "0", + "color": "yellow", + "move_cost_mod": -1, + "coverage": 40, + "required_str": -1, + "light_emitted": 3, + "flags": [ "TRANSPARENT" ], + "bash": { "str_min": 25, "str_max": 60, "sound": "splorch!", "sound_fail": "whump." } + }, + { + "type": "furniture", + "id": "f_alien_pod_resin", + "name": "resin pod", + "description": "This is a translucent pod suspended on a thin stalk. Inside is a clean, clear resinous-looking fluid. You could fairly easily tear it from the stalk and take it with you.", + "symbol": "0", + "color": "light_blue", + "move_cost_mod": -1, + "coverage": 40, + "required_str": -1, + "flags": [ "TRANSPARENT", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "alien_pod_resin", "charges": [ 2, 6 ] } ] }, + "bash": { "str_min": 25, "str_max": 60, "sound": "splorch!", "sound_fail": "whump." } + }, + { + "type": "furniture", + "id": "f_alien_table", + "name": "fleshy altar", + "description": "This pulsing protuberance juts from the floor, its sides covered in scaled, oozing skin. The surface is flat, but undulates softly. A handful of unidentifiable appendages reach from the sides, suggesting a sort of nightmarish living autodoc.", + "symbol": "n", + "color": "pink", + "move_cost_mod": -1, + "coverage": 40, + "required_str": -1, + "light_emitted": 12, + "flags": [ "TRANSPARENT" ], + "bash": { "str_min": 45, "str_max": 60, "sound": "splorch!", "sound_fail": "whump.", "furn_set": "f_alien_scar" } + }, + { + "type": "furniture", + "id": "f_scrap_antenna", + "name": "scrap antenna", + "looks_like": "t_radio_tower", + "description": "This contraption looks like some sort of cobbled-together transmitter or receiver antenna. It consists of a number of mismatched blinking lights, spinning servos, and dangling wires connected to a heft metal box.", + "symbol": "d", + "color": "light_gray", + "move_cost_mod": 2, + "coverage": 30, + "required_str": 11, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 30, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "pipe_fittings", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 1, 2 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "antenna", "count": [ 0, 1 ] }, + { "item": "exodii_module", "count": [ 0, 1 ] }, + { "item": "exodii_motor", "count": [ 0, 1 ] }, + { "item": "cable", "count": [ 0, 2 ] }, + { "item": "scrap_copper", "count": [ 2, 10 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_botrack", + "name": "rack of robots", + "looks_like": "f_server_stack", + "description": "This is a wire cage containing a number of robot parts, from chassis to limbs, firmly clamped on to sturdy hanging rods. It looks like it would be exceptionally difficult to open it and get at them without damaging them, probably by design.", + "symbol": "E", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 70, + "required_str": -1, + "max_volume": "1500 L", + "flags": [ "MOUNTABLE", "BLOCKSDOOR" ], + "bash": { + "str_min": 60, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "wire", "count": [ 3, 10 ] }, + { "item": "sheet_metal", "count": [ 0, 2 ] }, + { "item": "sheet_metal_small", "count": [ 20, 30 ] }, + { "item": "exodii_chassis", "count": [ 0, 1 ] }, + { "item": "exodii_drone_chassis", "count": [ 0, 1 ] }, + { "item": "scrap_copper", "count": [ 5, 20 ] }, + { "item": "e_scrap", "count": [ 5, 20 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_scanner", + "name": "spinning dish", + "looks_like": "t_machinery_light", + "description": "This is a slowly spinning parabolic dish engraved with an unrecognizable pattern of symbols that might, at a guess, be some sort of circuitry pattern - or maybe a religious incantation. It is mounted on a completely mismatched electric motor that looks fairly mundane.", + "symbol": "W", + "color": "light_gray", + "move_cost_mod": 2, + "coverage": 30, + "required_str": 11, + "flags": [ "TRANSPARENT", "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 30, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "scrap_copper", "count": [ 2, 10 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] }, + { "item": "exodii_motor", "count": [ 0, 1 ] }, + { "item": "cable", "count": [ 0, 3 ] }, + { "item": "exodii_scanner_dish", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_lamp", + "name": "scavenged utility light", + "looks_like": "t_utility_light", + "description": "The bulbs emit an eery greenish glow, and some parts of it have a curved appearance as though the metal were grown in a lab, but by and large this isn't a particularly unusual looking area light.", + "symbol": "T", + "color": "light_gray", + "move_cost_mod": 3, + "coverage": 30, + "required_str": 6, + "light_emitted": 20, + "flags": [ "TRANSPARENT", "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 20, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "scrap_copper", "count": [ 2, 10 ] }, + { "item": "amplifier", "count": [ 0, 5 ] }, + { "item": "power_supply", "count": [ 0, 1 ] }, + { "item": "cable", "count": [ 0, 5 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_pump", + "name": "clanking fluid pump", + "looks_like": "t_machinery_heavy", + "description": "The huge sweating pipes and large tank reveal this clanking and tortuous piece of equipment to be some sort of fluid pump. It is cobbled from several apparently ill-fitting parts that have been fitted together with some very strange looking but surprisingly clever adaptors.", + "symbol": "0", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 80, + "required_str": 14, + "flags": [ "TRANSPARENT", "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 40, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 2, 4 ] }, + { "item": "55gal_drum", "count": [ 0, 1 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "scrap_copper", "count": [ 5, 10 ] }, + { "item": "exodii_module", "count": [ 0, 1 ] }, + { "item": "exodii_motor", "count": [ 0, 2 ] }, + { "item": "pipe_fittings", "count": [ 2, 6 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_printer_large", + "name": "metalloid printer", + "looks_like": "t_broken_generator", + "description": "This huge device actually resembles a 3D printer fairly closely, aside from its industrial size. Huge spools of various thin metallic wires top it and feed into what seems to be some sort of nozzle, and massive electrical cables disappear into the wall behind it.", + "symbol": "U", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 80, + "required_str": 14, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 90, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 20, 120 ] }, + { "item": "pipe", "count": [ 20, 40 ] }, + { "item": "sheet_metal_small", "count": [ 20, 100 ] }, + { "item": "scrap_copper", "count": [ 50, 100 ] }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, + { "item": "exodii_module", "count": [ 0, 6 ] }, + { "item": "exodii_motor", "count": [ 0, 8 ] }, + { "item": "exodii_computer", "count": [ 0, 2 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_printer_small", + "name": "circuit printer", + "looks_like": "t_machinery_electronic", + "description": "This is a tall device with a lattice of pipes and nozzles. Based on the pile of products sitting in the output hopper, it looks like it’s used as a printer for complex electronic components.", + "symbol": "U", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 80, + "required_str": 14, + "flags": [ "TRANSPARENT", "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 90, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 20, 120 ] }, + { "item": "pipe", "count": [ 10, 20 ] }, + { "item": "pipe_fittings", "count": [ 2, 4 ] }, + { "item": "sheet_metal_small", "count": [ 10, 30 ] }, + { "item": "scrap_copper", "count": [ 20, 40 ] }, + { "item": "e_scrap", "count": [ 20, 40 ] }, + { "item": "exodii_module", "count": [ 0, 5 ] }, + { "item": "exodii_motor", "count": [ 0, 6 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_generator_1", + "name": "Mavrik 10-101 power core", + "description": "There is a faded metallic plaque on the side of this cylindrical device. The lettering is a strange combination of English and Cyrillic script. It reads:\nMavrik 10-101\nStabиlиtи\nSaфetи\nA нyuclиar фyutuр ви bilив iн", + "symbol": "G", + "color": "white", + "move_cost_mod": -1, + "coverage": 60, + "required_str": -1, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 60, + "str_max": 400, + "explosive": 25, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] }, + { "item": "sheet_metal_small", "count": [ 10, 30 ] }, + { "item": "scrap_copper", "count": [ 20, 40 ] }, + { "item": "e_scrap", "count": [ 20, 40 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 4, 8 ] }, + { "item": "exodii_module", "count": [ 0, 5 ] }, + { "item": "exodii_motor", "count": [ 0, 6 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_generator_2", + "name": "spherical generator", + "description": "This huge steel plated sphere gives off a soft hum as it, presumably, generates power. A heavy lead plate bolted to the front might describe what it is, but it is written in something that looks vaguely like cuneiform.", + "symbol": "G", + "color": "red", + "move_cost_mod": -1, + "coverage": 70, + "required_str": -1, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 60, + "str_max": 400, + "explosive": 25, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "steel_armor", "count": [ 2, 4 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] }, + { "item": "sheet_metal_small", "count": [ 10, 30 ] }, + { "item": "scrap_copper", "count": [ 20, 40 ] }, + { "item": "e_scrap", "count": [ 20, 40 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 4, 8 ] }, + { "item": "exodii_module", "count": [ 0, 5 ] }, + { "item": "exodii_motor", "count": [ 0, 6 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_generator_3", + "name": "fluidic generator", + "description": "Twisting reams of copper and steel pipes wrap around a central core that thrums softly. Although there are no labels in any language you recognize, the cables connected to the base suggest that this is some sort of power generator.", + "symbol": "G", + "color": "green", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 60, + "str_max": 400, + "explosive": 25, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "cu_pipe", "count": [ 2, 4 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "pipe_fittings", "count": [ 0, 3 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] }, + { "item": "sheet_metal_small", "count": [ 10, 30 ] }, + { "item": "scrap_copper", "count": [ 10, 30 ] }, + { "item": "e_scrap", "count": [ 10, 20 ] }, + { "item": "circuit", "count": [ 2, 5 ] }, + { "item": "power_supply", "count": [ 4, 8 ] }, + { "item": "exodii_module", "count": [ 0, 5 ] }, + { "item": "exodii_motor", "count": [ 0, 6 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_generator_4", + "name": "rusty generator", + "description": "This is a tall, unremarkable cylinder capped by a wide flat saucer. There is heavy rusting at the base. A series of connected cables suggest that it's some sort of power generator.", + "symbol": "G", + "color": "yellow_red", + "move_cost_mod": -1, + "coverage": 60, + "required_str": -1, + "flags": [ "NOITEM", "BLOCKSDOOR" ], + "bash": { + "str_min": 60, + "str_max": 400, + "explosive": 25, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "sheet_metal", "count": [ 5, 10 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] }, + { "item": "sheet_metal_small", "count": [ 10, 30 ] }, + { "item": "scrap_copper", "count": [ 10, 30 ] }, + { "item": "e_scrap", "count": [ 15, 30 ] }, + { "item": "circuit", "count": [ 2, 5 ] }, + { "item": "power_supply", "count": [ 2, 8 ] }, + { "item": "exodii_module", "count": [ 0, 5 ] }, + { "item": "exodii_motor", "count": [ 0, 6 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_charger", + "name": "personal charging station", + "description": "The cyborg equivalent of a bed, this is a custom-shaped near-vertical booth designed to mount a heavy metal frame and connect it to a central power supply and nutrient source.", + "symbol": "{", + "color": "light_green", + "move_cost_mod": 6, + "coverage": 80, + "required_str": -1, + "flags": [ "TRANSPARENT" ], + "bash": { + "str_min": 18, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "cable", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 0, 1 ] }, + { "item": "sheet_metal_small", "count": [ 4, 8 ] }, + { "item": "e_scrap", "count": [ 2, 6 ] }, + { "item": "metal_tank_little", "count": [ 0, 1 ] }, + { "item": "pipe", "count": [ 0, 4 ] }, + { "item": "circuit", "count": [ 2, 5 ] }, + { "item": "amplifier", "count": [ 2, 5 ] }, + { "item": "power_supply", "count": [ 2, 8 ] }, + { "item": "exodii_module", "count": [ 0, 2 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_charger_cheap", + "name": "simple charging station", + "description": "This is a simple, unadorned, corroded metal charging and refeeding station, with hookups for two units somewhat larger than a human to stand side by side and be recharged and refueled.", + "symbol": "Y", + "color": "light_green", + "move_cost_mod": 6, + "coverage": 80, + "required_str": -1, + "flags": [ "TRANSPARENT" ], + "bash": { + "str_min": 19, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "cable", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 0, 1 ] }, + { "item": "sheet_metal_small", "count": [ 4, 8 ] }, + { "item": "e_scrap", "count": [ 2, 6 ] }, + { "item": "metal_tank_little", "count": [ 0, 1 ] }, + { "item": "pipe", "count": [ 0, 4 ] }, + { "item": "circuit", "count": [ 2, 5 ] }, + { "item": "amplifier", "count": [ 2, 5 ] }, + { "item": "power_supply", "count": [ 2, 8 ] }, + { "item": "large_storage_battery", "count": [ 0, 1 ] }, + { "item": "exodii_module", "count": [ 0, 2 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_portal_tower", + "name": "shimmering superstructure", + "description": "A simple metal superstructure like you might see holding up a radio tower, this one seems to give off just the faintest hint of shimmer, like heat waves. The metal has a burnt, iridescent pattern. There is a boxy, unimpressive looking device at the top of the tower.", + "symbol": "H", + "color": "light_cyan", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "flags": [ "NOITEM", "TRANSPARENT", "MOUNTABLE" ], + "bash": { + "str_min": 45, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "cable", "count": [ 1, 4 ] }, + { "item": "pipe", "count": [ 0, 4 ] }, + { "item": "circuit", "count": [ 2, 5 ] }, + { "item": "amplifier", "count": [ 2, 5 ] }, + { "item": "power_supply", "count": [ 2, 8 ] }, + { "item": "exodii_module", "count": [ 0, 2 ] }, + { "item": "exodii_portalizer", "count": [ 0, 4 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_exodii_portal_enclosure", + "name": "portal enclosure", + "description": "A heavy metal ring attached to dozens of wires, charred by residue that gives off an acrid, unfamiliar smell.", + "symbol": "Q", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "flags": [ "NOITEM", "TRANSPARENT", "MOUNTABLE" ], + "bash": { + "str_min": 45, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "cable", "count": [ 1, 4 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] }, + { "item": "circuit", "count": [ 1, 3 ] }, + { "item": "amplifier", "count": [ 1, 3 ] }, + { "item": "power_supply", "count": [ 1, 4 ] }, + { "item": "exodii_module", "count": [ 0, 1 ] }, + { "item": "exodii_portalizer", "count": [ 0, 2 ] }, + { "item": "exodii_computer", "count": [ 0, 1 ] } + ] + } + } +] diff --git a/data/json/furniture_and_terrain/furniture-appliances.json b/data/json/furniture_and_terrain/furniture-appliances.json index 11c38f3a32099..7f99d8fed25f0 100644 --- a/data/json/furniture_and_terrain/furniture-appliances.json +++ b/data/json/furniture_and_terrain/furniture-appliances.json @@ -3,7 +3,7 @@ "type": "furniture", "id": "f_air_conditioner", "name": "cooling unit", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A large, blocky appliance encased in sheet metal. This commonplace fixture is used for cooling large indoor areas.", "symbol": "{", "bgcolor": "white", @@ -21,7 +21,8 @@ { "item": "hose", "count": [ 0, 2 ] }, { "item": "thermostat", "count": 1 }, { "item": "refrigerant_tank", "count": 1 }, - { "item": "motor_small", "count": 1 } + { "item": "motor_small", "count": 1 }, + { "item": "pipe_fittings", "count": [ 2, 6 ] } ] }, "bash": { @@ -36,6 +37,7 @@ { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 0, 2 ] }, { "item": "cu_pipe", "count": [ 1, 4 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "scrap_copper", "count": [ 0, 2 ] } ] } @@ -104,6 +106,7 @@ { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 1, 2 ] }, { "item": "motor_small", "count": 1 }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, { "item": "cu_pipe", "count": [ 2, 5 ] } ] }, @@ -118,6 +121,7 @@ { "item": "sheet_metal_small", "count": [ 8, 12 ] }, { "item": "sheet_metal", "count": [ 1, 2 ] }, { "item": "rag", "count": [ 5, 10 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 1, 4 ] }, @@ -146,6 +150,7 @@ { "item": "element", "count": [ 2, 3 ] }, { "item": "wire_mesh", "count": 1 }, { "item": "cable", "charges": [ 1, 15 ] }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, { "item": "motor_small", "charges": 1 }, { "item": "cu_pipe", "count": [ 1, 3 ] } ] @@ -160,6 +165,7 @@ { "item": "steel_chunk", "count": [ 0, 3 ] }, { "item": "sheet_metal_small", "count": [ 8, 12 ] }, { "item": "sheet_metal", "count": [ 1, 4 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "element", "count": [ 1, 3 ] }, { "item": "cable", "charges": [ 1, 15 ] } ] @@ -187,6 +193,7 @@ { "item": "condensor_coil", "count": 1 }, { "item": "evaporator_coil", "count": 1 }, { "item": "refrigerant_tank", "count": 1 }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, { "item": "thermostat", "count": 1 }, { "item": "motor_tiny", "count": 1 } ] @@ -203,6 +210,7 @@ { "item": "steel_chunk", "count": [ 0, 3 ] }, { "item": "scrap", "count": [ 2, 8 ] }, { "item": "cable", "charges": [ 1, 2 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "hose", "count": 1 }, { "item": "cu_pipe", "count": [ 2, 4 ] }, { "item": "scrap_copper", "count": [ 1, 2 ] }, @@ -231,6 +239,7 @@ { "item": "hose", "count": 1 }, { "item": "glass_sheet", "count": 1 }, { "item": "cu_pipe", "count": [ 3, 6 ] }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, { "item": "refrigerant_tank", "count": 1 }, { "item": "motor_tiny", "count": 1 } ] @@ -246,6 +255,7 @@ { "item": "sheet_metal_small", "count": [ 6, 9 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, { "item": "scrap", "count": [ 2, 8 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "cable", "charges": [ 1, 3 ] }, { "item": "hose", "count": 1 }, { "item": "cu_pipe", "count": [ 1, 4 ] }, @@ -317,6 +327,7 @@ { "item": "sheet_metal", "count": [ 2, 6 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 1, 2 ] }, + { "item": "pipe_fittings", "count": [ 2, 6 ] }, { "item": "motor_small", "count": 1 }, { "item": "cu_pipe", "count": [ 2, 5 ] } ] @@ -333,6 +344,7 @@ { "item": "sheet_metal", "count": [ 1, 4 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 0, 2 ] }, + { "item": "pipe_fittings", "count": [ 1, 3 ] }, { "item": "cu_pipe", "count": [ 1, 4 ] }, { "item": "scrap_copper", "count": [ 0, 2 ] } ] @@ -385,7 +397,7 @@ "symbol": "#", "description": "An old device for pushing air into a blacksmith's forge to strengthen the fire and maintain a high temperature. Useless in its current state, but good for parts.", "color": "dark_gray", - "looks_like": "t_machinery_old", + "looks_like": "f_machinery_old", "move_cost_mod": 2, "coverage": 60, "required_str": 10, @@ -419,7 +431,7 @@ "symbol": "#", "description": "An anvil with a large metal hammer suspended above it in a metal framework. If it were working, it would be useful for shaping softened metal plates, though now it is only useful for parts.", "color": "white", - "looks_like": "t_machinery_old", + "looks_like": "f_machinery_old", "move_cost_mod": 2, "coverage": 60, "required_str": 10, diff --git a/data/json/furniture_and_terrain/furniture-industrial.json b/data/json/furniture_and_terrain/furniture-industrial.json index d1d94b09dc9bb..f993a57aab249 100644 --- a/data/json/furniture_and_terrain/furniture-industrial.json +++ b/data/json/furniture_and_terrain/furniture-industrial.json @@ -78,6 +78,302 @@ ] } }, + { + "type": "furniture", + "id": "f_generator_broken", + "name": "broken generator", + "description": "This generator is broken and will not help you produce usable electricity.", + "symbol": "&", + "color": "light_gray", + "looks_like": "f_machinery_old", + "move_cost_mod": -1, + "coverage": 30, + "required_str": 16, + "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT", "MOUNTABLE", "PERMEABLE", "BLOCKS_DOOR" ], + "bash": { + "str_min": 20, + "str_max": 150, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "steel_lump", "prob": 50 }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 7 ] }, + { "item": "pipe", "count": [ 0, 1 ] } + ] + }, + "deconstruct": { + "items": [ + { "item": "cable", "charges": [ 1, 2 ] }, + { "item": "steel_chunk", "count": [ 1, 2 ] }, + { "item": "scrap", "count": [ 4, 6 ] }, + { "item": "motor_small", "count": [ 0, 1 ] }, + { "item": "jerrycan", "count": [ 0, 1 ] }, + { "item": "pipe", "count": [ 0, 1 ] }, + { "item": "pipe_fittings", "count": [ 0, 1 ] }, + { "item": "frame", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_compact_ASRG_containment", + "name": "Compact Advanced Sterling Radioisotope Generator", + "description": "This hefty lump of steel and lead is the housing unit for a small nuclear reactor. It is plastered with warning signs. You could probably ignore those and salvage the steel and lead shielding, what could possibly go wrong?", + "symbol": "0", + "color": "green_white", + "looks_like": "f_machinery_electronic", + "move_cost_mod": -1, + "coverage": 80, + "required_str": -1, + "flags": [ "NOITEM", "SEALED", "REDUCE_SCENT", "PERMEABLE" ], + "bash": { + "str_min": 70, + "str_max": 400, + "explosive": 100, + "sound": "metal screeching!", + "sound_fail": "clang!", + "furn_set": "f_reactor_meltdown", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] } + ] + }, + "deconstruct": { + "furn_set": "f_compact_ASRG", + "items": [ + { "item": "lead", "count": [ 40, 80 ] }, + { "item": "cable", "charges": [ 8, 16 ] }, + { "item": "steel_plate", "count": [ 2, 4 ] }, + { "item": "mil_plate", "count": [ 2, 4 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "scrap", "count": [ 8, 16 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_compact_ASRG", + "name": "Compact Advanced Sterling Radioisotope Generator", + "description": "Some insane fool has removed the outer containment on this small-scale nuclear reactor. It is still fairly safe as it is: the reactor has considerable built-in containment as well. Nevertheless, you probably don't want to stand too close for too long.", + "symbol": "0", + "color": "green", + "looks_like": "f_machinery_electronic", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "flags": [ "TRANSPARENT", "NOITEM", "SEALED", "REDUCE_SCENT", "PERMEABLE" ], + "emissions": [ "emit_rad_leak" ], + "bash": { + "str_min": 20, + "str_max": 400, + "explosive": 100, + "sound": "metal screeching!", + "sound_fail": "clang!", + "furn_set": "f_reactor_meltdown", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_machinery_light", + "name": "light machinery", + "description": "Assorted light machinery. You could scavenge it for parts.", + "symbol": "$", + "color": "dark_gray", + "move_cost_mod": 10, + "coverage": 65, + "required_str": -1, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 40 }, + { "item": "cu_pipe", "prob": 40 }, + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "hose", "count": 1 }, + { "item": "steel_chunk", "count": [ 1, 5 ] }, + { "item": "bearing", "charges": [ 4, 12 ] }, + { "item": "frame", "prob": 50 }, + { "item": "motor", "prob": 50 } + ] + }, + "bash": { + "str_min": 16, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": 2, "prob": 40 }, + { "item": "chain", "prob": 20 }, + { "item": "cu_pipe", "prob": 10 }, + { "item": "scrap", "count": [ 3, 8 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "bearing", "charges": [ 2, 8 ] }, + { "item": "frame", "prob": 20 }, + { "item": "motor", "prob": 10 } + ] + } + }, + { + "type": "furniture", + "id": "f_machinery_heavy", + "name": "heavy machinery", + "description": "Assorted heavy machinery. You could scavenge it for parts.", + "symbol": "%", + "color": "light_gray", + "move_cost_mod": 10, + "coverage": 75, + "required_str": -1, + "flags": [ "BASHABLE", "CONTAINER", "SEALED", "PLACE_ITEM" ], + "deconstruct": { + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 60 }, + { "item": "cu_pipe", "prob": 20 }, + { "item": "steel_lump", "count": [ 1, 2 ] }, + { "item": "hose", "count": 1 }, + { "item": "sheet_metal", "count": [ 1, 3 ] }, + { "item": "steel_chunk", "count": [ 1, 3 ] }, + { "item": "bearing", "charges": [ 4, 12 ] }, + { "item": "frame", "prob": 60 }, + { "item": "motor", "prob": 30 }, + { "item": "metal_tank", "prob": 30 }, + { "item": "motor_large", "prob": 10 } + ] + }, + "bash": { + "str_min": 18, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": 1 }, + { "item": "chain", "prob": 20 }, + { "item": "steel_lump", "count": 1 }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "sheet_metal", "count": 2 }, + { "item": "steel_chunk", "count": [ 1, 2 ] }, + { "item": "bearing", "charges": [ 2, 8 ] }, + { "item": "frame", "prob": 30 }, + { "item": "motor", "prob": 10 }, + { "item": "metal_tank", "prob": 20 }, + { "item": "motor_large", "prob": 5 } + ] + } + }, + { + "type": "furniture", + "id": "f_machinery_old", + "name": "old machinery", + "description": "Assorted old, rusty machinery. You could scavenge it for parts.", + "symbol": "&", + "color": "brown", + "move_cost_mod": 4, + "coverage": 55, + "required_str": -1, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 40 }, + { "item": "cu_pipe", "prob": 60 }, + { "item": "scrap", "count": [ 1, 3 ] }, + { "item": "hose", "count": 1 }, + { "item": "steel_chunk", "count": [ 1, 3 ] }, + { "item": "bearing", "charges": [ 1, 5 ] }, + { "item": "frame", "prob": 30 }, + { "item": "motor", "prob": 30 }, + { "item": "splinter", "count": 3, "prob": 30 }, + { "item": "2x4", "count": [ 1, 4 ] }, + { "item": "nail", "charges": [ 3, 10 ] } + ] + }, + "bash": { + "str_min": 10, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 20 }, + { "item": "cu_pipe", "prob": 10 }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "steel_chunk", "count": [ 1, 2 ] }, + { "item": "motor", "prob": 10 }, + { "item": "splinter", "count": [ 4, 8 ] }, + { "item": "2x4", "count": 2 }, + { "item": "nail", "charges": [ 2, 5 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_machinery_electronic", + "name": "electronic machinery", + "description": "Assorted electronic machinery. You could scavenge it for parts.", + "symbol": "$", + "color": "yellow", + "move_cost_mod": 8, + "coverage": 55, + "required_str": -1, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "SEALED", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "bearing", "charges": [ 2, 6 ] }, + { "item": "motor", "prob": 40 }, + { "item": "processor", "count": 1 }, + { "item": "RAM", "count": [ 1, 4 ] }, + { "item": "cable", "charges": [ 1, 4 ] }, + { "item": "small_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 5, 10 ] }, + { "item": "circuit", "count": [ 3, 8 ] }, + { "item": "power_supply", "count": [ 1, 3 ] }, + { "item": "amplifier", "count": [ 1, 3 ] }, + { "item": "plastic_chunk", "count": [ 2, 8 ] }, + { "item": "scrap", "count": [ 1, 5 ] } + ] + }, + "bash": { + "str_min": 10, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "items": [ + { "item": "wire", "prob": 40 }, + { "item": "pipe", "prob": 40 }, + { "item": "steel_chunk", "prob": 40 }, + { "item": "bearing", "charges": [ 2, 4 ] }, + { "item": "motor", "prob": 10 }, + { "item": "processor", "prob": 40 }, + { "item": "RAM", "count": [ 1, 2 ] }, + { "item": "cable", "charges": [ 1, 2 ] }, + { "item": "small_lcd_screen", "prob": 40 }, + { "item": "e_scrap", "count": [ 3, 8 ] }, + { "item": "circuit", "count": [ 1, 3 ] }, + { "item": "power_supply", "prob": 40 }, + { "item": "amplifier", "prob": 40 }, + { "item": "plastic_chunk", "count": [ 2, 8 ] }, + { "item": "scrap", "count": [ 3, 8 ] } + ] + } + }, { "type": "furniture", "id": "f_robotic_arm", @@ -119,5 +415,53 @@ { "item": "motor", "prob": 30 } ] } + }, + { + "type": "furniture", + "id": "f_ground_cable", + "name": "ground cable", + "description": "A bunch of loose cables snake along the floor.", + "symbol": "}", + "color": "white", + "move_cost_mod": 1, + "required_str": -1, + "flags": [ "TRANSPARENT", "EASY_DECONSTRUCT", "NOCOLLIDE" ], + "bash": { + "str_min": 10, + "str_max": 100, + "sound": "shred!", + "sound_fail": "thud!", + "items": [ { "item": "scrap_copper", "count": [ 1, 4 ] }, { "item": "cable", "count": [ 1, 4 ] } ] + }, + "deconstruct": { "items": [ { "item": "cable", "count": 4 } ] } + }, + { + "type": "furniture", + "id": "f_capacitor", + "name": "capacitor bank", + "description": "A bank of heavy metal cylinders connected by large wires.", + "symbol": "=", + "color": "light_blue", + "move_cost_mod": 4, + "coverage": 40, + "required_str": -1, + "flags": [ "TRANSPARENT", "MOUNTABLE" ], + "bash": { + "str_min": 25, + "str_max": 200, + "explosive": 15, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "cable", "count": [ 1, 8 ] }, + { "item": "pipe", "count": [ 0, 4 ] }, + { "item": "circuit", "count": [ 0, 5 ] }, + { "item": "e_scrap", "count": [ 2, 8 ] }, + { "item": "amplifier", "count": [ 0, 4 ] }, + { "item": "power_supply", "count": [ 0, 2 ] }, + { "item": "metal_tank_little", "count": [ 0, 6 ] } + ] + } } ] diff --git a/data/json/furniture_and_terrain/furniture-medical.json b/data/json/furniture_and_terrain/furniture-medical.json index 294ffca2b19a1..660d1d9efe73c 100644 --- a/data/json/furniture_and_terrain/furniture-medical.json +++ b/data/json/furniture_and_terrain/furniture-medical.json @@ -408,7 +408,7 @@ "move_cost_mod": -1, "coverage": 40, "required_str": 12, - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "flags": [ "TRANSPARENT" ], "deconstruct": { "items": [ @@ -453,7 +453,7 @@ "move_cost_mod": -1, "coverage": 40, "required_str": 18, - "looks_like": "t_machinery_old", + "looks_like": "f_machinery_old", "flags": [ "BLOCKSDOOR" ], "deconstruct": { "items": [ @@ -498,7 +498,7 @@ "move_cost_mod": -1, "coverage": 45, "required_str": -1, - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "flags": [ "TRANSPARENT" ], "deconstruct": { "items": [ @@ -539,7 +539,7 @@ "move_cost_mod": -1, "coverage": 65, "required_str": -1, - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "deconstruct": { "items": [ { "item": "scrap", "count": [ 2, 6 ] }, @@ -578,7 +578,7 @@ "bgcolor": "white", "move_cost_mod": -1, "required_str": -1, - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "deconstruct": { "items": [ { "item": "scrap", "count": [ 2, 6 ] }, @@ -619,7 +619,7 @@ "coverage": 65, "required_str": -1, "flags": [ "PLACE_ITEM", "CONTAINER" ], - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "deconstruct": { "items": [ { "item": "scrap", "count": [ 2, 6 ] }, @@ -660,7 +660,7 @@ "coverage": 65, "required_str": -1, "flags": [ "PLACE_ITEM", "CONTAINER" ], - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "deconstruct": { "items": [ { "item": "scrap", "count": [ 2, 6 ] }, @@ -921,5 +921,45 @@ { "item": "scrap", "count": [ 2, 7 ] } ] } + }, + { + "type": "furniture", + "id": "f_centrifuge", + "name": "centrifuge", + "looks_like": "f_machinery_electronic", + "description": "This is a centrifuge, a liquid separating device with an automated analyzer unit. For some reason, this one has an attached battery pack. It could be used to analyze a medical fluid sample, such as blood, if a test tube was placed in it.", + "symbol": "{", + "color": "magenta", + "move_cost_mod": -1, + "coverage": 30, + "required_str": -1, + "flags": [ "TRANSPARENT", "PERMEABLE" ], + "deconstruct": { + "items": [ + { "item": "circuit", "count": 4 }, + { "item": "scrap", "count": 5 }, + { "item": "motor_small", "count": 1 }, + { "item": "spectrophotometer", "count": 1 }, + { "item": "storage_battery", "count": 1 }, + { "item": "betavoltaic", "count": [ 1, 4 ] }, + { "item": "steel_chunk", "count": 3 }, + { "item": "sheet_metal", "count": 3 }, + { "item": "cable", "charges": 5 } + ] + }, + "bash": { + "str_min": 3, + "str_max": 45, + "sound": "crunch!", + "sound_fail": "whack!", + "items": [ + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 1, 6 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 5 ] }, + { "item": "steel_chunk", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 1, 3 ] }, + { "item": "cable", "charges": [ 1, 15 ] } + ] + } } ] diff --git a/data/json/furniture_and_terrain/furniture-migo.json b/data/json/furniture_and_terrain/furniture-migo.json deleted file mode 100644 index 471df355ec15c..0000000000000 --- a/data/json/furniture_and_terrain/furniture-migo.json +++ /dev/null @@ -1,164 +0,0 @@ -[ - { - "type": "furniture", - "id": "f_alien_tendril", - "name": "glowing tendril", - "description": "A willowy tendril growing from the floor, gently waving back and forth. A faint light spills from it.", - "symbol": "i", - "color": "blue", - "move_cost_mod": 4, - "coverage": 10, - "light_emitted": 15, - "required_str": -1, - "flags": [ "TRANSPARENT" ], - "bash": { - "str_min": 8, - "str_max": 20, - "sound": "splorch!", - "sound_fail": "whump!", - "furn_set": "f_alien_scar", - "items": [ { "item": "fetid_goop", "count": [ 3, 5 ], "prob": 100 } ] - } - }, - { - "type": "furniture", - "id": "f_alien_anemone", - "name": "wafting anemone", - "description": "A fleshy white protuberance growing from the floor, with a cluster of tendrils pouring out of it. It looks almost exactly like a sea anemone, even waving gently as though underwater.", - "symbol": "V", - "color": "white", - "move_cost_mod": 6, - "coverage": 30, - "required_str": -1, - "light_emitted": 3, - "flags": [ "TRANSPARENT", "EMITTER" ], - "emissions": [ "emit_hot_air_migo_seep" ], - "bash": { - "str_min": 13, - "str_max": 26, - "sound": "splorch!", - "sound_fail": "whump!", - "furn_set": "f_alien_scar", - "items": [ { "item": "fetid_goop", "count": [ 3, 7 ], "prob": 100 } ] - } - }, - { - "type": "furniture", - "id": "f_alien_gasper", - "name": "gasping tube", - "description": "This is a meaty green stalactite with a thickened hide like that of a starfish, extending from the floor to the ceiling. In the center is a series of ports somewhat like mouths, from which pour bursts of a vile-smelling gas.", - "symbol": "{", - "color": "green", - "move_cost_mod": 6, - "coverage": 40, - "required_str": -1, - "flags": [ "TRANSPARENT", "EMITTER" ], - "emissions": [ "emit_migo_atmosphere", "emit_hot_air_migo_blast" ], - "//": "TODO: Make a custom toxic gas emission that is not visible to the player", - "bash": { - "str_min": 30, - "str_max": 60, - "sound": "splorch!", - "sound_fail": "whump!", - "furn_set": "f_alien_scar", - "items": [ { "item": "fetid_goop", "count": [ 15, 25 ], "prob": 100 } ] - } - }, - { - "type": "furniture", - "id": "f_alien_zapper", - "name": "twitching frond", - "description": "A spine resembling moth antennae juts from the ground, swaying gently in the air. Every so often, a cascade of energy arcs along it and discharges into the ceiling.", - "symbol": "F", - "color": "light_blue", - "move_cost_mod": 4, - "coverage": 20, - "required_str": -1, - "flags": [ "TRANSPARENT", "EMITTER" ], - "emissions": [ "emit_glimmer", "emit_shock_burst" ], - "//": "TODO: Make a custom toxic gas emission that is not visible to the player", - "bash": { "str_min": 30, "str_max": 60, "sound": "splorch!", "sound_fail": "whump!", "furn_set": "f_alien_scar" } - }, - { - "type": "furniture", - "id": "f_alien_scar", - "name": "scarred lump", - "description": "This is a pile of nondescript alien flesh, twitching and belching strange gases out of injured orifices.", - "symbol": "{", - "color": "green", - "move_cost_mod": 6, - "coverage": 40, - "required_str": -1, - "flags": [ "TRANSPARENT", "EMITTER" ], - "emissions": [ "emit_hot_air_migo_seep", "emit_shock_burst" ], - "//": "TODO: Make a custom toxic gas emission that is not visible to the player", - "bash": { - "str_min": 250, - "str_max": 600, - "sound": "splorch!", - "sound_fail": "splat!", - "items": [ { "item": "fetid_goop", "count": [ 6, 13 ], "prob": 100 } ] - } - }, - { - "type": "furniture", - "id": "f_alien_pod", - "name": "slimy pod", - "description": "This is a slick, translucent pod suspended on a thin stalk. It is covered in a thick mucus, obscuring whatever is floating in the gel-like substance inside.", - "symbol": "0", - "color": "magenta", - "move_cost_mod": -1, - "coverage": 40, - "required_str": -1, - "flags": [ "TRANSPARENT" ], - "bash": { - "str_min": 25, - "str_max": 60, - "sound": "splorch!", - "sound_fail": "whump.", - "items": [ { "item": "fetid_goop", "count": [ 5, 10 ], "prob": 100 } ] - } - }, - { - "type": "furniture", - "id": "f_alien_pod_organ", - "name": "organ pod", - "description": "This is a translucent pod suspended on a thin stalk. Inside you can see the dimly outlined shape of human organs, floating in some kind of preservative goo.", - "symbol": "0", - "color": "yellow", - "move_cost_mod": -1, - "coverage": 40, - "required_str": -1, - "light_emitted": 3, - "flags": [ "TRANSPARENT" ], - "bash": { "str_min": 25, "str_max": 60, "sound": "splorch!", "sound_fail": "whump." } - }, - { - "type": "furniture", - "id": "f_alien_pod_resin", - "name": "resin pod", - "description": "This is a translucent pod suspended on a thin stalk. Inside is a clean, clear resinous-looking fluid. You could fairly easily tear it from the stalk and take it with you.", - "symbol": "0", - "color": "light_blue", - "move_cost_mod": -1, - "coverage": 40, - "required_str": -1, - "flags": [ "TRANSPARENT", "EASY_DECONSTRUCT" ], - "deconstruct": { "items": [ { "item": "alien_pod_resin", "charges": [ 2, 6 ] } ] }, - "bash": { "str_min": 25, "str_max": 60, "sound": "splorch!", "sound_fail": "whump." } - }, - { - "type": "furniture", - "id": "f_alien_table", - "name": "fleshy altar", - "description": "This pulsing protuberance juts from the floor, its sides covered in scaled, oozing skin. The surface is flat, but undulates softly. A handful of unidentifiable appendages reach from the sides, suggesting a sort of nightmarish living autodoc.", - "symbol": "n", - "color": "pink", - "move_cost_mod": -1, - "coverage": 40, - "required_str": -1, - "light_emitted": 12, - "flags": [ "TRANSPARENT" ], - "bash": { "str_min": 45, "str_max": 60, "sound": "splorch!", "sound_fail": "whump.", "furn_set": "f_alien_scar" } - } -] diff --git a/data/json/furniture_and_terrain/furniture-plumbing.json b/data/json/furniture_and_terrain/furniture-plumbing.json index 630dbce5bc55e..b580206f2b30c 100644 --- a/data/json/furniture_and_terrain/furniture-plumbing.json +++ b/data/json/furniture_and_terrain/furniture-plumbing.json @@ -62,6 +62,7 @@ "coverage": 60, "required_str": -1, "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "CONTAINER", "PLACE_ITEM", "MOUNTABLE" ], + "//connects_to": "COUNTER", "bash": { "str_min": 8, "str_max": 30, diff --git a/data/json/furniture_and_terrain/furniture-recreation.json b/data/json/furniture_and_terrain/furniture-recreation.json index 87ae45ae4cd6b..58ae31a1257f8 100644 --- a/data/json/furniture_and_terrain/furniture-recreation.json +++ b/data/json/furniture_and_terrain/furniture-recreation.json @@ -4,12 +4,13 @@ "id": "f_exercise", "name": "exercise machine", "symbol": "T", - "description": "A heavy set of weightlifting equipment for strength training, with a pair of heavy weights affixed to opposite ends of a sturdy pipe. The weights are huge, and using them without a spotter would be a good way to seriously injure yourself.", + "description": "A heavy set of weightlifting equipment for strength training, with a pair of heavy weights affixed to opposite ends of a sturdy pipe. You can adjust the set by hand-picking the weights you wish to use.", "color": "dark_gray", "move_cost_mod": 1, "coverage": 35, "required_str": 8, - "flags": [ "TRANSPARENT", "MINEABLE" ], + "flags": [ "TRANSPARENT", "MINEABLE", "WORKOUT_ARMS" ], + "examine_action": "workout", "deconstruct": { "items": [ { "item": "pipe", "count": 1 }, @@ -250,6 +251,47 @@ ] } }, + { + "type": "furniture", + "id": "f_ergometer_mechanical", + "name": "mechanical ergometer", + "description": "An exercise machine with a set of handles and plates meant to emulate rowing a boat. This an older model with mechanical resistance adjustments, but it works without power.", + "symbol": "5", + "color": "dark_gray", + "move_cost_mod": 2, + "required_str": 8, + "looks_like": "f_ergometer", + "flags": [ "BLOCKSDOOR", "TRANSPARENT", "MOUNTABLE", "WORKOUT_ARMS", "WORKOUT_LEGS" ], + "deconstruct": { + "items": [ + { "item": "foot_crank", "count": [ 1, 1 ] }, + { "item": "plastic_chunk", "count": [ 8, 10 ] }, + { "item": "scrap", "count": [ 2, 4 ] }, + { "item": "chain", "count": 1 }, + { "item": "pipe", "count": [ 4, 5 ] }, + { "item": "saddle", "count": [ 1, 1 ] }, + { "item": "wheel_small", "count": [ 1, 1 ] }, + { "item": "nail", "charges": [ 6, 8 ] } + ] + }, + "examine_action": "workout", + "bash": { + "str_min": 6, + "str_max": 25, + "sound": "smash!", + "sound_fail": "thump!", + "items": [ + { "item": "foot_crank", "prob": 50 }, + { "item": "plastic_chunk", "count": [ 4, 6 ] }, + { "item": "scrap", "count": [ 0, 2 ] }, + { "item": "chain", "prob": 50 }, + { "item": "pipe", "count": [ 0, 4 ] }, + { "item": "saddle", "prob": 50 }, + { "item": "wheel_small", "prob": 50 }, + { "item": "nail", "charges": [ 2, 6 ] } + ] + } + }, { "type": "furniture", "id": "f_treadmill", @@ -267,6 +309,7 @@ { "item": "pipe", "count": [ 4, 3 ] }, { "item": "small_lcd_screen", "count": 1 }, { "item": "RAM", "count": 1 }, + { "item": "motor_tiny", "count": 1 }, { "item": "nail", "charges": [ 6, 8 ] } ] }, @@ -281,6 +324,40 @@ { "item": "pipe", "count": [ 0, 4 ] }, { "item": "small_lcd_screen", "prob": 50 }, { "item": "RAM", "count": [ 0, 1 ] }, + { "item": "motor_tiny", "count": [ 0, 1 ] }, + { "item": "nail", "charges": [ 2, 6 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_treadmill_mechanical", + "name": "gravity treadmill", + "description": "A gravity driven conveyor belt with a mechanical control panel for running in place. Conveyor belt is positioned in a steep, but adjustable incline, so it slides back under your weight.", + "symbol": "L", + "color": "dark_gray", + "move_cost_mod": 1, + "required_str": 12, + "looks_like": "f_treadmill", + "flags": [ "BLOCKSDOOR", "TRANSPARENT", "MOUNTABLE", "WORKOUT_LEGS" ], + "deconstruct": { + "items": [ + { "item": "plastic_chunk", "count": [ 10, 14 ] }, + { "item": "scrap", "count": [ 2, 10 ] }, + { "item": "pipe", "count": [ 4, 6 ] }, + { "item": "nail", "charges": [ 6, 8 ] } + ] + }, + "examine_action": "workout", + "bash": { + "str_min": 12, + "str_max": 40, + "sound": "smash!", + "sound_fail": "thump!", + "items": [ + { "item": "plastic_chunk", "count": [ 4, 10 ] }, + { "item": "scrap", "count": [ 0, 5 ] }, + { "item": "pipe", "count": [ 0, 4 ] }, { "item": "nail", "charges": [ 2, 6 ] } ] } @@ -297,7 +374,8 @@ "move_cost_mod": -1, "coverage": 65, "required_str": 10, - "flags": [ "BASHABLE", "BLOCKSDOOR", "PLACE_ITEM", "ORGANIC" ], + "flags": [ "BASHABLE", "BLOCKSDOOR", "PLACE_ITEM", "ORGANIC", "WORKOUT_ARMS" ], + "examine_action": "workout", "bash": { "str_min": 15, "str_max": 20, diff --git a/data/json/furniture_and_terrain/furniture-seats.json b/data/json/furniture_and_terrain/furniture-seats.json index 6ccae0c950855..7193141d4f74c 100644 --- a/data/json/furniture_and_terrain/furniture-seats.json +++ b/data/json/furniture_and_terrain/furniture-seats.json @@ -233,5 +233,39 @@ { "item": "rag", "count": [ 5, 10 ] } ] } + }, + { + "type": "furniture", + "id": "f_metal_bench", + "name": "metal bench", + "description": "A bench made of scrap metal. Not the most comfortable furniture you've ever seen.", + "symbol": "h", + "color": "light_gray", + "move_cost_mod": 1, + "coverage": 30, + "required_str": 7, + "comfort": 1, + "floor_bedding_warmth": -2000, + "bonus_fire_warmth_feet": 1000, + "flags": [ "TRANSPARENT", "MOUNTABLE", "SHORT", "CAN_SIT" ], + "bash": { + "str_min": 15, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 0, 1 ] }, + { "item": "pipe", "count": [ 0, 4 ] } + ] + }, + "deconstruct": { + "items": [ + { "item": "pipe_fittings", "count": 1 }, + { "item": "scrap", "count": 3 }, + { "item": "sheet_metal", "count": 1 }, + { "item": "pipe", "count": 4 } + ] + } } ] diff --git a/data/json/furniture_and_terrain/furniture-storage.json b/data/json/furniture_and_terrain/furniture-storage.json index 2c13322251517..120f285782beb 100644 --- a/data/json/furniture_and_terrain/furniture-storage.json +++ b/data/json/furniture_and_terrain/furniture-storage.json @@ -878,6 +878,100 @@ "items": [ { "item": "scrap", "count": [ 8, 32 ] }, { "item": "water_faucet", "prob": 50 } ] } }, + { + "type": "furniture", + "id": "f_gas_tank", + "name": "fuel tank", + "description": "A tank filled with gasoline.", + "looks_like": "f_standing_tank", + "symbol": "Q", + "color": "brown_red", + "move_cost_mod": -1, + "coverage": 70, + "required_str": -1, + "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "SEALED", "CONTAINER", "REDUCE_SCENT" ], + "bash": { + "str_min": 40, + "str_max": 100, + "explosive": 20, + "sound": "metal screeching!", + "sound_fail": "clang!", + "furn_set": "f_gas_tank_smashed" + } + }, + { + "type": "furniture", + "id": "f_gas_tank_smashed", + "name": "broken fuel tank", + "description": "A broken tank which was filled with gasoline.", + "looks_like": "f_wreckage", + "symbol": "Q", + "color": "light_red", + "move_cost_mod": 6, + "coverage": 30, + "required_str": -1, + "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT" ], + "bash": { + "str_min": 40, + "str_max": 100, + "explosive": 40, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "steel_lump", "count": [ 1, 4 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 7 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_diesel_tank", + "name": "fuel tank", + "description": "A tank filled with diesel.", + "looks_like": "f_standing_tank", + "symbol": "Q", + "color": "brown_green", + "move_cost_mod": -1, + "coverage": 70, + "required_str": -1, + "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "SEALED", "CONTAINER", "REDUCE_SCENT" ], + "bash": { + "str_min": 40, + "str_max": 100, + "explosive": 20, + "sound": "metal screeching!", + "sound_fail": "clang!", + "furn_set": "f_diesel_tank_smashed" + } + }, + { + "type": "furniture", + "id": "f_diesel_tank_smashed", + "name": "broken fuel tank", + "description": "A broken tank which was filled with diesel.", + "looks_like": "f_wreckage", + "symbol": "Q", + "color": "light_green", + "move_cost_mod": 6, + "coverage": 30, + "required_str": -1, + "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT" ], + "bash": { + "str_min": 40, + "str_max": 100, + "explosive": 40, + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "steel_lump", "count": [ 1, 4 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 7 ] } + ] + } + }, { "type": "furniture", "id": "f_dumpster", @@ -930,5 +1024,81 @@ { "item": "splinter", "count": [ 1, 20 ] } ] } + }, + { + "type": "furniture", + "id": "f_metal_crate_r", + "name": "riveted metal crate", + "looks_like": "f_metal_crate_c", + "description": "This huge box is made of a dull metal, riveted together. There is no obvious opening mechanism, and the rivets don't match any of your tools. The only way in would be to smash it.", + "//": "To-do: There should be an exodii riveting tool that can convert this to f_metal_crate_c", + "symbol": "X", + "color": "light_gray", + "move_cost_mod": 5, + "coverage": 80, + "required_str": 12, + "max_volume": "1000 L", + "flags": [ "CONTAINER", "SEALED", "BLOCKSDOOR", "MOUNTABLE" ], + "bash": { + "str_min": 30, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_metal_crate_c", + "name": "sealed metal crate", + "looks_like": "t_crate_c", + "description": "This is a huge, tightly sealed storage crate made from welded and riveted sheet metal. The sealing mechanism is too tight to open bare-handed and would need some kind of prying instrument to release.", + "symbol": "X", + "color": "light_gray", + "move_cost_mod": 5, + "coverage": 80, + "required_str": 12, + "max_volume": "1000 L", + "flags": [ "CONTAINER", "SEALED", "BLOCKSDOOR", "MOUNTABLE", "FLAT_SURF" ], + "bash": { + "str_min": 30, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_metal_crate_o", + "name": "open metal crate", + "looks_like": "f_metal_crate_c", + "description": "This large metal crate’s lid is unsealed, and hinges open easily to reveal a number of storage shelves inside. Once open, the side panels also swing wider for easy access.", + "symbol": "X", + "color": "light_gray", + "move_cost_mod": 5, + "coverage": 80, + "required_str": 12, + "max_volume": "1000 L", + "flags": [ "CONTAINER", "PLACE_ITEM", "NO_SIGHT", "HIDE_PLACE", "BLOCKSDOOR", "MOUNTABLE" ], + "bash": { + "str_min": 30, + "str_max": 150, + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] } + ] + } } ] diff --git a/data/json/furniture_and_terrain/furniture-surfaces.json b/data/json/furniture_and_terrain/furniture-surfaces.json index 69359619cea6a..272d466d732e0 100644 --- a/data/json/furniture_and_terrain/furniture-surfaces.json +++ b/data/json/furniture_and_terrain/furniture-surfaces.json @@ -10,6 +10,7 @@ "coverage": 60, "required_str": 10, "flags": [ "TRANSPARENT", "FLAMMABLE", "ORGANIC", "MOUNTABLE", "SHORT", "FLAT_SURF" ], + "//connects_to": "COUNTER", "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 10 ] } ] }, @@ -34,6 +35,7 @@ "coverage": 55, "required_str": -1, "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "CONTAINER", "PLACE_ITEM", "ORGANIC", "MOUNTABLE", "FLAT_SURF" ], + "//connects_to": "COUNTER", "deconstruct": { "items": [ { "item": "2x4", "count": 3 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 8 ] } ] }, @@ -311,5 +313,38 @@ }, "examine_action": "workbench", "workbench": { "multiplier": 0.85, "mass": 200000, "volume": "75L" } + }, + { + "type": "furniture", + "id": "f_metal_table", + "name": "metal table", + "description": "A serviceable but simple table made of scrap metal.", + "symbol": "T", + "color": "light_gray", + "move_cost_mod": 4, + "coverage": 40, + "required_str": 8, + "flags": [ "TRANSPARENT", "MOUNTABLE", "FLAT_SURF", "SHORT" ], + "bash": { + "str_min": 20, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 0, 1 ] }, + { "item": "pipe", "count": [ 0, 4 ] } + ] + }, + "deconstruct": { + "items": [ + { "item": "pipe_fittings", "count": 2 }, + { "item": "scrap", "count": 4 }, + { "item": "sheet_metal", "count": 1 }, + { "item": "pipe", "count": 4 } + ] + }, + "examine_action": "workbench", + "workbench": { "multiplier": 1.1, "mass": 500000, "volume": "300L" } } ] diff --git a/data/json/furniture_and_terrain/furniture-terrains.json b/data/json/furniture_and_terrain/furniture-terrains.json index 0708175a0f9d8..cda62fcb1c497 100644 --- a/data/json/furniture_and_terrain/furniture-terrains.json +++ b/data/json/furniture_and_terrain/furniture-terrains.json @@ -590,6 +590,33 @@ ], "examine_action": "rubble" }, + { + "type": "furniture", + "id": "f_reactor_meltdown", + "name": "radioactive slag", + "description": "A pile of melted slag from a destroyed nuclear reactor. What are you doing looking at this? Get the hell out of here, you nutcase!", + "looks_like": "f_wreckage", + "symbol": "#", + "color": "light_green", + "move_cost_mod": 6, + "max_volume": "750 L", + "required_str": -1, + "emissions": [ "emit_rad_cloud" ], + "flags": [ + "TRANSPARENT", + "UNSTABLE", + "ROUGH", + "SHARP", + "PLACE_ITEM", + "MOUNTABLE", + "CONTAINER", + "SEALED", + "ALLOW_FIELD_EFFECT", + "SHORT", + "RUBBLE", + "EMITTER" + ] + }, { "type": "furniture", "id": "f_ash", @@ -746,5 +773,35 @@ { "item": "scrap", "count": [ 3, 5 ] } ] } + }, + { + "type": "furniture", + "id": "f_scrap_bridge", + "name": "scrap metal bridge", + "description": "A simple bridge made of riveted sheet metal.", + "move_cost_mod": 0, + "symbol": "]", + "color": "light_gray", + "required_str": -1, + "flags": [ "TRANSPARENT", "NOCOLLIDE" ], + "deconstruct": { + "items": [ + { "item": "scrap", "count": 10 }, + { "item": "sheet_metal", "count": 2 }, + { "item": "rebar", "count": 2 }, + { "item": "wire", "count": 2 } + ] + }, + "bash": { + "str_min": 25, + "str_max": 200, + "sound": "metal screeching!", + "sound_fail": "crash!", + "items": [ + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "sheet_metal", "count": [ 0, 1 ] }, + { "item": "rebar", "count": [ 0, 2 ] } + ] + } } ] diff --git a/data/json/furniture_and_terrain/furniture-tools.json b/data/json/furniture_and_terrain/furniture-tools.json index 8d010dc55b4ba..666b2a53540fd 100644 --- a/data/json/furniture_and_terrain/furniture-tools.json +++ b/data/json/furniture_and_terrain/furniture-tools.json @@ -1,4 +1,99 @@ [ + { + "type": "furniture", + "id": "f_console_broken", + "name": "broken console", + "description": "This is a standalone computer terminal. It doesn't seem to be working. It's the broken screen and shattered circuit boards that's telling you that.", + "symbol": "6", + "color": "light_gray", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "flags": [ "TRANSPARENT", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], + "//connects_to": "COUNTER", + "deconstruct": { + "furn_set": "f_counter", + "items": [ + { "item": "processor", "count": [ 1, 2 ] }, + { "item": "RAM", "count": [ 4, 8 ] }, + { "item": "cable", "charges": [ 4, 6 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 10, 16 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 2, 4 ] }, + { "item": "amplifier", "count": [ 2, 4 ] }, + { "item": "plastic_chunk", "count": [ 10, 12 ] }, + { "item": "scrap", "count": [ 6, 8 ] } + ] + }, + "bash": { + "str_min": 16, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "whack!", + "furn_set": "f_counter", + "items": [ + { "item": "processor", "prob": 25 }, + { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, + { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, + { "item": "large_lcd_screen", "prob": 25 }, + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, + { "item": "power_supply", "prob": 25 }, + { "item": "amplifier", "prob": 25 }, + { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } + ] + } + }, + { + "type": "furniture", + "id": "f_console", + "name": "computer console", + "description": "This is a standalone computer terminal. It can be used to view contents and perform any allowed functions. It might even be possible to hack it, given the skills.", + "symbol": "6", + "color": "blue", + "move_cost_mod": -1, + "coverage": 50, + "required_str": -1, + "light_emitted": 10, + "flags": [ "TRANSPARENT", "CONSOLE", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], + "//connects_to": "COUNTER", + "deconstruct": { + "furn_set": "f_counter", + "items": [ + { "item": "processor", "count": [ 1, 2 ] }, + { "item": "RAM", "count": [ 4, 8 ] }, + { "item": "cable", "charges": [ 4, 6 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 10, 16 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 2, 4 ] }, + { "item": "amplifier", "count": [ 2, 4 ] }, + { "item": "plastic_chunk", "count": [ 10, 12 ] }, + { "item": "scrap", "count": [ 6, 8 ] } + ] + }, + "bash": { + "str_min": 8, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "whack!", + "furn_set": "f_console_broken", + "items": [ + { "item": "processor", "prob": 25 }, + { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, + { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, + { "item": "large_lcd_screen", "prob": 25 }, + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, + { "item": "power_supply", "prob": 25 }, + { "item": "amplifier", "prob": 25 }, + { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } + ] + } + }, { "type": "furniture", "id": "f_forge", @@ -214,7 +309,7 @@ "move_cost_mod": 2, "required_str": -1, "flags": [ "TRANSPARENT", "SEALED", "ALLOW_FIELD_EFFECT", "CONTAINER", "NOITEM", "EASY_DECONSTRUCT", "MINEABLE" ], - "crafting_pseudo_item": "char_smoker", + "crafting_pseudo_item": "pseudo_char_smoker", "examine_action": "smoker_options", "deconstruct": { "items": [ { "item": "rock", "count": 8 }, { "item": "stick", "count": [ 16, 16 ] } ] }, "bash": { @@ -236,7 +331,7 @@ "move_cost_mod": 2, "required_str": -1, "flags": [ "TRANSPARENT", "SEALED", "ALLOW_FIELD_EFFECT", "CONTAINER", "NOITEM", "EASY_DECONSTRUCT", "MINEABLE" ], - "crafting_pseudo_item": "char_smoker", + "crafting_pseudo_item": "pseudo_char_smoker", "examine_action": "smoker_options", "bash": { "str_min": 18, @@ -365,7 +460,7 @@ "type": "furniture", "id": "f_arc_furnace", "name": "electric arc furnace", - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "description": "Not the kind of furnace you'd heat your house with, this is a device for heating things to extreme temperatures as part of industrial fabrication processes.", "symbol": "0", "color": "white_red", @@ -399,7 +494,7 @@ "type": "furniture", "id": "f_drill_press", "name": "drill press", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A powerful drill mounted on a slide that lets it drop precisely down. Useful in all kinds of projects from industrial fabrication to home woodworking.", "symbol": "7", "color": "yellow_red", @@ -436,7 +531,7 @@ "type": "furniture", "id": "f_tablesaw", "name": "tablesaw", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A rotating saw blade set into a large flat table, for making straight measured cuts. One of the key tools in a carpenter's arsenal.", "symbol": "7", "color": "yellow_red", @@ -474,7 +569,7 @@ "type": "furniture", "id": "f_mitresaw", "name": "mitre saw", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A circular saw blade on an arm that can slide and rotate in several directions, this is a staple tool for nearly any carpentry.", "symbol": "7", "color": "yellow_cyan", @@ -512,7 +607,7 @@ "type": "furniture", "id": "f_bandsaw", "name": "bandsaw", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A ribbonlike sawblade runs in a single direction in this tool, allowing precise cuts at almost any angle.", "symbol": "7", "color": "yellow_cyan", @@ -549,7 +644,7 @@ "type": "furniture", "id": "f_router", "name": "router table", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "This table has an inset router, a rotating motor with an exchangeable blade head for cutting specific profiles and grooves and stuff.", "symbol": "7", "color": "yellow_green", @@ -586,7 +681,7 @@ "type": "furniture", "id": "f_planer", "name": "planer", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A hefty tool that will take in a board and cut it smooth and flat to a specific width. Particularly great if working with raw lumber stock, but also good just for shaving wood down to size.", "symbol": "7", "color": "yellow_white", @@ -623,7 +718,7 @@ "type": "furniture", "id": "f_jointer", "name": "jointer", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "A table-shaped tool with a rotating blade that will cut down, smooth out, and square off a board to make it very smooth and nice indeed.", "symbol": "7", "color": "yellow_magenta", @@ -660,7 +755,7 @@ "type": "furniture", "id": "f_hydraulic_press", "name": "hydraulic press", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "If you really want to squash something a lot, this would be exactly the right industrial tool for you. If, you know, it had power.", "symbol": "9", "color": "black_red", @@ -697,7 +792,7 @@ "type": "furniture", "id": "f_heavy_lathe", "name": "power lathe", - "looks_like": "t_machinery_light", + "looks_like": "f_machinery_light", "description": "An industrial-grade lathe, for turning chunks of metal and other hard things into round chunks of metal and other hard things.", "symbol": "4", "color": "cyan_red", @@ -1008,7 +1103,7 @@ "type": "furniture", "id": "f_aut_gas_console", "name": "automated gas console", - "looks_like": "t_console", + "looks_like": "f_console", "description": "Automated gas flow control console.", "symbol": "9", "color": "blue", @@ -1023,7 +1118,7 @@ "type": "furniture", "id": "f_aut_gas_console_o", "name": "broken automated gas console", - "looks_like": "t_console_broken", + "looks_like": "f_console_broken", "description": "Automated gas flow control console. Broken. This is not a good thing.", "symbol": "9", "color": "dark_gray", @@ -1075,7 +1170,7 @@ "type": "furniture", "id": "f_vending_c", "name": "vending machine", - "looks_like": "t_console", + "looks_like": "f_console", "symbol": "{", "description": "Buy stuff with a cash card.", "color": "light_cyan", @@ -1099,7 +1194,7 @@ "type": "furniture", "id": "f_vending_o", "name": "broken vending machine", - "looks_like": "t_console_broken", + "looks_like": "f_console_broken", "description": "Ponder if you could buy stuff, as it's broken. Maybe if you broke it more, you wouldn't need to pay at all!", "symbol": "{", "color": "dark_gray", @@ -1120,5 +1215,26 @@ { "item": "scrap_copper", "count": [ 0, 2 ] } ] } + }, + { + "type": "furniture", + "id": "f_rope_up", + "name": "rope leading up", + "looks_like": "t_rope_up", + "description": "A rope. You could climb it up.", + "symbol": "<", + "color": "white", + "move_cost_mod": 1, + "required_str": 10, + "flags": [ "LADDER", "TRANSPARENT", "SEEN_FROM_ABOVE" ], + "examine_action": "deployed_furniture", + "deployed_item": "grapnel", + "bash": { + "str_min": 3, + "str_max": 40, + "sound": "smash!", + "sound_fail": "whump.", + "items": [ { "item": "grip_hook", "count": [ 4, 4 ] }, { "item": "rope_30", "count": [ 1, 1 ] } ] + } } ] diff --git a/data/json/furniture_and_terrain/terrain-fences-gates.json b/data/json/furniture_and_terrain/terrain-fences-gates.json index e38358b49e8fc..873df1c6b81d0 100644 --- a/data/json/furniture_and_terrain/terrain-fences-gates.json +++ b/data/json/furniture_and_terrain/terrain-fences-gates.json @@ -947,6 +947,25 @@ ] } }, + { + "type": "terrain", + "id": "t_guardrail_hw_air", + "name": "guard rail", + "description": "A section of metal railing, put in place to prevent people from falling or taking the easy way out.", + "symbol": "#", + "color": "light_gray", + "looks_like": "t_guardrail_bg_dp", + "move_cost": 3, + "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT", "MOUNTABLE", "SHORT", "THIN_OBSTACLE", "ROAD", "BURROWABLE" ], + "bash": { + "str_min": 8, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "clang!", + "ter_set": "t_pavement_hw_air", + "items": [ { "item": "pipe", "count": [ 1, 2 ] }, { "item": "scrap", "count": [ 3, 6 ] } ] + } + }, { "type": "terrain", "id": "t_guardrail_bg_dp", diff --git a/data/json/furniture_and_terrain/terrain-flesh.json b/data/json/furniture_and_terrain/terrain-flesh.json new file mode 100644 index 0000000000000..61dda64871e97 --- /dev/null +++ b/data/json/furniture_and_terrain/terrain-flesh.json @@ -0,0 +1,41 @@ +[ + { + "type": "terrain", + "id": "t_thconc_floor_flesh", + "name": "overgrown floor", + "description": "A bare concrete floor, almost completely covered by twitching filaments of grey flesh.", + "symbol": ".", + "color": "red_yellow", + "move_cost": 5, + "roof": "t_flat_roof", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT" ], + "bash": { + "sound": "SMASH!", + "ter_set": "t_concrete", + "str_min": 10, + "str_max": 20, + "str_min_supported": 10, + "items": [ { "item": "meat_tainted", "count": [ 5, 10 ] } ] + } + }, + { + "type": "terrain", + "id": "t_concrete_wall_flesh", + "name": "overgrown wall", + "description": "A concrete wall overgrown by a grotesque grid of veins and knotted flesh.", + "symbol": "LINE_OXOX", + "color": "magenta_yellow", + "move_cost": 0, + "coverage": 100, + "roof": "t_flat_roof", + "flags": [ "NOITEM", "SUPPORTS_ROOF", "WALL", "NO_SCENT", "AUTO_WALL_SYMBOL", "MINEABLE", "BLOCK_WIND" ], + "bash": { + "str_min": 10, + "str_max": 20, + "sound": "crash!", + "sound_fail": "whump!", + "ter_set": "t_strconc_wall", + "items": [ { "item": "meat_tainted", "count": [ 5, 10 ] } ] + } + } +] diff --git a/data/json/furniture_and_terrain/terrain-floors_indoor.json b/data/json/furniture_and_terrain/terrain-floors-indoor.json similarity index 75% rename from data/json/furniture_and_terrain/terrain-floors_indoor.json rename to data/json/furniture_and_terrain/terrain-floors-indoor.json index 8fcc59d36da1f..e952ff1cb1ba8 100644 --- a/data/json/furniture_and_terrain/terrain-floors_indoor.json +++ b/data/json/furniture_and_terrain/terrain-floors-indoor.json @@ -29,7 +29,7 @@ "description": "A bare and cold concrete floor with a streak of yellow paint, could still insulate from the outdoors but roof collapse is possible if supporting walls are broken down.", "symbol": ".", "color": "yellow", - "looks_like": "t_wall_y", + "looks_like": "t_pavement_y", "move_cost": 2, "roof": "t_flat_roof", "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "ROAD" ], @@ -386,125 +386,217 @@ }, { "type": "terrain", - "id": "t_carpet_concrete", - "name": "industrial carpet", - "description": "Firm, low-pile, high-durability carpet in a neutral gray color, for laying down on bare concrete.", + "id": "t_carpet_base", + "name": "carpet", + "description": "Base carpet!", "symbol": ".", - "color": "light_gray", - "looks_like": "t_carpet_red", + "color": "red", "move_cost": 2, - "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], + "roof": "t_flat_roof", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], "bash": { "sound": "SMASH!", - "ter_set": "t_null", - "str_min": 100, - "str_max": 400, - "str_min_supported": 150, - "items": [ - { "item": "rock", "count": [ 5, 10 ] }, - { "item": "scrap", "count": [ 5, 8 ] }, - { "item": "rebar", "count": [ 0, 2 ] } - ] - } - }, - { - "type": "terrain", - "id": "t_carpet_metal", - "name": "bunker carpet", - "description": "Firm, low-pile, totally non-flammable carpet in a neutral cream color, with an insulation layer beneath.", - "symbol": ".", - "color": "white", - "looks_like": "t_carpet_yellow", - "move_cost": 2, - "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], - "bash": { - "sound": "thump", - "ter_set": "t_null", - "str_min": 200, - "str_max": 500, - "str_min_supported": 200, - "items": [ - { "item": "steel_lump", "count": [ 1, 4 ] }, - { "item": "steel_chunk", "count": [ 3, 12 ] }, - { "item": "scrap", "count": [ 9, 36 ] } - ] - } + "ter_set": "t_floor", + "str_min": 5, + "str_max": 15, + "str_min_supported": 100, + "items": [ { "item": "rag", "count": [ 10, 20 ] }, { "item": "nail", "charges": [ 1, 3 ] } ] + }, + "deconstruct": { "items": [ { "item": "r_carpet", "count": 1 }, { "item": "nail", "count": [ 2, 5 ] } ], "ter_set": "t_floor" } }, { "type": "terrain", "id": "t_carpet_red", - "name": "red carpet", - "description": "Soft red carpet.", + "copy-from": "t_carpet_base", + "name": "carpet", "symbol": ".", "color": "red", "move_cost": 2, "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], - "bash": { - "sound": "SMASH!", - "ter_set": "t_null", - "str_min": 50, - "str_max": 400, - "str_min_supported": 100, - "items": [ { "item": "splinter", "count": [ 2, 8 ] }, { "item": "nail", "charges": [ 6, 13 ] } ] - } + "description": "Soft red carpet.", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "ter_set": "t_floor", "items": [ { "item": "r_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ] } }, { "type": "terrain", "id": "t_carpet_yellow", + "copy-from": "t_carpet_base", "name": "yellow carpet", "description": "Soft yellow carpet.", "symbol": ".", "color": "yellow", "move_cost": 2, - "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], - "bash": { - "sound": "SMASH!", - "ter_set": "t_null", - "str_min": 50, - "str_max": 400, - "str_min_supported": 100, - "items": [ { "item": "splinter", "count": [ 2, 8 ] }, { "item": "nail", "charges": [ 6, 13 ] } ] - } + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "y_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_floor" } }, { "type": "terrain", "id": "t_carpet_green", + "copy-from": "t_carpet_base", "name": "green carpet", "description": "Soft green carpet.", "symbol": ".", "color": "green", "move_cost": 2, - "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], - "bash": { - "sound": "SMASH!", - "ter_set": "t_null", - "str_min": 50, - "str_max": 400, - "str_min_supported": 100, - "items": [ { "item": "splinter", "count": [ 2, 8 ] }, { "item": "nail", "charges": [ 6, 13 ] } ] - } + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "g_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_floor" } }, { "type": "terrain", "id": "t_carpet_purple", + "copy-from": "t_carpet_base", "name": "purple carpet", "description": "Soft purple carpet.", "symbol": ".", "color": "magenta", "move_cost": 2, - "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "p_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_base_concrete", + "name": "Carpet", + "symbol": ".", + "color": "red", + "move_cost": 2, + "copy-from": "t_carpet_base", + "description": "Base concrete carpet!", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], "bash": { "sound": "SMASH!", - "ter_set": "t_null", - "str_min": 50, - "str_max": 400, + "ter_set": "t_thconc_floor", + "str_min": 5, + "str_max": 15, "str_min_supported": 100, - "items": [ { "item": "splinter", "count": [ 2, 8 ] }, { "item": "nail", "charges": [ 6, 13 ] } ] - } + "items": [ { "item": "rag", "count": [ 10, 20 ] }, { "item": "nail", "charges": [ 1, 3 ] } ] + }, + "deconstruct": { "items": [ { "item": "r_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_thconc_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_concrete_red", + "copy-from": "t_carpet_base_concrete", + "name": "industrial red carpet", + "alias": "t_carpet_concrete", + "looks_like": "t_carpet_red", + "symbol": ".", + "color": "red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "description": "Firm, low-pile, high-durability carpet in a red color, for laying down on bare concrete." + }, + { + "type": "terrain", + "id": "t_carpet_concrete_yellow", + "copy-from": "t_carpet_base_concrete", + "name": "industrial yellow carpet", + "description": "Firm, low-pile, high-durability carpet in a yellow color, for laying down on bare concrete.", + "symbol": ".", + "color": "yellow", + "move_cost": 2, + "looks_like": "t_carpet_yellow", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "y_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_thconc_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_concrete_green", + "copy-from": "t_carpet_base_concrete", + "name": "industrial green carpet", + "description": "Firm, low-pile, high-durability carpet in a green color, for laying down on bare concrete.", + "symbol": ".", + "color": "green", + "move_cost": 2, + "looks_like": "t_carpet_green", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "g_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_thconc_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_concrete_purple", + "copy-from": "t_carpet_base_concrete", + "name": "industrial purple carpet", + "description": "Firm, low-pile, high-durability carpet in a purple color, for laying down on bare concrete.", + "symbol": ".", + "color": "magenta", + "move_cost": 2, + "looks_like": "t_carpet_purple", + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "p_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_thconc_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_base_metal", + "name": "carpet", + "copy-from": "t_carpet_base", + "description": "Base metal carpet!", + "symbol": ".", + "color": "red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "bash": { + "sound": "SMASH!", + "ter_set": "t_metal_floor", + "str_min": 5, + "str_max": 15, + "str_min_supported": 100, + "items": [ { "item": "rag", "count": [ 10, 20 ] }, { "item": "nail", "charges": [ 1, 3 ] } ] + }, + "deconstruct": { "items": [ { "item": "r_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_metal_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_metal_red", + "copy-from": "t_carpet_base_metal", + "name": "bunker red carpet", + "symbol": ".", + "color": "red", + "move_cost": 2, + "looks_like": "t_carpet_red", + "description": "Firm, low-pile, totally non-flammable carpet in a red color, with an insulation layer beneath.", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "r_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_metal_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_metal_yellow", + "copy-from": "t_carpet_base_metal", + "name": "bunker yellow carpet", + "alias": "t_carpet_metal", + "description": "Firm, low-pile, totally non-flammable carpet in a yellow color, with an insulation layer beneath.", + "symbol": ".", + "color": "yellow", + "move_cost": 2, + "looks_like": "t_carpet_yellow", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "y_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_metal_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_metal_green", + "copy-from": "t_carpet_base_metal", + "name": "bunker green carpet", + "description": "Firm, low-pile, totally non-flammable carpet in a green color, with an insulation layer beneath.", + "symbol": ".", + "color": "green", + "move_cost": 2, + "looks_like": "t_carpet_green", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "g_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_metal_floor" } + }, + { + "type": "terrain", + "id": "t_carpet_metal_purple", + "copy-from": "t_carpet_base_metal", + "name": "bunker carpet purple", + "description": "Firm, low-pile, totally non-flammable carpet in a purple color, with an insulation layer beneath.", + "symbol": ".", + "color": "magenta", + "move_cost": 2, + "looks_like": "t_carpet_purple", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ], + "deconstruct": { "items": [ { "item": "p_carpet", "charges": 1 }, { "item": "nail", "charges": 5 } ], "ter_set": "t_metal_floor" } }, { "type": "terrain", diff --git a/data/json/furniture_and_terrain/terrain-highways.json b/data/json/furniture_and_terrain/terrain-highways.json new file mode 100644 index 0000000000000..7eeaa08f1d3eb --- /dev/null +++ b/data/json/furniture_and_terrain/terrain-highways.json @@ -0,0 +1,59 @@ +[ + { + "type": "terrain", + "id": "t_pavement_hw_air", + "name": "bridge pavement", + "description": "A bridge section made out of metal and concrete.", + "looks_like": "t_pavement", + "symbol": ".", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "MINEABLE" ], + "bash": { + "str_min": 70, + "str_max": 300, + "sound": "concrete cracking and metal screeching!", + "sound_fail": "whump!", + "ter_set": "t_open_air", + "items": [ { "item": "rock", "count": [ 4, 20 ] }, { "item": "rebar", "count": [ 10, 20 ] } ] + } + }, + { + "type": "terrain", + "id": "t_pavement_y_hw_air", + "name": "bridge yellow pavement", + "description": "A bridge section made out of metal and concrete. It's painted yellow.", + "looks_like": "t_pavement_y", + "symbol": ".", + "color": "yellow", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "MINEABLE" ], + "bash": { + "str_min": 70, + "str_max": 300, + "sound": "concrete cracking and metal screeching!", + "sound_fail": "whump!", + "ter_set": "t_open_air", + "items": [ { "item": "rock", "count": [ 4, 20 ] }, { "item": "rebar", "count": [ 10, 20 ] } ] + } + }, + { + "type": "terrain", + "id": "t_sidewalk_hw_air", + "name": "bridge sidewalk", + "description": "The sidewalk section of a concrete bridge.", + "looks_like": "t_sidewalk", + "symbol": ".", + "color": "light_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "MINEABLE" ], + "bash": { + "str_min": 70, + "str_max": 300, + "sound": "concrete cracking and metal screeching!", + "sound_fail": "whump!", + "ter_set": "t_open_air", + "items": [ { "item": "rock", "count": [ 4, 20 ] }, { "item": "rebar", "count": [ 10, 20 ] } ] + } + } +] diff --git a/data/json/furniture_and_terrain/terrain-manufactured.json b/data/json/furniture_and_terrain/terrain-manufactured.json index a25bb63a2cc99..1079ab1182944 100644 --- a/data/json/furniture_and_terrain/terrain-manufactured.json +++ b/data/json/furniture_and_terrain/terrain-manufactured.json @@ -4,7 +4,7 @@ "id": "t_recycler", "name": "metal compactor", "description": "A hydraulic compactor that can accept items made of various metals, and press them into basic shapes, ready for further crafting.", - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "symbol": "&", "color": "green", "move_cost": 0, @@ -24,56 +24,11 @@ ] } }, - { - "type": "terrain", - "id": "t_gas_tank", - "name": "fuel tank", - "description": "A tank filled with gasoline.", - "looks_like": "f_standing_tank", - "symbol": "Q", - "color": "brown_red", - "move_cost": 0, - "coverage": 50, - "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "SEALED", "CONTAINER", "REDUCE_SCENT" ], - "bash": { - "str_min": 40, - "str_max": 100, - "explosive": 40, - "sound": "metal screeching!", - "sound_fail": "clang!", - "ter_set": "t_gas_tank_smashed" - } - }, - { - "type": "terrain", - "id": "t_gas_tank_smashed", - "name": "broken fuel tank", - "description": "A broken tank which was filled with gasoline.", - "looks_like": "f_wreckage", - "symbol": "Q", - "color": "light_red", - "move_cost": 0, - "coverage": 50, - "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "REDUCE_SCENT" ], - "bash": { - "str_min": 40, - "str_max": 100, - "explosive": 40, - "sound": "metal screeching!", - "sound_fail": "clang!", - "ter_set": "t_pavement", - "items": [ - { "item": "steel_lump", "count": [ 1, 4 ] }, - { "item": "steel_chunk", "count": [ 1, 4 ] }, - { "item": "scrap", "count": [ 3, 7 ] } - ] - } - }, { "type": "terrain", "id": "t_gas_pump", "name": "gasoline pump", - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "description": "Precious GASOLINE. The former world bowed to their petroleum god as it led them to their ruin. There's plenty left over to fuel your inner road warrior. If this gas dispenser doesn't give up the goods for free, you may have to pay at a nearby terminal.", "symbol": "&", "color": "red", @@ -129,51 +84,6 @@ ] } }, - { - "type": "terrain", - "id": "t_diesel_tank", - "name": "fuel tank", - "description": "A tank filled with diesel.", - "looks_like": "f_standing_tank", - "symbol": "Q", - "color": "brown_green", - "move_cost": 0, - "coverage": 50, - "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "SEALED", "CONTAINER", "REDUCE_SCENT" ], - "bash": { - "str_min": 40, - "str_max": 100, - "explosive": 40, - "sound": "metal screeching!", - "sound_fail": "clang!", - "ter_set": "t_diesel_tank_smashed" - } - }, - { - "type": "terrain", - "id": "t_diesel_tank_smashed", - "name": "broken fuel tank", - "description": "A broken tank which was filled with diesel.", - "looks_like": "f_wreckage", - "symbol": "Q", - "color": "light_green", - "move_cost": 0, - "coverage": 50, - "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "REDUCE_SCENT" ], - "bash": { - "str_min": 40, - "str_max": 100, - "explosive": 40, - "sound": "metal screeching!", - "sound_fail": "clang!", - "ter_set": "t_pavement", - "items": [ - { "item": "steel_lump", "count": [ 1, 4 ] }, - { "item": "steel_chunk", "count": [ 1, 4 ] }, - { "item": "scrap", "count": [ 3, 7 ] } - ] - } - }, { "type": "terrain", "id": "t_diesel_pump", @@ -322,30 +232,6 @@ }, "deconstruct": { "ter_set": "t_metal_floor_no_roof", "items": [ { "item": "scrap", "count": [ 8, 16 ] } ] } }, - { - "type": "terrain", - "id": "t_generator_broken", - "name": "broken generator", - "description": "This generator is broken and will not help you produce usable electricity.", - "symbol": "&", - "color": "light_gray", - "looks_like": "t_machinery_old", - "move_cost": 0, - "coverage": 30, - "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT", "MOUNTABLE", "PERMEABLE" ], - "bash": { - "str_min": 20, - "str_max": 150, - "sound": "metal screeching!", - "sound_fail": "clang!", - "ter_set": "t_pavement", - "items": [ - { "item": "steel_lump", "prob": 50 }, - { "item": "steel_chunk", "count": [ 1, 4 ] }, - { "item": "scrap", "count": [ 3, 7 ] } - ] - } - }, { "type": "terrain", "id": "t_missile", @@ -416,7 +302,7 @@ "description": "This console appears to control a nearby radio transmission tower. It doesn't seem to be fully operational.", "symbol": "6", "color": "green", - "looks_like": "t_console_broken", + "looks_like": "f_console_broken", "move_cost": 0, "coverage": 50, "flags": [ "TRANSPARENT", "NOITEM", "PERMEABLE" ], @@ -481,7 +367,7 @@ "description": "This unpowered pump previously would have moved fluids around in a hurry.", "symbol": "&", "color": "light_gray", - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "move_cost": 0, "coverage": 50, "flags": [ "NOITEM", "REDUCE_SCENT", "MOUNTABLE" ], @@ -498,32 +384,6 @@ ] } }, - { - "type": "terrain", - "id": "t_centrifuge", - "name": "centrifuge", - "description": "This is a centrifuge, a liquid separating device with an automated analyzer unit. It could be used to analyze a medical fluid sample, such as blood, if a test tube was placed in it.", - "symbol": "{", - "color": "magenta", - "move_cost": 0, - "coverage": 30, - "flags": [ "TRANSPARENT", "PERMEABLE" ], - "bash": { - "str_min": 3, - "str_max": 45, - "sound": "crunch!", - "sound_fail": "whack!", - "ter_set": "t_rock_floor", - "items": [ - { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, - { "item": "circuit", "count": [ 1, 6 ], "prob": 50 }, - { "item": "scrap", "count": [ 2, 5 ] }, - { "item": "steel_chunk", "count": [ 0, 3 ] }, - { "item": "sheet_metal", "count": [ 1, 3 ] }, - { "item": "cable", "charges": [ 1, 15 ] } - ] - } - }, { "type": "terrain", "id": "t_cvdbody", @@ -554,7 +414,7 @@ "description": "This is a VERY expensive-looking apparatus that's labeled 'Chemical Vapor Deposition Machine'. With the input of certain exceptionally rare chemicals and elements, one could conceivably coat one's weapon with diamond. While the process is extremely complicated, a previous user has helpfully sketched: Hydrogen + charcoal = smiley face.", "symbol": "&", "color": "cyan", - "looks_like": "t_console", + "looks_like": "f_console", "move_cost": 0, "coverage": 50, "flags": [ "TRANSPARENT", "NOITEM", "PERMEABLE" ], @@ -617,7 +477,7 @@ "symbol": "&", "description": "A small computer panel attached to a nanofabricator. It has a single slot for reading templates.", "color": "red", - "looks_like": "t_console", + "looks_like": "f_console", "move_cost": 0, "coverage": 50, "flags": [ "WALL", "NOITEM", "PERMEABLE" ], @@ -701,7 +561,7 @@ "type": "terrain", "id": "t_water_pump", "name": "water pump", - "looks_like": "t_machinery_heavy", + "looks_like": "f_machinery_heavy", "description": "Deep well collecting ground water. Installed water pump allows to draw water from it.", "symbol": "&", "color": "light_gray", @@ -748,46 +608,6 @@ }, "examine_action": "clean_water_source" }, - { - "type": "terrain", - "id": "t_plut_generator", - "name": "plutonium generator", - "description": "This imposing apparatus harnesses the power of the atom. Refined nuclear fuel is 'burned' to provide nearly limitless electrical power. It's not doing much good here though. Perhaps it could be salvaged for other purposes.", - "symbol": "0", - "color": "light_green", - "looks_like": "t_machinery_electronic", - "move_cost": 0, - "flags": [ "TRANSPARENT", "NOITEM", "SEALED", "REDUCE_SCENT", "PERMEABLE" ], - "bash": { - "str_min": 50, - "str_max": 400, - "explosive": 25, - "ter_set": "t_concrete", - "sound": "metal screeching!", - "sound_fail": "clang!", - "items": [ - { "item": "scrap", "count": [ 4, 16 ] }, - { "item": "steel_chunk", "count": [ 1, 6 ] }, - { "item": "plutonium", "charges": [ 0, 3 ] }, - { "item": "lead", "charges": [ 12, 18 ] } - ] - }, - "deconstruct": { - "ter_set": "t_concrete", - "items": [ - { "item": "RAM", "count": [ 4, 8 ] }, - { "item": "cable", "charges": [ 8, 16 ] }, - { "item": "small_lcd_screen", "count": [ 2, 4 ] }, - { "item": "large_lcd_screen", "count": 1 }, - { "item": "e_scrap", "count": [ 12, 24 ] }, - { "item": "circuit", "count": [ 6, 10 ] }, - { "item": "power_supply", "count": [ 4, 8 ] }, - { "item": "amplifier", "count": [ 3, 6 ] }, - { "item": "plutonium", "charges": [ 2, 8 ] }, - { "item": "scrap", "count": [ 8, 16 ] } - ] - } - }, { "type": "terrain", "id": "t_sai_box", @@ -795,7 +615,7 @@ "description": "A cabinet full of telecoms equipment. With the lines down, you might be able to take it apart for its useful electronics.", "symbol": "#", "color": "light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 90, "flags": [ "NOITEM", "WALL" ], @@ -861,7 +681,7 @@ "description": "A circuit breaker that uses oil in its arc suppression chamber.", "symbol": "B", "color": "light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 90, "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "WALL", "PERMEABLE" ], @@ -898,7 +718,7 @@ "description": "A small circuit breaker that uses oil in its arc suppression chamber.", "symbol": "b", "color": "light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 65, "flags": [ "TRANSPARENT", "FLAMMABLE", "NOITEM", "WALL", "PERMEABLE" ], @@ -935,7 +755,7 @@ "description": "A switchgear panel. It's covered in breaker switches, fuses, and gauges.", "symbol": "H", "color": "i_light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 90, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], @@ -974,7 +794,7 @@ "description": "A small switchgear panel. It's covered in breaker switches, fuses, and gauges.", "symbol": "L", "color": "i_light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 65, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], @@ -1017,7 +837,7 @@ "description": "A component designed to protect insulation and conductors in an electrical system by directing lightning through itself and into the ground.", "symbol": "}", "color": "i_light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], "bash": { @@ -1051,7 +871,7 @@ "description": "A switch used to make sure an electrical system doesn't have any current flowing through it, for maintenance periods.", "symbol": "h", "color": "light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], "bash": { @@ -1093,7 +913,7 @@ "description": "An electronic component used to transform the voltage of a current.", "symbol": "{", "color": "light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 50, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], @@ -1131,7 +951,7 @@ "description": "A specialized type of electrical transformer, ", "symbol": "8", "color": "i_light_gray", - "looks_like": "t_machinery_electronic", + "looks_like": "f_machinery_electronic", "move_cost": 0, "coverage": 50, "flags": [ "TRANSPARENT", "NOITEM", "WALL", "PERMEABLE" ], @@ -1191,203 +1011,6 @@ "items": [ { "item": "pipe", "count": [ 1, 3 ] }, { "item": "chain", "prob": 10 }, { "item": "scrap", "count": [ 1, 5 ] } ] } }, - { - "type": "terrain", - "id": "t_machinery_light", - "name": "light machinery", - "description": "Assorted light machinery. You could scavenge it for parts.", - "symbol": "$", - "color": "dark_gray", - "move_cost": 10, - "coverage": 65, - "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], - "deconstruct": { - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": [ 1, 3 ] }, - { "item": "pipe", "count": [ 1, 2 ] }, - { "item": "chain", "prob": 40 }, - { "item": "cu_pipe", "prob": 40 }, - { "item": "scrap", "count": [ 1, 4 ] }, - { "item": "hose", "count": 1 }, - { "item": "steel_chunk", "count": [ 1, 5 ] }, - { "item": "bearing", "charges": [ 4, 12 ] }, - { "item": "frame", "prob": 50 }, - { "item": "motor", "prob": 50 } - ] - }, - "bash": { - "str_min": 16, - "str_max": 80, - "sound": "clang!", - "sound_fail": "ting.", - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": 1 }, - { "item": "pipe", "count": 2, "prob": 40 }, - { "item": "chain", "prob": 20 }, - { "item": "cu_pipe", "prob": 10 }, - { "item": "scrap", "count": [ 3, 8 ] }, - { "item": "steel_chunk", "count": [ 1, 4 ] }, - { "item": "bearing", "charges": [ 2, 8 ] }, - { "item": "frame", "prob": 20 }, - { "item": "motor", "prob": 10 } - ] - } - }, - { - "type": "terrain", - "id": "t_machinery_heavy", - "name": "heavy machinery", - "description": "Assorted heavy machinery. You could scavenge it for parts.", - "symbol": "%", - "color": "light_gray", - "move_cost": 0, - "coverage": 75, - "flags": [ "BASHABLE", "CONTAINER", "SEALED", "PLACE_ITEM" ], - "deconstruct": { - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": [ 1, 3 ] }, - { "item": "pipe", "count": [ 1, 2 ] }, - { "item": "chain", "prob": 60 }, - { "item": "cu_pipe", "prob": 20 }, - { "item": "steel_lump", "count": [ 1, 2 ] }, - { "item": "hose", "count": 1 }, - { "item": "sheet_metal", "count": [ 1, 3 ] }, - { "item": "steel_chunk", "count": [ 1, 3 ] }, - { "item": "bearing", "charges": [ 4, 12 ] }, - { "item": "frame", "prob": 60 }, - { "item": "motor", "prob": 30 }, - { "item": "metal_tank", "prob": 30 }, - { "item": "motor_large", "prob": 10 } - ] - }, - "bash": { - "str_min": 18, - "str_max": 80, - "sound": "clang!", - "sound_fail": "ting.", - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": 1 }, - { "item": "pipe", "count": 1 }, - { "item": "chain", "prob": 20 }, - { "item": "steel_lump", "count": 1 }, - { "item": "scrap", "count": [ 1, 5 ] }, - { "item": "sheet_metal", "count": 2 }, - { "item": "steel_chunk", "count": [ 1, 2 ] }, - { "item": "bearing", "charges": [ 2, 8 ] }, - { "item": "frame", "prob": 30 }, - { "item": "motor", "prob": 10 }, - { "item": "metal_tank", "prob": 20 }, - { "item": "motor_large", "prob": 5 } - ] - } - }, - { - "type": "terrain", - "id": "t_machinery_old", - "name": "old machinery", - "description": "Assorted old machinery. You could scavenge it for parts.", - "symbol": "&", - "color": "brown", - "move_cost": 4, - "coverage": 55, - "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], - "deconstruct": { - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": 1 }, - { "item": "pipe", "count": [ 1, 2 ] }, - { "item": "chain", "prob": 40 }, - { "item": "cu_pipe", "prob": 60 }, - { "item": "scrap", "count": [ 1, 3 ] }, - { "item": "hose", "count": 1 }, - { "item": "steel_chunk", "count": [ 1, 3 ] }, - { "item": "bearing", "charges": [ 1, 5 ] }, - { "item": "frame", "prob": 30 }, - { "item": "motor", "prob": 30 }, - { "item": "splinter", "count": 3, "prob": 30 }, - { "item": "2x4", "count": [ 1, 4 ] }, - { "item": "nail", "charges": [ 3, 10 ] } - ] - }, - "bash": { - "str_min": 10, - "str_max": 80, - "sound": "clang!", - "sound_fail": "ting.", - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": 1 }, - { "item": "pipe", "count": [ 1, 2 ] }, - { "item": "chain", "prob": 20 }, - { "item": "cu_pipe", "prob": 10 }, - { "item": "scrap", "count": [ 1, 5 ] }, - { "item": "steel_chunk", "count": [ 1, 2 ] }, - { "item": "motor", "prob": 10 }, - { "item": "splinter", "count": [ 4, 8 ] }, - { "item": "2x4", "count": 2 }, - { "item": "nail", "charges": [ 2, 5 ] } - ] - } - }, - { - "type": "terrain", - "id": "t_machinery_electronic", - "name": "electronic machinery", - "description": "Assorted electronic machinery. You could scavenge it for parts.", - "symbol": "$", - "color": "yellow", - "move_cost": 8, - "coverage": 55, - "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "SEALED", "FLAMMABLE", "PLACE_ITEM" ], - "deconstruct": { - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "count": [ 1, 3 ] }, - { "item": "pipe", "count": [ 1, 2 ] }, - { "item": "steel_chunk", "count": [ 1, 4 ] }, - { "item": "bearing", "charges": [ 2, 6 ] }, - { "item": "motor", "prob": 40 }, - { "item": "processor", "count": 1 }, - { "item": "RAM", "count": [ 1, 4 ] }, - { "item": "cable", "charges": [ 1, 4 ] }, - { "item": "small_lcd_screen", "count": 1 }, - { "item": "e_scrap", "count": [ 5, 10 ] }, - { "item": "circuit", "count": [ 3, 8 ] }, - { "item": "power_supply", "count": [ 1, 3 ] }, - { "item": "amplifier", "count": [ 1, 3 ] }, - { "item": "plastic_chunk", "count": [ 2, 8 ] }, - { "item": "scrap", "count": [ 1, 5 ] } - ] - }, - "bash": { - "str_min": 10, - "str_max": 80, - "sound": "clang!", - "sound_fail": "ting.", - "ter_set": "t_rock_floor", - "items": [ - { "item": "wire", "prob": 40 }, - { "item": "pipe", "prob": 40 }, - { "item": "steel_chunk", "prob": 40 }, - { "item": "bearing", "charges": [ 2, 4 ] }, - { "item": "motor", "prob": 10 }, - { "item": "processor", "prob": 40 }, - { "item": "RAM", "count": [ 1, 2 ] }, - { "item": "cable", "charges": [ 1, 2 ] }, - { "item": "small_lcd_screen", "prob": 40 }, - { "item": "e_scrap", "count": [ 3, 8 ] }, - { "item": "circuit", "count": [ 1, 3 ] }, - { "item": "power_supply", "prob": 40 }, - { "item": "amplifier", "prob": 40 }, - { "item": "plastic_chunk", "count": [ 2, 8 ] }, - { "item": "scrap", "count": [ 3, 8 ] } - ] - } - }, { "id": "t_milking_machine", "type": "terrain", diff --git a/data/json/furniture_and_terrain/terrain-mechanisms.json b/data/json/furniture_and_terrain/terrain-mechanisms.json index 8b8f350a6fc14..fee4d9657cf33 100644 --- a/data/json/furniture_and_terrain/terrain-mechanisms.json +++ b/data/json/furniture_and_terrain/terrain-mechanisms.json @@ -1,97 +1,4 @@ [ - { - "type": "terrain", - "id": "t_console_broken", - "name": "broken console", - "description": "This is a standalone computer terminal. It doesn't seem to be working. It's the broken screen and shattered circuit boards that's telling you that.", - "symbol": "6", - "color": "light_gray", - "move_cost": 0, - "coverage": 50, - "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], - "deconstruct": { - "ter_set": "t_floor", - "items": [ - { "item": "processor", "count": [ 1, 2 ] }, - { "item": "RAM", "count": [ 4, 8 ] }, - { "item": "cable", "charges": [ 4, 6 ] }, - { "item": "large_lcd_screen", "count": 1 }, - { "item": "e_scrap", "count": [ 10, 16 ] }, - { "item": "circuit", "count": [ 6, 10 ] }, - { "item": "power_supply", "count": [ 2, 4 ] }, - { "item": "amplifier", "count": [ 2, 4 ] }, - { "item": "plastic_chunk", "count": [ 10, 12 ] }, - { "item": "scrap", "count": [ 6, 8 ] } - ] - }, - "bash": { - "str_min": 16, - "str_max": 150, - "sound": "crunch!", - "sound_fail": "whack!", - "ter_set": "t_floor", - "items": [ - { "item": "processor", "prob": 25 }, - { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, - { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, - { "item": "large_lcd_screen", "prob": 25 }, - { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, - { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, - { "item": "power_supply", "prob": 25 }, - { "item": "amplifier", "prob": 25 }, - { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, - { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } - ] - } - }, - { - "type": "terrain", - "id": "t_console", - "name": "computer console", - "description": "This is a standalone computer terminal. It can be used to view contents and perform any allowed functions. It might even be possible to hack it, given the skills.", - "symbol": "6", - "color": "blue", - "move_cost": 0, - "coverage": 50, - "light_emitted": 10, - "roof": "t_flat_roof", - "flags": [ "TRANSPARENT", "CONSOLE", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], - "deconstruct": { - "ter_set": "t_floor", - "items": [ - { "item": "processor", "count": [ 1, 2 ] }, - { "item": "RAM", "count": [ 4, 8 ] }, - { "item": "cable", "charges": [ 4, 6 ] }, - { "item": "large_lcd_screen", "count": 1 }, - { "item": "e_scrap", "count": [ 10, 16 ] }, - { "item": "circuit", "count": [ 6, 10 ] }, - { "item": "power_supply", "count": [ 2, 4 ] }, - { "item": "amplifier", "count": [ 2, 4 ] }, - { "item": "plastic_chunk", "count": [ 10, 12 ] }, - { "item": "scrap", "count": [ 6, 8 ] } - ] - }, - "bash": { - "str_min": 8, - "str_max": 150, - "sound": "crunch!", - "sound_fail": "whack!", - "ter_set": "t_console_broken", - "items": [ - { "item": "processor", "prob": 25 }, - { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, - { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, - { "item": "large_lcd_screen", "prob": 25 }, - { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, - { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, - { "item": "power_supply", "prob": 25 }, - { "item": "amplifier", "prob": 25 }, - { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, - { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } - ] - } - }, { "type": "terrain", "id": "t_gates_mech_control", diff --git a/data/json/furniture_and_terrain/terrain-walls.json b/data/json/furniture_and_terrain/terrain-walls.json index 78806eabccd06..85b99df7262e5 100644 --- a/data/json/furniture_and_terrain/terrain-walls.json +++ b/data/json/furniture_and_terrain/terrain-walls.json @@ -39,6 +39,7 @@ "type": "terrain", "id": "t_wall_half", "name": "half-built wall", + "looks_like": "t_wall", "description": "An incomplete wall of refined wood, dotted with carefully placed nails to provide proper support. It requires some more two by fours and nails before it'd be considered a suitable wall.", "symbol": "#", "color": "light_red", @@ -98,6 +99,7 @@ "type": "terrain", "id": "t_wall_r", "alias": [ "t_wall_h_r", "t_wall_v_r" ], + "looks_like": "t_wall", "name": "red wall", "description": "Wall painted red.", "symbol": "LINE_OXOX", @@ -119,6 +121,7 @@ "type": "terrain", "id": "t_wall_w", "alias": [ "t_wall_h_w", "t_wall_v_w" ], + "looks_like": "t_wall", "name": "white wall", "description": "Wall painted white.", "symbol": "LINE_OXOX", @@ -140,6 +143,7 @@ "type": "terrain", "id": "t_wall_b", "alias": [ "t_wall_h_b", "t_wall_v_b" ], + "looks_like": "t_wall", "name": "blue wall", "description": "Wall painted blue.", "symbol": "LINE_OXOX", @@ -161,6 +165,7 @@ "type": "terrain", "id": "t_wall_g", "alias": [ "t_wall_h_g", "t_wall_v_g" ], + "looks_like": "t_wall", "name": "green wall", "description": "Wall painted green.", "symbol": "LINE_OXOX", @@ -182,6 +187,7 @@ "type": "terrain", "id": "t_wall_y", "alias": [ "t_wall_h_y", "t_wall_v_y" ], + "looks_like": "t_wall", "name": "yellow wall", "description": "Wall painted yellow.", "symbol": "LINE_OXOX", @@ -203,6 +209,7 @@ "type": "terrain", "id": "t_wall_P", "alias": [ "t_wall_h_P", "t_wall_v_P" ], + "looks_like": "t_wall", "name": "pink wall", "description": "Wall painted pink.", "symbol": "LINE_OXOX", @@ -223,6 +230,7 @@ "type": "terrain", "id": "t_wall_p", "alias": [ "t_wall_h_p", "t_wall_v_p" ], + "looks_like": "t_wall", "name": "purple wall", "description": "Wall painted purple.", "symbol": "LINE_OXOX", @@ -243,6 +251,7 @@ { "type": "terrain", "id": "t_brick_wall_halfway", + "looks_like": "t_brick_wall", "name": "half-built brick wall", "description": "Half of a brick wall, looks like it still requires some more resources and effort before being considered a real wall.", "symbol": "#", @@ -284,6 +293,7 @@ "type": "terrain", "id": "t_rock_wall", "name": "stone wall", + "looks_like": "t_rock", "description": "A sturdy stone wall.", "symbol": "LINE_OXOX", "color": "light_gray", @@ -304,6 +314,7 @@ { "type": "terrain", "id": "t_rock_wall_half", + "looks_like": "t_rock_wall", "name": "half-built stone wall", "description": "Half of a sturdy stone wall. Some work still needs to be done before this stone wall is complete.", "symbol": "#", @@ -325,6 +336,7 @@ "type": "terrain", "id": "t_rock_smooth", "name": "smoothed rock", + "looks_like": "t_rock", "description": "A block of stone that's been smoothed and shaped, commonly granite or marble for funerary chapels and mausoleums.", "symbol": "LINE_OXOX", "//": "use pillars, 't_column', as a compliment.", @@ -389,6 +401,7 @@ "id": "t_concrete_wall", "alias": [ "t_concrete_h", "t_concrete_v" ], "name": "concrete wall", + "looks_like": "t_rock", "description": "An aesthetically pleasing design with simple lines, this type of concrete was used with a weaker chemical mixture in order to have faster setting times. Not ideal for multi-story buildings, but still capable of supporting a roof.", "symbol": "LINE_OXOX", "color": "dark_gray", @@ -434,6 +447,7 @@ "type": "terrain", "id": "t_sconc_wall", "name": "simple concrete wall", + "looks_like": "t_concrete_wall", "description": "A durable and uniform concrete wall, quite drab without decoration. More than capable of supporting a roof, as well as keeping out most anything, save for vehicles.", "symbol": "LINE_OXOX", "color": "light_gray", @@ -455,6 +469,7 @@ "type": "terrain", "id": "t_sconc_wall_halfway", "name": "half-built simple concrete wall", + "looks_like": "t_sconc_wall", "description": "A partially poured concrete wall that could probably keep anything behind it quite safe if it were finished.", "symbol": "*", "color": "light_gray", @@ -475,6 +490,7 @@ "type": "terrain", "id": "t_strconc_wall", "name": "reinforced concrete wall", + "looks_like": "t_concrete_wall", "description": "An extremely resilient wall, filled with concrete and rebar. Best suited for supporting multi-level buildings, only serious explosives and high-speed impacts would be capable of damaging this wall.", "symbol": "LINE_OXOX", "color": "light_gray", @@ -496,6 +512,7 @@ "type": "terrain", "id": "t_strconc_wall_halfway", "name": "half-built reinforced concrete wall", + "looks_like": "t_sconc_wall_halfway", "description": "Poured concrete with methodically placed rebar sticking out, which isn't practical for supporting roofs or shelter. It appears to need more resources before being considered complete.", "symbol": "*", "color": "light_gray", @@ -535,6 +552,7 @@ "type": "terrain", "id": "t_scrap_wall", "name": "simple metal wall", + "looks_like": "t_metal_wall", "description": "A relatively simple wall made of scraped together metal. It's still capable of blocking intruders and supporting a roof with adjacent walls.", "symbol": "LINE_OXOX", "color": "dark_gray", @@ -556,6 +574,7 @@ "type": "terrain", "id": "t_scrap_wall_halfway", "name": "half-built simple metal wall", + "looks_like": "t_scrap_wall", "description": "A partially built makeshift wall of metal that could potentially support a roof if it were completed.", "symbol": "#", "color": "dark_gray", @@ -575,6 +594,7 @@ "type": "terrain", "id": "t_wall_wood", "name": "wooden wall", + "looks_like": "t_wall", "description": "A finished wall of planks and support beams, capable of supporting an upper level or roof. Still highly flammable.", "symbol": "LINE_OXOX", "color": "light_red", @@ -601,6 +621,7 @@ "type": "terrain", "id": "t_wall_wood_chipped", "name": "chipped wood wall", + "looks_like": "t_wall_wood", "description": "A wall of aligned two by fours that's starting to crack and break open. Some cut wood and a number of nails could patch this up quick.", "symbol": "LINE_OXOX", "color": "light_red", @@ -626,6 +647,7 @@ "type": "terrain", "id": "t_wall_wood_broken", "name": "broken wood wall", + "looks_like": "t_wall_wood_chipped", "description": "A number of planks are missing and the structure is beginning to sag and fall apart. It's going to need quite a bit of work to repair this wall.", "symbol": "&", "color": "light_red", @@ -650,6 +672,7 @@ "type": "terrain", "id": "t_wall_log_half", "name": "half-built log wall", + "looks_like": "t_wall_log", "description": "A half-constructed wall of notched logs that interlock to provide stability. Needs a few more logs to hold up a roof. Looks flammable.", "symbol": "#", "color": "brown", @@ -670,6 +693,7 @@ "type": "terrain", "id": "t_wall_log", "name": "log wall", + "looks_like": "t_wall_wood", "description": "A tall wall of timber suitable for housing and insulating from the weather. Quite flammable.", "symbol": "LINE_OXOX", "color": "brown", @@ -691,6 +715,7 @@ "type": "terrain", "id": "t_wall_log_chipped", "name": "chipped log wall", + "looks_like": "t_wall_log", "description": "A moderately damaged wall, could probably be patched up with some planks and nails.", "symbol": "LINE_OXOX", "color": "brown", @@ -711,6 +736,7 @@ "type": "terrain", "id": "t_wall_log_broken", "name": "broken log wall", + "looks_like": "t_wall_log_chipped", "description": "A destroyed wood wall, with only a supporting log left, ready to collapse. Looks repairable if the damage was replaced and patched together with nails and planks.", "symbol": "&", "color": "brown", @@ -729,6 +755,7 @@ "type": "terrain", "id": "t_palisade", "name": "palisade wall", + "looks_like": "t_wall_log", "description": "An age-old type of fortification consisting of hefty lumber staked into the ground and cabled together.", "symbol": "#", "color": "brown", @@ -748,6 +775,7 @@ "id": "t_wall_wattle", "type": "terrain", "name": "wattle-and-daub wall", + "looks_like": "t_wall_wood", "description": "A relatively primitive wall made by daubing together a lattice of wooden strips using some combination of wet soil, clay, sand, animal dung and straw.", "symbol": "LINE_OXOX", "color": "light_red", @@ -768,6 +796,7 @@ "id": "t_wall_wattle_broken", "type": "terrain", "name": "broken wattle-and-daub wall", + "looks_like": "t_wall_wattle", "description": "This wattle-and-daub wall section has been destroyed, leaving mostly just frame, and is barely held together.", "symbol": "&", "color": "light_red", @@ -786,6 +815,7 @@ "id": "t_wall_wattle_half", "type": "terrain", "name": "half-built wattle-and-daub wall", + "looks_like": "t_wall_wattle", "description": "This wattle-and-daub wall has some of the wooden strip lattice in place, and still requires the rest of the lattice and supporting wet compound to be filled in.", "symbol": "#", "color": "light_red", @@ -831,6 +861,7 @@ "type": "terrain", "id": "t_wall_rammed_earth", "name": "rammed earth wall", + "looks_like": "t_rock", "description": "A solid wall of compressed dirt, sturdy enough to support a roof with enough walls and keep out some unwanted visitors.", "symbol": "LINE_OXOX", "color": "brown", @@ -873,6 +904,7 @@ "id": "t_wall_glass", "alias": [ "t_wall_glass_h", "t_wall_glass_v" ], "name": "glass wall", + "looks_like": "t_window", "description": "A barrier made of glass, it's nothing complicated, and looks extremely fragile. Some contain glass break sensors or window sensors that trigger if the glass is tampered.", "symbol": "LINE_OXOX", "color": "light_cyan", @@ -986,6 +1018,7 @@ "type": "terrain", "id": "t_reinforced_glass_shutter", "name": "reinforced glass with closed shutters", + "looks_like": "t_wall_metal", "description": "A secondary layer of protection over reinforced glass, these metal shutters are typically used to ward off criminals or protect against damage from extreme weather. Looks like it can only be opened from the inside. Even with the installed shutters, it isn't feasible in supporting a roof.", "symbol": "LINE_OXOX", "color": "light_gray", @@ -1082,6 +1115,7 @@ "type": "terrain", "id": "t_root_wall", "name": "root wall", + "looks_like": "t_rock", "description": "A dirt wall covered with roots.", "symbol": "#", "color": "brown", @@ -1150,6 +1184,7 @@ "type": "terrain", "id": "t_rock_red", "name": "red stone", + "looks_like": "t_rock", "description": "A red stone.", "symbol": "#", "color": "red", @@ -1169,6 +1204,7 @@ "type": "terrain", "id": "t_rock_green", "name": "green stone", + "looks_like": "t_rock", "description": "A green stone.", "symbol": "#", "color": "green", @@ -1188,6 +1224,7 @@ "type": "terrain", "id": "t_rock_blue", "name": "blue stone", + "looks_like": "t_rock", "description": "A blue stone.", "symbol": "#", "color": "blue", @@ -1227,6 +1264,7 @@ "type": "terrain", "id": "t_column_halfway", "name": "half-built column", + "looks_like": "t_column", "description": "An empty wooden frame in the shape of a column, built around a concrete and rebar foundation. It isn't capable of supporting roofs or shelter, and appears to need more resources before being considered complete.", "symbol": "*", "color": "light_gray", @@ -1246,6 +1284,7 @@ "type": "terrain", "id": "t_column", "name": "column", + "looks_like": "t_rock_wall", "description": "A concrete column.", "symbol": "1", "color": "light_gray", @@ -1265,6 +1304,7 @@ "type": "terrain", "id": "t_support_l", "name": "large metal support", + "looks_like": "t_wall_metal", "description": "A heavy-duty metal support beam.", "symbol": "T", "color": "light_gray", @@ -1298,6 +1338,7 @@ "type": "terrain", "id": "t_support_s", "name": "small metal support", + "looks_like": "t_support_l", "description": "A metal support beam.", "symbol": "l", "color": "light_gray", @@ -1331,6 +1372,7 @@ "type": "terrain", "id": "t_drystone_wall", "name": "field stone wall", + "looks_like": "t_rock_wall", "description": "A sturdy dry stone wall. Just rocks fitted together without mortar.", "symbol": "LINE_OXOX", "color": "light_gray", @@ -1351,6 +1393,7 @@ { "type": "terrain", "id": "t_drystone_wall_half", + "looks_like": "t_rock_wall_half", "name": "field stone half-wall", "description": "A half height sturdy dry stone wall. Just rocks fitted together without mortar. Complete as is or with extensive work it could be doubled in height.", "symbol": "#", diff --git a/data/json/furniture_and_terrain/terrain-zlevel-transitions.json b/data/json/furniture_and_terrain/terrain-zlevel-transitions.json index eee796b62309c..e5898ac8f49eb 100644 --- a/data/json/furniture_and_terrain/terrain-zlevel-transitions.json +++ b/data/json/furniture_and_terrain/terrain-zlevel-transitions.json @@ -165,6 +165,86 @@ "move_cost": 2, "flags": [ "TRANSPARENT", "GOES_DOWN", "PLACE_ITEM", "DIFFICULT_Z" ] }, + { + "type": "terrain", + "id": "t_ramp_down_high", + "name": "road ramp down (high end)", + "description": "The upper end of an asphalt ramp leading down.", + "symbol": ">", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD", "Z_TRANSPARENT" ] + }, + { + "type": "terrain", + "id": "t_ramp_down_low", + "name": "road ramp down (low end)", + "description": "The lower end of an asphalt ramp leading down.", + "symbol": ">", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD", "RAMP_DOWN", "Z_TRANSPARENT" ] + }, + { + "type": "terrain", + "id": "t_ramp_up_high", + "name": "road ramp up (high end)", + "description": "The upper end of an asphalt ramp leading up.", + "symbol": "<", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "ROAD", "RAMP_UP" ] + }, + { + "type": "terrain", + "id": "t_ramp_up_low", + "name": "road ramp up (low end)", + "description": "The lower end of an asphalt ramp leading up.", + "symbol": "<", + "color": "dark_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD" ] + }, + { + "type": "terrain", + "id": "t_sidewalk_ramp_down_high", + "name": "sidewalk ramp down (high end)", + "description": "The upper end of a sidewalk ramp leading down.", + "symbol": ">", + "color": "light_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD", "Z_TRANSPARENT" ] + }, + { + "type": "terrain", + "id": "t_sidewalk_ramp_down_low", + "name": "sidewalk ramp down (low end)", + "description": "The lower end of a sidewalk ramp leading down.", + "symbol": ">", + "color": "light_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD", "RAMP_DOWN", "Z_TRANSPARENT" ] + }, + { + "type": "terrain", + "id": "t_sidewalk_ramp_up_high", + "name": "sidewalk ramp up (high end)", + "description": "The upper end of a sidewalk ramp leading up.", + "symbol": "<", + "color": "light_gray", + "move_cost": 2, + "flags": [ "ROAD", "RAMP_UP" ] + }, + { + "type": "terrain", + "id": "t_sidewalk_ramp_up_low", + "name": "sidewalk ramp up (low end)", + "description": "The lower end of a sidewalk ramp leading up.", + "symbol": "<", + "color": "light_gray", + "move_cost": 2, + "flags": [ "TRANSPARENT", "ROAD" ] + }, { "type": "terrain", "id": "t_slope_down", diff --git a/data/json/harvest.json b/data/json/harvest.json index ff13b39e5fea7..8f8260e570ff7 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -88,6 +88,39 @@ { "drop": "scrap", "base_num": [ 1, 5 ], "scale_num": [ 0.3, 0.7 ], "max": 12, "type": "bone" } ] }, + { + "id": "mon_zomborg", + "type": "harvest", + "message": "You search for any salvageable hardware in what's left of this flesh and metal monster", + "entries": [ + { + "drop": "bio_power_storage", + "type": "bionic", + "flags": [ "FILTHY", "NO_STERILE", "NO_PACKED" ], + "faults": [ "fault_bionic_salvaged" ] + }, + { + "drop": "bionics_common", + "type": "bionic_group", + "flags": [ "FILTHY", "NO_STERILE", "NO_PACKED" ], + "faults": [ "fault_bionic_salvaged" ] + }, + { + "drop": "bionics", + "type": "bionic_group", + "flags": [ "FILTHY", "NO_STERILE", "NO_PACKED" ], + "faults": [ "fault_bionic_salvaged" ], + "base_num": [ 0, 1 ] + }, + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.04 }, + { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.05 }, + { "drop": "sinew", "type": "bone", "mass_ratio": 0.001 }, + { "drop": "cable", "base_num": [ 1, 3 ], "scale_num": [ 0.2, 0.6 ], "max": 8, "type": "flesh" }, + { "drop": "e_scrap", "base_num": [ 1, 5 ], "scale_num": [ 0.3, 0.7 ], "max": 12, "type": "bone" }, + { "drop": "scrap", "base_num": [ 1, 5 ], "scale_num": [ 0.3, 0.7 ], "max": 12, "type": "bone" } + ] + }, { "id": "mammal_tiny", "//": "animals so tiny they don't drop chunks of meat", diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 676f98f7f623d..9f9e62a47d45c 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -894,11 +894,6 @@ "id": "THORAZINE", "name": { "str": "Take" } }, - { - "type": "item_action", - "id": "THROWABLE_EXTINGUISHER_ACT", - "name": { "str": "Extinguish a fire" } - }, { "type": "item_action", "id": "TOWEL", diff --git a/data/json/itemgroups/Clothing_Gear/hazmat_gear.json b/data/json/itemgroups/Clothing_Gear/hazmat_gear.json new file mode 100644 index 0000000000000..19774d32b373c --- /dev/null +++ b/data/json/itemgroups/Clothing_Gear/hazmat_gear.json @@ -0,0 +1,16 @@ +[ + { + "id": "decontamination_room", + "type": "item_group", + "subtype": "collection", + "entries": [ + { "item": "hazmat_suit", "prob": 60 }, + { "item": "mask_gas", "prob": 60 }, + { "item": "gasfilter_m", "prob": 60 }, + { "item": "rad_monitor", "prob": 33 }, + { "item": "iodine", "prob": 33 }, + { "item": "1st_aid", "prob": 15 }, + { "item": "geiger_off", "prob": 15 } + ] + } +] diff --git a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json index dc36a2b0cb48f..32ca1ed8875bd 100644 --- a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json +++ b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json @@ -12,7 +12,8 @@ "items": [ [ "1st_aid", 5 ], [ "aspirin", 50 ], - [ "bandages", 50 ], + [ "bandages", 30 ], + [ "adhesive_bandages", 30 ], [ "cotton_ball", 40 ], [ "disinfectant", 30 ], [ "eyedrops", 10 ], @@ -27,7 +28,7 @@ "id": "drugs_emergency", "type": "item_group", "//": "Medical consumables for emergency use excluduing painkillers", - "items": [ [ "adrenaline_injector", 50 ], [ "inhaler", 100 ], [ "quikclot", 50 ], [ "smoxygen_tank", 70 ] ] + "items": [ [ "adrenaline_injector", 50 ], [ "inhaler", 100 ], [ "quikclot", 50 ], [ "smoxygen_tank", 70 ], [ "ifak", 40 ] ] }, { "id": "drugs_misc", @@ -71,7 +72,7 @@ "subtype": "distribution", "//": "Healing items appropriate for soldiers and other paramilitary forces", "entries": [ - { "item": "1st_aid", "prob": 50 }, + { "item": "ifak", "prob": 50 }, { "item": "antibiotics", "prob": 20 }, { "item": "bandages", "prob": 100 }, { "item": "morphine", "prob": 20 }, @@ -97,7 +98,8 @@ "type": "item_group", "id": "softdrugs", "items": [ - [ "bandages", 50 ], + [ "bandages", 30 ], + [ "adhesive_bandages", 30 ], [ "cotton_ball", 50 ], [ "1st_aid", 35 ], [ "saline", 25 ], diff --git a/data/json/itemgroups/Food/food.json b/data/json/itemgroups/Food/food.json index 619ad523ac49a..1fa80744b6da6 100644 --- a/data/json/itemgroups/Food/food.json +++ b/data/json/itemgroups/Food/food.json @@ -52,8 +52,10 @@ "subtype": "distribution", "entries": [ { "item": "birdfood", "prob": 10 }, - { "item": "dogfood", "prob": 45, "container-item": "can_medium" }, - { "item": "catfood", "prob": 45, "container-item": "can_food" } + { "item": "dogfood", "prob": 30, "container-item": "can_medium" }, + { "item": "catfood", "prob": 30, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 10, "charges": 12, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 10, "charges": 12, "container-item": "bag_plastic" } ] }, { diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index 917cdc8435894..2b9d4821172fe 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -168,7 +168,8 @@ [ "iodine", 5 ], [ "prussian_blue", 5 ], { "item": "bleach", "prob": 20, "charges-min": 10 }, - [ "bandages", 50 ], + [ "bandages", 30 ], + [ "adhesive_bandages", 30 ], [ "cotton_ball", 50 ], [ "syringe", 8 ], [ "adrenaline_injector", 5 ], @@ -285,7 +286,8 @@ "entries": [ { "item": "aspirin", "prob": 50 }, { "item": "1st_aid", "prob": 40 }, - { "item": "bandages", "prob": 30 }, + { "item": "bandages", "prob": 15 }, + { "item": "adhesive_bandages", "prob": 15 }, { "item": "duct_tape", "prob": 20 }, { "item": "sewing_kit", "prob": 10 }, { "item": "mouthpiece", "prob": 10 }, @@ -1108,7 +1110,8 @@ "type": "item_group", "id": "methlab", "items": [ - [ "bandages", 50 ], + [ "bandages", 25 ], + [ "adhesive_bandages", 25 ], [ "cotton_ball", 50 ], [ "pan", 60 ], [ "coke", 10 ], @@ -2153,8 +2156,10 @@ [ "coffee_raw", 15 ], [ "cheese_hard", 5 ], [ "bandages", 50 ], + [ "adhesive_bandages", 50 ], [ "cotton_ball", 50 ], [ "1st_aid", 35 ], + [ "ifak", 35 ], [ "survival_kit", 35 ], [ "premium_survival_kit", 8 ], [ "saline", 10 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index 634fc8280163a..978634fba5b7b 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -1197,8 +1197,10 @@ "id": "petstore_misc", "type": "item_group", "items": [ - { "item": "dogfood", "prob": 35, "container-item": "can_medium" }, - { "item": "catfood", "prob": 35, "container-item": "can_food" }, + { "item": "dogfood", "prob": 20, "container-item": "can_medium" }, + { "item": "catfood", "prob": 20, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 5, "charges": 24, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 5, "charges": 24, "container-item": "bag_plastic" }, [ "birdfood", 15 ], [ "dog_whistle", 15 ], [ "flashlight", 5 ] @@ -1208,8 +1210,10 @@ "id": "petstore_shelves", "type": "item_group", "items": [ - { "item": "dogfood", "prob": 30, "container-item": "can_medium" }, - { "item": "catfood", "prob": 30, "container-item": "can_food" }, + { "item": "dogfood", "prob": 10, "container-item": "can_medium" }, + { "item": "catfood", "prob": 10, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 10, "charges": 24, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 10, "charges": 24, "container-item": "bag_plastic" }, [ "birdfood", 15 ], [ "can_tuna", 15 ], [ "can_chicken", 15 ], @@ -1707,7 +1711,8 @@ "//": "for veterinarian", "type": "item_group", "items": [ - [ "bandages", 50 ], + [ "bandages", 30 ], + [ "adhesive_bandages", 30 ], [ "1st_aid", 10 ], [ "saline", 20 ], [ "vitamins", 15 ], @@ -1748,8 +1753,8 @@ [ "dog_whistle", 10 ], [ "pet_carrier", 30 ], [ "petpack", 3 ], - { "item": "dogfood", "prob": 30, "container-item": "can_medium" }, - { "item": "catfood", "prob": 30, "container-item": "can_food" }, + { "item": "dogfood", "prob": 20, "container-item": "can_medium" }, + { "item": "catfood", "prob": 20, "container-item": "can_food" }, [ "birdfood", 10 ], [ "towel", 20 ], [ "soap", 10 ], @@ -1821,7 +1826,7 @@ [ "shorts", 30 ], [ "coke", 3 ], [ "longshirt", 30 ], - [ "bandages", 10 ], + [ "adhesive_bandages", 10 ], [ "heatpack", 10 ], [ "gum", 12 ], [ "soap", 10 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations_mapextras.json b/data/json/itemgroups/Locations_MapExtras/locations_mapextras.json index 659b5e9373e3f..0409096ce32a2 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_mapextras.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_mapextras.json @@ -17,7 +17,8 @@ [ "bum_wine", 10 ], [ "chem_ethanol", 12 ], { "group": "salty_snacks", "prob": 135 }, - [ "bandages", 50 ], + [ "bandages", 25 ], + [ "adhesive_bandages", 25 ], [ "cotton_ball", 50 ], [ "caffeine", 25 ], [ "oxycodone", 7 ], diff --git a/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json b/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json index 6edd1a04cdf29..2d66d35efe772 100644 --- a/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json +++ b/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json @@ -68,8 +68,9 @@ "id": "vitamin_shop", "type": "item_group", "items": [ - [ "bandages", 25 ], - [ "1st_aid", 20 ], + [ "adhesive_bandages", 25 ], + [ "1st_aid", 15 ], + [ "ifak", 15 ], [ "vitamins", 75 ], [ "calcium_tablet", 75 ], [ "aspirin", 45 ], diff --git a/data/json/itemgroups/Locations_MapExtras/mansion.json b/data/json/itemgroups/Locations_MapExtras/mansion.json index a19a757a66a30..ce1f3ebd42f00 100644 --- a/data/json/itemgroups/Locations_MapExtras/mansion.json +++ b/data/json/itemgroups/Locations_MapExtras/mansion.json @@ -690,7 +690,7 @@ "id": "bath_linens", "type": "item_group", "subtype": "distribution", - "items": [ [ "sheet", 40 ], [ "towel", 30 ], [ "rag", 20 ], [ "bandages", 10 ] ] + "items": [ [ "sheet", 40 ], [ "towel", 30 ], [ "rag", 20 ], [ "bandages", 5 ], [ "adhesive_bandages", 5 ] ] }, { "id": "creepy", @@ -1024,7 +1024,8 @@ [ "towel", 20 ], [ "protein_shake", 8 ], [ "coke", 3 ], - [ "bandages", 10 ], + [ "bandages", 5 ], + [ "adhesive_bandages", 5 ], [ "heatpack", 10 ], [ "gum", 12 ], [ "yoghurt", 12 ], @@ -1103,7 +1104,8 @@ [ "hoodie", 50 ], [ "shorts", 60 ], [ "longshirt", 60 ], - [ "bandages", 10 ], + [ "bandages", 5 ], + [ "adhesive_bandages", 5 ], [ "heatpack", 10 ], [ "gum", 12 ], [ "soap", 10 ], diff --git a/data/json/itemgroups/SUS/domestic.json b/data/json/itemgroups/SUS/domestic.json index d2827d3f4bca7..7ff493f5b08e4 100644 --- a/data/json/itemgroups/SUS/domestic.json +++ b/data/json/itemgroups/SUS/domestic.json @@ -740,7 +740,12 @@ "prob": 75 }, { - "distribution": [ { "item": "bandages", "prob": 60 }, { "item": "medical_gauze", "prob": 20 }, { "item": "1st_aid", "prob": 10 } ], + "distribution": [ + { "item": "adhesive_bandages", "prob": 40 }, + { "item": "bandages", "prob": 20 }, + { "item": "medical_gauze", "prob": 20 }, + { "item": "1st_aid", "prob": 10 } + ], "prob": 20 }, { "item": "disinfectant", "prob": 40, "charges-min": 1 }, diff --git a/data/json/itemgroups/activities_hobbies.json b/data/json/itemgroups/activities_hobbies.json index 6dc8b256c884e..442258abe872b 100644 --- a/data/json/itemgroups/activities_hobbies.json +++ b/data/json/itemgroups/activities_hobbies.json @@ -3,7 +3,8 @@ "type": "item_group", "id": "sports", "items": [ - [ "bandages", 50 ], + [ "bandages", 25 ], + [ "adhesive_bandages", 25 ], [ "cotton_ball", 50 ], [ "aspirin", 85 ], [ "bat", 60 ], diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index 8909d0d2636b1..2427251a264ee 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -421,8 +421,10 @@ { "item": "atomic_lamp", "prob": 1 }, { "item": "dog_whistle", "prob": 5 }, { "item": "pet_carrier", "prob": 2 }, - { "item": "dogfood", "prob": 10, "container-item": "can_medium" }, - { "item": "catfood", "prob": 10, "container-item": "can_food" }, + { "item": "dogfood", "prob": 5, "container-item": "can_medium" }, + { "item": "catfood", "prob": 5, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 2, "charges": 8, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 2, "charges": 8, "container-item": "bag_plastic" }, { "item": "nic_gum", "prob": 2 }, { "item": "oxygen_tank", "prob": 2 }, { "item": "smoxygen_tank", "prob": 1 }, @@ -587,8 +589,10 @@ { "item": "atomic_lamp", "prob": 1 }, { "item": "smart_lamp", "prob": 2 }, { "item": "dog_whistle", "prob": 5 }, - { "item": "dogfood", "prob": 20, "container-item": "can_medium" }, - { "item": "catfood", "prob": 20, "container-item": "can_food" }, + { "item": "dogfood", "prob": 10, "container-item": "can_medium" }, + { "item": "catfood", "prob": 10, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 5, "charges": 12, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 5, "charges": 12, "container-item": "bag_plastic" }, { "item": "charcoal", "prob": 5 }, { "item": "soap", "prob": 70 }, { "item": "detergent", "prob": 50 }, diff --git a/data/json/itemgroups/collections_trades.json b/data/json/itemgroups/collections_trades.json index 21177d5ca82ea..7d22a84ea5575 100644 --- a/data/json/itemgroups/collections_trades.json +++ b/data/json/itemgroups/collections_trades.json @@ -53,7 +53,8 @@ { "group": "plumbing_clothing", "prob": 100 }, { "group": "tools_plumbing", "prob": 100 }, { "group": "supplies_plumbing", "prob": 50 }, - [ "survnote", 1 ] + [ "survnote", 1 ], + [ "pipe_fittings", 70 ] ] }, { diff --git a/data/json/itemgroups/military.json b/data/json/itemgroups/military.json index 6448782a295fe..2569db5a1b919 100644 --- a/data/json/itemgroups/military.json +++ b/data/json/itemgroups/military.json @@ -80,7 +80,7 @@ "id": "infantry_medical_gear", "subtype": "collection", "entries": [ - { "item": "1st_aid", "prob": 90 }, + { "item": "ifak", "prob": 90 }, { "item": "quikclot", "prob": 60 }, { "collection": [ { "item": "morphine" }, { "item": "syringe" } ], "prob": 30 } ] @@ -118,7 +118,8 @@ { "item": "water_clean", "prob": 90 }, { "item": "knuckle_brass", "prob": 15 }, { "item": "battery_ups", "prob": 10 }, - { "item": "bandages", "prob": 50 }, + { "item": "bandages", "prob": 30 }, + { "item": "adhesive_bandages", "prob": 20 }, { "item": "cotton_ball", "prob": 20 }, { "item": "iodine", "prob": 5 }, { "item": "prussian_blue", "prob": 5 }, @@ -296,6 +297,7 @@ { "item": "radio", "prob": 10, "charges-min": 10, "charges-max": 95 }, { "item": "boots_combat", "prob": 50 }, { "item": "bandages", "prob": 10, "charges-min": 1, "charges-max": 3 }, + { "item": "adhesive_bandages", "prob": 10, "charges-min": 1, "charges-max": 6 }, { "item": "cig", "prob": 60, "charges-min": 1, "charges-max": 20 }, { "item": "knife_combat", "prob": 30 }, { "item": "pockknife", "prob": 30 }, @@ -453,7 +455,7 @@ { "item": "neccowafers", "prob": 30 }, { "item": "can_beans", "prob": 40 }, { "item": "pork_beans", "prob": 40 }, - { "item": "1st_aid", "prob": 35 }, + { "item": "ifak", "prob": 35 }, { "item": "saline", "prob": 10 }, { "item": "con_milk", "prob": 10 }, { "item": "milk_UHT", "prob": 25 }, diff --git a/data/json/itemgroups/misc.json b/data/json/itemgroups/misc.json index 5254385ac1db4..c8f4b665db50c 100644 --- a/data/json/itemgroups/misc.json +++ b/data/json/itemgroups/misc.json @@ -133,7 +133,7 @@ { "item": "lighter", "charges": 100 }, { "item": "pockknife" }, { "item": "multitool" }, - { "item": "1st_aid" }, + { "item": "ifak" }, { "item": "rollmat" }, { "item": "sleeping_bag_roll" }, { "item": "ear_plugs" }, diff --git a/data/json/itemgroups/science_and_tech.json b/data/json/itemgroups/science_and_tech.json index 045a071109350..3b7b925a68b33 100644 --- a/data/json/itemgroups/science_and_tech.json +++ b/data/json/itemgroups/science_and_tech.json @@ -413,6 +413,7 @@ [ "prussian_blue", 5 ], [ "autoclave", 5 ], [ "bandages", 50 ], + [ "adhesive_bandages", 20 ], [ "cotton_ball", 50 ], [ "scalpel", 48 ], [ "syringe", 8 ], diff --git a/data/json/itemgroups/supplies.json b/data/json/itemgroups/supplies.json index 83d80333665f1..dfe3f5507caed 100644 --- a/data/json/itemgroups/supplies.json +++ b/data/json/itemgroups/supplies.json @@ -529,5 +529,19 @@ { "item": "diesel", "charges": [ 0, 50000 ], "container-item": "30gal_drum", "prob": 10 }, { "item": "motor_oil", "charges": [ 0, 10000 ], "container-item": "jerrycan", "prob": 5 } ] + }, + { + "id": "avgas_barrel", + "type": "item_group", + "//": "barrel with aviation gas like you would find at a fuel depot for planes or helicopters", + "subtype": "distribution", + "entries": [ { "item": "avgas", "charges": [ 0, 50000 ], "container-item": "30gal_drum", "prob": 30 } ] + }, + { + "id": "jp8_barrel", + "type": "item_group", + "//": "barrel with aviation gas like you would find at a fuel depot for planes or helicopters", + "subtype": "distribution", + "entries": [ { "item": "jp8", "charges": [ 0, 50000 ], "container-item": "30gal_drum", "prob": 30 } ] } ] diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index 45f6ad2ea0a03..c26e2276baed8 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -29,6 +29,7 @@ "weight": "1 mg", "color": "white", "flags": [ "TRADER_AVOID" ], + "phase": "liquid", "ammo_type": "butane" }, { @@ -1127,6 +1128,23 @@ "phase": "gas", "ammo_type": "nitrox" }, + { + "type": "AMMO", + "id": "extinguishing_agent", + "category": "chems", + "price": 500, + "price_postapoc": 250, + "name": { "str_sp": "extinguishing agent" }, + "symbol": "%", + "color": "white", + "container": "bottle_plastic", + "description": "Dry chemical solution effective in extinguishing fires.", + "volume": "250 ml", + "weight": "1 g", + "phase": "gas", + "ammo_type": "extinguishing_agent", + "count": 10 + }, { "id": "tinder", "type": "AMMO", diff --git a/data/json/items/ammo/10mm.json b/data/json/items/ammo/10mm.json index 0ed5e796e9cfe..4aea51b6f297b 100644 --- a/data/json/items/ammo/10mm.json +++ b/data/json/items/ammo/10mm.json @@ -5,7 +5,7 @@ "name": { "str": "10mm Auto FMJ" }, "description": "A jacketed 10mm Auto round. The 10mm Auto cartridge is a rather powerful handgun round and the progenitor to the more popular .40 S&W.", "weight": "9 g", - "volume": "250 ml", + "volume": "117 ml", "price": 400, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/20x66mm.json b/data/json/items/ammo/20x66mm.json index 3618f33b38f80..c46761a6132d1 100644 --- a/data/json/items/ammo/20x66mm.json +++ b/data/json/items/ammo/20x66mm.json @@ -117,7 +117,7 @@ "//": "2.5x the Generic Rate of $1/shot", "description": "20x66mm caseless shotgun rounds, buckshot type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", "weight": "56 g", - "volume": "250 ml", + "volume": "415 ml", "price": 1500, "price_postapoc": 4000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/22.json b/data/json/items/ammo/22.json index fcbcda4300296..b0eb8be83634c 100644 --- a/data/json/items/ammo/22.json +++ b/data/json/items/ammo/22.json @@ -28,7 +28,7 @@ "name": { "str": ".22 LR" }, "description": ".22 Long Rifle ammunition with 40gr unjacketed bullets. The .22LR round is extremely weak with very low stopping power, short range, and negligible recoil. It is most useful for rifle training, and hunting small animals.", "weight": "3 g", - "volume": "250 ml", + "volume": "65 ml", "price": 150, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/223.json b/data/json/items/ammo/223.json index 0920cde8c0d42..34f66b290c308 100644 --- a/data/json/items/ammo/223.json +++ b/data/json/items/ammo/223.json @@ -5,7 +5,7 @@ "name": { "str": ".223 Remington" }, "description": ".223 Remington ammunition with 36gr JHP bullets. The .223 round has been very popular with civilian shooters for almost a century, finding use in a wide variety of weapons. It generates lower pressure than 5.56 NATO leading to slightly decreased accuracy and recoil.", "weight": "12 g", - "volume": "250 ml", + "volume": "194 ml", "price": 280, "price_postapoc": 900, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/270win.json b/data/json/items/ammo/270win.json index d9812da22a13a..c433098d960f5 100644 --- a/data/json/items/ammo/270win.json +++ b/data/json/items/ammo/270win.json @@ -5,7 +5,7 @@ "name": { "str": ".270 Winchester JSP" }, "description": ".270 Winchester ammunition with 130gr soft point bullets. The .270 round was not initially successful, but over a few decades it became one of the most popular rifle cartridges for hunting and silhouette shooting. It is a powerful round capable of taking down large targets with ease.", "weight": "20 g", - "volume": "250 ml", + "volume": "189 ml", "price": 170, "price_postapoc": 600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/300.json b/data/json/items/ammo/300.json index d0a05c6f90e9f..0e5455cbffbc7 100644 --- a/data/json/items/ammo/300.json +++ b/data/json/items/ammo/300.json @@ -5,7 +5,7 @@ "name": { "str": ".300 Winchester Magnum" }, "description": ".300 Winchester Magnum rounds with 220gr JHP bullets. The 300WM round is an extremely powerful and accurate rifle round introduced in 1963. It has proven popular with hunters and snipers, although it is not as common as .308 or .30-06.", "weight": "28 g", - "volume": "250 ml", + "volume": "169 ml", "price": 220, "price_postapoc": 400, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/3006.json b/data/json/items/ammo/3006.json index d4fd0091d45a9..eda24b798537f 100644 --- a/data/json/items/ammo/3006.json +++ b/data/json/items/ammo/3006.json @@ -5,7 +5,7 @@ "name": { "str": ".30-06 Springfield" }, "description": ".30-06 Springfield rounds with 165gr soft point bullets. The .30-06 cartridge has excellent accuracy, range, and stopping power making it popular with hunters and snipers for well over a century.", "weight": "20 g", - "volume": "250 ml", + "volume": "192 ml", "price": 160, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/300blk.json b/data/json/items/ammo/300blk.json index 1d1f2407bdbb1..171c1d3d5095b 100644 --- a/data/json/items/ammo/300blk.json +++ b/data/json/items/ammo/300blk.json @@ -5,7 +5,7 @@ "name": { "str": ".300 AAC Blackout" }, "description": "A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an intermediate cartridge necked up from 5.56x45mm, designed to achieve similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower receivers and will feed from STANAG magazines.", "weight": "18 g", - "volume": "250 ml", + "volume": "194 ml", "price": 290, "price_postapoc": 1500, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/308.json b/data/json/items/ammo/308.json index 3691c8269a384..0924126081723 100644 --- a/data/json/items/ammo/308.json +++ b/data/json/items/ammo/308.json @@ -5,7 +5,7 @@ "name": { "str": ".308 Winchester" }, "description": ".308 Winchester ammunition with 168gr hollow point bullets. The .308 round is one of the most popular hunting cartridges in the world due to its accuracy and power.", "weight": "18 g", - "volume": "250 ml", + "volume": "158 ml", "price": 180, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/32.json b/data/json/items/ammo/32.json index df6067a0cadbe..0d153ce5795ba 100644 --- a/data/json/items/ammo/32.json +++ b/data/json/items/ammo/32.json @@ -5,7 +5,7 @@ "name": { "str": ".32 ACP" }, "description": "The .32 ACP was a popular handgun cartridge in the 20th century. Not so powerful as the .38 or the 9x19mm though.", "weight": "5 g", - "volume": "250 ml", + "volume": "116 ml", "price": 160, "price_postapoc": 1600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/357mag.json b/data/json/items/ammo/357mag.json index 74bfec49915a6..74218a588890e 100644 --- a/data/json/items/ammo/357mag.json +++ b/data/json/items/ammo/357mag.json @@ -5,7 +5,7 @@ "name": { "str": ".357 magnum FMJ" }, "description": "Jacketed .357 magnum ammunition. The .357 magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", "weight": "8 g", - "volume": "250 ml", + "volume": "145 ml", "price": 140, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/357sig.json b/data/json/items/ammo/357sig.json index 095acfc0f7d9d..e1b15fc0fc059 100644 --- a/data/json/items/ammo/357sig.json +++ b/data/json/items/ammo/357sig.json @@ -5,7 +5,7 @@ "name": { "str": ".357 SIG FMJ" }, "description": "Jacketed .357 SIG ammunition. The .357 SIG round is a high velocity pistol cartridge, giving it a flatter trajectory than many handgun rounds.", "weight": "8 g", - "volume": "250 ml", + "volume": "132 ml", "price": 370, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/36paper.json b/data/json/items/ammo/36paper.json index 407aa0d1e7fc3..d94448307ca25 100644 --- a/data/json/items/ammo/36paper.json +++ b/data/json/items/ammo/36paper.json @@ -5,7 +5,7 @@ "name": { "str": ".36 paper cartridge" }, "description": "A paper cartridge containing a premeasured amount of black powder and a .36 projectile. Used by the Colt M1861 Navy.", "weight": "6 g", - "volume": "250 ml", + "volume": "11 ml", "price": 400, "price_postapoc": 1000, "material": [ "paper", "powder", "lead" ], diff --git a/data/json/items/ammo/38.json b/data/json/items/ammo/38.json index 336f65bbafd6b..44adc85c0a9f1 100644 --- a/data/json/items/ammo/38.json +++ b/data/json/items/ammo/38.json @@ -13,7 +13,7 @@ "name": { "str": ".38 Special" }, "description": ".38 Special ammunition with 130gr FMJ bullets. The .38 Special round was extremely common among US police forces during the 20th century.", "weight": "8 g", - "volume": "250 ml", + "volume": "113 ml", "price": 210, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/380.json b/data/json/items/ammo/380.json index d7956141ecba3..333d1eb1db35b 100644 --- a/data/json/items/ammo/380.json +++ b/data/json/items/ammo/380.json @@ -5,7 +5,7 @@ "name": { "str": ".380 ACP FMJ" }, "description": ".380 ACP ammunition with a brass jacketed 95gr bullet. Popular in pocket pistols for over a century, it is often considered the weakest caliber to consider carrying. One should be careful not to chamber it in 9x18mm Makarov or 9x19mm firearms.", "weight": "6 g", - "volume": "250 ml", + "volume": "89 ml", "price": 140, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/38super.json b/data/json/items/ammo/38super.json index f11b34e732653..8ac784d86148c 100644 --- a/data/json/items/ammo/38super.json +++ b/data/json/items/ammo/38super.json @@ -5,7 +5,7 @@ "name": { "str": ".38 Super FMJ" }, "description": ".38 Super ammunition with 147gr FMJ bullets. The .38 Super round was developed from .38 ACP in the 1920s, designed to penetrate the body armor of the era.", "weight": "8 g", - "volume": "250 ml", + "volume": "97 ml", "price": 210, "price_postapoc": 1200, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/40.json b/data/json/items/ammo/40.json index 8b8f0fcc914d1..540c66ecbbd15 100644 --- a/data/json/items/ammo/40.json +++ b/data/json/items/ammo/40.json @@ -13,7 +13,7 @@ "name": { "str": ".40 S&W JHP" }, "description": ".40 S&W ammunition with 135gr JHP bullets. The .40 S&W round is a descended from the 10mm Auto cartridge and maintains most of its predecessor's strengths while reducing recoil.", "weight": "9 g", - "volume": "250 ml", + "volume": "106 ml", "price": 220, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/410shot.json b/data/json/items/ammo/410shot.json index 757b9b403a3ef..f671fa68ef1bf 100644 --- a/data/json/items/ammo/410shot.json +++ b/data/json/items/ammo/410shot.json @@ -5,7 +5,7 @@ "name": { "str": ".410 000 shot" }, "description": "A .410 shell with 5 000 pellets. Good for a hunting or combat load.", "weight": "16 g", - "volume": "250 ml", + "volume": "170 ml", "price": 175, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/44.json b/data/json/items/ammo/44.json index 5fb3c5572891c..12a6dbdf19d47 100644 --- a/data/json/items/ammo/44.json +++ b/data/json/items/ammo/44.json @@ -13,7 +13,7 @@ "name": { "str": ".44 Magnum" }, "description": ".44 magnum ammunition with 240gr JHP bullets. The .44 magnum round is one of the most powerful handgun cartridges available. It has excellent stopping power but suffers from extremely high recoil for a handgun round.", "weight": "13 g", - "volume": "250 ml", + "volume": "87 ml", "price": 175, "price_postapoc": 600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/44paper.json b/data/json/items/ammo/44paper.json index 277fbb1fde8a7..4e8aac11438e2 100644 --- a/data/json/items/ammo/44paper.json +++ b/data/json/items/ammo/44paper.json @@ -5,7 +5,7 @@ "name": { "str": ".44 paper cartridge" }, "description": "A paper cartridge containing a premeasured amount of black powder and a .44 projectile. Used by the Colt M1860 Army.", "weight": "7 g", - "volume": "250 ml", + "volume": "20 ml", "price": 350, "price_postapoc": 1000, "material": [ "paper", "powder", "lead" ], diff --git a/data/json/items/ammo/45.json b/data/json/items/ammo/45.json index ad35f3146cb7b..efbc4137e9372 100644 --- a/data/json/items/ammo/45.json +++ b/data/json/items/ammo/45.json @@ -13,7 +13,7 @@ "name": { "str": ".45 ACP JHP" }, "description": ".45 ACP ammunition with 185gr JHP bullets. The .45 ACP round was developed to replace the .38 Long Colt cartridge in the early 20th century. It has good stopping power but above average recoil.", "weight": "10 g", - "volume": "250 ml", + "volume": "112 ml", "price": 180, "price_postapoc": 600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/454.json b/data/json/items/ammo/454.json index d46502dbd2c42..00fb52e2a7be5 100644 --- a/data/json/items/ammo/454.json +++ b/data/json/items/ammo/454.json @@ -5,7 +5,7 @@ "name": { "str": ".454 Casull" }, "description": ".454 Casull ammunition with 300gr jacketed soft point bullets. The .454 Casull round is derived from .45 Long Colt with a stronger, lengthened case. It is an exceptionally powerful cartridge with higher stopping power than many rifle rounds, although it suffers from extreme recoil making it unsuitable for most purposes.", "weight": "16 g", - "volume": "250 ml", + "volume": "79 ml", "price": 500, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/4570.json b/data/json/items/ammo/4570.json index 8ecb9882c0c68..5ebae6226c854 100644 --- a/data/json/items/ammo/4570.json +++ b/data/json/items/ammo/4570.json @@ -5,7 +5,7 @@ "name": { "str": ".45-70 SP" }, "description": ".45-70 Government ammunition loaded with a 305 grain soft point round. One of the oldest cartridges still in use, it is still a favorite for large game hunting at short ranges.", "weight": "35 g", - "volume": "250 ml", + "volume": "167 ml", "price": 125, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/45colt.json b/data/json/items/ammo/45colt.json index 2932999efae2a..bbdc072ca8cec 100644 --- a/data/json/items/ammo/45colt.json +++ b/data/json/items/ammo/45colt.json @@ -5,7 +5,7 @@ "name": { "str": ".45 Colt JHP" }, "description": ".45 Colt ammunition with 250gr jacketed hollow point bullets. Originally designed for the Colt Single Action Army, and still used for modern reproduction revolvers. Originally a black powder cartridge, modern loads can make this round competitive in the new era.", "weight": "12 g", - "volume": "250 ml", + "volume": "190 ml", "price": 200, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/46.json b/data/json/items/ammo/46.json index 37650e0ab4db3..b6e46642af770 100644 --- a/data/json/items/ammo/46.json +++ b/data/json/items/ammo/46.json @@ -5,7 +5,7 @@ "name": { "str": "4.6x30mm" }, "description": "4.6x30mm ammunition with 31gr copper plated steel bullets. The 4.6x30mm round was developed by H&K to compete with FN Herstal's 5.7x28mm cartridge. It has low recoil and excellent armor penetration.", "weight": "5 g", - "volume": "250 ml", + "volume": "156 ml", "price": 300, "price_postapoc": 1600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/50.json b/data/json/items/ammo/50.json index 0a0eff6245bd5..619f68301ff7a 100644 --- a/data/json/items/ammo/50.json +++ b/data/json/items/ammo/50.json @@ -15,7 +15,7 @@ "name": { "str": ".50 BMG M33 Ball" }, "description": ".50 BMG ammunition with mild steel cored 661gr FMJ bullets. The .50 BMG is a very powerful rifle round designed for anti-aircraft use, later adapted to anti-vehicular and anti-personnel roles. Its stupendous energy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise.", "weight": "114 g", - "volume": "250 ml", + "volume": "451 ml", "price": 2200, "price_postapoc": 2500, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/500.json b/data/json/items/ammo/500.json index 1f115ef4770c6..2deef17dabe57 100644 --- a/data/json/items/ammo/500.json +++ b/data/json/items/ammo/500.json @@ -5,7 +5,7 @@ "name": { "str": ".500 S&W Magnum" }, "description": ".500 S&W Magnum ammunition with 500gr bullets. The .500 S&W Magnum round is a colossally powerful handgun cartridge capable of killing almost any target with one hit. It has extremely high damage and recoil to match.", "weight": "15 g", - "volume": "250 ml", + "volume": "82 ml", "price": 200, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/545x39.json b/data/json/items/ammo/545x39.json index 67b9e40515881..abcbb7940770d 100644 --- a/data/json/items/ammo/545x39.json +++ b/data/json/items/ammo/545x39.json @@ -6,7 +6,7 @@ "//": "Mainlined from Icecoon's Weapons Pack.", "description": "5.45x39mm 7N10 ammunition with 56gr FMJ bullets. The 5.45x39mm round was introduced along with the AK-74 in 1974. It has superior wounding potential to the older 7.62x39mm round and quickly replaced it in Soviet military use.", "weight": "10 g", - "volume": "250 ml", + "volume": "134 ml", "price": 100, "price_postapoc": 900, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/57.json b/data/json/items/ammo/57.json index 8213a2379c543..a6aac6c2c8490 100644 --- a/data/json/items/ammo/57.json +++ b/data/json/items/ammo/57.json @@ -5,7 +5,7 @@ "name": { "str": "5.7x28mm SS190" }, "description": "5.7x28mm ammunition with 31gr AP FMJ bullets. The 5.7x28mm cartridge was designed by FN Herstal to replace the 9x19mm round in NATO use. Although the project to replace 9x19mm Parabellum was effectively canceled the 5.7x28mm round has seen action in many conflicts and has proven to be reliable. It has very low recoil and its armor penetration is a defining feature.", "weight": "6 g", - "volume": "250 ml", + "volume": "121 ml", "price": 350, "price_postapoc": 1600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/5x50.json b/data/json/items/ammo/5x50.json index c1a285cb912a6..82811ce0a5228 100644 --- a/data/json/items/ammo/5x50.json +++ b/data/json/items/ammo/5x50.json @@ -5,7 +5,7 @@ "name": { "str": "RA110 5x50mm flechette" }, "description": "Designed to defeat modern body armor, the Rivtech 5x50mm flechette round features a biodegradable sabot and a single, fin-stabilized penetrator.", "weight": "8 g", - "volume": "250 ml", + "volume": "144 ml", "price": 1125, "material": [ "plastic", "powder", "steel" ], "symbol": "=", diff --git a/data/json/items/ammo/700nx.json b/data/json/items/ammo/700nx.json index 7eb5b7e653e6d..5655276b2a155 100644 --- a/data/json/items/ammo/700nx.json +++ b/data/json/items/ammo/700nx.json @@ -5,7 +5,7 @@ "name": { "str": ".700 NX" }, "description": "The .700 Nitro Express is a very powerful rifle round designed for long-range use. Its stupendous accuracy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise.", "weight": "80 g", - "volume": "250 ml", + "volume": "165 ml", "price": 5700, "price_postapoc": 2000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/762.json b/data/json/items/ammo/762.json index 7f770d227c134..8b974c3a8fee0 100644 --- a/data/json/items/ammo/762.json +++ b/data/json/items/ammo/762.json @@ -5,7 +5,7 @@ "name": { "str": "7.62x39mm 57-N-231" }, "description": "7.62x39mm 57-N-231 ammunition with 121.9gr steel core FMJ bullets. Developed in WW2 by the Soviet Union the 7.62x39mm round rapidly became extremely popular all over the world. The bullet has poor wounding potential due to its stability, only beginning to yaw after 26cm.", "weight": "16 g", - "volume": "250 ml", + "volume": "113 ml", "price": 120, "price_postapoc": 900, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/762R.json b/data/json/items/ammo/762R.json index 805a79dc09d58..dc61c187481c0 100644 --- a/data/json/items/ammo/762R.json +++ b/data/json/items/ammo/762R.json @@ -5,7 +5,7 @@ "name": { "str": "7.62x54mmR" }, "description": "7.62x54mmR ammunition with 150gr FMJ bullets. The 7.62x54mmR round is one of the oldest still in common use, primarily due to the popularity of the Mosin-Nagant rifle. Although it has not been used by militaries for several decades it remains popular with civilians. It is a powerful cartridge capable of killing most targets with one shot.", "weight": "18 g", - "volume": "250 ml", + "volume": "185 ml", "price": 200, "price_postapoc": 600, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/762x25.json b/data/json/items/ammo/762x25.json index b383f45be5e81..b710af263f010 100644 --- a/data/json/items/ammo/762x25.json +++ b/data/json/items/ammo/762x25.json @@ -5,7 +5,7 @@ "name": { "str": "7.62x25mm JHP" }, "description": "A commercial version of the 7.62x25mm cartridge created for the armed forces of Soviet Russia. It was derived from the 7.63x25mm cartridge used by the C96 pistol.", "weight": "10 g", - "volume": "250 ml", + "volume": "107 ml", "price": 100, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/8x40mm.json b/data/json/items/ammo/8x40mm.json index 25d9b16a37b46..ccc64636b94b3 100644 --- a/data/json/items/ammo/8x40mm.json +++ b/data/json/items/ammo/8x40mm.json @@ -16,7 +16,7 @@ "//": "Cased ammo tends to be roughly $1/shot, more or less. Rivtech ammo, being New and Proprietary and Expensive, $2-2.50 or so.", "description": "8x40mm caseless rounds. Proprietary ammunition for Rivtech firearms. Being caseless rounds, these cannot be disassembled or reloaded.", "weight": "12 g", - "volume": "250 ml", + "volume": "230 ml", "price": 225, "price_postapoc": 8000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/9mm.json b/data/json/items/ammo/9mm.json index f429d6ac5a2e5..a3d86fd9a0bd7 100644 --- a/data/json/items/ammo/9mm.json +++ b/data/json/items/ammo/9mm.json @@ -5,7 +5,7 @@ "name": { "str": "9x19mm JHP" }, "description": "9x19mm ammunition with a 116gr jacketed hollow point bullet. JHP rounds have inferior penetration to FMJ rounds but their expansion slightly increases stopping power against unarmored targets and reduces overpenetration.", "weight": "7 g", - "volume": "250 ml", + "volume": "115 ml", "price": 150, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/9x18.json b/data/json/items/ammo/9x18.json index 92485acef56ba..345dd5966bc7e 100644 --- a/data/json/items/ammo/9x18.json +++ b/data/json/items/ammo/9x18.json @@ -5,7 +5,7 @@ "name": { "str": "9x18mm 57-N-181S" }, "description": "9x18mm Makarov ammunition with 93gr steel core FMJ bullets. The 9x18mm round was very common in the Eastern Bloc during the 20th century and remained in Russian military service into the 21st century.", "weight": "8 g", - "volume": "250 ml", + "volume": "97 ml", "price": 100, "price_postapoc": 1000, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/exodii.json b/data/json/items/ammo/exodii.json new file mode 100644 index 0000000000000..ba09a03a8e62d --- /dev/null +++ b/data/json/items/ammo/exodii.json @@ -0,0 +1,10 @@ +[ + { + "id": "123ln", + "type": "AMMO", + "copy-from": "3006", + "name": { "str": "12.3ln round" }, + "description": "The 12.3ln cartridge was introduced in Romania in the wake of the second Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly gained popularity in the Eastern Union, and from there, the world. Due to this, the 12.3ln rapidly became the standard combat round in the Eurasian sphere. It was easily scavenged and stockpiled by the Exodii. To you, it looks and feels quite similar to a .30-06 Springfield cartridge, but with a slightly sharper taper.", + "ammo_type": "123ln" + } +] diff --git a/data/json/items/ammo/flintlock.json b/data/json/items/ammo/flintlock.json index f7fc54e73daac..11e39af83f301 100644 --- a/data/json/items/ammo/flintlock.json +++ b/data/json/items/ammo/flintlock.json @@ -5,7 +5,7 @@ "name": { "str": "paper cartridge" }, "description": "A paper cartridge containing black powder and a metallic projectile. Historically used to reload muzzleloaders in a more reasonable time.", "weight": "40 g", - "volume": "250 ml", + "volume": "10 ml", "price": 1100, "price_postapoc": 1200, "material": [ "lead", "powder" ], @@ -27,7 +27,7 @@ "name": { "str": "paper shot cartridge" }, "description": "A paper cartridge containing black powder and metallic shot. Historically used to reload muzzleloaders in a more reasonable time.", "weight": "40 g", - "volume": "250 ml", + "volume": "10 ml", "price": 1100, "price_postapoc": 1200, "material": [ "lead", "powder" ], diff --git a/data/json/items/ammo/shot.json b/data/json/items/ammo/shot.json index 49b5723185fec..88544919ee865 100644 --- a/data/json/items/ammo/shot.json +++ b/data/json/items/ammo/shot.json @@ -94,7 +94,7 @@ "name": { "str": "00 shot" }, "description": "A shell filled with metal pellets. Extremely damaging, plus the spread makes it very accurate at short range. Favored by SWAT forces.", "weight": "32 g", - "volume": "250 ml", + "volume": "439 ml", "price": 500, "price_postapoc": 800, "flags": [ "IRREPLACEABLE_CONSUMABLE" ], diff --git a/data/json/items/ammo/signal_flare.json b/data/json/items/ammo/signal_flare.json index df4e447f95f66..c346a97e0199b 100644 --- a/data/json/items/ammo/signal_flare.json +++ b/data/json/items/ammo/signal_flare.json @@ -5,7 +5,7 @@ "name": { "str": "signal flare" }, "description": "A heavy plastic cartridge made for use in flare guns. It appears to be a modified 12 gauge shotgun shell.", "weight": "32 g", - "volume": "250 ml", + "volume": "377 ml", "price": 500, "price_postapoc": 500, "material": [ "plastic", "powder" ], diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 533ea1f065132..6595a78270ca2 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -629,6 +629,12 @@ "name": "compressed air", "default": "nitrox" }, + { + "type": "ammunition_type", + "id": "extinguishing_agent", + "name": "extinguishing agent", + "default": "extinguishing_agent" + }, { "id": "tinder", "name": "tinder", @@ -652,5 +658,11 @@ "id": "300blk", "name": ".300 AAC Blackout", "default": "300blk" + }, + { + "type": "ammunition_type", + "id": "123ln", + "name": "12.3ln cartridge", + "default": "123ln" } ] diff --git a/data/json/items/armor/ammo_pouch.json b/data/json/items/armor/ammo_pouch.json index beb0ff2c00298..f1be0e17c975d 100644 --- a/data/json/items/armor/ammo_pouch.json +++ b/data/json/items/armor/ammo_pouch.json @@ -3,7 +3,7 @@ "id": "ammo_pouch", "type": "ARMOR", "name": { "str": "ammo pouch", "str_pl": "ammo pouches" }, - "description": "A small pouch that can be used to store most types of small ammunition, rockets will not fit. Activate to store ammunition.", + "description": "A small pouch that can be used to store most types of small ammunition, rockets will not fit. Use insert to store ammunition.", "weight": "490 g", "volume": "500 ml", "price": 1000, @@ -307,7 +307,7 @@ "id": "quiver", "type": "ARMOR", "name": { "str": "quiver" }, - "description": "A leather quiver worn at the waist that can hold 20 arrows. Activate to store arrows.", + "description": "A leather quiver worn at the waist that can hold 20 arrows or bolts. Use insert to store arrows or bolts.", "weight": "260 g", "volume": "500 ml", "price": 6500, @@ -328,7 +328,7 @@ "id": "quiver_birchbark", "type": "ARMOR", "name": { "str": "birchbark quiver" }, - "description": "A quiver woven from strips of birch bark, worn at the waist, that can hold 20 arrows. Activate to store arrows.", + "description": "A quiver woven from strips of birch bark, worn at the waist, that can hold 20 arrows or bolts. Use insert to store arrows or bolts.", "weight": "490 g", "volume": "500 ml", "price": 6500, @@ -349,7 +349,7 @@ "id": "quiver_large", "type": "ARMOR", "name": { "str": "large quiver" }, - "description": "A large leather quiver trimmed with metal, worn on the back, that can hold 60 arrows. Historically used by horse archers, rather than foot archers, but neither of THEM had to fight zombies. Activate to store arrows.", + "description": "A large leather quiver trimmed with metal, worn on the back, that can hold 60 arrows or bolts. Historically used by horse archers, rather than foot archers, but neither of THEM had to fight zombies. Use insert to store arrows or bolts.", "weight": "920 g", "volume": "1500 ml", "price": 8800, @@ -370,7 +370,7 @@ "id": "quiver_large_birchbark", "type": "ARMOR", "name": { "str": "large birchbark quiver" }, - "description": "A large quiver woven from strips of birchbark, worn on the back, that can hold 60 arrows. Activate to store arrows.", + "description": "A large quiver woven from strips of birchbark, worn on the back, that can hold 60 arrows or bolts. Use insert to store arrows or bolts.", "weight": "1380 g", "volume": "1500 ml", "price": 8800, diff --git a/data/json/items/armor/bandolier.json b/data/json/items/armor/bandolier.json index 808131da8664d..98bb2f86fafa3 100644 --- a/data/json/items/armor/bandolier.json +++ b/data/json/items/armor/bandolier.json @@ -184,7 +184,7 @@ "8x40mm": 4, "4570": 4, "50": 4, - "700nx": 40 + "700nx": 4 }, "moves": 20 } diff --git a/data/json/items/armor/belts.json b/data/json/items/armor/belts.json index 01b5b4ca4045f..8c644d0ad7604 100644 --- a/data/json/items/armor/belts.json +++ b/data/json/items/armor/belts.json @@ -19,8 +19,8 @@ "pocket_data": [ { "max_contains_volume": "2 L", - "max_contains_weight": "4 kg", - "max_item_length": "70 cm", + "max_contains_weight": "6 kg", + "max_item_length": "90 cm", "moves": 50, "flag_restriction": [ "BELT_CLIP" ], "holster": true @@ -225,6 +225,7 @@ "encumbrance": 2, "material_thickness": 2, "pocket_data": [ + { "max_contains_volume": "1 L", "max_contains_weight": "1500 g", "moves": 100 }, { "holster": true, "min_item_volume": "50 ml", @@ -269,8 +270,7 @@ "max_item_length": "50 cm", "moves": 50, "flag_restriction": [ "BELT_CLIP", "SHEATH_KNIFE" ] - }, - { "max_contains_volume": "1 L", "max_contains_weight": "1500 g", "moves": 100 } + } ], "use_action": { "type": "holster", "holster_prompt": "Store tool or blade", "holster_msg": "You put your %1$s in your %2$s" }, "flags": [ "WAIST", "NO_QUICKDRAW", "WATER_FRIENDLY" ] diff --git a/data/json/items/armor/holster.json b/data/json/items/armor/holster.json index 4d5957bf5991d..842700fbbd2bb 100644 --- a/data/json/items/armor/holster.json +++ b/data/json/items/armor/holster.json @@ -115,9 +115,9 @@ "pocket_type": "CONTAINER", "holster": true, "min_item_volume": "300 ml", - "max_contains_volume": "800 ml", + "max_contains_volume": "1000 ml", "max_contains_weight": "2 kg", - "max_item_length": "25 cm", + "max_item_length": "30 cm", "moves": 50 } ], @@ -227,9 +227,9 @@ "pocket_type": "CONTAINER", "holster": true, "min_item_volume": "750 ml", - "max_contains_volume": "1250 ml", + "max_contains_volume": "1500 ml", "max_contains_weight": "5 kg", - "max_item_length": "30 cm", + "max_item_length": "45 cm", "moves": 50 } ], diff --git a/data/json/items/armor/jewelry.json b/data/json/items/armor/jewelry.json index b84acce57c3ad..44428ce2fa0b6 100644 --- a/data/json/items/armor/jewelry.json +++ b/data/json/items/armor/jewelry.json @@ -81,7 +81,7 @@ "name": { "str": "diamond dental grill" }, "description": "Fake teeth inlaid with diamonds, worn over the teeth. Fits horribly, but looks very shiny. For that high-class gangsta rap look.", "weight": "10 g", - "volume": 0, + "volume": "1 ml", "price": 50000, "price_postapoc": 250, "bashing": 3, @@ -100,7 +100,7 @@ "name": { "str": "garnet dental grill" }, "description": "Fake teeth inlaid with garnets, worn over the teeth. It looks very shiny.", "weight": "10 g", - "volume": 0, + "volume": "1 ml", "price": 30000, "price_postapoc": 100, "bashing": 3, @@ -212,7 +212,7 @@ "name": { "str": "diamond and gold ring" }, "description": "A gold ring with a sparkling diamond mounted on top of it. Back in the old days this could be worth a fortune. You can wear it if you like, but it won't provide any effects.", "weight": "12 g", - "volume": 0, + "volume": "1 ml", "price": 190000, "price_postapoc": 100, "material": [ "gold" ], @@ -347,7 +347,7 @@ "name": { "str": "pair of cufflinks", "str_pl": "pairs of cufflinks" }, "description": "An unmarked, pair of silver cufflinks. Cufflinks are used to secure the cuffs of dress shirts - a must-have for men in formal wear. You can wear it if you like, but it won't provide any effects.", "weight": "15 g", - "volume": 0, + "volume": "1 ml", "price": 3000, "price_postapoc": 10, "material": [ "silver" ], @@ -360,7 +360,7 @@ "name": { "str": "pair of intricate cufflinks", "str_pl": "pairs of intricate cufflinks" }, "description": "An expensive pair of silver cufflinks, stylized with detailed overlays of gold gears and fractal patterns. You can wear it if you like, but it won't provide any effects.", "weight": "21 g", - "volume": 0, + "volume": "1 ml", "price": 7000, "price_postapoc": 50, "material": [ "silver", "gold" ], @@ -373,7 +373,7 @@ "name": { "str_sp": "garnet and gold cufflinks" }, "description": "A pair of cufflinks with inset garnets.", "weight": "15 g", - "volume": 0, + "volume": "1 ml", "price": 3500, "price_postapoc": 50, "material": [ "gold", "gemstone" ], @@ -492,7 +492,7 @@ "name": { "str_sp": "garnet and silver cufflinks" }, "description": "A pair of cufflinks with inset garnets.", "weight": "15 g", - "volume": 0, + "volume": "1 ml", "price": 3500, "price_postapoc": 100, "material": [ "silver", "gemstone" ], @@ -611,7 +611,7 @@ "name": { "str_sp": "garnet and platinum cufflinks" }, "description": "A pair of cufflinks with inset garnets.", "weight": "15 g", - "volume": 0, + "volume": "1 ml", "price": 3500, "price_postapoc": 100, "material": [ "platinum", "gemstone" ], @@ -1293,6 +1293,7 @@ "price_postapoc": 100, "to_hit": -1, "material": [ "plastic", "steel" ], + "ascii_picture": "wristwatch", "symbol": "[", "color": "dark_gray", "covers": [ "HAND_EITHER" ], @@ -1343,7 +1344,8 @@ "copy-from": "badge_abstract", "type": "ARMOR", "name": { "str": "deputy badge" }, - "description": "A tarnished silver star gives an air of authority to the wearer." + "description": "A tarnished silver star gives an air of authority to the wearer.", + "ascii_picture": "badge_deputy" }, { "id": "badge_detective", @@ -1506,7 +1508,7 @@ "name": { "str": "pair of garnet and gold earrings", "str_pl": "pairs of garnet and gold earrings" }, "description": "A pair of shiny garnet and gold earrings. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 25, "material": [ "gold", "gemstone" ], @@ -1627,7 +1629,7 @@ "name": { "str": "pair of garnet and silver earrings", "str_pl": "pairs of garnet and silver earrings" }, "description": "A pair of shiny garnet and silver earrings. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 6000, "price_postapoc": 1000, "material": [ "silver", "gemstone" ], @@ -1748,7 +1750,7 @@ "name": { "str": "pair of garnet and platinum earrings", "str_pl": "pairs of garnet and platinum earrings" }, "description": "A pair of shiny garnet and platinum earrings. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 25, "material": [ "platinum", "gemstone" ], @@ -1858,7 +1860,7 @@ "name": { "str": "garnet and gold ring" }, "description": "A gold ring with a garnet mounted on top of it. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 1800, "material": [ "gold", "gemstone" ], @@ -1979,7 +1981,7 @@ "name": { "str": "garnet and silver ring" }, "description": "A silver ring with a garnet mounted on top of it. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 25, "material": [ "silver", "gemstone" ], @@ -2100,7 +2102,7 @@ "name": { "str": "garnet and platinum ring" }, "description": "A platinum ring with a garnet mounted on top of it. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 25, "material": [ "platinum", "gemstone" ], @@ -2222,7 +2224,7 @@ "name": { "str": "garnet and gold bracelet" }, "description": "A gold bracelet with sparkling garnets. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 15000, "price_postapoc": 25, "material": [ "gold", "gemstone" ], @@ -2344,7 +2346,7 @@ "name": { "str": "garnet and silver bracelet" }, "description": "A silver bracelet with sparkling garnets. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 15000, "price_postapoc": 25, "material": [ "silver", "gemstone" ], @@ -2466,7 +2468,7 @@ "name": { "str": "garnet and platinum bracelet" }, "description": "A platinum bracelet with sparkling garnets. You can wear it if you like, but it won't provide any effects.", "weight": "2700 mg", - "volume": 0, + "volume": "1 ml", "price": 15000, "price_postapoc": 25, "material": [ "platinum", "gemstone" ], @@ -2576,7 +2578,7 @@ "name": { "str": "garnet and gold necklace" }, "description": "A shiny, gold necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", "weight": "70 g", - "volume": 0, + "volume": "1 ml", "price": 50000, "price_postapoc": 25, "material": [ "gold", "gemstone" ], @@ -2695,7 +2697,7 @@ "name": { "str": "garnet and silver necklace" }, "description": "A shiny, silver necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", "weight": "70 g", - "volume": 0, + "volume": "1 ml", "price": 50000, "price_postapoc": 25, "material": [ "silver", "gemstone" ], @@ -2814,7 +2816,7 @@ "name": { "str": "garnet and platinum necklace" }, "description": "A shiny, platinum necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", "weight": "70 g", - "volume": 0, + "volume": "1 ml", "price": 50000, "price_postapoc": 25, "material": [ "platinum", "gemstone" ], diff --git a/data/json/items/armor/pets_dog_armor.json b/data/json/items/armor/pets_dog_armor.json index a2af87a42b003..87b886ec2068a 100644 --- a/data/json/items/armor/pets_dog_armor.json +++ b/data/json/items/armor/pets_dog_armor.json @@ -18,7 +18,37 @@ "material_thickness": 2, "max_pet_vol": "35000 ml", "min_pet_vol": "25000 ml", - "pet_bodytype": "dog" + "pet_bodytype": "dog", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "60 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "60 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1250 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1250 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 200 + } + ] }, { "type": "PET_ARMOR", @@ -109,6 +139,36 @@ "price_postapoc": 5000, "material": [ "superalloy" ], "weight": "3125 g", - "min_pet_vol": "20000 ml" + "min_pet_vol": "20000 ml", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "10 L", + "max_contains_weight": "20 kg", + "max_item_length": "80 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "10 L", + "max_contains_weight": "20 kg", + "max_item_length": "80 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2500 ml", + "max_contains_weight": "5 kg", + "max_item_length": "30 cm", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2500 ml", + "max_contains_weight": "5 kg", + "max_item_length": "30 cm", + "moves": 200 + } + ] } ] diff --git a/data/json/items/armor/storage.json b/data/json/items/armor/storage.json index 6b3ee3f0ae3a3..d7964bdbb4315 100644 --- a/data/json/items/armor/storage.json +++ b/data/json/items/armor/storage.json @@ -15,8 +15,16 @@ "covers": [ "TORSO" ], "coverage": 30, "encumbrance": 2, - "max_encumbrance": 15, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "30 kg", "moves": 300 } ], + "max_encumbrance": 25, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "25 L", + "max_contains_weight": "30 kg", + "max_item_length": "40 cm", + "moves": 300 + } + ], "warmth": 6, "material_thickness": 2, "flags": [ "BELTED" ] @@ -27,7 +35,7 @@ "name": { "str": "hiking backpack" }, "description": "A large sized hiking backpack with plenty of storage space.", "weight": "2291 g", - "volume": "14 L", + "volume": "14700 ml", "price": 10000, "price_postapoc": 1000, "material": [ "leather" ], @@ -41,23 +49,51 @@ "warmth": 10, "material_thickness": 2, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "50 L", "max_contains_weight": "50 kg", "moves": 450 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "4 L", "max_contains_weight": "8 kg", "moves": 450 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "2 kg", "moves": 450 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "2 kg", "moves": 450 }, { "pocket_type": "CONTAINER", - "min_item_volume": "250 ml", - "max_contains_volume": "250 ml", + "max_contains_volume": "50 L", + "max_contains_weight": "50 kg", + "max_item_length": "60 cm", + "magazine_well": "12 L", + "moves": 450 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "4 L", + "max_contains_weight": "8 kg", + "max_item_length": "35 cm", + "magazine_well": "1 L", + "moves": 450 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2 L", + "max_contains_weight": "2 kg", + "max_item_length": "25 cm", + "magazine_well": "500 ml", + "moves": 450 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2 L", + "max_contains_weight": "2 kg", + "max_item_length": "25 cm", + "magazine_well": "500 ml", + "moves": 450 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", + "max_item_length": "70 cm", "moves": 3, "flag_restriction": [ "SHEATH_KNIFE", "SHEATH_SWORD" ] }, { "pocket_type": "CONTAINER", - "min_item_volume": "250 ml", - "max_contains_volume": "250 ml", + "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", + "max_item_length": "70 cm", "moves": 3, "flag_restriction": [ "SHEATH_KNIFE", "SHEATH_SWORD" ] } @@ -72,7 +108,7 @@ "name": { "str": "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 g", - "volume": "8750 ml", + "volume": "9186 ml", "price": 4500, "price_postapoc": 750, "material": [ "cotton" ], @@ -81,9 +117,18 @@ "color": "green", "covers": [ "TORSO", "LEGS" ], "coverage": 75, - "encumbrance": 10, - "max_encumbrance": 40, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "80 L", "max_contains_weight": "40 kg", "moves": 300 } ], + "encumbrance": 20, + "max_encumbrance": 60, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "80 L", + "max_contains_weight": "40 kg", + "max_item_length": "96 cm", + "magazine_well": "8750 ml", + "moves": 300 + } + ], "warmth": 5, "material_thickness": 2, "flags": [ "BELTED" ] @@ -104,8 +149,16 @@ "covers": [ "TORSO" ], "coverage": 30, "encumbrance": 4, - "max_encumbrance": 17, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "30 kg", "moves": 300 } ], + "max_encumbrance": 26, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "25 L", + "max_contains_weight": "30 kg", + "max_item_length": "40 cm", + "moves": 300 + } + ], "warmth": 9, "material_thickness": 3, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -128,10 +181,38 @@ "encumbrance": 10, "max_encumbrance": 55, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "55 L", "max_contains_weight": "70 kg", "moves": 300 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "10 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "55 L", + "max_contains_weight": "70 kg", + "max_item_length": "70 cm", + "magazine_well": "10 L", + "moves": 300 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "40 cm", + "magazine_well": "1 L", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + } ], "warmth": 10, "material_thickness": 2, @@ -143,7 +224,7 @@ "name": { "str": "laundry basket" }, "description": "A plastic basket meant for storing and hauling clothing.", "weight": "680 g", - "volume": "25 L", + "volume": "52500 ml", "price": 75, "price_postapoc": 10, "to_hit": -2, @@ -159,8 +240,9 @@ { "pocket_type": "CONTAINER", "rigid": true, - "max_contains_volume": "25 L", + "max_contains_volume": "50 L", "max_contains_weight": "50 kg", + "max_item_length": "80 cm", "moves": 300 } ], @@ -185,10 +267,38 @@ "encumbrance": 16, "max_encumbrance": 65, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "70 L", "max_contains_weight": "70 kg", "moves": 300 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "10 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "70 L", + "max_contains_weight": "70 kg", + "max_item_length": "75 cm", + "magazine_well": "10 L", + "moves": 300 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "40 cm", + "magazine_well": "1 L", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + } ], "warmth": 10, "material_thickness": 2, @@ -211,8 +321,8 @@ "color": "light_gray", "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 4, - "encumbrance": 20, - "max_encumbrance": 40, + "encumbrance": 30, + "max_encumbrance": 35, "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "15 kg", "moves": 300 } ], "material_thickness": 1, "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] @@ -228,13 +338,21 @@ "symbol": "]", "looks_like": "jerrypack", "material": [ "wood", "cotton" ], - "volume": "15 L", + "volume": "15750 ml", "price_postapoc": 50, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "60 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "15 L", + "max_contains_weight": "60 kg", + "max_item_length": "50 cm", + "moves": 300 + } + ], "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 15, - "max_encumbrance": 30, + "encumbrance": 20, "warmth": 5, "bashing": 16, "cutting": 4, @@ -248,7 +366,7 @@ "name": { "str": "briefcase" }, "description": "Useful for carrying money, documents, or smuggled goods.", "weight": "1700 g", - "volume": "15 L", + "volume": "15750 ml", "price": 24000, "price_postapoc": 50, "to_hit": -2, @@ -266,6 +384,7 @@ "rigid": true, "max_contains_volume": "15 L", "max_contains_weight": "30 kg", + "max_item_length": "50 cm", "moves": 200 } ], @@ -279,7 +398,7 @@ "name": { "str": "violin case" }, "description": "Useful to carry your precious musical instrument around protected from any harm.", "weight": "2800 g", - "volume": "5 L", + "volume": "10500 ml", "price": 24000, "price_postapoc": 50, "to_hit": -4, @@ -290,7 +409,17 @@ "color": "dark_gray", "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 10, - "encumbrance": 50, + "encumbrance": 30, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "10 L", + "max_contains_weight": "20 kg", + "max_item_length": "50 cm", + "moves": 200 + } + ], "material_thickness": 5, "flags": [ "FANCY", "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, @@ -304,7 +433,7 @@ "looks_like": "backpack", "color": "red", "weight": "411 g", - "volume": "2 L", + "volume": "2100 ml", "//": "REI Co-op 22-liter daypack costs $54.95, so ballpark to $55", "price": 5500, "price_postapoc": 500, @@ -314,7 +443,16 @@ "material_thickness": 1, "encumbrance": 2, "max_encumbrance": 18, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "24 L", "max_contains_weight": "32 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "24 L", + "max_contains_weight": "32 kg", + "max_item_length": "60 cm", + "magazine_well": "2 L", + "moves": 300 + } + ], "warmth": 5, "flags": [ "BELTED", "OVERSIZE", "STURDY" ] }, @@ -335,8 +473,16 @@ "covers": [ "TORSO" ], "coverage": 40, "encumbrance": 2, - "max_encumbrance": 12, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "12 L", "max_contains_weight": "24 kg", "moves": 300 } ], + "max_encumbrance": 30, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "30 L", + "max_contains_weight": "24 kg", + "max_item_length": "70 cm", + "moves": 300 + } + ], "material_thickness": 1, "flags": [ "WATER_FRIENDLY", "BELTED" ] }, @@ -357,7 +503,16 @@ "coverage": 50, "encumbrance": 5, "max_encumbrance": 35, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "35 L", "max_contains_weight": "50 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "35 L", + "max_contains_weight": "50 kg", + "max_item_length": "55 cm", + "magazine_well": "5 L", + "moves": 300 + } + ], "warmth": 10, "material_thickness": 2, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -368,7 +523,7 @@ "name": { "str": "tactical dump pouch", "str_pl": "tactical dump pouches" }, "description": "An expandable pouch secured with straps. Provides a bit of extra storage with minimal encumbrance.", "weight": "288 g", - "volume": "500 ml", + "volume": "525 ml", "price": 4500, "price_postapoc": 250, "to_hit": 2, @@ -381,7 +536,16 @@ "coverage": 10, "encumbrance": 1, "max_encumbrance": 3, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "4 kg", "moves": 80 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2 L", + "max_contains_weight": "4 kg", + "max_item_length": "20 cm", + "magazine_well": "500 ml", + "moves": 80 + } + ], "material_thickness": 1, "flags": [ "WAIST", "WATER_FRIENDLY" ] }, @@ -392,7 +556,7 @@ "name": { "str": "fanny pack" }, "description": "Provides a bit of extra storage, with minimal encumbrance.", "weight": "272 g", - "volume": "250 ml", + "volume": "1050 ml", "price": 3500, "to_hit": 2, "bashing": 1, @@ -403,8 +567,17 @@ "covers": [ "TORSO" ], "coverage": 10, "encumbrance": 1, - "max_encumbrance": 2, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "1500 ml", "max_contains_weight": "5 kg", "moves": 80 } ], + "max_encumbrance": 3, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2500 ml", + "max_contains_weight": "5 kg", + "max_item_length": "25 cm", + "magazine_well": "1 L", + "moves": 80 + } + ], "material_thickness": 1, "flags": [ "WAIST", "WATER_FRIENDLY" ] }, @@ -424,24 +597,24 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 25, - "longest_side": "900 cm", + "encumbrance": 30, + "max_encumbrance": 35, "//": "The main section of the golf bag actually assumes things will stick out of it, but specifically contains them, so some extra wiggle room was added.", "pocket_data": [ { "pocket_type": "CONTAINER", - "max_contains_volume": "42 L", + "max_contains_volume": "40 L", "max_contains_weight": "200 kg", "moves": 300, "rigid": true, - "max_item_length": "120 cm" + "max_item_length": "150 cm" }, - { "max_contains_volume": "90 ml", "max_contains_weight": "750 g", "moves": 200 }, - { "max_contains_volume": "90 ml", "max_contains_weight": "750 g", "moves": 200 }, - { "max_contains_volume": "1350 ml", "max_contains_weight": "4 kg", "moves": 300 }, - { "max_contains_volume": "675 ml", "max_contains_weight": "2 kg", "moves": 300 }, - { "max_contains_volume": "675 ml", "max_contains_weight": "2 kg", "moves": 300 }, - { "max_contains_volume": "500 ml", "max_contains_weight": "300 g", "moves": 100 } + { "max_contains_volume": "90 ml", "max_contains_weight": "750 g", "max_item_length": "10 cm", "moves": 200 }, + { "max_contains_volume": "90 ml", "max_contains_weight": "750 g", "max_item_length": "10 cm", "moves": 200 }, + { "max_contains_volume": "1350 ml", "max_contains_weight": "4 kg", "max_item_length": "25 cm", "moves": 300 }, + { "max_contains_volume": "675 ml", "max_contains_weight": "2 kg", "max_item_length": "20 cm", "moves": 300 }, + { "max_contains_volume": "675 ml", "max_contains_weight": "2 kg", "max_item_length": "20 cm", "moves": 300 }, + { "max_contains_volume": "500 ml", "max_contains_weight": "300 g", "max_item_length": "15 cm", "moves": 100 } ], "warmth": 5, "material_thickness": 3, @@ -459,8 +632,22 @@ "looks_like": "plastic_shopping_bag", "color": "pink", "proportional": { "weight": 6.0, "volume": 6.0, "price": 6.0, "quench": 6.0, "calories": 6.0, "healthy": 6.0, "fun": 6.0 }, - "armor_data": { "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 5, "encumbrance": 100, "material_thickness": 1 }, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "30 kg", "moves": 300 } ], + "armor_data": { + "covers": [ "ARM_EITHER", "HAND_EITHER" ], + "coverage": 5, + "encumbrance": 10, + "max_encumbrance": 100, + "material_thickness": 1 + }, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "15 L", + "max_contains_weight": "30 kg", + "max_item_length": "50 cm", + "moves": 300 + } + ], "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, { @@ -475,8 +662,22 @@ "color": "pink", "price_postapoc": 10, "proportional": { "weight": 6.0, "volume": 6.0, "price": 6.0, "quench": 6.0, "calories": 6.0, "healthy": 6.0, "fun": 6.0 }, - "armor_data": { "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 5, "encumbrance": 100, "material_thickness": 1 }, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "30 kg", "moves": 300 } ], + "armor_data": { + "covers": [ "ARM_EITHER", "HAND_EITHER" ], + "coverage": 5, + "encumbrance": 10, + "max_encumbrance": 100, + "material_thickness": 1 + }, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "15 L", + "max_contains_weight": "30 kg", + "max_item_length": "50 cm", + "moves": 300 + } + ], "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, { @@ -485,12 +686,23 @@ "type": "ARMOR", "copy-from": "briefcase", "looks_like": "briefcase", + "weight": "1500 g", + "volume": "15232 ml", + "longest_side": "544 mm", "name": { "str": "H&K operational briefcase (empty)", "str_pl": "H&K operational briefcases (empty)" }, "description": "This is a plain, hard-sided black briefcase with a trigger in the handle and a concealed hole in the side. Squeezing the trigger would currently do nothing, as it is empty. Don't forget to put a suitable MP5 back inside before you try to pay any ransom fees with lead.", - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "14500 ml", "max_contains_weight": "30 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "14 L", + "max_contains_weight": "30 kg", + "max_item_length": "50 cm", + "moves": 300 + } + ], "price": 2000, - "price_postapoc": 1250, - "weight": "950 g" + "price_postapoc": 1250 }, { "id": "jerrypack", @@ -498,7 +710,7 @@ "name": { "str": "jerrypack" }, "description": "A jerrycan modified to be worn in a similar manner to a backpack.", "weight": "1763 g", - "volume": "10 L", + "volume": "10500 ml", "price": 1450, "price_postapoc": 250, "to_hit": -1, @@ -511,7 +723,15 @@ "encumbrance": 30, "warmth": 5, "material_thickness": 2, - "pocket_data": [ { "max_contains_volume": "10 L", "max_contains_weight": "10 kg", "watertight": true, "rigid": true } ], + "pocket_data": [ + { + "max_contains_volume": "10 L", + "max_contains_weight": "10 kg", + "max_item_volume": "65 ml", + "watertight": true, + "rigid": true + } + ], "flags": [ "OVERSIZE", "BELTED", "WATER_FRIENDLY" ] }, { @@ -533,7 +753,15 @@ "coverage": 15, "encumbrance": 1, "max_encumbrance": 3, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "1500 ml", "max_contains_weight": "5 kg", "moves": 80 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1500 ml", + "max_contains_weight": "5 kg", + "max_item_length": "20 cm", + "moves": 80 + } + ], "material_thickness": 1, "flags": [ "WAIST", "OVERSIZE", "WATER_FRIENDLY" ] }, @@ -543,7 +771,7 @@ "name": { "str": "pair of drop leg pouches", "str_pl": "pairs of drop leg pouches" }, "description": "A set of pouches that can be worn on the thighs using buckled straps. This variety is favored by the military.", "weight": "205 g", - "volume": "500 ml", + "volume": "1050 ml", "price": 3000, "price_postapoc": 250, "material": [ "cotton" ], @@ -554,8 +782,22 @@ "encumbrance": 2, "max_encumbrance": 5, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "2250 ml", "max_contains_weight": "2 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "2250 ml", "max_contains_weight": "2 kg", "moves": 200 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2250 ml", + "max_contains_weight": "2 kg", + "max_item_length": "30 cm", + "magazine_well": "500 ml", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2250 ml", + "max_contains_weight": "2 kg", + "max_item_length": "30 cm", + "magazine_well": "500 ml", + "moves": 200 + } ], "material_thickness": 2, "flags": [ "VARSIZE", "WATER_FRIENDLY", "BELTED" ] @@ -577,7 +819,15 @@ "coverage": 30, "encumbrance": 2, "max_encumbrance": 9, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "10 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "70 cm", + "moves": 300 + } + ], "warmth": 5, "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -600,7 +850,16 @@ "coverage": 40, "encumbrance": 4, "max_encumbrance": 15, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "10 L", "max_contains_weight": "15 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "10 L", + "max_contains_weight": "15 kg", + "max_item_length": "50 cm", + "magazine_well": "2 L", + "moves": 300 + } + ], "warmth": 10, "material_thickness": 1, "flags": [ "OVERSIZE", "BELTED", "WATER_FRIENDLY" ] @@ -612,8 +871,8 @@ "name": { "str": "messenger bag" }, "//": "KA101's ran about $90 but is ballistic nylon. Bit tougher than the DDA model.", "description": "Light and easy to wear, but doesn't offer much storage.", - "weight": "760 g", - "volume": "1 L", + "weight": "690 g", + "volume": "2625 ml", "price": 7900, "price_postapoc": 250, "to_hit": 1, @@ -624,9 +883,18 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 1, - "max_encumbrance": 6, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "6 L", "max_contains_weight": "18 kg", "moves": 150 } ], + "encumbrance": 8, + "max_encumbrance": 12, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "15 L", + "max_contains_weight": "18 kg", + "max_item_length": "50 cm", + "magazine_well": "2500 ml", + "moves": 150 + } + ], "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] }, @@ -636,8 +904,8 @@ "type": "ARMOR", "name": { "str": "MOLLE pack" }, "description": "The Modular Lightweight Load-carrying Equipment is an advanced military backpack. Covered with pockets and straps, it strikes a fine balance between storage space and encumbrance.", - "weight": "966 g", - "volume": "2500 ml", + "weight": "1300 g", + "volume": "5000 ml", "price": 6700, "price_postapoc": 1500, "material": [ "cotton", "nylon" ], @@ -646,13 +914,41 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 2, + "encumbrance": 5, "max_encumbrance": 20, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "20 L", "max_contains_weight": "35 kg", "moves": 300 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "6 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "3 kg", "moves": 120 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "3 kg", "moves": 120 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "20 L", + "max_contains_weight": "35 kg", + "max_item_length": "50 cm", + "magazine_well": "3 L", + "moves": 300 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "6 kg", + "max_item_length": "30 cm", + "magazine_well": "750 ml", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2 L", + "max_contains_weight": "3 kg", + "max_item_length": "25 cm", + "magazine_well": "500 ml", + "moves": 120 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2 L", + "max_contains_weight": "3 kg", + "max_item_length": "25 cm", + "magazine_well": "500 ml", + "moves": 120 + } ], "warmth": 10, "material_thickness": 2, @@ -663,8 +959,8 @@ "type": "ARMOR", "name": { "str": "petpack" }, "description": "Before the Cataclysm this would allow your four-legged friend to see the world, now it's used to shield them from the world.", - "weight": "1316 g", - "volume": "10 L", + "weight": "900 g", + "volume": "36750 ml", "price": 7900, "price_postapoc": 250, "material": [ "cotton", "plastic" ], @@ -673,13 +969,21 @@ "color": "blue", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 5, - "max_encumbrance": 10, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "4 L", "max_contains_weight": "16 kg", "moves": 300 } ], + "encumbrance": 35, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "35 L", + "max_contains_weight": "16 kg", + "max_item_length": "45 cm", + "moves": 300 + } + ], "warmth": 8, "material_thickness": 2, "properties": [ [ "creature_size_capacity", "SMALL" ] ], - "use_action": [ "CAPTURE_MONSTER_ACT" ], + "use_action": "CAPTURE_MONSTER_ACT", "flags": [ "BELTED", "WATERPROOF" ] }, { @@ -688,7 +992,7 @@ "name": { "str": "plastic shopping bag" }, "description": "A bag used to carry groceries home.", "weight": "2 g", - "volume": "250 ml", + "volume": "30 ml", "price": 1, "price_postapoc": 10, "to_hit": -2, @@ -697,7 +1001,7 @@ "color": "white", "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 4, - "encumbrance": 40, + "encumbrance": 1, "max_encumbrance": 60, "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "3 kg", "moves": 150 } ], "material_thickness": 1, @@ -723,7 +1027,15 @@ "coverage": 10, "encumbrance": 2, "max_encumbrance": 7, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "10 kg", "moves": 150 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "30 cm", + "moves": 150 + } + ], "material_thickness": 2, "flags": [ "FANCY", "BELTED", "WATER_FRIENDLY" ] }, @@ -745,7 +1057,15 @@ "coverage": 15, "encumbrance": 5, "max_encumbrance": 10, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "2250 ml", "max_contains_weight": "2 kg", "moves": 200 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "2250 ml", + "max_contains_weight": "2 kg", + "max_item_length": "30 cm", + "moves": 200 + } + ], "material_thickness": 1, "flags": [ "WAIST", "OVERSIZE", "WATER_FRIENDLY" ] }, @@ -756,7 +1076,7 @@ "name": { "str": "military rucksack" }, "description": "A huge military rucksack, provides a lot of storage.", "weight": "1140 g", - "volume": "4 L", + "volume": "11 L", "price": 9200, "price_postapoc": 1250, "material": [ "cotton", "plastic" ], @@ -765,13 +1085,41 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 8, + "encumbrance": 10, "max_encumbrance": 50, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "40 L", "max_contains_weight": "60 kg", "moves": 300 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "10 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "3 kg", "moves": 120 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "40 L", + "max_contains_weight": "60 kg", + "max_item_length": "55 cm", + "magazine_well": "8 L", + "moves": 300 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "10 kg", + "max_item_length": "35 cm", + "magazine_well": "1 L", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "3 kg", + "max_item_length": "30 cm", + "magazine_well": "800 ml", + "moves": 120 + } ], "warmth": 8, "material_thickness": 2, @@ -782,7 +1130,7 @@ "type": "ARMOR", "name": { "str": "runner pack" }, "description": "The obvious choice for outdoor athletes, this ergonomic backpack is light and easy to wear, ensuring comfort when carrying heavy and bulky items.", - "weight": "840 g", + "weight": "300 g", "volume": "1500 ml", "price": 24000, "price_postapoc": 500, @@ -796,7 +1144,16 @@ "coverage": 20, "encumbrance": 1, "max_encumbrance": 6, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "7 L", "max_contains_weight": "14 kg", "moves": 250 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "7 L", + "max_contains_weight": "14 kg", + "max_item_length": "40 cm", + "magazine_well": "1 L", + "moves": 250 + } + ], "warmth": 2, "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -809,7 +1166,7 @@ "//": "Depends on if you're getting a cheap school version or something more like a range bag.", "description": "A simple single-sling backpack. Easier to access than a normal backpack, but can't comfortably hold as much.", "weight": "566 g", - "volume": "1500 ml", + "volume": "2100 ml", "price": 2900, "price_postapoc": 750, "bashing": 1, @@ -821,7 +1178,16 @@ "coverage": 30, "encumbrance": 2, "max_encumbrance": 9, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "8 L", "max_contains_weight": "16 kg", "moves": 200 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "8 L", + "max_contains_weight": "16 kg", + "max_item_length": "40 cm", + "magazine_well": "2 L", + "moves": 200 + } + ], "warmth": 2, "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -832,7 +1198,7 @@ "name": { "str": "straw basket" }, "description": "Hand made straw basket. Carry it with you for extra storage.", "weight": "100 g", - "volume": "2500 ml", + "volume": "10500 ml", "price": 200, "price_postapoc": 50, "to_hit": -1, @@ -842,9 +1208,17 @@ "color": "light_gray", "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 4, - "encumbrance": 21, - "max_encumbrance": 30, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "2250 ml", "max_contains_weight": "3 kg", "moves": 300 } ], + "encumbrance": 30, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "10 L", + "max_contains_weight": "3 kg", + "max_item_length": "40 cm", + "moves": 300 + } + ], "material_thickness": 2, "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, @@ -856,7 +1230,7 @@ "//": "You drag it along with you, so it taking a hit is Rare.", "description": "A huge wheeled suitcase used mainly for transporting clothes and other possessions during trips, provides a decent amount of storage but hauling it around is neither fast nor comfortable.", "weight": "5000 g", - "volume": "25 L", + "volume": "115500 ml", "price": 21000, "price_postapoc": 500, "material": [ "plastic" ], @@ -865,9 +1239,17 @@ "color": "red", "covers": [ "ARM_EITHER", "HAND_EITHER", "LEG_EITHER" ], "coverage": 5, - "encumbrance": 50, - "max_encumbrance": 100, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "20 L", "max_contains_weight": "80 kg", "moves": 300 } ], + "encumbrance": 70, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "110 L", + "max_contains_weight": "80 kg", + "max_item_length": "90 cm", + "moves": 300 + } + ], "material_thickness": 3, "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, @@ -876,20 +1258,28 @@ "repairs_like": "backpack_hiking", "type": "ARMOR", "name": { "str": "suitcase" }, - "description": "A mid-sized suitcase used mainly for transporting clothes and other possessions during trips, provides a decent amount of storage but hauling it around is not exactly comfortable.", - "weight": "900 g", - "volume": "2500 ml", + "description": "A mid-sized wheeled suitcase used mainly for transporting clothes and other possessions during trips, provides a decent amount of storage but hauling it around is not exactly comfortable.", + "weight": "3000 g", + "volume": "47250 ml", "price": 21000, "price_postapoc": 250, "material": [ "cotton" ], "symbol": "[", "looks_like": "briefcase", "color": "blue", - "covers": [ "ARM_EITHER", "HAND_EITHER" ], + "covers": [ "ARM_EITHER", "HAND_EITHER", "LEG_EITHER" ], "coverage": 5, - "encumbrance": 60, - "max_encumbrance": 100, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "10 L", "max_contains_weight": "40 kg", "moves": 250 } ], + "encumbrance": 50, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "rigid": true, + "max_contains_volume": "45 L", + "max_contains_weight": "40 kg", + "max_item_length": "70 cm", + "moves": 250 + } + ], "material_thickness": 3, "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, @@ -899,7 +1289,7 @@ "name": { "str": "survivor duffel bag" }, "description": "A custom-built heavy duffel bag. Durable and carefully crafted to hold as much stuff as possible.", "weight": "1000 g", - "volume": "7500 ml", + "volume": "7875 ml", "price": 24000, "price_postapoc": 3250, "material": [ "leather", "cotton" ], @@ -909,8 +1299,18 @@ "covers": [ "TORSO" ], "coverage": 40, "encumbrance": 8, - "max_encumbrance": 28, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "38 L", "max_contains_weight": "60 kg", "moves": 300 } ], + "max_encumbrance": 30, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "38 L", + "max_contains_weight": "60 kg", + "max_item_length": "60 cm", + "magazine_well": "7500 ml", + "moves": 300 + } + ], + "warmth": 10, "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] }, @@ -920,7 +1320,7 @@ "name": { "str": "survivor backpack" }, "description": "A custom-built backpack. Durable and carefully crafted to hold as much stuff as possible.", "weight": "600 g", - "volume": "2500 ml", + "volume": "5250 ml", "price": 24000, "price_postapoc": 2250, "material": [ "leather", "cotton" ], @@ -930,8 +1330,18 @@ "covers": [ "TORSO" ], "coverage": 30, "encumbrance": 3, - "max_encumbrance": 12, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "16 L", "max_contains_weight": "32 kg", "moves": 300 } ], + "max_encumbrance": 24, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "30 L", + "max_contains_weight": "32 kg", + "max_item_length": "50 cm", + "magazine_well": "5 L", + "moves": 300 + } + ], + "warmth": 6, "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -941,7 +1351,7 @@ "name": { "str": "survivor rucksack" }, "description": "A custom-built heavy backpack. Durable and carefully crafted to hold as much stuff as possible.", "weight": "800 g", - "volume": "5 L", + "volume": "10 L", "price": 24000, "price_postapoc": 3000, "material": [ "leather", "cotton" ], @@ -951,8 +1361,18 @@ "covers": [ "TORSO" ], "coverage": 40, "encumbrance": 3, - "max_encumbrance": 18, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "25 L", "max_contains_weight": "40 kg", "moves": 300 } ], + "max_encumbrance": 28, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "35 L", + "max_contains_weight": "40 kg", + "max_item_length": "55 cm", + "magazine_well": "6 L", + "moves": 300 + } + ], + "warmth": 8, "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] }, @@ -962,7 +1382,7 @@ "name": { "str": "survivor runner pack" }, "description": "A custom-built lightweight runner pack. Durable and carefully crafted to hold as much stuff as possible.", "weight": "440 g", - "volume": "1750 ml", + "volume": "4200 ml", "price": 24000, "price_postapoc": 2500, "material": [ "leather", "cotton" ], @@ -971,9 +1391,19 @@ "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 1, - "max_encumbrance": 6, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "8 L", "max_contains_weight": "16 kg", "moves": 250 } ], + "encumbrance": 3, + "max_encumbrance": 12, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "20 L", + "max_contains_weight": "16 kg", + "max_item_length": "40 cm", + "magazine_well": "4 L", + "moves": 250 + } + ], + "warmth": 2, "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -993,9 +1423,17 @@ "color": "brown", "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 5, - "encumbrance": 50, + "encumbrance": 4, "max_encumbrance": 100, - "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "15 L", "max_contains_weight": "30 kg", "moves": 300 } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "25 L", + "max_contains_weight": "30 kg", + "max_item_length": "60 cm", + "moves": 300 + } + ], "material_thickness": 1, "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, @@ -1005,7 +1443,7 @@ "name": { "str": "travelpack" }, "description": "A hiking pack used for short trips.", "weight": "636 g", - "volume": "3 L", + "volume": "5 L", "price": 7000, "price_postapoc": 1500, "material": [ "cotton" ], @@ -1017,10 +1455,38 @@ "encumbrance": 3, "max_encumbrance": 25, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "25 L", "max_contains_weight": "40 kg", "moves": 300 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "4 L", "max_contains_weight": "10 kg", "moves": 200 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "1 L", "max_contains_weight": "2 kg", "moves": 120 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "1 L", "max_contains_weight": "2 kg", "moves": 120 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "25 L", + "max_contains_weight": "40 kg", + "max_item_length": "50 cm", + "magazine_well": "4 L", + "moves": 300 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "4 L", + "max_contains_weight": "10 kg", + "max_item_length": "35 cm", + "magazine_well": "500 ml", + "moves": 200 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1 L", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "magazine_well": "200 ml", + "moves": 120 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1 L", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "magazine_well": "200 ml", + "moves": 120 + } ], "warmth": 8, "material_thickness": 2, @@ -1045,10 +1511,34 @@ "encumbrance": 2, "max_encumbrance": 5, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", "moves": 80 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "750 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "750 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "750 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "750 ml", + "max_contains_weight": "2 kg", + "max_item_length": "20 cm", + "moves": 80 + } ], "warmth": 5, "material_thickness": 2, diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index e00411cba2a05..4d3b7eaacc234 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -385,6 +385,14 @@ "covers": [ "TORSO", "ARMS", "LEGS" ], "coverage": 100, "encumbrance": 30, + "pocket_data": [ + { "pocket_type": "CONTAINER", "max_contains_volume": "8 L", "max_contains_weight": "16 kg", "moves": 150 }, + { "pocket_type": "CONTAINER", "max_contains_volume": "4 L", "max_contains_weight": "8 kg", "moves": 100 }, + { "pocket_type": "CONTAINER", "max_contains_volume": "4 L", "max_contains_weight": "8 kg", "moves": 100 }, + { "pocket_type": "CONTAINER", "max_contains_volume": "2 L", "max_contains_weight": "3 kg", "moves": 80 }, + { "pocket_type": "CONTAINER", "max_contains_volume": "1 L", "max_contains_weight": "2 kg", "moves": 80 }, + { "pocket_type": "CONTAINER", "max_contains_volume": "1 L", "max_contains_weight": "2 kg", "moves": 80 } + ], "warmth": 40, "material_thickness": 5, "valid_mods": [ "steel_padded" ], diff --git a/data/json/items/book/chemistry.json b/data/json/items/book/chemistry.json index fa29d746e9ecb..a60e354da1a3d 100644 --- a/data/json/items/book/chemistry.json +++ b/data/json/items/book/chemistry.json @@ -259,6 +259,7 @@ "price_postapoc": 2000, "bashing": 5, "material": [ "paper" ], + "ascii_picture": "textbook_chemistry", "symbol": "?", "color": "blue", "skill": "chemistry", diff --git a/data/json/items/book/firstaid.json b/data/json/items/book/firstaid.json index b2920e02f7acc..8409c02d90902 100644 --- a/data/json/items/book/firstaid.json +++ b/data/json/items/book/firstaid.json @@ -47,6 +47,7 @@ "price": 2500, "price_postapoc": 1250, "material": [ "paper" ], + "ascii_picture": "manual_first_aid", "symbol": "?", "color": "green", "skill": "firstaid", diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json index 773a1622778fa..5d0424d26f173 100644 --- a/data/json/items/book/misc.json +++ b/data/json/items/book/misc.json @@ -346,7 +346,7 @@ "name": "Love and Circuses", "description": "The passionate saga of two Boston politicians fiercely battling each other for the mayor's office, and for Lydia's hand in marriage.", "copy-from": "paperback_romance_spb", - "relative": { "chapters": 2, "weight": 111 } + "relative": { "chapters": 2, "weight": "111 g" } }, { "id": "paperback_romance_cloven", @@ -538,7 +538,7 @@ "description": "This lengthy paperback novel describes the ocean exploits of Captain Gosgold. The British consider him an outlaw, but in America he is a patriot.", "copy-from": "book_fict_soft_tpl", "time": "12 m", - "relative": { "weight": 186, "price": 250, "chapters": 8 } + "relative": { "weight": "186 g", "price": 250, "chapters": 8 } }, { "id": "book_fict_soft_swash_buccaneer", @@ -1084,6 +1084,6 @@ "name": { "str": "Glimpses of Solomon in Yellow", "str_pl": "copies of Solomon in Yellow" }, "description": "This paperback is titled \"Glimpses of Solomon in Yellow; The Initiation Rites of the Starry Wisdom Covenant, by Dr. Enoch Craven.\" It describes not just the investiture of new adherents, but the history and beliefs of the Church of Starry Wisdom. Someone has defaced the sparse citations section by scrawling \"PUPPETS OF ROME!\" over its few pages. The book does not provide any biography for Dr. Craven, let alone academic credentials.", "copy-from": "paperback_occult", - "relative": { "weight": 186, "price": 250, "chapters": 10 } + "relative": { "weight": "186 g", "price": 250, "chapters": 10 } } ] diff --git a/data/json/items/book/young.json b/data/json/items/book/young.json index a37af1c47962a..c64c08f194da2 100644 --- a/data/json/items/book/young.json +++ b/data/json/items/book/young.json @@ -132,7 +132,7 @@ "name": { "str": "The Adorkable Girl", "str_pl": "copies of Adorkable" }, "description": "When a therapist's daughter transfers to a new school, she decides to change her personality type. As her social life begins to blossom, can she maintain a healthy boundary between her home life and her public persona?", "copy-from": "book_fict_soft_ya_quiddity", - "relative": { "weight": -75, "chapters": -6 } + "relative": { "weight": "-75 g", "chapters": -6 } }, { "id": "book_fict_soft_ya_bjak", diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index adfcf09242462..3b83ab8d64e7a 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -1020,6 +1020,7 @@ "id": "pur_tablets", "name": "water purification tablet", "category": "chems", + "material": [ "powder" ], "weight": "1 g", "color": "white", "use_action": [ "WATER_PURIFIER" ], diff --git a/data/json/items/comestibles/bread.json b/data/json/items/comestibles/bread.json index 42f7197fd7c5d..5a4096e0fa027 100644 --- a/data/json/items/comestibles/bread.json +++ b/data/json/items/comestibles/bread.json @@ -37,10 +37,10 @@ "color": "white", "use_action": { "target": "sourdough_starter", - "msg": "After feeding it and caring for it for weeks, your sourdough starter is finally ready for the big leagues.", + "msg": "After feeding it and caring for it for a week, your sourdough starter is finally ready for the big leagues.", "moves": 50, "type": "delayed_transform", - "transform_age": 200000, + "transform_age": 518400, "not_ready_msg": "You've been caring for your starter for a while, but it's going to need longer before you can do anything tasty with it." } }, @@ -49,7 +49,7 @@ "type": "GENERIC", "category": "food", "name": { "str": "freshly fed sourdough starter" }, - "description": "This jar contains a floury paste with sourdough starter mixed in. It needs a few hours to recover its strength before it can be used again.", + "description": "This jar contains a floury paste with sourdough starter mixed in. It needs a day to recover its strength before it can be used again.", "weight": "52 g", "volume": "250 ml", "price": 10, @@ -64,7 +64,7 @@ "msg": "The starter is now stinky and bubbly, and looks ready for cooking.", "moves": 50, "type": "delayed_transform", - "transform_age": 180000, + "transform_age": 86400, "not_ready_msg": "The starter isn't quite ready to go." } }, diff --git a/data/json/items/comestibles/carnivore.json b/data/json/items/comestibles/carnivore.json index 7373949410ee3..6ae7a556bfbe9 100644 --- a/data/json/items/comestibles/carnivore.json +++ b/data/json/items/comestibles/carnivore.json @@ -570,7 +570,7 @@ "type": "COMESTIBLE", "id": "blood", "name": { "str_sp": "blood" }, - "weight": "265 g", + "weight": "262 g", "color": "red", "container": "bag_iv", "comestible_type": "DRINK", diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index 39ca8c3237680..85e121bfc4f10 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -98,6 +98,7 @@ "stim": 1, "quench": 34, "healthy": 1, + "calories": 9, "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, "price_postapoc": 25, @@ -146,7 +147,7 @@ "material": [ "milk", "water" ], "volume": "250 ml", "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT" ], "fun": 14 }, { @@ -159,6 +160,7 @@ "spoils_in": "10 days", "quench": 34, "healthy": 1, + "calories": 0, "description": "A healthy beverage made from chamomile flowers steeped in boiling water. Can be used to treat insomnia.", "price": 100, "price_postapoc": 25, @@ -384,14 +386,14 @@ "symbol": "~", "quench": 48, "healthy": 1, - "calories": 9, + "calories": 26, "description": "A healthy beverage made from dandelion roots steeped in boiling water.", "price": 50, "price_postapoc": 25, "volume": "250 ml", "material": [ "water" ], "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT" ], "fun": 2 }, { @@ -404,14 +406,14 @@ "symbol": "~", "quench": 48, "healthy": 2, - "calories": 12, + "calories": 77, "description": "A healthy beverage made from dandelion and burdock roots steeped in boiling water. The additional ingredient makes it slightly healthier and fun.", "price": 50, "price_postapoc": 25, "volume": "250 ml", "material": [ "water" ], "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT" ], "fun": 3 }, { @@ -499,9 +501,8 @@ "volume": "250 ml", "material": [ "water" ], "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], - "fun": 4, - "vitamins": [ [ "iron", 1 ] ] + "flags": [ "EATEN_HOT" ], + "fun": 4 }, { "id": "hot_chocolate", @@ -630,6 +631,7 @@ "spoils_in": "10 days", "quench": 34, "healthy": 1, + "calories": 0, "description": "A healthy beverage made from lotus flowers steeped in boiling water.", "price": 100, "price_postapoc": 25, @@ -911,6 +913,7 @@ "spoils_in": "10 days", "quench": 34, "healthy": 1, + "calories": 0, "description": "A healthy beverage made from spurge flowers steeped in boiling water. Can be used to prevent asthma attacks.", "price": 100, "price_postapoc": 25, @@ -975,7 +978,7 @@ "volume": "250 ml", "material": [ "water" ], "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT" ], "fun": 6 }, { @@ -995,7 +998,7 @@ "volume": "500 ml", "material": [ "water" ], "phase": "liquid", - "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], + "flags": [ "EATEN_HOT" ], "fun": -5 }, { @@ -1059,7 +1062,7 @@ "name": "fruit tea", "copy-from": "tea", "color": "red", - "calories": 6, + "calories": 0, "fatigue_mod": 0, "stim": 0, "description": "A tasty beverage made with herbs and dried fruit from plants other than the tea plant. While colloquially called 'tea', technically it's an infusion.", diff --git a/data/json/items/comestibles/junkfood.json b/data/json/items/comestibles/junkfood.json index 4d518506e6ac4..66c977aa4a166 100644 --- a/data/json/items/comestibles/junkfood.json +++ b/data/json/items/comestibles/junkfood.json @@ -187,7 +187,7 @@ "price": 200, "price_postapoc": 350, "material": [ "wheat", "junk" ], - "volume": "500 ml", + "volume": "300 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 3, "fun": 6 @@ -268,7 +268,7 @@ "price": 180, "price_postapoc": 150, "material": [ "junk" ], - "volume": "250 ml", + "volume": "90 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 3, "fun": 4 @@ -289,7 +289,7 @@ "price": 180, "price_postapoc": 400, "material": [ "junk" ], - "volume": "250 ml", + "volume": "90 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 3, "vitamins": [ [ "iron", 9 ] ], @@ -311,7 +311,7 @@ "price": 180, "price_postapoc": 200, "material": [ "junk" ], - "volume": "250 ml", + "volume": "90 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 3, "fun": 3 @@ -598,7 +598,7 @@ "price": 130, "price_postapoc": 100, "material": [ "junk" ], - "volume": "250 ml", + "volume": "90 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 3, "fun": 4 @@ -607,19 +607,19 @@ "type": "COMESTIBLE", "id": "sugar_fried", "name": { "str_sp": "caramel" }, - "weight": "67 g", + "weight": "77 g", "color": "white", "container": "box_small", "comestible_type": "FOOD", "symbol": "%", "quench": -2, "healthy": -2, - "calories": 257, + "calories": 267, "description": "Some caramel. Still bad for your health.", "price": 150, "price_postapoc": 500, "material": [ "junk" ], - "volume": "250 ml", + "volume": "150 ml", "charges": 5, "vitamins": [ [ "calcium", 9 ], [ "vitB", 8 ] ], "fun": 2 @@ -650,14 +650,14 @@ "type": "COMESTIBLE", "id": "nachos", "name": { "str_sp": "tortilla chips" }, - "weight": "80 g", + "weight": "60 g", "color": "yellow", "spoils_in": "30 days", "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "calories": 280, + "calories": 260, "description": "Salted chips made from corn tortillas, could really use some cheese, maybe some beef.", "price": 170, "price_postapoc": 150, @@ -671,7 +671,7 @@ "type": "COMESTIBLE", "id": "nachosc", "name": { "str_sp": "cheese nachos" }, - "weight": "85 g", + "weight": "95 g", "color": "yellow", "spoils_in": "1 day", "container": "bag_plastic", @@ -683,7 +683,7 @@ "price": 250, "price_postapoc": 200, "material": [ "junk", "milk" ], - "primary_material": "wheat", + "primary_material": "processed_food", "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 16, @@ -698,20 +698,20 @@ { "type": "FLAG", "condition": "STRICT_HUMANITARIANISM", "name": { "str_sp": "nibelung nachos" } }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "nachos con chupacabra" } } ], - "weight": "125 g", + "weight": "110 g", "color": "yellow", "spoils_in": "1 day", "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "calories": 226, + "calories": 280, "description": "Salted chips made from corn tortillas, now with meat. Could probably use some cheese, though.", "price": 250, "price_postapoc": 600, "material": [ "junk", "flesh" ], - "volume": "750 ml", - "charges": 3, + "primary_material": "processed_food", + "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 16, "vitamins": [ [ "vitC", 5 ], [ "calcium", 2 ], [ "iron", 24 ], [ "vitB", 259 ] ] @@ -725,24 +725,67 @@ { "type": "FLAG", "condition": "STRICT_HUMANITARIANISM", "name": { "str_sp": "nibelung nachos with cheese" } }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "cheese and chupacabra nachos" } } ], - "weight": "22 g", + "weight": "140 g", "color": "yellow", "spoils_in": "20 hours", "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "calories": 495, + "calories": 424, "description": "Salted chips made from corn tortillas with ground meat and smothered in cheese. Delicious.", "price": 300, "price_postapoc": 500, "material": [ "flesh", "milk", "junk" ], "primary_material": "processed_food", - "volume": "500 ml", + "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 20, "vitamins": [ [ "vitA", 10 ], [ "calcium", 10 ], [ "iron", 12 ], [ "vitB", 29 ] ] }, + { + "type": "COMESTIBLE", + "id": "nachosv", + "copy-from": "nachos", + "name": "vegetarian nachos", + "symbol": "%", + "color": "yellow", + "calories": 228, + "description": "Salted chips made from corn tortillas, now with beans. Could probably use some cheese, though.", + "price": 250, + "weight": "125 g", + "spoils_in": "1 day", + "price_postapoc": 600, + "container": "bag_plastic", + "material": [ "junk", "veggy" ], + "volume": "750 ml", + "charges": 3, + "flags": [ "EATEN_HOT" ], + "fun": 16, + "vitamins": [ [ "calcium", 8 ], [ "iron", 17 ] ] + }, + { + "type": "COMESTIBLE", + "id": "nachosvc", + "copy-from": "nachos", + "name": "vegetarian nachos with cheese", + "weight": "22 g", + "color": "yellow", + "spoils_in": "20 hours", + "container": "bag_plastic", + "symbol": "%", + "charges": 3, + "calories": 402, + "description": "Salted chips made from corn tortillas with beans and smothered in cheese. Delicious, even if you're not a vegetarian.", + "price": 300, + "price_postapoc": 500, + "material": [ "veggy", "milk", "junk" ], + "primary_material": "processed_food", + "volume": "500 ml", + "flags": [ "EATEN_HOT" ], + "fun": 20, + "vitamins": [ [ "vitA", 2 ], [ "calcium", 13 ], [ "iron", 17 ] ] + }, { "type": "COMESTIBLE", "id": "porkstick", @@ -868,7 +911,7 @@ "price": 900, "price_postapoc": 150, "material": [ "flesh", "junk", "wheat" ], - "volume": "500 ml", + "volume": "400 ml", "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 15, @@ -1068,7 +1111,7 @@ "price": 800, "price_postapoc": 350, "material": [ "flesh", "junk", "wheat" ], - "volume": "500 ml", + "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 12, "vitamins": [ [ "vitC", 85 ], [ "calcium", 22 ], [ "iron", 15 ] ] @@ -1091,7 +1134,7 @@ "price_postapoc": 300, "material": [ "junk", "milk" ], "primary_material": "processed_food", - "volume": "500 ml", + "volume": "200 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 4, "vitamins": [ [ "calcium", 4 ] ], diff --git a/data/json/items/comestibles/meat_dishes.json b/data/json/items/comestibles/meat_dishes.json index 32b65c4d1721a..65f8206049028 100644 --- a/data/json/items/comestibles/meat_dishes.json +++ b/data/json/items/comestibles/meat_dishes.json @@ -102,9 +102,9 @@ "calories": 297, "description": "A type of German sausage made of finely chopped meat and meant to be pan fried or roasted. Better eat it hot and fresh.", "price": 1800, - "price_postapoc": 1500, + "volume": "1500 ml", + "//": "volume and weight for a roughly 25cm length, 2.5cm diameter link, estimated", "material": [ "flesh" ], - "volume": "500 ml", "charges": 10, "flags": [ "EATEN_HOT" ], "fun": 5 @@ -143,9 +143,10 @@ "calories": 398, "description": "A thick slab of salty cured bacon. Shelf stable, precooked and ready-to-eat, it tastes better when reheated.", "price": 1900, + "volume": "100 ml", + "//": "I am not sure how much a 'charge' is meant to be, but a slice is around 10mL displacement volume, with a weight of 8g and about 40kcal. Based this on that.", "price_postapoc": 500, "material": [ "flesh" ], - "volume": "250 ml", "charges": 2, "flags": [ "EATEN_HOT" ], "vitamins": [ [ "calcium", 1 ], [ "iron", 5 ], [ "vitB", 39 ] ], @@ -190,9 +191,9 @@ "calories": 270, "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, + "volume": "100 ml", "price_postapoc": 500, "material": [ "flesh" ], - "volume": "250 ml", "charges": 4, "flags": [ "EATEN_HOT" ], "fun": 4 @@ -444,7 +445,7 @@ "id": "debug_nutrition", "copy-from": "can_spam", "name": { "str": "holy SPAM of debugging", "str_pl": "holy SPAMs of debugging" }, - "calories": 2100, + "calories": 2150, "description": "A mysterious lump of SPAM that contains just enough calories and vitamins to feed you for a day. For debug use only.", "//": "This is used for the all_nutrient_starve_test.", "vitamins": [ [ "vitA", 96 ], [ "vitB", 96 ], [ "vitC", 96 ], [ "calcium", 96 ], [ "iron", 96 ] ] @@ -520,7 +521,7 @@ "price": 600, "price_postapoc": 350, "material": [ "flesh", "veggy" ], - "volume": "250 ml", + "volume": "120 ml", "vitamins": [ [ "vitC", 3 ], [ "calcium", 24 ], [ "iron", 14 ] ], "fun": 3 }, @@ -1026,7 +1027,7 @@ { "type": "FLAG", "condition": "STRICT_HUMANITARIANISM", "name": { "str_sp": "elf %s" } }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "chilling %s" } } ], - "weight": "133 g", + "weight": "333 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -1038,7 +1039,7 @@ "price_postapoc": 250, "material": [ "flesh", "wheat", "milk" ], "primary_material": "processed_food", - "volume": "500 ml", + "volume": "300 ml", "flags": [ "EATEN_HOT", "ALLERGEN_MILK" ], "fun": 5, "vitamins": [ [ "calcium", 9 ], [ "iron", 14 ] ] @@ -1052,7 +1053,7 @@ { "type": "FLAG", "condition": "STRICT_HUMANITARIANISM", "name": { "str_sp": "Moreauburger" } }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "horrible %s" } } ], - "weight": "99 g", + "weight": "300 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -1063,7 +1064,7 @@ "price": 900, "price_postapoc": 200, "material": [ "flesh", "wheat" ], - "volume": "500 ml", + "volume": "300 ml", "flags": [ "EATEN_HOT" ], "fun": 4, "vitamins": [ [ "vitC", 2 ], [ "calcium", 8 ], [ "iron", 16 ] ] @@ -1081,7 +1082,7 @@ }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "suspicious %s" } } ], - "weight": "113 g", + "weight": "313 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -1092,7 +1093,7 @@ "price": 900, "price_postapoc": 250, "material": [ "flesh", "tomato", "wheat" ], - "volume": "500 ml", + "volume": "300 ml", "flags": [ "EATEN_HOT" ], "fun": 4, "vitamins": [ [ "vitC", 5 ], [ "calcium", 4 ], [ "iron", 5 ] ] diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json index 36ccd8e75e7c6..b65fc0df3abf6 100644 --- a/data/json/items/comestibles/med.json +++ b/data/json/items/comestibles/med.json @@ -4,12 +4,29 @@ "type": "GENERIC", "category": "drugs", "name": { "str": "first aid kit" }, - "description": "A full medical kit, with bandages, local anesthetics, and rapid healing agents. Used for healing large amounts of damage. Disassemble to get its content.", + "description": "A typical universal first aid kit, one you'd see in a car or in a household. It contains a variety of common medical items stored in case of accidents and injuries. Disassemble to get its content.", + "weight": "1750 g", + "volume": "1250 ml", + "price": 3000, + "price_postapoc": 3000, + "material": "plastic", + "symbol": "!", + "color": "red", + "use_action": "DISASSEMBLE", + "flags": [ "NO_REPAIR" ] + }, + { + "id": "ifak", + "type": "GENERIC", + "category": "drugs", + "name": { "str": "IFAK" }, + "description": "An IFAK, or individual first aid kit, is a specialized set of wound dressings and accessories, and being of military origin focuses on combat trauma and preventing blood loss. Disassemble to get its content.", "weight": "1750 g", "volume": "1250 ml", "price": 3000, "price_postapoc": 3000, "material": [ "plastic" ], + "ascii_picture": "1st_aid", "symbol": "!", "color": "red", "use_action": [ "DISASSEMBLE" ], @@ -56,6 +73,23 @@ "flags": [ "NPC_SAFE", "IRREPLACEABLE_CONSUMABLE" ], "use_action": { "type": "consume_drug", "activation_message": "You take some adderall." } }, + { + "id": "adhesive_bandages", + "type": "COMESTIBLE", + "comestible_type": "MED", + "name": { "str": "adhesive bandage" }, + "description": "A set of small medical dressings, each made of a piece of sterile cloth and a sticky tape, used for small injuries not serious enough to require a full-size bandage.", + "weight": "40 g", + "volume": "150 ml", + "price": 600, + "price_postapoc": 200, + "material": "cotton", + "symbol": "!", + "color": "white", + "charges": 10, + "flags": [ "NO_INGEST" ], + "use_action": { "type": "heal", "bandages_power": 1, "bleed": 4, "move_cost": 200 } + }, { "id": "adrenaline_injector", "type": "COMESTIBLE", @@ -153,7 +187,7 @@ "type": "COMESTIBLE", "comestible_type": "MED", "name": { "str": "bandage" }, - "description": "Simple cloth bandages. Used for healing small amounts of damage.", + "description": "Simple cloth bandages. Used for stopping bloodloss and protecting wounds from external factors.", "weight": "70 g", "volume": "250 ml", "price": 600, @@ -164,7 +198,7 @@ "charges": 3, "stack_size": 9, "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 4, "bleed": 0.9, "move_cost": 300 } + "use_action": { "type": "heal", "bandages_power": 4, "bleed": 15, "move_cost": 300 } }, { "id": "bandages_makeshift", @@ -173,8 +207,8 @@ "copy-from": "bandages", "description": "Simple cloth bandages. Better than nothing.", "price_postapoc": 100, - "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 2, "bleed": 0.9, "move_cost": 300 } + "flags": [ "NO_INGEST", "BLIND_EASY" ], + "use_action": { "type": "heal", "bandages_power": 2, "bleed": 10, "move_cost": 300 } }, { "id": "bandages_makeshift_bleached", @@ -184,7 +218,7 @@ "description": "Simple cloth bandages. It is white, as real bandages should be.", "price_postapoc": 150, "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 3, "bleed": 0.9, "move_cost": 300 } + "use_action": { "type": "heal", "bandages_power": 3, "bleed": 10, "move_cost": 300 } }, { "id": "bandages_makeshift_boiled", @@ -194,7 +228,7 @@ "description": "Simple cloth bandages. It was boiled to make it more sterile.", "price_postapoc": 150, "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 3, "bleed": 0.9, "move_cost": 300 } + "use_action": { "type": "heal", "bandages_power": 3, "bleed": 10, "move_cost": 300 } }, { "id": "bfipowder", @@ -470,7 +504,7 @@ "color": "white", "container": "bag_plastic", "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 2, "bleed": 0.9, "move_cost": 300 } + "use_action": { "type": "heal", "bandages_power": 2, "bleed": 3, "move_cost": 300 } }, { "id": "crack", @@ -1155,7 +1189,7 @@ "symbol": ",", "color": "white", "flags": [ "NO_INGEST" ], - "use_action": { "type": "heal", "bandages_power": 4, "bleed": 0.5, "move_cost": 200 } + "use_action": { "type": "heal", "bandages_power": 4, "bleed": 5, "move_cost": 200 } }, { "id": "meth", @@ -1444,7 +1478,7 @@ "color": "light_gray", "container": "bag_plastic", "flags": [ "NO_INGEST", "IRREPLACEABLE_CONSUMABLE" ], - "use_action": { "type": "heal", "bleed": 0.9, "move_cost": 100 } + "use_action": { "type": "heal", "bleed": 20, "move_cost": 100 } }, { "id": "saline", diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index 2bbdfbf5befa5..9fca8a82ad007 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -647,8 +647,8 @@ "id": "dogfood", "type": "COMESTIBLE", "comestible_type": "FOOD", - "name": { "str_sp": "dog food" }, - "description": "This is food for dogs. It smells strange, but dogs seem to love it.", + "name": { "str_sp": "wet dog food" }, + "description": "This is wet food for dogs, made from canned fresh meats. It smells strange, but dogs seem to love it.", "weight": "554 g", "spoils_in": "1 day", "container": "can_medium", @@ -667,12 +667,36 @@ "flags": [ "LUPINE" ], "use_action": [ "DOGFOOD" ] }, + { + "id": "dogfood_dry", + "type": "COMESTIBLE", + "comestible_type": "FOOD", + "name": { "str_sp": "dry dog food" }, + "description": "Dry morsels of dog food with a long shelf life. Made from dried processed meats and grains, and enriched with vitamins and minerals.", + "weight": "100 g", + "spoils_in": "90 days", + "container": "bag_plastic", + "volume": "250 ml", + "price": 300, + "price_postapoc": 400, + "to_hit": -5, + "material": [ "flesh" ], + "symbol": ";", + "healthy": 1, + "quench": -1, + "calories": 380, + "vitamins": [ [ "vitA", 25 ], [ "iron", 25 ], [ "vitB", 20 ], [ "calcium", 30 ] ], + "fun": -15, + "color": "brown", + "flags": [ "LUPINE" ], + "use_action": [ "DOGFOOD" ] + }, { "id": "catfood", "type": "COMESTIBLE", "comestible_type": "FOOD", - "name": { "str_sp": "cat food" }, - "description": "This is food for cats. It smells strange, but cats seem to love it.", + "name": { "str_sp": "wet cat food" }, + "description": "This is wet food for cats, made from canned fresh meats. It has a pungent aroma that cats seem to love.", "weight": "223 g", "spoils_in": "1 day", "container": "can_food", @@ -691,6 +715,30 @@ "flags": [ "FELINE" ], "use_action": [ "CATFOOD" ] }, + { + "id": "catfood_dry", + "type": "COMESTIBLE", + "comestible_type": "FOOD", + "name": { "str_sp": "dry cat food" }, + "description": "Dry kibbles of cat food with a long shelf life. Made from dried processed meats and grains, and enriched with vitamins and minerals.", + "weight": "100 g", + "spoils_in": "90 days", + "container": "bag_plastic", + "volume": "250 ml", + "price": 300, + "price_postapoc": 400, + "to_hit": -5, + "material": [ "flesh" ], + "symbol": ";", + "healthy": 1, + "quench": -1, + "calories": 380, + "vitamins": [ [ "vitA", 25 ], [ "iron", 25 ], [ "vitB", 20 ], [ "calcium", 30 ] ], + "fun": -15, + "color": "brown", + "flags": [ "FELINE" ], + "use_action": [ "CATFOOD" ] + }, { "type": "COMESTIBLE", "id": "grass", diff --git a/data/json/items/comestibles/sandwich.json b/data/json/items/comestibles/sandwich.json index 44f094f043164..3f1094f15ee90 100644 --- a/data/json/items/comestibles/sandwich.json +++ b/data/json/items/comestibles/sandwich.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "sandwich_cheese_grilled", "name": { "str": "grilled cheese sandwich", "str_pl": "grilled cheese sandwiches" }, - "weight": "106 g", + "weight": "156 g", "color": "brown", "spoils_in": "1 day 10 hours", "container": "wrapper", @@ -46,7 +46,7 @@ "price_postapoc": 300, "material": [ "flesh", "veggy", "wheat", "milk" ], "primary_material": "processed_food", - "volume": "1500 ml", + "volume": "250 ml", "charges": 2, "fun": 12, "vitamins": [ [ "vitA", 8 ], [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ], [ "vitB", 389 ] ] @@ -55,18 +55,18 @@ "type": "COMESTIBLE", "id": "sandwich_cucumber", "name": { "str": "cucumber sandwich", "str_pl": "cucumber sandwiches" }, - "weight": "500 g", + "weight": "120 g", "color": "light_green", "spoils_in": "1 day 12 hours", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "quench": 2, + "quench": 6, "healthy": 1, - "calories": 516, + "calories": 227, "description": "A refreshing cucumber sandwich. Not very filling, but quite tasty.", - "price": 250, - "volume": "1250 ml", + "price": 400, + "volume": "250 ml", "material": [ "wheat", "veggy" ], "flags": [ "EATEN_COLD" ], "fun": 8, @@ -88,7 +88,7 @@ "price_postapoc": 200, "material": [ "milk", "wheat" ], "primary_material": "wheat", - "volume": "500 ml", + "volume": "250 ml", "fun": 8, "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] }, @@ -96,7 +96,7 @@ "type": "COMESTIBLE", "id": "sandwich_jam", "name": { "str": "jam sandwich", "str_pl": "jam sandwiches" }, - "weight": "97 g", + "weight": "140 g", "color": "brown", "spoils_in": "1 day 13 hours", "container": "wrapper", @@ -109,7 +109,7 @@ "price_postapoc": 200, "material": [ "fruit", "wheat" ], "primary_material": "wheat", - "volume": "500 ml", + "volume": "250 ml", "fun": 15, "vitamins": [ [ "vitC", 6 ], [ "calcium", 7 ], [ "iron", 12 ] ] }, @@ -117,26 +117,26 @@ "type": "COMESTIBLE", "id": "sandwich_fairy", "name": { "str_sp": "fairy bread" }, - "weight": "114 g", + "weight": "56 g", "color": "brown", "spoils_in": "3 days", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "calories": 640, + "calories": 220, "description": "An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-to-crust slathering of butter, and sprinkles. Supposedly a staple of birthday parties in Australia.", "price": 85, "price_postapoc": 300, "material": [ "junk", "wheat" ], "primary_material": "wheat", - "volume": "250 ml", + "volume": "120 ml", "fun": 10 }, { "type": "COMESTIBLE", "id": "sandwich_honey", "name": { "str": "honey sandwich", "str_pl": "honey sandwiches" }, - "weight": "192 g", + "weight": "142 g", "color": "brown", "spoils_in": "10 days", "container": "wrapper", @@ -144,13 +144,13 @@ "symbol": "%", "quench": 1, "healthy": 1, - "calories": 535, + "calories": 328, "description": "A delicious honey sandwich.", "price": 500, "price_postapoc": 300, "material": [ "honey", "wheat" ], "primary_material": "wheat", - "volume": "500 ml", + "volume": "250 ml", "fun": 10, "vitamins": [ [ "calcium", 10 ], [ "iron", 24 ] ] }, @@ -173,7 +173,7 @@ "type": "COMESTIBLE", "id": "sandwich_veggy", "name": { "str": "vegetable sandwich", "str_pl": "vegetable sandwiches" }, - "weight": "289 g", + "weight": "189 g", "color": "light_gray", "spoils_in": "2 days", "container": "wrapper", @@ -181,12 +181,12 @@ "symbol": "%", "quench": 1, "healthy": 1, - "calories": 502, + "calories": 202, "description": "Bread and vegetables, that's it.", "price": 800, "price_postapoc": 250, "material": [ "veggy", "wheat" ], - "volume": "750 ml", + "volume": "250 ml", "flags": [ "EATEN_COLD" ], "fun": 1, "vitamins": [ [ "vitA", 16 ], [ "vitC", 36 ], [ "calcium", 14 ], [ "iron", 28 ] ] @@ -204,7 +204,7 @@ }, { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "mutant %s" } } ], - "weight": "233 g", + "weight": "203 g", "color": "light_gray", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -215,7 +215,7 @@ "price": 900, "price_postapoc": 250, "material": [ "flesh", "wheat" ], - "volume": "1 L", + "volume": "300 ml", "charges": 2, "fun": 2, "vitamins": [ [ "vitC", 8 ], [ "calcium", 6 ], [ "iron", 47 ], [ "vitB", 389 ] ] @@ -230,8 +230,8 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "quench": -10, - "calories": 658, + "quench": -1, + "calories": 358, "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, "price_postapoc": 300, @@ -244,13 +244,13 @@ "type": "COMESTIBLE", "id": "sandwich_pbj", "name": { "str": "PB&J sandwich", "str_pl": "PB&J sandwiches" }, - "weight": "102 g", + "weight": "204 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "quench": 8, + "quench": 2, "calories": 378, "description": "A delicious peanut butter and jelly sandwich. It reminds you of the times your mother would make you lunch.", "price": 175, @@ -265,13 +265,13 @@ "type": "COMESTIBLE", "id": "sandwich_pbh", "name": { "str": "PB&H sandwich", "str_pl": "PB&H sandwiches" }, - "weight": "97 g", + "weight": "207 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "quench": 8, + "quench": 2, "calories": 365, "description": "Some damned fool put honey on this peanut butter sandwich, who in their right mind- oh wait this is pretty good.", "price": 175, @@ -286,14 +286,14 @@ "type": "COMESTIBLE", "id": "sandwich_pbm", "name": { "str": "PB&M sandwich", "str_pl": "PB&M sandwiches" }, - "weight": "225 g", + "weight": "205 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "quench": 8, - "calories": 712, + "quench": 2, + "calories": 365, "description": "Who knew you could mix maple syrup and peanut butter to create yet another different sandwich?", "price": 175, "price_postapoc": 175, @@ -317,7 +317,7 @@ "price": 800, "price_postapoc": 250, "material": [ "flesh", "wheat" ], - "volume": "750 ml", + "volume": "250 ml", "fun": 14, "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 19 ], [ "iron", 17 ] ] }, @@ -325,18 +325,18 @@ "type": "COMESTIBLE", "id": "fish_bagel", "name": { "str": "fish and spinach bagel" }, - "weight": "201 g", + "weight": "251 g", "color": "magenta", "spoils_in": "1 day", "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "calories": 700, + "calories": 694, "description": "A delicious fish bagel with spinach and eggs.", "price": 800, "price_postapoc": 350, "material": [ "flesh", "wheat" ], - "volume": "750 ml", + "volume": "250 ml", "fun": 14, "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 12 ], [ "iron", 24 ] ] }, @@ -357,10 +357,10 @@ "price_postapoc": 250, "material": [ "flesh", "veggy", "wheat", "tomato" ], "primary_material": "processed_food", - "volume": "1 L", + "volume": "250 ml", "charges": 2, "flags": [ "EATEN_HOT" ], - "fun": 5, + "fun": 8, "vitamins": [ [ "vitA", 8 ], [ "vitC", 10 ], [ "calcium", 7 ], [ "iron", 18 ], [ "vitB", 20 ] ] } ] diff --git a/data/json/items/comestibles/veggy_dishes.json b/data/json/items/comestibles/veggy_dishes.json index a21d87f3eaecb..8badc03dbe885 100644 --- a/data/json/items/comestibles/veggy_dishes.json +++ b/data/json/items/comestibles/veggy_dishes.json @@ -224,7 +224,8 @@ "type": "COMESTIBLE", "id": "deluxe_veggy_beans", "name": { "str_sp": "vegetarian baked beans" }, - "weight": "270 g", + "weight": "350 g", + "//": "real world measurements: 250ml of cooked beans is 240g with 316 calores, and 250ml of veggies is ~100g with ~100 calories", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -237,7 +238,6 @@ "price_postapoc": 100, "material": [ "veggy", "bean" ], "volume": "500 ml", - "//": "one beans + one veggy", "flags": [ "EATEN_HOT" ], "fun": 4 }, @@ -245,14 +245,15 @@ "type": "COMESTIBLE", "id": "dry_rice", "name": { "str_sp": "dried rice" }, - "weight": "40 g", + "weight": "200 g", + "//": "real world measurements: 250ml of dry rice weighs 200g and has 720 calories", "color": "white", "spoils_in": "360 days", "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", "quench": -6, - "calories": 222, + "calories": 720, "description": "Dehydrated long-grain rice. Tasty and nutritious when cooked, virtually inedible when dry.", "price": 500, "price_postapoc": 300, @@ -270,17 +271,17 @@ "id": "rice_cooked", "name": { "str_sp": "cooked rice" }, "copy-from": "dry_rice", - "weight": "62 g", + "//": "real world measurements: 250ml of cooked rice weighs 200g and has 260 calores, rice roughly triples when cooked", "color": "light_gray", "spoils_in": "10 days", "quench": 0, + "calories": 260, "healthy": 1, "description": "A hearty serving of cooked long-grain white rice.", "price": 100, "price_postapoc": 50, "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 2, - "//": "rice triples in size when cooked", "charges": 1, "vitamins": [ [ "vitA", 1 ], [ "iron", 11 ] ] }, @@ -288,7 +289,8 @@ "type": "COMESTIBLE", "id": "deluxe_veggy_rice", "name": { "str_sp": "fried rice" }, - "weight": "135 g", + "weight": "300 g", + "//": "real world measurements: 250ml cooked rice is 200g with 260 calores, 250mL of veggies is ~100g with ~100 calories", "color": "yellow", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -299,7 +301,7 @@ "price": 700, "price_postapoc": 150, "material": [ "veggy" ], - "volume": "250 ml", + "volume": "500 ml", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, "vitamins": [ [ "vitA", 2 ], [ "vitC", 4 ], [ "calcium", 3 ], [ "iron", 3 ] ] @@ -308,18 +310,19 @@ "type": "COMESTIBLE", "id": "beansnrice", "name": { "str_sp": "beans and rice" }, - "weight": "70 g", + "weight": "440 g", + "//": "real world measurements: 250ml of cooked beans weighs 240g wiht 316 calories, 250ml of cooked rice weighs 200g with 260 calories", "color": "light_gray", "spoils_in": "10 days", "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "calories": 425, + "calories": 566, "description": "A serving of beans and rice that has been cooked together. Delicious and healthy!", "price": 500, "price_postapoc": 150, "material": [ "veggy", "bean" ], - "volume": "250 ml", + "volume": "500 ml", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 2, "vitamins": [ [ "vitC", 14 ], [ "calcium", 4 ], [ "iron", 16 ] ] @@ -369,19 +372,19 @@ "type": "COMESTIBLE", "id": "deluxe_veggy_beansnrice", "name": { "str_sp": "deluxe vegetarian beans and rice" }, - "weight": "140 g", + "weight": "540 g", + "//": "real world measurements: 250 mL of cooked beans is 240g w 316 calories, 250ml cooked rice is 200g w 260 calories, and 250mL of veggies is ~100g w ~100 calories", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "calories": 459, + "calories": 600, "description": "Slow-cooked beans and rice with vegetables and seasonings. Tasty and very filling.", "price": 750, "price_postapoc": 200, "material": [ "veggy", "bean" ], "volume": "750 ml", - "//": "one bean + one rice + one veggy", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, "vitamins": [ [ "vitC", 28 ], [ "calcium", 8 ], [ "iron", 32 ] ] @@ -716,7 +719,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "calories": 200, + "calories": 267, "description": "A serving of sticky vinegared rice commonly used in sushi.", "price": 100, "price_postapoc": 400, diff --git a/data/json/items/containers.json b/data/json/items/containers.json index 9046b973bad10..840185e6f264c 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -6,7 +6,7 @@ "name": { "str": "2.5L canteen" }, "description": "A large plastic water canteen, with a 2.5 liter capacity and carrying strap.", "weight": "155 g", - "volume": "2500 ml", + "volume": "2625 ml", "price": 1000, "price_postapoc": 50, "to_hit": -1, @@ -34,7 +34,7 @@ "name": { "str": "30 gallon barrel" }, "description": "A huge plastic barrel with a resealable lid.", "weight": "6800 g", - "volume": "112500 ml", + "volume": "118125 ml", "price": 5000, "price_postapoc": 250, "to_hit": -5, @@ -60,7 +60,7 @@ "name": { "str": "steel drum (100L)", "str_pl": "steel drums (100L)" }, "description": "A huge steel barrel with a resealable lid.", "weight": "12000 g", - "volume": "100 L", + "volume": "105 L", "price": 8000, "price_postapoc": 250, "to_hit": -5, @@ -86,7 +86,7 @@ "name": { "str": "steel drum (200L)", "str_pl": "steel drums (200L)" }, "description": "A massive steel barrel with a resealable lid.", "weight": "20000 g", - "volume": "200 L", + "volume": "210 L", "price": 10000, "price_postapoc": 250, "to_hit": -5, @@ -194,8 +194,9 @@ "name": { "str": "body bag" }, "looks_like": "bag_canvas", "description": "A large, human size, rectangular bag made of strong plastic, with a zipper in the middle. Used to hold a dead body.", - "weight": "500 g", + "weight": "1500 g", "volume": "1 L", + "longest_side": "40 cm", "price": 0, "price_postapoc": 10, "to_hit": -5, @@ -207,6 +208,7 @@ "watertight": true, "max_contains_volume": "100 L", "max_contains_weight": "100 kg", + "max_item_length": "200 cm", "moves": 400 } ], @@ -246,7 +248,7 @@ "name": { "str": "glass bottle" }, "description": "A resealable glass bottle, holds 750 ml of liquid.", "weight": "200 g", - "volume": "750 ml", + "volume": "787 ml", "price": 0, "price_postapoc": 10, "to_hit": 1, @@ -302,7 +304,7 @@ "name": { "str": "condiment bottle" }, "description": "An inverted plastic bottle for condiments. Still sealed from factory, preserves content from rot until opened.", "weight": "19 g", - "volume": "500 ml", + "volume": "525 ml", "pocket_data": [ { "pocket_type": "CONTAINER", @@ -330,7 +332,7 @@ "name": { "str": "condiment bottle" }, "description": "An inverted plastic bottle for condiments.", "weight": "19 g", - "volume": "500 ml", + "volume": "525 ml", "pocket_data": [ { "pocket_type": "CONTAINER", @@ -437,6 +439,7 @@ "price": 0, "price_postapoc": 0, "material": [ "paper" ], + "ascii_picture": "box_cigarette", "symbol": ")", "color": "white", "pocket_data": [ { "pocket_type": "CONTAINER", "rigid": true, "max_contains_volume": "250 ml", "max_contains_weight": "3 kg" } ] @@ -449,7 +452,7 @@ "description": "A small cardboard box. No bigger than a foot in dimension.", "weight": "151 g", "volume": "1 L", - "pocket_data": [ { "pocket_type": "CONTAINER", "rigid": false, "max_contains_volume": "990 ml", "max_contains_weight": "4 kg" } ], + "pocket_data": [ { "pocket_type": "CONTAINER", "rigid": true, "max_contains_volume": "990 ml", "max_contains_weight": "4 kg" } ], "price": 0, "price_postapoc": 0, "material": [ "cardboard" ], @@ -463,7 +466,7 @@ "name": { "str": "cardboard box", "str_pl": "cardboard boxes" }, "description": "A sturdy cardboard box, about the size of a banana box. Great for packing.", "weight": "850 g", - "volume": "2 L", + "volume": "2100 ml", "//": "Volume is much lower than the actual volume of a box this size because presumably if it's in your pack, it isn't empty and full of air; and if it's in your hands, it's irrelevant what the volume is.", "price": 0, "price_postapoc": 0, @@ -487,7 +490,7 @@ "name": { "str": "large cardboard box", "str_pl": "large cardboard boxes" }, "description": "A very large cardboard box, the sort children would have loved to hide in, when there were still children.", "weight": "1250 g", - "volume": "3 L", + "volume": "3150 ml", "//": "Volume is much lower than the actual volume of a box this size because presumably if it's in your pack, it isn't empty and full of air; and if it's in your hands, it's irrelevant what the volume is.", "price": 0, "price_postapoc": 10, @@ -816,7 +819,7 @@ "name": { "str": "plastic cup" }, "description": "A small, vacuum formed cup.", "weight": "6 g", - "volume": "250 ml", + "volume": "262 ml", "price": 0, "price_postapoc": 0, "to_hit": 1, @@ -1620,7 +1623,7 @@ "name": { "str": "small cardboard box of tea bags", "str_pl": "small cardboard boxes of tea bags" }, "description": "A very small cardboard box with tea brand written on it.", "weight": "10 g", - "volume": "100 ml", + "volume": "105 ml", "price": 0, "price_postapoc": 0, "material": [ "cardboard" ], diff --git a/data/json/items/corpses/dead_exodii.json b/data/json/items/corpses/dead_exodii.json new file mode 100644 index 0000000000000..e9ab4538932a2 --- /dev/null +++ b/data/json/items/corpses/dead_exodii.json @@ -0,0 +1,70 @@ +[ + { + "type": "GENERIC", + "id": "broken_exodii_worker", + "symbol": ",", + "color": "light_gray", + "name": "broken exodii worker", + "category": "other", + "description": "A broken exodii worker. It's possible it could be gutted for parts.", + "price": 1000, + "material": [ "steel" ], + "volume": "119 L", + "weight": "221 kg", + "bashing": 20, + "cutting": 15, + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ] + }, + { + "type": "GENERIC", + "id": "broken_exodii_quad", + "symbol": ",", + "color": "light_gray", + "name": "broken exodii quadruped", + "category": "other", + "description": "A broken exodii walker. Still looks intimidating despite being permanently inoperative, possibly due to the sheer size and mass. Could be gutted for parts.", + "price": 1000, + "material": [ "steel" ], + "volume": "410 L", + "weight": "498 kg", + "bashing": 20, + "cutting": 15, + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ] + }, + { + "type": "GENERIC", + "id": "broken_exodii_turret", + "symbol": ",", + "color": "yellow", + "name": "broken exodii turret", + "category": "other", + "description": "A broken exodii turret. Still looks intimidating despite being permanently inoperative, possibly due to the sheer size and mass. Could be gutted for parts.", + "price": 1000, + "material": [ "steel" ], + "weight": "206 kg", + "volume": "105 L", + "bashing": 20, + "cutting": 15, + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ] + }, + { + "type": "GENERIC", + "id": "broken_exodii_sniper_drone", + "symbol": ",", + "color": "yellow", + "name": "broken exodii balloon-drone", + "category": "other", + "description": "A broken balloon drone. The balloon has been shredded, but most of the chassis is still intact. Could be gutted for parts.", + "price": 1000, + "material": [ "steel" ], + "volume": "70 L", + "weight": "150 kg", + "bashing": 20, + "cutting": 15, + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ] + } +] diff --git a/data/json/items/fake.json b/data/json/items/fake.json index ab5b795f3bc23..68b4ae1427ee9 100644 --- a/data/json/items/fake.json +++ b/data/json/items/fake.json @@ -169,5 +169,19 @@ "range": 100, "dispersion": 1000, "ranged_damage": { "damage_type": "stab", "amount": 30 } + }, + { + "id": "pseudo_char_smoker", + "type": "TOOL", + "name": { "str": "smoking rack" }, + "description": "This is a crafting_pseudo_item if you have it something is wrong.", + "material": [ "steel" ], + "symbol": ";", + "color": "light_gray", + "ammo": [ "charcoal" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 2000 } } ], + "sub": "char_smoker", + "max_charges": 2000, + "flags": [ "ALLOWS_REMOTE_USE", "PSEUDO" ] } ] diff --git a/data/json/items/generic.json b/data/json/items/generic.json index a466900635321..b182e41840127 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -331,6 +331,7 @@ "price": 0, "material": [ "chitin" ], "flags": [ "NO_SALVAGE" ], + "milling": { "into": "meal_chitin_piece", "conversion_rate": 4 }, "weight": "89 g", "volume": "300 ml", "bashing": 1 @@ -419,6 +420,54 @@ "symbol": ",", "color": "white" }, + { + "id": "bundle_plank", + "type": "GENERIC", + "category": "spare_parts", + "name": { "str": "bundle of planks", "str_pl": "bundles of planks" }, + "description": "Ten construction planks securely tied together for easier transport. Disassemble to untie them.", + "//": "total volume is equal to 10 planks, assuming uniformity and tight stacking", + "volume": "44 L", + "weight": "26 kg", + "longest_side": "130 cm", + "price": 10000, + "price_postapoc": 100, + "material": [ "wood" ], + "symbol": "H", + "color": "brown" + }, + { + "id": "bundle_branch", + "type": "GENERIC", + "category": "spare_parts", + "name": { "str": "bundle of stout branches", "str_pl": "bundles of stout branches" }, + "description": "Ten stout branches securely tied together for easier transport. Disassemble to untie them.", + "//": "total volume is greater than 10 stout branches; irregular dimensions leave air gaps", + "volume": "30 L", + "weight": "15 kg", + "longest_side": "130 cm", + "price": 0, + "price_postapoc": 50, + "material": [ "wood" ], + "symbol": "H", + "color": "brown" + }, + { + "id": "bundle_branch_long", + "type": "GENERIC", + "category": "spare_parts", + "name": { "str": "bundle of long stout branches", "str_pl": "bundles of long stout branches" }, + "description": "Five long stout branches securely tied together for easier transport. Disassemble to untie them.", + "//": "total volume is greater than 5 long stout branches, since they are rough lumber and do not stack perfectly", + "volume": "30 L", + "weight": "15 kg", + "longest_side": "260 cm", + "price": 0, + "price_postapoc": 50, + "material": [ "wood" ], + "symbol": "H", + "color": "brown" + }, { "type": "GENERIC", "id": "sample_t_substrate", @@ -874,7 +923,7 @@ "price_postapoc": 100, "material": [ "steel", "plastic" ], "weight": "5 g", - "volume": 0 + "volume": "1 ml" }, { "type": "GENERIC", @@ -888,7 +937,7 @@ "price_postapoc": 100, "material": [ "steel", "plastic" ], "weight": "5 g", - "volume": 0 + "volume": "1 ml" }, { "type": "GENERIC", @@ -1736,6 +1785,7 @@ "price": 1000, "price_postapoc": 10, "material": [ "plastic" ], + "ascii_picture": "mobile_memory_card", "flags": [ "MC_MOBILE", "MC_RANDOM_STUFF", "MC_MAY_BE_ENCRYPTED", "MC_TURN_USED" ], "weight": "5 g", "volume": "2 ml" @@ -1750,6 +1800,7 @@ "price": 500, "price_postapoc": 10, "material": [ "plastic" ], + "ascii_picture": "mobile_memory_card", "flags": [ "MC_MOBILE", "MC_USED" ], "weight": "5 g", "volume": "1 ml" @@ -2991,6 +3042,15 @@ "to_hit": -3, "flags": [ "TRADER_AVOID", "NO_REPAIR" ] }, + { + "type": "GENERIC", + "id": "broken_robofac_laserturret_mk1", + "symbol": ",", + "color": "green", + "name": { "str": "broken laser turret" }, + "weight": "40 kg", + "copy-from": "broken_turret" + }, { "type": "GENERIC", "id": "fire_brick", diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json index d8e161dce906b..2b542c6a0738d 100644 --- a/data/json/items/generic/dining_kitchen.json +++ b/data/json/items/generic/dining_kitchen.json @@ -58,7 +58,7 @@ "price_postapoc": 0, "material": [ "ceramic" ], "weight": "322 g", - "volume": "250 ml", + "volume": "262 ml", "bashing": 3, "to_hit": -1 }, @@ -73,7 +73,7 @@ "price_postapoc": 0, "material": [ "glass" ], "weight": "322 g", - "volume": "250 ml", + "volume": "262 ml", "bashing": 3, "to_hit": -1 }, @@ -88,7 +88,7 @@ "price_postapoc": 0, "material": [ "tin" ], "weight": "262 g", - "volume": "250 ml", + "volume": "262 ml", "bashing": 2, "to_hit": -1 }, @@ -103,7 +103,7 @@ "price_postapoc": 0, "material": [ "plastic" ], "weight": "130 g", - "volume": "250 ml", + "volume": "262 ml", "bashing": 1, "to_hit": -1 }, @@ -138,7 +138,7 @@ "symbol": ")", "description": "A perfectly ordinary ceramic soup bowl.", "copy-from": "base_ceramic_dish", - "volume": "500 ml", + "volume": "525 ml", "pocket_data": [ { "max_contains_volume": "500 ml", @@ -154,6 +154,7 @@ "type": "GENERIC", "category": "other", "id": "ceramic_cup", + "volume": "262 ml", "name": { "str": "ceramic cup" }, "symbol": "u", "description": "A light ceramic teacup. Quite classy.", @@ -300,6 +301,7 @@ "type": "GENERIC", "category": "other", "id": "wine_glass", + "volume": "262 ml", "name": { "str": "wine glass", "str_pl": "wine glasses" }, "proportional": { "weight": 0.5 }, "symbol": "Y", @@ -324,7 +326,7 @@ "symbol": "u", "description": "A glass bowl for soup or dessert.", "copy-from": "base_glass_dish", - "volume": "500 ml", + "volume": "525 ml", "pocket_data": [ { "max_contains_volume": "500 ml", @@ -373,7 +375,7 @@ "symbol": "u", "description": "A plastic bowl with a convenient sealing lid. Holds 750 ml of liquid.", "copy-from": "base_plastic_dish", - "volume": "750 ml", + "volume": "787 ml", "pocket_data": [ { "pocket_type": "CONTAINER", @@ -703,7 +705,7 @@ "material": [ "steel" ], "color": "light_gray", "weight": "550 g", - "volume": "2 L", + "volume": "2100 ml", "bashing": 6, "pocket_data": [ { @@ -725,7 +727,7 @@ "material": [ "iron" ], "color": "dark_gray", "weight": "3000 g", - "volume": "2 L", + "volume": "2100 ml", "bashing": 10, "pocket_data": [ { @@ -747,7 +749,7 @@ "material": [ "copper" ], "color": "light_red", "weight": "750 g", - "volume": "2 L", + "volume": "2100 ml", "bashing": 6, "to_hit": -2, "pocket_data": [ @@ -770,7 +772,7 @@ "material": [ "ceramic" ], "color": "white", "weight": "650 g", - "volume": "2 L", + "volume": "2100 ml", "bashing": 4, "pocket_data": [ { @@ -811,7 +813,7 @@ "name": { "str": "canning pot" }, "description": "A very large 25 liter pot, primarily meant for canning food in glass jars via the water bath method, though it can cook normal foods just as well. Canning foods with it will require a lot of water. If you're only canning a couple of jars at a time, you'd fill it up with rocks or something to displace the water above the lids.", "weight": "5625 g", - "volume": "25 L", + "volume": "26250 ml", "price": 20000, "to_hit": -2, "bashing": 10, @@ -841,7 +843,7 @@ "material": [ "iron" ], "color": "dark_gray", "weight": "2628 g", - "volume": "1 L", + "volume": "1050 ml", "bashing": 12, "to_hit": -3, "pocket_data": [ @@ -893,7 +895,7 @@ "color": "light_red", "looks_like": "pan", "weight": "628 g", - "volume": "1 L", + "volume": "1050 ml", "bashing": 7, "to_hit": -2, "pocket_data": [ @@ -915,7 +917,7 @@ "name": { "str": "makeshift pot" }, "description": "A sheet of metal crudely hammered into a cooking pot. Good enough to cook food and boil water, but not as useful as proper cookware.", "weight": "6000 g", - "volume": "1 L", + "volume": "1050 ml", "price": 200, "price_postapoc": 5, "to_hit": 1, @@ -942,7 +944,7 @@ "name": { "str": "makeshift copper pot" }, "description": "A cooking pot crudely hammered out of copper. Good enough to cook food and boil water, but not as useful as proper cookware.", "weight": "884 g", - "volume": "1 L", + "volume": "1050 ml", "price": 200, "price_postapoc": 5, "to_hit": 1, @@ -972,7 +974,7 @@ "material": [ "steel" ], "color": "light_gray", "weight": "728 g", - "volume": "1500 ml", + "volume": "1575 ml", "bashing": 5, "pocket_data": [ { "max_contains_volume": "1500 ml", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } ], "delete": { "qualities": [ [ "COOK", 3 ] ] } diff --git a/data/json/items/generic/music.json b/data/json/items/generic/music.json index b77aeabc02625..4c9b508d056b5 100644 --- a/data/json/items/generic/music.json +++ b/data/json/items/generic/music.json @@ -39,7 +39,7 @@ "type": "GENERIC", "id": "microphone_xlr_generic", "name": { "str": "XLR microphone" }, - "description": "A typical microphone used to record or amplify voice. Comes with a clip. Has a 3-pin XLR connector on the bottom in order to connect to am amp.", + "description": "A typical microphone used to record or amplify voice. Comes with a clip. Has a 3-pin XLR connector on the bottom in order to connect to an amp.", "symbol": "i", "color": "dark_gray", "volume": "550 ml", diff --git a/data/json/items/generic/spares.json b/data/json/items/generic/spares.json index 15f72e4a04e07..0d99822a1a7c3 100644 --- a/data/json/items/generic/spares.json +++ b/data/json/items/generic/spares.json @@ -116,5 +116,17 @@ "volume": "1 L", "price": 1800, "price_postapoc": 500 + }, + { + "id": "pipe_fittings", + "copy-from": "spare_part", + "type": "GENERIC", + "name": { "str": "set of pipe fittings", "str_pl": "sets of pipe fittings" }, + "description": "A loose assortment of metal pipe fittings - end caps, pipe junctions, and similar items. They can be used in a variety of projects.", + "material": [ "iron" ], + "weight": "500 g", + "volume": "1 L", + "price": 1800, + "price_postapoc": 500 } ] diff --git a/data/json/items/generic/toys_and_sports.json b/data/json/items/generic/toys_and_sports.json index fc737f5880585..d39878db21e59 100644 --- a/data/json/items/generic/toys_and_sports.json +++ b/data/json/items/generic/toys_and_sports.json @@ -141,9 +141,10 @@ "price": 3000, "price_postapoc": 10, "material": [ "ceramic" ], - "weight": "2000 g", - "volume": "2500 ml", - "bashing": 16, + "weight": "7257 g", + "volume": "5277 ml", + "longest_side": "216 mm", + "bashing": 18, "to_hit": -2 }, { diff --git a/data/json/items/gun/12mm.json b/data/json/items/gun/12mm.json index 25caf76f50563..2cd4780d00877 100644 --- a/data/json/items/gun/12mm.json +++ b/data/json/items/gun/12mm.json @@ -7,7 +7,8 @@ "name": { "str": "H&K G80 railgun" }, "description": "Developed by Heckler & Koch, this railgun magnetically propels a ferromagnetic projectile using an alternating current. Powered by UPS.", "weight": "3914 g", - "volume": "2750 ml", + "volume": "4958 ml", + "longest_side": "1005 mm", "price": 1920000, "price_postapoc": 12000, "to_hit": -1, @@ -34,6 +35,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "250 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "hk_g80mag" ] diff --git a/data/json/items/gun/20x66mm.json b/data/json/items/gun/20x66mm.json index cb67a0ce7b954..5d007280c1538 100644 --- a/data/json/items/gun/20x66mm.json +++ b/data/json/items/gun/20x66mm.json @@ -23,7 +23,7 @@ "dispersion": 285, "durability": 9, "clip_size": 5, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], @@ -36,7 +36,7 @@ [ "underbarrel", 1 ] ], "flags": [ "RELOAD_ONE", "WATERPROOF_GUN", "NEVER_JAMS", "PUMP_ACTION" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "20x66mm": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "20x66mm": 5 } } ] }, { "id": "rm20", @@ -73,6 +73,7 @@ "flags": [ "WATERPROOF_GUN", "NEVER_JAMS" ], "pocket_data": [ { + "magazine_well": "500 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -114,6 +115,7 @@ "flags": [ "WATERPROOF_GUN", "NEVER_JAMS" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/22.json b/data/json/items/gun/22.json index 5850e8f86ef93..97d7ebdbfa5be 100644 --- a/data/json/items/gun/22.json +++ b/data/json/items/gun/22.json @@ -22,7 +22,7 @@ "durability": 6, "min_cycle_recoil": 39, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 6 ] ], - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 3 ], [ "barrel", 1 ], @@ -88,6 +88,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_ONE" ], "pocket_data": [ + { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 19 } }, { "pocket_type": "MAGAZINE_WELL", "holster": true, @@ -130,7 +131,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 4 } } ] }, { "id": "rifle_22", @@ -157,7 +158,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -170,7 +171,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 1 } } ] }, { "id": "ruger_1022", @@ -194,7 +195,7 @@ "dispersion": 110, "durability": 8, "min_cycle_recoil": 39, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -212,6 +213,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -229,7 +231,7 @@ "weight": "420 g", "ammo": [ "22" ], "clip_size": 8, - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "22": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "22": 8 } } ] }, { "id": "sig_mosquito", @@ -269,6 +271,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -298,6 +301,7 @@ "min_cycle_recoil": 39, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -328,6 +332,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "27 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -357,6 +362,7 @@ "min_cycle_recoil": 39, "pocket_data": [ { + "magazine_well": "126 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/223.json b/data/json/items/gun/223.json index d942cdd8fd0de..9abd349707c84 100644 --- a/data/json/items/gun/223.json +++ b/data/json/items/gun/223.json @@ -21,7 +21,7 @@ "durability": 8, "min_cycle_recoil": 1350, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "built_in_mods": [ "folding_stock" ], "pocket_data": [ { @@ -100,7 +100,7 @@ "description": "A compact, 7.5 inch barrel version of the classic AR-15 design, commercially marketed as a home defense weapon.", "weight": "2267 g", "volume": "1758 ml", - "longest_side": "1116 mm", + "longest_side": "584 mm", "price": 91400, "price_postapoc": 3500, "to_hit": -2, @@ -109,11 +109,26 @@ "symbol": "(", "color": "dark_gray", "ammo": [ "223" ], + "skill": "pistol", "range": -6, "ranged_damage": { "damage_type": "bullet", "amount": -9 }, "dispersion": 380, "durability": 6, "min_cycle_recoil": 1350, + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "magazine", 1 ], + [ "muzzle", 1 ], + [ "rail mount", 2 ], + [ "sights", 1 ], + [ "stock mount", 1 ], + [ "underbarrel", 1 ] + ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", @@ -143,10 +158,11 @@ "copy-from": "rifle_auto", "looks_like": "ar15", "type": "GUN", - "name": { "str_sp": "MAS 223" }, + "name": { "str_sp": "MAS .223" }, "description": "A bullpup assault rifle that was used by French armed forces only until recently. While the FAMAS was famous for its high fire rate, the MAS .223 is a semi-auto only variation imported to the US in the late eighties. It retains the integral bipod, though.", - "weight": "3800 g", - "volume": "4162 ml", + "weight": "3610 g", + "volume": "3429 ml", + "longest_side": "759 mm", "price": 2800000, "to_hit": -1, "bashing": 12, @@ -192,6 +208,7 @@ "description": "A sleek bullpup carbine designed by FN Herstal, complete with an integrated sight accessory rail. The forward ejecting action and ambidextrous controls make firing comfortable for both left and right-handed shooting. The whole rifle is well sealed from mud and dust for reliability, but this makes it incompatible with many aftermarket magazines.", "weight": "3319 g", "volume": "7986 ml", + "longest_side": "740 mm", "price": 125000, "to_hit": -1, "bashing": 12, @@ -233,7 +250,8 @@ "//": "*Current* milspec gear is now ridiculously overpriced, as seen with the M2010 IRL.", "description": "Designed to replace the M4A1, the Heckler and Koch 416A5 features most of the former's strengths, while being considerably more durable.", "weight": "3490 g", - "volume": "1750 ml", + "volume": "4957 ml", + "longest_side": "798 mm", "price": 540000, "price_postapoc": 2250, "to_hit": -1, @@ -504,6 +522,7 @@ "description": "An AR-15 derivative pistol manufactured by Olympic Arms in the nineties. The main difference compared to the AR-15 is that the recoil spring has been moved to the top of the gun, circumventing the necessity for a solid buttstock.", "weight": "2023 g", "volume": "2135 ml", + "longest_side": "456 mm", "price": 125000, "price_postapoc": 5500, "to_hit": -2, @@ -512,11 +531,26 @@ "symbol": "(", "color": "dark_gray", "ammo": [ "223" ], + "skill": "pistol", "range": -6, "ranged_damage": { "damage_type": "bullet", "amount": -11 }, "dispersion": 380, "durability": 6, "min_cycle_recoil": 1350, + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "magazine", 1 ], + [ "muzzle", 1 ], + [ "rail mount", 2 ], + [ "sights", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", @@ -562,7 +596,7 @@ "dispersion": 100, "durability": 8, "min_cycle_recoil": 1350, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], diff --git a/data/json/items/gun/270win.json b/data/json/items/gun/270win.json index 75ef7ab216db8..9403867f8c948 100644 --- a/data/json/items/gun/270win.json +++ b/data/json/items/gun/270win.json @@ -20,8 +20,8 @@ "durability": 8, "blackpowder_tolerance": 24, "clip_size": 4, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "270win": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "270win": 4 } } ] } ] diff --git a/data/json/items/gun/300.json b/data/json/items/gun/300.json index ab775480c573b..ba50a5915a5c1 100644 --- a/data/json/items/gun/300.json +++ b/data/json/items/gun/300.json @@ -8,7 +8,8 @@ "//": "http://www.guns.com/2012/05/17/remington-xm2010-army-sniper-system-esr-now-in-stores/.", "description": "A bolt-action, box-magazine-fed, sniper rifle chambered in the powerful .300 Winchester Magnum round. The M2010 had completely replaced the M24 rifle series by 2017.", "weight": "5443 g", - "volume": "7143 ml", + "volume": "6182 ml", + "longest_side": "1187 mm", "price": 1701000, "price_postapoc": 3750, "to_hit": -1, @@ -18,7 +19,7 @@ "dispersion": 90, "durability": 8, "min_cycle_recoil": 4770, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "flags": [ "NEVER_JAMS" ], "pocket_data": [ { @@ -40,6 +41,7 @@ "description": "The Weatherby Mark V is one of the finest bolt action rifles. Designed in 1955 by Roy Weatherby and Fred Jennie, it has a strong action designed to safely fire high-pressure cartridges. These rifles were presented to celebrities as part of a marketing campaign.", "weight": "3730 g", "volume": "3761 ml", + "longest_side": "1183 mm", "price": 259500, "price_postapoc": 5500, "to_hit": -1, @@ -51,9 +53,9 @@ "durability": 8, "blackpowder_tolerance": 24, "clip_size": 3, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "300": 3 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "300": 3 } } ] }, { "id": "win70", @@ -64,6 +66,7 @@ "description": "The Winchester Model 70 is a bolt action sporting rifle. It has an iconic place in American sporting culture and has been held in high regard by shooters since it was introduced in 1936.", "weight": "3520 g", "volume": "3205 ml", + "longest_side": "1198 mm", "price": 46000, "price_postapoc": 3250, "to_hit": -1, @@ -75,8 +78,8 @@ "durability": 8, "blackpowder_tolerance": 24, "clip_size": 3, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "300": 3 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "300": 3 } } ] } ] diff --git a/data/json/items/gun/3006.json b/data/json/items/gun/3006.json index 10cb19ae73476..0f6bc77d9fa09 100644 --- a/data/json/items/gun/3006.json +++ b/data/json/items/gun/3006.json @@ -21,7 +21,7 @@ "dispersion": 90, "durability": 7, "blackpowder_tolerance": 24, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -113,7 +113,7 @@ "durability": 8, "blackpowder_tolerance": 60, "clip_size": 5, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -130,6 +130,7 @@ ], "flags": [ "RELOAD_ONE" ], "pocket_data": [ + { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 5 } }, { "pocket_type": "MAGAZINE_WELL", "holster": true, @@ -161,7 +162,7 @@ "durability": 8, "min_cycle_recoil": 3420, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 3 ] ], - "barrel_length": "1000 ml", + "barrel_volume": "1000 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -207,8 +208,8 @@ "durability": 8, "blackpowder_tolerance": 24, "clip_size": 4, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 4 } } ] } ] diff --git a/data/json/items/gun/300BLK.json b/data/json/items/gun/300BLK.json index 7dca2e1c4c5d8..3e8b18b02ce2d 100644 --- a/data/json/items/gun/300BLK.json +++ b/data/json/items/gun/300BLK.json @@ -21,7 +21,7 @@ "durability": 8, "min_cycle_recoil": 1700, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "built_in_mods": [ "folding_stock" ], "pocket_data": [ { diff --git a/data/json/items/gun/308.json b/data/json/items/gun/308.json index 4a01da007fe25..c754a7acf984e 100644 --- a/data/json/items/gun/308.json +++ b/data/json/items/gun/308.json @@ -7,7 +7,8 @@ "name": { "str_sp": "FN FAL" }, "description": "Originally designed during the Cold War, the FN FAL is probably the most successful battle rifle ever designed. Even though often labeled as obsolete, its high rate of fire and powerful ammunition make it perfectly capable of holding its ground against modern competitors.", "weight": "4250 g", - "volume": "2 L", + "volume": "4511 ml", + "longest_side": "1090 mm", "price": 350000, "price_postapoc": 5500, "to_hit": -1, @@ -21,7 +22,7 @@ "durability": 8, "min_cycle_recoil": 2700, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", @@ -40,7 +41,8 @@ "name": { "str_sp": "H&K G3" }, "description": "An early battle rifle developed after the end of WWII. The G3 is designed to unload large amounts of deadly ammunition, but it is less suitable over long ranges.", "weight": "4380 g", - "volume": "2 L", + "volume": "3724 ml", + "longest_side": "1025 mm", "price": 205000, "price_postapoc": 6000, "to_hit": -1, @@ -72,7 +74,8 @@ "name": { "str": "M134D-H Minigun" }, "description": "The M134D-H Minigun is a (relatively) lightweight heavy rotary machine gun. Its six barrels are rotated by an electric motor, powered by UPS or vehicle. If you could find enough ammo for it, it would become a devastating weapon. It must be mounted on a vehicle before use.", "weight": "19770 g", - "volume": "6 L", + "volume": "8300 ml", + "longest_side": "800 mm", "price": 5500000, "price_postapoc": 10000, "to_hit": -4, @@ -109,6 +112,8 @@ "name": { "str_sp": "M14 EBR-RI" }, "description": "A highly modified version of the M14 rifle designed to cover both CQB and designated marksman roles. A very powerful and versatile rifle, if somewhat heavy.", "weight": "5070 g", + "volume": "3672 ml", + "longest_side": "889 mm", "price": 195000, "price_postapoc": 6500, "material": [ "steel", "plastic" ], @@ -136,7 +141,8 @@ "name": { "str_sp": "M1A" }, "description": "The child of the M1 Garand World War 2 rifle, the M1A is a semi-automatic variant of the M14, favored for its accuracy and modular use.", "weight": "4230 g", - "volume": "2250 ml", + "volume": "3970 ml", + "longest_side": "1126 mm", "price": 130000, "price_postapoc": 3500, "to_hit": -1, @@ -149,7 +155,7 @@ "dispersion": 110, "durability": 8, "min_cycle_recoil": 2700, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -181,8 +187,9 @@ "type": "GUN", "name": { "str": "M240" }, "description": "The M240 is a medium machine gun used by the US military, replacing the older M60. Quite inaccurate and difficult to control, the M240 is designed to fire many rounds very quickly.", - "weight": "12400 g", - "volume": "3 L", + "weight": "12500 g", + "volume": "11780 ml", + "longest_side": "1260 mm", "price": 1000000, "price_postapoc": 7500, "to_hit": -1, @@ -228,7 +235,8 @@ "name": { "str": "M60" }, "description": "The M60 is a general-purpose machine gun developed to replace the .30-caliber M1918 and M1919. Heavy and difficult to handle fired from the shoulder, as most people aren't action-movie heroes.", "weight": "10500 g", - "volume": "3 L", + "volume": "10900 ml", + "longest_side": "1105 mm", "price": 1000000, "price_postapoc": 7500, "to_hit": -1, @@ -282,8 +290,9 @@ "type": "GUN", "name": { "str_sp": "Savage 111F" }, "description": "A very accurate rifle chambered for the powerful .308 round. Its very low ammo capacity is offset by its accuracy and near-complete lack of recoil.", - "weight": "2993 g", - "volume": "3 L", + "weight": "3630 g", + "volume": "2875 ml", + "longest_side": "1041 mm", "price": 53000, "price_postapoc": 4250, "to_hit": -1, @@ -296,9 +305,9 @@ "durability": 9, "blackpowder_tolerance": 24, "clip_size": 3, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 3 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 3 } } ] }, { "id": "scar_h", @@ -307,7 +316,9 @@ "type": "GUN", "name": { "str_sp": "FN SCAR-H" }, "description": "A highly accurate and modular battle rifle specially designed for the United States Special Operations Command. The 'H' in its name stands for heavy, as it uses the powerful .308 round.", - "weight": "3640 g", + "weight": "3630 g", + "volume": "5427 ml", + "longest_side": "906 mm", "ammo": [ "308" ], "ranged_damage": { "damage_type": "bullet", "amount": -3 }, "min_cycle_recoil": 2700, @@ -342,7 +353,7 @@ "dispersion": 85, "durability": 9, "min_cycle_recoil": 2700, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "default_mods": [ "rifle_scope", "bipod" ], "clip_size": 5, "valid_mod_locations": [ @@ -360,7 +371,7 @@ [ "underbarrel", 1 ] ], "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 5 } } ] }, { "id": "hk417_13", @@ -370,7 +381,8 @@ "name": { "str": "HK417 A2" }, "description": "A German battle rifle with a 13\" barrel and telescopic stock. It is a gas operated, rotating bolt rifle with a short-stroke piston design similar to that of the G36.", "weight": "4220 g", - "volume": "1750 ml", + "volume": "4000 ml", + "longest_side": "914 mm", "price": 320000, "price_postapoc": 6000, "to_hit": -1, @@ -402,8 +414,9 @@ "type": "GUN", "name": { "str": "M110A1" }, "description": "A derivative of H&K's G28 with an aluminum upper receiver to meet US Army weight requirements. It is a gas operated, rotating bolt rifle accurate to 1.5 MOA with standard ammunition.", - "weight": "4330 g", - "volume": "2 L", + "weight": "3800 g", + "volume": "4000 ml", + "longest_side": "1028 mm", "price": 320000, "price_postapoc": 6000, "to_hit": -1, @@ -435,7 +448,8 @@ "name": { "str": "AR-10" }, "description": "Somewhat similar to the later AR-15, the AR-10 is a gas operated, rotating bolt rifle chambered for 7.62x51mm rounds.", "weight": "3290 g", - "volume": "2 L", + "volume": "4250 ml", + "longest_side": "1050 mm", "price": 120000, "price_postapoc": 5500, "to_hit": -1, diff --git a/data/json/items/gun/32.json b/data/json/items/gun/32.json index 035a2f33ac6f2..dd15d6d308949 100644 --- a/data/json/items/gun/32.json +++ b/data/json/items/gun/32.json @@ -37,6 +37,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -133,6 +134,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -163,6 +165,7 @@ "min_cycle_recoil": 135, "pocket_data": [ { + "magazine_well": "41 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/357sig.json b/data/json/items/gun/357sig.json index d39e30d1b9212..b28146027caeb 100644 --- a/data/json/items/gun/357sig.json +++ b/data/json/items/gun/357sig.json @@ -21,6 +21,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -42,6 +43,7 @@ "ammo": [ "357sig" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -71,6 +73,7 @@ "durability": 6, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/36paper.json b/data/json/items/gun/36paper.json index c12181f0541e8..355b2f28acda1 100644 --- a/data/json/items/gun/36paper.json +++ b/data/json/items/gun/36paper.json @@ -20,6 +20,6 @@ "blackpowder_tolerance": 96, "clip_size": 6, "proportional": { "reload": 2.0 }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "36paper": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "36paper": 6 } } ] } ] diff --git a/data/json/items/gun/38.json b/data/json/items/gun/38.json index ab8a8f9eae681..a233817460245 100644 --- a/data/json/items/gun/38.json +++ b/data/json/items/gun/38.json @@ -34,7 +34,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "38": 2 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "38": 2 } } ] }, { "id": "cop_38", @@ -69,7 +69,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357mag": 4, "38": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357mag": 4, "38": 4 } } ] }, { "id": "model_10_revolver", @@ -92,7 +92,7 @@ "durability": 8, "blackpowder_tolerance": 56, "clip_size": 6, - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "38": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "38": 6 } } ] }, { "id": "rifle_38", @@ -118,7 +118,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -131,7 +131,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "38": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "38": 1 } } ] }, { "id": "ruger_lcr_38", @@ -167,7 +167,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "38": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "38": 5 } } ] }, { "id": "sw_619", @@ -202,6 +202,6 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "357mag": 7, "38": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "357mag": 7, "38": 7 } } ] } ] diff --git a/data/json/items/gun/380.json b/data/json/items/gun/380.json index 2c59117880504..26bdddf2ee362 100644 --- a/data/json/items/gun/380.json +++ b/data/json/items/gun/380.json @@ -39,6 +39,7 @@ "min_cycle_recoil": 270, "pocket_data": [ { + "magazine_well": "44 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -68,6 +69,7 @@ "min_cycle_recoil": 270, "pocket_data": [ { + "magazine_well": "60 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -98,6 +100,7 @@ "min_cycle_recoil": 270, "pocket_data": [ { + "magazine_well": "60 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -126,6 +129,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "236 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -156,6 +160,7 @@ "min_cycle_recoil": 225, "pocket_data": [ { + "magazine_well": "74 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/38super.json b/data/json/items/gun/38super.json index 40a6c72ca4b52..99c737ea79be5 100644 --- a/data/json/items/gun/38super.json +++ b/data/json/items/gun/38super.json @@ -37,6 +37,7 @@ ], "pocket_data": [ { + "magazine_well": "500 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -67,6 +68,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/40.json b/data/json/items/gun/40.json index 56c7b5fa5bed3..1ad19f058240a 100644 --- a/data/json/items/gun/40.json +++ b/data/json/items/gun/40.json @@ -6,8 +6,9 @@ "type": "GUN", "name": { "str": "Beretta 90-two .40 S&W" }, "description": "A more modern version of Beretta's popular 92 series of handguns, the 90-two performs largely the same. The main difference is a sleeker, almost futuristic-looking design owed in large parts to the polymer underbarrel rail cover. This one is chambered in .40 S&W.", - "weight": "921 g", - "volume": "518 ml", + "weight": "905 g", + "volume": "554 ml", + "longest_side": "250 mm", "price": 65000, "to_hit": -2, "bashing": 8, @@ -21,6 +22,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -37,7 +39,8 @@ "name": { "str_sp": "Glock 22" }, "description": "A .40 S&W variant of the popular Glock 17 pistol. The standard-issue firearm of the FBI and of countless other law enforcement agencies worldwide.", "weight": "645 g", - "volume": "443 ml", + "volume": "433 ml", + "longest_side": "234 mm", "price": 69000, "price_postapoc": 1750, "to_hit": -2, @@ -70,6 +73,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "250 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "glock40mag", "glock40bigmag" ] @@ -84,7 +88,8 @@ "name": { "str": "Beretta Px4 Storm .40 S&W" }, "description": "Lighter than Beretta's iconic 92 series of guns, the Px4 Storm was built by utilizing light-weight polymer construction with steel inserts. Its shape was also optimized for concealed carry. This one is chambered in .40 S&W.", "weight": "785 g", - "volume": "505 ml", + "volume": "520 ml", + "longest_side": "231 mm", "price": 65000, "to_hit": -2, "bashing": 8, @@ -100,6 +105,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "250 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "px4_40mag" ] @@ -130,7 +136,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -143,7 +149,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 1 } } ] }, { "id": "sig_40", @@ -153,7 +159,8 @@ "name": { "str_sp": "SIG Pro .40" }, "description": "Originally marketed as a lightweight and compact alternative to older SIG handguns, the Pro .40 is popular among European police forces.", "weight": "822 g", - "volume": "523 ml", + "volume": "509 ml", + "longest_side": "221 mm", "price": 75000, "price_postapoc": 1500, "to_hit": -2, @@ -185,6 +192,7 @@ "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", + "magazine_well": "250 ml", "max_contains_weight": "20 kg", "item_restriction": [ "sig40mag" ] } @@ -214,7 +222,7 @@ "min_cycle_recoil": 425, "modes": [ [ "DEFAULT", "burst", 5 ] ], "loudness": 25, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 3 ], [ "barrel", 1 ], @@ -247,6 +255,7 @@ "description": "A homemade 6-shot revolver. While it's not as good as the pre-Cataclysm manufactured weapons, it's a decent piece of work, all things considered.", "weight": "1333 g", "volume": "750 ml", + "longest_side": "33 cm", "price": 15000, "price_postapoc": 750, "to_hit": -2, @@ -275,7 +284,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 6 } } ] }, { "id": "sw_610", @@ -286,6 +295,7 @@ "description": "The Smith and Wesson 610 is a classic six-shooter revolver chambered for 10mm rounds, or for S&W's own .40 round.", "weight": "1420 g", "volume": "754 ml", + "longest_side": "332 mm", "price": 74000, "price_postapoc": 2250, "to_hit": -2, @@ -309,7 +319,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "10mm": 6, "40": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "10mm": 6, "40": 6 } } ] }, { "id": "hi_power_40", @@ -318,8 +328,9 @@ "type": "GUN", "name": { "str": "Browning Hi-Power .40 S&W" }, "description": "The Browning Hi-Power is a semi-automatic handgun developed shortly before the second world war. Widely issued since then, it remains in use by India, Canada and Australia. This is a commercial variant produced by Browning Arms in .40 S&W.", - "weight": "900 g", - "volume": "418 ml", + "weight": "907 g", + "volume": "274 ml", + "longest_side": "228 mm", "price": 54000, "price_postapoc": 2000, "to_hit": -2, @@ -331,6 +342,7 @@ "durability": 8, "pocket_data": [ { + "magazine_well": "185 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -347,7 +359,8 @@ "name": { "str": "Walther PPQ .40 S&W" }, "description": "The Walther PPQ is a semi-automatic pistol originating from the Walther P99QA, and maintains compatibility with some of its predecessor's accessories. This model is chambered in .40 S&W.", "weight": "625 g", - "volume": "422 ml", + "volume": "440 ml", + "longest_side": "215 mm", "price": 72500, "price_postapoc": 2000, "bashing": 8, @@ -358,6 +371,7 @@ "durability": 9, "pocket_data": [ { + "magazine_well": "200 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -374,7 +388,8 @@ "name": { "str": "Hi-Point Model JCP" }, "description": "The Hi-Point Model JCP is a blowback operated semi-automatic pistol designed by Hi-Point Firearms, which is known for making inexpensive firearms, and for making said firearms bulky and uncomfortable. Hi-Points have slides made with a zinc pot-metal which is relatively fragile compared to steel slides.", "weight": "990 g", - "volume": "703 ml", + "volume": "546 ml", + "longest_side": "234 mm", "price": 7500, "price_postapoc": 2000, "to_hit": -2, @@ -386,6 +401,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "312 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/40x46mm.json b/data/json/items/gun/40x46mm.json index 6c5ce28dd4683..8bd960446ab64 100644 --- a/data/json/items/gun/40x46mm.json +++ b/data/json/items/gun/40x46mm.json @@ -28,7 +28,7 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 1 } } ] }, { "id": "m320", @@ -50,7 +50,7 @@ "durability": 9, "clip_size": 1, "reload": 150, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 1 } } ] }, { "id": "m79", @@ -82,7 +82,7 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 1 } } ] }, { "id": "mgl", @@ -113,7 +113,7 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 6 } } ] }, { "id": "rm802", @@ -146,7 +146,7 @@ [ "underbarrel", 1 ] ], "flags": [ "RELOAD_ONE", "WATERPROOF_GUN", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 4 } } ] }, { "id": "triple_launcher_simple", @@ -158,7 +158,7 @@ "price_postapoc": 1750, "modes": [ [ "DEFAULT", "single", 1, "NPC_AVOID" ], [ "MULTI", "multi", 3, [ "NPC_AVOID", "SIMULTANEOUS" ] ] ], "proportional": { "weight": 1.5, "volume": 1.8, "price": 2 }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 3 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 3 } } ] }, { "id": "pseudo_m203", @@ -183,6 +183,6 @@ "modes": [ [ "DEFAULT", "semi-auto", 1, "NPC_AVOID" ] ], "clip_size": 6, "flags": [ "MOUNTED_GUN" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x46mm": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x46mm": 6 } } ] } ] diff --git a/data/json/items/gun/410shot.json b/data/json/items/gun/410shot.json index ef2cbf0cc4e24..6c699c2b976c7 100644 --- a/data/json/items/gun/410shot.json +++ b/data/json/items/gun/410shot.json @@ -16,7 +16,7 @@ "material": [ "steel", "plastic" ], "dispersion": 395, "durability": 7, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "ammo": [ "410shot" ], "flags": [ "NEVER_JAMS" ], "pocket_data": [ @@ -41,6 +41,7 @@ "longest_side": "1152 mm", "price_postapoc": 2000, "blackpowder_tolerance": 80, - "ammo": [ "410shot" ] + "ammo": [ "410shot" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "410shot": 1 } } ] } ] diff --git a/data/json/items/gun/44.json b/data/json/items/gun/44.json index b030986c2f892..702f3bcd8ae4a 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -38,6 +38,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -82,7 +83,7 @@ [ "rail mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44": 10 } } ] }, { "id": "rifle_44", @@ -108,7 +109,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -121,7 +122,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44": 1 } } ] }, { "id": "ruger_redhawk", @@ -156,7 +157,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "44": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "44": 6 } } ] }, { "id": "sw629", @@ -191,6 +192,6 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "44": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "44": 6 } } ] } ] diff --git a/data/json/items/gun/44paper.json b/data/json/items/gun/44paper.json index a723fda4616f3..9a6a5f2fd9845 100644 --- a/data/json/items/gun/44paper.json +++ b/data/json/items/gun/44paper.json @@ -19,7 +19,7 @@ "durability": 7, "blackpowder_tolerance": 96, "clip_size": 6, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44paper": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44paper": 6 } } ] }, { "id": "lemat_revolver", @@ -54,6 +54,6 @@ ], "built_in_mods": [ "lemat_revolver_shotgun" ], "extend": { "flags": [ "NO_UNLOAD" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44paper": 9 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44paper": 9 } } ] } ] diff --git a/data/json/items/gun/45.json b/data/json/items/gun/45.json index e30135077d1d9..a1131ded07107 100644 --- a/data/json/items/gun/45.json +++ b/data/json/items/gun/45.json @@ -122,6 +122,7 @@ "blackpowder_tolerance": 48, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -218,7 +219,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -231,7 +232,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 1 } } ] }, { "id": "smg_45", @@ -257,7 +258,7 @@ "min_cycle_recoil": 456, "modes": [ [ "DEFAULT", "burst", 5 ] ], "loudness": 25, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 3 ], [ "barrel", 1 ], @@ -305,7 +306,7 @@ "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 5, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 5 } } ] }, { "id": "tommygun", @@ -331,7 +332,7 @@ "durability": 7, "min_cycle_recoil": 540, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 3 ], [ "barrel", 1 ], @@ -371,6 +372,7 @@ "built_in_mods": [ "match_trigger" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -412,6 +414,7 @@ "durability": 9, "pocket_data": [ { + "magazine_well": "240 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -441,6 +444,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "353 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/4570.json b/data/json/items/gun/4570.json index 761561d13ebbd..b946d8018974d 100644 --- a/data/json/items/gun/4570.json +++ b/data/json/items/gun/4570.json @@ -33,7 +33,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "4570": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "4570": 6 } } ] }, { "id": "bfr", @@ -68,7 +68,7 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "4570": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "4570": 5 } } ] }, { "id": "sharps", @@ -108,6 +108,6 @@ [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "4570": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "4570": 1 } } ] } ] diff --git a/data/json/items/gun/45colt.json b/data/json/items/gun/45colt.json index c31f3ae5c2d06..e41fef281547f 100644 --- a/data/json/items/gun/45colt.json +++ b/data/json/items/gun/45colt.json @@ -34,7 +34,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45colt": 2, "410shot": 2 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45colt": 2, "410shot": 2 } } ] }, { "id": "colt_lightning", @@ -60,7 +60,7 @@ "blackpowder_tolerance": 56, "reload_noise": "chik chik.", "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45colt": 14 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45colt": 14 } } ] }, { "id": "colt_saa", @@ -82,6 +82,6 @@ "durability": 8, "clip_size": 6, "proportional": { "reload": 1.5 }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45colt": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45colt": 6 } } ] } ] diff --git a/data/json/items/gun/460.json b/data/json/items/gun/460.json index 1e95df83773bc..d3954498777c3 100644 --- a/data/json/items/gun/460.json +++ b/data/json/items/gun/460.json @@ -13,6 +13,7 @@ "built_in_mods": [ "barrel_ported" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/50.json b/data/json/items/gun/50.json index 20fb476c66dd4..a3d2580414955 100644 --- a/data/json/items/gun/50.json +++ b/data/json/items/gun/50.json @@ -19,7 +19,7 @@ "ranged_damage": { "damage_type": "bullet", "amount": -5 }, "dispersion": 130, "durability": 8, - "barrel_length": "1250 ml", + "barrel_volume": "1250 ml", "default_mods": [ "bipod", "rifle_scope", "muzzle_brake" ], "flags": [ "NEVER_JAMS" ], "pocket_data": [ @@ -52,7 +52,7 @@ "dispersion": 250, "durability": 8, "reload": 400, - "barrel_length": "1250 ml", + "barrel_volume": "1250 ml", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 3 ] ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -101,15 +101,15 @@ [ "underbarrel mount", 1 ] ], "relative": { - "weight": -21500, - "volume": -6, + "weight": "-21500 g", + "volume": "-1500 ml", "price": -1210000, "ranged_damage": { "damage_type": "bullet", "amount": -4 }, "dispersion": 60, - "barrel_length": -1 + "barrel_volume": "-250 ml" }, "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "50": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "rigid": true, "ammo_restriction": { "50": 1 } } ] }, { "id": "as50", @@ -131,7 +131,7 @@ "dispersion": 80, "durability": 7, "reload": 400, - "barrel_length": "1250 ml", + "barrel_volume": "1250 ml", "default_mods": [ "bipod", "rifle_scope", "muzzle_brake" ], "flags": [ "NEVER_JAMS" ], "pocket_data": [ @@ -164,7 +164,7 @@ "dispersion": 50, "durability": 8, "reload": 450, - "barrel_length": "1250 ml", + "barrel_volume": "1250 ml", "default_mods": [ "recoil_stock", "bipod", "rifle_scope", "muzzle_brake" ], "flags": [ "NEVER_JAMS" ], "pocket_data": [ @@ -196,10 +196,10 @@ "ranged_damage": { "damage_type": "bullet", "amount": -5 }, "dispersion": 110, "durability": 8, - "barrel_length": "1250 ml", + "barrel_volume": "1250 ml", "default_mods": [ "bipod", "rifle_scope", "muzzle_brake" ], "clip_size": 1, "flags": [ "NEVER_JAMS", "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "50": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 1 } } ] } ] diff --git a/data/json/items/gun/500.json b/data/json/items/gun/500.json index 5cfd9aa940961..f73571776caa8 100644 --- a/data/json/items/gun/500.json +++ b/data/json/items/gun/500.json @@ -34,7 +34,7 @@ [ "rail mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "500": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "500": 7 } } ] }, { "id": "sw_500", @@ -44,11 +44,12 @@ "name": { "str_sp": "S&W 500" }, "description": "The 5-shot Smith and Wesson 500 revolver fires the comparably-named .500 S&W Magnum. It's an impressive weapon.", "weight": "1960 g", - "volume": "750 ml", + "volume": "1307 ml", "price": 90000, "price_postapoc": 3500, "to_hit": -2, "bashing": 12, + "longest_side": "407 mm", "material": [ "steel", "plastic" ], "symbol": "(", "color": "light_gray", diff --git a/data/json/items/gun/545x39.json b/data/json/items/gun/545x39.json index f0776a85b9ad5..b7d13c6bde593 100644 --- a/data/json/items/gun/545x39.json +++ b/data/json/items/gun/545x39.json @@ -22,7 +22,7 @@ "dispersion": 150, "durability": 8, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], diff --git a/data/json/items/gun/57.json b/data/json/items/gun/57.json index 07577623f26a2..5c6bef149af7f 100644 --- a/data/json/items/gun/57.json +++ b/data/json/items/gun/57.json @@ -37,6 +37,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -84,6 +85,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "500 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/5x50.json b/data/json/items/gun/5x50.json index 8587b8ab3d017..aaef493348292 100644 --- a/data/json/items/gun/5x50.json +++ b/data/json/items/gun/5x50.json @@ -21,7 +21,7 @@ "ranged_damage": { "damage_type": "bullet", "amount": 10 }, "dispersion": 220, "durability": 9, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "5 rd.", 5 ], [ "AUTO", "auto", 4 ] ], "valid_mod_locations": [ [ "accessories", 3 ], diff --git a/data/json/items/gun/66mm.json b/data/json/items/gun/66mm.json index 3d0e7016333e4..ac58f9844ba5d 100644 --- a/data/json/items/gun/66mm.json +++ b/data/json/items/gun/66mm.json @@ -26,6 +26,7 @@ "flags": [ "BACKBLAST", "NEVER_JAMS" ], "pocket_data": [ { + "magazine_well": "500 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/700nx.json b/data/json/items/gun/700nx.json index 9272a5ffa7a13..8e30c1839f744 100644 --- a/data/json/items/gun/700nx.json +++ b/data/json/items/gun/700nx.json @@ -21,7 +21,7 @@ "durability": 8, "clip_size": 1, "reload": 600, - "barrel_length": "1000 ml", + "barrel_volume": "1000 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], @@ -34,6 +34,6 @@ [ "underbarrel", 1 ] ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "700nx": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "700nx": 1 } } ] } ] diff --git a/data/json/items/gun/762.json b/data/json/items/gun/762.json index 8ee6fec7d9b75..0fa8861aadb03 100644 --- a/data/json/items/gun/762.json +++ b/data/json/items/gun/762.json @@ -68,7 +68,7 @@ "dispersion": 160, "durability": 9, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "default_mods": [ "folding_stock" ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -117,7 +117,7 @@ "dispersion": 90, "durability": 8, "clip_size": 10, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "built_in_mods": [ "inter_bayonet" ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -135,6 +135,7 @@ ], "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], "pocket_data": [ + { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 10 } }, { "pocket_type": "MAGAZINE_WELL", "holster": true, diff --git a/data/json/items/gun/762R.json b/data/json/items/gun/762R.json index 9dd327fd2fe7d..34bb7a4bd7225 100644 --- a/data/json/items/gun/762R.json +++ b/data/json/items/gun/762R.json @@ -9,11 +9,11 @@ "price": 23000, "price_postapoc": 3000, "relative": { - "volume": -2, + "volume": "-500 ml", "range": -6, "ranged_damage": { "damage_type": "bullet", "amount": -3 }, "dispersion": 60, - "barrel_length": -2 + "barrel_volume": "-500 ml" } }, { @@ -61,7 +61,7 @@ "dispersion": 90, "durability": 10, "clip_size": 5, - "barrel_length": "1000 ml", + "barrel_volume": "1000 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -73,6 +73,7 @@ ], "flags": [ "RELOAD_ONE" ], "pocket_data": [ + { "pocket_type": "MAGAZINE", "ammo_restriction": { "762R": 5 } }, { "pocket_type": "MAGAZINE_WELL", "holster": true, diff --git a/data/json/items/gun/762x25.json b/data/json/items/gun/762x25.json index 77e278bfc069a..4d0b550bed311 100644 --- a/data/json/items/gun/762x25.json +++ b/data/json/items/gun/762x25.json @@ -23,7 +23,7 @@ "dispersion": 120, "durability": 8, "min_cycle_recoil": 270, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 5 ] ], "valid_mod_locations": [ [ "accessories", 3 ], @@ -71,6 +71,7 @@ "min_cycle_recoil": 270, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/84x246mm.json b/data/json/items/gun/84x246mm.json index 399a4607ef012..9c7e5d0ccb169 100644 --- a/data/json/items/gun/84x246mm.json +++ b/data/json/items/gun/84x246mm.json @@ -31,7 +31,7 @@ [ "rail mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "84x246mm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "84x246mm": 1 } } ] }, { "id": "AT4", diff --git a/data/json/items/gun/8x40mm.json b/data/json/items/gun/8x40mm.json index 5394c071d09d9..b9142e827b2e7 100644 --- a/data/json/items/gun/8x40mm.json +++ b/data/json/items/gun/8x40mm.json @@ -65,7 +65,7 @@ "dispersion": 10, "durability": 9, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 2 ] ], - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "built_in_mods": [ "riv_scope", "riv_suppressor" ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -154,7 +154,7 @@ "durability": 9, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 6 ] ], "reload": 400, - "barrel_length": "1500 ml", + "barrel_volume": "1500 ml", "valid_mod_locations": [ [ "barrel", 1 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "rail", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], "flags": [ "WATERPROOF_GUN", "NEVER_JAMS" ], "pocket_data": [ @@ -231,7 +231,7 @@ "dispersion": 70, "durability": 9, "reload": 200, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "4 rd.", 4 ], [ "AUTO", "auto", 6 ] ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -275,7 +275,7 @@ "dispersion": 30, "durability": 9, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], diff --git a/data/json/items/gun/9mm.json b/data/json/items/gun/9mm.json index 5a06f074d1d58..26b02aa303d26 100644 --- a/data/json/items/gun/9mm.json +++ b/data/json/items/gun/9mm.json @@ -7,7 +7,8 @@ "name": { "str": "Beretta 90-two" }, "description": "A more modern version of Beretta's popular 92 series of handguns, the 90-two performs largely the same. The main difference is a sleeker, almost futuristic-looking design owed in large parts to the polymer underbarrel rail cover.", "weight": "921 g", - "volume": "518 ml", + "volume": "554 ml", + "longest_side": "250 mm", "price": 65000, "to_hit": -2, "bashing": 8, @@ -21,6 +22,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -85,8 +87,9 @@ "reload_noise_volume": 10, "name": { "str": "Cx4 Storm" }, "description": "A small pistol caliber carbine designed for police use and civilian self-defense, the Cx4 Storm uses magazines that are interchangeable with other Beretta 9x19mm handguns.", - "weight": "2580 g", - "volume": "1500 ml", + "weight": "2575 g", + "volume": "4458 ml", + "longest_side": "762 mm", "price": 90000, "price_postapoc": 4000, "to_hit": -1, @@ -101,7 +104,7 @@ "dispersion": 180, "durability": 10, "min_cycle_recoil": 450, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -135,7 +138,8 @@ "name": { "str": "Glock 19" }, "description": "Possibly the most popular pistol in existence. The Glock 19 is often derided for its plastic construction, but it is easy to shoot.", "weight": "600 g", - "volume": "500 ml", + "volume": "386 ml", + "longest_side": "211 mm", "price": 69000, "price_postapoc": 2500, "to_hit": -2, @@ -151,6 +155,7 @@ "min_cycle_recoil": 380, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -166,8 +171,9 @@ "reload_noise_volume": 10, "name": { "str": "H&K MP5A2" }, "description": "The Heckler & Koch MP5 is one of the most widely-used submachine guns in the world, and has been adopted by special police forces and militaries alike. Its high degree of accuracy and low recoil are universally praised.", - "weight": "2730 g", - "volume": "2894 ml", + "weight": "2726 g", + "volume": "3932 ml", + "longest_side": "682 mm", "price": 280000, "price_postapoc": 3500, "to_hit": -2, @@ -215,22 +221,10 @@ "name": { "str": "H&K MP5SD" }, "description": "The H&K MP5SD offers subsonic performance in almost the same footprint as the H&K MP5, retaining its handiness. The large suppressor cuts down on muzzle flash greatly, aiding in night operations. It has also seen some popularity with SWAT teams, as it lowers the risk of fire and explosions in illegal laboratories. With body armor in more common use, the MP5SD has waned in popularity among special forces due to its decreased terminal performance.", "weight": "3230 g", + "volume": "3499 ml", + "longest_side": "666 mm", "price": 3000000, "price_postapoc": 14000, - "valid_mod_locations": [ - [ "accessories", 3 ], - [ "barrel", 1 ], - [ "bore", 1 ], - [ "brass catcher", 1 ], - [ "grip", 1 ], - [ "mechanism", 4 ], - [ "rail mount", 1 ], - [ "sights mount", 1 ], - [ "underbarrel mount", 1 ], - [ "sling", 1 ], - [ "stock", 1 ] - ], - "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "3 rd.", 3 ], [ "AUTO", "auto", 4 ] ], "built_in_mods": [ "mp5sd_suppressor" ] }, { @@ -239,8 +233,10 @@ "copy-from": "hk_mp5", "name": { "str": "H&K MP5K-PDW" }, "description": "The Heckler & Koch MP5 is one of the most widely-used submachine guns in the world, and has been adopted by special police forces and militaries alike. Its high degree of accuracy and low recoil are universally praised. The MP5K-PDW model features a shorter barrel, a built-in foregrip, and a side folding stock for vehicle or aircraft crew use.", - "weight": "2360 g", - "volume": "1753 ml", + "weight": "2292 g", + "volume": "2601 ml", + "//": "Forward grip's 68g & 119ml deducted", + "longest_side": "377 mm", "price_postapoc": 3500, "bashing": 8, "dispersion": 270, @@ -267,8 +263,10 @@ "copy-from": "hk_mp5", "name": { "str": "PTR 603" }, "description": "The PTR 603 is a semi-automatic copy of the famous MP5 series, domestically produced for the US market on original Heckler and Koch tooling by PTR Industries. Like the MP5, its roller delayed blowback action offers smooth shooting and precision, setting it apart from other submachine guns and pistol caliber carbines. This model is configured as a pistol to avoid inconvenient and costly NFA regulations. A welded on section of M1913 rail offers convenient mounting for aftermarket optics, but precludes the use of claw mounts.", - "relative": { "weight": -550, "volume": "-500 ml", "handling_modifier": -6 }, - "//": "Attach a pistol stock and you get a semi MP5 again.", + "weight": "2177 g", + "volume": "2110 ml", + "longest_side": "377 mm", + "skill": "pistol", "modes": [ [ "DEFAULT", "semi-auto", 1 ] ], "bashing": 7, "dispersion": 270, @@ -291,11 +289,13 @@ { "id": "briefcase_smg", "copy-from": "hk_mp5k", + "looks_like": "hk_briefcase", "type": "GUN", "name": { "str": "H&K operational briefcase" }, "description": "This is a hard-sided briefcase with a trigger in the handle and a concealed hole in the side. To fire the internally mounted MP5K-PDW, one braces the briefcase at the waist, ensures the briefcase is pointed at the enemy, and squeezes the trigger. Precision and handling are severely hampered all around, however if you need to 'hand over the goods' or look low profile while bodyguarding, this is your gun. When the briefcase is open the MP5 may be reloaded or dismounted.", - "weight": "3570 g", - "volume": "15 L", + "weight": "3800 g", + "volume": "15232 ml", + "longest_side": "544 mm", "price": 480000, "price_postapoc": 5000, "bashing": 15, @@ -307,6 +307,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -337,7 +338,7 @@ "dispersion": 180, "durability": 7, "min_cycle_recoil": 450, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "built_in_mods": [ "folding_stock" ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -354,6 +355,7 @@ "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -385,6 +387,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -415,6 +418,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -449,7 +453,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "750 ml", + "barrel_volume": "750 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -462,7 +466,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 1 } } ] }, { "id": "smg_9mm", @@ -488,7 +492,7 @@ "min_cycle_recoil": 380, "modes": [ [ "DEFAULT", "burst", 5 ] ], "loudness": 25, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 3 ], [ "barrel", 1 ], @@ -610,8 +614,9 @@ "type": "GUN", "name": { "str_sp": "USP 9mm" }, "description": "A popular pistol, widely used among law enforcement. Extensively tested for durability, it has been found to stay accurate even after being subjected to extreme abuse.", - "weight": "770 g", - "volume": "500 ml", + "weight": "771 g", + "volume": "460 ml", + "longest_side": "230 mm", "price": 68000, "price_postapoc": 2500, "to_hit": -2, @@ -627,6 +632,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -690,7 +696,8 @@ "name": { "str": "Glock 17" }, "description": "Designed for all shooters, the Glock 17 is marketed towards law-enforcement and military.", "weight": "630 g", - "volume": "500 ml", + "volume": "427 ml", + "longest_side": "233 mm", "price": 69000, "price_postapoc": 2500, "to_hit": -2, @@ -706,6 +713,7 @@ "//2": "Glock 17s cannot load magazines shorter than the standard 17rd magazine.", "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -742,6 +750,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "65 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -771,6 +780,7 @@ "min_cycle_recoil": 450, "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -799,6 +809,7 @@ "durability": 8, "pocket_data": [ { + "magazine_well": "191 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -827,6 +838,7 @@ "durability": 8, "pocket_data": [ { + "magazine_well": "228 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -854,6 +866,7 @@ "durability": 9, "pocket_data": [ { + "magazine_well": "207 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -882,6 +895,7 @@ "durability": 7, "pocket_data": [ { + "magazine_well": "284 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -895,10 +909,11 @@ "copy-from": "pistol_base", "looks_like": "glock_17", "type": "GUN", - "name": { "str": "CZ-75" }, - "description": "The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one of the original wonder nines. Though designed for export to western countries, it was declared a state secret; lack of international patent protection meant that many clones and variants were produced and distributed around the world, with Česká zbrojovka only joining in the 90's. This pistol remains wildly popular among competition shooters.", - "weight": "1000 g", - "volume": "526 ml", + "name": { "str": "CZ 75 B" }, + "description": "The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is one of the original wonder nines. Though designed for export to western countries, it was declared a state secret; lack of international patent protection meant that many clones and variants were produced and distributed around the world, with Česká zbrojovka only joining in the 90's. This pistol remains wildly popular among competition shooters.", + "weight": "998 g", + "volume": "476 ml", + "longest_side": "238 mm", "price": 10000, "price_postapoc": 2500, "to_hit": -2, @@ -910,6 +925,7 @@ "durability": 8, "pocket_data": [ { + "magazine_well": "230 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", @@ -925,8 +941,9 @@ "type": "GUN", "name": { "str": "Walther CCP" }, "description": "The Walther CCP is a gas-delayed blowback semi-automatic pistol intended for the concealed carry consumer market. Internally, it is nearly identical to the cult classic H&K P7. Its fixed barrel design makes it potentially more accurate than many other pistols, though this may difficult to realize with its average trigger and short sight radius.", - "weight": "570 g", - "volume": "318 ml", + "weight": "567 g", + "volume": "334 ml", + "longest_side": "194 mm", "price": 12500, "price_postapoc": 2000, "to_hit": -2, @@ -938,6 +955,7 @@ "durability": 8, "pocket_data": [ { + "magazine_well": "176 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/9x18.json b/data/json/items/gun/9x18.json index 96adc8253495d..35c763dc217be 100644 --- a/data/json/items/gun/9x18.json +++ b/data/json/items/gun/9x18.json @@ -35,6 +35,7 @@ ], "pocket_data": [ { + "magazine_well": "250 ml", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/atgm.json b/data/json/items/gun/atgm.json index 33bd8e8484c54..7db3239f25017 100644 --- a/data/json/items/gun/atgm.json +++ b/data/json/items/gun/atgm.json @@ -24,6 +24,6 @@ "loudness": 200, "valid_mod_locations": [ [ "sling", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], "flags": [ "MOUNTED_GUN", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "atgm": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "atgm": 1 } } ] } ] diff --git a/data/json/items/gun/bio.json b/data/json/items/gun/bio.json index df62252c72bfa..fd4409a01e1b5 100644 --- a/data/json/items/gun/bio.json +++ b/data/json/items/gun/bio.json @@ -21,7 +21,7 @@ "clip_size": 1, "reload": 200, "flags": [ "NEVER_JAMS", "RELOAD_EJECT", "NO_UNWIELD", "TRADER_AVOID" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 1 } } ] }, { "id": "bio_emp_gun", diff --git a/data/json/items/gun/blunderbuss.json b/data/json/items/gun/blunderbuss.json index 4bc6d6b11ff06..c46dc7f323712 100644 --- a/data/json/items/gun/blunderbuss.json +++ b/data/json/items/gun/blunderbuss.json @@ -30,6 +30,6 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "blunderbuss": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "blunderbuss": 1 } } ] } ] diff --git a/data/json/items/gun/chemical_spray.json b/data/json/items/gun/chemical_spray.json index 8fa4df29ef16e..cc5a60f747259 100644 --- a/data/json/items/gun/chemical_spray.json +++ b/data/json/items/gun/chemical_spray.json @@ -30,6 +30,7 @@ ], "pocket_data": [ { + "magazine_well": "2 L", "pocket_type": "MAGAZINE_WELL", "holster": true, "max_contains_volume": "20 L", diff --git a/data/json/items/gun/combination.json b/data/json/items/gun/combination.json index 399539152a8ac..8e35cad95c27c 100644 --- a/data/json/items/gun/combination.json +++ b/data/json/items/gun/combination.json @@ -22,7 +22,7 @@ "blackpowder_tolerance": 56, "clip_size": 1, "loudness": 25, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "built_in_mods": [ "combination_gun_shotgun" ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "valid_mod_locations": [ @@ -38,6 +38,6 @@ [ "underbarrel", 1 ], [ "rail mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 1 } } ] } ] diff --git a/data/json/items/gun/exodii.json b/data/json/items/gun/exodii.json new file mode 100644 index 0000000000000..d76c98fa2fbd5 --- /dev/null +++ b/data/json/items/gun/exodii.json @@ -0,0 +1,66 @@ +[ + { + "id": "pamd68", + "looks_like": "ar15", + "type": "GUN", + "reload_noise_volume": 10, + "name": { "str": "PA md. 68 Battle Rifle" }, + "description": "The most popular gun to use the 12.3ln cartridge was, of course, the PA md. 71. Its predecessor, the md. 68, was viewed by many as a sort of failure: although it was reliable and powerful, it was too heavy to be used as a good infantry weapon, and not really heavy enough to be a good support gun. Enough were made, though, that during the zombie apocalypse, it gained a great deal of resurgent popularity as a light emplacement gun that used readily available ammunition. It perfectly served the purposes of the Exodii, who had far less concern about its unwieldiness.", + "weight": "9480 g", + "volume": "2800 ml", + "price": 350000, + "price_postapoc": 4000, + "to_hit": -3, + "bashing": 12, + "material": [ "steel", "aluminum" ], + "symbol": "(", + "color": "dark_gray", + "ammo": [ "123ln" ], + "skill": "rifle", + "dispersion": 190, + "durability": 9, + "min_cycle_recoil": 3820, + "modes": [ [ "DEFAULT", "auto", 2 ], [ "AUTO", "auto", 5 ] ], + "barrel_volume": "1200 ml", + "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "exodiiBRmag" ] + } + ] + }, + { + "id": "pamd71z", + "copy-from": "rifle_manual", + "looks_like": "ar15", + "type": "GUN", + "name": { "str": "PA md. 71 zombie hunting rifle" }, + "description": "This extremely popular Romanian assault rifle, made famous in the third Carpachian War, has been redesigned slightly by the Exodii to serve as a sniper weapon. It is well suited to precision shots against high-priority targets. This modified design fires an extremely rapid 5-shot burst, with the goal of shredding the target and preventing revivification.", + "weight": "3910 g", + "volume": "3 L", + "price": 80000, + "price_postapoc": 3250, + "to_hit": -1, + "bashing": 12, + "material": [ "steel", "aluminum" ], + "color": "light_gray", + "ammo": [ "123ln" ], + "dispersion": 100, + "durability": 8, + "modes": [ [ "DEFAULT", "auto", 5 ] ], + "barrel_volume": "250 ml", + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "exodiiminimag" ] + } + ] + } +] diff --git a/data/json/items/gun/flintlock.json b/data/json/items/gun/flintlock.json index 9f6fd1ac3fd77..7fa5068592ba0 100644 --- a/data/json/items/gun/flintlock.json +++ b/data/json/items/gun/flintlock.json @@ -21,7 +21,7 @@ "longest_side": "1202 mm", "relative": { "range": -2, "ranged_damage": { "damage_type": "bullet", "amount": -4 } }, "proportional": { "bashing": 0.6, "dispersion": 1.35, "reload": 0.6 }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flintlock": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flintlock": 1 } } ] }, { "id": "carbine_flintlock_double", @@ -32,9 +32,9 @@ "clip_size": 2, "price_postapoc": 2750, "proportional": { "dispersion": 1.3, "weight": 1.25, "volume": 1.25 }, - "relative": { "weight": 400, "range": -1, "ranged_damage": { "damage_type": "bullet", "amount": -2 } }, + "relative": { "weight": "400 g", "range": -1, "ranged_damage": { "damage_type": "bullet", "amount": -2 } }, "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flintlock": 2 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flintlock": 2 } } ] }, { "id": "pistol_flintlock", @@ -71,7 +71,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flintlock": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flintlock": 1 } } ] }, { "id": "rifle_flintlock", @@ -109,7 +109,7 @@ [ "stock mount", 1 ] ], "flags": [ "NEVER_JAMS", "DURABLE_MELEE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flintlock": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flintlock": 1 } } ] }, { "id": "longrifle_flintlock", diff --git a/data/json/items/gun/monster_gun.json b/data/json/items/gun/monster_gun.json index cae8386bd919f..4bfc73c060e37 100644 --- a/data/json/items/gun/monster_gun.json +++ b/data/json/items/gun/monster_gun.json @@ -29,7 +29,7 @@ "range": 12, "dispersion": 100, "durability": 8, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "barb": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "barb": 1 } } ] }, { "id": "emp_frond", @@ -61,5 +61,34 @@ "range": 12, "dispersion": 150, "durability": 8 + }, + { + "id": "feral_human_thrown_rock", + "type": "GUN", + "symbol": "%", + "color": "red", + "name": { "str": "hurled rubble" }, + "description": "Stone at the ready to crush that which isn't part of the blob.", + "material": [ "stone" ], + "flags": [ + "PRIMITIVE_RANGED_WEAPON", + "NEVER_JAMS", + "NONCONDUCTIVE", + "NO_REPAIR", + "WATERPROOF_GUN", + "NO_SALVAGE", + "NO_UNLOAD", + "NO_AMMO" + ], + "skill": "throw", + "ranged_damage": { "damage_type": "bash", "amount": 1 }, + "weight": "540 g", + "volume": "750ml", + "bashing": 2, + "to_hit": 1, + "loudness": 2, + "range": 6, + "dispersion": 150, + "durability": 8 } ] diff --git a/data/json/items/gun/nail.json b/data/json/items/gun/nail.json index 78d6131d31fb3..6b0b9c1eaf650 100644 --- a/data/json/items/gun/nail.json +++ b/data/json/items/gun/nail.json @@ -23,6 +23,6 @@ "clip_size": 20, "reload": 50, "valid_mod_locations": [ [ "grip mount", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "nail": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "nail": 20 } } ] } ] diff --git a/data/json/items/gun/paintball.json b/data/json/items/gun/paintball.json index c404bee48c09d..af6a192a89fce 100644 --- a/data/json/items/gun/paintball.json +++ b/data/json/items/gun/paintball.json @@ -32,6 +32,6 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "paintball": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "paintball": 50 } } ] } ] diff --git a/data/json/items/gun/shot.json b/data/json/items/gun/shot.json index 96c792eea6d41..8a393c133a150 100644 --- a/data/json/items/gun/shot.json +++ b/data/json/items/gun/shot.json @@ -7,7 +7,8 @@ "name": { "str": "12 gauge pistol" }, "description": "A single shot pistol that loads 12 gauge shotgun shells, handcrafted from scrap.", "weight": "828 g", - "volume": "500 ml", + "volume": "800 ml", + "longest_side": "35 cm", "price": 100000, "price_postapoc": 500, "to_hit": -2, @@ -32,7 +33,7 @@ ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 1 } } ] }, { "id": "bigun", @@ -43,6 +44,7 @@ "description": "An electrically driven six barrel gatling shotgun, fed from handmade cloth belts. Even properly mounted, this seems like an unwieldy beast, and the six separate barrels make for difficult zeroing. The externally driven action means this is much less likely to jam.", "weight": "4980 g", "volume": "4500 ml", + "longest_side": "110 cm", "price": 180000, "price_postapoc": 1750, "to_hit": -2, @@ -71,9 +73,10 @@ "looks_like": "remington_870", "type": "GUN", "name": { "str": "handmade lever shotgun" }, - "description": "A short homemade lever-action shotgun with a small internal tube magazine. While still a primitive pipe and 2x4 design, it is a formiddable shotgun in it's own right with room for improvement.", + "description": "A short homemade lever-action shotgun with a small internal tube magazine. While still a primitive pipe and 2x4 design, it is a formiddable shotgun in its own right with room for improvement.", "weight": "2311 g", "volume": "2 L", + "longest_side": "85 cm", "price": 10000, "price_postapoc": 2250, "to_hit": -1, @@ -82,7 +85,7 @@ "ranged_damage": { "damage_type": "bullet", "amount": -2 }, "dispersion": 550, "durability": 6, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -99,7 +102,7 @@ ], "clip_size": 6, "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { "id": "browning_a5", @@ -107,8 +110,9 @@ "type": "GUN", "name": { "str": "Browning Auto 5" }, "description": "This humble looking shotgun was the earliest successful semi-automatic shotgun, and the second most successful in U.S. history, with over 2.7 million made between 1902 and 1998. The recoil tuning mechanism under the handguard and long dwell time of the action make for pleasant shooting.", - "weight": "4100 g", + "weight": "3090 g", "volume": "3525 ml", + "longest_side": "1263 mm", "looks_like": "remington_870", "price": 80000, "price_postapoc": 2000, @@ -120,7 +124,7 @@ "durability": 6, "clip_size": 5, "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 5 } } ] }, { "id": "ksg", @@ -131,6 +135,7 @@ "description": "A bullpup pump-action shotgun, the Kel-Tec KSG uses a pair of magazine tubes to increase its capacity. Each tube has to be loaded separately, but this offers the option of loading different ammunition for different situations.", "weight": "1550 g", "volume": "3371 ml", + "longest_side": "672 mm", "price": 99000, "price_postapoc": 2250, "to_hit": -1, @@ -155,7 +160,7 @@ [ "sling", 1 ], [ "underbarrel", 2 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 7 } } ] }, { "id": "ksg-25", @@ -166,6 +171,7 @@ "description": "A bullpup pump-action shotgun, the Kel-Tec KSG-25 uses a pair of magazine tubes to increase its capacity. Each tube has to be loaded separately, but this offers the option of loading different ammunition for different situations. The big brother of the KSG, it has a longer barrel and longer magazine tubes.", "weight": "2100 g", "volume": "4495 ml", + "longest_side": "971 mm", "price": 140000, "to_hit": -1, "bashing": 9, @@ -189,7 +195,7 @@ [ "sling", 1 ], [ "underbarrel", 2 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 12 } } ] }, { "id": "m1014", @@ -198,8 +204,9 @@ "type": "GUN", "name": { "str": "M1014 shotgun" }, "description": "Benelli's first gas-operated shotgun, featuring dual pistons for enhanced reliability with various loads and a collapsible buttstock that reduces length by almost 8 inches. Adopted in 1999 as the M1014 Joint Service Combat Shotgun, the Benelli M4 is one of the finest combat shotguns available.", - "weight": "3550 g", - "volume": "2500 ml", + "weight": "3629 g", + "volume": "6302 ml", + "longest_side": "1021 mm", "price": 169900, "price_postapoc": 3500, "to_hit": -1, @@ -221,7 +228,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE", "NEEDS_UNFOLD" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 8 } } ] }, { "id": "mossberg_500", @@ -230,19 +237,20 @@ "type": "GUN", "name": { "str_sp": "Mossberg 500 Field" }, "description": "The Mossberg 500 is a popular series of pump-action shotguns, often acquired for military use. It is noted for its high durability and low recoil. This one is fitted with a 28 inch barrel with sight rib.", - "weight": "3180 g", + "weight": "3402 g", "volume": "2450 ml", + "longest_side": "1166 mm", "price": 53800, "price_postapoc": 2250, "to_hit": -1, "bashing": 13, - "barrel_length": "186 ml", + "barrel_volume": "186 ml", "material": [ "steel", "aluminum", "plastic" ], "dispersion": 325, "ranged_damage": { "damage_type": "bullet", "amount": 4 }, "durability": 9, "clip_size": 6, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { "id": "mossberg_500_security", @@ -252,11 +260,12 @@ "description": "The Mossberg 500 is a popular series of pump-action shotguns, often acquired for military use. It is noted for its high durability and low recoil. This one is fitted with an 18.5 inch barrel.", "weight": "3062 g", "volume": "2386 ml", + "longest_side": "1016 mm", "looks_like": "mossberg_500", "price": 53800, "price_postapoc": 2250, "bashing": 12, - "barrel_length": "28 ml", + "barrel_volume": "28 ml", "dispersion": 375, "ranged_damage": { "damage_type": "bullet", "amount": 1 } }, @@ -268,12 +277,13 @@ "description": "The Mossberg 590A1 is a military and police oriented version of the Mossberg 500. It features a heavier barrel, a bayonet lug, and a different magazine tube for easier cleaning and maintenance.", "weight": "3289 g", "volume": "2548 ml", + "longest_side": "1043 mm", "looks_like": "mossberg_500", "default_mods": [ "sights_mount", "underbarrel_mount" ], "price": 70000, - "barrel_length": "0 ml", + "barrel_volume": "0 ml", "clip_size": 9, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 9 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 9 } } ] }, { "id": "mossberg_930", @@ -283,6 +293,7 @@ "description": "This semi-automatic offering from Mossberg features a recoil reducing gas system, rifle style sights and a factory-installed picatinny rail. Affordable pricing and decent ergonomics make this a popular entry-level 3-gun shotgun.", "weight": "3402 g", "volume": "2623 ml", + "longest_side": "994 mm", "looks_like": "m1014", "price": 60000, "price_postapoc": 2250, @@ -307,7 +318,7 @@ [ "underbarrel mount", 1 ] ], "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 8 } } ] }, { "id": "pipe_double_shotgun", @@ -318,8 +329,8 @@ "description": "A home-made double-barreled shotgun. It is simply two pipes attached to a stock, with a pair of hammers to strike the two rounds it holds.", "clip_size": 2, "modes": [ [ "DEFAULT", "single", 1 ], [ "DOUBLE", "double", 2 ] ], - "relative": { "weight": 500, "volume": 1, "price": 5000 }, - "barrel_length": "72 ml", + "relative": { "weight": "500 g", "volume": "250 ml", "price": 5000 }, + "barrel_volume": "72 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], @@ -331,7 +342,7 @@ [ "underbarrel mount", 1 ] ], "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 2 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 2 } } ] }, { "id": "pipe_shotgun", @@ -342,6 +353,7 @@ "description": "A home-made shotgun. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", "weight": "2267 g", "volume": "2250 ml", + "longest_side": "95 cm", "price": 20000, "price_postapoc": 500, "to_hit": -1, @@ -352,7 +364,7 @@ "durability": 6, "clip_size": 1, "reload": 200, - "barrel_length": "36 ml", + "barrel_volume": "36 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], @@ -365,7 +377,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 1 } } ] }, { "id": "remington_870", @@ -376,6 +388,7 @@ "description": "With over 10 million made, the Remington 870 is one of the most popular shotguns on the market, and finds use with hunters and law enforcement agencies alike thanks to its high accuracy and muzzle velocity. This one is a 28 inch barreled model for hunting fowl and game.", "weight": "3400 g", "volume": "2487 ml", + "longest_side": "1234 mm", "price": 58700, "price_postapoc": 2500, "to_hit": -1, @@ -385,8 +398,8 @@ "ranged_damage": { "damage_type": "bullet", "amount": 6 }, "durability": 8, "clip_size": 5, - "barrel_length": "229 ml", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 5 } } ] + "barrel_volume": "229 ml", + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 5 } } ] }, { "id": "remington_870_breacher", @@ -396,6 +409,7 @@ "description": "This Remington 870 Modular Combat System shotgun is currently setup for breaching operations, with a 10 inch barrel and no stock. It is small enough to carry as a secondary weapon, specifically to pop open any pesky doors you might come across. The grip's design makes for controllable yet unpleasant recoil, and the barrel lacks any sights.", "weight": "2812 g", "volume": "1284 ml", + "longest_side": "53 cm", "looks_like": "remington_870", "ranged_damage": { "damage_type": "bullet", "amount": -5 }, "skill": "pistol", @@ -405,7 +419,7 @@ "clip_size": 4, "price": 53800, "price_postapoc": 2250, - "barrel_length": "0 ml", + "barrel_volume": "0 ml", "built_in_mods": [ "breacher_grip" ], "valid_mod_locations": [ [ "accessories", 4 ], @@ -421,7 +435,7 @@ [ "stock", 1 ], [ "underbarrel mount", 1 ] ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 4 } } ] }, { "id": "remington_870_express", @@ -431,13 +445,14 @@ "description": "With over 10 million made, the Remington 870 is one of the most popular shotguns on the market, and finds use with hunters and law enforcement agencies alike thanks to its high accuracy and muzzle velocity. This one is an 18.5 inch barreled defensive model.", "weight": "3402 g", "volume": "2365 ml", + "longest_side": "983 mm", "looks_like": "remington_870", "ranged_damage": { "damage_type": "bullet", "amount": 1 }, "dispersion": 345, "clip_size": 7, - "barrel_length": "20 ml", + "barrel_volume": "20 ml", "price": 33800, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 7 } } ] }, { "id": "remington_1100", @@ -447,6 +462,7 @@ "description": "This semi-automatic shotgun features a self compensating gas system that will feed a wide array of shells while also reducing recoil. Introduced in 1963, it is favored by law enforcement, hunters and competition shooters, and has been the best-selling autoloading shotgun in U.S. history. This is the nickel finished, teflon coated competition model, with a full length magazine tube and 30 inch barrel.", "weight": "3742 g", "volume": "2626 ml", + "longest_side": "1288 mm", "price_postapoc": 3250, "looks_like": "remington_870", "price": 130000, @@ -457,7 +473,7 @@ "ranged_damage": { "damage_type": "bullet", "amount": 6 }, "durability": 8, "clip_size": 10, - "barrel_length": "299 ml", + "barrel_volume": "299 ml", "built_in_mods": [ "match_trigger" ], "default_mods": [ "recoil_stock" ], "valid_mod_locations": [ @@ -473,7 +489,7 @@ [ "underbarrel mount", 1 ] ], "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 5 } } ] }, { "id": "revolver_shotgun", @@ -484,6 +500,7 @@ "description": "A shotgun modified to use a revolver cylinder mechanism, it can hold 6 cartridges.", "weight": "5443 g", "volume": "3 L", + "longest_side": "60 cm", "price": 75000, "price_postapoc": 1250, "to_hit": -1, @@ -493,7 +510,7 @@ "durability": 6, "clip_size": 6, "reload": 200, - "barrel_length": "36 ml", + "barrel_volume": "36 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], @@ -505,7 +522,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { "id": "saiga_12", @@ -514,8 +531,9 @@ "type": "GUN", "name": { "str": "Saiga-12" }, "description": "The Saiga-12 is a semi-automatic shotgun designed on the same Kalashnikov pattern as the AK47 rifle. It reloads with a magazine, rather than one shell at a time like most shotguns. It is one of the last designs of Mikhail Kalashnikov, and was popular in open division shotgun competitions prior to its ban from import via executive order.", - "weight": "3600 g", - "volume": "2750 ml", + "weight": "3225 g", + "volume": "3064 ml", + "longest_side": "1068 mm", "price": 189000, "price_postapoc": 4500, "to_hit": -1, @@ -523,7 +541,7 @@ "material": [ "steel", "plastic" ], "dispersion": 395, "durability": 7, - "barrel_length": "81 ml", + "barrel_volume": "81 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], @@ -558,7 +576,7 @@ "volume": "2946 ml", "price": 39900, "price_postapoc": 2000, - "barrel_length": "234 ml", + "barrel_volume": "234 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -572,7 +590,7 @@ [ "underbarrel mount", 1 ] ], "extend": { "flags": [ "RELOAD_ONE" ] }, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 2 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 2 } } ] }, { "id": "shotgun_s", @@ -583,6 +601,7 @@ "description": "An old shotgun, possibly antique. It is little more than a barrel, a wood stock, and a hammer to strike the cartridge. Its simple design keeps it both light and accurate.", "weight": "2494 g", "volume": "2044 ml", + "longest_side": "95 cm", "price": 10000, "price_postapoc": 1500, "to_hit": -1, @@ -591,7 +610,7 @@ "dispersion": 210, "durability": 9, "clip_size": 1, - "barrel_length": "117 ml", + "barrel_volume": "117 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -606,7 +625,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 1 } } ] }, { "id": "streetsweeper", @@ -614,8 +633,9 @@ "type": "GUN", "name": { "str": "Cobray Streetsweeper" }, "description": "Less shotgun and more comically oversized revolver, the Cobray Streetsweeper sold poorly before it was deemed a destructive device. The cylinder is driven by a clockspring, cannot be indexed by hand, and must be ejected with an ejector rod. Its unique design allows for all 12 shells to be fired in under 3 seconds, as demonstrated by the ATF technical branch.", - "weight": "419 g", + "weight": "4200 g", "volume": "3193 ml", + "longest_side": "592 mm", "looks_like": "revolver_shotgun", "price": 120000, "price_postapoc": 3500, @@ -626,7 +646,7 @@ "durability": 6, "clip_size": 12, "reload": 220, - "barrel_length": "36 ml", + "barrel_volume": "36 ml", "default_mods": [ "grip" ], "built_in_mods": [ "wire_stock" ], "modes": [ [ "DEFAULT", "single", 1 ], [ "AUTO", "3 rd.", 3 ] ], @@ -644,7 +664,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 12 } } ] }, { "id": "SPAS_12", @@ -654,6 +674,7 @@ "description": "Mean and intimidating looking, the SPAS 12 has the dubious honor of being declared a destructive device and being banned from import by name, adding to its already considerable appeal. It is a combination pump-action and semi-automatic firearm, with an arm stabilizing hook for one handed shooting.", "weight": "4400 g", "volume": "2768 ml", + "longest_side": "835 mm", "looks_like": "m1014", "price": 180000, "price_postapoc": 4750, @@ -679,7 +700,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 9 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 9 } } ] }, { "id": "tavor_12", @@ -687,8 +708,9 @@ "type": "GUN", "name": { "str": "Tavor TS12" }, "description": "This is a triple tube magazine fed, gas-operated bullpup shotgun of Israeli Weapon Industries make. It is capable of loading 15 shells, all in a relatively small package. Like many other modern IWI designs, this looks more like a sci-fi prop gun than a firearm. An integral top rail is provided for mounting sights.", - "weight": "4200 g", + "weight": "3429 g", "volume": "4040 ml", + "longest_side": "725 mm", "looks_like": "ksg", "price": 180000, "price_postapoc": 5500, @@ -714,7 +736,7 @@ [ "sling", 1 ] ], "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 5 } } ] }, { "id": "USAS_12", @@ -724,6 +746,7 @@ "description": "The USAS 12 looks like a boxy upsized caricature of the M16A2. Like its Auto Assault-12 predecessor, it is a select-fire shotgun fed from large box or drum magazines. The in-line recoil system and sheer weight make for pleasant shooting.", "weight": "5450 g", "volume": "4695 ml", + "longest_side": "962 mm", "looks_like": "saiga_12", "price": 300000, "price_postapoc": 5000, @@ -732,7 +755,7 @@ "material": [ "steel", "plastic" ], "dispersion": 510, "durability": 6, - "barrel_length": "54 ml", + "barrel_volume": "54 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "mechanism", 4 ], @@ -764,6 +787,7 @@ "description": "One of the first commercially successful repeating shotguns, the Winchester 1887 was specifically made lever-action at Winchester's request. Though later overshadowed in success by pump designs, the 1887 remains popular today. This one has a very short barrel, no stock, and would pair nicely with a motorcycle jacket and a Harley Davidson.", "weight": "2994 g", "volume": "1127 ml", + "longest_side": "708 mm", "looks_like": "browning_blr", "price": 100800, "price_postapoc": 2250, @@ -789,7 +813,7 @@ [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { "id": "winchester_1897", @@ -799,6 +823,7 @@ "description": "The Winchester 1897 was one of the first commercially successful pump action shotguns. In its 'trench' configuraton it has become a heavily romanticized American icon of World War 1. With its barrel shroud, bayonet lug and 17 inch bayonet, this shotgun is undeniably fearsome in appearance. There aren't any more trenches to clear, so the next zombie infested town will have to suffice.", "weight": "3629 g", "volume": "2564 ml", + "longest_side": "989 mm", "looks_like": "remington_870_express", "price": 850000, "price_postapoc": 2500, @@ -824,16 +849,17 @@ ], "default_mods": [ "sword_bayonet" ], "flags": [ "RELOAD_ONE" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { - "id": "slam_shotgun", + "id": "slamfire_shotgun", "copy-from": "shotgun_base", "type": "GUN", - "name": { "str": "makeshift shotgun" }, + "name": { "str": "slam-fire pipe shotgun" }, "description": "A crude shotgun, composed of two thick steel pipes, an end cap and a nail. The lack of sights make this weapon only useful at point-blank range.", "weight": "3629 g", "volume": "2264 ml", + "longest_side": "65 cm", "looks_like": "pipe", "price": 8500, "price_postapoc": 1000, @@ -847,6 +873,20 @@ "modes": [ [ "DEFAULT", "single", 1 ] ], "valid_mod_locations": [ [ "sling", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 1 } } ] + }, + { + "id": "slamfire_shotgun_d", + "copy-from": "slamfire_shotgun", + "type": "GUN", + "name": { "str": "double slam-fire pipe shotgun" }, + "description": "A crude shotgun, composed of four thick steel pipes, two end caps and two nails. The lack of sights make this weapon only useful at point-blank range.", + "weight": "7260 g", + "volume": "4530 ml", + "clip_size": 2, + "reload": 900, + "modes": [ [ "DEFAULT", "double", 2 ] ], + "//": "no provision for separate triggers", + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 2 } } ] } ] diff --git a/data/json/items/gun/signal_flare.json b/data/json/items/gun/signal_flare.json index 334233c7e20ad..cd5eb2ce45ea4 100644 --- a/data/json/items/gun/signal_flare.json +++ b/data/json/items/gun/signal_flare.json @@ -28,6 +28,6 @@ [ "underbarrel mount", 1 ] ], "flags": [ "WATERPROOF_GUN", "NEVER_JAMS", "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "signal_flare": 1 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "signal_flare": 1 } } ] } ] diff --git a/data/json/items/gunmod/sights.json b/data/json/items/gunmod/sights.json index 9450e1a83d712..0787a5d05d9cb 100644 --- a/data/json/items/gunmod/sights.json +++ b/data/json/items/gunmod/sights.json @@ -83,8 +83,8 @@ "description": "A basic set of iron sights", "weight": "60 g", "volume": "250 ml", - "integral_volume": 0, - "integral_weight": 0, + "integral_volume": "0 ml", + "integral_weight": "0 g", "price": 72000, "price_postapoc": 250, "material": [ "steel" ], diff --git a/data/json/items/magazine/12mm.json b/data/json/items/magazine/12mm.json index 274a6943ea229..a6c21981df87f 100644 --- a/data/json/items/magazine/12mm.json +++ b/data/json/items/magazine/12mm.json @@ -15,6 +15,6 @@ "ammo_type": [ "12mm" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "12mm": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "12mm": 20 } } ] } ] diff --git a/data/json/items/magazine/20x60mm.json b/data/json/items/magazine/20x60mm.json index 278f160e58882..8193d5011f0af 100644 --- a/data/json/items/magazine/20x60mm.json +++ b/data/json/items/magazine/20x60mm.json @@ -16,7 +16,7 @@ "capacity": 10, "reload_time": 60, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "20x66mm": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "20x66mm": 10 } } ] }, { "id": "20x66_20_mag", @@ -35,7 +35,7 @@ "capacity": 20, "reload_time": 60, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "20x66mm": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "20x66mm": 20 } } ] }, { "id": "20x66_40_mag", @@ -54,6 +54,6 @@ "capacity": 40, "reload_time": 70, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "20x66mm": 40 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "20x66mm": 40 } } ] } ] diff --git a/data/json/items/magazine/22.json b/data/json/items/magazine/22.json index 5463874a124b3..d301316fa134f 100644 --- a/data/json/items/magazine/22.json +++ b/data/json/items/magazine/22.json @@ -15,7 +15,7 @@ "ammo_type": [ "22" ], "capacity": 8, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 8 } } ] }, { "id": "a180mag", @@ -34,7 +34,7 @@ "capacity": 165, "reload_time": 150, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 165 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 165 } } ] }, { "id": "marlin_tubeloader", @@ -52,7 +52,7 @@ "ammo_type": [ "22" ], "capacity": 19, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 19 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 19 } } ] }, { "id": "mosquitomag", @@ -70,7 +70,7 @@ "ammo_type": [ "22" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 10 } } ] }, { "id": "ruger1022bigmag", @@ -88,7 +88,7 @@ "ammo_type": [ "22" ], "capacity": 25, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 25 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 25 } } ] }, { "id": "ruger1022mag", @@ -107,7 +107,7 @@ "capacity": 10, "reload_time": 160, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 10 } } ] }, { "id": "sw22mag", @@ -125,7 +125,7 @@ "ammo_type": [ "22" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 10 } } ] }, { "id": "j22mag", @@ -143,7 +143,7 @@ "ammo_type": [ "22" ], "capacity": 6, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 6 } } ] }, { "id": "wp22mag", @@ -161,6 +161,6 @@ "ammo_type": [ "22" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "22": 10 } } ] } ] diff --git a/data/json/items/magazine/223.json b/data/json/items/magazine/223.json index 36e92b83da9ac..22c0a891b1d01 100644 --- a/data/json/items/magazine/223.json +++ b/data/json/items/magazine/223.json @@ -10,7 +10,7 @@ "count": 100, "default_ammo": "556", "linkage": "ammolink223", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 500 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 500 } } ] }, { "id": "famasmag", @@ -28,7 +28,7 @@ "ammo_type": [ "223" ], "capacity": 25, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 25 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 25 } } ] }, { "id": "ruger5", @@ -46,7 +46,7 @@ "ammo_type": [ "223" ], "capacity": 5, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 5 } } ] }, { "looks_like": "stanag30", @@ -64,7 +64,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 10, "300blk": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 10, "300blk": 10 } } ] }, { "id": "ruger10", @@ -100,7 +100,7 @@ "ammo_type": [ "223" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 30 } } ] }, { "id": "ruger90", @@ -135,7 +135,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 5, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 5, "300blk": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 5, "300blk": 5 } } ] }, { "id": "stanag20", @@ -152,7 +152,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 20, "300blk": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 20, "300blk": 20 } } ] }, { "id": "stanag30", @@ -170,7 +170,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 30, "300blk": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 30, "300blk": 30 } } ] }, { "id": "stanag40", @@ -187,7 +187,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 40, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 40, "300blk": 40 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 40, "300blk": 40 } } ] }, { "id": "stanag50", @@ -208,7 +208,7 @@ "capacity": 50, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 50, "300blk": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 50, "300blk": 50 } } ] }, { "id": "stanag60", @@ -225,7 +225,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 60, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 60, "300blk": 60 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 60, "300blk": 60 } } ] }, { "id": "stanag60drum", @@ -245,7 +245,7 @@ "capacity": 60, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 60, "300blk": 60 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 60, "300blk": 60 } } ] }, { "id": "stanag90", @@ -265,7 +265,7 @@ "capacity": 90, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 90, "300blk": 90 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 90, "300blk": 90 } } ] }, { "id": "stanag100", @@ -282,7 +282,7 @@ "ammo_type": [ "223", "300blk" ], "capacity": 100, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 100, "300blk": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 100, "300blk": 100 } } ] }, { "id": "stanag100drum", @@ -300,7 +300,7 @@ "capacity": 100, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 100, "300blk": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 100, "300blk": 100 } } ] }, { "id": "stanag150", @@ -318,7 +318,7 @@ "capacity": 150, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 150, "300blk": 150 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 150, "300blk": 150 } } ] }, { "id": "g36mag_30rd", @@ -373,7 +373,7 @@ "ammo_type": [ "223" ], "capacity": 42, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 42 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 42 } } ] }, { "id": "augmag_100rd", @@ -402,7 +402,7 @@ "capacity": 5, "reload_time": 150, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "223": 5, "300blk": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "223": 5, "300blk": 5 } } ] }, { "id": "ruger_makeshiftmag", diff --git a/data/json/items/magazine/300.json b/data/json/items/magazine/300.json index 9bf224a16104c..d4b85c301b474 100644 --- a/data/json/items/magazine/300.json +++ b/data/json/items/magazine/300.json @@ -15,6 +15,6 @@ "ammo_type": [ "300" ], "capacity": 5, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "300": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "300": 5 } } ] } ] diff --git a/data/json/items/magazine/3006.json b/data/json/items/magazine/3006.json index 9b0e818ef9601..a6e41bad189a5 100644 --- a/data/json/items/magazine/3006.json +++ b/data/json/items/magazine/3006.json @@ -16,7 +16,7 @@ "ammo_type": [ "3006" ], "capacity": 5, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 5 } } ] }, { "id": "blrmag", @@ -34,7 +34,7 @@ "ammo_type": [ "3006" ], "capacity": 4, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 4 } } ] }, { "id": "garandclip", @@ -53,7 +53,7 @@ "capacity": 8, "reload_time": 150, "flags": [ "MAG_COMPACT", "MAG_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 8 } } ] }, { "id": "m1918bigmag", @@ -72,7 +72,7 @@ "capacity": 30, "reload_time": 120, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 30 } } ] }, { "id": "m1918mag", @@ -91,6 +91,6 @@ "ammo_type": [ "3006" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "3006": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "3006": 20 } } ] } ] diff --git a/data/json/items/magazine/308.json b/data/json/items/magazine/308.json index c49e2446238b4..3367e10bfafcd 100644 --- a/data/json/items/magazine/308.json +++ b/data/json/items/magazine/308.json @@ -9,7 +9,7 @@ "count": 100, "default_ammo": "762_51", "linkage": "ammolink308", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 500 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 500 } } ] }, { "id": "falbigmag", @@ -27,7 +27,7 @@ "ammo_type": [ "308" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 30 } } ] }, { "id": "falmag", @@ -45,7 +45,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "fal_makeshiftmag", @@ -64,7 +64,7 @@ "capacity": 5, "reload_time": 150, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 5 } } ] }, { "id": "g3bigmag", @@ -83,7 +83,7 @@ "capacity": 50, "reload_time": 160, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 50 } } ] }, { "id": "g3mag", @@ -101,7 +101,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "g3_makeshiftmag", @@ -126,7 +126,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "m14smallmag", @@ -145,7 +145,7 @@ "capacity": 5, "reload_time": 50, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 5 } } ] }, { "id": "m14_makeshiftmag", @@ -172,7 +172,7 @@ "capacity": 50, "reload_time": 160, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 50 } } ] }, { "id": "scarhmag_30rd", @@ -198,7 +198,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "scarh_makeshiftmag", @@ -224,7 +224,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "hk417mag_10rd", @@ -242,7 +242,7 @@ "ammo_type": [ "308" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 10 } } ] }, { "id": "hk417_makeshiftmag", @@ -268,7 +268,7 @@ "ammo_type": [ "308" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "308": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "308": 20 } } ] }, { "id": "ar10_makeshiftmag", diff --git a/data/json/items/magazine/32.json b/data/json/items/magazine/32.json index 089f5d07296d3..5ce5f64bbcfc3 100644 --- a/data/json/items/magazine/32.json +++ b/data/json/items/magazine/32.json @@ -15,7 +15,7 @@ "ammo_type": [ "32" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "32": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "32": 8 } } ] }, { "id": "sigp230mag", @@ -33,7 +33,7 @@ "ammo_type": [ "32" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "32": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "32": 8 } } ] }, { "id": "skorpion61mag", @@ -51,7 +51,7 @@ "ammo_type": [ "32" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "32": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "32": 20 } } ] }, { "id": "kp32mag", @@ -69,6 +69,6 @@ "ammo_type": [ "32" ], "capacity": 7, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "32": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "32": 7 } } ] } ] diff --git a/data/json/items/magazine/357sig.json b/data/json/items/magazine/357sig.json index f5ab91bfe52f2..ca08c6818ebe8 100644 --- a/data/json/items/magazine/357sig.json +++ b/data/json/items/magazine/357sig.json @@ -15,7 +15,7 @@ "ammo_type": [ "357sig" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357sig": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357sig": 12 } } ] }, { "id": "p320mag_13rd_357sig", @@ -34,6 +34,6 @@ "capacity": 13, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357sig": 13 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357sig": 13 } } ] } ] diff --git a/data/json/items/magazine/38.json b/data/json/items/magazine/38.json index f96d07f28dd74..6d33482ba2e2e 100644 --- a/data/json/items/magazine/38.json +++ b/data/json/items/magazine/38.json @@ -15,7 +15,7 @@ "ammo_type": [ "357mag", "38" ], "capacity": 7, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357mag": 7, "38": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357mag": 7, "38": 7 } } ] }, { "id": "38_speedloader5", @@ -33,7 +33,7 @@ "ammo_type": [ "357mag", "38" ], "capacity": 5, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357mag": 5, "38": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357mag": 5, "38": 5 } } ] }, { "id": "38_speedloader6", @@ -51,6 +51,6 @@ "ammo_type": [ "357mag", "38" ], "capacity": 6, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "357mag": 6, "38": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "357mag": 6, "38": 6 } } ] } ] diff --git a/data/json/items/magazine/380.json b/data/json/items/magazine/380.json index 029b0fc8c8e94..da5f135b89b09 100644 --- a/data/json/items/magazine/380.json +++ b/data/json/items/magazine/380.json @@ -15,7 +15,7 @@ "ammo_type": [ "380" ], "capacity": 6, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 6 } } ] }, { "id": "fn1910mag", @@ -33,7 +33,7 @@ "ammo_type": [ "380" ], "capacity": 6, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 6 } } ] }, { "id": "rugerlcpmag", @@ -51,7 +51,7 @@ "ammo_type": [ "380" ], "capacity": 6, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 6 } } ] }, { "id": "mac11mag", @@ -69,7 +69,7 @@ "ammo_type": [ "380" ], "capacity": 32, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 32 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 32 } } ] }, { "id": "hptcf380mag_8rd", @@ -87,7 +87,7 @@ "ammo_type": [ "380" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 8 } } ] }, { "id": "hptcf380mag_10rd", @@ -105,7 +105,7 @@ "ammo_type": [ "380" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 10 } } ] }, { "id": "taurus_spectrum_mag", @@ -123,6 +123,6 @@ "ammo_type": [ "380" ], "capacity": 6, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "380": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "380": 6 } } ] } ] diff --git a/data/json/items/magazine/38super.json b/data/json/items/magazine/38super.json index 19d2e913b7486..cad819d79d449 100644 --- a/data/json/items/magazine/38super.json +++ b/data/json/items/magazine/38super.json @@ -15,7 +15,7 @@ "ammo_type": [ "38super" ], "capacity": 16, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "38super": 16 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "38super": 16 } } ] }, { "id": "m1911mag_10rd_38super", @@ -33,6 +33,6 @@ "ammo_type": [ "38super" ], "capacity": 9, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "38super": 9 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "38super": 9 } } ] } ] diff --git a/data/json/items/magazine/40.json b/data/json/items/magazine/40.json index b0265d540ad9b..7b0f9fdea649e 100644 --- a/data/json/items/magazine/40.json +++ b/data/json/items/magazine/40.json @@ -15,7 +15,7 @@ "ammo_type": [ "40", "10mm" ], "capacity": 6, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 6, "10mm": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 6, "10mm": 6 } } ] }, { "id": "90two40mag", @@ -34,7 +34,7 @@ "capacity": 12, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 12, "357sig": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 12, "357sig": 12 } } ] }, { "id": "glock40bigmag", @@ -53,7 +53,7 @@ "capacity": 22, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 22, "357sig": 22 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 22, "357sig": 22 } } ] }, { "id": "glock40mag", @@ -71,7 +71,7 @@ "ammo_type": [ "40", "357sig" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 15, "357sig": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 15, "357sig": 15 } } ] }, { "id": "px4_40mag", @@ -90,7 +90,7 @@ "capacity": 14, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 14, "357sig": 14 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 14, "357sig": 14 } } ] }, { "id": "sig40mag", @@ -108,7 +108,7 @@ "ammo_type": [ "40" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 12 } } ] }, { "id": "smg_40_mag", @@ -127,7 +127,7 @@ "capacity": 20, "reload_time": 160, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 20 } } ] }, { "id": "bhp40mag", @@ -145,7 +145,7 @@ "ammo_type": [ "40" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 10 } } ] }, { "id": "ppq40mag_10rd", @@ -163,7 +163,7 @@ "ammo_type": [ "40" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 10 } } ] }, { "id": "ppq40mag_12rd", @@ -181,7 +181,7 @@ "ammo_type": [ "40" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 12 } } ] }, { "id": "ppq40mag_14rd", @@ -199,7 +199,7 @@ "ammo_type": [ "40" ], "capacity": 14, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 14 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 14 } } ] }, { "id": "hptjcpmag", @@ -217,6 +217,6 @@ "ammo_type": [ "40" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40": 10 } } ] } ] diff --git a/data/json/items/magazine/40mm.json b/data/json/items/magazine/40mm.json index 22b748150001c..0ae3214233239 100644 --- a/data/json/items/magazine/40mm.json +++ b/data/json/items/magazine/40mm.json @@ -16,6 +16,6 @@ "count": 25, "linkage": "ammolink40mm", "flags": [ "MAG_BELT", "MAG_DESTROY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40x53mm": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "40x53mm": 50 } } ] } ] diff --git a/data/json/items/magazine/410shot.json b/data/json/items/magazine/410shot.json index 3736cd6cb0e19..35476848025af 100644 --- a/data/json/items/magazine/410shot.json +++ b/data/json/items/magazine/410shot.json @@ -15,7 +15,7 @@ "ammo_type": [ "410shot" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "410shot": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "410shot": 10 } } ] }, { "id": "saiga410mag_30rd", @@ -34,6 +34,6 @@ "capacity": 30, "reload_time": 130, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "410shot": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "410shot": 30 } } ] } ] diff --git a/data/json/items/magazine/44.json b/data/json/items/magazine/44.json index a61f5cc2b5c08..d313e095e94e3 100644 --- a/data/json/items/magazine/44.json +++ b/data/json/items/magazine/44.json @@ -15,7 +15,7 @@ "ammo_type": [ "44" ], "capacity": 6, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44": 6 } } ] }, { "id": "deaglemag", @@ -33,6 +33,6 @@ "ammo_type": [ "44" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "44": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "44": 8 } } ] } ] diff --git a/data/json/items/magazine/45.json b/data/json/items/magazine/45.json index 63e309e955599..775763cfd7f93 100644 --- a/data/json/items/magazine/45.json +++ b/data/json/items/magazine/45.json @@ -15,7 +15,7 @@ "ammo_type": [ "45" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 30 } } ] }, { "id": "smg_45_mag", @@ -34,7 +34,7 @@ "capacity": 20, "reload_time": 160, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 20 } } ] }, { "id": "tdi_mag", @@ -52,7 +52,7 @@ "ammo_type": [ "45" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 30 } } ] }, { "id": "thompson_bigmag", @@ -71,7 +71,7 @@ "capacity": 30, "reload_time": 120, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 30 } } ] }, { "id": "thompson_drum", @@ -90,7 +90,7 @@ "capacity": 50, "reload_time": 150, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 50 } } ] }, { "id": "thompson_mag", @@ -108,7 +108,7 @@ "ammo_type": [ "45" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 20 } } ] }, { "id": "thompson_makeshiftmag", @@ -134,7 +134,7 @@ "ammo_type": [ "45" ], "capacity": 25, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 25 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 25 } } ] }, { "id": "ump45_makeshiftmag", @@ -160,7 +160,7 @@ "ammo_type": [ "45" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 12 } } ] }, { "id": "ppq45mag", @@ -178,7 +178,7 @@ "ammo_type": [ "45" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 12 } } ] }, { "id": "hptjhpmag", @@ -196,6 +196,6 @@ "ammo_type": [ "45" ], "capacity": 9, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 9 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 9 } } ] } ] diff --git a/data/json/items/magazine/454.json b/data/json/items/magazine/454.json index 28fadcd0ac073..56f28b2ab8169 100644 --- a/data/json/items/magazine/454.json +++ b/data/json/items/magazine/454.json @@ -15,7 +15,7 @@ "ammo_type": [ "454", "45colt", "410shot" ], "capacity": 5, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "454": 5, "45colt": 5, "410shot": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "454": 5, "45colt": 5, "410shot": 5 } } ] }, { "id": "454_speedloader6", @@ -24,6 +24,6 @@ "name": { "str": ".454 6-round speedloader" }, "description": "This speedloader can hold 5 rounds of .454, .45 Colt or .410 bore and quickly reload a compatible revolver.", "capacity": 6, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "454": 6, "45colt": 6, "410shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "454": 6, "45colt": 6, "410shot": 6 } } ] } ] diff --git a/data/json/items/magazine/46.json b/data/json/items/magazine/46.json index 2fdf2d2710986..9fe50b3f59b8c 100644 --- a/data/json/items/magazine/46.json +++ b/data/json/items/magazine/46.json @@ -15,7 +15,7 @@ "ammo_type": [ "46" ], "capacity": 40, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "46": 40 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "46": 40 } } ] }, { "id": "hk46mag", @@ -33,6 +33,6 @@ "ammo_type": [ "46" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "46": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "46": 20 } } ] } ] diff --git a/data/json/items/magazine/460.json b/data/json/items/magazine/460.json index 18a7158e01782..492e010489167 100644 --- a/data/json/items/magazine/460.json +++ b/data/json/items/magazine/460.json @@ -14,7 +14,7 @@ "ammo_type": [ "45", "460" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 10, "460": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 10, "460": 10 } } ] }, { "id": "m1911mag", @@ -31,6 +31,6 @@ "ammo_type": [ "45", "460" ], "capacity": 7, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "45": 7, "460": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "45": 7, "460": 7 } } ] } ] diff --git a/data/json/items/magazine/50.json b/data/json/items/magazine/50.json index be0ab4509eba4..38e2d57cf7322 100644 --- a/data/json/items/magazine/50.json +++ b/data/json/items/magazine/50.json @@ -9,7 +9,7 @@ "capacity": 100, "count": 100, "linkage": "ammolink50", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "50": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 100 } } ] }, { "id": "m107a1mag", @@ -29,7 +29,7 @@ "capacity": 10, "reload_time": 130, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "50": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 10 } } ] }, { "id": "as50mag", @@ -48,7 +48,7 @@ "capacity": 10, "reload_time": 110, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "50": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 10 } } ] }, { "id": "tac50mag", @@ -67,6 +67,6 @@ "capacity": 5, "reload_time": 200, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "50": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "50": 5 } } ] } ] diff --git a/data/json/items/magazine/500.json b/data/json/items/magazine/500.json index aabf260c73084..9d8c72c435723 100644 --- a/data/json/items/magazine/500.json +++ b/data/json/items/magazine/500.json @@ -15,6 +15,6 @@ "ammo_type": [ "500" ], "capacity": 5, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "500": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "500": 5 } } ] } ] diff --git a/data/json/items/magazine/545x39.json b/data/json/items/magazine/545x39.json index 10b9fef51d1f7..e8c04f54b396f 100644 --- a/data/json/items/magazine/545x39.json +++ b/data/json/items/magazine/545x39.json @@ -15,7 +15,7 @@ "ammo_type": [ "545x39" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "545x39": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "545x39": 30 } } ] }, { "id": "rpk74mag", @@ -35,6 +35,6 @@ "capacity": 45, "reload_time": 130, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "545x39": 45 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "545x39": 45 } } ] } ] diff --git a/data/json/items/magazine/57.json b/data/json/items/magazine/57.json index a0760393bbfcd..915bd58477776 100644 --- a/data/json/items/magazine/57.json +++ b/data/json/items/magazine/57.json @@ -15,7 +15,7 @@ "ammo_type": [ "57" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "57": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "57": 20 } } ] }, { "id": "fnp90mag", @@ -33,6 +33,6 @@ "ammo_type": [ "57" ], "capacity": 50, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "57": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "57": 50 } } ] } ] diff --git a/data/json/items/magazine/5x50.json b/data/json/items/magazine/5x50.json index 0c99640652135..f0a65ba114e8d 100644 --- a/data/json/items/magazine/5x50.json +++ b/data/json/items/magazine/5x50.json @@ -16,7 +16,7 @@ "capacity": 100, "reload_time": 60, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "5x50": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "5x50": 100 } } ] }, { "id": "5x50_50_mag", @@ -35,6 +35,6 @@ "capacity": 50, "reload_time": 50, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "5x50": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "5x50": 50 } } ] } ] diff --git a/data/json/items/magazine/66mm.json b/data/json/items/magazine/66mm.json index 127430c364e31..511a84f2a2e7e 100644 --- a/data/json/items/magazine/66mm.json +++ b/data/json/items/magazine/66mm.json @@ -14,6 +14,6 @@ "color": "light_gray", "ammo_type": [ "m235" ], "capacity": 4, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "m235": 4 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "m235": 4 } } ] } ] diff --git a/data/json/items/magazine/762.json b/data/json/items/magazine/762.json index d9361bf97f7ef..4b7985c3d5f9e 100644 --- a/data/json/items/magazine/762.json +++ b/data/json/items/magazine/762.json @@ -16,7 +16,7 @@ "ammo_type": [ "762" ], "capacity": 10, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 10 } } ] }, { "id": "akmag10", @@ -34,7 +34,7 @@ "ammo_type": [ "762" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 10 } } ] }, { "id": "akmag20", @@ -52,7 +52,7 @@ "ammo_type": [ "762" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 20 } } ] }, { "id": "akmag30", @@ -70,7 +70,7 @@ "ammo_type": [ "762" ], "capacity": 30, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 30 } } ] }, { "id": "akmag40", @@ -88,7 +88,7 @@ "ammo_type": [ "762" ], "capacity": 40, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 40 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 40 } } ] }, { "id": "akdrum75", @@ -106,6 +106,6 @@ "ammo_type": [ "762" ], "capacity": 75, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 75 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762": 75 } } ] } ] diff --git a/data/json/items/magazine/762R.json b/data/json/items/magazine/762R.json index 10db9b1fc292f..754c907147c0e 100644 --- a/data/json/items/magazine/762R.json +++ b/data/json/items/magazine/762R.json @@ -16,6 +16,6 @@ "ammo_type": [ "762R" ], "capacity": 5, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762R": 5 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762R": 5 } } ] } ] diff --git a/data/json/items/magazine/762x25.json b/data/json/items/magazine/762x25.json index 73241061a93e8..1dc4fb2d6c167 100644 --- a/data/json/items/magazine/762x25.json +++ b/data/json/items/magazine/762x25.json @@ -17,7 +17,7 @@ "capacity": 71, "reload_time": 190, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762x25": 71 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762x25": 71 } } ] }, { "id": "ppshmag", @@ -35,7 +35,7 @@ "ammo_type": [ "762x25" ], "capacity": 35, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762x25": 35 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762x25": 35 } } ] }, { "id": "tokarevmag", @@ -53,6 +53,6 @@ "ammo_type": [ "762x25" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762x25": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "762x25": 8 } } ] } ] diff --git a/data/json/items/magazine/8x40mm.json b/data/json/items/magazine/8x40mm.json index 80d2178d056f4..900b0f8feab89 100644 --- a/data/json/items/magazine/8x40mm.json +++ b/data/json/items/magazine/8x40mm.json @@ -16,7 +16,7 @@ "capacity": 100, "reload_time": 50, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "8x40mm": 100 } } ] }, { "id": "8x40_10_mag", @@ -35,7 +35,7 @@ "capacity": 10, "reload_time": 40, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "8x40mm": 10 } } ] }, { "id": "8x40_250_mag", @@ -53,7 +53,7 @@ "ammo_type": [ "8x40mm" ], "capacity": 250, "reload_time": 60, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 250 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "8x40mm": 250 } } ] }, { "id": "8x40_25_mag", @@ -72,7 +72,7 @@ "capacity": 25, "reload_time": 50, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 25 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "8x40mm": 25 } } ] }, { "id": "8x40_500_mag", @@ -89,7 +89,7 @@ "color": "dark_gray", "ammo_type": [ "8x40mm" ], "capacity": 500, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 500 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "8x40mm": 500 } } ] }, { "id": "8x40_50_mag", @@ -107,6 +107,7 @@ "ammo_type": [ "8x40mm" ], "capacity": 50, "reload_time": 50, - "flags": [ "MAG_COMPACT" ] + "flags": [ "MAG_COMPACT" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "8x40mm": 50 } } ] } ] diff --git a/data/json/items/magazine/9mm.json b/data/json/items/magazine/9mm.json index a594b16e7a39c..4f91666cc55ac 100644 --- a/data/json/items/magazine/9mm.json +++ b/data/json/items/magazine/9mm.json @@ -16,7 +16,7 @@ "capacity": 50, "reload_time": 160, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 50 } } ] }, { "id": "glockbigmag", @@ -35,7 +35,7 @@ "capacity": 30, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 30 } } ] }, { "id": "glockmag", @@ -53,7 +53,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "glock17_17", @@ -72,7 +72,7 @@ "capacity": 17, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 17 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 17 } } ] }, { "id": "glock17_22", @@ -90,7 +90,7 @@ "ammo_type": [ "9mm" ], "capacity": 22, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 22 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 22 } } ] }, { "id": "glock_drum_50rd", @@ -108,7 +108,7 @@ "ammo_type": [ "9mm" ], "capacity": 50, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 50 } } ] }, { "id": "glock_drum_100rd", @@ -126,7 +126,7 @@ "ammo_type": [ "9mm" ], "capacity": 100, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 100 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 100 } } ] }, { "id": "m9bigmag", @@ -145,7 +145,7 @@ "capacity": 30, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 30 } } ] }, { "id": "m9mag", @@ -163,7 +163,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "mp5bigmag", @@ -182,7 +182,7 @@ "capacity": 50, "reload_time": 160, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 50 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 50 } } ] }, { "id": "mp5mag", @@ -197,7 +197,7 @@ "material": [ "steel" ], "symbol": "#", "color": "light_gray", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 30 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 30 } } ], "ammo_type": [ "9mm" ], "capacity": 30, "flags": [ "MAG_COMPACT" ] @@ -218,7 +218,7 @@ "ammo_type": [ "9mm" ], "capacity": 17, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 17 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 17 } } ] }, { "id": "stenmag", @@ -236,7 +236,7 @@ "ammo_type": [ "9mm" ], "capacity": 32, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 32 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 32 } } ] }, { "id": "survivor9mm_mag", @@ -255,7 +255,7 @@ "capacity": 20, "reload_time": 160, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 20 } } ] }, { "id": "tec9mag", @@ -273,7 +273,7 @@ "ammo_type": [ "9mm" ], "capacity": 32, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 32 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 32 } } ] }, { "id": "usp9mag", @@ -291,7 +291,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "uzimag", @@ -309,7 +309,7 @@ "ammo_type": [ "9mm" ], "capacity": 32, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 32 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 32 } } ] }, { "id": "kpf9mag", @@ -327,7 +327,7 @@ "ammo_type": [ "9mm" ], "capacity": 7, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 7 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 7 } } ] }, { "id": "p320mag_17rd_9x19mm", @@ -346,7 +346,7 @@ "capacity": 17, "reload_time": 140, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 17 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 17 } } ] }, { "id": "bhp9mag_13rd", @@ -364,7 +364,7 @@ "ammo_type": [ "9mm" ], "capacity": 13, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 13 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 13 } } ] }, { "id": "bhp9mag_15rd", @@ -382,7 +382,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "p38mag", @@ -400,7 +400,7 @@ "ammo_type": [ "9mm" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 8 } } ] }, { "id": "ppq9mag_10rd", @@ -418,7 +418,7 @@ "ammo_type": [ "9mm" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 10 } } ] }, { "id": "ppq9mag_15rd", @@ -436,7 +436,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "ppq9mag_17rd", @@ -454,7 +454,7 @@ "ammo_type": [ "9mm" ], "capacity": 17, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 17 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 17 } } ] }, { "id": "hptc9mag_8rd", @@ -472,7 +472,7 @@ "ammo_type": [ "9mm" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 8 } } ] }, { "id": "hptc9mag_10rd", @@ -490,7 +490,7 @@ "ammo_type": [ "9mm" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 10 } } ] }, { "id": "hptc9mag_15rd", @@ -508,7 +508,7 @@ "ammo_type": [ "9mm" ], "capacity": 15, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 15 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 15 } } ] }, { "id": "cz75mag_12rd", @@ -526,7 +526,7 @@ "ammo_type": [ "9mm" ], "capacity": 12, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 12 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 12 } } ] }, { "id": "cz75mag_20rd", @@ -544,7 +544,7 @@ "ammo_type": [ "9mm" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 20 } } ] }, { "id": "cz75mag_26rd", @@ -562,7 +562,7 @@ "ammo_type": [ "9mm" ], "capacity": 26, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 26 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 26 } } ] }, { "id": "ccpmag", @@ -580,6 +580,6 @@ "ammo_type": [ "9mm" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9mm": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9mm": 8 } } ] } ] diff --git a/data/json/items/magazine/9x18.json b/data/json/items/magazine/9x18.json index 332687a029b3a..58f4b1f1043aa 100644 --- a/data/json/items/magazine/9x18.json +++ b/data/json/items/magazine/9x18.json @@ -15,7 +15,7 @@ "ammo_type": [ "9x18" ], "capacity": 8, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9x18": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9x18": 8 } } ] }, { "id": "skorpion82mag", @@ -33,6 +33,6 @@ "ammo_type": [ "9x18" ], "capacity": 20, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "9x18": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "9x18": 20 } } ] } ] diff --git a/data/json/items/magazine/chemical_spray.json b/data/json/items/magazine/chemical_spray.json index 85a366c4edc33..1eac39d02c258 100644 --- a/data/json/items/magazine/chemical_spray.json +++ b/data/json/items/magazine/chemical_spray.json @@ -15,6 +15,6 @@ "ammo_type": [ "chemical_spray" ], "capacity": 800, "reload_time": 3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "chemical_spray": 800 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "chemical_spray": 800 }, "watertight": true } ] } ] diff --git a/data/json/items/magazine/exodii.json b/data/json/items/magazine/exodii.json new file mode 100644 index 0000000000000..446d8e8129d25 --- /dev/null +++ b/data/json/items/magazine/exodii.json @@ -0,0 +1,40 @@ +[ + { + "id": "exodiiminimag", + "looks_like": "garandclip", + "type": "MAGAZINE", + "name": { "str": "PA Md. 71 Exodii 12.3ln magazine" }, + "description": "A small, sleek magazine based on a classic PA Md. 71 clip, with some redesigns by the Exodii for better use in lighter-than-air drones. Its small size is less appropriate for ground-fighting of hordes of zombies, as it is a bit inconvenient to reload.", + "weight": "30 g", + "volume": "250 ml", + "price": 600, + "price_postapoc": 50, + "material": [ "steel" ], + "symbol": "#", + "color": "light_gray", + "ammo_type": [ "123ln" ], + "capacity": 10, + "reload_time": 220, + "flags": [ "MAG_COMPACT" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "123ln": 10 } } ] + }, + { + "id": "exodiiBRmag", + "looks_like": "stanag30", + "type": "MAGAZINE", + "name": { "str": "PA Md. 68 Exodii 12.3ln magazine" }, + "description": "An unreasonably large magazine for the already heavy PA Md. 68 battle rifle, custom designed and manufactured by the Exodii.", + "weight": "600 g", + "volume": "1250 ml", + "price": 10500, + "price_postapoc": 450, + "material": [ "steel" ], + "symbol": "#", + "color": "light_gray", + "ammo_type": [ "123ln" ], + "capacity": 60, + "reload_time": 180, + "flags": [ "MAG_BULKY" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "123ln": 60 } } ] + } +] diff --git a/data/json/items/magazine/liquid.json b/data/json/items/magazine/liquid.json index 012d400e3b440..2ab44e64ef315 100644 --- a/data/json/items/magazine/liquid.json +++ b/data/json/items/magazine/liquid.json @@ -15,7 +15,7 @@ "ammo_type": [ "flammable" ], "capacity": 3000, "reload_time": 3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flammable": 3000 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flammable": 3000 }, "watertight": true } ] }, { "id": "aux_pressurized_tank", @@ -34,7 +34,7 @@ "capacity": 500, "reload_time": 3, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flammable": 500 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flammable": 500 }, "watertight": true } ] }, { "id": "rm4502", @@ -52,7 +52,7 @@ "ammo_type": [ "flammable" ], "capacity": 2000, "reload_time": 3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flammable": 2000 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flammable": 2000 }, "watertight": true } ] }, { "id": "rm4504", @@ -70,6 +70,6 @@ "ammo_type": [ "flammable" ], "capacity": 4000, "reload_time": 3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "flammable": 4000 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "flammable": 4000 }, "watertight": true } ] } ] diff --git a/data/json/items/magazine/shot.json b/data/json/items/magazine/shot.json index 492af450e75a1..62ac2206d7718 100644 --- a/data/json/items/magazine/shot.json +++ b/data/json/items/magazine/shot.json @@ -15,7 +15,7 @@ "ammo_type": [ "shot" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 10 } } ] }, { "id": "saiga30mag", @@ -34,7 +34,7 @@ "capacity": 30, "reload_time": 130, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 30 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 30 } } ] }, { "id": "USAS10mag", @@ -52,7 +52,7 @@ "ammo_type": [ "shot" ], "capacity": 10, "flags": [ "MAG_COMPACT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 10 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 10 } } ] }, { "id": "USAS20mag", @@ -71,7 +71,7 @@ "capacity": 20, "reload_time": 110, "flags": [ "MAG_BULKY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 20 } } ] }, { "id": "shotbelt_20", @@ -90,7 +90,7 @@ "capacity": 20, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 2 }, "flags": [ "MAG_EJECT", "BELTED", "OVERSIZE", "WATER_FRIENDLY" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 20 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 20 } } ] }, { "id": "shot_speedloader6", @@ -108,7 +108,7 @@ "ammo_type": [ "shot" ], "capacity": 6, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 6 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 6 } } ] }, { "id": "shot_speedloader8", @@ -126,6 +126,6 @@ "ammo_type": [ "shot" ], "capacity": 8, "flags": [ "SPEEDLOADER" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 8 } } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "shot": 8 } } ] } ] diff --git a/data/json/items/magazine/weldgas.json b/data/json/items/magazine/weldgas.json index 53392f2a300d9..850c78ffdbdcb 100644 --- a/data/json/items/magazine/weldgas.json +++ b/data/json/items/magazine/weldgas.json @@ -16,7 +16,7 @@ "capacity": 60, "count": 60, "flags": [ "NO_UNLOAD", "NO_RELOAD" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "weldgas": 60 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "weldgas": 60 }, "watertight": true } ] }, { "id": "weldtank", @@ -35,6 +35,6 @@ "capacity": 240, "count": 240, "flags": [ "NO_UNLOAD", "NO_RELOAD" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "weldgas": 240 }, "watertight": true } ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "weldgas": 240 }, "watertight": true } ] } ] diff --git a/data/json/items/melee/bludgeons.json b/data/json/items/melee/bludgeons.json index 33fbe8f06d5c5..239879519b5f8 100644 --- a/data/json/items/melee/bludgeons.json +++ b/data/json/items/melee/bludgeons.json @@ -577,9 +577,10 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, - "max_contains_volume": "20 L", - "max_contains_weight": "20 kg", + "max_contains_volume": "525 ml", + "max_contains_weight": "1 kg", "item_restriction": [ "medium_plus_battery_cell", "medium_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] } ] @@ -1024,6 +1025,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1055,6 +1057,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/melee/misc.json b/data/json/items/melee/misc.json index 6991599a5d610..8448921cf09ca 100644 --- a/data/json/items/melee/misc.json +++ b/data/json/items/melee/misc.json @@ -23,7 +23,7 @@ "symbol": "/", "color": "brown", "weight": "3496 g", - "volume": 9, + "volume": "2250 ml", "price": 4800, "price_postapoc": 5200, "to_hit": 2, diff --git a/data/json/items/melee/spears_and_polearms.json b/data/json/items/melee/spears_and_polearms.json index c9ef02464d616..578423d3415b9 100644 --- a/data/json/items/melee/spears_and_polearms.json +++ b/data/json/items/melee/spears_and_polearms.json @@ -11,6 +11,7 @@ "material": [ "steel", "wood" ], "techniques": [ "WBLOCK_1", "DEF_DISARM" ], "volume": "1750 ml", + "longest_side": "140 cm", "bashing": 5, "cutting": 18, "qualities": [ [ "COOK", 1 ] ], @@ -27,6 +28,7 @@ "description": "A simple wood pole with one end sharpened.", "material": [ "wood" ], "volume": "1250 ml", + "longest_side": "80 cm", "weight": "900 g", "bashing": 5, "cutting": 9, @@ -49,6 +51,7 @@ "material": [ "wood" ], "techniques": [ "WBLOCK_1" ], "volume": "1250 ml", + "longest_side": "150 cm", "bashing": 4, "cutting": 15, "flags": [ "SPEAR", "REACH_ATTACK", "NPC_THROWN", "SHEATH_SPEAR" ], @@ -63,6 +66,7 @@ "description": "This farming tool has been modified into an improvised weapon by rotating its blade 90 degrees, transforming it into a deadly giant blade on the end of a stick. However it's quite fragile.", "weight": "3013 g", "volume": "3250 ml", + "longest_side": "180 cm", "price": 16000, "price_postapoc": 50, "bashing": 7, @@ -82,6 +86,7 @@ "description": "A flimsy pole made of wood with a basic metal spike tied to it. It's barely sharp, and crudely constructed, but it will keep the zombies out of arm's reach until you can find something better.", "weight": "1487 g", "volume": "1250 ml", + "longest_side": "120 cm", "price": 400, "price_postapoc": 50, "bashing": 4, @@ -101,6 +106,7 @@ "description": "A flimsy pole made of wood with a knife bound to the end. It's long enough to slice from a distance, but the knife isn't that well attached. You could take a bit more time to carefully split the shaft and attach the knife blade more permanently.", "weight": "1487 g", "volume": "1250 ml", + "longest_side": "130 cm", "price": 700, "price_postapoc": 150, "to_hit": 1, @@ -121,6 +127,7 @@ "description": "A sturdy wooden pole that has been carefully split and reinforced. At the split point, a sharp blade has been bolted into place and reinforced with layers of sturdy wrapped bindings.", "weight": "1487 g", "volume": "1250 ml", + "longest_side": "130 cm", "price": 12000, "price_postapoc": 500, "to_hit": 1, @@ -141,6 +148,7 @@ "description": "A short do-it-yourself spear made out of a smooth wooden shaft with a metal spike seated and bound into place at its tip. Its functional grip and decent construction makes it a usable, if not effective, weapon.", "weight": "1814 g", "volume": "1500 ml", + "longest_side": "150 cm", "price": 1400, "price_postapoc": 750, "bashing": 7, @@ -164,6 +172,7 @@ "material": [ "wood", "steel" ], "techniques": [ "WBLOCK_2", "DEF_DISARM" ], "volume": "1500 ml", + "longest_side": "150 cm", "bashing": 6, "cutting": 18, "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "FRAGILE_MELEE", "SHEATH_SPEAR" ], @@ -183,6 +192,7 @@ "material": [ "copper", "wood" ], "techniques": [ "WBLOCK_1" ], "volume": "1500 ml", + "longest_side": "180 cm", "bashing": 6, "cutting": 20, "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], @@ -202,6 +212,7 @@ "material": [ "steel", "wood" ], "techniques": [ "WBLOCK_1", "IMPALE" ], "volume": "3 L", + "longest_side": "180 cm", "bashing": 6, "cutting": 30, "flags": [ "DURABLE_MELEE", "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], @@ -222,6 +233,7 @@ "material": [ "steel" ], "techniques": [ "WBLOCK_1", "IMPALE" ], "volume": "1250 ml", + "longest_side": "150 cm", "bashing": 6, "cutting": 25, "flags": [ "SPEAR", "REACH_ATTACK", "SHEATH_SPEAR" ], @@ -240,6 +252,7 @@ "material": [ "iron" ], "weight": "908 g", "volume": "1500 ml", + "longest_side": "80 cm", "bashing": 5, "techniques": [ "WBLOCK_1" ], "flags": [ "SPEAR", "REACH_ATTACK", "SHEATH_SPEAR" ], @@ -258,6 +271,7 @@ "material": [ "steel", "wood" ], "techniques": [ "WBLOCK_1", "PRECISE", "IMPALE" ], "volume": "2500 ml", + "longest_side": "180 cm", "bashing": 5, "cutting": 31, "flags": [ "DURABLE_MELEE", "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], @@ -273,10 +287,12 @@ "description": "This is a versatile polearm with an axe blade, a spike, and other fun things attached to a long sturdy stick.", "price": 50000, "material": [ "wood", "steel" ], + "ascii_picture": "halberd", "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE", "POLEARM", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "WIDE", "SWEEP" ], "weight": "3175 g", "volume": "3750 ml", + "longest_side": "180 cm", "bashing": 19, "cutting": 51, "price_postapoc": 10000, @@ -291,10 +307,12 @@ "description": "This is a dull, cheaply made replica of a polearm with an axe blade, a spike, and other fun things attached to a thick pole.", "price": 5000, "material": [ "wood", "aluminum" ], + "ascii_picture": "halberd", "flags": [ "REACH_ATTACK", "NONCONDUCTIVE", "POLEARM", "SHEATH_SPEAR", "ALWAYS_TWOHAND", "FRAGILE_MELEE" ], "techniques": [ "WBLOCK_1", "SWEEP" ], "weight": "1644 g", "volume": "3750 ml", + "longest_side": "180 cm", "bashing": 22, "cutting": 4, "to_hit": 1, @@ -315,6 +333,7 @@ "techniques": [ "WIDE", "WBLOCK_1" ], "weight": "2100 g", "volume": "2500 ml", + "longest_side": "180 cm", "bashing": 17, "cutting": 40, "price_postapoc": 8000 @@ -330,6 +349,7 @@ "material": [ "steel", "wood" ], "techniques": [ "WIDE", "WBLOCK_1" ], "volume": "2500 ml", + "longest_side": "180 cm", "bashing": 7, "cutting": 45, "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -24 ] ], @@ -348,6 +368,7 @@ "material": [ "budget_steel", "wood" ], "techniques": [ "WIDE", "WBLOCK_1" ], "volume": "2500 ml", + "longest_side": "180 cm", "bashing": 29, "cutting": 11, "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -24 ] ], @@ -366,6 +387,7 @@ "material": [ "aluminum", "wood" ], "techniques": [ "WIDE", "WBLOCK_1" ], "volume": "2500 ml", + "longest_side": "180 cm", "bashing": 12, "cutting": 2, "to_hit": 1, @@ -385,6 +407,7 @@ "material": [ "steel" ], "techniques": [ "IMPALE", "WIDE", "WBLOCK_1" ], "volume": "2250 ml", + "longest_side": "180 cm", "bashing": 6, "cutting": 40, "flags": [ "POLEARM", "REACH_ATTACK", "SHEATH_SPEAR" ], @@ -405,6 +428,7 @@ "material": [ "wood" ], "techniques": [ "WBLOCK_1" ], "volume": "1 L", + "longest_side": "80 cm", "cutting": 11, "thrown_damage": [ { "damage_type": "bash", "amount": 5 }, { "damage_type": "stab", "amount": 11 } ], "flags": [ "SPEAR", "SHEATH_SPEAR", "JAVELIN" ], @@ -424,6 +448,7 @@ "material": [ "wood", "iron" ], "techniques": [ "WBLOCK_1" ], "volume": "1 L", + "longest_side": "80 cm", "bashing": 5, "cutting": 19, "thrown_damage": [ { "damage_type": "bash", "amount": 5 }, { "damage_type": "stab", "amount": 17 } ], @@ -440,6 +465,7 @@ "description": "This is a medieval weapon consisting of a wood shaft with a fire hardened point.", "weight": "2300 g", "volume": "3500 ml", + "longest_side": "300 cm", "price": 10000, "price_postapoc": 750, "bashing": 9, @@ -460,6 +486,7 @@ "description": "This is a medieval weapon consisting of a wood shaft tipped with a copper spearhead.", "weight": "2500 g", "volume": "3500 ml", + "longest_side": "300 cm", "price": 15000, "price_postapoc": 1000, "bashing": 9, @@ -480,6 +507,7 @@ "description": "This is a medieval weapon consisting of a wood shaft tipped with an iron spearhead.", "weight": "2500 g", "volume": "3500 ml", + "longest_side": "300 cm", "price": 40000, "price_postapoc": 5000, "bashing": 9, @@ -499,6 +527,7 @@ "description": "This is a dull, cheaply made replica of a medieval weapon consisting of a wood shaft tipped with an iron spearhead.", "weight": "2000 g", "volume": "3500 ml", + "longest_side": "300 cm", "price": 4000, "price_postapoc": 500, "to_hit": 1, @@ -520,6 +549,7 @@ "description": "This is a medieval weapon consisting of a wood shaft tipped with an iron spearhead. The head seems to be pretty dull, and the whole thing feels poorly made.", "weight": "2500 g", "volume": "3500 ml", + "longest_side": "300 cm", "price": 40000, "price_postapoc": 1250, "bashing": 25, @@ -539,6 +569,7 @@ "description": "A pole weapon with a curving single-edged blade. Its blade bears some superficial resemblance to that of an agricultural scythe from which it likely evolved.", "weight": "3013 g", "volume": "3250 ml", + "longest_side": "150 cm", "price": 16000, "price_postapoc": 2500, "bashing": 17, @@ -557,6 +588,7 @@ "description": "A well-made spear with a bronze head, Greek in origin.", "weight": "1598 g", "volume": "3500 ml", + "longest_side": "180 cm", "price": 10000, "price_postapoc": 3500, "to_hit": 1, @@ -577,6 +609,7 @@ "description": "This is a bronze polearm that originated in the Shang dynasty of China, if not earlier. It combines a spear head with the perpendicular blade of the earlier ge or dagger-axe.", "weight": "3175 g", "volume": "3750 ml", + "longest_side": "180 cm", "price": 50000, "price_postapoc": 3500, "bashing": 11, @@ -594,6 +627,7 @@ "description": "A stout wooden pole with a sharp stone spearhead.", "weight": "1098 g", "volume": "1250 ml", + "longest_side": "180 cm", "price": 1300, "price_postapoc": 50, "to_hit": 1, diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index 7be301f8b77c8..ddfeaab699e21 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -265,7 +265,7 @@ "description": "A femur or other bone, about 20 cm long, which has been broken at one end and sharpened into a cutting tool. Its jagged edge is wicked but fragile.", "symbol": "/", "color": "white", - "weight": 169, + "weight": "169 g", "//": "literally 75% of a bone.", "volume": "188 ml", "longest_side": "20 cm", @@ -344,8 +344,8 @@ "longest_side": "50 cm", "symbol": "/", "color": "green", - "weight": 522, - "volume": 1, + "weight": "522 g", + "volume": "250 ml", "price": 2300, "price_postapoc": 1800, "to_hit": 1, @@ -1113,7 +1113,7 @@ "looks_like": "fencing_foil", "name": { "str": "sharpened foil" }, "description": "This once mostly harmless fencing foil has had its electrical plunger assembly removed and has been crudely sharpened to a point. Though it still lacks a cutting edge, it is now somewhat more lethal, yet still familiar to the practiced fencer.", - "relative": { "weight": -25, "cutting": 2 } + "relative": { "weight": "-25 g", "cutting": 2 } }, { "id": "fencing_epee_sharpened", @@ -1122,7 +1122,7 @@ "looks_like": "fencing_epee", "name": { "str": "sharpened épée" }, "description": "This once mostly harmless fencing épée has had its electrical plunger assembly removed and has been crudely sharpened to a point. Though it still lacks a cutting edge, it is now considerably more lethal, yet still familiar to the practiced fencer.", - "relative": { "weight": -35, "cutting": 5 } + "relative": { "weight": "-35 g", "cutting": 5 } }, { "id": "fencing_sabre_sharpened", @@ -1131,7 +1131,7 @@ "looks_like": "fencing_sabre", "name": { "str": "sharpened saber" }, "description": "This once mostly harmless fencing saber has had its rounded tip snapped off and has been crudely sharpened to a point. Though it still lacks a cutting edge, it is now considerably more lethal, yet still familiar to the practiced fencer.", - "relative": { "weight": -10, "cutting": 5 } + "relative": { "weight": "-10 g", "cutting": 5 } }, { "id": "shock_foil", @@ -1148,6 +1148,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1171,6 +1172,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1194,6 +1196,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1408,7 +1411,7 @@ "longest_side": "90 cm", "bashing": 17, "cutting": 8, - "to_hit": 2, + "to_hit": 1, "category": "weapons", "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 9 ] ] }, @@ -1657,6 +1660,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "500 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "heavy_battery_cell", "heavy_plus_battery_cell", "heavy_atomic_battery_cell", "heavy_disposable_cell" ] @@ -1709,6 +1713,7 @@ "price": 12000, "price_postapoc": 1250, "material": [ "wood", "iron" ], + "ascii_picture": "lajatang", "techniques": [ "WBLOCK_1", "SPIN" ], "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE", "ALWAYS_TWOHAND" ], "weight": "2500 g", @@ -1782,6 +1787,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "200 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] diff --git a/data/json/items/migration.json b/data/json/items/migration.json index 5733fd4dd7373..697712907fc35 100644 --- a/data/json/items/migration.json +++ b/data/json/items/migration.json @@ -1233,5 +1233,10 @@ "id": "carton_unsealed", "type": "MIGRATION", "replace": "carton_sealed" + }, + { + "id": "four_winds_shotgun", + "type": "MIGRATION", + "replace": "slamfire_shotgun" } ] diff --git a/data/json/items/obsolete.json b/data/json/items/obsolete.json index 98a07f0b6c10b..51786c71aace5 100644 --- a/data/json/items/obsolete.json +++ b/data/json/items/obsolete.json @@ -99,7 +99,7 @@ "description": "Rifling a shotgun barrel is mainly done in order to improve its accuracy when firing slugs. The rifling makes the gun less suitable for shot, however.", "weight": "226 g", "volume": "500 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 22000, "to_hit": 1, "bashing": 3, @@ -119,7 +119,7 @@ "description": "An improved blowback mechanism makes your firearm's automatic fire faster, at the cost of reduced accuracy and increased noise.", "weight": "114 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 70000, "material": [ "steel" ], "symbol": ":", @@ -138,7 +138,7 @@ "description": "A simple mechanism that converts a pistol to a selective fire weapon with a burst size of three rounds. However it reduces accuracy and increases noise.", "weight": "113 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 65000, "material": [ "steel", "plastic" ], "symbol": ":", @@ -179,7 +179,7 @@ "description": "Replacing several key parts of a 9x19mm, .38, .40, 5.7mm, 4.6mm, 7.62x39mm or .223 firearm converts it to a .22 firearm. The conversion results in a slight reduction to accuracy.", "weight": "114 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 32000, "material": [ "steel" ], "symbol": ":", @@ -199,7 +199,7 @@ "description": "This kit is used to convert a shotgun, 5.45x39mm, 7.62x39mm, .30-06, or .308 rifle to the popular, accurate, and lighter .223 caliber. The conversion results in slight reductions to both accuracy and ammo capacity.", "weight": "114 g", "volume": "500 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 50000, "material": [ "steel" ], "symbol": ":", @@ -219,7 +219,7 @@ "description": "This kit is used to convert a shotgun or 7.62x39mm, .223 or .30-06 rifle to the popular and powerful .308 caliber. The conversion results in reduced ammo capacity and a slight reduction to accuracy.", "weight": "114 g", "volume": "500 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 52000, "material": [ "steel" ], "symbol": ":", @@ -239,7 +239,7 @@ "description": "Replacing several key parts of a 9x19mm, .38, .40 or .44 firearm converts it to a .45 firearm. The conversion results in a slight reduction to accuracy.", "weight": "226 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 48000, "material": [ "steel" ], "symbol": ":", @@ -259,7 +259,7 @@ "description": "A conversion kit produced by Heckler and Koch, used to convert .22, 9x19mm, or .38 firearms to their proprietary 4.6x30mm, a round designed for accuracy and armor penetration.", "weight": "114 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 46000, "material": [ "steel" ], "symbol": ":", @@ -279,7 +279,7 @@ "description": "A conversion kit produced by FN Herstal, used to convert .22, 9x19mm, or .38 firearms to their proprietary 5.7x28mm, a round designed for accuracy and armor penetration.", "weight": "114 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 46000, "material": [ "steel" ], "symbol": ":", @@ -299,7 +299,7 @@ "description": "Replacing several key parts of a 9x18mm, .38, .40, .44 or .45 firearm converts it to a 9x19mm firearm. The conversion results in a slight reduction to accuracy.", "weight": "114 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 42000, "material": [ "steel" ], "symbol": ":", @@ -351,7 +351,7 @@ "description": "A set of finely tuned internal components which increase the precision and reliably of a firearm.", "weight": "120 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 ml", "price": 2500, "material": [ "steel", "superalloy" ], "symbol": ":", @@ -2282,7 +2282,7 @@ [ "rail mount", 1 ], [ "underbarrel mount", 1 ] ], - "relative": { "weight": 1000, "volume": 6, "range": 3, "ranged_damage": { "damage_type": "stab", "amount": 4 } }, + "relative": { "weight": "1 kg", "volume": "1500 ml", "range": 3, "ranged_damage": { "damage_type": "stab", "amount": 4 } }, "proportional": { "price": 3, "dispersion": 0.5 }, "pocket_data": [ { @@ -2691,7 +2691,7 @@ "skill": "rifle", "dispersion": 150, "durability": 7, - "barrel_length": "250 ml", + "barrel_volume": "250 ml", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "2 rd.", 2 ], [ "AUTO", "auto", 4 ] ], "valid_mod_locations": [ [ "accessories", 4 ], diff --git a/data/json/items/ranged/archery.json b/data/json/items/ranged/archery.json index bc0eb7f8536d6..fa3c666e5c57c 100644 --- a/data/json/items/ranged/archery.json +++ b/data/json/items/ranged/archery.json @@ -661,7 +661,7 @@ "price": 160000, "//": "120 lb draw weight, very efficient, 0.5 slugs of momentum with a 30g arrow.", "material": [ "steel", "plastic" ], - "flags": [ "FIRE_TWOHAND", "RELOAD_AND_SHOOT" ], + "flags": [ "FIRE_TWOHAND", "RELOAD_AND_SHOOT", "PRIMITIVE_RANGED_WEAPON" ], "skill": "archery", "min_strength": 15, "ammo": [ "arrow" ], diff --git a/data/json/items/resources/alien.json b/data/json/items/resources/alien.json index 34217f32a970e..ca2c5fab78c0e 100644 --- a/data/json/items/resources/alien.json +++ b/data/json/items/resources/alien.json @@ -28,5 +28,122 @@ "symbol": "0", "color": "light_blue", "flags": [ "NO_SALVAGE" ] + }, + { + "type": "GENERIC", + "id": "exodii_chassis", + "name": { "str_sp": "Exodii chassis" }, + "description": "This roughly hexagonal frame and associated bodywork looks like it was constructed as a single monolithic piece. The fitting holes and attachments are extremely durable, despite showing signs of heavy wear and repair. The structure is versatile, and could probably be engineered to serve a number of different heavy combat roles.", + "symbol": "c", + "color": "light_gray", + "weight": "500 kg", + "volume": "700 L", + "price": 1000000, + "material": [ "steel" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_drone_chassis", + "name": { "str_sp": "Exodii drone chassis" }, + "description": "This small, roughly hexagonal frame and associated bodywork looks like it was constructed as a single monolithic piece. The fitting holes and attachments are extremely durable, despite showing signs of heavy wear and repair. The structure is versatile, and could probably be engineered to serve a number of different heavy combat roles.", + "symbol": "c", + "color": "light_gray", + "weight": "40 kg", + "volume": "150 L", + "price": 100000, + "material": [ "steel", "aluminum" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "cyborg_matrix", + "name": { "str": "cybernetic neural matrix", "str_pl": "cybernetic neural matrices" }, + "description": "A series of tanks and tubes with ports for fluids, electricity, and input and output, this complex arrangement is made to house a brain and spine and the most difficult to replace organs for keeping them alive.", + "symbol": "m", + "color": "light_blue", + "weight": "20 kg", + "volume": "10 L", + "price": 10000, + "material": [ "plastic", "aluminum", "steel" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_computer", + "name": { "str": "unfamiliar electronic thingy" }, + "description": "The wiring and general shape suggest to you that this is a computer, or at least some sort of electronic device, but what it is and what role it serves is lost on you. It's heavy and sturdy in construction.", + "symbol": "p", + "color": "dark_gray", + "weight": "10 kg", + "volume": "10 L", + "price": 10000, + "material": [ "plastic", "steel" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_module", + "name": { "str_sp": "inscribed metal plates" }, + "description": "This device looks electronic, but is unfamiliar. It is a series of tightly fitted coppery-looking rings, set concentrically. Wires run from each ring to an axis in the middle.", + "symbol": "i", + "color": "dark_gray", + "weight": "1 kg", + "volume": "1 L", + "price": 1000, + "material": [ "copper", "steel" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_sensor", + "name": { "str": "cybernetic sensor" }, + "description": "From the large glassy eye - the size of a small dinner plate - in the front, you deduce this is some sort of camera. None of the inner workings make any sense to you nor resemble any camera you've seen before.", + "symbol": ")", + "color": "blue", + "weight": "5 kg", + "volume": "3 L", + "price": 20000, + "material": [ "steel", "plastic" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_motor", + "name": { "str": "rotary device" }, + "description": "You assume from the coils of coppery wire and the protruding piston that this is some sort of motor or generator, but the design doesn't look similar to anything you've seen before, and you can't figure out how to get it to work.", + "symbol": "o", + "color": "blue", + "weight": "2 kg", + "volume": "500 ml", + "price": 2000, + "material": [ "steel", "copper" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_scanner_dish", + "name": { "str": "engraved parabolic dish", "str_pl": "engraved parabolic dishes" }, + "description": "This hefty parabolic dish is engraved with an unrecognizable pattern of symbols that might, at a guess, be some sort of circuitry pattern - or maybe a religious incantation.", + "symbol": "o", + "color": "blue", + "weight": "5 kg", + "volume": "1000 ml", + "price": 2000, + "material": [ "steel", "lead" ], + "category": "spare_parts" + }, + { + "type": "GENERIC", + "id": "exodii_portalizer", + "name": { "str": "oblong device" }, + "description": "Perfectly smooth, cool to the touch, and a dull blue-grey colour, this looks almost like a perfect riverstone at first glance. Its artificial nature is betrayed on closer inspection by a network of intricate patterns visible as a slight difference in the reflection of light off its surface.", + "symbol": "0", + "color": "blue", + "weight": "2 kg", + "volume": "1500 ml", + "price": 2000, + "material": [ "copper", "ceramic" ], + "category": "spare_parts" } ] diff --git a/data/json/items/tool/container.json b/data/json/items/tool/container.json index 0daed8a9d5915..e643ff47cf46d 100644 --- a/data/json/items/tool/container.json +++ b/data/json/items/tool/container.json @@ -6,7 +6,7 @@ "name": { "str": "steel bottle" }, "description": "A stainless steel water bottle, holds 750ml of liquid.", "weight": "200 g", - "volume": "750 ml", + "volume": "787 ml", "price": 0, "price_postapoc": 10, "to_hit": 1, diff --git a/data/json/items/tool/cooking.json b/data/json/items/tool/cooking.json index da051ba4beb61..8eb6cb1a54ad7 100644 --- a/data/json/items/tool/cooking.json +++ b/data/json/items/tool/cooking.json @@ -86,6 +86,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -122,6 +123,7 @@ "material": [ "wood", "plastic" ], "symbol": ";", "color": "light_gray", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 150 } } ], "initial_charges": 150, "max_charges": 150, "charges_per_use": 1, @@ -143,6 +145,7 @@ "symbol": ";", "color": "light_gray", "ammo": [ "charcoal" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 200 } } ], "max_charges": 200, "flags": [ "ALLOWS_REMOTE_USE" ] }, @@ -162,6 +165,7 @@ "color": "green", "ammo": [ "charcoal" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 50 } } ], "initial_charges": 50, "max_charges": 50, "charges_per_use": 1, @@ -174,7 +178,7 @@ "name": { "str": "clay pot" }, "description": "A crude clay pot with lid used for cooking.", "weight": "480 g", - "volume": "2 L", + "volume": "2100 ml", "price": 2500, "price_postapoc": 10, "bashing": 1, @@ -207,7 +211,7 @@ "name": { "str": "clay teapot" }, "description": "A clay teapot. Now all you need is tea and water.", "weight": "429 g", - "volume": "750 ml", + "volume": "787 ml", "price": 2000, "price_postapoc": 10, "to_hit": 1, @@ -239,6 +243,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -265,6 +270,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -311,6 +317,7 @@ "color": "light_gray", "ammo": [ "esbit" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "esbit": 50 } } ], "initial_charges": 50, "max_charges": 50, "charges_per_use": 1, @@ -363,6 +370,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -386,6 +394,7 @@ "color": "green", "ammo": [ "gasoline" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasoline": 500 }, "watertight": true, "rigid": true } ], "initial_charges": 500, "max_charges": 500, "charges_per_use": 1, @@ -440,6 +449,7 @@ "symbol": ",", "color": "light_gray", "ammo": [ "tinder" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "tinder": 100 } } ], "max_charges": 100, "charges_per_use": 25, "use_action": [ "HOTPLATE" ] @@ -464,6 +474,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -559,6 +570,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -588,6 +600,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -675,6 +688,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -718,6 +732,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -749,6 +764,7 @@ "color": "green", "ammo": [ "lamp_oil" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "lamp_oil": 800 }, "watertight": true, "rigid": true } ], "initial_charges": 800, "max_charges": 800, "charges_per_use": 1, @@ -810,6 +826,7 @@ "color": "light_gray", "ammo": [ "conc_alcohol" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "conc_alcohol": 500 }, "watertight": true, "rigid": true } ], "initial_charges": 500, "max_charges": 500, "charges_per_use": 1, @@ -937,6 +954,7 @@ "color": "brown", "ammo": [ "lamp_oil" ], "sub": "hotplate", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "lamp_oil": 800 }, "watertight": true, "rigid": true } ], "max_charges": 800, "charges_per_use": 1, "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], @@ -949,7 +967,7 @@ "name": { "str": "teapot" }, "description": "A small metal teapot. Teatime wouldn't be complete without one.", "weight": "229 g", - "volume": "500 ml", + "volume": "525 ml", "price": 1000, "price_postapoc": 10, "to_hit": 2, @@ -979,6 +997,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1024,6 +1043,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool/electronics.json b/data/json/items/tool/electronics.json index ea761e0df0e92..8620d9f8e610b 100644 --- a/data/json/items/tool/electronics.json +++ b/data/json/items/tool/electronics.json @@ -3,7 +3,7 @@ "id": "adv_UPS_off", "type": "TOOL", "name": { "str": "advanced UPS", "str_pl": "advanced UPS's" }, - "description": "This is an advanced version of the unified power supply, or UPS. This device has been significantly redesigned to provide better efficiency as well as to consume plutonium fuel cells rather than batteries. Sadly, its plutonium reactor can't be charged in UPS charging station.", + "description": "This is an advanced version of the unified power supply, or UPS. This device has been significantly redesigned to provide better efficiency as well as to consume plutonium fuel batteries rather than regular batteries. Sadly, its plutonium reactor can't be charged in UPS charging station.", "weight": "453 g", "volume": "2 L", "price": 560000, @@ -13,8 +13,16 @@ "material": [ "aluminum", "plastic" ], "symbol": ";", "color": "light_green", - "ammo": [ "plutonium" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "plutonium": 2500 } } ], + "ammo": [ "battery" ], + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "heavy_atomic_battery_cell" ] + } + ], "flags": [ "IS_UPS" ] }, { @@ -36,6 +44,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -71,6 +80,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -112,6 +122,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -191,6 +202,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -219,12 +231,14 @@ "to_hit": 1, "bashing": 5, "material": [ "plastic", "aluminum" ], + "ascii_picture": "electrohack", "symbol": ",", "color": "green", "ammo": [ "battery" ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -259,6 +273,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -304,6 +319,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "100 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -350,6 +366,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -377,6 +394,7 @@ "price": 3000, "price_postapoc": 100, "material": [ "aluminum", "plastic" ], + "ascii_picture": "mp3", "symbol": ";", "color": "dark_gray", "ammo": [ "battery" ], @@ -385,6 +403,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -432,6 +451,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -475,6 +495,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -591,6 +612,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool/entry_tools.json b/data/json/items/tool/entry_tools.json index 4a2cf6dea0626..a07baa6ad5ae0 100644 --- a/data/json/items/tool/entry_tools.json +++ b/data/json/items/tool/entry_tools.json @@ -6,6 +6,7 @@ "description": "This is a hefty prying tool. Use it to open locked doors without destroying them or to lift manhole covers. You could also wield it to bash some heads in.", "weight": "500 g", "volume": "1 L", + "longest_side": "60 cm", "price": 1300, "price_postapoc": 500, "to_hit": -1, @@ -39,8 +40,9 @@ "type": "TOOL", "name": { "str": "ice axe" }, "description": "This is an ice axe with hammer on its head, a multi-purpose hiking and climbing tool used by mountaineers. It is sturdy enough to pry open closed doors or lift manhole covers.", - "weight": "500 g", + "weight": "239 g", "volume": "750 ml", + "longest_side": "45 cm", "price": 5000, "price_postapoc": 500, "to_hit": -2, @@ -59,8 +61,9 @@ "type": "TOOL", "name": { "str": "makeshift crowbar" }, "description": "This is a pipe whose ends have been bent and hammered flat to resemble a crowbar. Use it to open locked crates without destroying them, or to lift manhole covers. You could also wield it to fight with, in a pinch.", - "weight": "1250 g", + "weight": "1000 g", "volume": "1 L", + "longest_side": "60 cm", "price": 0, "price_postapoc": 10, "to_hit": -1, diff --git a/data/json/items/tool/explosives.json b/data/json/items/tool/explosives.json index 476a2192988f7..40fb855d9c7b6 100644 --- a/data/json/items/tool/explosives.json +++ b/data/json/items/tool/explosives.json @@ -673,7 +673,7 @@ "type": "TOOL", "category": "weapons", "name": { "str": "EMP grenade" }, - "description": "This is a grenade that generates an electromagnetic pulse with a low-inductance capacitor bank discharged into a single-loop antenna. Use this item to pull the pin and light the fuse, turning it into an active EMP grenade. You will then have three turns before it detonates, creating an EMP field that damages robots and drains bionic energy.", + "description": "This is a grenade that generates an electromagnetic pulse with a low-inductance capacitor bank discharged into a single-loop antenna. It also produces a mild electric shock cloud. Use this item to pull the pin and light the fuse, turning it into an active EMP grenade. You will then have three turns before it detonates, creating an EMP field that damages robots and drains bionic energy.", "weight": "400 g", "volume": "250 ml", "price": 6000, @@ -700,7 +700,7 @@ "type": "TOOL", "category": "weapons", "name": { "str": "active EMP grenade" }, - "description": "This EMP grenade is active, and will shortly detonate, creating a large EMP field that damages robots and drains bionic energy. You may not want to be holding it much longer.", + "description": "This EMP grenade is active, and will shortly detonate, creating a large EMP field that damages robots and drains bionic energy as well as a mild electric shock cloud. You may not want to be holding it much longer.", "weight": "400 g", "volume": "250 ml", "price": 0, @@ -715,8 +715,10 @@ "turns_per_charge": 1, "use_action": { "type": "explosion", - "draw_explosion_radius": 4, - "draw_explosion_color": "light_blue", + "fields_type": "fd_electricity", + "fields_radius": 2, + "fields_min_intensity": 3, + "fields_max_intensity": 3, "emp_blast_radius": 4, "sound_volume": 0, "sound_msg": "Tick.", diff --git a/data/json/items/tool/fire.json b/data/json/items/tool/fire.json index ceee5a07ea3b2..2456464fbbc1d 100644 --- a/data/json/items/tool/fire.json +++ b/data/json/items/tool/fire.json @@ -18,6 +18,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -103,7 +104,7 @@ "rand_charges": [ 1, 10, 12, 15, 16, 22, 44, 50, 67, 75, 82, 100 ], "max_charges": 100, "charges_per_use": 1, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "butane": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "butane": 100 }, "watertight": true } ], "use_action": { "type": "firestarter", "moves": 50 }, "flags": [ "FIRESTARTER", "NO_UNLOAD" ] }, @@ -138,7 +139,7 @@ "initial_charges": 20, "max_charges": 20, "charges_per_use": 1, - "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "match": 20 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "holster": true, "ammo_restriction": { "match": 20 } } ], "use_action": { "type": "firestarter", "moves": 40, "moves_slow": 1000 }, "flags": [ "FIRESTARTER", "NO_RELOAD", "NO_UNLOAD" ] }, diff --git a/data/json/items/tool/firefighting.json b/data/json/items/tool/firefighting.json index 71a47c8c9a441..5525c81a809ad 100644 --- a/data/json/items/tool/firefighting.json +++ b/data/json/items/tool/firefighting.json @@ -14,6 +14,7 @@ "techniques": [ "WBLOCK_1" ], "weight": "907 g", "volume": "1 L", + "longest_side": "40 cm", "bashing": 17, "cutting": 28, "to_hit": -2, @@ -25,8 +26,9 @@ "type": "TOOL", "name": { "str": "large fire extinguisher" }, "description": "This is an emergency fire extinguisher containing five gallons of fire retardant foam. It would be useful for putting out adjacent fires.", - "weight": "13813 g", + "weight": "7030 g", "volume": "20000 ml", + "longest_side": "50 cm", "price": 5000, "price_postapoc": 100, "to_hit": -4, @@ -35,8 +37,18 @@ "symbol": ";", "color": "red", "initial_charges": 100, + "pocket_data": [ + { + "pocket_type": "MAGAZINE", + "airtight": true, + "watertight": true, + "rigid": true, + "ammo_restriction": { "extinguishing_agent": 100 } + } + ], "max_charges": 100, "charges_per_use": 1, + "flags": [ "NO_UNLOAD", "NO_RELOAD" ], "use_action": [ "EXTINGUISHER" ] }, { @@ -47,6 +59,7 @@ "weight": "2520 g", "volume": "2 L", "price": 20000, + "longest_side": "90 cm", "price_postapoc": 1500, "bashing": 17, "cutting": 34, @@ -63,11 +76,12 @@ "type": "TOOL", "name": { "str": "Halligan bar" }, "description": "This is a heavy multiple-use tool commonly carried by firefighters, law enforcement, and military rescue units. Use it to open locked doors without destroying them or to lift manhole covers. You could also wield it to bash some heads in.", - "weight": "3600 g", + "weight": "5443 g", "volume": "1250 ml", + "longest_side": "60 cm", "price": 7500, "price_postapoc": 1500, - "bashing": 40, + "bashing": 45, "cutting": 5, "material": [ "steel" ], "symbol": ";", @@ -75,15 +89,16 @@ "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "qualities": [ [ "PRY", 4 ], [ "HAMMER", 2 ], [ "DIG", 1 ] ], "use_action": [ "HAMMER", "CROWBAR" ], - "flags": [ "DURABLE_MELEE", "BELT_CLIP", "STAB" ] + "flags": [ "DURABLE_MELEE", "BELT_CLIP", "STAB", "SHEATH_AXE" ] }, { "id": "sm_extinguisher", "type": "TOOL", "name": { "str": "small fire extinguisher" }, "description": "This is a hand held fire extinguisher containing a liter of highly compressed CO2 gas. It would be useful for putting out adjacent fires.", - "weight": "2267 g", + "weight": "1133 g", "volume": "2000 ml", + "longest_side": "40 cm", "price": 4000, "price_postapoc": 50, "to_hit": -1, @@ -91,9 +106,20 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "red", + "pocket_data": [ + { + "pocket_type": "MAGAZINE", + "airtight": true, + "watertight": true, + "rigid": true, + "ammo_restriction": { "extinguishing_agent": 10 } + } + ], "initial_charges": 10, "max_charges": 10, + "ammo": "extinguishing_agent", "charges_per_use": 1, + "flags": [ "NO_UNLOAD", "NO_RELOAD" ], "use_action": [ "EXTINGUISHER" ] }, { @@ -101,18 +127,47 @@ "type": "TOOL", "category": "tools", "name": { "str": "throwable fire extinguisher" }, - "description": "This is a fire extinguisher in grenade form. While not as effective as a regular fire extinguisher, you can use it from a distance. It is activated by heat, so just throw it into the flames.", + "description": "This is a fire extinguisher in grenade form. While not as effective as a regular fire extinguisher, you can use it from a distance. It has a plastic plug that can be pulled, but is primarely activated by heat, so just throw it into the flames.", "weight": "630 g", "volume": "250 ml", "price": 3000, "price_postapoc": 50, "to_hit": -1, "bashing": 3, - "material": [ "plastic" ], + "material": [ "steel" ], "symbol": "*", "color": "blue", - "use_action": [ "THROWABLE_EXTINGUISHER_ACT" ], - "flags": [ "ACT_IN_FIRE" ] + "use_action": { + "target": "throw_extinguisher_act", + "target_charges": 3, + "menu_text": "Pull plug", + "msg": "You pull the plug on the extinguisher grenade.", + "active": true, + "type": "transform" + }, + "flags": [ "ACT_IN_FIRE", "BOMB" ] + }, + { + "id": "throw_extinguisher_act", + "type": "TOOL", + "category": "tools", + "name": { "str": "active throwable fire extinguisher" }, + "description": "This is an active extinguisher grenade, likely to burst any second now. Better throw it!", + "weight": "630 g", + "volume": "250 ml", + "price": 0, + "price_postapoc": 0, + "to_hit": -1, + "bashing": 6, + "material": [ "steel" ], + "symbol": "*", + "color": "light_red", + "initial_charges": 3, + "max_charges": 3, + "turns_per_charge": 1, + "emits": [ "emit_extinguisher_burst" ], + "revert_to": "canister_empty", + "flags": [ "TRADER_AVOID" ] }, { "id": "pike_pole", @@ -128,6 +183,7 @@ "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], "weight": "3100 g", "volume": "3250 ml", + "longest_side": "160 cm", "bashing": 20, "cutting": 6, "to_hit": -1, @@ -147,6 +203,7 @@ "flags": [ "DURABLE_MELEE", "STAB", "SHEATH_AXE" ], "weight": "2900 g", "volume": "1900 ml", + "longest_side": "90 cm", "bashing": 15, "cutting": 13, "to_hit": -1, diff --git a/data/json/items/tool/fishing.json b/data/json/items/tool/fishing.json index 92cdd3a3b291e..fd81ac3ca3b6a 100644 --- a/data/json/items/tool/fishing.json +++ b/data/json/items/tool/fishing.json @@ -13,6 +13,7 @@ "symbol": ";", "color": "green", "ammo": [ "fish_bait" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "fish_bait": 5 } } ], "max_charges": 5, "use_action": [ "FISH_TRAP" ] }, diff --git a/data/json/items/tool/knives.json b/data/json/items/tool/knives.json index ac389deb2daa0..7c38c98bb589d 100644 --- a/data/json/items/tool/knives.json +++ b/data/json/items/tool/knives.json @@ -6,6 +6,7 @@ "description": "A knife consisting of crudely-worked copper, and a simple handle. Primitive, but a step above stone-age.", "weight": "650 g", "volume": "250 ml", + "longest_side": "25 cm", "price": 3000, "price_postapoc": 10, "to_hit": -1, @@ -44,6 +45,7 @@ "description": "A sharp, knife-like tool used in harvesting honey from beehives. Makes a passable melee weapon.", "weight": "580 g", "volume": "250 ml", + "longest_side": "46 cm", "price": 1000, "price_postapoc": 100, "to_hit": -1, @@ -79,6 +81,7 @@ "description": "This is a sharpened stone set into a hollowed handle. Not nearly as usable as a proper knife, but it's better than nothing.", "weight": "453 g", "volume": "250 ml", + "longest_side": "25 cm", "price": 0, "price_postapoc": 0, "to_hit": -3, diff --git a/data/json/items/tool/landscaping.json b/data/json/items/tool/landscaping.json index c665b19df71b9..670c8503c9137 100644 --- a/data/json/items/tool/landscaping.json +++ b/data/json/items/tool/landscaping.json @@ -7,6 +7,7 @@ "description": "This is a large stick, with the end carved into a broad blade for digging. It could be used to dig shallow pits, but not deep ones.", "weight": "1133 g", "volume": "1500 ml", + "longest_side": "90 cm", "price": 0, "price_postapoc": 0, "bashing": 8, @@ -24,6 +25,7 @@ "description": "A small, sharp gardening shovel, perfect for digging up grubs and worms.", "weight": "280 g", "volume": "500 ml", + "longest_side": "25 cm", "price": 20, "price_postapoc": 50, "to_hit": 1, @@ -41,6 +43,7 @@ "description": "This is a farming implement. You can use it to turn tillable land into a slow-to-cross pile of dirt, or dig a shallow pit.", "weight": "1088 g", "volume": "3500 ml", + "longest_side": "140 cm", "price": 2000, "price_postapoc": 250, "to_hit": 1, @@ -60,6 +63,7 @@ "description": "This is a flattened stone affixed to a stick. It works passably well as a shovel but really can't compare to a real shovel.", "weight": "1581 g", "volume": "4 L", + "longest_side": "90 cm", "price": 0, "price_postapoc": 0, "bashing": 15, @@ -108,8 +112,9 @@ "type": "TOOL", "name": { "str": "scythe" }, "description": "This is an old-fashioned farming tool used to cut tall grass. While it may be a giant blade on the end of a stick, it is incredibly awkward to use for anything but its intended purpose.", - "weight": "3013 g", + "weight": "2140 g", "volume": "3250 ml", + "longest_side": "140 cm", "price": 8000, "price_postapoc": 250, "to_hit": -6, @@ -127,8 +132,9 @@ "type": "TOOL", "name": { "str": "shovel" }, "description": "This is a digging tool. Use it to dig pits adjacent to your location.", - "weight": "1315 g", + "weight": "2032 g", "volume": "3500 ml", + "longest_side": "140 cm", "price": 2000, "price_postapoc": 250, "to_hit": 3, @@ -187,8 +193,9 @@ "type": "TOOL", "name": { "str": "sickle" }, "description": "This is an old-fashioned farming tool used to cut tall grass. While it may be a massive curved blade on a handle, it is incredibly awkward to use for anything but its intended purpose.", - "weight": "1432 g", + "weight": "907 g", "volume": "1250 ml", + "longest_side": "50 cm", "price": 3800, "price_postapoc": 250, "to_hit": -2, @@ -208,6 +215,7 @@ "description": "A cordless, double-sided, gasoline-powered hedge trimmer. A long line of sharp-edged teeth extends from the engine; turning the trimmer on will make them rapidly vibrate. The poor man's chainsaw as far as the zombies are concerned.", "weight": "4500 g", "volume": "2500 ml", + "longest_side": "100 cm", "price": 4000, "price_postapoc": 250, "to_hit": -1, diff --git a/data/json/items/tool/lighting.json b/data/json/items/tool/lighting.json index da74917f0eda9..0f3643b35f684 100644 --- a/data/json/items/tool/lighting.json +++ b/data/json/items/tool/lighting.json @@ -111,7 +111,8 @@ "need_fire": 1, "menu_text": "Light", "type": "transform" - } + }, + "flags": [ "BURNOUT" ] }, { "id": "candle_lit", @@ -134,7 +135,7 @@ { "type": "firestarter", "moves": 100 }, { "target": "candle", "msg": "The candle winks out.", "menu_text": "Extinguish", "type": "transform" } ], - "flags": [ "LIGHT_8", "WATER_EXTINGUISH", "TRADER_AVOID", "WIND_EXTINGUISH", "FIRESTARTER" ] + "flags": [ "LIGHT_8", "WATER_EXTINGUISH", "TRADER_AVOID", "WIND_EXTINGUISH", "FIRESTARTER", "BURNOUT" ] }, { "id": "electric_lantern", @@ -164,6 +165,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -197,8 +199,8 @@ "material": [ "plastic", "aluminum" ], "symbol": ";", "color": "blue", - "weight": "400 g", - "volume": "500 ml", + "weight": "200 g", + "volume": "200 ml", "price": 500, "price_postapoc": 100, "charges_per_use": 1, @@ -255,6 +257,7 @@ "symbol": ";", "color": "yellow", "ammo": [ "gasoline" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "watertight": true, "ammo_restriction": { "gasoline": 500 } } ], "initial_charges": 500, "max_charges": 500, "charges_per_use": 1, @@ -475,6 +478,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -505,6 +509,7 @@ "symbol": ";", "color": "yellow", "ammo": [ "lamp_oil" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "watertight": true, "ammo_restriction": { "lamp_oil": 750 } } ], "initial_charges": 750, "max_charges": 750, "charges_per_use": 1, @@ -597,6 +602,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -643,6 +649,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -684,8 +691,8 @@ "symbol": "/", "color": "brown", "techniques": [ "WBLOCK_1" ], - "initial_charges": 25, - "max_charges": 25, + "initial_charges": 20, + "max_charges": 20, "charges_per_use": 1, "use_action": { "target": "torch_lit", @@ -694,7 +701,8 @@ "need_fire": 1, "menu_text": "Light torch", "type": "transform" - } + }, + "flags": [ "BURNOUT" ] }, { "id": "torch_lit", @@ -710,9 +718,9 @@ "material": [ "wood" ], "symbol": "/", "color": "brown", - "initial_charges": 75, - "max_charges": 75, - "turns_per_charge": 40, + "initial_charges": 20, + "max_charges": 20, + "turns_per_charge": 60, "revert_to": "torch_done", "use_action": [ { "type": "firestarter", "moves": 30 }, @@ -725,6 +733,6 @@ } ], "techniques": [ "WBLOCK_1" ], - "flags": [ "FIRE", "LIGHT_310", "CHARGEDIM", "FLAMING", "TRADER_AVOID", "WATER_EXTINGUISH" ] + "flags": [ "FIRE", "LIGHT_310", "CHARGEDIM", "FLAMING", "TRADER_AVOID", "WATER_EXTINGUISH", "BURNOUT" ] } ] diff --git a/data/json/items/tool/med.json b/data/json/items/tool/med.json index 947ee2f808496..fdde5da93823b 100644 --- a/data/json/items/tool/med.json +++ b/data/json/items/tool/med.json @@ -88,6 +88,7 @@ "color": "light_gray", "ammo": [ "ampoule" ], "initial_charges": 2, + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "ampoule": 2 } } ], "max_charges": 2, "charges_per_use": 1, "use_action": [ "JET_INJECTOR" ] @@ -125,6 +126,9 @@ "symbol": ";", "color": "light_gray", "initial_charges": 12, + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "watertight": true, "rigid": true, "ammo_restriction": { "oxygen": 12 } } + ], "max_charges": 12, "charges_per_use": 1, "use_action": [ "OXYGEN_BOTTLE" ] @@ -154,6 +158,7 @@ "price_postapoc": 10, "to_hit": -3, "material": [ "plastic" ], + "ascii_picture": "thermometer", "symbol": ";", "color": "red", "use_action": [ "WEATHER_TOOL" ], @@ -174,7 +179,9 @@ "symbol": ";", "color": "light_gray", "initial_charges": 24, - "pocket_data": [ { "pocket_type": "MAGAZINE", "airtight": true, "watertight": true, "ammo_restriction": { "oxygen": 24 } } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "watertight": true, "rigid": true, "ammo_restriction": { "oxygen": 24 } } + ], "max_charges": 24, "charges_per_use": 1, "use_action": [ "OXYGEN_BOTTLE" ] @@ -186,7 +193,7 @@ "name": { "str": "blood draw kit" }, "description": "This is a kit for drawing blood, including a test tube for holding the sample. Use this tool to draw blood, either from yourself or from a corpse you are standing on.", "weight": "13 g", - "volume": "250 ml", + "volume": "262 ml", "price": 3000, "price_postapoc": 100, "to_hit": -3, @@ -202,7 +209,7 @@ "watertight": true, "rigid": true, "max_contains_volume": "250 ml", - "max_contains_weight": "50 g" + "max_contains_weight": "262 g" } ] }, diff --git a/data/json/items/tool/misc.json b/data/json/items/tool/misc.json index cc6430accba0d..1c3fdaecf882a 100644 --- a/data/json/items/tool/misc.json +++ b/data/json/items/tool/misc.json @@ -56,6 +56,7 @@ "volume": "500 ml", "price": 1500, "price_postapoc": 250, + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "butane": 30 }, "watertight": true, "rigid": true } ], "initial_charges": 30, "max_charges": 30, "charges_per_use": 1, @@ -112,6 +113,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -148,6 +150,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -250,8 +253,8 @@ "category": "tools", "name": { "str": "grappling hook" }, "description": "A folding grappling hook attached to a stout 30-foot long piece of lightweight cord. Useful for keeping yourself safe from falls. Can be used in place of a long rope for butchering, in a pinch.", - "weight": "760 g", - "volume": "750 ml", + "weight": "1980 g", + "volume": "2500 ml", "price_postapoc": 500, "to_hit": -2, "bashing": 12, @@ -261,7 +264,8 @@ "color": "light_gray", "techniques": [ "SPIN", "WRAP" ], "qualities": [ [ "COOK", 1 ] ], - "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE" ] + "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE" ], + "use_action": { "type": "deploy_furn", "furn_type": "f_rope_up" } }, { "type": "TOOL", @@ -387,6 +391,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "2 L", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "heavy_battery_cell", "heavy_plus_battery_cell", "heavy_atomic_battery_cell", "heavy_disposable_cell" ] @@ -612,6 +617,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -781,7 +787,7 @@ "name": { "str": "Whistle of Tindalos", "str_pl": "Whistles of Tindalos" }, "description": "Who is this Tindalos guy?", "weight": "22 g", - "volume": 0, + "volume": "1 ml", "price": 10000, "price_postapoc": 1000, "material": [ "superalloy" ], @@ -803,6 +809,7 @@ "bashing": 6, "cutting": 4, "material": [ "plastic", "aluminum" ], + "ascii_picture": "umbrella", "symbol": "/", "color": "magenta", "techniques": [ "WBLOCK_1" ], @@ -832,7 +839,7 @@ "name": { "str": "sandbox kit" }, "description": "A plastic bucket holding a small spade and rake, perfect to build sand castles!", "weight": "250 g", - "volume": "1 L", + "volume": "1050 ml", "price": 300, "price_postapoc": 3, "material": [ "plastic" ], diff --git a/data/json/items/tool/musical_instruments.json b/data/json/items/tool/musical_instruments.json index 6dab2a0ea80fb..341ebe3e6ec42 100644 --- a/data/json/items/tool/musical_instruments.json +++ b/data/json/items/tool/musical_instruments.json @@ -7,6 +7,7 @@ "description": "A standard factory-made banjo. Looks to be in working condition.", "weight": "2000 g", "volume": "3 L", + "longest_side": "95 cm", "price": 7500, "price_postapoc": 500, "to_hit": 2, @@ -37,6 +38,7 @@ "description": "A polished bone flute with five finger holes.", "weight": "250 g", "volume": "500 ml", + "longest_side": "35 cm", "price": 5000, "price_postapoc": 100, "bashing": 2, @@ -67,6 +69,7 @@ "description": "An ornate clarinet made from wood.", "weight": "550 g", "volume": "1500 ml", + "longest_side": "60 cm", "price": 5500, "price_postapoc": 250, "to_hit": 1, @@ -97,6 +100,7 @@ "description": "A simple silver-plated flute.", "weight": "250 g", "volume": "500 ml", + "longest_side": "66 cm", "price": 5000, "price_postapoc": 150, "bashing": 2, @@ -126,6 +130,7 @@ "description": "A brass trumpet with only a few dents here and there.", "weight": "1500 g", "volume": "2500 ml", + "longest_side": "50 cm", "price": 7500, "price_postapoc": 300, "to_hit": 1, @@ -154,8 +159,9 @@ "category": "tools", "name": { "str": "ukulele" }, "description": "A small factory made ukulele. Looks to be in working condition.", - "weight": "2000 g", + "weight": "350 g", "volume": "2500 ml", + "longest_side": "55 cm", "price": 7500, "price_postapoc": 250, "to_hit": 2, @@ -186,6 +192,7 @@ "description": "A cheap, factory-made violin with a built-in holder for a bow. Still produces a nice sound.", "weight": "1300 g", "volume": "2500 ml", + "longest_side": "60 cm", "price": 7500, "price_postapoc": 600, "to_hit": 2, @@ -216,6 +223,7 @@ "description": "A shiny golden fiddle, with a strange aura around it. You feel like it once belonged to the best there's ever been.", "weight": "13000 g", "volume": "2500 ml", + "longest_side": "60 cm", "price": 1000000, "price_postapoc": 1000, "to_hit": 2, diff --git a/data/json/items/tool/pets.json b/data/json/items/tool/pets.json index 9664a7f71b0f8..af0689312c8f8 100644 --- a/data/json/items/tool/pets.json +++ b/data/json/items/tool/pets.json @@ -66,7 +66,16 @@ "ammo": [ "battery" ], "initial_charges": 100, "max_charges": 100, - "charges_per_use": 25 + "charges_per_use": 25, + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "light_minus_battery_cell", "light_minus_disposable_cell", "light_battery_cell", "light_disposable_cell" ] + } + ] }, { "id": "horse_tack", diff --git a/data/json/items/tool/radio_tools.json b/data/json/items/tool/radio_tools.json index c359eb4f8b24c..d5e8de67d7b43 100644 --- a/data/json/items/tool/radio_tools.json +++ b/data/json/items/tool/radio_tools.json @@ -30,6 +30,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -60,6 +61,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -113,6 +115,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -158,6 +161,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -193,6 +197,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index 1d3d2736c6366..05362ab506e1a 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -57,6 +57,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -99,6 +100,7 @@ "holster": true, "max_contains_volume": "25 L", "max_contains_weight": "200 kg", + "//": "this tool is small and has no actual battery compartment, but can connect to large batteries.", "item_restriction": [ "battery_car", "battery_motorbike", "small_storage_battery", "medium_storage_battery", "storage_battery" ] } ] @@ -124,6 +126,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ "large_storage_battery", "storage_battery" ] @@ -159,6 +162,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ "large_storage_battery", "storage_battery" ] @@ -197,6 +201,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ "large_storage_battery", "storage_battery" ] @@ -224,6 +229,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ "large_storage_battery", "storage_battery" ] @@ -262,6 +268,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -313,6 +320,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -363,6 +371,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -414,6 +423,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "5 L", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -511,6 +521,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "500 ml", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -562,6 +573,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "500 ml", "max_contains_volume": "50 L", "max_contains_weight": "400 kg", "item_restriction": [ @@ -790,6 +802,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -825,6 +838,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -867,6 +881,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -909,6 +924,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -943,6 +959,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -977,6 +994,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1190,7 +1208,7 @@ "to_hit": -5, "bashing": 2, "material": [ "aluminum", "steel", "plastic" ], - "looks_like": "t_centrifuge", + "looks_like": "f_centrifuge", "symbol": "n", "color": "white", "ammo": [ "battery" ], @@ -1198,6 +1216,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool/smoking.json b/data/json/items/tool/smoking.json index 30a563987eb74..c2baca0d5177b 100644 --- a/data/json/items/tool/smoking.json +++ b/data/json/items/tool/smoking.json @@ -20,6 +20,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool/tailoring.json b/data/json/items/tool/tailoring.json index e1aa31fdff119..1685eda3ccc88 100644 --- a/data/json/items/tool/tailoring.json +++ b/data/json/items/tool/tailoring.json @@ -77,6 +77,7 @@ "color": "white", "ammo": [ "thread" ], "sub": "sewing_kit", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 200 } } ], "max_charges": 200, "charges_per_use": 1, "qualities": [ [ "SEW", 2 ] ], @@ -105,6 +106,7 @@ "color": "light_gray", "ammo": [ "thread" ], "sub": "sewing_kit", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 200 } } ], "max_charges": 200, "charges_per_use": 1, "qualities": [ [ "SEW_CURVED", 1 ] ], @@ -133,6 +135,7 @@ "color": "brown", "ammo": [ "thread" ], "sub": "sewing_kit", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 200 } } ], "max_charges": 200, "charges_per_use": 1, "qualities": [ [ "SEW", 1 ] ], diff --git a/data/json/items/tool/toileteries.json b/data/json/items/tool/toileteries.json index 3c81ffde2bf13..b46a5b4de3307 100644 --- a/data/json/items/tool/toileteries.json +++ b/data/json/items/tool/toileteries.json @@ -13,7 +13,7 @@ "to_hit": -2, "bashing": 6, "material": [ "steel" ], - "use_action": { "type": "weigh_self", "max_weight": 150000 }, + "use_action": { "type": "weigh_self", "max_weight": "150 kg" }, "flags": [ "ALLOWS_REMOTE_USE" ] }, { @@ -52,6 +52,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -89,7 +90,7 @@ "material": [ "cotton" ], "symbol": ",", "color": "white", - "use_action": [ { "type": "heal", "move_cost": 200, "used_up_item": "rag_bloody", "bleed": 0.5, "limb_power": 0 }, "WASH_HARD_ITEMS" ], + "use_action": [ { "type": "heal", "move_cost": 200, "used_up_item": "rag_bloody", "bleed": 5, "limb_power": 0 }, "WASH_HARD_ITEMS" ], "flags": [ "NO_SALVAGE" ] }, { @@ -119,6 +120,7 @@ "symbol": ";", "color": "white", "ammo": [ "soap" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "soap": 10 } } ], "initial_charges": 5, "max_charges": 10, "charges_per_use": 1, @@ -170,6 +172,7 @@ "symbol": ";", "color": "brown", "ammo": [ "soap" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "soap": 10 } } ], "max_charges": 10, "charges_per_use": 1, "use_action": [ "SHAVEKIT" ] @@ -179,8 +182,9 @@ "type": "TOOL", "name": { "str": "washboard" }, "description": "This is a wooden washboard. You can use it to wash filthy clothing if it's supplied with cleansing agent.", - "weight": "90 g", - "volume": "250 ml", + "weight": "786 g", + "volume": "1966 ml", + "longest_side": "40 cm", "price": 1000, "price_postapoc": 50, "to_hit": -1, @@ -195,8 +199,9 @@ "type": "TOOL", "name": { "str": "washing kit" }, "description": "A combination kit of a washboard and a scrubbing tool. Everything you need to clean items after the apocalypse.", - "weight": "100 g", - "volume": "275 ml", + "weight": "866 g", + "volume": "2246 ml", + "longest_side": "40 cm", "price": 0, "price_postapoc": 50, "material": [ "wood", "plastic" ], diff --git a/data/json/items/tool/traps.json b/data/json/items/tool/traps.json index a26f41f8db1d1..e44491720afa0 100644 --- a/data/json/items/tool/traps.json +++ b/data/json/items/tool/traps.json @@ -210,16 +210,16 @@ "id": "shotgun_trap", "type": "TOOL", "name": { "str": "shotgun trap" }, - "description": "This is a simple tripwire is attached to the trigger of a loaded double-barreled shotgun. When pulled, the shotgun fires. Two shells are loaded; the first time the trigger is pulled, one or both shells may be discharged.", + "description": "This is a simple tripwire is attached to the trigger of a loaded double slamfire shotgun. When pulled, the shotgun fires. Two shells are loaded; the first time the trigger is pulled, one or both shells may be discharged.", "weight": "2922 g", "volume": "1750 ml", "price": 25000, "price_postapoc": 1000, "to_hit": -2, "bashing": 12, - "material": [ "steel", "wood" ], + "material": [ "steel" ], "symbol": ";", - "color": "brown", + "color": "dark_gray", "use_action": { "type": "place_trap", "trap": "tr_shotgun_2", diff --git a/data/json/items/tool/woodworking.json b/data/json/items/tool/woodworking.json index 4edcfb6c0167e..d2af6062b9bab 100644 --- a/data/json/items/tool/woodworking.json +++ b/data/json/items/tool/woodworking.json @@ -32,6 +32,7 @@ "symbol": "/", "color": "red", "ammo": [ "gasoline" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasoline": 450 }, "watertight": true, "rigid": true } ], "charges_per_use": 5, "max_charges": 450, "techniques": [ "SWEEP" ], @@ -78,6 +79,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "200 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -162,6 +164,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "200 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 836e58c7c8a6c..28322a5f4e7b1 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -80,6 +80,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "200 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -201,6 +202,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -229,6 +231,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "magazine_well": "200 ml", "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -336,8 +339,8 @@ "volume": "500 ml", "price": 200, "price_postapoc": 100, - "to_hit": 3, - "bashing": 4, + "to_hit": -1, + "bashing": 2, "material": [ "rubber" ], "symbol": ",", "color": "green", @@ -433,6 +436,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -473,6 +477,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -546,6 +551,7 @@ "color": "light_gray", "ammo": [ "tape" ], "max_charges": 200, + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "tape": 200 } } ], "charges_per_use": 5, "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 2 ], [ "AXE", 1 ], [ "SAW_W", 2 ], [ "BUTCHER", -90 ] ], "use_action": [ @@ -710,6 +716,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -813,6 +820,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -851,6 +859,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1009,6 +1018,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", @@ -1048,6 +1058,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", + "rigid": true, "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index d874be4037e12..9cd31dec4a587 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -33,6 +33,60 @@ "encumbrance": 140, "flags": [ "OVERSIZE", "WATER_FRIENDLY", "OUTER", "SPLINT" ] }, + { + "id": "tourniquet_upper", + "type": "ARMOR", + "name": { "str": "tourniquet (arm)", "str_pl": "tourniquets (arm)" }, + "description": "First aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleedings, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", + "weight": "300 g", + "volume": "300 ml", + "price": 20000, + "price_postapoc": 50, + "material": [ "wood", "leather" ], + "symbol": "{", + "looks_like": "armguard_hard", + "color": "red", + "covers": [ "ARM_EITHER" ], + "coverage": 10, + "encumbrance": 70, + "warmth": 0, + "material_thickness": 1, + "use_action": { "target": "tourniquet_upper_XL", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET" ] + }, + { + "id": "tourniquet_upper_XL", + "type": "ARMOR", + "name": { "str": "tourniquet (arm XL)", "str_pl": "tourniquets (arm XL)" }, + "description": "First aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleedings, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", + "copy-from": "tourniquet_upper", + "looks_like": "tourniquet_upper", + "covers": [ "ARM_EITHER" ], + "use_action": { "target": "tourniquet_lower", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE" ] + }, + { + "id": "tourniquet_lower", + "type": "ARMOR", + "name": { "str": "tourniquet (leg)", "str_pl": "tourniquets (leg)" }, + "description": "First aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleedings, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", + "copy-from": "tourniquet_upper", + "looks_like": "tourniquet_upper", + "covers": [ "LEG_EITHER" ], + "use_action": { "target": "tourniquet_lower_XL", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET" ] + }, + { + "id": "tourniquet_lower_XL", + "type": "ARMOR", + "name": { "str": "tourniquet (leg)", "str_pl": "tourniquets (leg)" }, + "description": "First aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleedings, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", + "copy-from": "tourniquet_upper", + "looks_like": "tourniquet_upper", + "covers": [ "LEG_EITHER" ], + "use_action": { "target": "tourniquet_upper", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE" ] + }, { "id": "blindfold", "type": "ARMOR", @@ -171,6 +225,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -322,6 +377,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "light_minus_battery_cell", "light_minus_atomic_battery_cell", "light_minus_disposable_cell" ] @@ -363,8 +419,17 @@ "covers": [ "TORSO", "HEAD", "ARMS", "LEGS" ], "coverage": 65, "encumbrance": 10, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "plutonium": 1000 } } ], - "ammo": "plutonium", + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "rigid": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "light_atomic_battery_cell" ] + } + ], + "ammo": "battery", "initial_charges": 500, "charges_per_use": 25, "warmth": 10, @@ -427,6 +492,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -486,6 +552,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -545,6 +612,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -604,6 +672,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -685,6 +754,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -744,6 +814,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -868,7 +939,7 @@ "symbol": "[", "color": "dark_gray", "name": { "str": "RM13 combat armor" }, - "description": "Internally powered by a maximum of ten plutonium fuel cells, this full-body suit of sleek black military armor represents the pinnacle of Rivtech's non-rigid powered armor technology. Use it to turn it on.", + "description": "Internally powered by plutonium fuel batteries, exclusively, this full-body suit of sleek black military armor represents the pinnacle of Rivtech's non-rigid powered armor technology. Use it to turn it on.", "flags": [ "VARSIZE", "STURDY", "WATERPROOF", "RAINPROOF", "WATCH", "ALARMCLOCK", "SWIM_GOGGLES", "SUN_GLASSES", "RAD_RESIST" ], "price": 50000000, "price_postapoc": 10000, @@ -876,8 +947,17 @@ "weight": "6820 g", "volume": "9 L", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "plutonium": 5000 } } ], - "ammo": "plutonium", + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "rigid": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "heavy_atomic_battery_cell" ] + } + ], + "ammo": "battery", "charges_per_use": 5, "use_action": [ "RM13ARMOR_OFF" ], "covers": [ "HEAD", "MOUTH", "EYES", "TORSO", "ARMS", "HANDS", "LEGS", "FEET" ], @@ -893,7 +973,7 @@ "repairs_like": "rm13_armor", "type": "TOOL_ARMOR", "name": { "str": "RM13 combat armor (on)", "str_pl": "RM13 combat armors (on)" }, - "description": "Internally powered by a maximum of ten plutonium fuel cells, this full-body suit of sleek black military armor represents the pinnacle of Rivtech's non-rigid powered armor technology. It is turned on, and continually draining power. Use it to turn it off.", + "description": "Internally powered by plutonium fuel batteries, exclusively, this full-body suit of sleek black military armor represents the pinnacle of Rivtech's non-rigid powered armor technology. It is turned on, and continually draining power. Use it to turn it off.", "flags": [ "VARSIZE", "STURDY", @@ -931,8 +1011,17 @@ "material": [ "ceramic", "kevlar" ], "weight": "1250 g", "volume": "4500 ml", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "plutonium": 1000 } } ], - "ammo": "plutonium", + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "rigid": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "medium_atomic_battery_cell" ] + } + ], + "ammo": "battery", "initial_charges": 1000, "use_action": { "type": "transform", @@ -982,8 +1071,17 @@ "material": [ "carbide" ], "weight": "1250 g", "volume": "4500 ml", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "plutonium": 2500 } } ], - "ammo": "plutonium", + "pocket_data": [ + { + "pocket_type": "MAGAZINE_WELL", + "holster": true, + "rigid": true, + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg", + "item_restriction": [ "heavy_atomic_battery_cell" ] + } + ], + "ammo": "battery", "initial_charges": 1000, "use_action": { "type": "transform", @@ -1062,7 +1160,7 @@ "weight": "720 g", "volume": "500 ml", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "rebreather_filter": 60 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "rebreather_filter": 60 } } ], "ammo": "rebreather_filter", "initial_charges": 60, "charges_per_use": 1, @@ -1110,7 +1208,7 @@ "weight": "960 g", "volume": "1250 ml", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "rebreather_filter": 60 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "rebreather_filter": 60 } } ], "ammo": "rebreather_filter", "initial_charges": 60, "charges_per_use": 1, @@ -1165,7 +1263,7 @@ "material_thickness": 2, "environmental_protection": 1, "environmental_protection_with_filter": 7, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_s": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_s": 100 } } ], "ammo": "gasfilter_s", "initial_charges": 100, "use_action": [ "GASMASK" ] @@ -1192,7 +1290,7 @@ "material_thickness": 2, "environmental_protection": 1, "environmental_protection_with_filter": 16, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ] @@ -1218,7 +1316,7 @@ "material_thickness": 2, "environmental_protection": 1, "environmental_protection_with_filter": 16, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1246,7 +1344,7 @@ "material_thickness": 3, "environmental_protection": 1, "environmental_protection_with_filter": 15, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1274,7 +1372,7 @@ "material_thickness": 3, "environmental_protection": 1, "environmental_protection_with_filter": 15, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1296,7 +1394,7 @@ "weight": "1260 g", "volume": "1500 ml", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1320,7 +1418,7 @@ "price": 24000, "price_postapoc": 2000, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1348,10 +1446,9 @@ "price": 24000, "price_postapoc": 1500, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, - "charges_per_use": 1, "use_action": [ "GASMASK" ], "material": [ "kevlar_layered", "cotton" ], "symbol": "[", @@ -1377,7 +1474,7 @@ "price": 24000, "price_postapoc": 1750, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1405,7 +1502,7 @@ "price": 24000, "price_postapoc": 1500, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1433,7 +1530,7 @@ "price": 24000, "price_postapoc": 1750, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1461,7 +1558,7 @@ "price": 24000, "price_postapoc": 1500, "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasfilter_m": 100 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ], "ammo": "gasfilter_m", "initial_charges": 100, "use_action": [ "GASMASK" ], @@ -1513,6 +1610,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -1577,6 +1675,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -1620,7 +1719,7 @@ "flags": [ "OVERSIZE" ], "weight": "364 g", "volume": "750 ml", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "ampoule": 2 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "ampoule": 2 } } ], "charges_per_use": 1, "use_action": [ "JET_INJECTOR" ], "material_thickness": 3 @@ -1639,7 +1738,7 @@ "flags": [ "OVERSIZE" ], "weight": "212 g", "volume": "750 ml", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "stimpack_ammo": 5 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "stimpack_ammo": 5 } } ], "ammo": "stimpack_ammo", "initial_charges": 5, "charges_per_use": 1, @@ -1661,7 +1760,7 @@ "weight": "982 g", "volume": "1500 ml", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "rebreather_filter": 120 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "rebreather_filter": 120 } } ], "ammo": "rebreather_filter", "charges_per_use": 1, "use_action": { @@ -1709,7 +1808,7 @@ "weight": "1302 g", "volume": "2 L", "to_hit": -3, - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "rebreather_filter": 120 } } ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "rebreather_filter": 120 } } ], "ammo": "rebreather_filter", "charges_per_use": 1, "use_action": { @@ -1843,6 +1942,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "light_minus_battery_cell", "light_minus_atomic_battery_cell" ] @@ -1868,10 +1968,11 @@ "material_thickness": 2, "pocket_data": [ { - "pocket_type": "CONTAINER", + "holster": true, "min_item_volume": "250 ml", "max_contains_volume": "1 L", - "max_contains_weight": "1 kg", + "max_contains_weight": "2 kg", + "max_item_length": "70 cm", "moves": 3, "flag_restriction": [ "SHEATH_KNIFE", "SHEATH_SWORD" ] } @@ -2425,6 +2526,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -2781,6 +2883,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ @@ -2859,7 +2962,7 @@ "id": "solarpack", "type": "TOOL_ARMOR", "name": { "str": "solar backpack (folded)", "str_pl": "solar backpacks (folded)" }, - "description": "Personal portable charging system consisting of an array of solar panels neatly folded in a form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system.", + "description": "Personal portable charging system consisting of an array of solar panels neatly folded in a form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system CBM.", "weight": "7500 g", "volume": "5 L", "price": 500000, @@ -2881,7 +2984,7 @@ "type": "TOOL_ARMOR", "repairs_like": "solarpack", "name": { "str": "solar backpack (unfolded)", "str_pl": "solar backpacks (unfolded)" }, - "description": "Unfolded array of portable solar panels ready to push some power into an active cable charger system.", + "description": "Unfolded array of portable solar panels ready to push some power into an active cable charger system CBM.", "weight": "7500 g", "volume": "15 L", "price": 500000, @@ -2969,7 +3072,9 @@ "color": "light_gray", "initial_charges": 60, "ammo": "nitrox", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "nitrox": 60 } } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "rigid": true, "watertight": true, "ammo_restriction": { "nitrox": 60 } } + ], "covers": [ "TORSO" ], "flags": [ "WATER_FRIENDLY", "BELTED", "ONLY_ONE", "STURDY", "NO_UNLOAD" ], "environmental_protection": 1, @@ -2997,7 +3102,9 @@ "symbol": ";", "color": "light_gray", "ammo": "nitrox", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "nitrox": 60 } } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "rigid": true, "watertight": true, "ammo_restriction": { "nitrox": 60 } } + ], "charges_per_use": 1, "turns_per_charge": 60, "covers": [ "TORSO", "MOUTH" ], @@ -3026,7 +3133,9 @@ "symbol": ";", "color": "light_gray", "ammo": "nitrox", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "nitrox": 20 } } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "rigid": true, "watertight": true, "ammo_restriction": { "nitrox": 20 } } + ], "max_charges": 20, "covers": [ "TORSO" ], "flags": [ "WATER_FRIENDLY", "BELTED", "ONLY_ONE", "STURDY", "NO_UNLOAD" ], @@ -3055,7 +3164,9 @@ "symbol": ";", "color": "light_gray", "ammo": "nitrox", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "nitrox": 20 } } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "airtight": true, "rigid": true, "watertight": true, "ammo_restriction": { "nitrox": 20 } } + ], "charges_per_use": 1, "turns_per_charge": 60, "covers": [ "TORSO", "MOUTH" ], @@ -3101,6 +3212,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] @@ -3155,6 +3267,7 @@ { "pocket_type": "MAGAZINE_WELL", "holster": true, + "rigid": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] diff --git a/data/json/items/toolmod.json b/data/json/items/toolmod.json index 75cb729e61490..2c843e8380ba5 100644 --- a/data/json/items/toolmod.json +++ b/data/json/items/toolmod.json @@ -28,6 +28,14 @@ "description": "A battery compartment mod that allows using vehicle batteries and small storage batteries in regular tools.", "color": "light_green", "acceptable_ammo": [ "battery" ], + "pocket_mods": [ + { + "pocket_type": "MAGAZINE_WELL", + "item_restriction": [ "small_storage_battery", "battery_car", "battery_motorbike" ], + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg" + } + ], "magazine_adaptor": [ [ "battery", [ "small_storage_battery", "battery_car", "battery_motorbike" ] ] ] }, { @@ -39,6 +47,22 @@ "description": "A battery compartment mod that allows the use of light batteries in tools that otherwise could not.", "color": "light_green", "acceptable_ammo": [ "battery" ], + "pocket_mods": [ + { + "pocket_type": "MAGAZINE_WELL", + "item_restriction": [ + "light_minus_battery_cell", + "light_minus_atomic_battery_cell", + "light_minus_disposable_cell", + "light_battery_cell", + "light_plus_battery_cell", + "light_atomic_battery_cell", + "light_disposable_cell" + ], + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg" + } + ], "magazine_adaptor": [ [ "battery", @@ -63,6 +87,14 @@ "description": "A battery compartment mod that allows the use of medium batteries in tools that otherwise could not.", "color": "light_green", "acceptable_ammo": [ "battery" ], + "pocket_mods": [ + { + "pocket_type": "MAGAZINE_WELL", + "item_restriction": [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ], + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg" + } + ], "magazine_adaptor": [ [ "battery", @@ -79,6 +111,14 @@ "description": "A battery compartment mod that allows the use of heavy batteries in tools that otherwise could not.", "color": "light_green", "acceptable_ammo": [ "battery" ], + "pocket_mods": [ + { + "pocket_type": "MAGAZINE_WELL", + "item_restriction": [ "heavy_battery_cell", "heavy_plus_battery_cell", "heavy_atomic_battery_cell", "heavy_disposable_cell" ], + "max_contains_volume": "20 L", + "max_contains_weight": "20 kg" + } + ], "magazine_adaptor": [ [ "battery", [ "heavy_battery_cell", "heavy_plus_battery_cell", "heavy_atomic_battery_cell", "heavy_disposable_cell" ] ] ] diff --git a/data/json/items/vehicle/wheel.json b/data/json/items/vehicle/wheel.json index 2abfedeef2956..58d1f3859e96e 100644 --- a/data/json/items/vehicle/wheel.json +++ b/data/json/items/vehicle/wheel.json @@ -1,4 +1,18 @@ [ + { + "id": "wheel_mount_wood", + "type": "GENERIC", + "category": "veh_parts", + "name": { "str": "wooden wheel mount" }, + "description": "A piece of wood with holes suitable for a bike wheel.", + "weight": "100 g", + "volume": "250 ml", + "price": 5, + "price_postapoc": 10, + "material": [ "wood" ], + "symbol": ";", + "color": "brown" + }, { "id": "wheel_mount_light", "type": "GENERIC", @@ -391,6 +405,6 @@ "type": "WHEEL", "name": { "str": "banded wooden cart wheel" }, "description": "A wooden cart wheel with metal bands for durability, hand made.", - "relative": { "weight": 500 } + "relative": { "weight": "500 g" } } ] diff --git a/data/json/mapgen/Glassblower.json b/data/json/mapgen/Glassblower.json index 420d56b1095c0..29ac505654610 100644 --- a/data/json/mapgen/Glassblower.json +++ b/data/json/mapgen/Glassblower.json @@ -35,15 +35,15 @@ "terrain": { ".": "t_floor", "s": "t_sidewalk", - "u": "t_dirt", + "u": "t_region_groundcover_barren", "_": "t_pavement", "U": "t_pavement", - " ": [ "t_grass", "t_dirt" ], - "H": "t_grass", - "1": "t_shrub_hydrangea", - "2": [ "t_tree_walnut", "t_tree_apple" ], - "4": "t_underbrush", - "5": "t_grass", + " ": "t_region_groundcover_urban", + "H": "t_region_groundcover_urban", + "1": "t_region_shrub_decorative", + "2": "t_region_tree_fruit", + "4": "t_region_shrub", + "5": "t_region_groundcover_urban", "-": "t_wall_glass", "|": "t_rock_wall", "%": "t_wall_wood", @@ -55,7 +55,6 @@ "x": "t_window_no_curtains", "v": "t_window_domestic", "c": "t_floor", - "C": "t_console_broken", "L": "t_thconc_floor", "'": "t_thconc_floor", "Q": "t_thconc_floor", @@ -76,6 +75,7 @@ "<": "t_stairs_up" }, "furniture": { + "C": "f_console_broken", "H": "f_bench", "S": "f_sink", "T": "f_stool", @@ -94,7 +94,7 @@ "q": "f_crate_c", "E": "f_displaycase", "U": "f_dumpster", - "5": [ "f_flower_tulip", "f_bluebell", "f_dandelion" ], + "5": "f_region_weed", "z": "f_cupboard", "d": "f_dresser", "@": "f_bed", diff --git a/data/json/mapgen/Metalworker.json b/data/json/mapgen/Metalworker.json index 3c21c9f55c07c..1f8f6889cc198 100644 --- a/data/json/mapgen/Metalworker.json +++ b/data/json/mapgen/Metalworker.json @@ -46,13 +46,13 @@ "U": "t_pavement", "2": "t_pavement", ".": "t_strconc_floor", - "3": "t_machinery_heavy", - "1": "t_machinery_old", "#": "t_strconc_floor", "<": "t_ladder_up", "4": "t_gutter_downspout" }, "furniture": { + "3": "f_machinery_heavy", + "1": "f_machinery_old", "H": "f_bench", "S": "f_sink", "#": "f_stool", diff --git a/data/json/mapgen/Pottery_Sewing_Shops.json b/data/json/mapgen/Pottery_Sewing_Shops.json index 3691f3f517911..b4251b73fb3ba 100644 --- a/data/json/mapgen/Pottery_Sewing_Shops.json +++ b/data/json/mapgen/Pottery_Sewing_Shops.json @@ -39,14 +39,14 @@ "_": "t_pavement", "U": "t_pavement", ",": "t_pavement_y", - ";": "t_grass", - "H": "t_grass", - "b": "t_grass", - "1": "t_shrub_hydrangea", - "2": "t_tree_walnut", - "3": "t_tree_apple", - "4": "t_underbrush", - "5": "t_grass", + ";": "t_region_groundcover_urban", + "H": "t_region_groundcover_urban", + "b": "t_region_groundcover_urban", + "1": "t_region_shrub_decorative", + "2": "t_region_tree_nut", + "3": "t_region_tree_fruit", + "4": "t_region_shrub", + "5": "t_region_groundcover_urban", "-": "t_wall_glass", "|": "t_brick_wall", "+": "t_door_glass_c", @@ -54,7 +54,6 @@ "S": "t_linoleum_gray", "w": "t_linoleum_gray", "t": "t_linoleum_gray", - "C": "t_console_broken", "*": "t_thconc_floor", "Q": "t_thconc_floor", "Y": "t_thconc_floor", @@ -66,6 +65,7 @@ "<": "t_stairs_up" }, "furniture": { + "C": "f_console_broken", "H": "f_bench", "S": "f_sink", "T": "f_stool", diff --git a/data/json/mapgen/airport/s_airport_private.json b/data/json/mapgen/airport/s_airport_private.json index cbd8a1a5a74ca..b557bce2ff983 100644 --- a/data/json/mapgen/airport/s_airport_private.json +++ b/data/json/mapgen/airport/s_airport_private.json @@ -52,7 +52,6 @@ "+": "t_door_c", ")": "t_door_glass_c", "d": "t_conveyor", - "j": "t_console_broken", "c": "t_chainfence", "<": "t_stairs_up", "^": "t_gutter_downspout", @@ -60,7 +59,7 @@ "|": "t_wall_metal", "Q": "t_metal_floor", "q": "t_pavement", - "e": "t_machinery_light", + "e": "t_thconc_floor", "1": "t_gas_pump", "2": "t_water_pump", "3": "t_sewage_pipe", @@ -69,15 +68,18 @@ "f": "t_thconc_floor", "=": "t_door_metal_locked", "&": "t_gates_control_metal", - "4": "t_generator_broken" + "4": "t_region_groundcover_urban" }, "furniture": { + "4": "f_generator_broken", "q": "f_dumpster", + "e": "f_machinery_light", "f": "f_locker", "g": "f_crate_o", "h": "f_bench", "I": "f_desk", "i": "f_counter", + "j": "f_console_broken", "J": "f_counter", "k": "f_table", "l": "f_trashcan", @@ -110,6 +112,8 @@ { "group": "vending_drink", "chance": 80, "repeat": 1, "x": 40, "y": 6 }, { "group": "road", "chance": 50, "repeat": 10, "x": [ 75, 80 ], "y": [ 7, 20 ] }, { "group": "road", "chance": 50, "repeat": 10, "x": [ 87, 92 ], "y": [ 7, 20 ] }, + { "group": "avgas_barrel", "chance": 50, "repeat": 5, "x": [ 75, 80 ], "y": [ 7, 20 ] }, + { "group": "avgas_barrel", "chance": 50, "repeat": 5, "x": [ 87, 92 ], "y": [ 7, 20 ] }, { "group": "clothing_work_mask", "chance": 50, "repeat": 2, "x": 81, "y": 7 }, { "group": "clothing_work_mask", "chance": 50, "repeat": 2, "x": 87, "y": 21 }, { "group": "tools_mechanic", "chance": 50, "repeat": 4, "x": 88, "y": 21 }, @@ -276,11 +280,10 @@ " ": "t_open_air", "d": "t_stairs_down", ".": "t_linoleum_white", - "f": "t_console_broken", "g": "t_door_glass_c", "h": "t_metal_floor" }, - "furniture": { "e": "f_table", "E": "f_chair" }, + "furniture": { "f": "f_console_broken", "e": "f_table", "E": "f_chair" }, "place_loot": [ { "group": "office_mess", "chance": 80, "repeat": [ 5 ], "x": [ 10, 13 ], "y": [ 2, 5 ] } ] } } diff --git a/data/json/mapgen/animalpound.json b/data/json/mapgen/animalpound.json index 309f487b88a63..29bea45bf1b3d 100644 --- a/data/json/mapgen/animalpound.json +++ b/data/json/mapgen/animalpound.json @@ -63,16 +63,15 @@ "terrain": { " ": "t_pavement", ",": "t_pavement_y", - "%": "t_console_broken", - "*": "t_shrub", + "*": "t_region_shrub", "+": "t_door_c", "M": "t_door_metal_pickable", "i": "t_door_locked_interior", "-": "t_wall_w", ".": "t_floor", "<": "t_stairs_up", - "=": "t_chainfence_h", - "|": "t_chainfence_v", + "=": "t_chainfence", + "|": "t_chainfence", "a": "t_chaingate_l", "l": "t_linoleum_white", "#": "t_linoleum_white", @@ -82,11 +81,12 @@ "k": "t_linoleum_white", "F": "t_linoleum_white", "Q": "t_linoleum_white", - "'": "t_grass", + "'": "t_region_groundcover_urban", "4": "t_gutter_downspout", "~": "t_sidewalk" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "C": "f_counter", "D": "f_trashcan", diff --git a/data/json/mapgen/animalshelter.json b/data/json/mapgen/animalshelter.json index 290c6db1d310b..0e8a317ae1f9c 100644 --- a/data/json/mapgen/animalshelter.json +++ b/data/json/mapgen/animalshelter.json @@ -9,7 +9,8 @@ "type": "item_group", "subtype": "distribution", "entries": [ - { "item": "bandages", "prob": 50 }, + { "item": "bandages", "prob": 25 }, + { "item": "adhesive_bandages", "prob": 25 }, { "item": "saline", "prob": 20 }, { "item": "vitamins", "prob": 15 }, { "item": "calcium_tablet", "prob": 15 }, @@ -38,8 +39,10 @@ "entries": [ { "item": "dog_whistle", "prob": 10 }, { "item": "pet_carrier", "prob": 30 }, - { "item": "dogfood", "prob": 50, "container-item": "can_medium" }, - { "item": "catfood", "prob": 50, "container-item": "can_food" }, + { "item": "dogfood", "prob": 30, "container-item": "can_medium" }, + { "item": "catfood", "prob": 30, "container-item": "can_food" }, + { "item": "dogfood_dry", "prob": 10, "charges": 18, "container-item": "bag_plastic" }, + { "item": "catfood_dry", "prob": 10, "charges": 18, "container-item": "bag_plastic" }, { "item": "towel", "prob": 20 }, { "item": "soap", "prob": 10 }, { "item": "gloves_medical", "prob": 20 }, @@ -181,8 +184,7 @@ " ": "t_pavement", ",": "t_pavement_y", "g": "t_wall_glass", - "%": "t_console_broken", - "*": "t_shrub", + "*": "t_region_shrub", "+": "t_door_c", "-": "t_wall_b", ".": "t_floor", @@ -191,8 +193,8 @@ "3": "t_privacy_fencegate_c", "O": "t_window", "^": "t_chaingate_c", - "'": "t_dirt", - "G": "t_grass", + "'": "t_region_groundcover_barren", + "G": "t_region_groundcover", "M": "t_door_metal_pickable", "i": "t_door_locked_interior", "l": "t_linoleum_white", @@ -201,14 +203,15 @@ "s": "t_linoleum_white", "t": "t_linoleum_white", "F": "t_linoleum_white", - "f": "t_dirt", - "R": "t_dirt", - "Q": "t_dirt", + "f": "t_region_groundcover_barren", + "R": "t_region_groundcover_barren", + "Q": "t_region_groundcover_barren", "4": "t_gutter_downspout", "<": "t_ladder_up", "~": "t_sidewalk" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "?": "f_sofa", "Q": "f_trashcan", diff --git a/data/json/mapgen/bank.json b/data/json/mapgen/bank.json index eeeda76784284..4afd3879ba5a6 100644 --- a/data/json/mapgen/bank.json +++ b/data/json/mapgen/bank.json @@ -33,15 +33,14 @@ " " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt", "t_shrub" ], + " ": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub_decorative" ], "#": "t_wall_w", "$": "t_metal_floor", - "%": [ "t_door_c", "t_door_c", "t_door_locked_interior" ], - "*": [ "t_door_c", "t_door_c", "t_door_c", "t_door_locked_interior" ], + "%": [ [ "t_door_c", 2 ], "t_door_locked_interior" ], + "*": [ [ "t_door_c", 3 ], "t_door_locked_interior" ], "+": "t_door_c", "-": "t_window", ".": "t_floor", - "6": "t_console", "A": "t_atm", "G": "t_door_glass_c", "M": "t_door_metal_locked", @@ -53,6 +52,7 @@ "w": "t_window_alarm" }, "furniture": { + "6": "f_console", "$": "f_safe_l", "C": "f_chair", "T": "f_table", @@ -168,19 +168,17 @@ "########4 " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "_": "t_metal_floor", - "|": [ "t_door_c", "t_wall_w", "t_wall_w", "t_wall_w", "t_wall_w", "t_wall_w", "t_wall_w", "t_wall_w", "t_wall_w" ], + "|": [ "t_door_c", [ "t_wall_w", 7 ] ], "I": "t_wall_w", "#": "t_brick_wall", "$": "t_metal_floor", - "%": [ "t_door_c", "t_door_c", "t_door_locked_interior" ], - "*": [ "t_door_c", "t_door_c", "t_door_c", "t_door_locked_interior" ], + "%": [ [ "t_door_c", 2 ], "t_door_locked_interior" ], + "*": [ [ "t_door_c", 3 ], "t_door_locked_interior" ], "+": "t_door_c", "-": "t_window", - "x": "t_console_broken", ".": "t_floor", - "6": "t_console", "A": "t_atm", "G": "t_door_glass_c", "M": "t_door_metal_locked", @@ -194,6 +192,8 @@ "w": "t_window_alarm" }, "furniture": { + "x": "f_console_broken", + "6": "f_console", "a": "f_armchair", "D": "f_sofa", "o": "f_bookcase", diff --git a/data/json/mapgen/bar.json b/data/json/mapgen/bar.json index 9dd8bbc7ff3c9..5dac3ab2e5d15 100644 --- a/data/json/mapgen/bar.json +++ b/data/json/mapgen/bar.json @@ -45,7 +45,6 @@ ",": "t_pavement_y", "-": "t_wall_g", ".": "t_floor", - "@": "t_console_broken", "D": "t_door_locked", "c": "t_linoleum_gray", "d": "t_pavement", @@ -60,6 +59,7 @@ "|": "t_wall_g" }, "furniture": { + "@": "f_console_broken", "#": "f_table", "&": "f_fridge", "B": "f_bench", @@ -195,7 +195,7 @@ "terrain": { "_": "t_pavement", "~": "t_sidewalk", - " ": [ "t_grass", "t_grass", "t_dirt", "t_shrub", "t_grass", "t_dirt" ], + " ": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub" ], "&": "t_linoleum_gray", "'": "t_window_domestic", "+": "t_door_c", @@ -203,7 +203,6 @@ "-": "t_wall_b", ".": "t_floor", "u": "t_floor", - "@": "t_console_broken", "D": "t_door_locked", "c": "t_linoleum_gray", "d": "t_pavement", @@ -222,6 +221,7 @@ "!": "t_brick_wall" }, "furniture": { + "@": "f_console_broken", "#": "f_table", "$": "f_glass_fridge", "&": "f_fridge", diff --git a/data/json/mapgen/basecamps/primitive_field.json b/data/json/mapgen/basecamps/primitive_field.json index 11b00664b0a4d..546283b93947d 100644 --- a/data/json/mapgen/basecamps/primitive_field.json +++ b/data/json/mapgen/basecamps/primitive_field.json @@ -1405,7 +1405,7 @@ "method": "json", "object": { "set": [ - { "point": "terrain", "id": "t_machinery_old", "x": 5, "y": 12 }, + { "point": "furniture", "id": "f_machinery_old", "x": 5, "y": 12 }, { "point": "furniture", "id": "f_wood_keg", "x": 14, "y": 12 }, { "point": "terrain", "id": "t_dirt", "x": 18, "y": 16 }, { "point": "furniture", "id": "f_kiln_empty", "x": 19, "y": 16 }, diff --git a/data/json/mapgen/basement/basement_bionic.json b/data/json/mapgen/basement/basement_bionic.json index 729e4d713465f..c89d9178d2f22 100644 --- a/data/json/mapgen/basement/basement_bionic.json +++ b/data/json/mapgen/basement/basement_bionic.json @@ -37,8 +37,8 @@ "furniture": { "}": "f_pinball_machine", "*": "f_shower", - "!": "f_ergometer", - "@": "f_treadmill", + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], "^": "f_exercise", "%": "f_floor_canvas", "C": "f_cupboard", @@ -113,8 +113,8 @@ "furniture": { "}": "f_pinball_machine", "*": "f_shower", - "!": "f_ergometer", - "@": "f_treadmill", + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], "^": "f_exercise", "%": "f_floor_canvas", "C": "f_cupboard", diff --git a/data/json/mapgen/basement/basement_chem.json b/data/json/mapgen/basement/basement_chem.json index 2d03a8496316c..f92fe66b0c711 100644 --- a/data/json/mapgen/basement/basement_chem.json +++ b/data/json/mapgen/basement/basement_chem.json @@ -46,7 +46,6 @@ "E": "t_linoleum_gray", "i": "t_linoleum_gray", "H": "t_linoleum_gray", - "4": "t_machinery_old", "R": "t_linoleum_gray", "?": "t_linoleum_gray", "h": "t_linoleum_gray", @@ -55,6 +54,7 @@ }, "liquids": { "E": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, "furniture": { + "4": "f_machinery_old", "T": "f_workbench", "c": "f_counter", "h": "f_chair", @@ -147,7 +147,7 @@ "n": "t_linoleum_white", "H": "t_linoleum_white", "T": "t_linoleum_white", - "8": "t_console_broken" + "8": "t_linoleum_white" }, "liquids": { "E": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, "furniture": { @@ -169,7 +169,8 @@ "f": "f_filing_cabinet", "5": "f_server", "b": "f_lab_bench", - "D": "f_fume_hood" + "D": "f_fume_hood", + "8": "f_console_broken" }, "items": { "U": [ diff --git a/data/json/mapgen/basement/basement_lab_stairs.json b/data/json/mapgen/basement/basement_lab_stairs.json index 737cd0c70ad70..c96167458cd9c 100644 --- a/data/json/mapgen/basement/basement_lab_stairs.json +++ b/data/json/mapgen/basement/basement_lab_stairs.json @@ -40,10 +40,10 @@ ",": "t_rock_floor", "6": "t_card_science", "7": "t_rock_floor", - "C": "t_centrifuge", "<": "t_stairs_up", ">": "t_stairs_down" }, + "furniture": { "C": "f_centrifuge" }, "mapping": { "c": { "items": { "item": "chem_lab", "chance": 30 } }, "d": { "items": { "item": "office", "chance": 30 } } }, "monster": { "7": { "monster": "mon_turret_rifle" } }, "place_nested": [ diff --git a/data/json/mapgen/bridges.json b/data/json/mapgen/bridges.json new file mode 100644 index 0000000000000..726f5d1c3fbb2 --- /dev/null +++ b/data/json/mapgen/bridges.json @@ -0,0 +1,182 @@ +[ + { + "type": "palette", + "id": "bridge_ground_palette", + "terrain": { + "s": "t_water_moving_sh", + "~": "t_water_moving_dp", + ".": "t_pavement_bg_dp", + ":": "t_pavement_y_bg_dp", + "_": "t_sidewalk_bg_dp", + "=": "t_guardrail_bg_dp", + "u": "t_ramp_up_low", + "U": "t_ramp_up_high", + "d": "t_ramp_down_high", + "D": "t_ramp_down_low", + "W": "t_sidewalk_ramp_down_high", + ">": "t_sidewalk_ramp_down_low", + "<": "t_sidewalk_ramp_up_high", + "w": "t_sidewalk_ramp_up_low", + "#": "t_concrete_wall" + } + }, + { + "type": "palette", + "id": "bridge_road_palette", + "terrain": { + " ": "t_open_air", + ".": "t_pavement_hw_air", + ":": "t_pavement_y_hw_air", + "_": "t_sidewalk_hw_air", + "=": "t_guardrail_hw_air", + "U": "t_ramp_up_high", + "d": "t_ramp_down_high", + "D": "t_ramp_down_low", + "W": "t_sidewalk_ramp_down_high", + ">": "t_sidewalk_ramp_down_low", + "<": "t_sidewalk_ramp_up_high", + "w": "t_sidewalk_ramp_up_low", + "#": "t_concrete_wall" + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "bridge" ], + "object": { + "fill_ter": "t_water_moving_dp", + "rows": [ + "~~~~~~~~s######s~~~~~~~~", + "~~~~~~~~ss####ss~~~~~~~~", + "~~~~~~~~~ss##ss~~~~~~~~~", + "~~~~~~~~~~ssss~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~ssss~~~~~~~~~~", + "~~~~~~~~~ss##ss~~~~~~~~~", + "~~~~~~~~ss####ss~~~~~~~~", + "~~~~~~~~s######s~~~~~~~~" + ], + "palettes": [ "bridge_ground_palette" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "bridge_road" ], + "object": { + "fill_ter": "t_open_air", + "rows": [ + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= " + ], + "palettes": [ "bridge_road_palette" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "bridgehead_ground" ], + "object": { + "fill_ter": "t_water_moving_dp", + "rows": [ + "ss=_................_=ss", + "ss=_.......::......._=ss", + "ss=_.......::......._=ss", + "ss=_.......::......._=ss", + "ss=_................_=ss", + "ss=wuuuuuuuuuuuuuuuuw=ss", + "ss=DDDDDDDDDDDDDDDD>= ", + " =WddddddddddddddddW= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_................_= ", + " =_.......::......._= ", + " =_.......::......._= ", + " =_.......::......._= " + ], + "palettes": [ "bridge_road_palette" ] + } + } +] diff --git a/data/json/mapgen/bus_station.json b/data/json/mapgen/bus_station.json index d5fddf6d9b327..7306918e52662 100644 --- a/data/json/mapgen/bus_station.json +++ b/data/json/mapgen/bus_station.json @@ -35,21 +35,14 @@ "terrain": { " ": "t_floor", "+": "t_door_c", - ".": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ] ], + ".": "t_region_groundcover_urban", ",": [ - [ "t_grass_long", 35 ], - [ "t_grass", 20 ], - [ "t_shrub", 20 ], - [ "t_shrub_rose", 20 ], - [ "t_shrub_lilac", 20 ], - [ "t_tree_young", 20 ], - [ "t_grass_tall", 20 ], - [ "t_grass_long", 20 ], - [ "t_underbrush", 20 ], - [ "t_shrub_hydrangea", 20 ], - [ "t_shrub_raspberry", 20 ] + [ "t_region_groundcover", 35 ], + [ "t_region_groundcover_forest", 20 ], + [ "t_region_shrub_decorative", 20 ], + [ "t_region_shrub_fruit", 10 ] ], - ";": [ [ "t_tree", 5 ], [ "t_tree_willow", 3 ], [ "t_tree_birch", 3 ], [ "t_tree_maple", 3 ], [ "t_tree_pine", 5 ] ], + ";": "t_region_tree_shade", "w": "t_window", "_": "t_pavement", "y": "t_pavement_y", @@ -64,12 +57,13 @@ "T": "t_linoleum_white", "F": "t_linoleum_white", "l": "t_linoleum_white", - "x": "t_console_broken", + "x": "t_linoleum_white", "i": "t_ladder_up", "I": "t_column", "f": "t_chainfence" }, "furniture": { + "x": "f_console_broken", "c": "f_counter", "S": "f_sink", "B": "f_bench", diff --git a/data/json/mapgen/butcher.json b/data/json/mapgen/butcher.json index 97e152a42b57e..0744d84e5efac 100644 --- a/data/json/mapgen/butcher.json +++ b/data/json/mapgen/butcher.json @@ -32,24 +32,24 @@ " " ], "terrain": { - " ": [ "t_dirt", [ "t_grass", 3 ] ], + " ": "t_region_groundcover_urban", ".": "t_floor", "a": "t_wall_w", "b": "t_sidewalk", "d": "t_wall_glass", "e": "t_door_c", "g": "t_dirt", - "j": "t_console_broken", "m": "t_dirt", "<": "t_stairs_up", "4": "t_gutter_downspout", - "o": "t_shrub" + "o": "t_region_shrub" }, "furniture": { "f": "f_table", "g": "f_dumpster", "h": "f_counter", "i": "f_fridge", + "j": "f_console_broken", "k": "f_rack", "l": "f_trashcan", "m": "f_trashcan", @@ -236,18 +236,18 @@ " " ], "terrain": { - " ": [ "t_dirt", [ "t_grass", 3 ] ], + " ": "t_region_groundcover", ".": "t_floor", "a": "t_wall_w", "b": "t_sidewalk", "d": "t_wall_glass", "e": "t_door_c", - "g": "t_dirt", + "g": "t_region_groundcover_barren", "<": "t_stairs_up", - "4": "t_gutter_downspout", - "j": "t_console_broken" + "4": "t_gutter_downspout" }, "furniture": { + "j": "f_console_broken", "c": "f_chair", "f": "f_table", "g": "f_dumpster", @@ -436,19 +436,19 @@ " " ], "terrain": { - " ": [ "t_dirt", [ "t_grass", 3 ] ], + " ": "t_region_groundcover", ".": "t_floor", "a": "t_wall_w", "b": "t_sidewalk", "d": "t_wall_glass", "e": "t_door_c", - "g": "t_dirt", - "j": "t_console_broken", + "g": "t_region_groundcover_barren", "o": "t_door_o", "<": "t_ladder_up", "4": "t_gutter_downspout" }, "furniture": { + "j": "f_console_broken", "c": "f_chair", "f": "f_table", "g": "f_dumpster", diff --git a/data/json/mapgen/cathedral.json b/data/json/mapgen/cathedral.json index 301b925fbd0cb..cab83defac573 100644 --- a/data/json/mapgen/cathedral.json +++ b/data/json/mapgen/cathedral.json @@ -146,10 +146,11 @@ "u": "t_floor", "v": "t_floor", "w": [ "t_window_stained_red", "t_window_stained_blue", "t_window_stained_green" ], - "x": "t_console_broken", + "x": "t_floor", "|": "t_wall" }, "furniture": { + "x": "f_console_broken", "7": "f_rack", "8": "f_desk", "B": "f_brazier", diff --git a/data/json/mapgen/cave.json b/data/json/mapgen/cave.json index 8b09d6ae0adc1..66f115201986e 100644 --- a/data/json/mapgen/cave.json +++ b/data/json/mapgen/cave.json @@ -576,8 +576,15 @@ "............ ....F.7J G.", "............>..........." ], - "terrain": { ".": "t_rock", " ": "t_rock_floor", ">": "t_slope_up", "7": "t_console_broken" }, - "furniture": { "f": "f_firering", "c": "f_camp_chair", "C": "f_crate_o", "W": "f_crate_c", "T": "f_tourist_table" }, + "terrain": { ".": "t_rock", " ": "t_rock_floor", ">": "t_slope_up" }, + "furniture": { + "f": "f_firering", + "c": "f_camp_chair", + "C": "f_crate_o", + "W": "f_crate_c", + "T": "f_tourist_table", + "7": "f_console_broken" + }, "traps": { "F": "tr_rollmat", "2": "tr_crossbow", diff --git a/data/json/mapgen/city_blocks/urban_13_dense_house_apt_house.json b/data/json/mapgen/city_blocks/urban_13_dense_house_apt_house.json index 52d99601c1ee2..0b2dfb5e0b47a 100644 --- a/data/json/mapgen/city_blocks/urban_13_dense_house_apt_house.json +++ b/data/json/mapgen/city_blocks/urban_13_dense_house_apt_house.json @@ -308,7 +308,7 @@ "type": "mapgen", "weight": 250, "object": { - "fill_ter": "t_carpet_green", + "fill_ter": "t_carpet_concrete_green", "rows": [ "________________________________________________", "________________________________________________", @@ -338,8 +338,8 @@ "palettes": [ "standard_domestic_palette" ], "liquids": { ")": { "liquid": "water", "amount": [ 0, 1000 ] } }, "terrain": { - "=": "t_carpet_green", - " ": "t_carpet_green", + "=": "t_carpet_concrete_green", + " ": "t_carpet_concrete_green", "_": "t_open_air", "`": "t_gutter_north", "/": "t_gutter_drop", diff --git a/data/json/mapgen/city_blocks/urban_14_dense_house_mart_food.json b/data/json/mapgen/city_blocks/urban_14_dense_house_mart_food.json index 8db281364fe67..9fa7b68530de2 100644 --- a/data/json/mapgen/city_blocks/urban_14_dense_house_mart_food.json +++ b/data/json/mapgen/city_blocks/urban_14_dense_house_mart_food.json @@ -35,15 +35,15 @@ "palettes": [ "standard_domestic_palette" ], "terrain": { "%": "t_rock", - "=": "t_carpet_yellow", - "I": "t_carpet_yellow", - "h": "t_carpet_yellow", - "s": "t_carpet_yellow", - "y": "t_carpet_yellow", - "E": "t_carpet_yellow", - "T": "t_carpet_yellow", - "d": "t_carpet_yellow", - "@": "t_carpet_yellow", + "=": "t_carpet_concrete_yellow", + "I": "t_carpet_concrete_yellow", + "h": "t_carpet_concrete_yellow", + "s": "t_carpet_concrete_yellow", + "y": "t_carpet_concrete_yellow", + "E": "t_carpet_concrete_yellow", + "T": "t_carpet_concrete_yellow", + "d": "t_carpet_concrete_yellow", + "@": "t_carpet_concrete_yellow", "~": "t_dirtfloor", "$": "t_sai_box", ":": "t_wall_glass", @@ -53,7 +53,12 @@ ">": "t_stairs_down", "-": "t_thconc_floor" }, - "furniture": { "!": "f_counter", "]": "f_treadmill", ")": "f_exercise", "}": "f_ergometer" }, + "furniture": { + "!": "f_counter", + "]": [ "f_treadmill", "f_treadmill_mechanical" ], + ")": "f_exercise", + "}": [ "f_ergometer", "f_ergometer_mechanical" ] + }, "vendingmachines": { "[": { "item_group": "vending_drink" }, "(": { "item_group": "vending_food" } }, "set": [ { "point": "trap", "id": "tr_rollmat", "x": [ 9, 11 ], "y": 11 }, @@ -103,7 +108,7 @@ "F": "t_concrete", "a": "t_window_bars_domestic", "b": "t_door_metal_pickable", - "=": "t_carpet_yellow", + "=": "t_carpet_concrete_yellow", "_": "t_pavement", "[": "t_pavement", "(": "t_pavement", diff --git a/data/json/mapgen/collapsed_tower.json b/data/json/mapgen/collapsed_tower.json index 2ed4e08a0e50d..7c197925c8fbe 100644 --- a/data/json/mapgen/collapsed_tower.json +++ b/data/json/mapgen/collapsed_tower.json @@ -2,11 +2,23 @@ { "name": "GROUP_COLLAPSED_TOWER", "type": "monstergroup", - "default": "mon_null", + "default": "mon_zombie", "monsters": [ - { "monster": "mon_zombie_gasbag_immobile", "freq": 150, "cost_multiplier": 1 }, - { "monster": "mon_zombie", "freq": 200, "cost_multiplier": 7, "pack_size": [ 3, 5 ] }, - { "monster": "mon_zombie_gasbag_crawler", "freq": 150, "cost_multiplier": 7, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_gasbag_immobile", "freq": 150, "cost_multiplier": 1, "pack_size": [ 1, 4 ] }, + { "monster": "mon_zombie_gasbag_crawler", "freq": 150, "cost_multiplier": 3, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_scissorlimbs", "freq": 50, "cost_multiplier": 9, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_gasbag_impaler", "freq": 50, "cost_multiplier": 6, "pack_size": [ 1, 4 ] } + ] + }, + { + "name": "GROUP_COLLAPSED_TOWER_BASEMENT", + "type": "monstergroup", + "default": "mon_zombie_gasbag_immobile", + "monsters": [ + { "monster": "mon_zombie_hanging_innards", "freq": 50, "cost_multiplier": 1 }, + { "monster": "mon_zombie_giant_heart", "freq": 50, "cost_multiplier": 1 }, + { "monster": "mon_zombie_gasbag_crawler", "freq": 150, "cost_multiplier": 3, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_scissorlimbs", "freq": 50, "cost_multiplier": 9, "pack_size": [ 1, 2 ] }, { "monster": "mon_zombie_gasbag_impaler", "freq": 50, "cost_multiplier": 6, "pack_size": [ 1, 4 ] } ] }, @@ -46,9 +58,9 @@ ".||||||||#|l l| ||66 | | |-c----c-| | z~~ ###### zTz |s", "....s.. |--- ---|#|||66 ||#| #|#||| zz~~~ zzz 1s", "....|.. |### #||| B B | |l ll ll ll|l| ~~~ 1s", - "....s..||-- --||||| | |l ll ll l|####rHr z~~ >????> zzz 1s", + "....s..||-- --||||| | |l ll ll l|####rHr z~~ c????c zzz 1s", "....s..||B666B 46B || B w |## | #|?rrr ##~~ rrrrrr s", - ". |||||| 666 6B ||||| w #|###llll l#|||r###zT~~ Hr>>rH |", + ". |||||| 666 6B ||||| w #|###llll l#|||r###zT~~ HrccrH |", ".. ### B B 666|| | ##|||||--| ##|?r|||||#~~~ ||||s", ".. |||# B B B B||| | |##| ###| ## - |||||###### ## |s", ".... |# B B 666 || | w C || ~ ||||||666666 ||| |s", @@ -65,9 +77,9 @@ "..|||z|C | C| B B |||||||||||| |CCC||```3 >|| ||CCC CCC|s", "....s CB |||| CCC CC||#D | C||||| |#```3 |#||||C C B|s", ".... CC 4 CCC||B 4##||##3 ##|||#|#```||||||#3 ||#|####### 1s", - ".... |||--22-||||||||||| ## ||||||||||||||| ||| ||||||||||||||s", - "....szzzzz|||zzzzzzz|||##| z## |||z||z|###zzzz1111 ||##zzzzzzzzzzs", - "...##.......||......||.... ##...........|||.##......|||||.............", + ".... |||--22-||||||||||| ## |||||||||||||||||||||||||||||||||||s", + "....szzzzz|||zzzzzzz|||##| z## |||z||z|###||zz1111|||##zzzzzzzzzzs", + "...##.......||......||.... ##...........||||||......|||||.............", ".#..sssssssssssssssssssssss 3sssssssssssssssssssssssss||sssssssssssssss" ], "set": [ @@ -164,10 +176,10 @@ { "point": "bash", "x": [ 48, 74 ], "y": [ 24, 47 ], "repeat": [ 50, 100 ] } ], "palettes": [ "collapsed_tower" ], - "furniture": { "R": "f_rack" }, + "furniture": { "C": "f_machinery_electronic", "x": "f_machinery_heavy", "R": "f_rack" }, "terrain": { - "C": "t_machinery_electronic", - "x": "t_machinery_heavy", + "|": "t_concrete_wall_flesh", + " ": "t_thconc_floor_flesh", "?": "t_nanofab", "r": "t_metal_floor", "/": "t_nanofab_body", @@ -183,14 +195,14 @@ { "item": "cleaning", "x": [ 15, 15 ], "y": [ 21, 22 ], "chance": 60 } ], "place_monster": [ { "monster": "mon_talon_m202a1", "x": [ 12, 13 ], "y": [ 20, 23 ] } ], - "monster": { " ": { "monster": "mon_zombie_living_wall", "chance": 20 } }, + "monster": { " ": { "monster": "mon_zombie_living_wall", "chance": 10 } }, "place_monsters": [ - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 0, 15 ], "density": 2.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 2.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 2.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 37, 47 ], "density": 2.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 24, 47 ], "density": 2.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 24, 47 ], "density": 2.5 } + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 0, 23 ], "y": [ 0, 15 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 0, 23 ], "y": [ 37, 47 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 24, 47 ], "y": [ 24, 47 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 48, 71 ], "y": [ 24, 47 ], "density": 2.5 } ] } } diff --git a/data/json/mapgen/cs_internet_cafe.json b/data/json/mapgen/cs_internet_cafe.json index 51acdbc665084..3e95a54b9bbac 100644 --- a/data/json/mapgen/cs_internet_cafe.json +++ b/data/json/mapgen/cs_internet_cafe.json @@ -63,11 +63,10 @@ "...4...................." ], "terrain": { - ".": [ [ "t_grass", 5 ], "t_dirt" ], + ".": "t_region_groundcover_urban", ",": "t_floor", "|": "t_wall_w", "s": "t_sidewalk", - "P": "t_console_broken", "D": "t_door_c", "g": "t_wall_glass_alarm", "G": "t_door_glass_c", @@ -75,7 +74,15 @@ "4": "t_gutter_downspout", "A": "t_atm" }, - "furniture": { "c": "f_displaycase", "t": "f_toilet", "h": "f_chair", "V": "f_vending_c", "S": "f_sink", "L": "f_locker" }, + "furniture": { + "P": "f_console_broken", + "c": "f_displaycase", + "t": "f_toilet", + "h": "f_chair", + "V": "f_vending_c", + "S": "f_sink", + "L": "f_locker" + }, "toilets": { "t": { "//": "no values needed here" } }, "items": { "c": { "item": "ic_merch", "chance": 20 }, @@ -132,13 +139,12 @@ ">": "t_stairs_down", "#": "t_wall_w", ",": "t_thconc_floor", - "k": "t_generator_broken", - "P": "t_console_broken", "D": "t_door_locked", "g": "t_wall_glass_alarm", "&": "t_flat_roof", "=": "t_flat_roof" }, + "furniture": { "P": "f_console_broken", "k": "f_generator_broken" }, "place_loot": [ { "item": "television", "x": 14, "y": 9, "chance": 100 }, { "item": "stepladder", "x": 5, "y": 10, "chance": 100 } ], "items": { "c": { "item": "electronics", "chance": 40 }, diff --git a/data/json/mapgen/dojo.json b/data/json/mapgen/dojo.json index 0ff2a0941d1d0..8f3ea4d45fdd9 100644 --- a/data/json/mapgen/dojo.json +++ b/data/json/mapgen/dojo.json @@ -105,10 +105,13 @@ "#": "t_wall_b", "*": "t_thconc_floor", "S": "t_thconc_floor", - "+": "t_door_c", - "x": [ "t_machinery_light", "t_machinery_heavy", "t_machinery_old", "t_machinery_electronic" ] + "x": "t_thconc_floor", + "+": "t_door_c" + }, + "furniture": { + "S": "f_filing_cabinet", + "x": [ "f_machinery_light", "f_machinery_heavy", "f_machinery_old", "f_machinery_electronic" ] }, - "furniture": { "S": "f_filing_cabinet" }, "items": { "t": { "item": "office_paper", "chance": 25, "repeat": [ 2, 4 ] } }, "place_nested": [ { diff --git a/data/json/mapgen/dollar_store.json b/data/json/mapgen/dollar_store.json index 7a82b5db2a19e..f3a04d3a9cb89 100644 --- a/data/json/mapgen/dollar_store.json +++ b/data/json/mapgen/dollar_store.json @@ -35,13 +35,12 @@ "terrain": { "+": "t_reinforced_door_glass_c", "-": "t_wall_glass", - ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], + ".": "t_region_groundcover_urban", "P": "t_wall_glass", "_": "t_floor", - "d": "t_dirt", - "p": "t_grass", + "d": "t_region_groundcover_urban", + "p": "t_region_groundcover_urban", "|": "t_wall_wood", - "X": "t_console_broken", "s": "t_sidewalk", "U": "t_sidewalk", "4": "t_gutter_downspout", @@ -56,7 +55,8 @@ "I": "f_desk", "S": "f_filing_cabinet", "U": "f_dumpster", - "p": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ] + "X": "f_console_broken", + "p": "f_region_flower" }, "toilets": { "T": { } }, "items": { @@ -185,43 +185,18 @@ "+": "t_reinforced_door_glass_c", "-": "t_wall_glass_alarm", ".": "t_floor", - "_": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "p": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "d": "t_dirt", + "_": "t_region_groundcover_urban", + "p": "t_region_groundcover_urban", + "d": "t_region_groundcover_urban", "s": "t_sidewalk", "|": "t_adobe_brick_wall", - "X": "t_console_broken", "U": "t_sidewalk", "4": "t_gutter_downspout", "<": "t_ladder_up", - "9": [ - "t_tree_blackjack", - "t_tree_walnut", - "t_tree_chestnut", - "t_tree_beech", - "t_tree_hazelnut", - "t_tree_cottonwood", - "t_tree", - "t_tree_elm", - "t_tree_dead", - "t_tree_apple", - "t_tree_pear", - "t_tree_cherry", - "t_tree_peach", - "t_tree_apricot", - "t_tree_plum", - "t_tree_mulberry", - "t_tree_elderberry", - "t_tree_pine", - "t_tree_birch", - "t_tree_willow", - "t_tree_maple", - "t_tree_hickory", - "t_tree_almond", - "t_tree_pecan" - ] + "9": "t_region_tree" }, "furniture": { + "X": "f_console_broken", "#": "f_counter", "l": "f_stool", "{": "f_rack", diff --git a/data/json/mapgen/field_football.json b/data/json/mapgen/field_football.json index 5e587a0706506..931f5d5ed57f6 100644 --- a/data/json/mapgen/field_football.json +++ b/data/json/mapgen/field_football.json @@ -12,7 +12,8 @@ [ "towel_soiled", 20 ], [ "heatpack", 40 ], [ "heatpack_used", 60 ], - [ "bandages", 40 ], + [ "bandages", 20 ], + [ "adhesive_bandages", 20 ], [ "mouthpiece", 40 ], [ "football", 60 ], [ "football_armor", 60 ], diff --git a/data/json/mapgen/fire_station.json b/data/json/mapgen/fire_station.json index cc655746c8104..ec74ee6d6b0b4 100644 --- a/data/json/mapgen/fire_station.json +++ b/data/json/mapgen/fire_station.json @@ -38,17 +38,17 @@ "+": "t_door_c", ",": "t_pavement_y", "-": "t_brick_wall", - ".": "t_grass", + ".": "t_region_groundcover_urban", "L": "t_door_locked", "M": "t_door_metal_locked", "O": "t_window", "_": "t_pavement", "w": "t_gates_control_brick", - "x": "t_console_broken", "|": "t_brick_wall", "4": "t_gutter_downspout" }, "furniture": { + "x": "f_console_broken", "#": "f_counter", ":": "f_dresser", "@": "f_bed", @@ -172,13 +172,12 @@ "+": "t_door_metal_locked", ".": "t_scrap_floor", "6": "t_gates_control_brick", - "C": "t_console_broken", "D": "t_door_metal_c", "P": "t_pavement_y", - "S": "t_shrub_rose", + "S": "t_region_shrub_decorative", "T": "t_thconc_floor", - "_": "t_grass", - "a": "t_shrub_lilac", + "_": "t_region_groundcover_urban", + "a": "t_region_shrub_decorative", "d": "t_door_c", "e": "t_thconc_floor", "h": "t_curtains", @@ -193,9 +192,10 @@ "<": "t_ladder_up" }, "furniture": { + "C": "f_console_broken", "#": "f_table", "&": "f_sink", - "5": "f_ergometer", + "5": [ "f_ergometer", "f_ergometer_mechanical" ], "B": "f_bookcase", "E": "f_exercise", "F": "f_fridge", diff --git a/data/json/mapgen/garage.json b/data/json/mapgen/garage.json index 0b8dfc194b2c7..d89a575d2f5ba 100644 --- a/data/json/mapgen/garage.json +++ b/data/json/mapgen/garage.json @@ -33,21 +33,20 @@ " " ], "terrain": { - " ": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + " ": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub" ], "E": "t_pavement", "U": "t_pavement", "$": "t_door_glass_c", "+": "t_door_c", "-": "t_brick_wall", ".": "t_thconc_floor", - "6": "t_console_broken", ":": "t_window", "=": "t_door_metal_locked", "A": "t_m_frame", "H": "t_wall_glass", "e": "t_gates_mech_control", "|": "t_brick_wall", - "W": "t_chainfence_h", + "W": "t_chainfence", "^": "t_chaingate_c", "M": "t_metal_floor", "#": "t_grate", @@ -55,6 +54,7 @@ "<": "t_ladder_up" }, "furniture": { + "6": "f_console_broken", "A": "f_air_conditioner", "L": "f_locker", "b": "f_bench", @@ -158,24 +158,24 @@ " " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "~": [ "t_dirt", "t_pavement", "t_pavement", "t_pavement", "t_pavement", "t_pavement", "t_pavement" ], - "_": [ "t_dirt", "t_sidewalk", "t_sidewalk", "t_sidewalk", "t_sidewalk", "t_sidewalk", "t_sidewalk" ], - "*": [ "t_tree_pine", "t_tree", "t_shrub", "t_tree_young" ], + " ": "t_region_groundcover", + "~": [ "t_region_groundcover_barren", [ "t_pavement", 6 ] ], + "_": [ "t_region_groundcover_barren", [ "t_sidewalk", 6 ] ], + "*": [ [ "t_region_tree_shade", 3 ], "t_region_shrub" ], "J": "t_water_pump", "D": "t_door_locked", "+": "t_door_c", "w": "t_wall_log", "U": "t_brick_wall", ".": "t_floor", - "6": "t_console_broken", ":": "t_window", - "W": "t_chainfence_h", + "W": "t_chainfence", "^": "t_chaingate_c", - "z": "t_dirt", + "z": "t_region_groundcover_barren", "4": "t_gutter_downspout" }, "furniture": { + "6": "f_console_broken", "L": "f_locker", "c": "f_counter", "s": "f_sink", @@ -269,7 +269,7 @@ " " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt", "t_shrub", "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "E": "t_pavement", "X": "t_sidewalk", "U": "t_sidewalk", @@ -278,7 +278,6 @@ "O": "t_door_locked", "-": "t_wall_b", ".": "t_thconc_floor", - "6": "t_console_broken", ":": "t_window", "=": "t_door_metal_locked", "A": "t_m_frame", @@ -294,6 +293,7 @@ }, "toilets": { "&": { } }, "furniture": { + "6": "f_console_broken", "A": "f_air_conditioner", "L": "f_locker", "T": "f_rack", @@ -366,9 +366,14 @@ "W": "t_window_domestic", "*": "t_chainfence", "8": "t_chaingate_c", - "x": [ "t_machinery_light", "t_machinery_heavy", "t_machinery_old", "t_machinery_electronic" ] + "x": "t_thconc_floor" + }, + "furniture": { + "I": "f_desk", + "h": "f_chair", + "f": "f_filing_cabinet", + "x": [ "f_machinery_light", "f_machinery_heavy", "f_machinery_old", "f_machinery_electronic" ] }, - "furniture": { "I": "f_desk", "h": "f_chair", "f": "f_filing_cabinet" }, "items": { "I": { "item": "office", "chance": 30 }, "f": { "item": "office_paper", "chance": 30 }, diff --git a/data/json/mapgen/garage_gas.json b/data/json/mapgen/garage_gas.json index dc52df76a0989..cf875fbab7f7b 100644 --- a/data/json/mapgen/garage_gas.json +++ b/data/json/mapgen/garage_gas.json @@ -42,9 +42,8 @@ "+": "t_door_c", "-": "t_wall_w", "|": "t_wall_w", - ".": [ [ "t_grass", 3 ], [ "t_dirt", 3 ], "t_grass_long" ], + ".": "t_region_groundcover_urban", " ": "t_thconc_floor", - "6": "t_console_broken", "=": "t_door_metal_locked", "I": "t_column", "[": "t_door_glass_c", @@ -58,6 +57,7 @@ "w": "t_window" }, "furniture": { + "6": "f_console_broken", "P": "f_indoor_plant", "D": "f_trashcan", "R": "f_trashcan", diff --git a/data/json/mapgen/gardening_store.json b/data/json/mapgen/gardening_store.json index 1a3180380d4dd..edd0b8db75b55 100644 --- a/data/json/mapgen/gardening_store.json +++ b/data/json/mapgen/gardening_store.json @@ -37,21 +37,20 @@ "+": "t_door_glass_c", ",": "t_pavement_y", "-": "t_wall_g", - ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "Z": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "1": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "2": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "3": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "5": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "Q": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "B": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "p": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ] ], - "b": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], + ".": "t_region_groundcover_urban", + "Z": "t_region_groundcover_urban", + "1": "t_region_groundcover_urban", + "2": "t_region_groundcover_urban", + "3": "t_region_groundcover_urban", + "5": "t_region_groundcover_urban", + "Q": "t_region_groundcover_urban", + "B": "t_region_groundcover_urban", + "p": "t_region_groundcover_urban", + "b": "t_region_groundcover_urban", "O": "t_window", "_": "t_pavement", "r": "t_floor", "|": "t_wall_g", - "?": "t_console_broken", "^": "t_chaingate_l", "%": "t_chainfence", "*": [ "t_door_locked", "t_door_c" ], @@ -60,6 +59,7 @@ }, "toilets": { "&": { } }, "furniture": { + "?": "f_console_broken", "#": "f_counter", "$": "f_counter_gate_c", "r": "f_rack", diff --git a/data/json/mapgen/gunsmith.json b/data/json/mapgen/gunsmith.json index 1a2c1e49e77b7..8745781a4cbf4 100644 --- a/data/json/mapgen/gunsmith.json +++ b/data/json/mapgen/gunsmith.json @@ -38,7 +38,7 @@ ], "terrain": { "#": "t_floor", - "%": "t_shrub", + "%": "t_region_shrub", "+": "t_door_metal_pickable", ",": "t_pavement_y", "-": "t_wall_w", @@ -52,12 +52,12 @@ "d": "t_pavement", "s": "t_sidewalk", "w": "t_window_bars_alarm", - "x": "t_console_broken", "|": "t_wall_w", "<": "t_stairs_up", "4": "t_gutter_downspout" }, "furniture": { + "x": "f_console_broken", "#": "f_counter", "C": "f_sofa", "E": "f_desk", diff --git a/data/json/mapgen/gym.json b/data/json/mapgen/gym.json index 0bf565cf27fb2..47336aeb21b99 100644 --- a/data/json/mapgen/gym.json +++ b/data/json/mapgen/gym.json @@ -47,10 +47,10 @@ "4": "t_gutter_downspout" }, "furniture": { - "!": "f_ergometer", + "!": [ "f_ergometer", "f_ergometer_mechanical" ], "#": "f_counter", "*": "f_shower", - "@": "f_treadmill", + "@": [ "f_treadmill", "f_treadmill_mechanical" ], "O": "f_locker", "V": "f_exercise", "a": "f_stool", @@ -176,13 +176,13 @@ "<": "t_stairs_up" }, "furniture": { - "!": "f_ergometer", + "!": [ "f_ergometer", "f_ergometer_mechanical" ], "{": "f_bigmirror", "#": "f_counter", "H": "f_vending_c", "&": "f_counter", "*": "f_shower", - "@": "f_treadmill", + "@": [ "f_treadmill", "f_treadmill_mechanical" ], "O": "f_locker", "V": "f_exercise", "C": "f_bench", diff --git a/data/json/mapgen/hazardous_waste_sarcophagus.json b/data/json/mapgen/hazardous_waste_sarcophagus.json index 12532ead88c59..bca07090420ad 100644 --- a/data/json/mapgen/hazardous_waste_sarcophagus.json +++ b/data/json/mapgen/hazardous_waste_sarcophagus.json @@ -55,16 +55,9 @@ " ffffffffffffffffffffffffffffffffffffffffffffff ", " " ], + "fill_ter": "t_linoleum_white", "terrain": { - " ": [ - [ "t_grass", 20 ], - [ "t_grass_dead", 3 ], - [ "t_grass_tall", 5 ], - [ "t_grass_long", 3 ], - [ "t_dirt", 5 ], - [ "t_shrub", 2 ], - [ "t_tree", 1 ] - ], + " ": [ [ "t_region_groundcover", 40 ], [ "t_region_shrub", 2 ], [ "t_region_tree", 1 ] ], "f": "t_chainfence", "|": "t_wall", "-": "t_wall", @@ -77,34 +70,12 @@ ",": "t_sidewalk", ":": "t_pavement", ";": "t_pavement_y", - "1": "t_floor", - "2": "t_floor", - "3": "t_floor", - "4": "t_floor", - "5": "t_console", - "6": "t_console_broken", - "7": "t_floor", - "8": "t_floor", - "9": "t_floor", - "&": "t_floor", "$": "t_sewage", - ".": "t_floor", - "a": "t_floor", - "b": "t_floor", - "r": "t_floor", - "F": "t_floor", - "c": "t_floor", - "C": "t_floor", - "d": "t_floor", - "l": "t_floor", - "p": "t_floor", - "A": "t_floor", "P": "t_sewage_pipe", "S": "t_sewage_pump", "G": "t_grate", "E": "t_elevator", "e": "t_elevator_control_off", - "s": "t_floor", "v": "t_dirt", "V": "t_vat", "L": "t_door_metal_locked", @@ -117,6 +88,8 @@ "2": "f_rack_coat", "3": "f_server", "4": "f_utility_shelf", + "5": "f_console", + "6": "f_console_broken", "7": "f_locker", "8": "f_utility_shelf", "9": "f_utility_shelf", @@ -238,20 +211,9 @@ "####################### ## ####################", "################################################" ], + "fill_ter": "t_metal_floor", "terrain": { " ": "t_rock_floor", - ".": "t_metal_floor", - "&": "t_metal_floor", - "a": "t_metal_floor", - "l": "t_metal_floor", - "s": "t_metal_floor", - "r": "t_metal_floor", - "c": "t_metal_floor", - "C": "t_metal_floor", - "d": "t_metal_floor", - "8": "t_metal_floor", - "9": "t_metal_floor", - "F": "t_metal_floor", "|": "t_concrete_wall", "-": "t_concrete_wall", "+": "t_door_metal_c", @@ -262,7 +224,6 @@ "%": "t_reinforced_glass", "E": "t_elevator", "e": "t_elevator_control_off", - "5": "t_console", "W": "t_water_dispenser", "~": [ [ "t_sewage", 55 ], [ "t_dirtfloor", 25 ], [ "t_dirtmound", 20 ] ] }, @@ -273,6 +234,7 @@ "c": "f_counter", "C": "f_chair", "l": "f_locker", + "5": "f_console", "8": "f_utility_shelf", "9": "f_utility_shelf", "a": "f_air_conditioner", diff --git a/data/json/mapgen/helipad.json b/data/json/mapgen/helipad.json index ffceb547cb79e..63b39140c1d29 100644 --- a/data/json/mapgen/helipad.json +++ b/data/json/mapgen/helipad.json @@ -63,7 +63,7 @@ "B": { "item": { "subtype": "distribution", - "entries": [ { "group": "fuel_barrel", "prob": 30 }, { "item": "30gal_drum", "prob": 70 } ] + "entries": [ { "group": "fuel_barrel", "prob": 20 }, { "group": "jp8_barrel", "prob": 40 }, { "item": "30gal_drum", "prob": 40 } ] }, "chance": 75 }, diff --git a/data/json/mapgen/homeimprovement.json b/data/json/mapgen/homeimprovement.json index 916ce683426e3..f9117684e7520 100644 --- a/data/json/mapgen/homeimprovement.json +++ b/data/json/mapgen/homeimprovement.json @@ -40,11 +40,11 @@ "O": "t_window", "r": "t_carpet_red", "|": "t_wall_r", - "%": "t_console_broken", "4": "t_gutter_downspout", "<": "t_ladder_up" }, "furniture": { + "%": "f_console_broken", "A": "f_stool", "3": "f_bookcase", "U": [ "f_dumpster", "f_recycle_bin" ], diff --git a/data/json/mapgen/homeimprovement_superstore_new.json b/data/json/mapgen/homeimprovement_superstore_new.json index 9d43fc0088a3e..b565dcfddea11 100644 --- a/data/json/mapgen/homeimprovement_superstore_new.json +++ b/data/json/mapgen/homeimprovement_superstore_new.json @@ -217,10 +217,10 @@ ">": "t_stairs_down", "<": "t_stairs_up", "$": "t_atm", - "&": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "B": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - " ": [ "t_grass_long", "t_grass_long", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt", "t_shrub" ], - "/": [ "t_tree", "t_tree_young", "t_shrub" ], + "&": "t_region_groundcover_urban", + "B": "t_region_groundcover_urban", + " ": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub" ], + "/": [ [ "t_region_tree", 2 ], "t_region_shrub" ], "0": "t_grass_golf", "a": "t_sandmound", "A": "t_claymound", @@ -235,7 +235,6 @@ "F": "t_chaingate_c", "#": "t_door_metal_locked", "g": "t_gates_mech_control", - "x": "t_console_broken", "!": "t_door_glass_c", "+": "t_door_c", "%": "t_door_locked_interior", @@ -278,6 +277,7 @@ "Z": "t_glass_roof" }, "furniture": { + "x": "f_console_broken", "V": "f_vending_c", "C": "f_chair", "T": "f_table", @@ -316,12 +316,12 @@ "U": "f_sofa", "q": "f_bookcase", "B": "f_bench", - "&": [ "f_dahlia", "f_dandelion", "f_lily", "f_flower_tulip", "f_bluebell" ], + "&": "f_region_flower", "M": "f_fema_groundsheet", "{": "f_canvas_door", "}": "f_canvas_wall", "H": "f_camp_chair", - "X": [ "f_crate_c", "f_crate_c", "f_crate_c", "f_crate_o" ], + "X": [ [ "f_crate_c", 3 ], "f_crate_o" ], "D": "f_dumpster", "O": "f_air_conditioner", "j": "f_standing_tank", diff --git a/data/json/mapgen/homeless_shelter.json b/data/json/mapgen/homeless_shelter.json index 4eab711ea2ed6..a50321d4b4f47 100644 --- a/data/json/mapgen/homeless_shelter.json +++ b/data/json/mapgen/homeless_shelter.json @@ -5,25 +5,8 @@ "terrain": { "*": "t_open_air", "~": "t_open_air_rooved", - ".": [ [ "t_grass_long", 200 ], [ "t_grass", 600 ], [ "t_dirt", 200 ], [ "t_shrub", 1 ] ], - ",": [ - [ "t_grass_long", 75 ], - [ "t_grass", 50 ], - [ "t_shrub", 20 ], - [ "t_shrub_rose", 20 ], - [ "t_shrub_lilac", 20 ], - [ "t_tree_young", 20 ], - [ "t_grass_tall", 20 ], - [ "t_grass_long", 20 ], - [ "t_underbrush", 20 ], - [ "t_shrub_hydrangea", 20 ], - [ "t_shrub_raspberry", 20 ], - [ "t_tree", 10 ], - [ "t_tree_willow", 2 ], - [ "t_tree_birch", 2 ], - [ "t_tree_maple", 2 ], - [ "t_tree_pine", 2 ] - ], + ".": [ [ "t_region_groundcover_urban", 1000 ], [ "t_region_shrub", 1 ] ], + ",": [ [ "t_region_groundcover_urban", 125 ], [ "t_region_shrub", 120 ], [ "t_region_tree_shade", 40 ] ], "-": "t_door_locked_interior", "<": "t_stairs_down", "+": "t_door_c", @@ -34,12 +17,11 @@ "i": "t_ladder_up", "!": "t_ladder_down", "z": "t_flat_roof", - "_": "t_carpet_red", + "_": "t_carpet_concrete_red", "3": "t_concrete", "L": "t_thconc_floor", "R": "t_thconc_floor", "s": "t_concrete", - "x": "t_console_broken", "|": "t_brick_wall", "#": "t_ponywall", "=": "t_reinforced_glass", @@ -54,6 +36,7 @@ "n": "t_dirtmound" }, "furniture": { + "x": "f_console_broken", "3": "f_bench", "B": "f_bench", "S": "f_sink", diff --git a/data/json/mapgen/hotel_tower.json b/data/json/mapgen/hotel_tower.json index 43b1d7277c3e8..d3d7a731af066 100644 --- a/data/json/mapgen/hotel_tower.json +++ b/data/json/mapgen/hotel_tower.json @@ -76,8 +76,8 @@ " s''''%c..BB|c..BB|o..BB|c.LBB|t.........t|BB..c|BB..c|BB..o|BB..o%''''s" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "V": "t_pavement", "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "V": "t_pavement", "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -130,8 +130,8 @@ "******%c..BB|c..BB|o..BBXc.LBB|t.........t|BB..cXBB..c|BB..o|BB..o%*****" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -180,8 +180,8 @@ "******%c..BB|c..BB|o..BB|c.LBB|t.........t|BB..c|BB..c|BB..o|BB..o%*****" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -230,8 +230,8 @@ "******%c..BB|c..BB|o..BB|c.LBB|t.........t|BB..c|BB..c|BB..o|BB..o%*****" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -526,10 +526,9 @@ "_": "t_thconc_floor", "+": "t_door_metal_c", "D": "t_chaingate_l", - "%": "t_chainfence", - "H": "t_generator_broken" + "%": "t_chainfence" }, - "furniture": { "Y": "f_standing_tank", "6": "f_water_heater", "7": "f_roof_turbine_vent" }, + "furniture": { "Y": "f_standing_tank", "H": "f_generator_broken", "6": "f_water_heater", "7": "f_roof_turbine_vent" }, "liquids": { "6": { "liquid": "water_clean", "amount": [ 0, 100 ] }, "Y": { "liquid": "water_clean", "amount": [ 100, 1000 ] } }, "place_monsters": [ { "monster": "GROUP_ROOF_ZOMBIE", "x": [ 7, 23 ], "y": [ 0, 22 ], "repeat": 2 }, @@ -622,8 +621,8 @@ "%c.LBB|t.........t|BB..c" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "+": [ "t_door_c", "t_door_c", "t_door_o" ], "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "+": [ [ "t_door_c", 2 ], "t_door_o" ], "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -668,8 +667,8 @@ "|c.LBB|t.........t|BB..c" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { "+": [ "t_door_c", "t_door_c", "t_door_o" ], "w": "t_window_domestic", "x": "t_console_broken" }, - "furniture": { "D": "f_desk" }, + "terrain": { "+": [ [ "t_door_c", 2 ], "t_door_o" ], "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -714,14 +713,8 @@ "|c.LBB|h.........h|BB..c" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { - "+": [ "t_door_c", "t_door_c", "t_door_o" ], - "G": "t_door_glass_c", - "w": "t_window_domestic", - "V": "t_pavement", - "x": "t_console_broken" - }, - "furniture": { "D": "f_desk" }, + "terrain": { "+": [ "t_door_c", "t_door_c", "t_door_o" ], "G": "t_door_glass_c", "w": "t_window_domestic", "V": "t_pavement" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, @@ -767,13 +760,8 @@ "|c.LBB|t.........t|BB..c" ], "palettes": [ "hotel_tower_palette.json" ], - "terrain": { - "+": [ "t_door_c", "t_door_c", "t_door_o" ], - "G": "t_door_glass_c", - "w": "t_window_domestic", - "x": "t_console_broken" - }, - "furniture": { "D": "f_desk" }, + "terrain": { "+": [ "t_door_c", "t_door_c", "t_door_o" ], "G": "t_door_glass_c", "w": "t_window_domestic" }, + "furniture": { "D": "f_desk", "x": "f_console_broken" }, "items": { "B": { "item": "bed", "chance": 50 }, "L": { "item": "hotel_luggage", "chance": 100 }, diff --git a/data/json/mapgen/house/house15.json b/data/json/mapgen/house/house15.json index ee74d8d46bb55..952d3f72e4d93 100644 --- a/data/json/mapgen/house/house15.json +++ b/data/json/mapgen/house/house15.json @@ -34,7 +34,7 @@ ], "palettes": [ "standard_domestic_palette" ], "terrain": { "%": "t_region_shrub_fruit", "!": "t_region_groundcover_urban", "'": "t_concrete" }, - "furniture": { "!": "f_bluebell", "$": "f_treadmill" }, + "furniture": { "!": "f_bluebell", "$": [ "f_treadmill", "f_treadmill_mechanical" ] }, "place_loot": [ { "group": "livingroom", "x": [ 7, 16 ], "y": [ 7, 9 ], "chance": 90, "repeat": [ 1, 6 ] } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 1, 22 ], "y": [ 2, 21 ], "chance": 5 } ] } diff --git a/data/json/mapgen/house/house_garage_prepper.json b/data/json/mapgen/house/house_garage_prepper.json index bed34f5a3a221..8f1e3891895ea 100644 --- a/data/json/mapgen/house/house_garage_prepper.json +++ b/data/json/mapgen/house/house_garage_prepper.json @@ -5,7 +5,7 @@ "om_terrain": [ "house_prepper2" ], "weight": 100, "object": { - "fill_ter": "t_carpet_red", + "fill_ter": "t_carpet_concrete_red", "rows": [ "..%%%%```%%%%p```````...", ".##$$##*##$$##=======##.", @@ -41,7 +41,7 @@ "=": "t_door_metal_locked", "&": "t_gates_control_brick", "~": "t_thconc_floor", - " ": "t_carpet_red", + " ": "t_carpet_concrete_red", "`": "t_concrete", "q": "t_thconc_floor", "W": "t_thconc_floor", @@ -60,11 +60,10 @@ "-": "t_linoleum_gray", "$": "t_window_boarded", "/": "t_window_reinforced", - ";": "t_console_broken", ",": "t_door_boarded", "(": "t_door_metal_pickable" }, - "furniture": { "!": "f_region_flower", "{": "f_table", "}": "f_chair", ")": "f_locker" }, + "furniture": { "!": "f_region_flower", ";": "f_console_broken", "{": "f_table", "}": "f_chair", ")": "f_locker" }, "set": [ { "point": "trap", "id": "tr_beartrap", "x": [ 10, 11 ], "y": 2, "repeat": [ 1, 2 ] }, { "point": "trap", "id": "tr_beartrap", "x": 2, "y": [ 7, 8 ], "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/irradiator_1.json b/data/json/mapgen/irradiator_1.json index 331d2f6c71f4c..f858cc3a3486a 100644 --- a/data/json/mapgen/irradiator_1.json +++ b/data/json/mapgen/irradiator_1.json @@ -168,20 +168,7 @@ "[[[[L__________________LssssssssssssssssssssssssL__________________L[[[[" ], "terrain": { - "*": [ - "t_grass", - "t_grass", - "t_dirt", - "t_shrub_rose", - "t_shrub_lilac", - "t_tree_young", - "t_shrub_hydrangea", - "t_grass_long", - "t_woodchips", - "t_moss", - "t_grass_long", - "t_grass_dead" - ], + "*": [ [ "t_region_groundcover_forest", 2 ], "t_region_shrub_decorative" ], "'": [ "t_fence_barbed" ], "X": [ "t_strconc_wall" ], "+": [ "t_door_c" ], @@ -198,34 +185,32 @@ "f": [ "t_chainfence_h" ], "s": [ "t_sidewalk" ], "w": [ "t_window" ], - "x": [ "t_console_broken" ], "|": [ "t_strconc_wall" ], "U": [ "t_water_pool" ], "R": [ "t_reinforced_glass_shutter_open" ], "m": [ "t_oil_circ_brkr_s", "t_station_disc", "t_switchgear_s", "t_potential_trans", "t_current_trans", "t_lgtn_arrest" ], - "M": [ "t_machinery_heavy" ], "e": [ "t_gates_mech_control" ], "#": [ "t_sidewalk" ], - "P": [ "t_sewage_pump", "t_sewage_pipe", "t_sewage_pipe", "t_sewage_pipe" ], + "P": [ "t_sewage_pump", [ "t_sewage_pipe", 3 ] ], "Y": [ "t_door_metal_locked" ], "y": [ "t_door_metal_o" ], "N": [ "t_door_metal_locked" ], "%": [ "t_grate" ], - "/": [ "t_plut_generator" ], "}": [ "t_ladder_up" ], ")": [ "t_reinforced_glass" ], "!": [ "t_thconc_floor" ], - "0": [ "t_console" ], "1": [ "t_floor_red" ], "2": [ "t_floor_green" ], "3": [ "t_rad_platform" ], - "4": [ "t_card_industrial" ], - "5": [ "t_console" ], - "6": [ "t_console" ], - "7": [ "t_console" ] + "4": [ "t_card_industrial" ] }, "furniture": { "#": [ "f_bench" ], + "/": [ "f_compact_ASRG_containment" ], + "0": [ "f_console" ], + "5": [ "f_console" ], + "6": [ "f_console" ], + "7": [ "f_console" ], "S": [ "f_locker" ], "A": [ "f_locker" ], "j": [ "f_locker" ], @@ -236,10 +221,12 @@ "d": [ "f_desk" ], "g": [ "f_shower" ], "h": [ "f_chair" ], + "M": [ "f_machinery_heavy" ], "o": [ "f_sofa" ], "r": [ "f_rack" ], "t": [ "f_table" ], "Q": [ "f_air_filter" ], + "x": [ "f_console_broken" ], "Z": [ "f_water_purifier" ], "B": [ "f_bed", "f_dresser", "f_glass_cabinet" ], "<": [ "f_sink" ], diff --git a/data/json/mapgen/jewel_store.json b/data/json/mapgen/jewel_store.json index 0530214443a86..5dfe77f11e1ce 100644 --- a/data/json/mapgen/jewel_store.json +++ b/data/json/mapgen/jewel_store.json @@ -42,7 +42,7 @@ "+": "t_door_glass_c", ",": "t_pavement_y", "-": "t_wall_b", - ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + ".": [ "t_region_groundcover_urban", "t_region_shrub" ], "5": "t_chainfence_h", "8": "t_chainfence_v", "F": "t_sidewalk", @@ -50,13 +50,13 @@ "_": "t_pavement", "h": "t_wall_glass_alarm", "v": "t_wall_glass_alarm", - "?": "t_console_broken", "4": "t_gutter_downspout", "|": "t_wall_b" }, "furniture": { "#": "f_counter", "%": "f_counter", + "?": "f_console_broken", "G": "f_desk", "T": "f_safe_l", "c": "f_chair", diff --git a/data/json/mapgen/lab/lab_common.json b/data/json/mapgen/lab/lab_common.json index 6ccc77eb54867..6159618dff094 100644 --- a/data/json/mapgen/lab/lab_common.json +++ b/data/json/mapgen/lab/lab_common.json @@ -3,6 +3,8 @@ "type": "palette", "id": "lab_palette", "furniture": { + "6": "f_console", + "x": "f_console_broken", "b": "f_bed", "l": "f_locker", "X": [ "f_cardboard_box", "f_crate_c" ], @@ -21,8 +23,6 @@ "^": "f_rubble_rock" }, "terrain": { - "6": "t_console", - "x": "t_console_broken", "g": "t_reinforced_glass", "G": "t_reinforced_door_glass_lab_c", ".": "t_thconc_floor", diff --git a/data/json/mapgen/lab/lab_floorplan_cross.json b/data/json/mapgen/lab/lab_floorplan_cross.json index 82c5d3af0d7d8..7fcdba5700e0e 100644 --- a/data/json/mapgen/lab/lab_floorplan_cross.json +++ b/data/json/mapgen/lab/lab_floorplan_cross.json @@ -166,18 +166,8 @@ "-----------MM----------|" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "terrain": { - "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], - "!": [ - "t_thconc_floor", - "t_thconc_floor", - "t_thconc_floor", - "t_thconc_floor", - "t_console_broken", - "t_generator_broken", - "t_centrifuge" - ] - }, + "terrain": { "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ] }, + "furniture": { "!": [ [ "f_null", 4 ], "f_console_broken", "f_generator_broken", "f_centrifuge" ] }, "place_nested": [ { "chunks": [ "lab_spawn_7x7" ], diff --git a/data/json/mapgen/lab/lab_floorplans.json b/data/json/mapgen/lab/lab_floorplans.json index 7bd70ed17d36d..62b4a723ebeba 100644 --- a/data/json/mapgen/lab/lab_floorplans.json +++ b/data/json/mapgen/lab/lab_floorplans.json @@ -141,10 +141,9 @@ "c...c|.rrr...|-|X.ccc.X|" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "f": "f_null" }, + "furniture": { "f": "f_null", "P": "f_generator_broken" }, "terrain": { "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], - "P": "t_generator_broken", "F": "t_chainfence_h", "f": "t_chainfence_v", "H": "t_chaingate_c", @@ -204,11 +203,8 @@ "..............l|X.ccc.X|" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "terrain": { - "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], - "=": "t_conveyor", - "%": "t_machinery_heavy" - }, + "terrain": { "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], "=": "t_conveyor" }, + "furniture": { "%": "f_machinery_heavy" }, "mapping": { "c": { "items": [ { "item": "chem_lab", "chance": 20 }, { "item": "tools_science", "chance": 20 } ] } }, "place_nested": [ { "chunks": [ "lab_spawn_9x9_wall_sw" ], "x": 13, "y": 1 }, @@ -254,12 +250,8 @@ "rrr.....!.....l|-------|" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "f": "f_null" }, - "terrain": { - "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], - "!": [ "t_thconc_floor", "t_thconc_floor", "t_console_broken", "t_generator_broken" ], - "C": "t_centrifuge" - }, + "furniture": { "!": [ [ "f_null", 2 ], "f_console_broken", "f_generator_broken" ], "C": "f_centrifuge", "f": "f_null" }, + "terrain": { "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ] }, "mapping": { "c": { "items": [ { "item": "chem_lab", "chance": 10 }, { "item": "tools_science", "chance": 10 } ] }, "r": { "items": [ { "item": "cleaning", "chance": 30 } ] } @@ -533,13 +525,13 @@ "........................" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "?": "f_autodoc", "/": "f_autodoc_couch" }, + "furniture": { "?": "f_autodoc", "/": "f_autodoc_couch", "7": "f_console", "C": "f_centrifuge" }, "terrain": { ",": "t_floor_blue", - "C": "t_centrifuge", + "C": "t_floor_blue", "?": "t_floor_blue", "/": "t_floor_blue", - "7": "t_console", + "7": "t_floor_blue", "r": "t_floor_blue" }, "place_loot": [ { "item": "anesthetic_kit", "x": 15, "y": 11, "ammo": 100 } ], @@ -613,12 +605,12 @@ ], "palettes": [ "lab_palette" ], "terrain": { - "C": "t_centrifuge", + "C": "t_floor", "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_lab_c" ], "7": "t_floor", "8": "t_floor" }, - "furniture": { "7": "f_autodoc", "8": "f_autodoc_couch" }, + "furniture": { "C": "f_centrifuge", "7": "f_autodoc", "8": "f_autodoc_couch" }, "items": { "b": { "item": "hospital_bed", "chance": 33 }, "l": { "item": "surgery", "chance": 50 }, @@ -683,7 +675,8 @@ "........................" ], "palettes": [ "lab_palette" ], - "terrain": { "C": "t_centrifuge", "7": "t_console", ",": "t_floor_blue" }, + "furniture": { "7": "f_console", "C": "f_centrifuge" }, + "terrain": { "C": "t_floor_blue", "7": "t_floor_blue", ",": "t_floor_blue" }, "mapping": { "c": { "items": [ { "item": "office", "chance": 30 }, { "item": "tools_science", "chance": 15 } ] }, "l": { "items": [ { "item": "science", "chance": 60 } ] } @@ -749,13 +742,12 @@ ".......|.........|......" ], "palettes": [ "lab_palette" ], - "furniture": { "S": "f_null", "^": "f_indoor_plant", "f": "f_null" }, + "furniture": { "S": "f_null", "^": "f_indoor_plant", "P": "f_generator_broken", "f": "f_null" }, "terrain": { "F": "t_chainfence_h", "f": "t_chainfence_v", "H": "t_chaingate_c", "&": "t_radio_tower", - "P": "t_generator_broken", "S": "t_sewage_pump", "p": "t_sewage_pipe", "C": "t_gates_control_concrete_lab", @@ -829,15 +821,8 @@ ".........|....|---------" ], "palettes": [ "lab_palette", "lab_loot_home_office" ], - "furniture": { "^": "f_indoor_plant" }, - "terrain": { - "E": "t_elevator", - "e": "t_elevator_control_off", - "w": "t_water_sh", - "W": "t_water_dp", - "=": "t_door_lab_c", - "C": "t_centrifuge" - }, + "furniture": { "^": "f_indoor_plant", "C": "f_centrifuge" }, + "terrain": { "E": "t_elevator", "e": "t_elevator_control_off", "w": "t_water_sh", "W": "t_water_dp", "=": "t_door_lab_c" }, "mapping": { "t": { "items": [ { "item": "vending_food_items", "chance": 20 } ] } }, "place_loot": [ { "group": "everyday_corpse", "x": 17, "y": 15 }, @@ -938,7 +923,7 @@ ], "palettes": [ "lab_palette", "lab_loot_home_office" ], "furniture": { "F": "f_sofa", "B": "f_bathtub", "C": "f_counter", "O": "f_oven", "V": "f_table" }, - "terrain": { "w": "t_window_domestic", "`": "t_grass", "+": "t_door_lab_c" }, + "terrain": { "w": "t_window_domestic", "`": "t_grass_golf", "+": "t_door_lab_c" }, "mapping": { "t": { "items": [ { "item": "livingroom", "chance": 20 } ] }, "F": { "items": [ { "item": "livingroom", "chance": 5 } ] }, diff --git a/data/json/mapgen/lab/lab_floorplans_1side.json b/data/json/mapgen/lab/lab_floorplans_1side.json index 361515eb3e588..aba5a9e3042e7 100644 --- a/data/json/mapgen/lab/lab_floorplans_1side.json +++ b/data/json/mapgen/lab/lab_floorplans_1side.json @@ -166,7 +166,7 @@ }, { "monster": [ "mon_zombie_soldier" ], "x": [ 1, 21 ], "y": [ 1, 16 ], "pack_size": [ 1, 4 ], "chance": 40 } ], - "terrain": { "7": "t_console" }, + "furniture": { "7": "f_console" }, "mapping": { "l": { "items": [ @@ -254,8 +254,7 @@ { "monster": "mon_zombie_grabber", "x": [ 1, 5 ], "y": [ 12, 15 ] }, { "monster": "mon_zombie_scientist", "x": [ 11, 12 ], "y": [ 5, 10 ], "pack_size": [ 1, 2 ], "chance": 50 } ], - "furniture": { "^": "f_indoor_plant" }, - "terrain": { "7": "t_console", "C": "t_centrifuge" }, + "furniture": { "^": "f_indoor_plant", "7": "f_console", "C": "f_centrifuge" }, "mapping": { "X": { "items": [ { "item": "softdrugs", "chance": 40 }, { "item": "harddrugs", "chance": 30 } ] }, "r": { "items": [ { "item": "softdrugs", "chance": 40 }, { "item": "harddrugs", "chance": 30 } ] }, diff --git a/data/json/mapgen/lab/lab_floorplans_finale1level.json b/data/json/mapgen/lab/lab_floorplans_finale1level.json index ec5402e4a6b58..969856ef5d252 100644 --- a/data/json/mapgen/lab/lab_floorplans_finale1level.json +++ b/data/json/mapgen/lab/lab_floorplans_finale1level.json @@ -35,13 +35,13 @@ "........................" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "?": "f_autodoc", "/": "f_autodoc_couch" }, + "furniture": { "7": "f_console", "C": "f_centrifuge", "?": "f_autodoc", "/": "f_autodoc_couch" }, "terrain": { ",": "t_floor_blue", - "C": "t_centrifuge", + "C": "t_floor_blue", "?": "t_floor_blue", "/": "t_floor_blue", - "7": "t_console", + "7": "t_floor_blue", "r": "t_floor_blue" }, "place_loot": [ @@ -119,16 +119,8 @@ "......g..........g......" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "R": "f_rack" }, - "terrain": { - "C": "t_machinery_electronic", - "x": "t_machinery_heavy", - "?": "t_nanofab", - "r": "t_metal_floor", - "/": "t_nanofab_body", - "Y": "t_thconc_floor_olight", - "p": "t_metal_floor" - }, + "furniture": { "C": "f_machinery_electronic", "x": "f_machinery_heavy", "R": "f_rack" }, + "terrain": { "?": "t_nanofab", "r": "t_metal_floor", "/": "t_nanofab_body", "Y": "t_thconc_floor_olight", "p": "t_metal_floor" }, "mapping": { "r": { "item": { "item": "standard_template_construct" } }, "R": { "item": { "item": "nanomaterial" } } }, "place_monster": [ { "monster": "mon_secubot", "x": [ 1, 4 ], "y": [ 20, 22 ], "chance": 90 }, @@ -174,9 +166,9 @@ ".......................-" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "R": "f_rack", "D": "f_desk" }, + "furniture": { "C": "f_machinery_electronic", "R": "f_rack", "D": "f_desk" }, "fields": { "Q": { "field": "fd_fatigue", "intensity": 3 } }, - "terrain": { "C": "t_machinery_electronic", "r": "t_metal_floor", "Y": "t_thconc_floor_olight", "p": "t_metal_floor" }, + "terrain": { "r": "t_metal_floor", "Y": "t_thconc_floor_olight", "p": "t_metal_floor" }, "mapping": { "R": { "item": [ { "item": "dimensional_anchor" }, { "item": "phase_immersion_suit" } ] }, "D": { @@ -231,8 +223,8 @@ "........................" ], "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "V": "f_standing_tank" }, - "terrain": { ",": "t_floor_blue", "V": "t_floor_blue", "C": "t_centrifuge" }, + "furniture": { "V": "f_standing_tank", "C": "f_centrifuge" }, + "terrain": { ",": "t_floor_blue", "V": "t_floor_blue", "C": "t_floor_blue" }, "mapping": { "c": { "items": [ { "item": "mut_lab", "chance": 50 } ] } }, "computers": { "6": { diff --git a/data/json/mapgen/lab/lab_rooms.json b/data/json/mapgen/lab/lab_rooms.json index 99b271c604cec..00eb30d2923bf 100644 --- a/data/json/mapgen/lab/lab_rooms.json +++ b/data/json/mapgen/lab/lab_rooms.json @@ -267,7 +267,7 @@ "........." ], "palettes": [ "lab_palette" ], - "terrain": { "C": [ "t_centrifuge" ] } + "furniture": { "C": [ "f_centrifuge" ] } } }, { @@ -732,14 +732,15 @@ "object": { "mapgensize": [ 1, 1 ], "rows": [ "A" ], - "terrain": { + "terrain": { "A": "t_thconc_floor" }, + "furniture": { "A": [ - "t_machinery_heavy", - "t_machinery_heavy", - "t_machinery_electronic", - "t_machinery_light", - "t_centrifuge", - "t_console_broken" + "f_machinery_heavy", + "f_machinery_heavy", + "f_machinery_electronic", + "f_machinery_light", + "f_centrifuge", + "f_console_broken" ] } } @@ -986,7 +987,11 @@ ], "palettes": [ "lab_palette" ], "terrain": { "%": "t_thconc_floor" }, - "furniture": { "%": "f_treadmill", "5": [ "f_ergometer", "f_exercise" ], "`": "f_canvas_floor" }, + "furniture": { + "%": [ "f_treadmill", "f_treadmill_mechanical" ], + "5": [ "f_ergometer", "f_ergometer_mechanical", "f_exercise" ], + "`": "f_canvas_floor" + }, "items": { ".": { "item": "clutter_gym", "chance": 3 }, "l": { "item": "locker_gym", "chance": 30 }, diff --git a/data/json/mapgen/lab/lab_surface/lab_surface_big_z-1.json b/data/json/mapgen/lab/lab_surface/lab_surface_big_z-1.json index f838ba32b222c..1114307de4eaf 100644 --- a/data/json/mapgen/lab/lab_surface/lab_surface_big_z-1.json +++ b/data/json/mapgen/lab/lab_surface/lab_surface_big_z-1.json @@ -174,8 +174,7 @@ "*": "t_thconc_floor_olight", "e": "t_elevator", "m": "t_door_metal_c", - "w": "t_gates_control_brick", - "x": "t_console_broken" + "w": "t_gates_control_brick" }, "furniture": { "&": "f_trashcan", @@ -186,7 +185,8 @@ "f": "f_fridge", "l": "f_locker", "s": "f_stool", - "U": "f_utility_shelf" + "U": "f_utility_shelf", + "x": "f_console_broken" }, "items": { "d": { "item": "office", "chance": 60, "repeat": [ 2, 6 ] }, diff --git a/data/json/mapgen/lab/lab_surface/lab_surface_nested.json b/data/json/mapgen/lab/lab_surface/lab_surface_nested.json index 1f2433394a685..da5be15a3e112 100644 --- a/data/json/mapgen/lab/lab_surface/lab_surface_nested.json +++ b/data/json/mapgen/lab/lab_surface/lab_surface_nested.json @@ -543,13 +543,13 @@ "dHH " ], "terrain": { - " ": "t_carpet_red", - "f": "t_carpet_red", - "r": "t_carpet_red", - "H": "t_carpet_red", - "d": "t_carpet_red", - "c": "t_carpet_red", - "B": "t_carpet_red" + " ": "t_carpet_concrete_red", + "f": "t_carpet_concrete_red", + "r": "t_carpet_concrete_red", + "H": "t_carpet_concrete_red", + "d": "t_carpet_concrete_red", + "c": "t_carpet_concrete_red", + "B": "t_carpet_concrete_red" }, "items": { "d": [ { "item": "office", "chance": 25, "repeat": [ 1, 3 ] }, { "item": "electronics", "chance": 15 } ], @@ -1072,7 +1072,7 @@ " dc dc dc ", " " ], - "terrain": { "%": "t_carpet_yellow" }, + "terrain": { "%": "t_carpet_concrete_yellow" }, "items": { "d": { "item": "office", "chance": 8 } }, "palettes": [ "lab_surface_palette" ] } @@ -1098,7 +1098,7 @@ " cxxc cxxc ", " " ], - "terrain": { "%": "t_carpet_yellow" }, + "terrain": { "%": "t_carpet_concrete_yellow" }, "palettes": [ "lab_surface_palette" ] } }, @@ -1123,7 +1123,14 @@ " cccc cccc ", " " ], - "terrain": { " ": "t_carpet_red", "c": "t_carpet_red", "%": "t_floor", "r": "t_floor", "s": "t_floor", "C": "t_floor" }, + "terrain": { + " ": "t_carpet_concrete_red", + "c": "t_carpet_concrete_red", + "%": "t_floor", + "r": "t_floor", + "s": "t_floor", + "C": "t_floor" + }, "items": { "c": { "item": "office", "chance": 10 }, "C": { "item": "office", "chance": 45 } }, "palettes": [ "lab_surface_palette" ] } @@ -1154,7 +1161,7 @@ "A": "t_strconc_floor", "c": "t_strconc_floor", "C": "t_strconc_floor", - "m": "t_machinery_heavy", + "m": "t_strconc_floor", "P": "t_sewage_pipe", "t": "t_strconc_floor", "S": "t_strconc_floor", @@ -1164,6 +1171,7 @@ "furniture": { "A": "f_air_filter", "C": "f_air_compressor", + "m": "f_machinery_heavy", "t": "f_standing_tank", "S": "f_standing_tank", "U": "f_utility_shelf", @@ -1217,7 +1225,7 @@ "D": "t_strconc_floor", "F": "t_strconc_floor", "L": "t_strconc_floor", - "m": "t_machinery_heavy", + "m": "t_strconc_floor", "R": "t_strconc_floor", "T": "t_strconc_floor", "u": "t_strconc_floor", @@ -1230,6 +1238,7 @@ "D": "f_drill_press", "F": "f_home_furnace", "L": "f_heavy_lathe", + "m": "f_machinery_heavy", "R": "f_router", "T": "f_tablesaw", "u": "f_utility_shelf", @@ -1866,19 +1875,34 @@ "type": "mapgen", "method": "json", "nested_mapgen_id": "surface_sub_hall_clutter", - "object": { "mapgensize": [ 1, 1 ], "rows": [ "X" ], "terrain": { "X": "t_strconc_floor" }, "furniture": { "X": "f_IV_pole" } } + "object": { + "mapgensize": [ 1, 1 ], + "rows": [ "X" ], + "terrain": { "X": "t_strconc_floor" }, + "furniture": { "X": [ "f_IV_pole", "f_desk", "f_counter" ] } + } }, { "type": "mapgen", "method": "json", "nested_mapgen_id": "surface_sub_hall_clutter", - "object": { "mapgensize": [ 1, 1 ], "rows": [ "X" ], "terrain": { "X": "t_strconc_floor" }, "furniture": { "X": "f_autoclave" } } + "object": { + "mapgensize": [ 1, 1 ], + "rows": [ "X" ], + "terrain": { "X": "t_strconc_floor" }, + "furniture": { "X": [ "f_autoclave", "f_console_broken", "f_centrifuge" ] } + } }, { "type": "mapgen", "method": "json", "nested_mapgen_id": "surface_sub_hall_clutter", - "object": { "mapgensize": [ 1, 1 ], "rows": [ "X" ], "terrain": { "X": "t_machinery_old" } } + "object": { + "mapgensize": [ 1, 1 ], + "rows": [ "X" ], + "terrain": { "X": "t_strconc_floor" }, + "furniture": { "X": [ "f_machinery_old", "f_machinery_light", "f_machinery_electronic" ] } + } }, { "type": "mapgen", diff --git a/data/json/mapgen/lab/lab_trains.json b/data/json/mapgen/lab/lab_trains.json index 64df9439a6449..4e863d34c528f 100644 --- a/data/json/mapgen/lab/lab_trains.json +++ b/data/json/mapgen/lab/lab_trains.json @@ -44,14 +44,8 @@ "failures": [ { "action": "damage" }, { "action": "alarm" }, { "action": "manhacks" } ] } }, - "terrain": { - "=": "t_chaingate_c", - "_": "t_chainfence_h", - "8": "t_potential_trans", - "P": "t_generator_broken", - "!": "t_sewage_pump", - "p": "t_sewage_pipe" - }, + "terrain": { "=": "t_chaingate_c", "_": "t_chainfence_h", "8": "t_potential_trans", "!": "t_sewage_pump", "p": "t_sewage_pipe" }, + "furniture": { "P": "f_generator_broken" }, "place_nested": [ { "chunks": [ "lab_train_subway_east" ], "x": 0, "y": 0, "neighbors": { "east": [ "subway" ] } }, { "chunks": [ "lab_train_subway_west" ], "x": 0, "y": 0, "neighbors": { "west": [ "subway" ] } }, diff --git a/data/json/mapgen/lab_subway_vent_shaft.json b/data/json/mapgen/lab_subway_vent_shaft.json index 32bb9e09bf2a2..548e622f1546a 100644 --- a/data/json/mapgen/lab_subway_vent_shaft.json +++ b/data/json/mapgen/lab_subway_vent_shaft.json @@ -4,7 +4,7 @@ "id": "lab_subway_vent_shaft", "terrain": { "2": "t_door_metal_c", - "%": "t_machinery_heavy", + "%": "t_metal_floor_no_roof", "-": "t_wall_metal", "3": "t_chaingate_c", ",": "t_region_groundcover_urban", @@ -15,10 +15,11 @@ "~": "t_water_pool_shallow", "<": "t_ladder_up", ">": "t_ladder_down", - "u": "t_chainfence_h", - "U": "t_chainfence_v", + "u": "t_chainfence", + "U": "t_chainfence", "#": "t_rock" - } + }, + "furniture": { "%": "f_machinery_heavy" } }, { "type": "mapgen", diff --git a/data/json/mapgen/lake_buildings/lighthouse.json b/data/json/mapgen/lake_buildings/lighthouse.json index 4e2a78c11c610..4f3c71aa72f79 100644 --- a/data/json/mapgen/lake_buildings/lighthouse.json +++ b/data/json/mapgen/lake_buildings/lighthouse.json @@ -336,12 +336,10 @@ "<": "t_wood_stairs_up", "Q": "t_open_air_rooved", ">": "t_wood_stairs_down", - "x": "t_generator_broken", - "y": "t_machinery_old", "#": "t_wall_wood", "0": "t_laminated_glass" }, - "furniture": { "M": [ "f_crate_c", "f_cardboard_box" ] }, + "furniture": { "M": [ "f_crate_c", "f_cardboard_box" ], "x": "f_generator_broken", "y": "f_machinery_old" }, "items": { "M": [ { "item": "fishing_items", "chance": 30, "repeat": [ 1, 2 ] }, @@ -393,11 +391,11 @@ "<": "t_wood_stairs_up", ">": "t_wood_stairs_down", "0": "t_laminated_glass", - "y": "t_machinery_old", "#": "t_grate", "+": "t_laminated_door_glass_c", "Q": "t_open_air_rooved" - } + }, + "furniture": { "y": "f_machinery_old" } } }, { diff --git a/data/json/mapgen/lan_center.json b/data/json/mapgen/lan_center.json index e5fd19f5c1abb..e4974ae70772a 100644 --- a/data/json/mapgen/lan_center.json +++ b/data/json/mapgen/lan_center.json @@ -35,44 +35,19 @@ "terrain": { "+": "t_reinforced_door_glass_c", ".": "t_floor", - "6": "t_console", - "_": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], - "a": "t_console_broken", - "d": "t_grass_long", + "_": [ [ "t_region_groundcover_urban", 8 ], "t_region_shrub_decorative" ], + "d": "t_region_groundcover", "s": "t_sidewalk", "w": "t_window", "|": "t_wall_w", "4": "t_gutter_downspout", "=": "t_door_locked", "U": "t_sidewalk", - "9": [ - "t_tree_blackjack", - "t_tree_walnut", - "t_tree_chestnut", - "t_tree_beech", - "t_tree_hazelnut", - "t_tree_cottonwood", - "t_tree", - "t_tree_elm", - "t_tree_dead", - "t_tree_apple", - "t_tree_pear", - "t_tree_cherry", - "t_tree_peach", - "t_tree_apricot", - "t_tree_plum", - "t_tree_mulberry", - "t_tree_elderberry", - "t_tree_pine", - "t_tree_birch", - "t_tree_willow", - "t_tree_maple", - "t_tree_hickory", - "t_tree_almond", - "t_tree_pecan" - ] + "9": [ "t_region_tree_shade", "t_region_tree_fruit" ] }, "furniture": { + "6": "f_console", + "a": "f_console_broken", "#": "f_table", "&": "f_trashcan", "C": "f_counter", @@ -85,7 +60,7 @@ "I": "f_desk", "S": "f_filing_cabinet", "U": [ "f_dumpster", "f_recycle_bin" ], - "d": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ], + "d": "f_region_weed", "y": [ "f_indoor_plant_y", "f_indoor_plant" ], "R": "f_sink", "@": "f_sofa" @@ -189,10 +164,9 @@ "+": "t_reinforced_door_glass_c", "-": "t_wall_glass", ".": "t_floor", - "6": "t_console", "D": "t_door_c", "P": "t_wall_glass", - "_": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + "_": [ [ "t_region_groundcover_urban", 8 ], "t_region_shrub_decorative" ], "d": "t_dirt", "p": "t_pavement", "s": "t_sidewalk", @@ -200,6 +174,7 @@ "4": "t_gutter_downspout" }, "furniture": { + "6": "f_console", "#": "f_table", "&": "f_trashcan", "C": "f_counter", diff --git a/data/json/mapgen/laundromat.json b/data/json/mapgen/laundromat.json index bd45dfd7d684c..10b291f557d46 100644 --- a/data/json/mapgen/laundromat.json +++ b/data/json/mapgen/laundromat.json @@ -39,7 +39,6 @@ ".": "t_linoleum_white", "=": "t_wall_glass", "A": "t_atm", - "C": "t_console_broken", "[": "t_door_glass_c", "_": "t_pavement", "l": "t_linoleum_gray", @@ -56,6 +55,7 @@ "&": "f_trashcan", "6": "f_arcade_machine", "B": "f_stool", + "C": "f_console_broken", "D": "f_dryer", "S": "f_sink", "T": "f_toilet", @@ -165,7 +165,7 @@ "sss4sssssssssss||||||||s" ], "terrain": { - " ": [ "t_grass", "t_grass", "t_dirt", "t_grass", "t_shrub", "t_tree_young" ], + " ": [ [ "t_region_groundcover_urban", 5 ], "t_region_shrub" ], "P": "t_floor", "p": "t_floor", ",": "t_floor", @@ -175,7 +175,6 @@ ".": "t_linoleum_white", "=": "t_wall_glass", "A": "t_atm", - "C": "t_console_broken", "[": "t_door_glass_c", "_": "t_pavement", "-": "t_pavement_y", @@ -183,10 +182,11 @@ "d": "t_sidewalk", "s": "t_sidewalk", "|": "t_wall_w", - "H": "t_grass", + "H": "t_region_groundcover_urban", "4": "t_gutter_downspout" }, "furniture": { + "C": "f_console_broken", "#": "f_counter", "}": "f_bookcase", "P": "f_desk", diff --git a/data/json/mapgen/lmoe.json b/data/json/mapgen/lmoe.json index dec22389704b9..6eb5181a128ce 100644 --- a/data/json/mapgen/lmoe.json +++ b/data/json/mapgen/lmoe.json @@ -156,7 +156,7 @@ "//3": "There are extensive secret rooms which might contain a lot of treasure in the non-looted version.", "weight": 100, "object": { - "fill_ter": "t_carpet_metal", + "fill_ter": "t_carpet_metal_purple", "rows": [ "##|||||#################", "##|,,<|||||||###########", diff --git a/data/json/mapgen/mall/mall_basement.json b/data/json/mapgen/mall/mall_basement.json index 3fa32164343a8..dc34e012da0d2 100644 --- a/data/json/mapgen/mall/mall_basement.json +++ b/data/json/mapgen/mall/mall_basement.json @@ -46,7 +46,7 @@ "#": "t_brick_wall", "*": "t_linoleum_gray", ",": "t_linoleum_white", - "6": "t_carpet_red", + "6": "t_carpet_concrete_red", ".": "t_rock", "{": "t_linoleum_gray", "Y": "t_linoleum_gray", diff --git a/data/json/mapgen/mall/mall_ground.json b/data/json/mapgen/mall/mall_ground.json index a4edc5fab150b..f544d9eda316e 100644 --- a/data/json/mapgen/mall/mall_ground.json +++ b/data/json/mapgen/mall/mall_ground.json @@ -90,7 +90,7 @@ [ "mall_a_10", "mall_a_11", "mall_a_12", "mall_a_13", "mall_a_14", "mall_a_15", "mall_a_16", "mall_a_17", "mall_a_18" ] ], "object": { - "fill_ter": "t_carpet_red", + "fill_ter": "t_carpet_concrete_red", "rows": [ "ւГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽1___________________________|PPPPP|________|....|j__=_t|__|ւււГГ˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽Гւ", "ւГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽|___________________________|||||||QQQQQQQQ|.,,.|j__||||__|||ւГГ˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽ГГ˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽˽Гւ", @@ -131,7 +131,7 @@ "t": "t_thconc_floor", "M": "t_thconc_floor", "1": "t_door_metal_locked", - "K": "t_carpet_yellow", + "K": "t_carpet_concrete_yellow", "%": "t_linoleum_gray", "u": "t_linoleum_gray", "*": "t_linoleum_gray", @@ -238,10 +238,10 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "@": "t_carpet_red", - "d": "t_carpet_red", - "B": "t_carpet_red", - "Y": "t_carpet_red", + "@": "t_carpet_concrete_red", + "d": "t_carpet_concrete_red", + "B": "t_carpet_concrete_red", + "Y": "t_carpet_concrete_red", "Q": "t_thconc_floor", "J": "t_thconc_floor", "z": "t_thconc_floor", @@ -350,17 +350,17 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "K": "t_carpet_green", - "M": "t_carpet_green", - "B": "t_carpet_green", - "!": "t_carpet_green", - "@": "t_carpet_green", - "y": "t_carpet_green", - "[": "t_carpet_yellow", - "Z": "t_carpet_yellow", - "S": "t_carpet_yellow", - "b": "t_carpet_yellow", - "a": "t_carpet_yellow", + "K": "t_carpet_concrete_green", + "M": "t_carpet_concrete_green", + "B": "t_carpet_concrete_green", + "!": "t_carpet_concrete_green", + "@": "t_carpet_concrete_green", + "y": "t_carpet_concrete_green", + "[": "t_carpet_concrete_yellow", + "Z": "t_carpet_concrete_yellow", + "S": "t_carpet_concrete_yellow", + "b": "t_carpet_concrete_yellow", + "a": "t_carpet_concrete_yellow", "Q": "t_thconc_floor", "J": "t_thconc_floor", "z": "t_thconc_floor", @@ -681,8 +681,8 @@ { "item": "mountable_cooler", "x": 33, "y": 20, "chance": 35 } ], "terrain": { - "(": "t_carpet_yellow", - ";": "t_carpet_purple", + "(": "t_carpet_concrete_yellow", + ";": "t_carpet_concrete_purple", "Q": "t_thconc_floor", "z": "t_thconc_floor", "t": "t_thconc_floor", @@ -841,9 +841,9 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "±": "t_carpet_red", - "Ŧ": "t_carpet_red", - "3": "t_carpet_red", + "±": "t_carpet_concrete_red", + "Ŧ": "t_carpet_concrete_red", + "3": "t_carpet_concrete_red", "Q": "t_thconc_floor", "z": "t_thconc_floor", "u": "t_thconc_floor", @@ -1026,8 +1026,8 @@ { "item": "craftrig", "x": 5, "y": 4, "chance": 35 } ], "terrain": { - "(": "t_carpet_yellow", - "3": "t_carpet_yellow", + "(": "t_carpet_concrete_yellow", + "3": "t_carpet_concrete_yellow", "Q": "t_thconc_floor", "z": "t_thconc_floor", "t": "t_thconc_floor", @@ -1164,13 +1164,13 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "w": "t_carpet_red", - ":": "t_carpet_red", - "R": "t_carpet_red", - "I": "t_carpet_red", - "C": "t_carpet_red", - "[": "t_carpet_red", - "Ʌ": "t_carpet_red", + "w": "t_carpet_concrete_red", + ":": "t_carpet_concrete_red", + "R": "t_carpet_concrete_red", + "I": "t_carpet_concrete_red", + "C": "t_carpet_concrete_red", + "[": "t_carpet_concrete_red", + "Ʌ": "t_carpet_concrete_red", "Q": "t_thconc_floor", "z": "t_thconc_floor", "A": "t_thconc_floor", @@ -1298,11 +1298,11 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "`": "t_carpet_red", - "I": "t_carpet_red", - "C": "t_carpet_red", - "[": "t_carpet_red", - "R": "t_carpet_yellow", + "`": "t_carpet_concrete_red", + "I": "t_carpet_concrete_red", + "C": "t_carpet_concrete_red", + "[": "t_carpet_concrete_red", + "R": "t_carpet_concrete_yellow", "Ħ": "t_linoleum_gray", "%": "t_linoleum_gray", "0": "t_linoleum_gray", @@ -1323,9 +1323,9 @@ "S": "t_thconc_floor", "V": "t_thconc_floor", "Q": "t_thconc_floor", - "Ʌ": "t_carpet_green", - "Ʉ": "t_carpet_green", - ":": "t_carpet_green" + "Ʌ": "t_carpet_concrete_green", + "Ʉ": "t_carpet_concrete_green", + ":": "t_carpet_concrete_green" }, "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_harvest" }, @@ -1456,13 +1456,13 @@ "*": "t_linoleum_gray", "%": "t_linoleum_gray", "u": "t_linoleum_gray", - "@": "t_carpet_yellow", - "ǝ": "t_carpet_yellow", - "Ʌ": "t_carpet_yellow", - "(": "t_carpet_green", - ")": "t_carpet_green", + "@": "t_carpet_concrete_yellow", + "ǝ": "t_carpet_concrete_yellow", + "Ʌ": "t_carpet_concrete_yellow", + "(": "t_carpet_concrete_green", + ")": "t_carpet_concrete_green", "1": "t_linoleum_white_no_roof", - "4": "t_carpet_red" + "4": "t_carpet_concrete_red" }, "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_harvest" } }, "furniture": { @@ -1581,14 +1581,14 @@ "terrain": { "3": "t_slot_machine", "Δ": "t_atm", - "R": "t_carpet_yellow", - "(": "t_carpet_yellow", - ")": "t_carpet_yellow", - "@": "t_carpet_red", - "V": "t_carpet_red", - "±": "t_carpet_red", - ";": "t_carpet_red", - "[": "t_carpet_red", + "R": "t_carpet_concrete_yellow", + "(": "t_carpet_concrete_yellow", + ")": "t_carpet_concrete_yellow", + "@": "t_carpet_concrete_red", + "V": "t_carpet_concrete_red", + "±": "t_carpet_concrete_red", + ";": "t_carpet_concrete_red", + "[": "t_carpet_concrete_red", "%": "t_linoleum_gray", "F": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -1617,9 +1617,9 @@ "P": "t_thconc_floor", "$": "t_thconc_floor", "t": "t_thconc_floor", - "Ʌ": "t_carpet_green", - "Ʉ": "t_carpet_green", - ":": "t_carpet_green" + "Ʌ": "t_carpet_concrete_green", + "Ʉ": "t_carpet_concrete_green", + ":": "t_carpet_concrete_green" }, "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_harvest" }, @@ -1767,10 +1767,10 @@ "*": "t_linoleum_gray", "%": "t_linoleum_gray", "u": "t_linoleum_gray", - "@": "t_carpet_yellow", - "ǝ": "t_carpet_yellow", - "Ʌ": "t_carpet_yellow", - ")": "t_carpet_green", + "@": "t_carpet_concrete_yellow", + "ǝ": "t_carpet_concrete_yellow", + "Ʌ": "t_carpet_concrete_yellow", + ")": "t_carpet_concrete_green", "Δ": "t_atm", "1": "t_linoleum_white_no_roof" }, @@ -1888,15 +1888,15 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "@": "t_carpet_yellow", - "ǝ": "t_carpet_yellow", - "C": "t_carpet_yellow", - "y": "t_carpet_red", - "V": "t_carpet_red", - "±": "t_carpet_red", - "♥": "t_carpet_red", - ";": "t_carpet_red", - "[": "t_carpet_red", + "@": "t_carpet_concrete_yellow", + "ǝ": "t_carpet_concrete_yellow", + "C": "t_carpet_concrete_yellow", + "y": "t_carpet_concrete_red", + "V": "t_carpet_concrete_red", + "±": "t_carpet_concrete_red", + "♥": "t_carpet_concrete_red", + ";": "t_carpet_concrete_red", + "[": "t_carpet_concrete_red", "%": "t_linoleum_gray", "&": "t_linoleum_gray" }, diff --git a/data/json/mapgen/mall/mall_second_floor.json b/data/json/mapgen/mall/mall_second_floor.json index 1bb2a89bcfacf..66da84c6b67a1 100644 --- a/data/json/mapgen/mall/mall_second_floor.json +++ b/data/json/mapgen/mall/mall_second_floor.json @@ -285,9 +285,9 @@ "I": "t_thconc_floor", "B": "t_thconc_floor", "w": "t_thconc_floor", - "0": "t_carpet_red", - "%": "t_carpet_purple", - "d": "t_carpet_purple" + "0": "t_carpet_concrete_red", + "%": "t_carpet_concrete_purple", + "d": "t_carpet_concrete_purple" }, "furniture": { "0": "f_piano", "%": [ "f_indoor_plant_y", "f_indoor_plant" ] }, "items": { @@ -339,11 +339,11 @@ "palettes": [ "mall_palette_2" ], "place_monsters": [ { "monster": "GROUP_MALL", "x": [ 3, 23 ], "y": [ 1, 13 ], "density": 0.4 } ], "terrain": { - "%": "t_carpet_purple", - "T": "t_carpet_purple", - "K": "t_carpet_purple", - "!": "t_carpet_purple", - "A": "t_carpet_purple", + "%": "t_carpet_concrete_purple", + "T": "t_carpet_concrete_purple", + "K": "t_carpet_concrete_purple", + "!": "t_carpet_concrete_purple", + "A": "t_carpet_concrete_purple", "z": "t_thconc_floor", "^": "t_thconc_floor", "t": "t_thconc_floor", @@ -511,15 +511,15 @@ "palettes": [ "mall_palette_2" ], "place_monsters": [ { "monster": "GROUP_MALL", "x": [ 3, 23 ], "y": [ 1, 23 ], "density": 0.4 } ], "terrain": { - "A": "t_carpet_yellow", - "B": "t_carpet_yellow", - "K": "t_carpet_yellow", - "J": "t_carpet_yellow", - "i": "t_carpet_green", - "j": "t_carpet_green", - "m": "t_carpet_green", - "~": "t_carpet_green", - "7": "t_carpet_green", + "A": "t_carpet_concrete_yellow", + "B": "t_carpet_concrete_yellow", + "K": "t_carpet_concrete_yellow", + "J": "t_carpet_concrete_yellow", + "i": "t_carpet_concrete_green", + "j": "t_carpet_concrete_green", + "m": "t_carpet_concrete_green", + "~": "t_carpet_concrete_green", + "7": "t_carpet_concrete_green", "^": "t_linoleum_gray", "U": "t_thconc_floor", "z": "t_thconc_floor", @@ -1048,7 +1048,7 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "V": "t_carpet_red", + "V": "t_carpet_concrete_red", "!": "t_floor", "T": "t_floor", "d": "t_floor", @@ -1144,7 +1144,14 @@ "S": "t_thconc_floor", "I": "t_thconc_floor" }, - "furniture": { "%": "f_counter", "*": "f_crate_c", "!": "f_beaded_door", "p": "f_desk", "]": "f_ergometer", "0": "f_exercise" }, + "furniture": { + "%": "f_counter", + "*": "f_crate_c", + "!": "f_beaded_door", + "p": "f_desk", + "]": [ "f_ergometer", "f_ergometer_mechanical" ], + "0": "f_exercise" + }, "items": { "K": { "item": "pottery", "chance": 30, "repeat": [ 2, 4 ] }, "J": { "item": "office", "chance": 20 }, @@ -1220,8 +1227,8 @@ "I": "t_thconc_floor" }, "furniture": { - "*": "f_treadmill", - "]": "f_ergometer", + "*": [ "f_treadmill", "f_treadmill_mechanical" ], + "]": [ "f_ergometer", "f_ergometer_mechanical" ], "!": "f_exercise", "&": "f_counter", "%": "f_shower", @@ -1395,14 +1402,14 @@ ], "palettes": [ "mall_palette_2" ], "terrain": { - "b": "t_carpet_yellow", - "M": "t_carpet_yellow", - "@": "t_carpet_yellow", - "!": "t_carpet_yellow", - "d": "t_carpet_yellow", - "K": "t_carpet_purple", - "%": "t_carpet_purple", - "A": "t_carpet_purple", + "b": "t_carpet_concrete_yellow", + "M": "t_carpet_concrete_yellow", + "@": "t_carpet_concrete_yellow", + "!": "t_carpet_concrete_yellow", + "d": "t_carpet_concrete_yellow", + "K": "t_carpet_concrete_purple", + "%": "t_carpet_concrete_purple", + "A": "t_carpet_concrete_purple", "F": "t_linoleum_white", "*": "t_linoleum_white", "Ŧ": "t_linoleum_white", @@ -1671,7 +1678,7 @@ "t": "t_thconc_floor", "j": "t_thconc_floor", ")": "t_floor", - "*": "t_carpet_yellow", + "*": "t_carpet_concrete_yellow", "A": "t_linoleum_white", "%": "t_linoleum_white", ":": "t_linoleum_white", @@ -1731,7 +1738,7 @@ ], "palettes": [ "mall_palette_2" ], "place_monsters": [ { "monster": "GROUP_MALL", "x": [ 3, 8 ], "y": [ 1, 23 ], "density": 0.4 } ], - "terrain": { "d": "t_floor", "K": "t_carpet_yellow", "V": "t_linoleum_gray" }, + "terrain": { "d": "t_floor", "K": "t_carpet_concrete_yellow", "V": "t_linoleum_gray" }, "items": { "Y": { "item": "trash", "chance": 30, "repeat": [ 2, 4 ] }, "d": [ @@ -1988,13 +1995,13 @@ ">": "t_stairs_down", "E": "t_elevator", "<": "t_stairs_up", - "B": "t_carpet_red", + "B": "t_carpet_concrete_red", ":": "t_linoleum_white", "&": "t_linoleum_white", - "I": "t_carpet_red", - "S": "t_carpet_red", - "C": "t_carpet_red", - "@": "t_carpet_red" + "I": "t_carpet_concrete_red", + "S": "t_carpet_concrete_red", + "C": "t_carpet_concrete_red", + "@": "t_carpet_concrete_red" }, "furniture": { "&": "f_table", ":": "f_bench" }, "items": { @@ -2039,9 +2046,9 @@ "palettes": [ "mall_palette_2" ], "terrain": { "<": "t_stairs_up", - "S": "t_carpet_red", - "B": "t_carpet_red", - "I": "t_carpet_red", + "S": "t_carpet_concrete_red", + "B": "t_carpet_concrete_red", + "I": "t_carpet_concrete_red", "z": "t_thconc_floor", ":": "t_linoleum_white", "*": "t_linoleum_white", diff --git a/data/json/mapgen/mansion.json b/data/json/mapgen/mansion.json index 3ffd26c58f182..4d5951c6db036 100644 --- a/data/json/mapgen/mansion.json +++ b/data/json/mapgen/mansion.json @@ -420,7 +420,7 @@ "########################" ], "palettes": [ "mansion_palette_common", "mansion_palette_basement" ], - "terrain": { "@": "t_carpet_red", "R": "t_carpet_red" }, + "terrain": { "@": "t_carpet_concrete_red", "R": "t_carpet_concrete_red" }, "furniture": { "$": [ "f_shackle", "f_null" ], "@": "f_mannequin" }, "items": { ".": { "item": "clutter_basement" }, diff --git a/data/json/mapgen/map_extras/nest_dermatik.json b/data/json/mapgen/map_extras/nest_dermatik.json index 69f38dd07ebc3..7642a7f4db450 100644 --- a/data/json/mapgen/map_extras/nest_dermatik.json +++ b/data/json/mapgen/map_extras/nest_dermatik.json @@ -1,42 +1,44 @@ -{ - "type": "mapgen", - "method": "json", - "update_mapgen_id": "mx_nest_dermatik", - "object": { - "rows": [ - " ", - " ", - " t ", - " ", - " t t ", - " t t---- ", - " ----:.-t ", - " t t---.:-..---t t ", - " -:-..---..--t ", - " ---.---.,---.- ", - " t-.--.,--...-.-- ", - " --...-.--.--. ", - " -..-,-.:-,-..-t t ", - " t --.:..-.-:.--- ", - " t---.,.-.---..- ", - " -.---.---..--- ", - " t --.---..---t ", - " t-...:---t t ", - " -----t ", - " t ", - " t ", - " t ", - " ", - " " - ], - "terrain": { - "t": [ "t_region_tree", "t_region_groundcover" ], - ",": [ "t_region_tree" ], - "-": [ "t_paper" ], - ".": [ "t_floor_paper" ], - ":": [ "t_floor_paper" ] - }, - "monster": { ":": { "monster": "mon_dermatik_larva" } }, - "place_monsters": [ { "monster": "GROUP_DERMATIK", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 0, 3 ], "density": 0.1 } ] +[ + { + "type": "mapgen", + "method": "json", + "update_mapgen_id": "mx_nest_dermatik", + "object": { + "rows": [ + " ", + " ", + " t ", + " ", + " t t ", + " t t---- ", + " ----:.-t ", + " t t---.:-..---t t ", + " -:-..---..--t ", + " ---.---.,---.- ", + " t-.--.,--...-.-- ", + " --...-.--.--. ", + " -..-,-.:-,-..-t t ", + " t --.:..-.-:.--- ", + " t---.,.-.---..- ", + " -.---.---..--- ", + " t --.---..---t ", + " t-...:---t t ", + " -----t ", + " t ", + " t ", + " t ", + " ", + " " + ], + "terrain": { + "t": [ "t_region_tree", "t_region_groundcover" ], + ",": [ "t_region_tree" ], + "-": [ "t_paper" ], + ".": [ "t_floor_paper" ], + ":": [ "t_floor_paper" ] + }, + "monster": { ":": { "monster": "mon_dermatik_larva" } }, + "place_monsters": [ { "monster": "GROUP_DERMATIK", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 0, 3 ], "density": 0.1 } ] + } } -} +] diff --git a/data/json/mapgen/map_extras/nest_wasp.json b/data/json/mapgen/map_extras/nest_wasp.json index b4e403ee0e19e..f3ffb4b03f4f6 100644 --- a/data/json/mapgen/map_extras/nest_wasp.json +++ b/data/json/mapgen/map_extras/nest_wasp.json @@ -1,40 +1,42 @@ -{ - "type": "mapgen", - "method": "json", - "update_mapgen_id": "mx_nest_wasp", - "object": { - "rows": [ - " ", - " ", - " t ", - " ", - " t t ", - " t t---- ", - " ----..-t ", - " t t---..-..---t t ", - " -.-..---..--t ", - " ---.---.,---.- ", - " t-.--.,--...-.-- ", - " --...-.--.--. ", - " -..-,-..-,-..-t t ", - " t --....-.-..--- ", - " t---.,.-.---..- ", - " -.---.---..--- ", - " t --.---..---t ", - " t-....---t t ", - " -----t ", - " t ", - " t ", - " t ", - " ", - " " - ], - "terrain": { - "t": [ "t_region_tree", "t_region_groundcover_swamp" ], - ",": [ "t_region_tree" ], - "-": [ "t_paper" ], - ".": [ "t_floor_paper" ] - }, - "place_monsters": [ { "monster": "GROUP_WASP", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 0, 3 ], "density": 0.1 } ] +[ + { + "type": "mapgen", + "method": "json", + "update_mapgen_id": "mx_nest_wasp", + "object": { + "rows": [ + " ", + " ", + " t ", + " ", + " t t ", + " t t---- ", + " ----..-t ", + " t t---..-..---t t ", + " -.-..---..--t ", + " ---.---.,---.- ", + " t-.--.,--...-.-- ", + " --...-.--.--. ", + " -..-,-..-,-..-t t ", + " t --....-.-..--- ", + " t---.,.-.---..- ", + " -.---.---..--- ", + " t --.---..---t ", + " t-....---t t ", + " -----t ", + " t ", + " t ", + " t ", + " ", + " " + ], + "terrain": { + "t": [ "t_region_tree", "t_region_groundcover_swamp" ], + ",": [ "t_region_tree" ], + "-": [ "t_paper" ], + ".": [ "t_floor_paper" ] + }, + "place_monsters": [ { "monster": "GROUP_WASP", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 0, 3 ], "density": 0.1 } ] + } } -} +] diff --git a/data/json/mapgen/megastore.json b/data/json/mapgen/megastore.json index 9bf37dfb18ade..73610490cbb8d 100644 --- a/data/json/mapgen/megastore.json +++ b/data/json/mapgen/megastore.json @@ -10,7 +10,7 @@ "^": "t_glass_roof", "1": "t_metal_railing", "%": "t_grate", - ",": "t_grass", + ",": "t_region_groundcover_urban", "-": "t_concrete_wall", "|": "t_concrete_wall", "+": "t_door_glass_c", @@ -23,10 +23,10 @@ "W": "t_sidewalk", "<": "t_stairs_up", ">": "t_stairs_down", - "6": "t_console_broken", "Y": "t_switchgear_s" }, "furniture": { + "6": "f_console_broken", "a": "f_armchair", "A": "f_sofa", "b": "f_bookcase", @@ -1989,7 +1989,7 @@ ], "rotation": 1, "palettes": [ "megastore" ], - "terrain": { "%": "t_machinery_heavy" } + "furniture": { "%": "f_machinery_heavy" } } }, { @@ -2256,6 +2256,7 @@ ], "rotation": 0, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ @@ -2308,6 +2309,7 @@ ], "rotation": 0, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ @@ -2360,6 +2362,7 @@ ], "rotation": 1, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ @@ -2412,6 +2415,7 @@ ], "rotation": 3, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 1, 22 ], "y": [ 1, 22 ] }, { "monster": "GROUP_SCHOOL", "x": [ 1, 22 ], "y": [ 1, 22 ], "chance": 20 } @@ -2467,6 +2471,7 @@ ], "rotation": [ 0, 3 ], "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 20 ], [ "roof_2x2_infrastructure_2", 20 ], [ "roof_2x2_utilities", 20 ] ], @@ -2512,6 +2517,7 @@ ], "rotation": 1, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ @@ -2563,6 +2569,7 @@ ], "rotation": 3, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ] ], @@ -2608,6 +2615,7 @@ ], "rotation": 2, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ @@ -2659,6 +2667,7 @@ ], "rotation": 2, "palettes": [ "megastore" ], + "terrain": { " ": "t_flat_roof" }, "place_nested": [ { "chunks": [ [ "null", 5 ], [ "roof_2x2_infrastructure", 80 ], [ "roof_2x2_infrastructure_2", 40 ], [ "roof_2x2_utilities", 40 ] ], diff --git a/data/json/mapgen/microlab/microlab_connector.json b/data/json/mapgen/microlab/microlab_connector.json index ea60aae01867b..180fe707cc3b6 100644 --- a/data/json/mapgen/microlab/microlab_connector.json +++ b/data/json/mapgen/microlab/microlab_connector.json @@ -227,7 +227,8 @@ " |||||| |||||||||||" ], "palettes": [ "microlab" ], - "terrain": { "p": "t_sewage_pipe", "w": "t_water_pool_shallow", "%": "t_machinery_heavy", "S": "t_sewage_pump" }, + "terrain": { "p": "t_sewage_pipe", "w": "t_water_pool_shallow", "S": "t_sewage_pump" }, + "furniture": { "%": "f_machinery_heavy" }, "items": { "l": { "item": "sewage_plant", "chance": 75 } } } }, diff --git a/data/json/mapgen/microlab/microlab_edge_room_connector.json b/data/json/mapgen/microlab/microlab_edge_room_connector.json new file mode 100644 index 0000000000000..53085fbbaa153 --- /dev/null +++ b/data/json/mapgen/microlab/microlab_edge_room_connector.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge_room_connector" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "|||||| PP PP PP ||||||", + " c|##| PP PP PP |##| ", + " 6|||| PP |||| PP ||||F ", + " F|XX= PP h PP =XX|F ", + " F|XX= PP |dd| PP =XX|F ", + "|||XX= PPPPPPPPPP =XX||2", + " F|XX= PPPPPPPPPP =XX|F ", + " F|XX======[[======XX|F ", + " F|XXXXXX=YPPY=XXXXXX|F ", + " |XXXXXX=YPPY=XXXXXX|F ", + "|||||||====[[====||||||2", + " 2YPPPPPPPPPPY2 ", + " 2YPPPPPPPPPPY2 ", + "||| |||===[[===||||2((|", + "cc= |XXX= PP =XXX|c ", + " [ |XXX= PP =XXX|c c ", + " = |XXX= PP =XXX|c c ", + "cc= |XXX= PP =XXX|c ", + "||| |XXX=YPPY=XXX||||||", + " c| ||||||PP||||||FFFFF", + " c| 2 c ", + " c| 2 c ", + " c|22|||||| ||||||c c ", + " |FFFF| |FFFF| " + ], + "palettes": [ "microlab" ], + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } + } + } +] diff --git a/data/json/mapgen/microlab/microlab_firebreak.json b/data/json/mapgen/microlab/microlab_firebreak.json index a9d2b5c74c7bf..197b232f9d0e1 100644 --- a/data/json/mapgen/microlab/microlab_firebreak.json +++ b/data/json/mapgen/microlab/microlab_firebreak.json @@ -33,7 +33,7 @@ "|||||| PP PP PP ||||||" ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" }, + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" }, "computers": { "6": { "name": "Security Terminal", @@ -78,7 +78,7 @@ "|||||| PP PP PP ||||||" ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" }, + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" }, "computers": { "6": { "name": "Security Terminal", @@ -124,7 +124,7 @@ ], "set": [ { "point": "bash", "x": [ 6, 18 ], "y": [ 6, 18 ], "repeat": [ 30, 100 ] } ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" }, + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" }, "monster": { "M": { "monster": "mon_mutant_experimental" }, "ü": { "monster": "mon_mutant_evolved" } }, "computers": { "6": { @@ -171,7 +171,7 @@ ], "set": [ { "point": "bash", "x": [ 6, 18 ], "y": [ 6, 18 ], "repeat": [ 30, 100 ] } ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" }, + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" }, "monster": { "M": { "monster": "mon_hunting_horror" }, "ü": { "monster": "mon_breather_hub" } }, "computers": { "6": { diff --git a/data/json/mapgen/microlab/microlab_hallway.json b/data/json/mapgen/microlab/microlab_hallway.json index 198528f756d77..12bb1d220293e 100644 --- a/data/json/mapgen/microlab/microlab_hallway.json +++ b/data/json/mapgen/microlab/microlab_hallway.json @@ -32,7 +32,7 @@ " | PP PP PP | " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -68,7 +68,7 @@ " F| PP PP PP | " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -104,7 +104,7 @@ " F| PP PP PP | " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -140,7 +140,7 @@ " | PP PP PP | " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -176,7 +176,7 @@ " | PP PP PP | " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } } ] diff --git a/data/json/mapgen/microlab/microlab_hallway_start.json b/data/json/mapgen/microlab/microlab_hallway_start.json index c7fc354ba001c..c06185287253e 100644 --- a/data/json/mapgen/microlab/microlab_hallway_start.json +++ b/data/json/mapgen/microlab/microlab_hallway_start.json @@ -32,7 +32,7 @@ " |FFFF| |FFFF| " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -68,7 +68,7 @@ " |FFFF| |FFFF| " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -104,7 +104,7 @@ " |FFFF| |FFFF| " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -140,7 +140,7 @@ " | | |FFFF| " ], "palettes": [ "microlab" ], - "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } } ] diff --git a/data/json/mapgen/microlab/microlab_isolated_stairs.json b/data/json/mapgen/microlab/microlab_isolated_stairs.json index 0083ca4ce8ec4..2b9b755088589 100644 --- a/data/json/mapgen/microlab/microlab_isolated_stairs.json +++ b/data/json/mapgen/microlab/microlab_isolated_stairs.json @@ -32,7 +32,7 @@ "########################" ], "palettes": [ "microlab" ], - "terrain": { "`": "t_open_air", "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "`": "t_open_air", "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { @@ -68,7 +68,12 @@ "########################" ], "palettes": [ "microlab" ], - "terrain": { "`": "t_open_air", "=": "t_metal_ventilation_shutter", "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { + "`": "t_open_air", + "=": "t_metal_ventilation_shutter", + "X": "t_region_shrub_decorative", + "P": "t_carpet_concrete_red" + } } }, { @@ -104,7 +109,12 @@ "########################" ], "palettes": [ "microlab" ], - "terrain": { "`": "t_open_air", "=": "t_metal_ventilation_shutter", "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { + "`": "t_open_air", + "=": "t_metal_ventilation_shutter", + "X": "t_region_shrub_decorative", + "P": "t_carpet_concrete_red" + } } }, { @@ -140,7 +150,7 @@ "########################" ], "palettes": [ "microlab" ], - "terrain": { "ó": "t_concrete", "`": "t_open_air", "X": "t_region_shrub_decorative", "P": "t_carpet_red" } + "terrain": { "ó": "t_concrete", "`": "t_open_air", "X": "t_region_shrub_decorative", "P": "t_carpet_concrete_red" } } }, { diff --git a/data/json/mapgen/microlab/microlab_reactor.json b/data/json/mapgen/microlab/microlab_reactor.json new file mode 100644 index 0000000000000..c68075f8e6209 --- /dev/null +++ b/data/json/mapgen/microlab/microlab_reactor.json @@ -0,0 +1,84 @@ +[ + { + "type": "mapgen", + "om_terrain": [ "microlab_reactor" ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "########################", + "########################", + "#######----------#######", + "######--````````--######", + "####---``````````---####", + "###--````gggggg````--###", + "###-`````ggAAgg`````-###", + "###-`````ggAAgg`````-###", + "###-`````gggggg`````-###", + "###-````````ggg`````-###", + "###--```````>g>````--###", + "####-((((((- --####", + "####-d6 6d -YYY --#####", + "####-Yh hY - --#----#", + "####- -222--##- ~-#", + "####- 6-YYY ----2--#", + "####- h6- -l b l-#", + "####- ^ 6-G55--l b l-#", + "####- ------ 2 l-#", + "####- ------(22(-------#", + "####- -- --######", + "####- 2 -######", + "####--- --#####", + "#####| |#####" + ], + "set": [ + { "square": "radiation", "amount": 1000, "x": 6, "y": 2, "x2": 17, "y2": 10 }, + { "square": "radiation", "amount": 1000, "x": 3, "y": 4, "x2": 20, "y2": 10 }, + { "square": "radiation", "amount": 100, "x": 11, "y": 11, "x2": 18, "y2": 13 }, + { "square": "radiation", "amount": 10000, "x": 9, "y": 5, "x2": 14, "y2": 8 } + ], + "palettes": [ "microlab" ], + "items": { "d": { "item": "cop_armory", "chance": 5 }, "l": { "item": "decontamination_room", "chance": 70 } }, + "terrain": { "-": "t_wall_metal", "`": "t_hole", "#": "t_rock", "G": "t_card_science", "g": "t_bridge", "A": "t_plut_generator" } + } + }, + { + "type": "mapgen", + "om_terrain": [ "microlab_reactor_b" ], + "method": "json", + "object": { + "rows": [ + "########################", + "########################", + "#######----------#######", + "######--wwwwwwww--######", + "####---wwwwwwwwww---####", + "###--wwww-gggg-wwww--###", + "###-wwwwwggAAggwwwww-###", + "###-wwwwwggAAggwwwww-###", + "###-wwwww-gggg-wwwww-###", + "###-wwwwwwwwgggwwwww-###", + "###--wwwwwww": "t_stairs_down", "<": "t_stairs_up", - "X": "t_card_military", - "x": "t_console_broken" + "X": "t_card_military" }, "furniture": { "d": "f_desk", @@ -146,7 +129,8 @@ "S": "f_sink", "6": "f_shower", "b": "f_bookcase", - "1": "f_speaker_cabinet" + "1": "f_speaker_cabinet", + "x": "f_console_broken" }, "items": { "r": { "item": "trash_cart", "chance": 50, "repeat": 2 }, @@ -227,16 +211,18 @@ "0": "t_reinforced_glass_shutter", "^": "t_elevator_control_off", "$": "t_elevator", - "x": "t_console_broken", + "%": "t_floor", + "x": "t_floor", "+": "t_door_metal_locked", "?": "t_door_metal_c_peep", "=": "t_door_locked", ">": "t_stairs_down", "<": "t_stairs_up", - "%": "t_machinery_electronic", "X": "t_card_military" }, "furniture": { + "%": "f_machinery_electronic", + "x": "f_console_broken", "d": "f_desk", "c": "f_chair", "a": "f_air_conditioner", @@ -323,7 +309,7 @@ "5": "t_floor", "6": "t_floor", "a": "t_floor", - "g": "t_generator_broken", + "g": "t_floor", "h": "t_switchgear_s", "i": "t_station_disc", "j": "t_current_trans", @@ -331,16 +317,24 @@ "0": "t_reinforced_glass_shutter_open", "^": "t_elevator_control_off", "$": "t_elevator", - "x": "t_console_broken", + "x": "t_floor", "+": "t_door_metal_locked", "?": "t_door_metal_c_peep", - "%": "t_machinery_electronic", + "%": "t_floor", ">": "t_stairs_down", "<": "t_stairs_up", "X": "t_mdoor_frame", "Y": "t_card_military" }, - "furniture": { "a": "f_air_conditioner", "5": "f_utility_shelf", "6": "f_locker", "4": "f_speaker_cabinet" }, + "furniture": { + "g": "f_generator_broken", + "%": "f_machinery_electronic", + "a": "f_air_conditioner", + "x": "f_console_broken", + "5": "f_utility_shelf", + "6": "f_locker", + "4": "f_speaker_cabinet" + }, "items": { "5": { "item": "radiation_meds", "chance": 60, "repeat": 2 }, "6": { "item": "radiation_equipment", "chance": 60 } }, "place_graffiti": [ { @@ -499,10 +493,17 @@ "Y": "t_card_military", "^": "t_elevator_control_off", "$": "t_elevator", - "x": "t_console_broken", - "%": "t_machinery_electronic" + "x": "t_rock_floor", + "%": "t_rock_floor" + }, + "furniture": { + "x": "f_console_broken", + "%": "f_machinery_electronic", + "1": "f_speaker_cabinet", + "4": "f_speaker_cabinet", + "a": "f_air_conditioner", + "c": "f_chair" }, - "furniture": { "1": "f_speaker_cabinet", "4": "f_speaker_cabinet", "a": "f_air_conditioner", "c": "f_chair" }, "computers": { "6": { "name": "Missile Controls", diff --git a/data/json/mapgen/movie_theater.json b/data/json/mapgen/movie_theater.json index 828860f9074b9..a12c43c19c6b2 100644 --- a/data/json/mapgen/movie_theater.json +++ b/data/json/mapgen/movie_theater.json @@ -248,16 +248,20 @@ "+": "t_door_metal_c", "D": "t_chaingate_l", "%": "t_chainfence", - "H": "t_generator_broken", "&": "t_flat_roof", "A": "t_flat_roof", ":": "t_flat_roof", "Y": "t_flat_roof", "X": "t_flat_roof", - "=": "t_flat_roof", - "p": "t_machinery_old" + "=": "t_flat_roof" + }, + "furniture": { + "H": "f_generator_broken", + "Y": "f_standing_tank", + "6": "f_water_heater", + "7": "f_roof_turbine_vent", + "p": "f_machinery_old" }, - "furniture": { "Y": "f_standing_tank", "6": "f_water_heater", "7": "f_roof_turbine_vent" }, "items": { "C": { "item": "snacks", "chance": 30, "repeat": [ 6, 12 ] } } } } diff --git a/data/json/mapgen/musicstore.json b/data/json/mapgen/musicstore.json index 1ffebf2a6edaf..059c4dbf07f6c 100644 --- a/data/json/mapgen/musicstore.json +++ b/data/json/mapgen/musicstore.json @@ -82,10 +82,10 @@ "d": "t_pavement", "s": "t_sidewalk", "z": "t_shrub", - "g": "t_carpet_green", - "h": "t_carpet_green", - "K": "t_carpet_green", - "7": "t_carpet_green", + "g": "t_carpet_concrete_green", + "h": "t_carpet_concrete_green", + "K": "t_carpet_concrete_green", + "7": "t_carpet_concrete_green", "<": "t_gutter_downspout", "|": "t_wall_b" }, diff --git a/data/json/mapgen/natural_spring.json b/data/json/mapgen/natural_spring.json index 3e208242b2781..193c047be64ad 100644 --- a/data/json/mapgen/natural_spring.json +++ b/data/json/mapgen/natural_spring.json @@ -1,62 +1,64 @@ -{ - "method": "json", - "object": { - "furniture": { - "#": "f_null", - ".": "f_null", - "4": "f_null", - "7": "f_null", - "_": "f_null", - "b": "f_boulder_small", - "f": "f_dandelion", - "i": "f_cattails", - "o": "f_boulder_small", - "s": "f_null", - "t": "f_null", - "w": "f_null" +[ + { + "method": "json", + "object": { + "furniture": { + "#": "f_null", + ".": "f_null", + "4": "f_null", + "7": "f_null", + "_": "f_null", + "b": "f_boulder_small", + "f": "f_dandelion", + "i": "f_cattails", + "o": "f_boulder_small", + "s": "f_null", + "t": "f_null", + "w": "f_null" + }, + "rows": [ + "._...#.._...._...._#..._", + ".#7............4..#.....", + "...._..._t..._##.._.7.._", + "__.##....#.7..###.....#.", + "...#4#._...._..#_.......", + "..._#....__._....#..4.#_", + "....._.._.__#4..._..._._", + ".4#..__..4.__#__._.._...", + "_.._...o_#_i__.4#..t.#..", + "_.....4#.__wi__#4#......", + "#..#_._.._www__.##..#...", + ".......#__www_.#...._4_#", + "..t#...4#__w__#4..__#...", + "__#.__...____b.##.......", + ".#.._.._#4#_#4#__._f..._", + ".....4...#t..#._........", + "......__._.._.._.4...#..", + ".....#_.#._4#_...._.#4..", + "#.#._._....#._..7__.s#.#", + "..7#......_.........._..", + "......#.4_...4_#..#.4.._", + ".._.._..#.._#....t......", + "..#............_.#......", + "_..._..#...__...._...#.." + ], + "terrain": { + "#": "t_underbrush", + ".": "t_grass", + "4": "t_tree_pine", + "7": "t_tree_maple", + "_": "t_dirt", + "b": "t_dirt", + "f": "t_grass", + "i": "t_dirt", + "o": "t_grass", + "s": "t_shrub_blueberry", + "t": "t_tree_dead", + "w": "t_water_sh" + } }, - "rows": [ - "._...#.._...._...._#..._", - ".#7............4..#.....", - "...._..._t..._##.._.7.._", - "__.##....#.7..###.....#.", - "...#4#._...._..#_.......", - "..._#....__._....#..4.#_", - "....._.._.__#4..._..._._", - ".4#..__..4.__#__._.._...", - "_.._...o_#_i__.4#..t.#..", - "_.....4#.__wi__#4#......", - "#..#_._.._www__.##..#...", - ".......#__www_.#...._4_#", - "..t#...4#__w__#4..__#...", - "__#.__...____b.##.......", - ".#.._.._#4#_#4#__._f..._", - ".....4...#t..#._........", - "......__._.._.._.4...#..", - ".....#_.#._4#_...._.#4..", - "#.#._._....#._..7__.s#.#", - "..7#......_.........._..", - "......#.4_...4_#..#.4.._", - ".._.._..#.._#....t......", - "..#............_.#......", - "_..._..#...__...._...#.." - ], - "terrain": { - "#": "t_underbrush", - ".": "t_grass", - "4": "t_tree_pine", - "7": "t_tree_maple", - "_": "t_dirt", - "b": "t_dirt", - "f": "t_grass", - "i": "t_dirt", - "o": "t_grass", - "s": "t_shrub_blueberry", - "t": "t_tree_dead", - "w": "t_water_sh" - } - }, - "om_terrain": "natural_spring", - "type": "mapgen", - "weight": 100 -} + "om_terrain": "natural_spring", + "type": "mapgen", + "weight": 100 + } +] diff --git a/data/json/mapgen/nested/basement_nested.json b/data/json/mapgen/nested/basement_nested.json index eed3e4d43c684..f00bf35ad6a8b 100644 --- a/data/json/mapgen/nested/basement_nested.json +++ b/data/json/mapgen/nested/basement_nested.json @@ -2760,7 +2760,13 @@ "O": "t_carpet_purple", "=": "t_carpet_purple" }, - "furniture": { "!": "f_ergometer", "@": "f_treadmill", "V": "f_exercise", "c": "f_bench", "B": "f_bigmirror" }, + "furniture": { + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], + "V": "f_exercise", + "c": "f_bench", + "B": "f_bigmirror" + }, "traps": { "=": "tr_rollmat" }, "nested": { "1": { "chunks": [ [ "5x5_sauna_N", 30 ], [ "5x5_pool", 10 ], [ "5x5_gym_N", 60 ] ] } } } @@ -2791,7 +2797,13 @@ "O": "t_carpet_green", "=": "t_carpet_green" }, - "furniture": { "!": "f_ergometer", "@": "f_treadmill", "V": "f_exercise", "c": "f_bench", "B": "f_bigmirror" }, + "furniture": { + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], + "V": "f_exercise", + "c": "f_bench", + "B": "f_bigmirror" + }, "traps": { "=": "tr_rollmat" }, "nested": { "1": { "chunks": [ [ "5x5_sauna_S", 30 ], [ "5x5_pool", 10 ], [ "5x5_gym_S", 60 ] ] } } } @@ -2822,7 +2834,13 @@ "O": "t_carpet_yellow", "=": "t_carpet_yellow" }, - "furniture": { "!": "f_ergometer", "@": "f_treadmill", "V": "f_exercise", "c": "f_bench", "B": "f_bigmirror" }, + "furniture": { + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], + "V": "f_exercise", + "c": "f_bench", + "B": "f_bigmirror" + }, "traps": { "=": "tr_rollmat" }, "nested": { "1": { "chunks": [ [ "5x5_sauna_E", 30 ], [ "5x5_pool", 10 ], [ "5x5_gym_E", 60 ] ] } } } @@ -2853,7 +2871,13 @@ "O": "t_carpet_red", "=": "t_carpet_red" }, - "furniture": { "!": "f_ergometer", "@": "f_treadmill", "V": "f_exercise", "c": "f_bench", "B": "f_bigmirror" }, + "furniture": { + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "@": [ "f_treadmill", "f_treadmill_mechanical" ], + "V": "f_exercise", + "c": "f_bench", + "B": "f_bigmirror" + }, "traps": { "=": "tr_rollmat" }, "nested": { "1": { "chunks": [ [ "5x5_sauna_W", 30 ], [ "5x5_pool", 10 ], [ "5x5_gym_W", 60 ] ] } } } diff --git a/data/json/mapgen/nested/retail_nested.json b/data/json/mapgen/nested/retail_nested.json index 48f3c48b02fe2..ea74288305067 100644 --- a/data/json/mapgen/nested/retail_nested.json +++ b/data/json/mapgen/nested/retail_nested.json @@ -18,8 +18,9 @@ " A ", " VVV " ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_table", "G": "f_table", @@ -88,8 +89,9 @@ " A ", " VVV " ], - "terrain": { " ": "t_floor", "L": "t_carpet_yellow", ".": "t_carpet_yellow", "?": "t_console_broken" }, + "terrain": { " ": "t_floor", "L": "t_carpet_yellow", ".": "t_carpet_yellow", "?": "t_carpet_yellow" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_table", "G": "f_table", @@ -156,9 +158,10 @@ "A": "t_linoleum_white", "y": "t_linoleum_white", "Y": "t_linoleum_white", - "?": "t_console_broken" + "?": "t_linoleum_white" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_table", "G": "f_table", @@ -225,9 +228,10 @@ "H": "t_carpet_green", "L": "t_carpet_green", ".": "t_carpet_green", - "?": "t_console_broken" + "?": "t_carpet_green" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_table", "G": "f_displaycase", @@ -290,8 +294,9 @@ " A ", "y MMMM Y" ], - "terrain": { " ": "t_floor", "G": "t_carpet_red", "L": "t_carpet_red", ".": "t_carpet_red", "?": "t_console_broken" }, + "terrain": { " ": "t_floor", "G": "t_carpet_red", "L": "t_carpet_red", ".": "t_carpet_red", "?": "t_carpet_red" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_table", "G": "f_displaycase", @@ -360,9 +365,10 @@ "L": "t_carpet_yellow", "B": "t_carpet_yellow", ".": "t_carpet_yellow", - "?": "t_console_broken" + "?": "t_carpet_yellow" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "B": "f_table", "H": "f_displaycase", @@ -447,9 +453,10 @@ "A": "t_linoleum_gray", "s": "t_linoleum_gray", "i": "t_linoleum_gray", - "?": "t_console_broken" + "?": "t_linoleum_gray" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "i": "f_oven", "s": "f_sink", @@ -520,8 +527,9 @@ " C QQVV ", "|| |||||" ], - "terrain": { " ": "t_floor", "?": "t_console_broken", "|": "t_brick_wall" }, + "terrain": { " ": "t_floor", "?": "t_floor", "|": "t_brick_wall" }, "furniture": { + "?": "f_console_broken", "A": "f_stool", "B": "f_counter", "C": "f_table", @@ -623,8 +631,9 @@ " b LLL ", "|| |||||" ], - "terrain": { " ": "t_floor", "?": "t_console_broken", "|": "t_brick_wall" }, + "terrain": { " ": "t_floor", "?": "t_floor", "|": "t_brick_wall" }, "furniture": { + "?": "f_console_broken", "A": "f_stool", "B": "f_counter", "C": "f_table", @@ -721,8 +730,16 @@ " ", "bb C" ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, - "furniture": { "A": "f_stool", "B": "f_workbench", "C": "f_rack_wood", "d": "f_mannequin", "e": "f_mannequin", "b": "f_bench" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, + "furniture": { + "?": "f_console_broken", + "A": "f_stool", + "B": "f_workbench", + "C": "f_rack_wood", + "d": "f_mannequin", + "e": "f_mannequin", + "b": "f_bench" + }, "items": { "C": [ { "item": "SUS_tailoring_materials", "chance": 30, "repeat": [ 1, 2 ] } ], "d": [ { "item": "SUS_mannequin_formal_mens", "chance": 30 } ], @@ -752,8 +769,9 @@ " b LLL ", "|| |||||" ], - "terrain": { " ": "t_floor", "?": "t_console_broken", "|": "t_brick_wall" }, + "terrain": { " ": "t_floor", "?": "t_floor", "|": "t_brick_wall" }, "furniture": { + "?": "f_console_broken", "A": "f_stool", "B": "f_counter", "C": "f_table", @@ -843,8 +861,16 @@ "A ", "BB C" ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, - "furniture": { "A": "f_stool", "B": "f_workbench", "C": "f_rack_wood", "d": "f_mannequin", "e": "f_mannequin", "b": "f_bench" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, + "furniture": { + "?": "f_console_broken", + "A": "f_stool", + "B": "f_workbench", + "C": "f_rack_wood", + "d": "f_mannequin", + "e": "f_mannequin", + "b": "f_bench" + }, "items": { "C": [ { "item": "SUS_tailoring_materials", "chance": 10, "repeat": [ 1, 2 ] }, @@ -881,8 +907,9 @@ " b QQQ ", "|| |||||" ], - "terrain": { " ": "t_floor", "?": "t_console_broken", "|": "t_brick_wall" }, + "terrain": { " ": "t_floor", "?": "t_floor", "|": "t_brick_wall" }, "furniture": { + "?": "f_console_broken", "A": "f_stool", "B": "f_counter", "C": "f_table", @@ -967,8 +994,16 @@ "A ", "BB C" ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, - "furniture": { "A": "f_stool", "B": "f_workbench", "C": "f_rack_wood", "d": "f_mannequin", "e": "f_mannequin", "b": "f_bench" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, + "furniture": { + "?": "f_console_broken", + "A": "f_stool", + "B": "f_workbench", + "C": "f_rack_wood", + "d": "f_mannequin", + "e": "f_mannequin", + "b": "f_bench" + }, "items": { "C": [ { "item": "SUS_tailoring_materials", "chance": 10, "repeat": [ 1, 2 ] }, @@ -997,8 +1032,9 @@ "B zz", "Cyz " ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, "furniture": { + "?": "f_console_broken", "A": "f_chair", "B": "f_desk", "C": "f_rack", @@ -1032,8 +1068,9 @@ " zz", "CDF " ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, "furniture": { + "?": "f_console_broken", "A": "f_chair", "B": "f_desk", "C": "f_rack", @@ -1067,8 +1104,9 @@ "G ", "ybb " ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor", "?": "t_floor" }, "furniture": { + "?": "f_console_broken", "G": "f_locker", "b": "f_bench", "d": "f_filing_cabinet", @@ -1096,14 +1134,15 @@ "G ", "y C " ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor" }, "furniture": { "C": "f_rack", "G": "f_sofa", "d": "f_filing_cabinet", "D": "f_vending_c", "F": "f_vending_c", - "y": [ "f_indoor_plant", "f_indoor_plant_y" ] + "y": [ "f_indoor_plant", "f_indoor_plant_y" ], + "?": "f_console_broken" }, "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } }, "items": { @@ -1126,8 +1165,9 @@ "BA ", "y GC" ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor" }, "furniture": { + "?": "f_console_broken", "A": "f_chair", "B": "f_desk", "C": "f_rack", @@ -1158,7 +1198,7 @@ "G b ", "yz CC" ], - "terrain": { " ": "t_floor", "?": "t_console_broken" }, + "terrain": { " ": "t_floor" }, "furniture": { "A": "f_chair", "B": "f_desk", @@ -1170,7 +1210,8 @@ "D": "f_vending_c", "F": "f_vending_c", "y": [ "f_indoor_plant", "f_indoor_plant_y" ], - "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ] + "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ], + "?": "f_console_broken" }, "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } }, "items": { @@ -1259,8 +1300,9 @@ "F * | ", "YPPQQSY| |j " ], - "terrain": { "?": "t_console_broken", "|": "t_brick_wall", "*": "t_door_c" }, + "terrain": { "|": "t_brick_wall", "*": "t_door_c" }, "furniture": { + "?": "f_console_broken", "L": "f_table", "H": "f_chair", "G": "f_sofa", diff --git a/data/json/mapgen/nested/shelter_nested.json b/data/json/mapgen/nested/shelter_nested.json index 382fffc85f165..61821048e0dc4 100644 --- a/data/json/mapgen/nested/shelter_nested.json +++ b/data/json/mapgen/nested/shelter_nested.json @@ -32,7 +32,7 @@ " " ], "terrain": { " ": "t_null" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, + "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan", "6": "f_console" }, "computers": { "6": { "name": "Evac shelter computer", @@ -81,10 +81,17 @@ "terrain": { ":": [ "t_window_frame", "t_window_no_curtains" ], "+": [ "t_door_c", "t_door_b" ], - "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ], - "x": "t_console_broken" + "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ] + }, + "furniture": { + "b": "f_bench", + "c": "f_cupboard", + "l": "f_locker", + "S": "f_sink", + "%": "f_trashcan", + "6": "f_console", + "x": "f_console_broken" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, "computers": { "6": { "name": "Evac shelter computer", @@ -143,10 +150,16 @@ "terrain": { ":": [ "t_window_frame", "t_window_no_curtains" ], "+": [ "t_door_c", "t_door_b" ], - "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ], - "6": "t_console_broken" + "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ] + }, + "furniture": { + "b": "f_bench", + "c": "f_cupboard", + "l": [ [ "f_locker", 2 ], "f_wreckage" ], + "S": "f_sink", + "%": "f_trashcan", + "6": "f_console_broken" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": [ [ "f_locker", 2 ], "f_wreckage" ], "S": "f_sink", "%": "f_trashcan" }, "items": { "l": { "item": "shelter_supplies", "chance": 40 }, "c": [ { "item": "trash", "chance": 1 }, { "item": "softdrugs", "chance": 2 }, { "item": "shelter_supplies", "chance": 10 } ], @@ -189,7 +202,7 @@ " " ], "terrain": { " ": "t_null" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, + "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan", "6": "f_console" }, "items": { "l": { "item": "SUS_evac_shelter_locker", "chance": 70 }, "c": { "item": "SUS_evac_shelter_cabinet", "chance": 50 } }, "computers": { "6": { @@ -236,12 +249,19 @@ " |||||:||+|:||||| " ], "terrain": { - "x": "t_console_broken", ":": [ "t_window_frame", "t_window" ], "+": [ "t_door_c", "t_door_b" ], "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ] }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, + "furniture": { + "x": "f_console_broken", + "b": "f_bench", + "c": "f_cupboard", + "l": "f_locker", + "S": "f_sink", + "%": "f_trashcan", + "6": "f_console" + }, "computers": { "6": { "name": "Evac shelter computer", @@ -296,10 +316,16 @@ "terrain": { ":": [ "t_window_frame", "t_window" ], "+": [ "t_door_c", "t_door_b" ], - "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ], - "6": "t_console_broken" + "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ] + }, + "furniture": { + "b": "f_bench", + "c": "f_cupboard", + "l": [ [ "f_locker", 2 ], "f_wreckage" ], + "S": "f_sink", + "%": "f_trashcan", + "6": "f_console_broken" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": [ [ "f_locker", 2 ], "f_wreckage" ], "S": "f_sink", "%": "f_trashcan" }, "items": { "l": { "item": "shelter_supplies", "chance": 40 }, "c": [ { "item": "trash", "chance": 1 }, { "item": "softdrugs", "chance": 2 }, { "item": "shelter_supplies", "chance": 10 } ], @@ -342,7 +368,7 @@ " " ], "terrain": { " ": "t_null" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, + "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan", "6": "f_console" }, "computers": { "6": { "name": "Evac shelter computer", @@ -392,10 +418,17 @@ ":": [ "t_window_frame", "t_window_no_curtains" ], "+": [ "t_door_c", "t_door_b" ], "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ], - "*": "t_ladder_up", - "x": "t_console_broken" + "*": "t_ladder_up" + }, + "furniture": { + "b": "f_bench", + "c": "f_cupboard", + "l": "f_locker", + "S": "f_sink", + "%": "f_trashcan", + "6": "f_console", + "x": "f_console_broken" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, "computers": { "6": { "name": "Evac shelter computer", @@ -455,11 +488,17 @@ ":": [ "t_window_frame", "t_window" ], "+": [ "t_door_c", "t_door_b" ], "=": [ "t_door_b", "t_door_locked_interior", "t_door_c", "t_door_o" ], - "*": "t_ladder_up", - "6": [ "t_console", "t_console_broken" ], - "x": "t_console_broken" + "*": "t_ladder_up" + }, + "furniture": { + "b": "f_bench", + "c": "f_cupboard", + "l": [ [ "f_locker", 2 ], "f_wreckage" ], + "S": "f_sink", + "%": "f_trashcan", + "6": [ "f_console", "f_console_broken" ], + "x": "f_console_broken" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": [ [ "f_locker", 2 ], "f_wreckage" ], "S": "f_sink", "%": "f_trashcan" }, "items": { "l": { "item": "shelter_supplies", "chance": 40 }, "c": [ { "item": "trash", "chance": 1 }, { "item": "softdrugs", "chance": 2 }, { "item": "shelter_supplies", "chance": 10 } ], diff --git a/data/json/mapgen/office_cubical.json b/data/json/mapgen/office_cubical.json index 336462507c51a..8b03ed245c8b8 100644 --- a/data/json/mapgen/office_cubical.json +++ b/data/json/mapgen/office_cubical.json @@ -33,14 +33,13 @@ "ssssssssssssssssssssssss" ], "terrain": { - " ": [ "t_grass", "t_grass", "t_dirt" ], - "$": "t_shrub", + " ": "t_region_groundcover_urban", + "$": "t_region_shrub_decorative", "+": "t_door_c", "-": "t_wall_w", "D": "t_door_locked", "s": "t_sidewalk", "w": "t_window", - "x": "t_console_broken", "|": "t_wall_w", "4": "t_gutter_downspout" }, @@ -55,7 +54,8 @@ "l": "f_locker", "n": "f_safe_l", "o": "f_bookcase", - "t": "f_table" + "t": "f_table", + "x": "f_console_broken" }, "vendingmachines": { "V": { } }, "toilets": { "T": { } }, @@ -163,15 +163,14 @@ " ##############ssssssss" ], "terrain": { - " ": [ "t_grass", "t_grass", "t_dirt" ], - "$": "t_shrub", + " ": "t_region_groundcover_urban", + "$": "t_region_shrub_decorative", "+": "t_door_c", "-": "t_wall_w", "D": "t_door_locked", "s": "t_sidewalk", "W": "t_window_domestic", "w": "t_window", - "x": "t_console_broken", "|": "t_wall_w", "#": "t_brick_wall", "R": "t_sidewalk", @@ -192,7 +191,8 @@ "l": "f_locker", "n": "f_safe_l", "o": "f_bookcase", - "t": "f_table" + "t": "f_table", + "x": "f_console_broken" }, "vendingmachines": { "V": { } }, "toilets": { "T": { } }, diff --git a/data/json/mapgen/outpost.json b/data/json/mapgen/outpost.json index eb38a164cfa65..d0bc4089fb65e 100644 --- a/data/json/mapgen/outpost.json +++ b/data/json/mapgen/outpost.json @@ -31,31 +31,17 @@ "|x xx x|", "|----------++----------|" ], + "fill_ter": "t_thconc_floor", "terrain": { - " ": [ "t_grass_dead", "t_grass", "t_grass_long", "t_dirt", "t_grass_tall" ], - "x": [ "t_grass_dead", "t_grass", "t_grass_long", "t_dirt", "t_grass_tall" ], - ".": "t_floor", - "!": "t_floor", - "&": "t_floor", - "1": "t_floor", - "l": "t_floor", - "c": "t_floor", - "t": "t_floor", - "r": "t_floor", - "L": "t_floor", - "b": "t_floor", - "S": "t_floor", - "T": "t_floor", - "C": "t_floor", - "X": "t_floor", + " ": "t_region_groundcover", + "x": "t_region_groundcover", "-": "t_chainfence", "|": "t_chainfence", "/": "t_concrete_wall", "+": "t_chaingate_l", "*": "t_door_c", "=": "t_door_locked", - ";": "t_door_metal_c", - "p": "t_plut_generator" + ";": "t_door_metal_c" }, "furniture": { "t": "f_table", @@ -69,7 +55,8 @@ "l": "f_locker", "L": "f_locker", "b": "f_bunkbed", - "T": "f_trashcan" + "T": "f_trashcan", + "p": "f_compact_ASRG_containment" }, "items": { "b": { "item": "army_bed", "chance": 60 }, @@ -191,33 +178,17 @@ "|x xx x|", "|----------++----------|" ], + "fill_ter": "t_thconc_floor", "terrain": { - " ": [ "t_grass_dead", "t_grass", "t_grass_long", "t_dirt", "t_grass_tall" ], - "x": [ "t_grass_dead", "t_grass", "t_grass_long", "t_dirt", "t_grass_tall" ], - ".": "t_floor", - "!": "t_floor", - "&": "t_floor", - "1": "t_floor", - "l": "t_floor", - "c": "t_floor", - "d": "t_floor", - "t": "t_floor", - "r": "t_floor", - "f": "t_floor", - "L": "t_floor", - "b": "t_floor", - "S": "t_floor", - "T": "t_floor", - "C": "t_floor", - "X": "t_floor", + " ": "t_region_groundcover", + "x": "t_region_groundcover", "-": "t_chainfence", "|": "t_chainfence", "/": "t_concrete_wall", "+": "t_chaingate_l", "*": "t_door_c", "=": "t_door_locked", - ";": "t_door_metal_c", - "p": "t_plut_generator" + ";": "t_door_metal_c" }, "furniture": { "t": "f_table", @@ -233,7 +204,8 @@ "b": "f_bunkbed", "d": "f_desk", "f": "f_fridge", - "T": "f_trashcan" + "T": "f_trashcan", + "p": "f_compact_ASRG_containment" }, "items": { "b": { "item": "army_bed", "chance": 60 }, diff --git a/data/json/mapgen/parking_garage.json b/data/json/mapgen/parking_garage.json index e9d743f0882c8..a46fdb514db2d 100644 --- a/data/json/mapgen/parking_garage.json +++ b/data/json/mapgen/parking_garage.json @@ -15,7 +15,7 @@ "'": "t_strconc_floor", "+": "t_door_c", "!": "t_door_metal_locked", - ".": [ [ "t_dirt", 5 ], [ "t_grass", 10 ], [ "t_grass_long", 7 ], [ "t_shrub", 1 ] ], + ".": [ [ "t_region_groundcover_urban", 25 ], [ "t_region_shrub", 1 ] ], "w": "t_window", "W": "t_reinforced_glass", "_": "t_pavement", @@ -31,7 +31,6 @@ "D": "t_strconc_floor", "c": "t_linoleum_white", "r": "t_linoleum_white", - "x": "t_console_broken", ">": "t_stairs_down", "<": "t_stairs_up", "I": "t_column", @@ -39,11 +38,19 @@ "g": "t_chaingate_l", "#": "t_rock", "*": "t_open_air", - "E": "t_elevator", - "@": "t_generator_broken", - "&": "t_machinery_heavy" + "E": "t_elevator" + }, + "furniture": { + "x": "f_console_broken", + "@": "f_generator_broken", + "&": "f_machinery_heavy", + "c": "f_counter", + "d": "f_desk", + "D": "f_dumpster", + "h": "f_chair", + "F": "f_filing_cabinet", + "%": "f_solar_unit" }, - "furniture": { "c": "f_counter", "d": "f_desk", "D": "f_dumpster", "h": "f_chair", "F": "f_filing_cabinet", "%": "f_solar_unit" }, "items": { "D": { "item": "office", "chance": 45, "repeat": [ 1, 2 ] }, "Y": { "item": "jackets", "chance": 55, "repeat": [ 1, 6 ] }, diff --git a/data/json/mapgen/pawn_shop.json b/data/json/mapgen/pawn_shop.json index 40bfe2f43a618..10a7e694ed484 100644 --- a/data/json/mapgen/pawn_shop.json +++ b/data/json/mapgen/pawn_shop.json @@ -33,7 +33,7 @@ "..............'U^^| sf f ss f s |^^>| | ", + " | |^^^@ssf3 f ss f sssss@^^^| | ", + " | |lll| sf3 f ss f s |lll| | ", + " | |---| sf3 f ss f s |---| | ", + " | sf3 3333 f ss f s | ", + " | sssssffffffffffHHffffffffffffffffffffffHHff ssssssss | ", + " | s f sssHssssssssssssssssssHssssf s | ", + " | |-@------------| ss |--RRR--------RRR--| ss |------------@-| | ", + " | |,,,,,,,,,,,lll| ss |,,,,,,,,,,,,,,,,,,| ss |lll,,,,,,,,,,,| | ", + " | |,,,,,htth,,,,l| ss |,,htth,,,,,,htth,,| ss |l,,,,htth,,,,,| | ", + " | |,,,,,htth,,,,l| ss R,,htth,,,,,,htth,,R ss |l,,,,htth,,,,,| | ", + " | |,,,,,htth,,,,l| ss R,,htth,,,,,,htth,,R ss |l,,,,htth,,,,,| | ", + " | |,,,,,,,,,,,lll| ss R,,htth,,,,,,htth,,R ss |lll,,,,,,,,,,,| | ", + " | |-G-ggggggg----| ss |,,,,,,,,,,,,,,,,,,| ss |---ggggggg--G-| | ", + " | |,,,,,,,,,,,,,,| ss |,,htth,,,,,,htth,,| ss |,,,,,,,,,,,,,,| | ", + " | R>,,,,,,,,,,,,,+ssss+,,htth,,,,,,htth,,+ssss+,,,,,,,,,,,,,>R | ", + " | R>,,,,,,,,,,,,,+ssss+,,htth,,,,,,htth,,+ssss+,,,,,,,,,,,,,>R | ", + " | |,,,,,,,,,,,,,,| ss |,,htth,,,,,,htth,,| ss |,,,,,,,,,,,,,,| | ", + " | |----|BGGB|----|fHHf|,,,,,,,,,,,,,,,,,,|fHHf|----|BGGB|----| | ", + " | |T,,,B,,,,B,,bb| ss |--ccccc--|--------| ss |T,,,B,,,,B,,bb| | ", + " | R,,,,Z,,,,Z,,,,R ss R,,,,,,,,,|zzzzzzzz| ss R,,,,Z,,,,Z,,,,R | ", + " | |bb,,B,,,,B,,,T| ss |,,ttttt,,|,,,,,,,,| ss |bb,,B,,,,B,,,T| | ", + " | |----|,,,,|----| sss+,,ttttt,,+,,,,,,,,| ss |----|,,,,|----| | ", + " | |T,,,B,,,,B,,bb| ss |,,,,,,,,,|,,,,,,,,| ss |T,,,B,,,,B,,bb| | ", + " | R,,,,Z,,,,Z,,,,R ss RSnnSceeee|zzzzzzzz| ss R,,,,G,,,,Z,,,,R | ", + " | |bb,,B,,,,B,,,T| ss |---------|--------| ss |bb,,B,,,,B,,,T| | ", + " | |----|,,,,|----| ss R,b,b,b,+<|W,W,W,W,R ss |----|,,,,|----| | ", + " | |T,,,B,,,,B,,bb| ss |,b,b,b,|-|,,,,,,,,| ss |T,,,B,,,,B,,bb| | ", + " | R,,,,Z,,,,Z,,,,R sss+,,,,,,,,m|,tttttt,+sss R,,,,Z,,,,Z,,,,R | ", + " | |bb,,B,,,,B,,,T| ss |,b,b,b,,m|,,,,,,,,| ss |bb,,B,,,,B,,,T| | ", + " | |----|,,,,|----| ss R,b,b,b,,m|D,D,D,D,R ss |----|,,,,|----| | ", + " | |T,,,B,,,,B,,bb| ss |---------|--------| ss |T,,,B,,,,B,,bb| | ", + " | R,,,,G,,,,Z,,,,R ss |,LLLLLL,C|o,,ooo,,| ss R,,,,Z,,,,Z,,,,R | ", + " | |bb,,B,,,,B,,,T| sss+,,,,,,,,C|o,,,,,,,+sss |bb,,B,,,,B,,,T| | ", + " | |----|,,,,|----|ffff|,,,CC,,hC|,,,,,,,,|ffff|----|,,,,|----| | ", + " | |T,,,B,,,,B,,bb| R,,,CC,,,C|th,,,,htR |T,,,B,,,,B,,bb| | ", + " | R,,,,Z,,,,G,,,,R R,,,CC,,,C|th,,,,htR R,,,,Z,,,,G,,,,R | ", + " | |bb,,B,,,,B,,,T| |,,,CC,,,C|,,,,,,,,| |bb,,B,,,,B,,,T| | ", + " | |----|,,,,|----| |,,,CC,,hC|th,,,,,,| |----|,,,,|----| | ", + " | |T,,,B,,,,B,,bb| R,,,,,,,,C|th,,,,htR |T,,,B,,,,B,,bb| | ", + " | R,,,,Z,,,,Z,,,,R R,h,,,h,,C|,,,hh,htR R,,,,Z,,,,G,,,,R | ", + " | |bb,,B,,,,B,,,T| |CCCCCCCCC|ooottooo| |bb,,B,,,,B,,,T| | ", + " | |----|----|----| |--RR-RR------RR---| |----|----|----| | ", + " | | ", + " | | ", + " | | ", + " | | ", + " |--------------------------------------------------------------------| ", " ", "########################################################################", "########################################################################", @@ -94,59 +94,59 @@ "########################################################################", "########################################################################", "########################################################################", + "#########################################################|--|###########", + "#########################################################|^>|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "#########################################################|^^|###########", + "########|-------------------------------------------------^^---|########", + "########|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|########", + "########|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|########", + "########|^^|-----------------------|^^|---------------------|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "########|^^|#######################|^^|#####################|^^|########", + "#######||^^|######################||^^|#####################|^^||#######", + "#######|P^^|######################|P^^|#####################|^^P|#######", + "#######|^^^|######################|^^^|#####################|^^^|#######", + "#######|424|######################|424|#####################|424|#######", + "#######|---|######################|---|#####################|---|#######", + "########################################################################", + "########################################################################", + "########################################################################", + "########################################################################", "########################################################################", "########################################################################", + "##############################|-----------|#############################", + "##############################|m,,,,>,,,,m|#############################", + "##############################|m,,,,,,,,,m|#############################", + "##############################|m,,,,,,,,,m|#############################", + "##############################|m,,,,,,,,,m|#############################", + "##############################|m,,,,,,,,,m|#############################", + "##############################|-----------|#############################", + "########################################################################", "########################################################################", "########################################################################", "########################################################################", "########################################################################", - "#############################################|----|------|----|#########", - "#############################################|T,,,|,,,,,,|,,bb|#########", - "#############################################|,,,,G,,,,,,G,,,,|#########", - "#############################################|bb,,|,,,,,,|,,,T|#########", - "################|----------------------------|----|,,,,,,|----|#########", - "################|,,,,,,,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,|,,bb|#########", - "################|,,,,,,,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,G,,,,|#########", - "################|,,|-------------------------|,,,,,,,,,,,|,,,T|#########", - "################|,,|#########################|----|,,,,,,|----|#########", - "################|,,|######|------------------|T,,,|,,,,,,|,,bb|#########", - "################|,,|######|,,,,,,,,,,,,,,,,,,|,,,,G,,,,,,G,,,,|#########", - "################|,,|######|,,,,,,,,,,,,,,,,,,|bb,,|,,,,,,|,,,T|#########", - "################|,,|######|,htth,,,,,,,,htth,|----|,,,,,,|----|#########", - "################|,,|######|,htth,,,,,,,,htth,|T,,,|,,,,,,|,,bb|#########", - "################|,,|######|,htth,,,,,,,,htth,|,,,,G,,,,,,G,,,,|#########", - "################|,,|######|,htth,O,,,,O,htth,|bb,,|,,,,,,|,,,T|#########", - "################|,,|######|,htth,,,,,,,,htth,|----|-|++|-|----|#########", - "###############||++|------|,,,,,,,,,,,,,,,,,,|######|,,|################", - "###############|i,,|,,,,,,|,,,,,,,,,,,,,,,,,,|######|,,|################", - "###############|,,,g,h,h,h|,htth,,,,,,,,htth,|######|,,|################", - "###############|,t,g,h,h,h|,htth,O,,,,O,htth,|######|,,|################", - "###############|,,,g,h,h,h|,htth,,,,,,,,htth,|######|,,|################", - "###############|r,,|,,,,,,|,htth,,,,,,,,htth,|######|,,|################", - "###############|r,,+,,,,,,|,htth,,,,,,,,htth,|######|,,|################", - "#######|-------|---|-|-++-|,,,,,,,,,,,,,,,,,,|----|#|,,|################", - "#######|WWWW,,WWWW,rr|,,,,B,,,,,,,,,,,,,,,,,,B,,,,|-|GG|################", - "#######|,,,,,,,,,,,,,c,,,,G,,,,,,,,,,,,,,,,,,G,,,,,,,,,|################", - "#######|,tt,tt,tt,,,,|,,,,G,,,,,,,,,,,,,,,,,,G,,,,,,,,,|################", - "#######|,,,,,,,,,,,,,+,,,,B,,,,,BBBBBBBB,,,,,B,,,,|-|GG|################", - "#######|DDDD,,DDDD,rr|-GG-|,,,,,BccxcccB,,,,,|-GG-|#|,,|################", - "#######|-------------|,,,,|,,,,,Bc,h,,cB,,,,,|,,,,|#|,,|################", - "#####################|,,,,|cccccBc,,,,,|--+--|,,,,|#|,,|################", - "#####################|,,,>|,,,,,Bc,rr,,G,,,,h|>,,,|#|,,|---|############", - "#####################|-+--|,,,,c|------|,,,,t|----|#|,,+,,,|############", - "#############|-------|,,,,,,,,,n|ccScSc|,,,,t|######|,,|yyy|############", - "#############|z,,,,,,+,,,,,,,,,n|,,,,,,+,,,,h|##|---|++|---|############", - "#############|z,,,,,,|eeeecSSc,c|l,,,,,|>,,,,|##|..........|############", - "#############|z,,z,,z|----------|l,,,,,|-----|##|..........|############", - "#############|z,,z,,z|##########|l,,,,,,,,,,,|##|...|--|...|############", - "#############|z,,z,,z|##########|l,,,,l|=|=|=|##|...|##|...|############", - "#############|z,,z,,z|##########|l,,,,l|T|T|T|##|...|##|...|############", - "#############|-------|##########|------|-|-|-|##|...|##|...|############", - "################################################|...|##|...|############", - "################################################|...|--|...|############", - "################################################|..........|############", - "################################################|..........|############", - "################################################|----------|############", "########################################################################", "########################################################################", "########################################################################", @@ -160,12 +160,17 @@ "########################################################################" ], "palettes": [ "prison_palette" ], - "place_items": [ - { "item": "prison_weapons", "x": [ 11, 12 ], "y": [ 1, 1 ], "chance": 30 }, - { "item": "prison_armor", "x": [ 11, 12 ], "y": [ 1, 1 ], "chance": 50 }, - { "item": "prison_weapons", "x": [ 11, 12 ], "y": [ 1, 1 ], "chance": 30 }, - { "item": "prison_armor", "x": [ 11, 12 ], "y": [ 1, 1 ], "chance": 40 } - ], + "terrain": { + "2": "t_concrete", + "4": "t_concrete", + "@": "t_door_metal_pickable", + "R": "t_window_bars", + "^": "t_concrete", + "P": "t_concrete", + "Y": "t_pavement_y", + "Z": "t_door_bar_o" + }, + "furniture": { "X": "f_exercise", "C": "f_counter", "P": "f_rack", "2": "f_home_furnace", "4": "f_water_heater", "L": "f_locker" }, "items": { "l": [ { "item": "prison_weapons", "chance": 30 }, @@ -173,25 +178,231 @@ { "item": "cop_torso", "chance": 20 }, { "item": "cop_pants", "chance": 20 }, { "item": "cop_shoes", "chance": 20 } - ] + ], + "C": [ { "item": "hand_tools", "chance": 40 } ], + "L": [ { "item": "hand_tools", "chance": 40 } ], + "P": [ { "item": "tools_plumbing", "chance": 100, "repeat": [ 1, 3 ] } ] }, - "place_item": [ { "item": "visions_solitude", "x": 16, "y": 108, "amount": 1 } ], + "liquids": { "4": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, "place_monsters": [ - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 15, 20 ], "y": [ 34, 37 ], "repeat": [ 1, 2 ], "density": 0.2 }, - { "monster": "GROUP_TURRET_RIOT", "x": [ 15, 20 ], "y": [ 39, 42 ], "density": 0.1 }, - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 15, 20 ], "y": [ 44, 37 ], "repeat": [ 1, 2 ], "density": 0.2 }, - { "monster": "GROUP_TURRET_RIOT", "x": [ 32, 39 ], "y": [ 39, 42 ], "density": 0.1 }, - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 51, 56 ], "y": [ 34, 37 ], "repeat": [ 1, 2 ], "density": 0.2 }, - { "monster": "GROUP_TURRET_RIOT", "x": [ 51, 56 ], "y": [ 39, 42 ], "density": 0.1 }, - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 51, 56 ], "y": [ 44, 37 ], "repeat": [ 1, 2 ], "density": 0.2 }, - { "monster": "GROUP_ROBOT_EYEBOT", "x": [ 24, 47 ], "y": [ 0, 13 ], "density": 0.1 }, - { "monster": "GROUP_ROBOT_EYEBOT", "x": [ 27, 44 ], "y": [ 52, 60 ], "density": 0.1 }, - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 27, 44 ], "y": [ 96, 113 ], "repeat": [ 1, 2 ], "density": 0.5 }, - { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 51, 56 ], "y": [ 87, 95 ], "repeat": [ 1, 2 ], "density": 0.2 }, - { "monster": "GROUP_ZOMBIE_COP", "x": [ 27, 44 ], "y": [ 24, 47 ], "density": 0.2 }, - { "monster": "GROUP_ZOMBIE_COP", "x": [ 35, 38 ], "y": [ 122, 127 ], "density": 0.2 } + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 15, 23 ], "y": [ 20, 23 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 14, 15 ], "y": [ 50, 55 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 58, 59 ], "y": [ 50, 55 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 29, 44 ], "y": [ 32, 40 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 29, 35 ], "y": [ 56, 63 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_PRISON", "x": [ 39, 44 ], "y": [ 87, 95 ], "density": 0.3 }, + { "monster": "GROUP_ZOMBIE_COP", "x": [ 54, 59 ], "y": [ 10, 15 ], "density": 0.2 }, + { "monster": "GROUP_ZOMBIE_COP", "x": [ 53, 64 ], "y": [ 32, 34 ], "density": 0.2 }, + { "monster": "GROUP_ZOMBIE_COP", "x": [ 9, 20 ], "y": [ 32, 34 ], "density": 0.2 } + ], + "place_monster": [ + { "monster": "mon_zombie_technician", "x": [ 8, 10 ], "y": [ 110, 115 ], "chance": 100 }, + { "monster": "mon_zombie_technician", "x": [ 33, 35 ], "y": [ 110, 115 ], "chance": 100 }, + { "monster": "mon_zombie_technician", "x": [ 57, 59 ], "y": [ 110, 115 ], "chance": 100 } ], - "place_vehicles": [ { "vehicle": "bus_prison", "x": 36, "y": 15, "chance": 25, "rotation": 270 } ] + "place_vehicles": [ { "vehicle": "bus_prison", "x": 8, "y": 12, "chance": 25, "rotation": 180 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "prison_1_2f_3", "prison_1_2f_2", "prison_1_2f_1" ], + [ "prison_1_2f_6", "prison_1_2f_5", "prison_1_2f_4" ], + [ "prison_1_2f_9", "prison_1_2f_8", "prison_1_2f_7" ] + ], + "weight": 250, + "object": { + "rows": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5444444444444444444444444444445A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1.............................1A", + "A|--------------------------------------------------------------------|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAA|^^^|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|^^^|AAAA|A", + "A|AAAA^<^^^AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA^^^<^AAAA|A", + "A|AAAA^^^^^AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA^^^^^AAAA|A", + "A|AAAA^^^^^AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA^^^^^AAAA|A", + "A|AAAA|^^^|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|^^^|AAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|A", + "A|AAAA|--------------|AAAA54444444444444444445AAAA|--------------|AAAA|A", + "A|AAAA|^6^6^6^^6^6^6^|AAAA1..................1AAAA|^6^6^6^^6^6^6^|AAAA|A", + "A|AAAA|^^^^^^^^^^^^^^|AAAA1..................1AAAA|^^^^^^^^^^^^^^|AAAA|A", + "A|AAAA|^^^^^^^^^^^^^^|AAAA1..................1AAAA|^^^^^^^^^^^^^^|AAAA|A", + "A|AAAA|^^^^^^^^^^^^^^|AAAA1..................1AAAA|^^^^^^^^^^^^^^|AAAA|A", + "A|AAAA|^S^S^^^^^^S^S^|AAAA1..................1AAAA|^S^S^^^^^^S^S^|AAAA|A", + "A|AAAA|------^^------|AAAA1..................1AAAA|------^^------|AAAA|A", + "A|AAAA|,,,,,,,,,,,,,,|AAAA1..................1AAAA|,,,,,,,,,,,,,,|AAAA|A", + "A|AAAAR<,,,,,,,,,,,,,RAAAA1..................1AAAAR,,,,,,,,,,,,,,,,,|##|..........|############", - "#############|z,,z,,z|----------|l,,,,,|-----|##|..........|############", - "#############|z,,z,,z|##########|l,,,,,,,,,,,|##|...|--|...|############", - "#############|z,,z,,z|##########|l,,,,l|=|=|=|##|...|##|...|############", - "#############|z,,z,,z|##########|l,,,,l|T|T|T|##|...|##|...|############", - "#############|-------|##########|-6LL--|-|-|-|##|...|##|...|############", - "##################################|,,|##########|...|##|...|############", - "##############--------------------|,,|##########|...|--|...|############", - "##############|R,R|b,T|b,T|b,T|b,T|,7|##########|..........|############", - "#######--------R,R|b,,|b,,|b,,|b,,|,,|##########|..........|############", - "#######|,,,,,,,,,R|,Z,|,Z,|,Z,|,Z,|,,|##########|----------|############", + "########################################################################", + "################################|------|################################", + "################################|,,>>,,|################################", + "################################|,,,,,,|################################", + "################################|,,,,,,|################################", + "################################|,,,,,,|################################", + "################################|,,,,,,|################################", + "################################|-6LL--|################################", + "##################################|,,|##################################", + "##############--------------------|,,|##################################", + "##############|R,R|b,T|b,T|b,T|b,T|,,|##################################", + "#######--------R,R|b,,|b,,|b,,|b,,|,,|##################################", + "#######|,,,,,,,,,R|,Z,|,Z,|,Z,|,Z,|,,|##################################", "#######|,,,,,,,,,,|,,,|,,,|,,,|,,,|,,|##################################", "#######|,,gggggg,,|BGB|BGB|BGB|BGB|,,|##################################", "#######|,,g,,,,g,,|,,,,,,,,,,,,,,,|,,|##################################", @@ -235,7 +446,9 @@ "6": "t_card_science", "7": "t_floor", "/": "t_floor", - "?": "t_floor" + "?": "t_floor", + "C": "t_floor", + "Z": "t_floor" }, "items": { "l": [ @@ -251,12 +464,7 @@ { "item": "mut_lab", "chance": 5 } ] }, - "place_monsters": [ { "monster": "GROUP_ZOMBIE_COP", "x": [ 35, 38 ], "y": [ 2, 7 ], "density": 0.2 } ], - "monster": { - "7": { "monster": "mon_turret_riot" }, - "Z": { "monster": "mon_zombie_prisoner" }, - "C": { "monster": "mon_broken_cyborg" } - } + "monster": { "Z": { "monster": "mon_zombie_prisoner" }, "C": { "monster": "mon_broken_cyborg" } } } }, { @@ -269,7 +477,7 @@ ], "weight": 250, "object": { - "fill_ter": "t_dirt", + "fill_ter": "t_region_groundcover_barren", "rows": [ "````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", "```````````````````````````ZZZZZZZZ!!{!!ZZZZZZZZZZZZ!!{!!ZZZ````````````````````````````````````````````````````````````", @@ -347,21 +555,18 @@ "palettes": [ "prison_palette" ], "terrain": { " ": [ - [ "t_grass", 20 ], - [ "t_grass_dead", 3 ], - [ "t_grass_tall", 5 ], - [ "t_grass_long", 3 ], - [ "t_dirt", 5 ], - [ "t_shrub", 2 ], - [ "t_tree", 1 ] + [ "t_region_groundcover_urban", 20 ], + [ "t_region_groundcover_barren", 5 ], + [ "t_region_shrub", 2 ], + [ "t_region_tree", 1 ] ], ".": [ "t_floor" ], - ":": [ "t_dirt" ], - "'": [ "t_dirt" ], + ":": [ "t_region_groundcover_barren" ], + "'": [ "t_region_groundcover_barren" ], ";": [ "t_trunk" ], "#": [ "t_sand" ], "~": [ "t_water_sh" ], - "*": [ "t_dirt" ], + "*": [ "t_region_groundcover_barren" ], "!": [ "t_dock" ], "{": [ "t_dock" ], "^": [ "t_concrete" ], @@ -382,7 +587,7 @@ "9": [ "t_concrete" ], "0": [ "t_floor" ], "q": [ "t_floor" ], - "a": [ "t_console" ], + "a": [ "t_floor" ], "A": [ "t_floor" ], "C": [ "t_floor" ], "f": [ "t_concrete" ], @@ -409,6 +614,7 @@ "/": [ "t_gutter_downspout" ] }, "furniture": { + "a": [ "f_console" ], "q": [ "f_trashcan" ], "y": [ "f_locker" ], "A": [ "f_sofa" ], diff --git a/data/json/mapgen/public_works.json b/data/json/mapgen/public_works.json index 61d847d79c0d7..63d332e89dbf3 100644 --- a/data/json/mapgen/public_works.json +++ b/data/json/mapgen/public_works.json @@ -57,13 +57,12 @@ " ________________________sss " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "$": "t_shrub", + " ": "t_region_groundcover_urban", + "$": "t_region_shrub", "+": "t_door_c", ",": "t_pavement_y", "-": "t_wall_w", ".": "t_floor", - "6": "t_console", "=": "t_door_locked", "D": "t_door_locked_alarm", "F": "t_chainfence_h", @@ -74,11 +73,12 @@ "g": "t_chaingate_l", "s": "t_sidewalk", "w": "t_window", - "x": "t_console_broken", "|": "t_wall_w", "4": "t_gutter_downspout" }, "furniture": { + "x": "f_console_broken", + "6": "f_console", "C": "f_crate_c", "P": "f_pool_table", "S": "f_sink", diff --git a/data/json/mapgen/pump_station.json b/data/json/mapgen/pump_station.json index fff545c49d312..73196bf1bd7d7 100644 --- a/data/json/mapgen/pump_station.json +++ b/data/json/mapgen/pump_station.json @@ -42,7 +42,6 @@ "-": "t_wall_w", ".": "t_grass", "3": "t_recycler", - "6": "t_console_broken", ";": "t_door_locked", "_": "t_pavement", "s": "t_sidewalk", @@ -53,6 +52,7 @@ "9": "t_gutter_downspout" }, "furniture": { + "6": "f_console_broken", "L": "f_locker", "P": "f_indoor_plant", "c": "f_counter", @@ -181,8 +181,7 @@ "terrain": { "*": "t_door_bar_locked", "-": "t_wall_w", - ".": "t_grass", - "1": "t_generator_broken", + ".": "t_region_groundcover", "2": "t_sewage_pipe", "4": "t_water_pump", "7": "t_chainfence_h", @@ -194,7 +193,7 @@ "}": "t_manhole_cover", "<": "t_ladder_up" }, - "furniture": { "L": "f_locker", "r": "f_rack", "z": "f_crate_c" }, + "furniture": { "1": "f_generator_broken", "L": "f_locker", "r": "f_rack", "z": "f_crate_c" }, "place_loot": [ { "group": "home_hw", "x": [ 10, 11 ], "y": [ 13, 13 ], "chance": 75, "repeat": [ 1, 3 ] }, { "group": "sewage_plant", "x": [ 4, 5 ], "y": [ 0, 2 ], "chance": 70, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/regional_airport.json b/data/json/mapgen/regional_airport.json index b706765697cdc..3d8e211848626 100644 --- a/data/json/mapgen/regional_airport.json +++ b/data/json/mapgen/regional_airport.json @@ -248,7 +248,7 @@ "************************" ], "palettes": [ "airport_palette" ], - "place_terrain": [ { "ter": "t_gas_tank", "x": 13, "y": 4 } ], + "place_furniture": [ { "furn": "f_gas_tank", "x": 13, "y": 4 } ], "place_liquids": [ { "liquid": "avgas", "x": 13, "y": 4, "repeat": [ 100, 500 ] } ], "gaspumps": { "J": { } }, "place_monsters": [ { "monster": "GROUP_SMALL_STATION", "x": [ 4, 23 ], "y": [ 5, 23 ], "density": 0.05 } ], @@ -753,56 +753,19 @@ "o": "t_linoleum_white", "C": "t_linoleum_white", "y": "t_linoleum_white", - " ": [ [ "t_dirt", 5 ], [ "t_grass", 15 ], [ "t_grass_long", 5 ] ], - "x": "t_console_broken", + " ": "t_region_groundcover_urban", ",": "t_pavement_y", "_": "t_pavement", "#": "t_brick_wall", - "7": [ [ "t_tree", 10 ], [ "t_tree_pine", 2 ], [ "t_tree_willow", 1 ], [ "t_tree_maple", 1 ], [ "t_tree_hickory", 1 ] ], - "Q": [ - "t_shrub", - "t_shrub_rose", - "t_shrub_lilac", - "t_tree_young", - "t_grass_tall", - "t_grass_long", - "t_underbrush", - "t_moss", - "t_trunk", - "t_shrub_hydrangea", - "t_shrub_raspberry" - ], - "%": [ - [ "t_dirt", 760 ], - [ "t_grass", 2480 ], - [ "t_grass_long", 760 ], - [ "t_underbrush", 500 ], - [ "t_shrub", 1600 ], - [ "t_grass_tall", 500 ], - [ "t_tree", 10 ], - [ "t_tree_willow", 5 ], - [ "t_tree_birch", 5 ], - [ "t_tree_maple", 5 ], - [ "t_tree_pine", 5 ] - ], - "/": [ - [ "t_dirt", 1520 ], - [ "t_grass", 4960 ], - [ "t_grass_long", 1520 ], - [ "t_underbrush", 500 ], - [ "t_shrub", 1600 ], - [ "t_grass_tall", 500 ], - [ "t_tree", 10 ], - [ "t_tree_willow", 5 ], - [ "t_tree_birch", 5 ], - [ "t_tree_maple", 5 ], - [ "t_tree_pine", 5 ] - ], + "7": "t_region_tree_shade", + "Q": [ "t_region_groundcover_forest", "t_region_shrub_decorative" ], + "%": [ [ "t_region_groundcover", 450 ], [ "t_region_tree_shade", 3 ], [ "t_region_shrub", 210 ] ], + "/": [ [ "t_region_groundcover", 850 ], [ "t_region_tree_shade", 3 ], [ "t_region_shrub", 210 ] ], "+": "t_door_c", "=": "t_door_locked", "R": "t_metal_railing", "s": "t_concrete", - "J": "t_dirt", + "J": "t_region_groundcover_barren", "D": "t_concrete", "V": "t_wall_glass", "v": "t_door_glass_c", @@ -820,11 +783,10 @@ "3": "t_gutter_south", "4": "t_gutter_west", "5": "t_gutter_drop", - "X": "t_generator_broken", - "N": [ "t_machinery_heavy", "t_machinery_electronic", "t_machinery_light" ], "6": "t_radio_tower" }, "furniture": { + "x": "f_console_broken", "?": "f_sofa", "M": "f_armchair", "b": "f_bench", @@ -848,6 +810,8 @@ "O": "f_crate_c", "a": "f_trashcan", "F": "f_filing_cabinet", + "N": [ "f_machinery_heavy", "f_machinery_electronic", "f_machinery_light" ], + "X": "f_generator_broken", "y": "f_locker", ")": "f_cellphone_booster", "(": "f_small_satelitte_dish", diff --git a/data/json/mapgen/restaurant.json b/data/json/mapgen/restaurant.json index 3c877d7ef31e7..b2153ca3b6960 100644 --- a/data/json/mapgen/restaurant.json +++ b/data/json/mapgen/restaurant.json @@ -203,7 +203,6 @@ ",": "t_pavement_y", "-": "t_wall_y", ".": "t_carpet_green", - "@": "t_console_broken", "C": "t_curtains", "D": "t_door_locked", "F": "t_linoleum_white", @@ -214,7 +213,7 @@ "S": "t_linoleum_white", "W": "t_window", "_": "t_pavement", - "b": "t_shrub", + "b": "t_region_shrub", "d": "t_pavement", "f": "t_floor", "g": "t_wall_glass", @@ -223,11 +222,12 @@ "w": "t_linoleum_white", "{": "t_linoleum_white", "4": "t_gutter_downspout", - "6": "t_tree_willow", - " ": "t_grass_long", + "6": "t_region_tree_shade", + " ": "t_region_groundcover_urban", "|": "t_wall_y" }, "furniture": { + "@": "f_console_broken", "#": "f_counter", "2": "f_counter", "&": "f_trashcan", diff --git a/data/json/mapgen/restaurant_fast.json b/data/json/mapgen/restaurant_fast.json index 0a7ca0dbebb14..752dbd72ac6ee 100644 --- a/data/json/mapgen/restaurant_fast.json +++ b/data/json/mapgen/restaurant_fast.json @@ -39,9 +39,9 @@ { "line": "trap", "id": "tr_beartrap", "x": 14, "x2": 16, "y": 13, "y2": 13, "chance": 10 } ], "terrain": { - " ": "t_grass", - "d": "t_dirt", - "#": "t_shrub", + " ": "t_region_groundcover_urban", + "d": "t_region_groundcover_barren", + "#": "t_region_shrub", "%": "t_wall_glass", "+": "t_door_glass_c", ",": "t_pavement_y", @@ -61,11 +61,11 @@ "s": "t_sidewalk", "t": "t_door_c", "w": "t_linoleum_white", - "x": "t_console_broken", "4": "t_gutter_downspout", "|": "t_wall_w" }, "furniture": { + "x": "f_console_broken", "H": "f_chair", "O": "f_woodstove", "S": "f_sink", @@ -193,8 +193,8 @@ " !!!!!! " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_dirt", "t_shrub" ], - "#": "t_shrub", + " ": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub_decorative" ], + "#": "t_region_shrub_decorative", "%": "t_wall_glass", "+": "t_door_glass_c", ",": "t_pavement_y", @@ -218,11 +218,11 @@ "D": "t_door_locked", "t": "t_door_c", "w": "t_linoleum_white", - "x": "t_console_broken", "4": "t_gutter_downspout", "|": "t_wall_w" }, "furniture": { + "x": "f_console_broken", "H": "f_chair", "F": "f_arcade_machine", "S": "f_sink", diff --git a/data/json/mapgen/river_shipwreck.json b/data/json/mapgen/river_shipwreck.json index 57ab3e4115773..2d455053ffeb2 100644 --- a/data/json/mapgen/river_shipwreck.json +++ b/data/json/mapgen/river_shipwreck.json @@ -30,28 +30,19 @@ "........................", "........................" ], + "fill_ter": "t_metal_floor", "terrain": { " ": "t_metal_floor", "#": "t_dirt", "+": "t_door_metal_c", "-": "t_wall_metal", - ".": [ - "t_water_sh", - { "ter": "t_water_sh" }, - { "ter": "t_dirt" }, - { "ter": "t_grass" }, - { "ter": "t_dirt" }, - { "ter": "t_dirtmound" } - ], + ".": [ "t_water_sh", [ "t_region_groundcover", 2 ] ], "3": "t_window_frame", - "6": "t_machinery_light", "C": "t_dirtmound", "c": "t_guardrail_bg_dp", - "e": "t_machinery_heavy", - "r": "t_console_broken", "~": "t_water_sh" }, - "furniture": { "#": "f_wreckage" }, + "furniture": { "#": "f_wreckage", "6": "f_machinery_light", "e": "f_machinery_heavy", "r": "f_console_broken" }, "items": { "D": { "item": "office", "chance": 70 } }, "place_monsters": [ { "monster": "GROUP_RAZORCLAW", "x": [ 2, 21 ], "y": [ 2, 21 ], "density": 0.4 } ] } @@ -87,25 +78,18 @@ "........................", "........................" ], + "fill_ter": "t_metal_floor", "terrain": { " ": "t_metal_floor", "#": "t_dirt", "+": "t_door_metal_c", "-": "t_wall_metal", - ".": [ - "t_water_sh", - { "ter": "t_water_sh" }, - { "ter": "t_dirt" }, - { "ter": "t_grass" }, - { "ter": "t_dirt" }, - { "ter": "t_dirtmound" } - ], + ".": [ "t_water_sh", [ "t_region_groundcover", 2 ] ], ">": "t_stairs_down", - "A": "t_metal_floor", "C": "t_dirtmound", "~": "t_water_sh" }, - "furniture": { "#": "f_wreckage", "A": "f_safe_l" }, + "furniture": { "#": "f_wreckage", "6": "f_machinery_light", "e": "f_machinery_heavy", "r": "f_console_broken", "A": "f_safe_l" }, "place_loot": [ { "group": "guns_pistol_rare", "x": 0, "y": 9, "chance": 70, "ammo": 95, "magazine": 100 } ], "place_monsters": [ { "monster": "GROUP_RAZORCLAW", "x": [ 2, 21 ], "y": [ 2, 21 ], "density": 0.4 } ] } @@ -141,19 +125,22 @@ "........................", "........................" ], + "fill_ter": "t_metal_floor", "terrain": { " ": "t_metal_floor", - "#": "t_metal_floor", "+": "t_door_metal_c", "-": "t_wall_metal", ".": "t_rock", - "6": "t_machinery_light", "C": "t_dirtmound", - "R": "t_plut_generator", - "e": "t_machinery_heavy", "~": "t_water_sh" }, - "furniture": { "#": "f_wreckage" }, + "furniture": { + "6": "f_machinery_light", + "e": "f_machinery_heavy", + "r": "f_console_broken", + "R": "f_compact_ASRG_containment", + "#": "f_wreckage" + }, "items": { "C": { "item": "razorclaw_nest", "chance": 80 } }, "place_monsters": [ { "monster": "GROUP_RAZORCLAW", "x": [ 12, 21 ], "y": [ 9, 13 ], "density": 0.2 } ], "place_monster": [ { "monster": "mon_alpha_razorclaw", "x": 13, "y": 11 } ] @@ -190,21 +177,24 @@ "........................", "........................" ], + "fill_ter": "t_metal_floor", "terrain": { " ": "t_metal_floor", - "#": "t_metal_floor", "+": "t_door_metal_c", "-": "t_wall_metal", ".": "t_rock", - "6": "t_machinery_light", - "9": "t_metal_floor", "<": "t_stairs_up", - "A": "t_metal_floor", "C": "t_dirtmound", - "e": "t_machinery_heavy", "~": "t_water_sh" }, - "furniture": { "#": "f_wreckage", "9": "f_locker", "A": "f_standing_tank" }, + "furniture": { + "6": "f_machinery_light", + "e": "f_machinery_heavy", + "r": "f_console_broken", + "9": "f_locker", + "A": "f_standing_tank", + "#": "f_wreckage" + }, "items": { "9": { "item": "hardware_plumbing", "chance": 90 }, "C": { "item": "razorclaw_nest", "chance": 70 } }, "place_monsters": [ { "monster": "GROUP_RAZORCLAW", "x": [ 0, 9 ], "y": [ 9, 13 ], "density": 0.05 } ] } diff --git a/data/json/mapgen/robofachq_static.json b/data/json/mapgen/robofachq_static.json index 3c7ca357af165..f46a4463a6431 100644 --- a/data/json/mapgen/robofachq_static.json +++ b/data/json/mapgen/robofachq_static.json @@ -121,13 +121,13 @@ "fill_ter": "t_thconc_floor", "rows": [ "############################################| |############################################", - "########|||||||||||||||||||||||||#|||||||||||||22|||############################################", + "########|||||||||||||||||||||||||#|||||||||||||55|||############################################", "########|k ht|A h ^|#|lll|lllll| YY |############################################", "########|i k k htth ht| Cd6ddC |#|bYb|bYbYb|T YY T|########||||||||############################", "########|k o k htth ht| CCCCCC |#|b b|b b b|| YY ||######||=A6666A=||##########################", "########| W ^|^ h ^|#|l l|l l l| YY |######|,=Y Y=,|##########################", "########|FFFF| htth ?||||[[||||||l l|l l l|T YY T|######|,= htth =,|##########################", - "########|||||| htth ?||^^ ^^|| |||22||||||||||,= htth =,|##########################", + "########|||||| htth ?||^^ ^^|| |||55||||||||||,= htth =,|##########################", "########|ffff| 2 YY 2Y bbb bbbb| |L | i|,= htth =,|##########################", "########| |^??t t??^| ,, ||||||||||||| |LY2 Y;|,= htth =,|##########################", "###||||||hd ||||||||||| ,, 2 r r r| d( Y b|||||2||,= htth =,|##########################", @@ -179,11 +179,10 @@ "E": "t_elevator_control", "Y": "t_thconc_floor_olight", "#": "t_rock", - "6": "t_console", "R": "t_railing", "W": "t_water_dispenser" }, - "furniture": { ":": "f_server", "K": "f_counter", "H": "f_armchair", "L": "f_locker", "f": "f_filing_cabinet" }, + "furniture": { "6": "f_console", ":": "f_server", "K": "f_counter", "H": "f_armchair", "L": "f_locker", "f": "f_filing_cabinet" }, "item": { "A": { "item": "american_flag" } }, "items": { "F": { "item": "fridge", "chance": 80 }, @@ -211,7 +210,7 @@ { "item": "lab_bookshelves", "chance": 55, "repeat": [ 1, 3 ] } ] }, - "monster": { "T": { "monster": "mon_turret_rifle" } }, + "monster": { "T": { "monster": "mon_robofac_laserturret_mk1" } }, "npcs": { "G": { "class": "hub_security" }, "Q": { "class": "hub_security_head" } } } }, @@ -284,18 +283,18 @@ "E": "t_elevator_control", "Y": "t_thconc_floor_olight", "#": "t_rock", - "6": "t_console", "R": "t_railing", "W": "t_water_dispenser" }, "furniture": { + "6": "f_console", "K": "f_counter", "M": "f_counter", "S": "f_table", "A": "f_canvas_wall", "%": "f_canvas_door", - "E": "f_ergometer", - "T": "f_treadmill", + "E": [ "f_ergometer", "f_ergometer_mechanical" ], + "T": [ "f_treadmill", "f_treadmill_mechanical" ], "X": "f_exercise" }, "sealed_item": { @@ -401,23 +400,23 @@ "E": "t_elevator_control", "Y": "t_thconc_floor_olight", "#": "t_rock", - "6": "t_console", "R": "t_railing", - "9": "t_conveyor", - "7": "t_machinery_light", - "8": "t_machinery_heavy", - "&": "t_machinery_electronic" + "9": "t_conveyor" }, "furniture": { + "6": "f_console", "K": "f_counter", "S": "f_table", "A": "f_canvas_wall", "%": "f_canvas_door", "H": "f_armchair", "M": "f_server", - "E": "f_ergometer", - "T": "f_treadmill", - "X": "f_exercise" + "E": [ "f_ergometer", "f_ergometer_mechanical" ], + "T": [ "f_treadmill", "f_treadmill_mechanical" ], + "X": "f_exercise", + "7": "f_machinery_light", + "8": "f_machinery_heavy", + "&": "f_machinery_electronic" }, "items": { "S": [ @@ -450,19 +449,19 @@ "##############################################||5555||tt tt|####################################", "#####################################||||||||||^ ^| h h|####################################", "#####################################|rrrrrrrr|^ ^| |####################################", - "#####################################|r r|| ||||2|||####################################", + "#####################################|r r||T T||||2|||####################################", "#####################################|r YY 2 (t r|####################################", "#####################################|||||||||| YY (thY r|####################################", - "#####################################|bbbbbbbb| YY (t Y r|####################################", + "#####################################|bbbbbbbb| YY (tGY r|####################################", "#####################################|Y Y2 ( r|####################################", "#####################################| llllll ||2222||||2|||####################################", - "#####################################|2||||||2|^ Y^|####################################", + "#####################################|2||||||2|^ G Y^|####################################", "#####################################| ~| |~ |^ Y^|####################################", "#####################################| i| |i |^ Y^|####################################", "#####################################||||||||||| ||||||||####################################", "#####################################|lll 2 ^|##########################################", "#####################################|^ ( YY ^|##########################################", - "#####################################| d ( YY ^|##########################################", + "#####################################| dG ( YY ^|##########################################", "#####################################|^hdh ( ^|##########################################", "#####################################|||||||| ||||##########################################" ], @@ -472,7 +471,9 @@ "l": [ { "item": "NC_ROBOFAC_FIELD_RESEARCHER_worn", "chance": 50 }, { "item": "NC_ROBOFAC_SCIENTIST_worn", "chance": 50 } ], "i": { "item": "cleaning", "chance": 50 }, "B": [ { "item": "textbooks", "chance": 50 }, { "item": "manuals", "chance": 50 } ] - } + }, + "monster": { "T": { "monster": "mon_robofac_laserturret_mk1" } }, + "npcs": { "G": { "class": "hub_security" } } } }, { @@ -535,15 +536,8 @@ "################################################################################################" ], "palettes": [ "robofachq" ], - "terrain": { - "-": "t_wall_metal", - "e": "t_elevator", - "E": "t_elevator_control", - "Y": "t_thconc_floor_olight", - "#": "t_rock", - "6": "t_console" - }, - "furniture": { ":": "f_server", "K": "f_counter" }, + "terrain": { "-": "t_wall_metal", "e": "t_elevator", "E": "t_elevator_control", "Y": "t_thconc_floor_olight", "#": "t_rock" }, + "furniture": { "6": "f_console", ":": "f_server", "K": "f_counter" }, "items": { "r": [ { "item": "electronics", "chance": 75, "repeat": [ 1, 5 ] } ] } } }, @@ -613,9 +607,9 @@ "w": "t_water_pool_shallow", "E": "t_elevator_control", "Y": "t_thconc_floor_olight", - "#": "t_rock", - "6": "t_console" + "#": "t_rock" }, + "furniture": { "6": "f_console" }, "items": { "B": [ { "item": "magazines", "chance": 75, "repeat": [ 1, 5 ] }, diff --git a/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json b/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json index 16ffd2dcfca51..89fe1dae07a0b 100644 --- a/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json +++ b/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json @@ -25,7 +25,7 @@ ], "terrain": { ".": "t_dirt", - "r": "t_carpet_yellow", + "r": "t_carpet_concrete_yellow", "M": "t_pavement", "#": "t_dirt", "x": "t_dirt", diff --git a/data/json/mapgen/s_apt.json b/data/json/mapgen/s_apt.json index 7fc87b35c3211..7032df7b562a6 100644 --- a/data/json/mapgen/s_apt.json +++ b/data/json/mapgen/s_apt.json @@ -67,7 +67,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "##o####o##&*&##o####o##.", + "##o####o##&#&##o####o##.", "#d@@I|fhF|===|7 F|d y#.", "o @@ |h O|===|5 + @@o.", "#y + 5|===|O A|D I#.", diff --git a/data/json/mapgen/s_bookstore.json b/data/json/mapgen/s_bookstore.json index 625a11737e3a7..6db5302096468 100644 --- a/data/json/mapgen/s_bookstore.json +++ b/data/json/mapgen/s_bookstore.json @@ -33,13 +33,10 @@ "************************" ], "terrain": { - "#": "t_floor", - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_dirt", 2 ], [ "t_grass_long", 4 ] ], - "^": [ "t_tree_walnut", "t_tree_chestnut", "t_tree_beech", "t_tree", "t_tree_hazelnut" ], + "*": "t_region_groundcover_urban", + "^": "t_region_tree_nut", "+": "t_door_c", "-": "t_wall_w", - ".": "t_floor", ":": "t_door_glass_c", "O": "t_window", "|": "t_wall_w", @@ -48,6 +45,7 @@ "~": "t_sidewalk" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "T": "f_table", "]": "f_rack", @@ -253,8 +251,7 @@ ], "terrain": { "#": "t_floor", - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_dirt", 2 ], [ "t_grass_long", 4 ] ], + "*": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", @@ -262,11 +259,12 @@ "=": "t_wall_glass", ">": "t_stairs_up", "O": "t_window", - "q": "t_grass", + "q": "t_region_groundcover_urban", "|": "t_wall_w", "~": "t_sidewalk" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "T": "f_table", "[": "f_rack", @@ -459,21 +457,21 @@ "************************" ], "terrain": { - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_dirt", 2 ], [ "t_grass_long", 4 ] ], + "*": "t_region_groundcover_urban", "+": [ "t_door_c", "t_door_locked" ], "-": "t_wall_w", ".": "t_floor", "O": "t_window", "S": "t_sidewalk", - "^": [ "t_tree_walnut", "t_tree_chestnut", "t_tree_beech", "t_tree", "t_tree_hazelnut" ], - "o": "t_dirt", - "q": "t_dirt", + "^": "t_region_tree_nut", + "o": "t_region_groundcover_barren", + "q": "t_region_groundcover_barren", "|": "t_wall_w", "4": "t_gutter_downspout", "~": "t_sidewalk" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "S": "f_statue", "T": "f_table", diff --git a/data/json/mapgen/s_clothing.json b/data/json/mapgen/s_clothing.json index f4957f0029398..62a1328d97d8a 100644 --- a/data/json/mapgen/s_clothing.json +++ b/data/json/mapgen/s_clothing.json @@ -300,8 +300,7 @@ "**********~~~***********" ], "terrain": { - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], + "*": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", @@ -316,6 +315,7 @@ }, "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_harvest" } }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "&": "f_counter_gate_c", "@": "f_mannequin", @@ -575,9 +575,8 @@ "************************" ], "terrain": { - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt" ], - "&": "t_grass", + "*": "t_region_groundcover_urban", + "&": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_brick_wall", ".": "t_floor", @@ -588,15 +587,16 @@ "H": "t_sidewalk", "O": "t_window", "T": "t_sidewalk", - "^": "t_tree", - "r": "t_grass", - "z": "t_shrub", + "^": "t_region_tree", + "r": "t_region_groundcover_urban", + "z": "t_region_shrub", "|": "t_brick_wall", "~": "t_sidewalk", - "R": "t_grass", + "R": "t_region_groundcover_urban", "4": "t_gutter_downspout" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "@": "f_mannequin", "H": "f_chair", @@ -608,7 +608,7 @@ "d": "f_desk", "f": "f_indoor_plant", "h": "f_chair", - "r": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ], + "r": "f_region_flower", "s": "f_sink", "u": "f_trashcan", "y": "f_indoor_plant_y" diff --git a/data/json/mapgen/s_coffee.json b/data/json/mapgen/s_coffee.json index 6b005ff91ba5b..b90cd4db017f5 100644 --- a/data/json/mapgen/s_coffee.json +++ b/data/json/mapgen/s_coffee.json @@ -45,8 +45,8 @@ "%": "t_linoleum_white", "+": "t_door_c", ",": "t_pavement_y", - ".": "t_grass", - "/": "t_dirt", + ".": "t_region_groundcover_urban", + "/": "t_region_groundcover_barren", "3": [ "t_door_locked", "t_door_locked_alarm" ], ";": "t_linoleum_white", "=": "t_linoleum_white", @@ -56,7 +56,7 @@ "G": "t_linoleum_white", "I": "t_door_locked_interior", "L": "t_linoleum_white", - "M": "t_dirt", + "M": "t_region_groundcover_barren", "O": "t_window", "S": "t_sidewalk", "U": "t_linoleum_white", @@ -68,8 +68,7 @@ "f": "t_linoleum_white", "l": "t_linoleum_white", "w": "t_linoleum_white", - "x": "t_console_broken", - "z": "t_shrub", + "z": "t_region_shrub_decorative", "{": "t_door_glass_c", "|": "t_wall_b", "<": "t_stairs_up", @@ -77,6 +76,7 @@ "T": "t_tree_coffee" }, "furniture": { + "x": "f_console_broken", "#": "f_counter", "%": "f_trashcan", "/": "f_bluebell", @@ -91,11 +91,11 @@ "F": "f_fridge", "G": "f_oven", "L": "f_locker", - "M": "f_dahlia", + "M": "f_region_flower", "U": "f_sink", "X": "f_rack", "^": "f_indoor_plant", - "b": "f_dandelion", + "b": "f_region_weed", "f": "f_glass_fridge", "l": "f_rack", "r": "f_rack" @@ -219,7 +219,7 @@ { "line": "terrain", "id": "t_concrete", "x": 18, "x2": 18, "y": 6, "y2": 4 } ], "terrain": { - "#": "t_shrub", + "#": "t_region_shrub", "%": "t_wall_glass", "+": "t_door_glass_c", ",": "t_pavement_y", @@ -241,11 +241,11 @@ "p": "t_concrete", "r": "t_linoleum_white", "s": "t_sidewalk", - "x": "t_console_broken", "4": "t_gutter_downspout", "|": "t_wall_b" }, "furniture": { + "x": "f_console_broken", "&": "f_trashcan", "H": "f_chair", "O": "f_oven", @@ -330,53 +330,10 @@ }, { "method": "json", + "om_terrain": "s_restaurant_coffee_2", + "type": "mapgen", + "weight": 100, "object": { - "fill_ter": "t_floor", - "furniture": { - "#": "f_chair", - "&": "f_trashcan", - "+": "f_null", - "-": "f_null", - ".": "f_null", - "D": "f_null", - "S": "f_null", - "T": "f_toilet", - "^": "f_indoor_plant", - "_": "f_null", - "a": "f_sink", - "b": "f_null", - "c": "f_counter", - "d": "f_dumpster", - "l": "f_locker", - "o": "f_oven", - "p": "f_null", - "r": "f_rack", - "s": "f_null", - "t": "f_table", - "u": "f_null", - "v": "f_vending_o", - "w": "f_null", - "{": "f_fridge", - "|": "f_null" - }, - "place_items": [ - { "chance": 80, "repeat": [ 1, 8 ], "item": "coffee_freezer", "x": [ 3, 4 ], "y": 4 }, - { "chance": 70, "repeat": [ 1, 8 ], "item": "coffee_display_2", "x": 7, "y": 13 }, - { "chance": 70, "repeat": [ 1, 8 ], "item": "coffee_display_2", "x": 6, "y": 11 }, - { "chance": 75, "repeat": [ 1, 8 ], "item": "coffee_condiments", "x": [ 5, 6 ], "y": 12 }, - { "chance": 75, "repeat": [ 1, 8 ], "item": "coffee_condiments", "x": 6, "y": 9 }, - { "chance": 35, "item": "clothing_work_torso", "x": [ 7, 9 ], "y": 20 }, - { "chance": 40, "item": "coffee_trash", "x": 5, "y": 15 }, - { "chance": 75, "repeat": [ 1, 3 ], "item": "kitchen_nonfood", "x": 5, "y": [ 13, 14 ] }, - { "chance": 35, "item": "coffee_dishes", "x": 6, "y": 8 }, - { "chance": 50, "item": "fast_trash", "x": [ 15, 16 ], "y": 19 }, - { "chance": 65, "repeat": [ 1, 3 ], "item": "coffee_newsstand", "x": 15, "y": 6 } - ], - "place_monsters": [ - { "chance": 4, "density": 1, "monster": "GROUP_ZOMBIE", "x": 8, "y": 10 }, - { "chance": 3, "density": 1, "monster": "GROUP_ZOMBIE_FAT_BASE", "x": 17, "y": 11 } - ], - "place_toilets": [ { "x": 20, "y": 17 } ], "rows": [ "______________sss_______", "______u__u____sss_______", @@ -390,7 +347,7 @@ "__|...c.............^|u_", "__|...c..............|__", "__|...c..............|_u", - "__|...c......#.......|__", + "__|...x......#.......|__", "_u|..c|.....#t#......|u_", "__|..c|......#....|D||__", "__|..&|...........|..|__", @@ -403,39 +360,58 @@ "_____u_____ppppppppp____", "________________________" ], + "fill_ter": "t_floor", + "furniture": { + "#": "f_chair", + "&": "f_trashcan", + "T": "f_toilet", + "^": "f_indoor_plant", + "a": "f_sink", + "c": "f_counter", + "d": "f_dumpster", + "l": "f_locker", + "o": "f_oven", + "r": "f_rack", + "t": "f_table", + "v": "f_vending_o", + "{": "f_fridge", + "x": "f_console_broken" + }, "terrain": { - "#": "t_floor", - "&": "t_floor", "+": "t_door_glass_c", "-": "t_wall_glass", - ".": "t_floor", "D": "t_door_c", - "S": "t_shrub", - "T": "t_floor", - "^": "t_floor", - "_": "t_grass", - "a": "t_floor", + "S": "t_region_shrub_decorative", + "_": "t_region_groundcover_urban", "b": "t_door_metal_pickable", - "c": "t_floor", "d": "t_pavement", - "l": "t_floor", - "o": "t_floor", "p": "t_pavement", - "r": "t_floor", "s": "t_sidewalk", - "t": "t_floor", - "u": "t_underbrush", - "v": "t_floor", + "u": "t_region_shrub", "w": "t_window_boarded_noglass", - "{": "t_floor", "4": "t_gutter_downspout", "<": "t_ladder_up", "|": "t_wall_b" - } - }, - "om_terrain": "s_restaurant_coffee_2", - "type": "mapgen", - "weight": 100 + }, + "place_items": [ + { "chance": 80, "repeat": [ 1, 8 ], "item": "coffee_freezer", "x": [ 3, 4 ], "y": 4 }, + { "chance": 70, "repeat": [ 1, 8 ], "item": "coffee_display_2", "x": 7, "y": 13 }, + { "chance": 70, "repeat": [ 1, 8 ], "item": "coffee_display_2", "x": 6, "y": 11 }, + { "chance": 75, "repeat": [ 1, 8 ], "item": "coffee_condiments", "x": [ 5, 6 ], "y": 12 }, + { "chance": 75, "repeat": [ 1, 8 ], "item": "coffee_condiments", "x": 6, "y": 9 }, + { "chance": 35, "item": "clothing_work_torso", "x": [ 7, 9 ], "y": 20 }, + { "chance": 40, "item": "coffee_trash", "x": 5, "y": 15 }, + { "chance": 75, "repeat": [ 1, 3 ], "item": "kitchen_nonfood", "x": 5, "y": [ 13, 14 ] }, + { "chance": 35, "item": "coffee_dishes", "x": 6, "y": 8 }, + { "chance": 50, "item": "fast_trash", "x": [ 15, 16 ], "y": 19 }, + { "chance": 65, "repeat": [ 1, 3 ], "item": "coffee_newsstand", "x": 15, "y": 6 } + ], + "place_monsters": [ + { "chance": 4, "density": 1, "monster": "GROUP_ZOMBIE", "x": 8, "y": 10 }, + { "chance": 3, "density": 1, "monster": "GROUP_ZOMBIE_FAT_BASE", "x": 17, "y": 11 } + ], + "place_toilets": [ { "x": 20, "y": 17 } ] + } }, { "type": "mapgen", diff --git a/data/json/mapgen/s_electronics.json b/data/json/mapgen/s_electronics.json index 2c001e497d48e..6709748753588 100644 --- a/data/json/mapgen/s_electronics.json +++ b/data/json/mapgen/s_electronics.json @@ -34,7 +34,7 @@ "________________________" ], "terrain": { - "%": "t_shrub", + "%": "t_region_shrub_decorative", "+": "t_door_metal_pickable", ",": "t_pavement_y", "-": "t_wall_w", @@ -50,8 +50,7 @@ "_": "t_pavement", "d": "t_pavement", "s": "t_sidewalk", - "x": "t_console_broken", - "z": "t_shrub", + "z": "t_region_shrub_decorative", "|": "t_wall_w", "4": "t_gutter_downspout", "<": "t_ladder_up" @@ -70,6 +69,7 @@ "r": "f_rack", "t": "f_trashcan", "w": "f_washer", + "x": "f_console_broken", "y": "f_dryer" }, "toilets": { "T": { } }, @@ -190,42 +190,17 @@ " xUUxxxxxxx " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", ".": "t_floor", - "p": "t_grass", - "J": "t_grass", + "p": "t_region_groundcover_urban", + "J": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_brick_wall", ":": "t_window", "|": "t_brick_wall", "U": "t_sidewalk", "x": "t_sidewalk", - "9": [ - "t_tree_blackjack", - "t_tree_walnut", - "t_tree_chestnut", - "t_tree_beech", - "t_tree_hazelnut", - "t_tree_cottonwood", - "t_tree", - "t_tree_elm", - "t_tree_dead", - "t_tree_apple", - "t_tree_pear", - "t_tree_cherry", - "t_tree_peach", - "t_tree_apricot", - "t_tree_plum", - "t_tree_mulberry", - "t_tree_elderberry", - "t_tree_pine", - "t_tree_birch", - "t_tree_willow", - "t_tree_maple", - "t_tree_hickory", - "t_tree_almond", - "t_tree_pecan" - ], + "9": "t_region_tree", "<": "t_ladder_up", "4": "t_gutter_downspout" }, @@ -247,7 +222,7 @@ "F": "f_filing_cabinet", "@": "f_sofa", "G": "f_workbench", - "p": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ] + "p": "f_region_flower" }, "toilets": { "&": { } }, "items": { diff --git a/data/json/mapgen/s_gas.json b/data/json/mapgen/s_gas.json index 92bcc43661a40..ffb483c32a023 100644 --- a/data/json/mapgen/s_gas.json +++ b/data/json/mapgen/s_gas.json @@ -32,7 +32,7 @@ "...s9s...........s9s....", "........................" ], - "place_terrain": [ { "ter": "t_gas_tank", "x": 2, "y": 3 }, { "ter": "t_diesel_tank", "x": 4, "y": 3 } ], + "place_furniture": [ { "furn": "f_gas_tank", "x": 2, "y": 3 }, { "furn": "f_diesel_tank", "x": 4, "y": 3 } ], "terrain": { "&": "t_atm", "+": "t_chaingate_l", diff --git a/data/json/mapgen/s_grocery.json b/data/json/mapgen/s_grocery.json index a618880db0e21..6db55cc9a2e08 100644 --- a/data/json/mapgen/s_grocery.json +++ b/data/json/mapgen/s_grocery.json @@ -31,14 +31,12 @@ "___L***+**************|_", "___|------------------|_" ], + "fill_ter": "t_linoleum_white", "terrain": { " ": "t_linoleum_white", - "#": "t_linoleum_white", - "%": "t_console_broken", "*": "t_floor", "+": "t_door_c", "-": "t_wall_w", - "7": "t_linoleum_white", "=": "t_wall_glass", "A": "t_atm", "C": "t_floor", @@ -50,19 +48,15 @@ "W": "t_chainfence_h", "[": "t_door_glass_c", "]": "t_floor", - "^": "t_linoleum_white", "_": "t_pavement", - "b": "t_linoleum_white", - "f": "t_linoleum_white", "l": "t_linoleum_gray", - "r": "t_linoleum_white", "s": "t_sidewalk", - "t": "t_linoleum_white", - "w": "t_chainfence_v", + "w": "t_chainfence", "4": "t_gutter_downspout", "|": "t_wall_w" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "7": "f_bookcase", "C": "f_crate_c", @@ -213,7 +207,7 @@ " " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", diff --git a/data/json/mapgen/s_gun.json b/data/json/mapgen/s_gun.json index 04d6a018200e5..53ce1d2d7fd8e 100644 --- a/data/json/mapgen/s_gun.json +++ b/data/json/mapgen/s_gun.json @@ -37,7 +37,7 @@ { "ter": "t_door_metal_pickable", "x": [ 7, 14 ], "y": 14 } ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "*": "t_pavement_y", "+": "t_door_metal_pickable", "-": "t_wall_w", @@ -51,12 +51,12 @@ "l": "t_thconc_floor", "|": "t_wall_w", "D": "t_door_c", - "?": "t_console_broken", "<": "t_ladder_up", "4": "t_gutter_downspout" }, "toilets": { "&": { } }, "furniture": { + "?": "f_console_broken", "#": "f_counter", "H": "f_counter", "S": "f_stool", @@ -123,8 +123,8 @@ "ammo": 25, "magazine": 100 }, - { "item": "ear_plugs", "x": 2, "y": 14, "chance": 50, "repeat": 2 }, - { "item": "powered_earmuffs", "x": 2, "y": 14, "chance": 30 } + { "item": "ear_plugs", "x": 2, "y": 14, "chance": 50, "repeat": 12 }, + { "item": "powered_earmuffs", "x": 2, "y": 14, "chance": 30, "repeat": 3 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 0 ], "y": [ 23, 23 ], "chance": 2, "repeat": [ 2, 3 ] } ] } @@ -233,19 +233,18 @@ "+": "t_door_metal_pickable", ".": "t_floor", "5": "t_window_bars_alarm", - ";": "t_floor", - "@": "t_shrub", + "@": "t_region_shrub_decorative", "A": "t_atm", "D": "t_door_c", "L": "t_door_metal_locked", "_": "t_pavement", "s": "t_sidewalk", "|": "t_wall_w", - "?": "t_console_broken", "<": "t_ladder_up", "4": "t_gutter_downspout" }, "furniture": { + "?": "f_console_broken", "#": "f_counter", "a": "f_stool", "E": "f_desk", @@ -377,7 +376,7 @@ "+": "t_door_metal_pickable", ".": "t_floor", "5": "t_window_bars_alarm", - "@": "t_shrub", + "@": "t_region_shrub_decorative", "A": "t_atm", "C": "t_door_frame", "D": "t_door_o", @@ -386,7 +385,7 @@ "p": "t_door_metal_o", "s": "t_sidewalk", "|": "t_wall_w", - "x": "t_dirt", + "x": "t_region_groundcover_barren", "<": "t_ladder_up", "4": "t_gutter_downspout" }, @@ -475,22 +474,22 @@ ".d-------------------.d." ], "terrain": { - "#": "t_dirt", + "#": "t_region_groundcover_barren", "+": "t_door_metal_pickable", "-": "t_brick_wall", - ".": "t_grass", - "S": "t_grass", - "T": "t_dirt", + ".": "t_region_groundcover_urban", + "S": "t_region_groundcover_urban", + "T": "t_region_groundcover_barren", "W": "t_wall_w", "_": "t_floor", "a": "t_wall_r", - "b": "t_dirt", - "d": "t_dirt", + "b": "t_region_groundcover_barren", + "d": "t_region_groundcover_barren", "e": "t_window_boarded", "f": "t_door_boarded", "g": "t_door_c", "s": "t_sidewalk", - "u": "t_underbrush", + "u": "t_region_shrub", "w": "t_wall_b", "|": "t_wall_w", "4": "t_gutter_downspout" diff --git a/data/json/mapgen/s_hardware.json b/data/json/mapgen/s_hardware.json index b0c7b87b0108f..566a6c880cc66 100644 --- a/data/json/mapgen/s_hardware.json +++ b/data/json/mapgen/s_hardware.json @@ -33,8 +33,7 @@ "************************" ], "terrain": { - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + "*": [ [ "t_region_groundcover_urban", 8 ], "t_region_shrub" ], "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", @@ -47,6 +46,7 @@ "4": "t_gutter_downspout" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "@": "f_locker", "[": "f_bookcase", @@ -159,11 +159,11 @@ ], "terrain": { "#": "t_wall_w", - "'": [ "t_grass", "t_grass", "t_dirt" ], + "'": "t_region_groundcover_urban", "+": "t_door_glass_c", "-": "t_wall_glass", ".": "t_floor", - "D": "t_dirt", + "D": "t_region_groundcover_barren", "=": "t_door_c", "H": "t_pavement", "M": "t_pavement", @@ -175,7 +175,6 @@ "W": "t_chainfence_h", "_": "t_floor", "p": "t_pavement", - "r": "t_console_broken", "w": "t_chainfence_v", "|": "t_chaingate_c", "~": "t_sidewalk", @@ -188,6 +187,7 @@ "M": { "item": { "item": "seed_flower" }, "furniture": "f_planter_harvest" } }, "furniture": { + "r": "f_console_broken", "D": "f_dumpster", "H": "f_warehouse_shelf", "P": "f_rack", @@ -308,8 +308,7 @@ "************************" ], "terrain": { - "%": "t_console_broken", - "*": "t_grass", + "*": "t_region_groundcover_urban", "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", @@ -325,6 +324,7 @@ "4": "t_gutter_downspout" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "]": "f_rack", "l": "f_stool", @@ -442,8 +442,7 @@ "************************" ], "terrain": { - "%": "t_console_broken", - "*": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + "*": [ [ "t_region_groundcover_urban", 8 ], "t_region_shrub" ], "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", @@ -457,6 +456,7 @@ }, "toilets": { "&": { } }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "[": "f_table", "]": "f_rack", diff --git a/data/json/mapgen/s_lightindustry.json b/data/json/mapgen/s_lightindustry.json index 99ab2feebc1fb..80220576c1964 100644 --- a/data/json/mapgen/s_lightindustry.json +++ b/data/json/mapgen/s_lightindustry.json @@ -130,13 +130,17 @@ "c": "t_gates_mech_control", "d": "t_chainfence_h", "&": "t_chaingate_l", - "5": "t_machinery_electronic", - "6": "t_machinery_light", - "7": "t_machinery_heavy", - "8": "t_machinery_old", + "5": "t_thconc_floor", + "6": "t_thconc_floor", + "7": "t_thconc_floor", + "8": "t_thconc_floor", "^": "t_gutter_downspout" }, "furniture": { + "5": "f_machinery_electronic", + "6": "f_machinery_light", + "7": "f_machinery_heavy", + "8": "f_machinery_old", "k": "f_sink", "l": "f_oven", "m": "f_fridge", diff --git a/data/json/mapgen/school_1.json b/data/json/mapgen/school_1.json index 1db692e90a8c4..69311fb9338c0 100644 --- a/data/json/mapgen/school_1.json +++ b/data/json/mapgen/school_1.json @@ -405,17 +405,10 @@ "*": "t_open_air", "~": "t_open_air_rooved", "H": "t_glass_railing", - " ": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ] ], - "b": "t_dirt", - "$": [ - [ "t_underbrush", 10 ], - [ "t_shrub", 32 ], - [ "t_grass_tall", 10 ], - [ "t_shrub_lilac", 2 ], - [ "t_shrub_hydrangea", 2 ], - [ "t_shrub_rose", 1 ] - ], - ";": [ [ "t_tree", 10 ], [ "t_tree_willow", 3 ], [ "t_tree_birch", 3 ], [ "t_tree_maple", 3 ], [ "t_tree_pine", 5 ] ], + " ": "t_region_groundcover_urban", + "b": "t_region_groundcover_barren", + "$": "t_region_shrub_decorative", + ";": "t_region_tree_shade", "+": "t_door_c", "i": "t_linoleum_gray", "e": "t_linoleum_gray", @@ -434,7 +427,6 @@ "f": "t_chainfence_h", "s": "t_sidewalk", "w": "t_window", - "x": "t_console_broken", "|": "t_wall_y", "I": "t_column", ",": "t_floor_waxed", @@ -461,6 +453,7 @@ "j": "t_sewage_pipe" }, "furniture": { + "x": "f_console_broken", "%": "f_curtain", "@": "f_bed", "#": "f_bench", diff --git a/data/json/mapgen/sewage_treatment.json b/data/json/mapgen/sewage_treatment.json index 17022bd13a800..722c050b1335a 100644 --- a/data/json/mapgen/sewage_treatment.json +++ b/data/json/mapgen/sewage_treatment.json @@ -3,8 +3,8 @@ "type": "palette", "id": "sewage_treatment_palette", "terrain": { - " ": [ "t_dirt", "t_grass" ], - "?": "t_shrub", + " ": "t_region_groundcover", + "?": "t_region_shrub", ")": "t_water_pool_shallow", ".": "t_pavement", "_": "t_sidewalk", @@ -30,25 +30,26 @@ "b": "t_door_metal_pickable", "e": "t_door_metal_locked", "D": "t_door_glass_c", - "6": "t_console_broken", "+": "t_door_c", ",": "t_floor", "M": "t_metal_floor", "<": "t_ladder_up", ">": "t_stairs_down", - "%": "t_machinery_heavy", - "$": "t_machinery_light", + "%": "t_thconc_floor", + "$": "t_thconc_floor", "{": "t_thconc_floor", "R": "t_thconc_floor", "J": "t_current_trans", "U": "t_sai_box", - "G": "t_generator_broken", "F": "t_potential_trans", "7": "t_metal_floor", "4": "t_metal_floor", "g": "t_metal_floor", - "Y": "t_switchgear_s" - } + "Y": "t_switchgear_s", + "G": "t_thconc_floor", + "6": "t_thconc_floor" + }, + "furniture": { "%": "f_machinery_heavy", "$": "f_machinery_light", "G": "f_generator_broken", "6": "f_console_broken" } }, { "type": "palette", @@ -86,7 +87,6 @@ "H": "t_sconc_wall", "2": "t_sewage_pipe", "U": "t_sai_box", - "G": "t_generator_broken", "Y": "t_switchgear_s", "&": "t_sewage_pump", "-": "t_wall_glass", @@ -94,11 +94,19 @@ "a": "t_railing_v", "|": "t_chainfence", "C": "t_chaingate_l", - "$": "t_machinery_light", - "@": "t_machinery_heavy", - "v": "t_machinery_old", + "$": "t_thconc_floor", + "@": "t_thconc_floor", + "v": "t_thconc_floor", "+": "t_door_c", - "6": "t_console_broken" + "G": "t_thconc_floor", + "6": "t_thconc_floor" + }, + "furniture": { + "$": "f_machinery_light", + "@": "f_machinery_heavy", + "v": "f_machinery_old", + "G": "f_generator_broken", + "6": "f_console_broken" } }, { @@ -539,7 +547,7 @@ "%%%%%%%%%%%%%%%%%%%%%%%%" ], "palettes": [ "sewage_treatment_sewer_palette" ], - "terrain": { "O": "t_mdoor_lab_frame", ":": "t_carpet_yellow", "Q": "t_privacy_fence" }, + "terrain": { "O": "t_mdoor_lab_frame", ":": "t_carpet_metal_yellow", "Q": "t_privacy_fence" }, "furniture": { "{": "f_utility_shelf", "w": "f_workbench", diff --git a/data/json/mapgen/sports_store.json b/data/json/mapgen/sports_store.json index 35be3e5075581..ffaa665dc4d73 100644 --- a/data/json/mapgen/sports_store.json +++ b/data/json/mapgen/sports_store.json @@ -48,8 +48,8 @@ "furniture": { "#": "f_counter", "h": "f_stool", - "t": "f_treadmill", - "e": "f_ergometer", + "t": [ "f_treadmill", "f_treadmill_mechanical" ], + "e": [ "f_ergometer", "f_ergometer_mechanical" ], "p": "f_floor_canvas", "m": "f_exercise", "%": "f_sink", diff --git a/data/json/mapgen/stadium_football.json b/data/json/mapgen/stadium_football.json index 9d3c32abad4ee..357b6b079dbce 100644 --- a/data/json/mapgen/stadium_football.json +++ b/data/json/mapgen/stadium_football.json @@ -1011,10 +1011,10 @@ "+": "f_null", "-": "f_null", ".": "f_null", - "5": "f_ergometer", + "5": [ "f_ergometer", "f_ergometer_mechanical" ], "C": "f_counter", "D": "f_null", - "L": "f_treadmill", + "L": [ "f_treadmill", "f_treadmill_mechanical" ], "S": "f_sink", "T": "f_trashcan", "_": "f_null", diff --git a/data/json/mapgen/station_radio.json b/data/json/mapgen/station_radio.json index dda7f03f22037..50170cb0560f6 100644 --- a/data/json/mapgen/station_radio.json +++ b/data/json/mapgen/station_radio.json @@ -34,7 +34,7 @@ " " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "+": "t_door_c", "=": "t_door_locked_alarm", "D": "t_door_locked", @@ -46,7 +46,6 @@ "_": "t_pavement", "&": "t_radio_tower", "s": "t_sidewalk", - "x": "t_console_broken", "F": "t_chainfence", "f": "t_chainfence", "G": "t_chaingate_l", @@ -54,6 +53,7 @@ "<": "t_ladder_up" }, "furniture": { + "x": "f_console_broken", "o": "f_bookcase", "d": "f_desk", "h": "f_chair", @@ -177,7 +177,7 @@ "ss " ], "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + " ": "t_region_groundcover_urban", "+": "t_door_c", "=": "t_door_locked_alarm", "D": "t_door_locked", @@ -190,7 +190,6 @@ "R": "t_pavement", "&": "t_radio_tower", "s": "t_sidewalk", - "x": "t_console_broken", "F": "t_chainfence", "f": "t_chainfence", "G": "t_chaingate_l", @@ -199,6 +198,7 @@ "<": "t_ladder_up" }, "furniture": { + "x": "f_console_broken", "o": "f_bookcase", "d": "f_desk", "h": "f_chair", diff --git a/data/json/mapgen/steel_mill/steel_mill_z2.json b/data/json/mapgen/steel_mill/steel_mill_z2.json index ee62fd82b35b0..b31f4942555f5 100644 --- a/data/json/mapgen/steel_mill/steel_mill_z2.json +++ b/data/json/mapgen/steel_mill/steel_mill_z2.json @@ -10,7 +10,7 @@ [ "steel_mill_4_1_2", "steel_mill_4_2_2", "steel_mill_4_3_2", "steel_mill_rail_2_2" ] ], "object": { - "fill_ter": "t_carpet_concrete", + "fill_ter": "t_carpet_concrete_yellow", "rows": [ ":::::::::::::::::::::::::::::::1::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", diff --git a/data/json/mapgen/store/s_camping.json b/data/json/mapgen/store/s_camping.json index ae12955f8ec7b..ecfe2d116fdcc 100644 --- a/data/json/mapgen/store/s_camping.json +++ b/data/json/mapgen/store/s_camping.json @@ -53,17 +53,11 @@ "k": "t_thconc_floor", "s": "t_linoleum_gray", "t": "t_linoleum_gray", - "u": "t_console_broken", "v": "t_pavement", "w": "t_pavement", "x": "t_pavement", "K": "t_pavement", "G": "t_pavement", - "y": "t_linoleum_gray", - "z": "t_linoleum_gray", - "A": "t_linoleum_gray", - "B": "t_linoleum_gray", - "M": "t_linoleum_gray", ";": "t_gutter_downspout" }, "furniture": { @@ -81,6 +75,7 @@ "s": "f_rack", "ƃ": "f_counter_gate_c", "t": "f_counter", + "u": "f_console_broken", "v": "f_groundsheet", "w": "f_canvas_wall", "x": "f_canvas_door", diff --git a/data/json/mapgen/store/s_diner.json b/data/json/mapgen/store/s_diner.json index 640d3bac0d122..2353caf4115aa 100644 --- a/data/json/mapgen/store/s_diner.json +++ b/data/json/mapgen/store/s_diner.json @@ -54,7 +54,6 @@ "j": "t_thconc_floor", "k": "t_thconc_floor", "m": "t_thconc_floor", - "n": "t_console_broken", "o": "t_thconc_floor", "p": "t_thconc_floor", "q": "t_thconc_floor", @@ -65,6 +64,7 @@ "<": "t_stairs_up" }, "furniture": { + "n": "f_console_broken", "e": "f_counter", "f": "f_table", "F": "f_table", diff --git a/data/json/mapgen/store/s_games.json b/data/json/mapgen/store/s_games.json index 18b62a01b3670..88192a8e45720 100644 --- a/data/json/mapgen/store/s_games.json +++ b/data/json/mapgen/store/s_games.json @@ -41,23 +41,17 @@ ".": "t_region_groundcover_urban", "f": "t_sidewalk", "g": "t_pavement_y", - "h": "t_carpet_purple", - "i": "t_carpet_purple", - "j": "t_console_broken", - "k": "t_carpet_purple", - "l": "t_carpet_purple", "n": "t_pavement", - "Y": "t_carpet_purple", ";": "t_linoleum_gray", "q": "t_linoleum_gray", "r": "t_linoleum_gray", "m": "t_linoleum_gray", - "s": "t_carpet_purple", "9": "t_gutter_downspout" }, "furniture": { "h": "f_rack_wood", "i": "f_counter", + "j": "f_console_broken", "ƃ": "f_counter_gate_c", "k": "f_table", "A": "f_stool", diff --git a/data/json/mapgen/store/s_gunstore.json b/data/json/mapgen/store/s_gunstore.json index d05cf70c65472..9dc1074866321 100644 --- a/data/json/mapgen/store/s_gunstore.json +++ b/data/json/mapgen/store/s_gunstore.json @@ -50,7 +50,6 @@ "o": "t_thconc_floor", "t": "t_thconc_floor", "^": "t_thconc_floor", - "l": "t_console_broken", "x": "t_thconc_floor", "w": "t_pavement", "_": "t_pavement", @@ -60,6 +59,7 @@ "furniture": { "j": "f_rack", "k": "f_counter", + "l": "f_console_broken", "m": "f_displaycase", "n": "f_table", "o": "f_locker", diff --git a/data/json/mapgen/store/s_hunting.json b/data/json/mapgen/store/s_hunting.json index 1194c0e643d01..c61ab25f56376 100644 --- a/data/json/mapgen/store/s_hunting.json +++ b/data/json/mapgen/store/s_hunting.json @@ -33,7 +33,7 @@ "........4..............." ], "terrain": { - ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ], + ".": "t_region_groundcover", " ": "t_floor", ",": "t_thconc_floor", "y": "t_thconc_floor", @@ -48,16 +48,16 @@ "|": "t_wall_w", "-": "t_wall_w", "~": "t_window_bars_alarm", - "C": "t_console_broken", "4": "t_gutter_downspout" }, "furniture": { + "C": "f_console_broken", "#": "f_counter", "%": "f_sink", "R": "f_rack", "r": "f_warehouse_shelf", - "O": [ "f_crate_c", "f_crate_c", "f_crate_c", "f_crate_o" ], - "o": [ "f_crate_c", "f_crate_c", "f_crate_c", "f_crate_o" ], + "O": [ [ "f_crate_c", 3 ], "f_crate_o" ], + "o": [ [ "f_crate_c", 3 ], "f_crate_o" ], "X": "f_safe_l", "x": "f_safe_l", "B": "f_bulletin", diff --git a/data/json/mapgen/teashop.json b/data/json/mapgen/teashop.json index 7653f3aabdaaf..1723904573bf1 100644 --- a/data/json/mapgen/teashop.json +++ b/data/json/mapgen/teashop.json @@ -33,9 +33,9 @@ "........................" ], "set": [ - { "point": "furniture", "id": "f_mutpoppy", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] }, - { "point": "terrain", "id": "t_shrub", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] }, - { "point": "furniture", "id": "f_chamomile", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] } + { "point": "furniture", "id": "f_region_weed", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] }, + { "point": "terrain", "id": "t_region_shrub_fruit", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] }, + { "point": "furniture", "id": "f_region_flower", "x": [ 0, 23 ], "y": [ 21, 23 ], "repeat": [ 4, 9 ] } ], "terrain": { "#": "t_floor", @@ -43,33 +43,27 @@ "+": "t_door_c", ",": "t_floor", "-": "t_wall_w", - ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ], - "1": "t_grass", - "2": "t_grass", - "3": "t_grass", - "6": "t_console_broken", + ".": "t_region_groundcover_urban", + "1": "t_region_groundcover_urban", + "2": "t_region_groundcover_urban", + "3": "t_region_groundcover_urban", "C": "t_sidewalk", - "F": "t_floor", - "K": "t_floor", "O": "t_window_domestic", "S": "t_sidewalk", "T": "t_sidewalk", "_": "t_pavement", - "c": "t_floor", "o": "t_window", - "t": "t_floor", - "v": "t_floor", - "z": "t_shrub", - "{": "t_floor", + "z": "t_region_shrub_decorative", "4": "t_gutter_downspout", "|": "t_wall_w" }, "furniture": { + "6": "f_console_broken", "#": "f_counter", "&": "f_dumpster", - "1": "f_dandelion", - "2": "f_dahlia", - "3": "f_bluebell", + "1": "f_region_weed", + "2": "f_region_flower", + "3": [ "f_region_weed", "f_region_flower" ], "C": "f_chair", "F": "f_fridge", "K": "f_sink", @@ -198,48 +192,41 @@ ], "terrain": { "#": "t_linoleum_gray", - "&": "t_floor", "D": "t_door_locked", "+": "t_door_c", ";": "t_linoleum_gray", ",": "t_floor", - ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ], - "T": [ "t_tree", "t_tree_young", "t_shrub", "t_grass", "t_grass", "t_dirt" ], - "z": "t_shrub", - "@": "t_grass", - "1": "t_grass", - "2": "t_grass", - "3": "t_grass", - "4": "t_grass", - "^": "t_grass", - "6": "t_console_broken", - "C": "t_floor", + ".": "t_region_groundcover_urban", + "T": [ [ "t_region_groundcover_urban", 3 ], [ "t_region_tree_shade", 2 ], "t_region_shrub_decorative" ], + "z": "t_region_shrub_fruit", + "@": "t_region_groundcover_urban", + "1": "t_region_groundcover_urban", + "2": "t_region_groundcover_urban", + "3": "t_region_groundcover_urban", + "4": "t_region_groundcover_urban", + "^": "t_region_groundcover_urban", "F": "t_linoleum_gray", "K": "t_linoleum_gray", "O": "t_window_domestic", "S": "t_sidewalk", - "$": "t_floor", "_": "t_pavement", - "c": "t_floor", "o": "t_window", - "Y": "t_floor", - "t": "t_floor", - "{": "t_floor", "|": "t_wall_g", "w": "t_wall_log", - "W": "t_railing_v", + "W": "t_railing", "Q": "t_fencegate_c", "<": "t_stairs_up", - "q": "t_fence_v" + "q": "t_fence" }, "furniture": { + "6": "f_console_broken", "#": "f_counter", "Y": "f_rack_coat", "&": "f_trashcan", - "1": "f_dandelion", - "2": "f_dahlia", - "3": "f_bluebell", - "4": "f_lily", + "1": "f_region_weed", + "2": "f_region_flower", + "3": "f_region_flower", + "4": "f_region_flower", "@": "f_statue", "F": "f_fridge", "K": "f_sink", diff --git a/data/json/mapgen/town_hall.json b/data/json/mapgen/town_hall.json index 2bcbdca22308b..8c7b8a19d5ad7 100644 --- a/data/json/mapgen/town_hall.json +++ b/data/json/mapgen/town_hall.json @@ -5,8 +5,8 @@ "terrain": { "*": "t_open_air", "~": "t_open_air_rooved", - ".": [ "t_grass_long", "t_grass", "t_grass", "t_dirt", "t_grass_long", "t_grass", "t_grass", "t_dirt", "t_shrub" ], - ",": [ "t_grass_long", "t_grass_long", "t_grass_long", "t_grass", "t_tree_young", "t_tree", "t_shrub", "t_dirt" ], + ".": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub_decorative" ], + ",": [ [ "t_region_groundcover_urban", 10 ], "t_region_shrub_decorative", "t_region_shrub_fruit", "t_region_tree_shade" ], "-": "t_door_locked_interior", "<": "t_stairs_down", "+": "t_door_c", @@ -26,7 +26,6 @@ "O": "t_linoleum_white", "u": "t_linoleum_white", "s": "t_sidewalk", - "x": "t_console_broken", "|": "t_brick_wall", "!": "t_door_glass_c", "=": "t_wall_glass", @@ -34,6 +33,7 @@ "v": "t_window" }, "furniture": { + "x": "f_console_broken", "3": "f_bench", "B": "f_bench", "S": "f_sink", diff --git a/data/json/mapgen/veterinarian.json b/data/json/mapgen/veterinarian.json index b0c48efca595c..c396400784283 100644 --- a/data/json/mapgen/veterinarian.json +++ b/data/json/mapgen/veterinarian.json @@ -34,8 +34,7 @@ ], "terrain": { " ": "t_pavement", - "%": "t_console_broken", - "*": "t_shrub", + "*": "t_region_shrub", "+": "t_door_c", ",": "t_pavement_y", "-": "t_wall_w", @@ -47,7 +46,7 @@ "O": "t_window", "R": "t_linoleum_white", "^": "t_chaingate_c", - "i": [ "t_door_locked_interior", "t_door_locked_interior", "t_door_c" ], + "i": [ [ "t_door_locked_interior", 2 ], "t_door_c" ], "l": "t_linoleum_white", "s": "t_linoleum_white", "t": "t_linoleum_white", @@ -56,6 +55,7 @@ "4": "t_gutter_downspout" }, "furniture": { + "%": "f_console_broken", "#": "f_counter", "$": "f_safe_l", "?": "f_counter", diff --git a/data/json/mapgen/ws_fire_lookout_tower.json b/data/json/mapgen/ws_fire_lookout_tower.json index 1b96b3890ebba..cf73c759cc1d3 100644 --- a/data/json/mapgen/ws_fire_lookout_tower.json +++ b/data/json/mapgen/ws_fire_lookout_tower.json @@ -272,6 +272,7 @@ "om_terrain": [ "ws_fire_lookout_tower_f2" ], "weight": 1000, "object": { + "fill_ter": "t_flat_roof", "rows": [ "........................", "........................", @@ -302,17 +303,15 @@ ".": "t_open_air", ",": "t_flat_roof", "X": "t_wall_log", - "|": "t_railing_v", - "-": "t_railing_h", - "g": "t_generator_broken", + "|": "t_railing", + "-": "t_railing", "D": "t_door_c", "+": "t_floor", ">": "t_ladder_down", "f": "t_flat_roof", - "s": "t_flat_roof", - "h": "t_flat_roof" + "s": "t_flat_roof" }, - "furniture": { "h": "f_chair" }, + "furniture": { "g": "f_generator_broken", "h": "f_chair" }, "items": { "s": { "item": "flt_loot_vehicle", "chance": 50 }, "f": { "item": "trash_forest", "chance": 80 } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE_FIRELOOKOUTTOWER", "x": 12, "y": 9 }, diff --git a/data/json/mapgen/zoo.json b/data/json/mapgen/zoo.json index 33bdde5fd27df..6cb543524d36a 100644 --- a/data/json/mapgen/zoo.json +++ b/data/json/mapgen/zoo.json @@ -139,8 +139,8 @@ { "chance": 75, "item": "vending_drink", "x": 20, "y": 1 } ], "place_monster": [ - { "monster": "mon_coyote", "x": 8, "y": 16 }, - { "monster": "mon_coyote", "x": 9, "y": 17 }, + { "monster": "mon_tiger", "x": 8, "y": 16 }, + { "monster": "mon_tiger", "x": 9, "y": 17 }, { "monster": "mon_bear", "x": 8, "y": 20 } ] } diff --git a/data/json/mapgen_palettes/abandoned_barn_p.json b/data/json/mapgen_palettes/abandoned_barn_p.json index a54fbd37524f5..3bbc8a940c997 100644 --- a/data/json/mapgen_palettes/abandoned_barn_p.json +++ b/data/json/mapgen_palettes/abandoned_barn_p.json @@ -30,11 +30,9 @@ "d": "t_region_groundcover_barren", "D": "t_door_boarded_damaged", "f": "t_region_groundcover", - "g": "t_generator_broken", "h": "t_dirtfloor", "I": "t_dirtfloor", "L": [ "t_covered_well", [ "t_water_pump", 2 ] ], - "m": "t_machinery_old", "M": "t_milking_machine", "n": "t_dirtfloor", "N": "t_dirtfloor", @@ -68,9 +66,11 @@ "c": "f_clay_kiln", "C": "f_crate_o", "f": "f_region_weed", + "g": "f_generator_broken", "h": "f_hay", "I": "f_stool", "!": "f_canvas_door_o", + "m": "f_machinery_old", "n": "f_canvas_floor", "N": "f_canvas_wall", "r": "f_rubble", diff --git a/data/json/mapgen_palettes/acidia_camp_palette.json b/data/json/mapgen_palettes/acidia_camp_palette.json index 4154eadb46866..017bd587ee107 100644 --- a/data/json/mapgen_palettes/acidia_camp_palette.json +++ b/data/json/mapgen_palettes/acidia_camp_palette.json @@ -36,7 +36,7 @@ "Q": "t_dirtfloor", "r": "t_dirtfloor", "S": "t_pit_spiked", - "T": "t_machinery_old", + "T": "t_dirtfloor", "t": "t_dirtfloor", "U": "t_pit", "u": "t_dirtfloor", @@ -47,6 +47,7 @@ "Z": "t_radio_controls" }, "furniture": { + "T": "f_machinery_old", "$": "f_crate_o", "(": "f_bench", ")": "f_standing_tank", diff --git a/data/json/mapgen_palettes/airliner_palette.json b/data/json/mapgen_palettes/airliner_palette.json index 39ba607e694ec..c9b9428afdd08 100644 --- a/data/json/mapgen_palettes/airliner_palette.json +++ b/data/json/mapgen_palettes/airliner_palette.json @@ -22,11 +22,18 @@ "D": "t_door_metal_locked", "g": "t_reinforced_glass", "s": "t_reinforced_glass_shutter", - "x": "t_console_broken", ">": "t_slope_down", "<": "t_slope_up" }, - "furniture": { "a": "f_seat_airplane", "c": "f_counter", "f": "f_fridge", "l": "f_locker", "S": "f_sink", "*": "f_wreckage" }, + "furniture": { + "a": "f_seat_airplane", + "c": "f_counter", + "f": "f_fridge", + "l": "f_locker", + "S": "f_sink", + "x": "f_console_broken", + "*": "f_wreckage" + }, "toilets": { "T": { } } } ] diff --git a/data/json/mapgen_palettes/apartment.json b/data/json/mapgen_palettes/apartment.json index ff2fcc03e34a6..4845d89ed1b7d 100644 --- a/data/json/mapgen_palettes/apartment.json +++ b/data/json/mapgen_palettes/apartment.json @@ -15,7 +15,6 @@ "W": "t_window", "s": "t_sidewalk", "w": [ [ "t_window_domestic", 3 ], "t_curtains" ], - "x": "t_console_broken", "|": "t_wall", "z": "t_flat_roof", "(": "t_flat_roof", @@ -41,8 +40,8 @@ "<": "t_stairs_up", ">": "t_stairs_down", "*": "t_open_air", - "K": "t_generator_broken", - "M": "t_machinery_heavy" + "K": "t_thconc_floor", + "M": "t_thconc_floor" }, "furniture": { "a": "f_small_satelitte_dish", @@ -57,6 +56,8 @@ "h": [ [ "f_chair", 2 ], "f_null" ], "I": "f_floor_lamp", "j": "f_trashcan", + "K": "f_generator_broken", + "M": "f_machinery_heavy", "l": [ [ "f_stool", 2 ], "f_null" ], "n": "f_table", "o": "f_bookcase", @@ -67,6 +68,7 @@ "S": "f_sink", "t": "f_table", "u": "f_cupboard", + "x": "f_console_broken", "X": [ [ "f_wardrobe", 2 ], "f_dresser" ], "Y": "f_rack_coat", "1": "f_cupboard", @@ -135,8 +137,7 @@ "p": "t_region_groundcover_urban", "s": "t_sidewalk", "w": "t_window", - "X": "t_door_locked", - "x": "t_console_broken" + "X": "t_door_locked" }, "furniture": { "A": "f_armchair", @@ -157,6 +158,7 @@ "t": "f_table", "T": "f_toilet", "u": "f_cupboard", + "x": "f_console_broken", "Y": "f_rack_coat", "1": "f_cupboard", "2": "f_cupboard", diff --git a/data/json/mapgen_palettes/basement.json b/data/json/mapgen_palettes/basement.json index 1fc892a70d705..96afa11f774aa 100644 --- a/data/json/mapgen_palettes/basement.json +++ b/data/json/mapgen_palettes/basement.json @@ -136,13 +136,13 @@ "*": "t_door_c", "^": "t_door_locked_interior", "5": "t_card_military", - "6": "t_console_broken", "<": "t_stairs_up", "M": "t_wall_metal", "|": "t_reinforced_glass", "/": "t_door_curtain_c", "W": "t_water_dispenser" }, + "furniture": { "6": "f_console_broken" }, "toilets": { "&": { } } }, { diff --git a/data/json/mapgen_palettes/bike_shop_palette.json b/data/json/mapgen_palettes/bike_shop_palette.json index c4561b91a1f0d..1299cc7fb3816 100644 --- a/data/json/mapgen_palettes/bike_shop_palette.json +++ b/data/json/mapgen_palettes/bike_shop_palette.json @@ -15,7 +15,6 @@ ";": "t_door_locked", "&": "t_floor", "^": "t_floor", - "%": "t_console_broken", "@": "t_sidewalk", "C": "t_floor", "D": "t_floor", @@ -50,6 +49,7 @@ "t": "f_table", "q": "f_stool", "B": "f_bench", + "%": "f_console_broken", "&": "f_trashcan", "@": "f_dumpster", "^": "f_indoor_plant" diff --git a/data/json/mapgen_palettes/cground.json b/data/json/mapgen_palettes/cground.json index 2e1b0c1f5c936..102d3586a44a5 100644 --- a/data/json/mapgen_palettes/cground.json +++ b/data/json/mapgen_palettes/cground.json @@ -16,7 +16,6 @@ "i": "t_pit_shallow", "v": "t_window_domestic", "+": "t_door_c", - "X": "t_console_broken", "H": "t_privacy_fence", "m": "t_privacy_fencegate_c", "F": "t_region_tree_evergreen", @@ -43,6 +42,7 @@ "'": "t_concrete" }, "furniture": { + "X": "f_console_broken", "g": "f_bulletin", "i": "f_firering", "b": "f_bench", diff --git a/data/json/mapgen_palettes/church.json b/data/json/mapgen_palettes/church.json index 53a79df26191e..79408cdd92ded 100644 --- a/data/json/mapgen_palettes/church.json +++ b/data/json/mapgen_palettes/church.json @@ -7,13 +7,12 @@ "+": "t_door_c", "-": "t_wall_w", ".": "t_floor", - "6": "t_console", "=": "t_door_locked_alarm", "D": "t_door_locked", "O": "t_column", "S": "t_floor", "T": "t_floor", - "^": "t_shrub", + "^": "t_region_shrub", "c": "t_floor", "b": "t_floor", "d": "t_floor", @@ -27,6 +26,7 @@ "|": "t_wall_w" }, "furniture": { + "6": "f_console", "#": "f_bench", "S": "f_sink", "T": "f_toilet", diff --git a/data/json/mapgen_palettes/city_block_palette.json b/data/json/mapgen_palettes/city_block_palette.json index 4b98c51e29f9c..2cb098e966a74 100644 --- a/data/json/mapgen_palettes/city_block_palette.json +++ b/data/json/mapgen_palettes/city_block_palette.json @@ -3,6 +3,7 @@ "type": "palette", "id": "city_block_foundation_palette", "furniture": { + "?": "f_console_broken", "A": "f_stool", "B": "f_beaded_door", "D": "f_chair", @@ -68,7 +69,6 @@ "M": "t_region_shrub_decorative", "S": "t_ladder_down", "V": "t_ladder_up", - "?": "t_console_broken", "$": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ] }, "toilets": { "t": { } }, diff --git a/data/json/mapgen_palettes/clothes_store_palette.json b/data/json/mapgen_palettes/clothes_store_palette.json index e11f54c1922ff..3fff3c5b628e0 100644 --- a/data/json/mapgen_palettes/clothes_store_palette.json +++ b/data/json/mapgen_palettes/clothes_store_palette.json @@ -2,8 +2,9 @@ { "type": "palette", "id": "clothes_store_palette", - "terrain": { "%": "t_console_broken", "p": "t_region_groundcover_urban" }, + "terrain": { "p": "t_region_groundcover_urban" }, "furniture": { + "%": "f_console_broken", "c": "f_counter", "C": "f_armchair", "s": "f_stool", @@ -58,14 +59,9 @@ { "type": "palette", "id": "tailor_palette", - "terrain": { - "%": "t_console_broken", - ";": "t_door_locked", - "0": "t_window_alarm", - "z": "t_region_shrub_decorative", - "p": "t_region_groundcover_urban" - }, + "terrain": { ";": "t_door_locked", "0": "t_window_alarm", "z": "t_region_shrub_decorative", "p": "t_region_groundcover_urban" }, "furniture": { + "%": "f_console_broken", "c": "f_counter", "R": "f_clothing_rail", "s": "f_stool", @@ -99,7 +95,6 @@ "type": "palette", "id": "furs_palette", "terrain": { - "%": "t_console_broken", ";": "t_door_locked", "i": "t_door_locked_interior", "0": "t_window_alarm", @@ -107,6 +102,7 @@ "p": "t_region_groundcover_urban" }, "furniture": { + "%": "f_console_broken", "c": "f_displaycase", "s": "f_stool", "d": "f_desk", diff --git a/data/json/mapgen_palettes/collapsed_tower.json b/data/json/mapgen_palettes/collapsed_tower.json index 572aa037bbbca..a31f5b11e171a 100644 --- a/data/json/mapgen_palettes/collapsed_tower.json +++ b/data/json/mapgen_palettes/collapsed_tower.json @@ -21,7 +21,7 @@ "c": "t_door_locked", "e": "t_elevator", "l": "t_floor", - "r": "t_carpet_red", + "r": "t_carpet_concrete_red", "s": "t_sidewalk", "w": "t_door_c", "y": "t_pavement_y", @@ -39,7 +39,7 @@ ":": "f_dresser", ";": "f_toilet", "=": "f_fireplace", - ">": "f_counter", + "c": "f_counter", "?": "f_sofa", "@": "f_bed", "A": "f_sink", diff --git a/data/json/mapgen_palettes/electronic_palette.json b/data/json/mapgen_palettes/electronic_palette.json index bbf5b8f690ebd..1bf23f1517665 100644 --- a/data/json/mapgen_palettes/electronic_palette.json +++ b/data/json/mapgen_palettes/electronic_palette.json @@ -17,7 +17,6 @@ "W": "t_wall_glass", "w": "t_window", "s": "t_sidewalk", - "x": "t_console_broken", "f": "t_chainfence_v", "g": "t_chaingate_c", "<": "t_stairs_up", @@ -26,6 +25,7 @@ "(": "t_pavement" }, "furniture": { + "x": "f_console_broken", "n": "f_displaycase", "1": "f_rack", "2": "f_rack", diff --git a/data/json/mapgen_palettes/fema.json b/data/json/mapgen_palettes/fema.json index 76cad836ff1e0..c2b9e0c85b9e8 100644 --- a/data/json/mapgen_palettes/fema.json +++ b/data/json/mapgen_palettes/fema.json @@ -7,7 +7,7 @@ "/": "t_region_groundcover_barren", "!": "t_region_groundcover_barren", "_": "t_region_groundcover_barren", - "'": "t_plut_generator", + "'": "t_floor", "?": "t_floor", "#": "t_pit_corpsed", "-": "t_wall", @@ -27,10 +27,11 @@ "P": "t_water_pump", "s": "t_floor", "w": [ "t_window_domestic", "t_curtains", "t_curtains" ], - "6": "t_console_broken", - "7": "t_centrifuge" + "6": "t_floor", + "7": "t_floor" }, "furniture": { + "'": "f_generator_broken", "=": "f_canvas_wall", ",": "f_fema_groundsheet", "*": "f_canvas_door", @@ -57,7 +58,9 @@ "U": "f_cupboard", "W": "f_woodstove", "x": "f_crate_o", - "X": "f_crate_c" + "X": "f_crate_c", + "6": "f_console_broken", + "7": "f_centrifuge" }, "toilets": { "&": { "amount": [ 0, 50 ] } }, "items": { diff --git a/data/json/mapgen_palettes/helipad.json b/data/json/mapgen_palettes/helipad.json index 2897a2a5c4449..1ef56488c24ce 100644 --- a/data/json/mapgen_palettes/helipad.json +++ b/data/json/mapgen_palettes/helipad.json @@ -31,10 +31,7 @@ "M": "t_door_metal_locked", ",": "t_concrete_y", "o": "t_sidewalk", - "?": "t_console_broken", - "g": "t_generator_broken", "P": "t_water_pump", - "5": "t_machinery_light", "6": "t_bulk_tank", "I": "t_thconc_y", "U": "t_metal_floor", @@ -47,6 +44,9 @@ "L": "f_locker", "4": "f_locker", "c": "f_chair", + "?": "f_console_broken", + "g": "f_generator_broken", + "5": "f_machinery_light", "s": "f_chair", "l": "f_utility_shelf", "d": "f_desk", diff --git a/data/json/mapgen_palettes/hospital.json b/data/json/mapgen_palettes/hospital.json index 66180a0603779..1a2b0c2981703 100644 --- a/data/json/mapgen_palettes/hospital.json +++ b/data/json/mapgen_palettes/hospital.json @@ -33,9 +33,9 @@ "`": "t_thconc_floor", "+": "t_door_c", "!": "t_door_locked_interior", - "*": "t_centrifuge", - "6": "t_console", - "7": "t_console", + "*": "t_floor", + "6": "t_floor", + "7": "t_floor", "S": "t_floor", "2": "t_floor", "8": "t_floor", @@ -44,6 +44,9 @@ "?": "t_floor" }, "furniture": { + "*": "f_centrifuge", + "6": "f_console", + "7": "f_console", "b": "f_bench", "c": "f_chair", "B": "f_bed", diff --git a/data/json/mapgen_palettes/hotel_tower_palette.json b/data/json/mapgen_palettes/hotel_tower_palette.json index 6a0b5d0f93b39..2a55e64166211 100644 --- a/data/json/mapgen_palettes/hotel_tower_palette.json +++ b/data/json/mapgen_palettes/hotel_tower_palette.json @@ -18,7 +18,7 @@ "S": "f_sink", "&": "f_toilet", "b": "f_bathtub", - "E": [ "f_exercise", "f_ergometer", "f_treadmill" ], + "E": [ "f_exercise", "f_ergometer", "f_ergometer_mechanical", "f_treadmill", "f_treadmill_mechanical" ], "e": "f_fridge", "l": "f_locker", "W": "f_washer", diff --git a/data/json/mapgen_palettes/house_general_palette.json b/data/json/mapgen_palettes/house_general_palette.json index d5906dfd9d8e3..0078a6b98f6a0 100644 --- a/data/json/mapgen_palettes/house_general_palette.json +++ b/data/json/mapgen_palettes/house_general_palette.json @@ -212,7 +212,7 @@ "u": "t_thconc_floor", "X": "t_thconc_floor" }, - "furniture": { "c": "f_exercise", "u": "f_ergometer", "X": "f_punching_bag" }, + "furniture": { "c": "f_exercise", "u": [ "f_ergometer", "f_ergometer_mechanical" ], "X": "f_punching_bag" }, "monsters": { "!": [ { "monster": "GROUP_ROACH", "chance": 70 }, { "monster": "GROUP_ZOMBIE", "chance": 100 } ], ".": [ { "monster": "GROUP_ROACH", "chance": 80 }, { "monster": "GROUP_ZOMBIE", "chance": 60 } ] diff --git a/data/json/mapgen_palettes/house_w_palette.json b/data/json/mapgen_palettes/house_w_palette.json index 1cf6d42e0ae3b..33995323b4b21 100644 --- a/data/json/mapgen_palettes/house_w_palette.json +++ b/data/json/mapgen_palettes/house_w_palette.json @@ -50,7 +50,8 @@ "w": "f_rack_wood", "x": "f_entertainment_center", "y": [ "f_indoor_plant", "f_indoor_plant_y" ], - "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ] + "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ], + "?": "f_console_broken" }, "terrain": { ".": "t_linoleum_gray", @@ -69,8 +70,7 @@ "6": "t_carpet_red", "7": "t_carpet_green", "8": "t_carpet_purple", - "9": "t_carpet_yellow", - "?": "t_console_broken" + "9": "t_carpet_yellow" }, "toilets": { "t": { } }, "liquids": { "g": { "liquid": "water_clean", "amount": [ 0, 100 ] } } diff --git a/data/json/mapgen_palettes/junkyard_palette.json b/data/json/mapgen_palettes/junkyard_palette.json index ad48193f802e8..850f72c3f0ff7 100644 --- a/data/json/mapgen_palettes/junkyard_palette.json +++ b/data/json/mapgen_palettes/junkyard_palette.json @@ -3,7 +3,7 @@ "type": "palette", "id": "junkyard_palette", "terrain": { - ".": [ [ "t_pavement", 22 ], "t_region_groundcover_urban" ], + ".": [ [ "t_pavement", 22 ], "t_region_groundcover" ], "g": "t_region_groundcover_urban", "_": [ [ "t_region_groundcover_barren", 5 ], "t_region_groundcover_urban" ], "|": "t_fence_barbed", @@ -14,8 +14,8 @@ "S": "t_sidewalk", "q": "t_door_metal_locked", "f": "t_floor", - "c": "t_carpet_red", - "n": "t_carpet_red", + "c": "t_carpet_concrete_red", + "n": "t_carpet_concrete_red", "r": "t_reinforced_door_glass_c", "%": "t_brick_wall", "C": "t_thconc_floor", @@ -26,10 +26,10 @@ "d": "t_door_metal_locked", "m": "t_metal_floor", "9": "t_wall_wood", - "x": "t_console_broken", "4": "t_gutter_downspout" }, "furniture": { + "x": "f_console_broken", "#": "f_straw_bed", "N": "f_ladder", "B": "f_bench", diff --git a/data/json/mapgen_palettes/lab_surface_palette.json b/data/json/mapgen_palettes/lab_surface_palette.json index 0899f163e29b1..7e8a208be2faa 100644 --- a/data/json/mapgen_palettes/lab_surface_palette.json +++ b/data/json/mapgen_palettes/lab_surface_palette.json @@ -24,7 +24,6 @@ "m": "t_door_metal_c", "M": "t_door_metal_locked", "w": "t_gates_control_brick", - "x": "t_console_broken", "]": "t_sidewalk", "*": "t_region_shrub_decorative", "?": [ "t_region_shrub_decorative", "t_region_tree_shade" ], @@ -52,7 +51,8 @@ "S": "f_sink", "s": "f_stool", "t": "f_table", - "U": "f_utility_shelf" + "U": "f_utility_shelf", + "x": "f_console_broken" }, "toilets": { "T": { } }, "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } } @@ -79,7 +79,6 @@ "m": "t_door_metal_c", "M": "t_door_metal_locked", "p": "t_sewage_pipe", - "x": "t_console_broken", "]": "t_sidewalk", "*": "t_region_shrub_decorative", "<": "t_stairs_up", @@ -111,7 +110,8 @@ "S": "f_sink", "s": "f_stool", "t": "f_table", - "v": "f_vent_pipe" + "v": "f_vent_pipe", + "x": "f_console_broken" }, "toilets": { "T": { } }, "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } } @@ -129,9 +129,7 @@ "-": "t_door_glass_frosted_c", "=": "t_door_glass_frosted_lab_c", ":": "t_reinforced_glass", - "m": "t_door_metal_c", - "o": "t_centrifuge", - "x": "t_console_broken" + "m": "t_door_metal_c" }, "furniture": { "&": "f_trashcan", @@ -165,7 +163,9 @@ "S": "f_sink", "t": "f_table", "U": "f_utility_shelf", - "v": "f_ventilator" + "v": "f_ventilator", + "o": "f_centrifuge", + "x": "f_console_broken" } } ] diff --git a/data/json/mapgen_palettes/library_palette.json b/data/json/mapgen_palettes/library_palette.json index d42db01ea9ebf..974b5b11c6486 100644 --- a/data/json/mapgen_palettes/library_palette.json +++ b/data/json/mapgen_palettes/library_palette.json @@ -2,8 +2,9 @@ { "type": "palette", "id": "library_palette", - "terrain": { "%": "t_console_broken", "p": "t_region_groundcover_urban", ";": "t_door_locked", "5": "t_region_tree_evergreen" }, + "terrain": { "p": "t_region_groundcover_urban", ";": "t_door_locked", "5": "t_region_tree_evergreen" }, "furniture": { + "%": "f_console_broken", "c": "f_counter", "d": "f_desk", "[": "f_table", diff --git a/data/json/mapgen_palettes/lmoe.json b/data/json/mapgen_palettes/lmoe.json index 6f0a0e5ed5380..6a48164868480 100644 --- a/data/json/mapgen_palettes/lmoe.json +++ b/data/json/mapgen_palettes/lmoe.json @@ -8,7 +8,7 @@ "+": "t_door_metal_c", "-": "t_scrap_wall", "_": "t_metal_floor", - ",": "t_carpet_metal", + ",": "t_carpet_metal_purple", "1": "t_column", "<": "t_stairs_up", "=": "t_chainfence", @@ -16,7 +16,6 @@ ":": "t_secretdoor_metal_c", ";": "t_secretdoor_metal_o", "~": "t_water_pump", - "G": "t_generator_broken", "t": "t_metal_floor" }, "furniture": { @@ -28,10 +27,11 @@ "C": "f_cupboard", "d": "f_dresser", "D": "f_desk", - "e": "f_ergometer", + "e": "f_ergometer_mechanical", "E": "f_exercise", "F": "f_fridge", "f": "f_sofa", + "G": "f_generator_broken", "h": "f_chair", "H": "f_water_heater", "K": "f_sink", diff --git a/data/json/mapgen_palettes/lumberyard.json b/data/json/mapgen_palettes/lumberyard.json index 73b3aa7dfcf2d..4a82f4eb5ffc8 100644 --- a/data/json/mapgen_palettes/lumberyard.json +++ b/data/json/mapgen_palettes/lumberyard.json @@ -15,13 +15,10 @@ ";": "t_door_metal_locked", ".": "t_thconc_floor", "6": "t_gates_mech_control", - "@": "t_machinery_heavy", - "G": "t_generator_broken", "=": "t_conveyor", "+": "t_door_c", "!": "t_door_locked_interior", - "X": "t_console_broken", - "v": "t_chainfence_v", + "v": "t_chainfence", "V": "t_chaingate_l", "x": "t_thconc_floor", "z": "t_flat_roof", @@ -33,13 +30,16 @@ ",": "t_thconc_floor" }, "furniture": { + "@": "f_machinery_heavy", "B": "f_bandsaw", + "G": "f_generator_broken", "J": "f_jointer", "M": "f_mitresaw", "P": "f_planer", "R": "f_router", "T": "f_tablesaw", "U": "f_utility_shelf", + "X": "f_console_broken", "p": "f_drill_press", "i": "f_filing_cabinet", "&": "f_trashcan", diff --git a/data/json/mapgen_palettes/mall_palette.json b/data/json/mapgen_palettes/mall_palette.json index 6cb70de570762..fe628abd119b6 100644 --- a/data/json/mapgen_palettes/mall_palette.json +++ b/data/json/mapgen_palettes/mall_palette.json @@ -1,153 +1,4 @@ [ - { - "type": "palette", - "id": "mall_palette", - "furniture": { - "?": "f_sofa", - "!": "f_rack", - "@": "f_bed", - "$": "f_counter", - "%": "f_indoor_plant", - "^": "f_indoor_plant", - "&": "f_bench", - "*": "f_chair", - "(": "f_rack", - ")": "f_dahlia", - "~": "f_counter", - "8": "f_table", - "9": "f_table", - "B": "f_bookcase", - "D": "f_trashcan", - "F": "f_arcade_machine", - "G": "f_trashcan", - "I": "f_arcade_machine", - "J": "f_counter", - "K": "f_locker", - "L": "f_locker", - "M": "f_trashcan", - "N": "f_chair", - "O": "f_oven", - "P": "f_indoor_plant", - "Q": "f_indoor_plant", - "R": "f_table", - "S": "f_sink", - "U": "f_bench", - "W": "f_washer", - "X": "f_safe_l", - "Y": "f_dryer", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "e": "f_fridge", - "f": "f_glass_fridge", - "g": "f_chair", - "h": "f_chair", - "i": "f_bench", - "j": "f_fridge", - "k": "f_chair", - "l": "f_vending_c", - "m": "f_vending_c", - "n": "f_table", - "o": "f_vending_c", - "q": "f_counter", - "r": "f_rack", - "t": "f_toilet", - "u": "f_rack", - "v": "f_pinball_machine", - "x": "f_pinball_machine", - "y": "f_indoor_plant", - "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ] - }, - "terrain": { - "#": "t_shrub", - "!": "t_linoleum_gray_no_roof", - "$": "t_linoleum_white_no_roof", - "%": "t_carpet_green", - "^": "t_linoleum_white_no_roof", - "&": "t_linoleum_white_no_roof", - "*": "t_carpet_green", - "(": "t_linoleum_white_no_roof", - ")": "t_region_groundcover_urban", - "~": "t_carpet_green", - "+": "t_door_c", - ",": "t_pavement_y", - "-": "t_brick_wall", - ".": "t_region_groundcover_urban", - "1": "t_linoleum_white", - "2": "t_linoleum_gray", - "3": "t_carpet_red", - "4": "t_carpet_green", - "5": "t_door_gray_c", - "6": "t_console_broken", - "7": "t_gates_mech_control", - "8": "t_sidewalk", - "9": "t_linoleum_white_no_roof", - "0": "t_door_red_c", - ":": "t_door_locked_interior", - ";": "t_door_locked", - "=": "t_door_metal_locked", - "?": "t_floor", - "@": "t_floor", - "A": "t_railing_h", - "B": "t_floor", - "C": "t_concrete", - "D": "t_floor", - "E": "t_elevator", - "F": "t_floor", - "G": "t_carpet_red", - "H": "t_laminated_glass", - "J": "t_carpet_red", - "I": "t_carpet_red", - "K": "t_carpet_red", - "L": "t_floor", - "M": "t_linoleum_gray_no_roof", - "N": "t_linoleum_white_no_roof", - "O": "t_floor", - "P": "t_floor", - "Q": "t_carpet_red", - "R": "t_linoleum_gray_no_roof", - "S": "t_floor", - "T": "t_tree", - "U": "t_sidewalk", - "V": "t_laminated_glass", - "W": "t_floor", - "X": "t_floor", - "Y": "t_floor", - "Z": "t_laminated_door_glass_c", - "[": "t_laminated_door_glass_c", - "]": "t_laminated_door_glass_o", - "_": "t_pavement", - "a": "t_railing_v", - "b": "t_floor", - "c": "t_floor", - "d": "t_floor", - "e": "t_floor", - "f": "t_floor", - "g": "t_carpet_red", - "h": "t_floor", - "i": "t_linoleum_gray_no_roof", - "j": "t_carpet_red", - "k": "t_linoleum_gray_no_roof", - "l": "t_floor", - "m": "t_carpet_red", - "n": "t_floor", - "o": "t_linoleum_gray_no_roof", - "p": "t_column", - "q": "t_linoleum_gray_no_roof", - "r": "t_floor", - "s": "t_sidewalk", - "t": "t_floor", - "u": "t_carpet_red", - "v": "t_carpet_red", - "w": "t_water_pool_shallow_outdoors", - "x": "t_floor", - "y": "t_linoleum_gray_no_roof", - "<": "t_stairs_up", - "z": "t_floor", - "|": "t_brick_wall" - }, - "toilets": { "t": { } } - }, { "type": "palette", "id": "mall_palette_2", @@ -205,6 +56,8 @@ "ȝ": "f_dryer", "Ʃ": "f_entertainment_center", "y": [ "f_indoor_plant", "f_indoor_plant_y" ], + "x": [ "f_machinery_light", "f_machinery_heavy", "f_machinery_old", "f_machinery_electronic" ], + "?": "f_console_broken", "z": [ [ "f_cardboard_box", 5 ], "f_crate_c" ] }, "terrain": { @@ -237,14 +90,12 @@ "+": "t_laminated_door_glass_c", "=": [ "t_door_c", "t_door_locked" ], "p": "t_column", - "x": [ "t_machinery_light", "t_machinery_heavy", "t_machinery_old", "t_machinery_electronic" ], "2": "t_wall_g", "5": "t_wall_wood", - "6": "t_carpet_red", - "7": "t_carpet_green", - "8": "t_carpet_purple", - "9": "t_carpet_yellow", - "?": "t_console_broken", + "6": "t_carpet_concrete_red", + "7": "t_carpet_concrete_green", + "8": "t_carpet_concrete_purple", + "9": "t_carpet_concrete_yellow", "§": "t_water_pool_shallow_outdoors" }, "toilets": { "t": { } } diff --git a/data/json/mapgen_palettes/mansion.json b/data/json/mapgen_palettes/mansion.json index 4cfd9008396d7..1475ec0f43184 100644 --- a/data/json/mapgen_palettes/mansion.json +++ b/data/json/mapgen_palettes/mansion.json @@ -16,6 +16,7 @@ "7": "f_indoor_plant", "8": "f_indoor_plant_y", "9": "f_indoor_plant_y", + "&": "f_console_broken", "?": "f_fireplace", "@": "f_statue", "A": "f_armchair", @@ -24,8 +25,8 @@ "D": "f_desk", "F": "f_fridge", "G": "f_dryer", - "H": "f_treadmill", - "I": "f_ergometer", + "H": [ "f_treadmill", "f_treadmill_mechanical" ], + "I": [ "f_ergometer", "f_ergometer_mechanical" ], "J": "f_bathtub", "K": [ [ "f_cardboard_box", 5 ], "f_crate_c", "f_crate_o" ], "L": [ [ "f_cardboard_box", 5 ], "f_crate_c", "f_crate_o" ], @@ -46,8 +47,8 @@ "e": "f_pool_table", "f": "f_fridge", "g": "f_dryer", - "h": "f_treadmill", - "i": "f_ergometer", + "h": [ "f_treadmill", "f_treadmill_mechanical" ], + "i": [ "f_ergometer", "f_ergometer_mechanical" ], "j": "f_shower", "l": "f_bookcase", "m": "f_locker", @@ -65,28 +66,27 @@ }, "terrain": { "%": "t_door_locked_interior", - "&": "t_console_broken", "!": "t_region_groundcover_urban", - ")": "t_carpet_red", + ")": "t_carpet_concrete_red", "+": "t_door_c", ",": "t_sidewalk", - "-": "t_carpet_red", + "-": "t_carpet_concrete_red", "/": "t_linoleum_gray", - "2": "t_carpet_red", + "2": "t_carpet_concrete_red", "3": "t_linoleum_gray", "4": "t_concrete", - "6": "t_carpet_red", + "6": "t_carpet_concrete_red", "7": "t_concrete", "9": "t_linoleum_gray", "<": "t_stairs_up", "=": "t_linoleum_gray", ">": "t_stairs_down", - "A": "t_carpet_red", - "B": "t_carpet_red", + "A": "t_carpet_concrete_red", + "B": "t_carpet_concrete_red", "C": "t_linoleum_gray", - "D": "t_carpet_red", - "E": "t_carpet_red", - "F": "t_carpet_red", + "D": "t_carpet_concrete_red", + "E": "t_carpet_concrete_red", + "F": "t_carpet_concrete_red", "G": "t_linoleum_gray", "H": "t_linoleum_gray", "I": "t_linoleum_gray", @@ -97,17 +97,17 @@ "P": "t_linoleum_gray", "Q": "t_linoleum_gray", "R": "t_linoleum_gray", - "S": "t_carpet_red", - "T": "t_carpet_red", - "U": "t_carpet_red", - "V": "t_carpet_red", + "S": "t_carpet_concrete_red", + "T": "t_carpet_concrete_red", + "U": "t_carpet_concrete_red", + "V": "t_carpet_concrete_red", "W": "t_linoleum_gray", "X": "t_wall", "Y": "t_linoleum_gray", - "Z": "t_carpet_red", + "Z": "t_carpet_concrete_red", "[": "t_chaingate_c", "_": "t_thconc_floor", - "d": "t_carpet_red", + "d": "t_carpet_concrete_red", "j": "t_linoleum_gray", "o": "t_door_frame", "x": "t_wall_glass", @@ -117,14 +117,8 @@ { "type": "palette", "id": "mansion_palette_basement", - "terrain": { - "#": "t_rock", - "*": "t_machinery_old", - "?": "t_generator_broken", - "X": "t_brick_wall", - "]": "t_sewage_pipe", - "p": "t_sewage_pump" - } + "terrain": { "#": "t_rock", "X": "t_brick_wall", "]": "t_sewage_pipe", "p": "t_sewage_pump" }, + "furniture": { "*": "f_machinery_old", "?": "f_generator_broken" } }, { "type": "palette", diff --git a/data/json/mapgen_palettes/microlab.json b/data/json/mapgen_palettes/microlab.json index e60bcc3cc3e90..12dfcdb76288c 100644 --- a/data/json/mapgen_palettes/microlab.json +++ b/data/json/mapgen_palettes/microlab.json @@ -9,7 +9,6 @@ "2": "t_door_glass_frosted_lab_c", "4": "t_door_metal_pickable", "5": "t_door_metal_locked", - "6": "t_console_broken", "[": "t_door_glass_c", "-": "t_wall_metal", "y": "t_pavement_y", @@ -27,6 +26,7 @@ "&": "f_toilet", "~": "f_shower", "@": "f_bed", + "6": "f_console_broken", "a": "f_armchair", "k": "f_cupboard", "D": "f_dresser", diff --git a/data/json/mapgen_palettes/military/mil_base_palette.json b/data/json/mapgen_palettes/military/mil_base_palette.json index b77256f8be1e3..c52531a943cbe 100644 --- a/data/json/mapgen_palettes/military/mil_base_palette.json +++ b/data/json/mapgen_palettes/military/mil_base_palette.json @@ -48,15 +48,11 @@ "&": "t_grate", "e": "t_gates_mech_control", "5": "t_card_military", - "*": "t_gas_tank", + "*": "t_pavement", "%": "t_pit_corpsed", "8": "t_wall_metal", "9": "t_metal_floor", - "J": "t_generator_broken", - "p": "t_plut_generator", "Z": "t_radio_tower", - "'": "t_console_broken", - "0": "t_console", "@": "t_rock", "~": "t_gutter_downspout" }, @@ -66,6 +62,7 @@ "#": "f_desk", "[": "f_table", ":": "f_table", + "*": "f_gas_tank", "h": "f_chair", "$": "f_filing_cabinet", "`": "f_shredder", @@ -73,6 +70,10 @@ "c": "f_counter", "S": "f_sink", "o": "f_oven", + "J": "f_generator_broken", + "p": "f_compact_ASRG_containment", + "'": "f_console_broken", + "0": "f_console", "t": "f_trashcan", "Y": "f_rack_coat", "O": "f_bookcase", @@ -96,7 +97,7 @@ "L": "f_shower", "6": "f_water_heater", "7": "f_standing_tank", - "H": "f_standing_tank", + "H": "f_diesel_tank", "j": "f_home_furnace", "q": "f_drill_press", "Q": "f_bandsaw", diff --git a/data/json/mapgen_palettes/movie_theater_palette.json b/data/json/mapgen_palettes/movie_theater_palette.json index 87e6569e2813e..cc02ca2b802fc 100644 --- a/data/json/mapgen_palettes/movie_theater_palette.json +++ b/data/json/mapgen_palettes/movie_theater_palette.json @@ -27,7 +27,8 @@ "o": "f_oven", "r": "f_rack", "F": "f_vending_c", - "v": "f_vending_c" + "v": "f_vending_c", + "Z": "f_console_broken" }, "terrain": { "$": "t_carpet_green", @@ -50,7 +51,6 @@ "d": "t_door_c", "a": "t_atm", "w": "t_window", - "Z": "t_console_broken", "-": "t_railing_h", "R": "t_railing_h", "<": "t_ladder_up" diff --git a/data/json/mapgen_palettes/necropolis/necropolis_a.json b/data/json/mapgen_palettes/necropolis/necropolis_a.json index a2bc5a0120f70..303b01e515f4b 100644 --- a/data/json/mapgen_palettes/necropolis/necropolis_a.json +++ b/data/json/mapgen_palettes/necropolis/necropolis_a.json @@ -6,6 +6,8 @@ ")": "f_wreckage", "?": "f_sofa", "@": "f_bed", + "1": "f_generator_broken", + "6": "f_console_broken", "B": "f_bathtub", "C": "f_region_weed", "D": "f_trashcan", @@ -49,12 +51,12 @@ ",": "t_pavement_y", "-": "t_wall", ".": "t_region_groundcover_urban", - "1": "t_generator_broken", + "1": "t_thconc_floor", "2": "t_sewage_pipe", "3": "t_recycler", "4": "t_water_pump", "5": "t_slide", - "6": "t_console_broken", + "6": "t_thconc_floor", "7": "t_chainfence_h", "8": "t_chainfence_v", "9": "t_chaingate_l", diff --git a/data/json/mapgen_palettes/necropolis/necropolis_b1.json b/data/json/mapgen_palettes/necropolis/necropolis_b1.json index 6f7a3e82a7bc5..e26983d1de3fc 100644 --- a/data/json/mapgen_palettes/necropolis/necropolis_b1.json +++ b/data/json/mapgen_palettes/necropolis/necropolis_b1.json @@ -6,6 +6,7 @@ ")": "f_wreckage", "?": "f_sofa", "@": "f_bed", + "6": "f_console_broken", "D": "f_trashcan", "L": "f_locker", "S": "f_sink", @@ -37,9 +38,8 @@ "3": "t_sewage", "4": "t_water_pump", "5": "t_water_sh", - "6": "t_console_broken", - "7": "t_chainfence_h", - "8": "t_chainfence_v", + "7": "t_chainfence", + "8": "t_chainfence", "9": "t_chaingate_l", ";": "t_metal_floor", "<": "t_stairs_up", diff --git a/data/json/mapgen_palettes/necropolis/necropolis_b2.json b/data/json/mapgen_palettes/necropolis/necropolis_b2.json index 623867b26765b..b00668ee624ee 100644 --- a/data/json/mapgen_palettes/necropolis/necropolis_b2.json +++ b/data/json/mapgen_palettes/necropolis/necropolis_b2.json @@ -5,10 +5,16 @@ "furniture": { "?": "f_sofa", "@": "f_bed", + "$": "f_machinery_light", + "%": "f_machinery_heavy", + "(": "f_machinery_old", + "1": "f_generator_broken", + "_": "f_machinery_electronic", + "6": "f_console_broken", "B": "f_bathtub", - "C": "f_treadmill", + "C": [ "f_treadmill", "f_treadmill_mechanical" ], "D": "f_trashcan", - "J": "f_ergometer", + "J": [ "f_ergometer", "f_ergometer_mechanical" ], "L": "f_locker", "N": "f_robotic_arm", "O": "f_oven", @@ -35,9 +41,9 @@ " ": "t_metal_floor", "!": "t_bars", "#": "t_ladder_up", - "$": "t_machinery_light", - "%": "t_machinery_heavy", - "(": "t_machinery_old", + "$": "t_metal_floor", + "%": "t_metal_floor", + "(": "t_metal_floor", "*": "t_door_bar_locked", "+": "t_door_metal_c", ",": "t_pavement_y", @@ -45,14 +51,14 @@ ".": "t_rock", "/": "t_rock_floor", "0": "t_conveyor", - "1": "t_generator_broken", + "1": "t_metal_floor", "2": "t_sewage_pipe", "3": "t_sewage", "4": "t_water_pump", "5": "t_gates_control_metal", - "6": "t_console_broken", - "7": "t_chainfence_h", - "8": "t_chainfence_v", + "6": "t_metal_floor", + "7": "t_chainfence", + "8": "t_chainfence", "9": "t_chaingate_l", ":": "t_door_locked", ";": "t_metal_floor", @@ -85,8 +91,8 @@ "Z": "t_metal_floor", "[": "t_door_glass_c", "^": "t_underbrush", - "_": "t_machinery_electronic", - "a": "t_railing_v", + "_": "t_metal_floor", + "a": "t_railing", "b": "t_dirtfloor", "c": "t_metal_floor", "d": "t_metal_floor", diff --git a/data/json/mapgen_palettes/necropolis/necropolis_b3.json b/data/json/mapgen_palettes/necropolis/necropolis_b3.json index 1a28f41637278..2d1d612ed3279 100644 --- a/data/json/mapgen_palettes/necropolis/necropolis_b3.json +++ b/data/json/mapgen_palettes/necropolis/necropolis_b3.json @@ -5,10 +5,16 @@ "furniture": { "?": "f_sofa", "@": "f_bed", + "$": "f_machinery_light", + "%": "f_machinery_heavy", + "(": "f_machinery_old", + "1": "f_generator_broken", + "_": "f_machinery_electronic", + "6": "f_console_broken", "B": "f_bathtub", - "C": "f_treadmill", + "C": [ "f_treadmill", "f_treadmill_mechanical" ], "D": "f_trashcan", - "J": "f_ergometer", + "J": [ "f_ergometer", "f_ergometer_mechanical" ], "L": "f_locker", "N": "f_robotic_arm", "O": "f_oven", @@ -36,9 +42,9 @@ " ": "t_metal_floor", "!": "t_bars", "#": "t_ladder_up", - "$": "t_machinery_light", - "%": "t_machinery_heavy", - "(": "t_machinery_old", + "$": "t_metal_floor", + "%": "t_metal_floor", + "(": "t_metal_floor", "*": "t_door_bar_locked", "+": "t_door_metal_c", ",": "t_pavement_y", @@ -46,14 +52,14 @@ ".": "t_rock", "/": "t_rock_floor", "0": "t_conveyor", - "1": "t_generator_broken", + "1": "t_metal_floor", "2": "t_potential_trans", "3": "t_sewage", "4": "t_water_pump", "5": "t_gates_control_metal", - "6": "t_console_broken", + "6": "t_metal_floor", "7": "t_backboard", - "8": "t_chainfence_v", + "8": "t_chainfence", "9": "t_chaingate_l", ":": "t_door_locked", ";": "t_metal_floor", @@ -86,7 +92,7 @@ "Z": "t_metal_floor", "[": "t_door_glass_c", "^": "t_underbrush", - "_": "t_machinery_electronic", + "_": "t_metal_floor", "a": "t_railing_v", "b": "t_dirtfloor", "c": "t_metal_floor", diff --git a/data/json/mapgen_palettes/office.json b/data/json/mapgen_palettes/office.json index 6deaba4d80ed2..05995b369c9cc 100644 --- a/data/json/mapgen_palettes/office.json +++ b/data/json/mapgen_palettes/office.json @@ -23,7 +23,6 @@ "C": "t_linoleum_white", "y": "t_linoleum_white", " ": "t_region_groundcover_urban", - "x": "t_console_broken", ",": "t_pavement_y", "_": "t_pavement", "%": [ [ "t_region_shrub_decorative", 16 ], [ "t_region_groundcover_forest", 5 ] ], @@ -46,9 +45,7 @@ "2": "t_gutter_east", "3": "t_gutter_south", "4": "t_gutter_west", - "5": "t_gutter_drop", - "X": "t_generator_broken", - "N": "t_machinery_heavy" + "5": "t_gutter_drop" }, "furniture": { "?": "f_sofa", @@ -72,6 +69,9 @@ "a": "f_trashcan", "F": "f_filing_cabinet", "Q": "f_safe_l", + "x": "f_console_broken", + "X": "f_generator_broken", + "N": "f_machinery_heavy", "y": "f_locker", "B": "f_bulletin", "6": "f_cellphone_booster", diff --git a/data/json/mapgen_palettes/office_doctor.json b/data/json/mapgen_palettes/office_doctor.json index f76a559975113..591848cdd532e 100644 --- a/data/json/mapgen_palettes/office_doctor.json +++ b/data/json/mapgen_palettes/office_doctor.json @@ -7,14 +7,11 @@ "!": "t_door_locked_interior", "#": "t_wall_w", "$": "t_floor", - "%": "t_console_broken", "&": "t_floor", "+": "t_door_c", ".": "t_floor", "0": "t_window_alarm", "D": "t_floor", - "5": "t_console", - "6": "t_console", "9": "t_window_domestic", ":": "t_door_glass_c", ";": "t_door_locked", @@ -50,6 +47,9 @@ "furniture": { "$": "f_safe_l", "&": "f_toilet", + "%": "f_console_broken", + "5": "f_console", + "6": "f_console", "B": "f_bed", "C": "f_locker", "H": "f_locker", diff --git a/data/json/mapgen_palettes/prison.json b/data/json/mapgen_palettes/prison.json index 88118407be03f..44dce938d3699 100644 --- a/data/json/mapgen_palettes/prison.json +++ b/data/json/mapgen_palettes/prison.json @@ -40,7 +40,6 @@ "s": "t_sidewalk", "t": "t_floor", "w": "t_window", - "x": "t_console_broken", "y": "t_floor", "z": "t_floor", "|": "t_concrete_wall" @@ -64,6 +63,7 @@ "o": "f_bookcase", "r": "f_rack", "t": "f_table", + "x": "f_console_broken", "z": "f_rack" }, "toilets": { "T": { } }, diff --git a/data/json/mapgen_palettes/private_resort.json b/data/json/mapgen_palettes/private_resort.json index 39d90a1e3ec47..effeb1fe942e4 100644 --- a/data/json/mapgen_palettes/private_resort.json +++ b/data/json/mapgen_palettes/private_resort.json @@ -3,6 +3,7 @@ "type": "palette", "id": "p_resort_palette_main_floor", "furniture": { + "&": "f_console_broken", "f": "f_glass_fridge", "B": "f_workbench", "]": "f_fridge", @@ -72,7 +73,6 @@ "P": "t_concrete", "U": "t_water_pool", "m": "t_metal_floor", - "&": "t_console_broken", "p": "t_door_c_peep", "8": "t_door_curtain_c", "n": "t_carpet_green", @@ -189,6 +189,10 @@ "type": "palette", "id": "p_resort_palette_basement", "furniture": { + "&": "f_console_broken", + "1": "f_generator_broken", + "2": "f_machinery_light", + "3": "f_machinery_heavy", "L": "f_locker", "S": "f_utility_shelf", "f": "f_glass_fridge", @@ -212,10 +216,6 @@ "V": "t_bars", "0": "t_ballistic_glass", "l": "t_door_metal_locked", - "&": "t_console_broken", - "1": "t_generator_broken", - "2": "t_machinery_light", - "3": "t_machinery_heavy", "?": "t_secretdoor_metal_c", ",": "t_metal_floor", "m": "t_wall_metal", @@ -233,6 +233,7 @@ "(": "f_small_satelitte_dish", "s": "f_solar_unit", "H": "f_chimney", + "l": "f_machinery_light", "v": "f_roof_turbine_vent" }, "terrain": { @@ -241,8 +242,7 @@ ">": "t_stairs_down", "r": "t_guardrail", "#": "t_sai_box_damaged", - "I": "t_lgtn_arrest", - "l": "t_machinery_light" + "I": "t_lgtn_arrest" } } ] diff --git a/data/json/mapgen_palettes/refugee_center.json b/data/json/mapgen_palettes/refugee_center.json index cefb285301468..15e312bae19ee 100644 --- a/data/json/mapgen_palettes/refugee_center.json +++ b/data/json/mapgen_palettes/refugee_center.json @@ -13,7 +13,6 @@ "0": "t_door_locked_interior", "1": "t_reinforced_glass_shutter", "2": "t_utility_light", - "6": "t_console_broken", "!": "t_fence_barbed", "=": "t_door_metal_locked", ">": "t_stairs_down", @@ -27,6 +26,7 @@ "}": "t_sidewalk" }, "furniture": { + "6": "f_console_broken", ")": "f_wreckage", "@": "f_bed", "D": "f_trashcan", diff --git a/data/json/mapgen_palettes/robofachq.json b/data/json/mapgen_palettes/robofachq.json index 9055efc84710d..a56fc15e5cdf0 100644 --- a/data/json/mapgen_palettes/robofachq.json +++ b/data/json/mapgen_palettes/robofachq.json @@ -9,7 +9,6 @@ "2": "t_door_metal_c", "4": "t_door_metal_pickable", "5": "t_door_metal_locked", - "6": "t_console_broken", "[": "t_door_glass_c", "-": "t_wall", "|": "t_concrete_wall", @@ -28,11 +27,12 @@ ">": "t_stairs_down", "0": "t_window_empty", ":": "t_window_domestic", - "u": "t_chainfence_h", - "U": "t_chainfence_v", + "u": "t_chainfence", + "U": "t_chainfence", "#": "t_rock" }, "furniture": { + "6": "f_console_broken", "&": "f_toilet", "~": "f_shower", "@": "f_bed", diff --git a/data/json/mapgen_palettes/shelter.json b/data/json/mapgen_palettes/shelter.json index f3bb04936e2eb..d0790f5f21591 100644 --- a/data/json/mapgen_palettes/shelter.json +++ b/data/json/mapgen_palettes/shelter.json @@ -11,18 +11,24 @@ "+": "t_door_c", "-": "t_wall_w", "_": "t_linoleum_white", - "6": "t_console", ":": "t_window_domestic", ">": "t_stairs_down", "<": "t_stairs_up", - "x": "t_console_broken", "|": "t_wall_w", ";": "t_concrete_wall", "*": "t_ladder_up", "=": "t_door_locked_interior", "4": "t_gutter_downspout" }, - "furniture": { "b": "f_bench", "c": "f_cupboard", "l": "f_locker", "S": "f_sink", "%": "f_trashcan" }, + "furniture": { + "6": "f_console", + "x": "f_console_broken", + "b": "f_bench", + "c": "f_cupboard", + "l": "f_locker", + "S": "f_sink", + "%": "f_trashcan" + }, "toilets": { "T": { } }, "items": { "l": { "item": "SUS_evac_shelter_locker", "chance": 80 }, diff --git a/data/json/mapgen_palettes/steel_mill_palette.json b/data/json/mapgen_palettes/steel_mill_palette.json index d98d6042f5163..981ad62d7f47b 100644 --- a/data/json/mapgen_palettes/steel_mill_palette.json +++ b/data/json/mapgen_palettes/steel_mill_palette.json @@ -24,10 +24,6 @@ ">": "t_stairs_down", "/": "t_ladder_up", "I": "t_ladder_down", - "c": "t_console_broken", - "m": "t_machinery_light", - "M": "t_machinery_heavy", - "E": "t_machinery_electronic", "8": "t_bulk_tank", "^": "t_railroad_rubble", "X": "t_railroad_track", @@ -43,13 +39,17 @@ ";": "t_gates_control_concrete", "a": "t_open_air_rooved", "r": "t_metal_flat_roof", - "g": "t_generator_broken", "G": "t_grate", "2": "t_sai_box", "5": "t_switchgear_l", "`": "t_thconc_y" }, "furniture": { + "c": "f_console_broken", + "m": "f_machinery_light", + "M": "f_machinery_heavy", + "E": "f_machinery_electronic", + "g": "f_generator_broken", "h": "f_chair", "T": "f_table", "A": "f_air_conditioner", diff --git a/data/json/materials.json b/data/json/materials.json index de89a0e441c49..ecefca41f053f 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -1111,6 +1111,7 @@ "specific_heat_liquid": 1.5, "specific_heat_solid": 1.2, "latent_heat": 10, + "soft": true, "bash_resist": 1, "cut_resist": 1, "bullet_resist": 1, @@ -1135,6 +1136,7 @@ "specific_heat_liquid": 1.5, "specific_heat_solid": 1.2, "latent_heat": 10, + "soft": true, "bash_resist": 1, "cut_resist": 1, "bullet_resist": 1, @@ -1154,6 +1156,7 @@ "specific_heat_liquid": 1.5, "specific_heat_solid": 1.2, "latent_heat": 10, + "soft": true, "bash_resist": 1, "cut_resist": 1, "bullet_resist": 1, diff --git a/data/json/monster_factions.json b/data/json/monster_factions.json index 70a1991aad9d6..5614331a49660 100644 --- a/data/json/monster_factions.json +++ b/data/json/monster_factions.json @@ -54,6 +54,12 @@ "name": "jabberwock", "by_mood": [ "jabberwock" ] }, + { + "type": "MONSTER_FACTION", + "name": "robofac", + "neutral": [ "cop_bot", "defense_bot", "utility_bot", "animal" ], + "hate": [ "zombie", "fungus", "cult", "triffid", "nether" ] + }, { "type": "MONSTER_FACTION", "name": "bot", @@ -71,6 +77,13 @@ "base_faction": "bot", "neutral": [ "cop_bot", "military", "utility_bot", "science", "small_animal" ] }, + { + "type": "MONSTER_FACTION", + "name": "exodii", + "neutral": [ "bot" ], + "by_mood": [ "animal", "nether" ], + "hate": [ "zombie", "fungus", "cult", "triffid" ] + }, { "type": "MONSTER_FACTION", "name": "science", diff --git a/data/json/monsterdrops/robofac.json b/data/json/monsterdrops/robofac.json index 8969e44dba9c3..30fbf09b87fca 100644 --- a/data/json/monsterdrops/robofac.json +++ b/data/json/monsterdrops/robofac.json @@ -1,8 +1,8 @@ -{ - "type": "item_group", - "subtype": "collection", - "id": "mon_robofac_prototype_drops", - "entries": [ - { "item": "robofac_test_data" } - ] -} +[ + { + "type": "item_group", + "subtype": "collection", + "id": "mon_robofac_prototype_drops", + "entries": [ { "item": "robofac_test_data" } ] + } +] diff --git a/data/json/monsterdrops/zombie_cop.json b/data/json/monsterdrops/zombie_cop.json index 8ef549093c7b1..27039dd5a3528 100644 --- a/data/json/monsterdrops/zombie_cop.json +++ b/data/json/monsterdrops/zombie_cop.json @@ -30,7 +30,8 @@ [ "1st_aid", 30 ], [ "armor_riot", 20 ], [ "airhorn", 5 ], - [ "bandages", 20 ], + [ "bandages", 10 ], + [ "adhesive_bandages", 10 ], [ "tacvest", 5 ], [ "heavy_flashlight", 35 ], [ "holster", 25 ], @@ -113,7 +114,10 @@ "id": "swat_zombie_gear", "subtype": "collection", "entries": [ - { "collection": [ { "item": "bandages", "prob": 60 }, { "item": "1st_aid", "prob": 20 } ], "prob": 25 }, + { + "collection": [ { "item": "adhesive_bandages", "prob": 30 }, { "item": "bandages", "prob": 30 }, { "item": "1st_aid", "prob": 20 } ], + "prob": 25 + }, { "collection": [ { "item": "swat_armor", "prob": 50 }, { "item": "kevlar", "prob": 25 }, { "item": "tacvest", "prob": 5 } ], "prob": 75 diff --git a/data/json/monstergroups/mammal.json b/data/json/monstergroups/mammal.json index a0bcab9009071..72138773b29eb 100644 --- a/data/json/monstergroups/mammal.json +++ b/data/json/monstergroups/mammal.json @@ -119,7 +119,8 @@ { "monster": "mon_cat_sphynx", "freq": 50, "cost_multiplier": 0 }, { "monster": "mon_cat_sphynx_kitten", "freq": 5, "cost_multiplier": 0 }, { "monster": "mon_cat_chonker", "freq": 50, "cost_multiplier": 0 }, - { "monster": "mon_cat_chonker_kitten", "freq": 5, "cost_multiplier": 0 } + { "monster": "mon_cat_chonker_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_tiger", "freq": 1, "cost_multiplier": 30 } ] } ] diff --git a/data/json/monstergroups/misc.json b/data/json/monstergroups/misc.json index 19c1b4e05059c..b3b5b4718c62c 100644 --- a/data/json/monstergroups/misc.json +++ b/data/json/monstergroups/misc.json @@ -47,7 +47,8 @@ { "monster": "mon_zombie_pig", "freq": 10, "cost_multiplier": 25, "starts": 2160, "pack_size": [ 1, 5 ] }, { "monster": "mon_giant_cockroach", "freq": 10, "cost_multiplier": 1, "pack_size": [ 1, 5 ] }, { "monster": "mon_pregnant_giant_cockroach", "freq": 1, "cost_multiplier": 3 }, - { "monster": "mon_giant_cockroach_nymph", "freq": 5, "cost_multiplier": 1 } + { "monster": "mon_giant_cockroach_nymph", "freq": 5, "cost_multiplier": 1 }, + { "monster": "mon_tiger", "freq": 1, "cost_multiplier": 30 } ] }, { @@ -171,7 +172,8 @@ { "monster": "mon_dog_zombie_rot", "freq": 15, "cost_multiplier": 3 }, { "monster": "mon_squirrel", "freq": 1, "cost_multiplier": 0 }, { "monster": "mon_cat", "freq": 10, "cost_multiplier": 0 }, - { "monster": "mon_dog", "freq": 10, "cost_multiplier": 0 } + { "monster": "mon_dog", "freq": 10, "cost_multiplier": 0 }, + { "monster": "mon_tiger", "freq": 1, "cost_multiplier": 30 } ] } ] diff --git a/data/json/monstergroups/wilderness.json b/data/json/monstergroups/wilderness.json index 3941cc89289c4..cadd5f84e44fb 100644 --- a/data/json/monstergroups/wilderness.json +++ b/data/json/monstergroups/wilderness.json @@ -131,6 +131,10 @@ { "monster": "mon_crow", "freq": 25, "cost_multiplier": 0, "pack_size": [ 1, 14 ], "conditions": [ "DAY" ] }, { "monster": "mon_deer", "freq": 4, "cost_multiplier": 2, "pack_size": [ 1, 5 ] }, { "monster": "mon_deer", "freq": 16, "cost_multiplier": 2, "pack_size": [ 1, 5 ], "conditions": [ "DAY" ] }, + { "monster": "mon_zeer", "freq": 4, "cost_multiplier": 10, "pack_size": [ 1, 5 ], "starts": 72 }, + { "monster": "mon_zeer", "freq": 4, "cost_multiplier": 10, "pack_size": [ 1, 5 ], "starts": 168 }, + { "monster": "mon_zeer", "freq": 4, "cost_multiplier": 10, "pack_size": [ 1, 5 ], "starts": 672 }, + { "monster": "mon_zeer", "freq": 4, "cost_multiplier": 10, "pack_size": [ 1, 5 ], "starts": 2160 }, { "monster": "mon_dog", "freq": 3, "cost_multiplier": 25, "pack_size": [ 1, 6 ] }, { "monster": "mon_dog", @@ -725,6 +729,14 @@ { "monster": "mon_zolf", "freq": 2, "cost_multiplier": 2, "starts": 168, "pack_size": [ 1, 4 ] }, { "monster": "mon_zolf", "freq": 2, "cost_multiplier": 2, "starts": 672, "pack_size": [ 1, 4 ] }, { "monster": "mon_zolf", "freq": 2, "cost_multiplier": 2, "starts": 2160, "pack_size": [ 1, 4 ] }, + { + "monster": "mon_zombie_horse", + "freq": 2, + "cost_multiplier": 15, + "ends": 2000, + "conditions": [ "DAWN", "SPRING", "SUMMER", "AUTUMN" ], + "pack_size": [ 1, 4 ] + }, { "monster": "mon_groundhog", "freq": 30, @@ -1620,6 +1632,10 @@ "starts": 792, "conditions": [ "DUSK", "NIGHT", "DAWN", "SPRING", "SUMMER", "AUTUMN" ] }, + { "monster": "mon_zpider_mass", "freq": 1, "cost_multiplier": 10, "starts": 72 }, + { "monster": "mon_zpider_mass", "freq": 1, "cost_multiplier": 10, "starts": 168 }, + { "monster": "mon_zpider_mass", "freq": 1, "cost_multiplier": 10, "starts": 672 }, + { "monster": "mon_zpider_mass", "freq": 1, "cost_multiplier": 10, "starts": 2160 }, { "monster": "mon_wasp", "freq": 3, @@ -3155,6 +3171,10 @@ "starts": 792, "conditions": [ "DUSK", "NIGHT", "DAWN", "SPRING", "SUMMER", "AUTUMN" ] }, + { "monster": "mon_zpider_mass", "freq": 3, "cost_multiplier": 2, "starts": 72 }, + { "monster": "mon_zpider_mass", "freq": 3, "cost_multiplier": 2, "starts": 168 }, + { "monster": "mon_zpider_mass", "freq": 3, "cost_multiplier": 2, "starts": 672 }, + { "monster": "mon_zpider_mass", "freq": 3, "cost_multiplier": 2, "starts": 2160 }, { "monster": "mon_wasp", "freq": 1, "cost_multiplier": 0, "conditions": [ "SPRING", "SUMMER", "AUTUMN" ] }, { "monster": "mon_wasp", diff --git a/data/json/monstergroups/zanimal_upgrades.json b/data/json/monstergroups/zanimal_upgrades.json index 8ed879c184ece..63728e8f84c79 100644 --- a/data/json/monstergroups/zanimal_upgrades.json +++ b/data/json/monstergroups/zanimal_upgrades.json @@ -1,4 +1,24 @@ [ + { + "type": "monstergroup", + "name": "GROUP_ZOMBIE_DOG_UPGRADE", + "default": "mon_dog_skeleton", + "//": "No bionics or fungal", + "monsters": [ + { "monster": "mon_dog_skeleton", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_dog_zombie_brute", "freq": 45, "cost_multiplier": 2 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_ZOLF_UPGRADE", + "default": "mon_wolf_skeleton", + "//": "No bionics or fungal", + "monsters": [ + { "monster": "mon_wolf_skeleton", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_dog_zombie_brute", "freq": 45, "cost_multiplier": 2 } + ] + }, { "type": "monstergroup", "name": "GROUP_ZOMBEAR_UPGRADE", diff --git a/data/json/monstergroups/zombies.json b/data/json/monstergroups/zombies.json index 251c75fcd26c7..a4b77da6f149e 100644 --- a/data/json/monstergroups/zombies.json +++ b/data/json/monstergroups/zombies.json @@ -10,6 +10,9 @@ { "monster": "mon_zombie_fat", "freq": 50, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, { "monster": "mon_zombie_rot", "freq": 50, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, { "monster": "mon_zombie_runner", "freq": 20, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, + { "monster": "mon_feral_human_pipe", "freq": 40, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_crowbar", "freq": 40, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_axe", "freq": 20, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, { "monster": "mon_zombie_crawler", "freq": 25, "cost_multiplier": 1 }, { "monster": "mon_zombie_brainless", "freq": 25, "cost_multiplier": 1 }, { "monster": "mon_zombie_dog", "freq": 25, "cost_multiplier": 1, "pack_size": [ 2, 3 ] } @@ -58,6 +61,9 @@ { "monster": "mon_zombie_fat", "freq": 50, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, { "monster": "mon_zombie_rot", "freq": 50, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, { "monster": "mon_zombie_runner", "freq": 20, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, + { "monster": "mon_feral_human_pipe", "freq": 20, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_crowbar", "freq": 20, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_axe", "freq": 10, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, { "monster": "mon_zombie_crawler", "freq": 25, "cost_multiplier": 1 }, { "monster": "mon_zombie_brainless", "freq": 25, "cost_multiplier": 1 } ] @@ -105,6 +111,9 @@ { "monster": "mon_beekeeper", "freq": 1, "cost_multiplier": 5 }, { "monster": "mon_zombie_technician", "freq": 1, "cost_multiplier": 12 }, { "monster": "mon_zombie_runner", "freq": 20, "cost_multiplier": 5, "pack_size": [ 1, 4 ] }, + { "monster": "mon_feral_human_pipe", "freq": 4, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_crowbar", "freq": 4, "cost_multiplier": 1, "pack_size": [ 2, 3 ] }, + { "monster": "mon_feral_human_axe", "freq": 2, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, { "monster": "mon_zombie_brainless", "freq": 65, "cost_multiplier": 1 } ] }, @@ -119,6 +128,9 @@ { "monster": "mon_zombie_rot", "freq": 60, "cost_multiplier": 0 }, { "monster": "mon_zombie_dog", "freq": 50, "cost_multiplier": 0 }, { "monster": "mon_zombie_crawler", "freq": 30, "cost_multiplier": 0 }, + { "monster": "mon_feral_human_pipe", "freq": 40, "cost_multiplier": 0 }, + { "monster": "mon_feral_human_crowbar", "freq": 40, "cost_multiplier": 0 }, + { "monster": "mon_feral_human_axe", "freq": 20, "cost_multiplier": 0 }, { "monster": "mon_zombie_brainless", "freq": 30, "cost_multiplier": 0 } ] }, @@ -475,6 +487,9 @@ { "monster": "mon_zombie", "freq": 1, "cost_multiplier": 7, "pack_size": [ 5, 10 ] }, { "monster": "mon_zombie", "freq": 1, "cost_multiplier": 13, "pack_size": [ 15, 20 ] }, { "monster": "mon_zombie", "freq": 1, "cost_multiplier": 20, "pack_size": [ 25, 30 ] }, + { "monster": "mon_feral_human_pipe", "freq": 4, "cost_multiplier": 1, "pack_size": [ 5, 9 ] }, + { "monster": "mon_feral_human_crowbar", "freq": 4, "cost_multiplier": 1, "pack_size": [ 4, 7 ] }, + { "monster": "mon_feral_human_axe", "freq": 2, "cost_multiplier": 2, "pack_size": [ 2, 4 ] }, { "monster": "mon_zombie", "freq": 75, "cost_multiplier": 2 }, { "monster": "mon_zombie_fat", "freq": 75, "cost_multiplier": 2 }, { "monster": "mon_zombie_fat", "freq": 3, "cost_multiplier": 7, "pack_size": [ 3, 5 ] }, @@ -561,6 +576,16 @@ { "monster": "mon_zombie", "freq": 40, "cost_multiplier": 1 } ] }, + { + "name": "FERAL_HUMANS", + "type": "monstergroup", + "default": "mon_feral_human_pipe", + "monsters": [ + { "monster": "mon_feral_human_pipe", "freq": 100, "cost_multiplier": 1, "pack_size": [ 3, 8 ] }, + { "monster": "mon_feral_human_crowbar", "freq": 40, "cost_multiplier": 1, "pack_size": [ 2, 6 ] }, + { "monster": "mon_feral_human_axe", "freq": 20, "cost_multiplier": 2, "pack_size": [ 1, 4 ] } + ] + }, { "type": "monstergroup", "name": "DUMP_ZOMBIES", diff --git a/data/json/monsters/cyborgs.json b/data/json/monsters/cyborgs.json index 37a7a628f462b..c611f0502f100 100644 --- a/data/json/monsters/cyborgs.json +++ b/data/json/monsters/cyborgs.json @@ -85,5 +85,131 @@ "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS" ] + }, + { + "id": "mon_exodii_worker", + "type": "MONSTER", + "name": "Exodii worker", + "description": "This is a mostly humanoid robot equipped with various construction tools.", + "default_faction": "exodii", + "volume": "119 L", + "weight": "221 kg", + "species": [ "CYBORG" ], + "bodytype": "human", + "material": [ "steel" ], + "speed": 110, + "symbol": "e", + "morale": 20, + "aggression": -20, + "hp": 125, + "color": "light_gray", + "melee_skill": 8, + "melee_dice": 2, + "melee_dice_sides": 6, + "melee_cut": 12, + "armor_bash": 12, + "armor_cut": 28, + "vision_day": 50, + "vision_night": 10, + "revert_to_itype": "e_scrap", + "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT" ], + "death_drops": { "subtype": "collection", "groups": [ [ "robots", 80 ] ] }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "HEARS", "GOODHEARING", "NOHEAD", "NO_BREATHE", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS", "HIT_AND_RUN" ] + }, + { + "id": "mon_exodii_quad", + "type": "MONSTER", + "name": "Exodii quadruped", + "description": "This enormous quadrupedal robot seems to be cobbled together from parts, most of them unfamiliar to you. It moves with a heavy, oddly graceful gait, its footsteps leaving shallow craters behind. It bristles with an arsenal of weaponry, but doesn't seem in a particular rush to target you.", + "default_faction": "exodii", + "volume": "413 L", + "weight": "517 kg", + "species": [ "CYBORG" ], + "bodytype": "dog", + "material": [ "steel" ], + "speed": 110, + "symbol": "M", + "aggression": -5, + "morale": 70, + "hp": 240, + "color": "light_gray", + "melee_skill": 10, + "melee_dice": 3, + "melee_dice_sides": 8, + "melee_cut": 12, + "armor_bash": 42, + "armor_cut": 48, + "vision_day": 50, + "vision_night": 20, + "revert_to_itype": "e_scrap", + "starting_ammo": { "123ln": 3000 }, + "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT" ], + "special_attacks": [ + [ "FLAMETHROWER", 10 ], + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "pamd68", + "ammo_type": "123ln", + "fake_skills": [ [ "gun", 5 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 41, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 400, + "targeting_timeout_extend": -10, + "no_ammo_sound": "a chk!" + } + ], + "death_drops": { "subtype": "collection", "groups": [ [ "robots", 80 ] ] }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "HEARS", "GOODHEARING", "NOHEAD", "NO_BREATHE", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS", "HIT_AND_RUN" ] + }, + { + "id": "mon_zomborg", + "type": "MONSTER", + "name": "zomborg", + "description": "A mix of dead human and even deader technology, this twisted mess of steel and flesh moves like a puppet in the hands of an angry toddler. Its robotic components seem to have shut down, and new bands of flesh have wrapped around them, tugging and pulling them in awkward directions. Bits of metallic skeleton and armor plating jut from its decaying flesh.", + "default_faction": "zombie", + "looks_like": "mon_exodii_worker", + "volume": "120 L", + "weight": "200 kg", + "species": [ "CYBORG", "ZOMBIE" ], + "bodytype": "human", + "material": [ "steel", "flesh" ], + "speed": 60, + "symbol": "Z", + "morale": 100, + "aggression": 100, + "hp": 125, + "color": "light_gray", + "melee_skill": 3, + "melee_dice": 2, + "melee_dice_sides": 6, + "melee_cut": 12, + "armor_bash": 12, + "armor_cut": 28, + "vision_night": 3, + "special_attacks": [ { "type": "bite", "cooldown": 5 }, [ "GRAB", 7 ], [ "scratch", 20 ] ], + "death_drops": { "subtype": "collection", "groups": [ [ "robots", 80 ] ] }, + "death_function": [ "FIREBALL" ], + "harvest": "mon_zomborg", + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "STUMBLES", + "WARM", + "BASHES", + "GROUP_BASH", + "POISON", + "NO_BREATHE", + "REVIVES", + "PUSH_MON", + "FILTHY" + ] } ] diff --git a/data/json/monsters/drones.json b/data/json/monsters/drones.json index 3f93e922992a4..e902291d66fe5 100644 --- a/data/json/monsters/drones.json +++ b/data/json/monsters/drones.json @@ -129,5 +129,61 @@ "revert_to_itype": "bot_mininuke_hack", "starting_ammo": { "mininuke": 1 }, "special_attacks": [ [ "KAMIKAZE", 0 ] ] + }, + { + "abstract": "exodii_sniper_drone", + "type": "MONSTER", + "name": { "str": "balloon sniper-drone" }, + "description": "This unusual contraption looks like a combination of a weather balloon and a quadcopter. Beneath the crude box containing its components hangs a small articulated rig wielding an integrated rifle. Its propellers flicker to life briefly, then shut down again, keeping it mostly stationary despite the air currents. It looks capable of hanging in the air for quite a long time before running out of power.", + "default_faction": "exodii", + "species": [ "ROBOT" ], + "volume": "5000 L", + "weight": "150 kg", + "//": "weight and dimensions based on the approx. size of a Griff 350, which is a commercial cargo-hauling quadcopter. Then I added a large balloon on top.", + "hp": 20, + "speed": 70, + "armor_bash": 4, + "armor_cut": 3, + "material": [ "aluminum", "steel" ], + "symbol": "e", + "color": "light_green", + "aggression": -20, + "morale": 70, + "vision_day": 50, + "vision_night": 20, + "starting_ammo": { "123ln": 10 }, + "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT" ], + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 350, + "gun_type": "pamd71z", + "ammo_type": "123ln", + "fake_skills": [ [ "gun", 6 ], [ "rifle", 9 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 50, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": true, + "targeting_cost": 700, + "targeting_timeout_extend": -10, + "no_ammo_sound": "tick!" + } + ], + "death_drops": { "subtype": "collection", "groups": [ [ "robots", 80 ] ] }, + "death_function": [ "BROKEN" ], + "flags": [ + "SEES", + "HEARS", + "FLIES", + "NOHEAD", + "ELECTRONIC", + "NO_BREATHE", + "INTERIOR_AMMO", + "PATH_AVOID_DANGER_2", + "PRIORITIZE_TARGETS", + "HIT_AND_RUN" + ] } ] diff --git a/data/json/monsters/feral_humans.json b/data/json/monsters/feral_humans.json new file mode 100644 index 0000000000000..ed39a82bac961 --- /dev/null +++ b/data/json/monsters/feral_humans.json @@ -0,0 +1,77 @@ +[ + { + "id": "mon_feral_human_pipe", + "type": "MONSTER", + "name": { "str": "feral human" }, + "description": "Pupils dilated and what remains to be seen of the iris and sclera are bloodshot. It still breathes but the zombies treat it like one of them.", + "default_faction": "zombie", + "looks_like": "chud", + "bodytype": "human", + "species": [ "HUMAN" ], + "volume": "62500 ml", + "weight": "81500 g", + "hp": 80, + "speed": 100, + "material": [ "flesh" ], + "symbol": "@", + "color": "magenta", + "aggression": 30, + "morale": 100, + "melee_skill": 2, + "melee_dice": 1, + "melee_dice_sides": 3, + "melee_cut": 0, + "dodge": 1, + "harvest": "human", + "vision_day": 30, + "vision_night": 3, + "starting_ammo": { "rock": 6 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 5, + "move_cost": 150, + "gun_type": "feral_human_thrown_rock", + "fake_skills": [ [ "gun", 2 ], [ "throw", 2 ] ], + "fake_dex": 6, + "fake_per": 6, + "require_targeting_player": false, + "ranges": [ [ 2, 5, "DEFAULT" ] ], + "description": "They throw a loose brick at you!" + } + ], + "death_drops": "default_zombie_clothes", + "death_function": [ "NORMAL" ], + "zombify_into": "mon_zombie", + "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "HUMAN", "CAN_OPEN_DOORS", "PATH_AVOID_DANGER_2" ] + }, + { + "id": "mon_feral_human_crowbar", + "type": "MONSTER", + "copy-from": "mon_feral_human_pipe", + "melee_dice": 2, + "melee_dice_sides": 6, + "special_attacks": [ + { + "type": "gun", + "cooldown": 5, + "move_cost": 150, + "gun_type": "feral_human_thrown_rock", + "fake_skills": [ [ "gun", 2 ], [ "thrown", 2 ] ], + "fake_dex": 6, + "fake_per": 6, + "require_targeting_player": false, + "ranges": [ [ 2, 5, "DEFAULT" ] ], + "description": "They throw a loose brick at you!" + } + ] + }, + { + "id": "mon_feral_human_axe", + "type": "MONSTER", + "copy-from": "mon_feral_human_pipe", + "melee_dice": 3, + "melee_dice_sides": 8 + } +] diff --git a/data/json/monsters/fungus.json b/data/json/monsters/fungus.json index 7c19762afc1a9..d59b3102350e7 100644 --- a/data/json/monsters/fungus.json +++ b/data/json/monsters/fungus.json @@ -449,7 +449,6 @@ "WARM", "BASHES", "DESTROYS", - "BLEED", "POISON", "ATTACKMON", "NO_BREATHE", diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 87f3bf37ed61f..bb559d79c4962 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -98,7 +98,7 @@ "//": "220 days gestation period, the mother and cubs remain together for 16-17 months.", "baby_flags": [ "SPRING" ], "special_attacks": [ [ "EAT_FOOD", 20 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BLEED", "BASHES", "ATTACKMON" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BASHES", "ATTACKMON" ] }, { "id": "mon_beaver", @@ -194,7 +194,7 @@ "upgrades": { "age_grow": 38, "into": "mon_boar_wild" }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, "special_attacks": [ [ "EAT_FOOD", 40 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_boar_wild", @@ -232,7 +232,7 @@ "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], "special_attacks": [ [ "EAT_FOOD", 20 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_bobcat", @@ -563,18 +563,23 @@ "death_function": [ "NORMAL" ], "zombify_into": "mon_zougar", "harvest": "mammal_fur", - "flags": [ - "SEES", - "HEARS", - "GOODHEARING", - "SMELLS", - "ANIMAL", - "PATH_AVOID_DANGER_1", - "WARM", - "HIT_AND_RUN", - "KEENNOSE", - "BLEED" - ] + "flags": [ "SEES", "HEARS", "GOODHEARING", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ] + }, + { + "id": "mon_tiger", + "type": "MONSTER", + "name": { "str": "tiger" }, + "copy-from": "mon_cougar", + "description": "The majestic tiger, a large feline predator. Native to Asia, they are now most populous in private reserves in the United States. Fast and powerful, this predator is one of the most recognizable and beloved animals in the world. Also one of the deadliest.", + "volume": "190 L", + "weight": "190 kg", + "hp": 180, + "speed": 140, + "symbol": "T", + "morale": 60, + "melee_dice": 3, + "dodge": 2, + "zombify_into": "mon_ziger" }, { "id": "mon_cow_calf", @@ -644,6 +649,7 @@ "placate_triggers": [ "PLAYER_WEAK" ], "death_drops": { "subtype": "collection", "groups": [ [ "cow", 25 ] ], "//": "25% chance of an item from group cow" }, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zow", "harvest": "mammal_large_leather", "reproduction": { "baby_monster": "mon_cow_calf", "baby_count": 1, "baby_timer": 343 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], @@ -692,7 +698,7 @@ "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], "harvest": "mammal_fur", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ] }, { "id": "mon_coyote_wolf", @@ -724,7 +730,7 @@ "fear_triggers": [ "SOUND" ], "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_deer_fawn", @@ -786,6 +792,7 @@ "path_settings": { "max_dist": 10 }, "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "death_function": [ "NORMAL" ], + "zombify_into": "mon_zeer", "reproduction": { "baby_monster": "mon_deer_fawn", "baby_count": 1, "baby_timer": 330 }, "//": " 201 days gestation period. The fawn will stay with its mother for approximately one year, suckling for three to four months.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 12 }, @@ -1593,7 +1600,7 @@ "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ] }, { "id": "mon_fox_red", @@ -1624,7 +1631,7 @@ "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ] }, { "id": "mon_groundhog", @@ -1708,6 +1715,7 @@ "harvest": "mammal_large_leather", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 2 }, "special_attacks": [ [ "EAT_CROP", 60 ] ], + "zombify_into": "mon_zombie_horse", "flags": [ "SEES", "HEARS", @@ -1774,7 +1782,7 @@ "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ] }, { "id": "mon_moose", @@ -1812,7 +1820,7 @@ "harvest": "mammal_large_leather", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 8 }, "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BLEED", "ATTACKMON" ] + "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "ATTACKMON" ] }, { "id": "mon_muskrat", @@ -1878,7 +1886,7 @@ "death_function": [ "NORMAL" ], "regenerates": 10, "regen_morale": true, - "flags": [ "ATTACKMON", "BLEED", "BORES", "CAN_DIG", "HEARS", "KEENNOSE", "PATH_AVOID_DANGER_1", "SMELLS", "WARM" ], + "flags": [ "ATTACKMON", "BORES", "CAN_DIG", "HEARS", "KEENNOSE", "PATH_AVOID_DANGER_1", "SMELLS", "WARM" ], "//": "Reinsert GOODHEARING when z-level tunneling is possible." }, { @@ -1908,7 +1916,7 @@ "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_otter", @@ -1969,18 +1977,7 @@ "upgrades": { "age_grow": 38, "into": "mon_pig" }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, "special_attacks": [ [ "EAT_FOOD", 40 ] ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "ANIMAL", - "PATH_AVOID_DANGER_1", - "CATTLEFODDER", - "PET_WONT_FOLLOW", - "WARM", - "KEENNOSE", - "BLEED" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "CATTLEFODDER", "PET_WONT_FOLLOW", "WARM", "KEENNOSE" ] }, { "id": "mon_pig", @@ -2017,7 +2014,7 @@ "death_function": [ "NORMAL" ], "zombify_into": "mon_zombie_pig", "special_attacks": [ [ "EAT_FOOD", 20 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_rabbit", @@ -2072,7 +2069,7 @@ "vision_night": 5, "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] }, { "id": "mon_rat_king", @@ -2318,6 +2315,6 @@ "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], "zombify_into": "mon_zolf", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "BLEED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] } ] diff --git a/data/json/monsters/marloss.json b/data/json/monsters/marloss.json index 4bddf7ba93bd9..66d143afd1c05 100644 --- a/data/json/monsters/marloss.json +++ b/data/json/monsters/marloss.json @@ -28,7 +28,7 @@ "death_drops": "marloss_zealot_death_drops", "death_function": [ "NORMAL" ], "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "BLEED", "HUMAN", "POISON" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "HUMAN", "POISON" ] }, { "id": "mon_marloss_zealot_m", @@ -59,6 +59,6 @@ "death_drops": "marloss_zealot_death_drops", "death_function": [ "NORMAL" ], "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "BLEED", "HUMAN", "POISON" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "HUMAN", "POISON" ] } ] diff --git a/data/json/monsters/mutant.json b/data/json/monsters/mutant.json index ef2b4324a06c2..8c2021c1ed02d 100644 --- a/data/json/monsters/mutant.json +++ b/data/json/monsters/mutant.json @@ -75,7 +75,7 @@ "upgrades": { "half_life": 50, "into": "mon_mutant_evolved" }, "regenerates": 1, "regen_morale": true, - "flags": [ "SEES", "HEARS", "SMELLS", "KEENNOSE", "WARM", "BLEED", "BASHES", "PATH_AVOID_DANGER_2" ] + "flags": [ "SEES", "HEARS", "SMELLS", "KEENNOSE", "WARM", "BASHES", "PATH_AVOID_DANGER_2" ] }, { "id": "mon_mutant_evolved", @@ -120,7 +120,6 @@ "SMELLS", "KEENNOSE", "WARM", - "BLEED", "BASHES", "PATH_AVOID_DANGER_2", "PUSH_MON", diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json index e72c2c62a1886..980cf66a2df5d 100644 --- a/data/json/monsters/nether.json +++ b/data/json/monsters/nether.json @@ -112,7 +112,7 @@ "special_attacks": [ [ "FEAR_PARALYZE", 0 ], { "type": "bite", "cooldown": 5 } ], "death_drops": "default_zombie_clothes", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BLEED", "IMMOBILE", "GUILT", "POISON", "REVIVES", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "IMMOBILE", "GUILT", "POISON", "REVIVES", "FILTHY" ] }, { "id": "mon_breather", @@ -212,7 +212,7 @@ "special_attacks": [ [ "scratch", 15 ] ], "death_drops": "default_zombie_death_drops", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "BLEED", "HUMAN", "POISON", "REVIVES", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "HUMAN", "POISON", "REVIVES", "FILTHY" ] }, { "id": "mon_dog_thing", @@ -295,7 +295,7 @@ "special_attacks": [ [ "FEAR_PARALYZE", 0 ], { "type": "bite", "cooldown": 5 } ], "death_drops": "default_zombie_clothes", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BLEED", "HARDTOSHOOT", "ATTACKMON", "HUMAN", "POISON", "REVIVES", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "HARDTOSHOOT", "ATTACKMON", "HUMAN", "POISON", "REVIVES", "FILTHY" ] }, { "id": "mon_flying_polyp", @@ -458,7 +458,7 @@ "armor_bullet": 2, "harvest": "human", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "BLEED", "HUMAN", "REVIVES", "CLIMBS", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "HUMAN", "REVIVES", "CLIMBS", "FILTHY" ] }, { "id": "mon_hound_tindalos", diff --git a/data/json/monsters/reptile_amphibian.json b/data/json/monsters/reptile_amphibian.json index 58a786ae707ca..1de35f4832edc 100644 --- a/data/json/monsters/reptile_amphibian.json +++ b/data/json/monsters/reptile_amphibian.json @@ -76,7 +76,7 @@ "fear_triggers": [ "FIRE", "HURT" ], "placate_triggers": [ "MEAT" ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "GOODHEARING", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "ANIMAL", "BLEED", "ATTACKMON", "SWIMS" ] + "flags": [ "SEES", "HEARS", "GOODHEARING", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "ANIMAL", "ATTACKMON", "SWIMS" ] }, { "id": "mon_rattlesnake", diff --git a/data/json/monsters/robofac_robots.json b/data/json/monsters/robofac_robots.json new file mode 100644 index 0000000000000..b369d63535236 --- /dev/null +++ b/data/json/monsters/robofac_robots.json @@ -0,0 +1,36 @@ +[ + { + "id": "mon_robofac_laserturret_mk1", + "type": "MONSTER", + "name": { "str": "prototype laser turret" }, + "description": "This appears to be a very experimental automated tower. Plating-less and seemingly half-built, it's little more than an oversized laser emitter and a camera, both welded to a swiveling platform.", + "default_faction": "robofac", + "species": [ "ROBOT" ], + "volume": "30000 ml", + "weight": "40750 g", + "hp": 30, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "white", + "aggression": 100, + "morale": 100, + "armor_bash": 2, + "armor_cut": 5, + "armor_bullet": 2, + "vision_day": 50, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "gun_type": "v29", + "fake_skills": [ [ "gun", 4 ], [ "pistol", 4 ] ], + "ranges": [ [ 0, 30, "DEFAULT" ] ] + } + ], + "special_when_hit": [ "RETURN_FIRE", 100 ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "COLDPROOF", "IMMOBILE", "NO_BREATHE" ] + } +] diff --git a/data/json/monsters/turrets.json b/data/json/monsters/turrets.json index 2806aa27da25b..0b2ba2b7bfd0f 100644 --- a/data/json/monsters/turrets.json +++ b/data/json/monsters/turrets.json @@ -331,5 +331,52 @@ "death_function": [ "BROKEN" ], "death_drops": { "groups": [ [ "turret_speaker", 1 ] ] }, "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE" ] + }, + { + "id": "mon_exodii_turret", + "type": "MONSTER", + "name": "upcycled turret", + "description": "This hefty turret appears to be bolted together out of various scraps of technology, many of them extremely foreign looking. It is equipped with a hefty looking machine gun.", + "default_faction": "exodii", + "weight": "206 kg", + "volume": "105 L", + "hp": 240, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "light_gray", + "aggression": -10, + "morale": 100, + "armor_bash": 24, + "armor_cut": 26, + "vision_day": 50, + "vision_night": 20, + "luminance": 1, + "starting_ammo": { "123ln": 3000 }, + "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT" ], + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "pamd68", + "ammo_type": "123ln", + "fake_skills": [ [ "gun", 5 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 41, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 400, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Beep.\"", + "targeting_volume": 20, + "no_ammo_sound": "a chk!" + } + ], + "special_when_hit": [ "RETURN_FIRE", 100 ], + "death_drops": { "subtype": "collection", "groups": [ [ "robots", 80 ] ] }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "HEARS", "GOODHEARING", "NOHEAD", "IMMOBILE", "NO_BREATHE", "PRIORITIZE_TARGETS", "INTERIOR_AMMO" ] } ] diff --git a/data/json/monsters/zanimal_upgrade.json b/data/json/monsters/zanimal_upgrade.json index 2ae29edc219cd..ba24c12fc39bc 100644 --- a/data/json/monsters/zanimal_upgrade.json +++ b/data/json/monsters/zanimal_upgrade.json @@ -1,4 +1,132 @@ [ + { + "id": "mon_dog_skeleton", + "type": "MONSTER", + "name": { "str": "skeletal dog" }, + "description": "This once-canine has shed all of its skin, revealing a carapace of fused bones and ribs. Devoid entirely of flesh, this walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", + "default_faction": "zombie", + "bodytype": "dog", + "species": [ "ZOMBIE" ], + "volume": "30000 ml", + "weight": "40750 g", + "hp": 12, + "speed": 100, + "material": [ "bone" ], + "symbol": "d", + "color": "white", + "aggression": 100, + "morale": 100, + "melee_skill": 4, + "melee_dice": 1, + "melee_dice_sides": 9, + "melee_cut": 6, + "dodge": 3, + "armor_cut": 15, + "armor_bullet": 12, + "armor_stab": 30, + "armor_acid": 3, + "vision_night": 3, + "harvest": "mr_bones", + "special_attacks": [ { "type": "bite", "cooldown": 5 } ], + "upgrades": { "half_life": 15, "into": "mon_dog_skeleton_brute" }, + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "HEARS", "NO_BREATHE", "HARDTOSHOOT", "REVIVES", "POISON", "FILTHY" ] + }, + { + "id": "mon_dog_zombie_brute", + "type": "MONSTER", + "name": { "str": "barghest" }, + "copy-from": "mon_dog_zombie_rot", + "description": "Huge swollen zombie dog, smeared black with slime. Its teeth are longer and its broad back is rippling with muscles and oozing wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { "half_life": 21, "into": "mon_dog_zombie_hulk" }, + "special_attacks": [ [ "SMASH", 30 ], { "type": "bite", "cooldown": 2, "accuracy": 4, "no_infection_chance": 12 } ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_VEH" ] } + }, + { + "id": "mon_dog_zombie_hulk", + "type": "MONSTER", + "name": { "str": "hulking horror" }, + "copy-from": "mon_dog_zombie_brute", + "description": "A four-legged canine body now grotesquely swollen, with arms as wide as a trash can and massive exposed teeth.", + "diff": 5, + "volume": "440 L", + "weight": "100 kg", + "color": "white_magenta", + "proportional": { "hp": 4, "speed": 1.25 }, + "relative": { "melee_skill": 1, "melee_dice": 1, "melee_cut": -2 }, + "armor_bash": 8, + "armor_cut": 12, + "armor_bullet": 10, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 20 ], { "type": "bite", "cooldown": 2, "accuracy": 4, "no_infection_chance": 12 } ], + "extend": { "flags": [ "DESTROYS" ] } + }, + { + "id": "mon_dog_skeleton_brute", + "type": "MONSTER", + "copy-from": "mon_dog_skeleton", + "name": { "str": "boneplate wolf" }, + "description": "This is a four legged creature covered in fused bony plates, shaped somewhat like a dog or wolf. Joints and cracks around its body ooze with black goo.", + "volume": "46 L", + "weight": "60 kg", + "hp": 70, + "relative": { "melee_dice": -1, "melee_dice_sides": 2, "melee_cut": 6 }, + "armor_cut": 30, + "armor_bullet": 24, + "armor_bash": 12, + "armor_acid": 1, + "special_attacks": [ + [ "SMASH", 45 ], + { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 15, "armor_multiplier": 0.6 } ] } + ], + "upgrades": { "half_life": 12, "into": "mon_skeleton_hulk" } + }, + { + "id": "mon_wolf_skeleton", + "type": "MONSTER", + "name": { "str": "skeletal wolf" }, + "description": "This once-canine has shed all of its skin, revealing a carapace of fused bones and ribs. Devoid entirely of flesh, this walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", + "looks_like": "mon_dog_skeleton", + "default_faction": "zombie", + "bodytype": "dog", + "species": [ "ZOMBIE" ], + "volume": "30000 ml", + "weight": "40750 g", + "hp": 18, + "speed": 100, + "material": [ "bone" ], + "symbol": "d", + "color": "white", + "aggression": 100, + "morale": 100, + "melee_skill": 4, + "melee_dice": 3, + "melee_dice_sides": 7, + "melee_cut": 8, + "dodge": 4, + "armor_cut": 15, + "armor_bullet": 12, + "armor_stab": 30, + "armor_acid": 3, + "vision_night": 3, + "harvest": "mr_bones", + "special_attacks": [ { "type": "bite", "cooldown": 5 } ], + "upgrades": { "half_life": 15, "into": "mon_dog_skeleton_brute" }, + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "HEARS", "NO_BREATHE", "HARDTOSHOOT", "REVIVES", "POISON", "FILTHY" ] + }, { "id": "mon_zougar_hunter", "type": "MONSTER", @@ -44,7 +172,7 @@ "vision_day": 10, "harvest": "mr_bones", "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], - "flags": [ "SEES", "HEARS", "BLEED", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "HEARS", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "id": "mon_zougar_shady", @@ -166,7 +294,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", diff --git a/data/json/monsters/zed-animal.json b/data/json/monsters/zed-animal.json index 879c4139480b5..7567cf917171e 100644 --- a/data/json/monsters/zed-animal.json +++ b/data/json/monsters/zed-animal.json @@ -57,41 +57,9 @@ "harvest": "zombie", "special_attacks": [ { "type": "bite", "cooldown": 5 } ], "death_function": [ "NORMAL" ], - "upgrades": { "half_life": 28, "into": "mon_dog_skeleton" }, + "upgrades": { "half_life": 28, "into_group": "GROUP_ZOMBIE_DOG_UPGRADE" }, "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] }, - { - "id": "mon_dog_skeleton", - "type": "MONSTER", - "name": { "str": "skeletal dog" }, - "description": "This once-canine has shed all of its skin, revealing a carapace of fused bones and ribs. Devoid entirely of flesh, this walking suit of bone seems to be controlled by a net of veins and sinews which pulse with glistening black goo.", - "default_faction": "zombie", - "bodytype": "dog", - "species": [ "ZOMBIE" ], - "volume": "30000 ml", - "weight": "40750 g", - "hp": 12, - "speed": 100, - "material": [ "bone" ], - "symbol": "d", - "color": "white", - "aggression": 100, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 9, - "melee_cut": 6, - "dodge": 3, - "armor_cut": 15, - "armor_bullet": 12, - "armor_stab": 30, - "armor_acid": 3, - "vision_night": 3, - "harvest": "mr_bones", - "special_attacks": [ { "type": "bite", "cooldown": 5 } ], - "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "NO_BREATHE", "HARDTOSHOOT", "REVIVES", "POISON", "FILTHY" ] - }, { "id": "mon_dog_zombie_cop", "type": "MONSTER", @@ -124,6 +92,7 @@ "special_attacks": [ { "type": "bite", "cooldown": 5 } ], "death_drops": { "subtype": "collection", "groups": [ [ "dog_cop", 40 ] ], "//": "40% chance of an item from group dog_cop" }, "death_function": [ "NORMAL" ], + "upgrades": { "half_life": 28, "into_group": "GROUP_ZOMBIE_DOG_UPGRADE" }, "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { @@ -154,6 +123,7 @@ "harvest": "zombie", "special_attacks": [ { "type": "bite", "cooldown": 2, "accuracy": 4, "no_infection_chance": 12 } ], "death_function": [ "NORMAL" ], + "upgrades": { "half_life": 28, "into": "mon_dog_zombie_brute" }, "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { @@ -185,6 +155,7 @@ "anger_triggers": [ "PLAYER_CLOSE", "HURT" ], "fear_triggers": [ "FIRE" ], "death_function": [ "NORMAL" ], + "upgrades": { "half_life": 28, "into_group": "GROUP_ZOLF_UPGRADE" }, "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "KEENNOSE", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] }, { @@ -252,20 +223,7 @@ "anger_triggers": [ "PLAYER_WEAK", "PLAYER_CLOSE" ], "fear_triggers": [ "FIRE" ], "death_function": [ "NORMAL" ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "KEENNOSE", - "BLEED", - "BASHES", - "POISON", - "NO_BREATHE", - "REVIVES", - "FILTHY" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "KEENNOSE", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], "//": "1d8->2d5, minor bonus over 1d9" }, { @@ -379,5 +337,159 @@ "REVIVES", "FILTHY" ] + }, + { + "id": "mon_zombie_horse", + "type": "MONSTER", + "name": { "str": "zombie horse" }, + "description": "From the looks of this zombie horse's ghastly features, with its protruding ribs, whitish skull, and empty eyes, the exposed part of the internal organs shows a seemingly lifeless color, and the black body fluid drips slowly. The new strength makes the horse no longer dependent on its muscles, but it can still pursue the enemy quickly.", + "default_faction": "zombie", + "bodytype": "horse", + "categories": [ "CLASSIC" ], + "species": [ "ZOMBIE" ], + "volume": "85200 ml", + "weight": "125 kg", + "hp": 70, + "speed": 215, + "material": [ "flesh" ], + "symbol": "V", + "color": "black", + "aggression": 100, + "morale": 100, + "melee_skill": 4, + "melee_dice": 3, + "melee_dice_sides": 6, + "melee_cut": 6, + "armor_bash": 5, + "armor_cut": 1, + "vision_day": 30, + "vision_night": 3, + "harvest": "zombie_leather", + "anger_triggers": [ "PLAYER_CLOSE", "PLAYER_WEAK" ], + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "HEARS", "SMELLS", "BASHES", "NO_BREATHE", "REVIVES", "BONES", "FAT" ] + }, + { + "id": "mon_ziger", + "type": "MONSTER", + "name": { "str": "Tiger wight" }, + "description": "This otherwise normal looking tiger stumbles and sways, its jaws slack, its eyes wide open and shining black.", + "copy-from": "mon_zougar", + "volume": "150 L", + "weight": "190 kg", + "hp": 200, + "speed": 110, + "symbol": "T", + "melee_dice": 3, + "dodge": 0 + }, + { + "id": "mon_zow", + "type": "MONSTER", + "name": { "str": "zombie cow" }, + "description": "Once a placid cow, this leathery horror stumbles and shudders, its pulsing black eyes scanning for prey beneath wicked horns. It is big and heavy and murderous.", + "looks_like": "mon_cow", + "default_faction": "zombie", + "bodytype": "dog", + "categories": [ "CLASSIC" ], + "species": [ "ZOMBIE" ], + "volume": "680 L", + "weight": "680 kg", + "hp": 166, + "speed": 104, + "material": [ "flesh" ], + "symbol": "Z", + "color": "green", + "aggression": 100, + "morale": 100, + "melee_skill": 6, + "melee_dice": 2, + "melee_dice_sides": 10, + "melee_cut": 6, + "armor_bash": 3, + "armor_cut": 3, + "vision_day": 30, + "vision_night": 3, + "anger_triggers": [ "PLAYER_CLOSE", "PLAYER_WEAK" ], + "death_drops": { "subtype": "collection", "groups": [ [ "cow", 25 ] ], "//": "25% chance of an item from group cow" }, + "death_function": [ "NORMAL" ], + "harvest": "zombie_leather", + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] + }, + { + "id": "mon_zeer", + "type": "MONSTER", + "name": { "str": "woodland wight" }, + "looks_like": "mon_deer", + "description": "Pale, stumbling white-tailed deer with blackened eyes and drooling slime down its neck. Its legs twist and bend in strange, haphazard directions, but with unnatural strength and speed. Preys on coyotes, wolves, and giant spider mutants.", + "default_faction": "zombie", + "bodytype": "horse", + "categories": [ "CLASSIC" ], + "species": [ "ZOMBIE" ], + "volume": "87 L", + "weight": "87 kg", + "hp": 100, + "speed": 240, + "material": [ "flesh" ], + "symbol": "Z", + "color": "green", + "aggression": 100, + "morale": 100, + "melee_skill": 3, + "melee_dice": 3, + "melee_dice_sides": 3, + "melee_cut": 0, + "armor_bash": 1, + "armor_cut": 3, + "vision_night": 15, + "death_function": [ "NORMAL" ], + "harvest": "zombie_leather", + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] + }, + { + "id": "mon_zpider_mass", + "type": "MONSTER", + "name": { "str": "mass of zombie spiders" }, + "description": "Thousands, maybe millions of spiders piling up high, each slowly oozing sticky green pus, struggling to keep the fetid mass together and moving.", + "default_faction": "zombie", + "bodytype": "blob", + "categories": [ "CLASSIC" ], + "species": [ "ZOMBIE", "SPIDER" ], + "volume": "18 L", + "weight": "23 kg", + "hp": 40, + "speed": 70, + "material": [ "iflesh" ], + "symbol": "s", + "color": "light_green", + "aggression": 100, + "morale": 100, + "melee_skill": 4, + "melee_dice": 2, + "melee_dice_sides": 3, + "melee_cut": 2, + "dodge": 1, + "armor_cut": 3, + "armor_stab": 3, + "armor_bullet": 2, + "vision_day": 5, + "vision_night": 5, + "harvest": "arachnid_tainted", + "death_function": [ "NORMAL" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "STUMBLES", + "WARM", + "NOHEAD", + "VENOM", + "CLIMBS", + "WEBWALK", + "POISON", + "NO_BREATHE", + "REVIVES", + "FILTHY" + ] } ] diff --git a/data/json/monsters/zed-classic.json b/data/json/monsters/zed-classic.json index 8929931397370..6a01e0fd201c7 100644 --- a/data/json/monsters/zed-classic.json +++ b/data/json/monsters/zed-classic.json @@ -84,7 +84,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -133,7 +132,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -168,20 +166,7 @@ "death_drops": "default_zombie_death_drops", "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BASHES", - "GRABS", - "POISON", - "BLEED", - "NO_BREATHE", - "REVIVES", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "GRABS", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] }, { "id": "mon_zombie_dancer", @@ -257,7 +242,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -305,7 +289,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "ACIDPROOF", "NO_BREATHE", "REVIVES", @@ -352,7 +335,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "ACIDPROOF", "NO_BREATHE", "REVIVES", @@ -398,7 +380,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -447,7 +428,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -496,7 +476,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", diff --git a/data/json/monsters/zed_burned.json b/data/json/monsters/zed_burned.json index 4fc32bd66fa36..a5e022bafe5b7 100644 --- a/data/json/monsters/zed_burned.json +++ b/data/json/monsters/zed_burned.json @@ -79,7 +79,7 @@ "special_attacks": [ [ "SMASH", 30 ], [ "GRAB", 7 ] ], "death_function": [ "SMOKEBURST", "NORMAL" ], "upgrades": { "half_life": 21, "into_group": "GROUP_ZOMBIE_BRUTE" }, - "flags": [ "SEES", "HEARS", "STUMBLES", "POISON", "BLEED", "NO_BREATHE", "REVIVES", "REVIVES_HEALTHY", "NO_NECRO", "FILTHY" ] + "flags": [ "SEES", "HEARS", "STUMBLES", "POISON", "NO_BREATHE", "REVIVES", "REVIVES_HEALTHY", "NO_NECRO", "FILTHY" ] }, { "id": "mon_zombie_scorched", @@ -113,6 +113,6 @@ "special_attacks": [ [ "GRAB", 7 ] ], "death_function": [ "SMOKEBURST", "NORMAL" ], "upgrades": { "half_life": 14, "into_group": "GROUP_ZOMBIE_UPGRADE" }, - "flags": [ "SEES", "HEARS", "STUMBLES", "POISON", "BLEED", "NO_BREATHE", "REVIVES", "REVIVES_HEALTHY", "NO_NECRO", "FILTHY" ] + "flags": [ "SEES", "HEARS", "STUMBLES", "POISON", "NO_BREATHE", "REVIVES", "REVIVES_HEALTHY", "NO_NECRO", "FILTHY" ] } ] diff --git a/data/json/monsters/zed_children.json b/data/json/monsters/zed_children.json index 417479d652eca..0fa1c8af14176 100644 --- a/data/json/monsters/zed_children.json +++ b/data/json/monsters/zed_children.json @@ -28,7 +28,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "BLEED", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], "//": "no GUILT because it no longer looks enough like a child to evoke pity" }, { @@ -66,20 +66,7 @@ "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", "upgrades": { "half_life": 14, "into_group": "GROUP_CHILD_ZOMBIE_UPGRADE" }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BASHES", - "BLEED", - "POISON", - "GUILT", - "NO_BREATHE", - "REVIVES", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "GUILT", "NO_BREATHE", "REVIVES", "FILTHY" ] }, { "id": "mon_zombie_creepy", @@ -110,20 +97,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BLEED", - "BASHES", - "POISON", - "NO_BREATHE", - "REVIVES", - "CLIMBS", - "FILTHY" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "CLIMBS", "FILTHY" ], "//": "no GUILT because it no longer looks enough like a child to evoke pity" }, { @@ -156,20 +130,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BLEED", - "GUILT", - "BASHES", - "POISON", - "NO_BREATHE", - "REVIVES", - "FILTHY" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "GUILT", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], "//": "GUILT because it still looks enough like a child to evoke pity" }, { @@ -202,7 +163,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "BOOMER" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ "SEES", "HEARS", "STUMBLES", "WARM", "BLEED", "GUILT", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], + "flags": [ "SEES", "HEARS", "STUMBLES", "WARM", "GUILT", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], "//": "GUILT because it still looks enough like a child to evoke pity" }, { @@ -234,20 +195,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BLEED", - "BASHES", - "POISON", - "NO_BREATHE", - "REVIVES", - "CLIMBS", - "FILTHY" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "CLIMBS", "FILTHY" ], "//": "no GUILT because it no longer looks enough like a child to evoke pity" }, { @@ -282,20 +230,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BLEED", - "GUILT", - "POISON", - "NO_BREATHE", - "REVIVES", - "HARDTOSHOOT", - "FILTHY" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "GUILT", "POISON", "NO_BREATHE", "REVIVES", "HARDTOSHOOT", "FILTHY" ], "//": "GUILT because it still looks enough like a child to evoke pity" } ] diff --git a/data/json/monsters/zed_fusion.json b/data/json/monsters/zed_fusion.json index 57bcf155d19ae..3017c635850da 100644 --- a/data/json/monsters/zed_fusion.json +++ b/data/json/monsters/zed_fusion.json @@ -211,6 +211,92 @@ "death_function": [ "GAS" ], "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "POISON", "CLIMBS", "NO_BREATHE", "CLIMBS", "HARDTOSHOOT" ] }, + { + "id": "mon_zombie_scissorlimbs", + "type": "MONSTER", + "name": { "str": "scissorlimbs" }, + "description": " A nightmarish spider of gore stands tall among the ruins, and keeps silent watch of the blighted landscape. Its spindly limbs of bone slip between the rubble with otherworldly speed.", + "default_faction": "zombie", + "bodytype": "spider", + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 5, + "volume": "122500 ml", + "weight": "81500 g", + "hp": 10, + "speed": 250, + "material": [ "flesh" ], + "symbol": "M", + "color": "red_yellow", + "aggression": 100, + "morale": 100, + "melee_skill": 5, + "melee_dice": 5, + "melee_dice_sides": 2, + "melee_cut": 12, + "armor_bash": 2, + "armor_cut": 10, + "armor_bullet": 10, + "vision_day": 1, + "special_attacks": [ { "type": "leap", "cooldown": 5, "max_range": 3, "allow_no_target": true }, [ "scratch", 5 ] ], + "death_function": [ "GAS" ], + "flags": [ "SEES", "HEARS", "GOODHEARING", "WARM", "POISON", "CLIMBS", "NO_BREATHE", "CLIMBS", "HARDTOSHOOT" ] + }, + { + "id": "mon_zombie_hanging_innards", + "type": "MONSTER", + "name": { "str": "hanging innards" }, + "description": "Great snakes of flesh hang from the ceiling above, madly thrashing and reaching about.", + "default_faction": "zombie", + "bodytype": "spider", + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 5, + "volume": "122500 ml", + "weight": "81500 g", + "hp": 200, + "speed": 110, + "material": [ "flesh" ], + "symbol": "S", + "color": "magenta_red", + "aggression": 100, + "morale": 100, + "melee_skill": 5, + "melee_dice": 5, + "melee_dice_sides": 2, + "armor_bash": 6, + "armor_cut": 10, + "armor_bullet": 6, + "vision_day": 2, + "vision_night": 2, + "harvest": "exempt", + "special_attacks": [ [ "RANGED_PULL", 20 ], [ "SMASH", 20 ] ], + "death_function": [ "GAS" ], + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "POISON", "CLIMBS", "NO_BREATHE", "IMMOBILE" ] + }, + { + "id": "mon_zombie_giant_heart", + "type": "MONSTER", + "name": { "str": "spasming lump" }, + "description": "A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic and desperate manner.", + "default_faction": "zombie", + "volume": "875000 ml", + "weight": "200 kg", + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 1, + "hp": 3, + "speed": 100, + "material": [ "flesh" ], + "symbol": "O", + "color": "red_yellow", + "morale": 10, + "vision_day": 60, + "vision_night": 60, + "armor_bash": 50, + "armor_cut": 25, + "armor_bullet": 20, + "harvest": "exempt", + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "HEARS", "SMELLS", "IMMOBILE", "WARM", "POISON", "IMMOBILE", "NO_BREATHE", "FILTHY" ] + }, { "id": "mon_zombie_living_wall", "type": "MONSTER", diff --git a/data/json/monsters/zed_lab.json b/data/json/monsters/zed_lab.json index df7ebd490479c..1f2870184ddcb 100644 --- a/data/json/monsters/zed_lab.json +++ b/data/json/monsters/zed_lab.json @@ -40,7 +40,6 @@ "WARM", "BASHES", "POISON", - "BLEED", "ACIDPROOF", "NO_BREATHE", "REVIVES", @@ -94,7 +93,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", diff --git a/data/json/monsters/zed_misc.json b/data/json/monsters/zed_misc.json index 1b2d09f287f2b..80a6225190837 100644 --- a/data/json/monsters/zed_misc.json +++ b/data/json/monsters/zed_misc.json @@ -52,7 +52,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "GRABS", "NO_BREATHE", "REVIVES", @@ -99,7 +98,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NOHEAD", "NO_BREATHE", "REVIVES", @@ -294,7 +292,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NOHEAD", "NO_BREATHE", "REVIVES", @@ -341,7 +338,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "GRABS", "NO_BREATHE", "REVIVES", @@ -387,7 +383,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -478,7 +473,7 @@ { "id": "mon_zombie_hunter", "type": "MONSTER", - "name": { "str": "feral hunter" }, + "name": { "str": "zombie hunter" }, "description": "This once-human body is barely recognizable, scrambling about on all fours, its nails and teeth both sharpened into dangerous looking spikes.", "default_faction": "zombie", "bodytype": "human", @@ -545,7 +540,7 @@ "special_attacks": [ [ "JACKSON", 0 ] ], "death_drops": "jackson_drops", "death_function": [ "JACKSON" ], - "flags": [ "SEES", "SMELLS", "WARM", "BASHES", "BLEED", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "SMELLS", "WARM", "BASHES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "id": "mon_zombie_mancroc", @@ -600,7 +595,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "GRABS", "NO_BREATHE", "REVIVES", @@ -719,7 +713,7 @@ { "id": "mon_zombie_runner", "type": "MONSTER", - "name": { "str": "feral runner" }, + "name": { "str": "zombie runner" }, "description": "This recently-risen body moves quickly, darting its head back and forth and gnawing at its hands.", "default_faction": "zombie", "bodytype": "human", @@ -758,7 +752,7 @@ { "id": "mon_zombie_predator", "type": "MONSTER", - "name": { "str": "feral predator" }, + "name": { "str": "zombie predator" }, "description": "With its joints in odd places and angles, this humanoid creature prowls across the landscape with surprising speed. Its teeth and arms are sharpened into fine points, and black ooze seeps out from cuts between its muscles.", "default_faction": "zombie", "bodytype": "human", @@ -867,7 +861,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -905,18 +898,7 @@ "fear_triggers": [ "FIRE" ], "death_drops": { "groups": [ [ "shia_stuff", 1 ] ] }, "death_function": [ "NORMAL" ], - "flags": [ - "SEES", - "HEARS", - "WARM", - "BASHES", - "POISON", - "BLEED", - "NO_BREATHE", - "PATH_AVOID_DANGER_2", - "PRIORITIZE_TARGETS", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "WARM", "BASHES", "POISON", "NO_BREATHE", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS", "FILTHY" ] }, { "id": "mon_zombie_shrieker", @@ -1005,7 +987,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NOHEAD", "NO_BREATHE", "REVIVES", @@ -1096,7 +1077,6 @@ "GROUP_BASH", "POISON", "NO_BREATHE", - "BLEED", "SWIMS", "REVIVES", "PUSH_MON", @@ -1176,7 +1156,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", diff --git a/data/json/monsters/zed_skeletal.json b/data/json/monsters/zed_skeletal.json index 1697ea2ef040f..77a8ee3ac6e01 100644 --- a/data/json/monsters/zed_skeletal.json +++ b/data/json/monsters/zed_skeletal.json @@ -32,7 +32,7 @@ "upgrades": { "half_life": 15, "into": "mon_skeleton_brute" }, "death_drops": "default_zombie_clothes", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "BLEED", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "HEARS", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "//": "Skelly brute gaps the evolution between normal and the juggernaut.", @@ -71,7 +71,7 @@ "upgrades": { "half_life": 12, "into": "mon_skeleton_hulk" }, "death_drops": "default_zombie_clothes", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "BLEED", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "HEARS", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "id": "mon_skeleton_electric", @@ -107,7 +107,7 @@ "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 }, [ "SHOCKSTORM", 25 ] ], "death_drops": "default_zombie_clothes", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "BLEED", "ELECTRIC", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "HEARS", "ELECTRIC", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "id": "mon_skeleton_hulk", @@ -153,7 +153,6 @@ "WARM", "BASHES", "DESTROYS", - "BLEED", "POISON", "ATTACKMON", "NO_BREATHE", diff --git a/data/json/monsters/zed_soldiers.json b/data/json/monsters/zed_soldiers.json index 7fb87a0d44c9a..494d95ec2a56f 100644 --- a/data/json/monsters/zed_soldiers.json +++ b/data/json/monsters/zed_soldiers.json @@ -33,20 +33,7 @@ "death_function": [ "NORMAL" ], "upgrades": { "half_life": 28, "into_group": "GROUP_SOLDIER_UPGRADE" }, "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "POISON", - "BLEED", - "NO_BREATHE", - "REVIVES", - "PUSH_MON", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { "id": "mon_zombie_soldier_blackops_1", @@ -88,20 +75,7 @@ "death_function": [ "NORMAL" ], "upgrades": { "half_life": 38, "into": "mon_zombie_soldier_blackops_2" }, "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "POISON", - "BLEED", - "NO_BREATHE", - "REVIVES", - "PUSH_MON", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { "id": "mon_zombie_soldier_blackops_2", @@ -133,7 +107,6 @@ "looks_like": "mon_zombie_soldier", "diff": 20, "relative": { "hp": 20, "speed": 10, "melee_skill": 1, "vision_day": 10, "vision_night": 10 }, - "delete": { "flags": [ "BLEED" ] }, "extend": { "special_attacks": [ [ "ACID_BARF", 10 ], @@ -163,7 +136,6 @@ "looks_like": "mon_zombie_soldier", "diff": 20, "relative": { "hp": 40, "speed": -10, "melee_skill": 2, "armor_bash": 5 }, - "delete": { "flags": [ "BLEED" ] }, "extend": { "special_attacks": [ [ "ACID_BARF", 5 ], @@ -222,20 +194,7 @@ "death_function": [ "NORMAL" ], "upgrades": { "half_life": 42, "into": "mon_zombie_kevlar_2" }, "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "POISON", - "BLEED", - "NO_BREATHE", - "REVIVES", - "PUSH_MON", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { "id": "mon_zombie_kevlar_2", @@ -274,20 +233,7 @@ "death_drops": "mon_zombie_kevlar_death_drops", "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "POISON", - "BLEED", - "NO_BREATHE", - "REVIVES", - "PUSH_MON", - "FILTHY" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { "id": "mon_zombie_military_pilot", @@ -330,7 +276,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -382,7 +327,6 @@ "POISON", "NO_BREATHE", "REVIVES", - "BLEED", "PUSH_MON", "DRIPS_NAPALM", "FILTHY" @@ -421,7 +365,7 @@ "death_drops": "mon_zombie_armored_death_drops", "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_scorched", - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "BLEED", "NO_BREATHE", "REVIVES", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ] }, { "id": "mon_zombie_bio_op", @@ -466,7 +410,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "ACIDPROOF", "ELECTRIC", "NO_BREATHE", diff --git a/data/json/move_modes.json b/data/json/move_modes.json index d18a8e5d23b40..3f90b262cbcd6 100644 --- a/data/json/move_modes.json +++ b/data/json/move_modes.json @@ -7,7 +7,7 @@ "name": "walk", "panel_color": "white", "symbol_color": "white", - "exertion_level": "LIGHT_EXERCISE", + "exertion_level": "MODERATE_EXERCISE", "change_good_none": "You start walking.", "change_good_animal": "You nudge your steed into a steady trot.", "change_good_mech": "You set your mech's leg power to a loping fast walk.", diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index ba20dc4af3b40..f0c243de08e19 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -701,7 +701,8 @@ "type": "mutation", "id": "CANNIBAL", "name": { "str": "Cannibal" }, - "points": 1, + "points": 3, + "//": "Feral humans vastly increase the cannibal meat supply, therefore this trait needs to increase in cost.", "description": "For your whole life you've been forbidden from indulging in your peculiar tastes. Now the world's ended, and you'll be damned if anyone is going to tell you that you can't eat people.", "starting_trait": true, "valid": false, @@ -6374,17 +6375,6 @@ "purifiable": false, "profession": true }, - { - "type": "mutation", - "id": "PROF_HELI_PILOT", - "name": "Helicopter Pilot", - "points": 0, - "description": "You are a trained helicopter pilot. This makes you one of the few living people who can operate a helicopter after the Cataclysm.", - "valid": false, - "purifiable": false, - "profession": true, - "cancels": [ "WAYFARER" ] - }, { "type": "mutation", "id": "PROF_SWAT", @@ -6838,8 +6828,7 @@ "points": -8, "description": "Whether from personal choice or childhood trauma, traveling with vehicles is off-limits to you, even if your life depended on it.", "starting_trait": true, - "valid": false, - "cancels": [ "PROF_HELI_PILOT" ] + "valid": false }, { "type": "mutation", diff --git a/data/json/npcs/BG_trait_groups.json b/data/json/npcs/BG_trait_groups.json index 31dce06070678..deb5e4b7bc326 100644 --- a/data/json/npcs/BG_trait_groups.json +++ b/data/json/npcs/BG_trait_groups.json @@ -33,6 +33,7 @@ { "trait": "BGSS_FEMA_Evacuee_1" }, { "trait": "BGSS_Left_for_Dead_1" }, { "trait": "BGSS_Left_for_Dead_2" }, + { "trait": "BGSS_Left_for_Dead_3" }, { "trait": "BGSS_Gung_Ho_1" }, { "trait": "BGSS_Gung_Ho_2" }, { "trait": "BGSS_Gung_Ho_3" }, @@ -72,6 +73,7 @@ "subtype": "distribution", "traits": [ { "group": "BG_survival_story_UNIVERSAL" }, + { "trait": "BGSS_Left_for_Dead_3" }, { "trait": "BGSS_Hospital_1" }, { "trait": "BGSS_Hospital_2" }, { "trait": "BGSS_Hospital_3" } @@ -84,6 +86,7 @@ "subtype": "distribution", "traits": [ { "group": "BG_survival_story_UNIVERSAL" }, + { "trait": "BGSS_Left_for_Dead_3" }, { "trait": "BGSS_Gung_Ho_1" }, { "trait": "BGSS_Gung_Ho_2" }, { "trait": "BGSS_Gung_Ho_3" }, @@ -126,6 +129,7 @@ { "trait": "BGSS_Evacuee_4" }, { "trait": "BGSS_Evacuee_5" }, { "trait": "BGSS_Evacuee_6" }, + { "trait": "BGSS_Left_for_Dead_3" }, { "trait": "BGSS_High_School_1" }, { "trait": "BGSS_Burger_Flipper_1" }, { "trait": "BGSS_Nerd_1" } diff --git a/data/json/npcs/BG_traits.json b/data/json/npcs/BG_traits.json index e3ac16db4d155..a3921ba400172 100644 --- a/data/json/npcs/BG_traits.json +++ b/data/json/npcs/BG_traits.json @@ -6,7 +6,7 @@ { "type": "mutation", "id": "BGSS_Confused_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Confused 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -18,7 +18,7 @@ { "type": "mutation", "id": "BGSS_No_Past_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: No Past 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -30,7 +30,7 @@ { "type": "mutation", "id": "BGSS_No_Past_2", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: No Past 2" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -42,7 +42,7 @@ { "type": "mutation", "id": "BGSS_No_Past_3", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: No Past 3" }, "player_display": false, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", @@ -54,7 +54,7 @@ { "type": "mutation", "id": "BGSS_No_Past_4", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: No Past 4" }, "player_display": false, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", @@ -66,7 +66,7 @@ { "type": "mutation", "id": "BGSS_No_Past_5", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: No Past 5" }, "player_display": false, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", @@ -78,7 +78,7 @@ { "type": "mutation", "id": "BGSS_Religious_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Religious 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -90,7 +90,7 @@ { "type": "mutation", "id": "BGSS_Religious_2", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Religious 2" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -102,7 +102,7 @@ { "type": "mutation", "id": "BGSS_Dreamer", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Dreamer 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -114,7 +114,7 @@ { "type": "mutation", "id": "BGSS_Wedding_1", - "name": { "str": "Survivor" }, + "name": { "str": "Survivor: Wedding 1" }, "player_display": false, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", @@ -126,7 +126,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -138,7 +138,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_2", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 2" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -150,7 +150,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_3", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 3" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "valid": false, @@ -161,7 +161,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_4", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 4" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -173,7 +173,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_5", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 5" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -185,7 +185,7 @@ { "type": "mutation", "id": "BGSS_Evacuee_6", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Evacuee 6" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -197,7 +197,7 @@ { "type": "mutation", "id": "BGSS_FEMA_Evacuee_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: FEMA Evacuee 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -209,7 +209,7 @@ { "type": "mutation", "id": "BGSS_Left_for_Dead_1", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Left for Dead 1" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, @@ -221,7 +221,19 @@ { "type": "mutation", "id": "BGSS_Left_for_Dead_2", - "name": { "str": "Survivor Story" }, + "name": { "str": "Survivor: Left for Dead 2" }, + "points": 0, + "description": "This NPC could tell you about how they survived the Cataclysm", + "player_display": false, + "valid": false, + "purifiable": false, + "types": [ "BACKGROUND_SURVIVAL_STORY" ], + "flags": [ "BG_SURVIVAL_STORY" ] + }, + { + "type": "mutation", + "id": "BGSS_Left_for_Dead_3", + "name": { "str": "Survivor: Left for Dead 3" }, "points": 0, "description": "This NPC could tell you about how they survived the Cataclysm", "player_display": false, diff --git a/data/json/npcs/Backgrounds/backgrounds_table_of_contents.json b/data/json/npcs/Backgrounds/backgrounds_table_of_contents.json index ac968970c8f30..59ada7fac0628 100644 --- a/data/json/npcs/Backgrounds/backgrounds_table_of_contents.json +++ b/data/json/npcs/Backgrounds/backgrounds_table_of_contents.json @@ -117,6 +117,12 @@ "condition": { "npc_has_trait": "BGSS_Left_for_Dead_2" }, "switch": true }, + { + "text": "", + "topic": "BGSS_LEFT_FOR_DEAD_3_STORY1", + "condition": { "npc_has_trait": "BGSS_Left_for_Dead_3" }, + "switch": true + }, { "text": "", "topic": "BGSS_GUNG_HO_1_STORY1", diff --git a/data/json/npcs/Backgrounds/confused_1.json b/data/json/npcs/Backgrounds/confused_1.json index 788f7d90b15e4..a94446af96052 100644 --- a/data/json/npcs/Backgrounds/confused_1.json +++ b/data/json/npcs/Backgrounds/confused_1.json @@ -4,5 +4,23 @@ "type": "talk_topic", "dynamic_line": "I don't even know anymore. I have no idea what is going on. I'm just doing what I can to stay alive. The world ended and I bungled along not dying, until I met you.", "responses": [ { "text": "Huh.", "topic": "TALK_FRIEND" } ] + }, + { + "id": "CWH_CONFUSED_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "I barely understand what's going on *now*. Why do you think I'd know how the world ended?", + "responses": [ + { + "text": "OK, fine. Can you at least tell me what you remember about the events leading up to now?", + "topic": "CWH_CONFUSED_1_IDEAS2" + }, + { "text": "Never mind then.", "topic": "TALK_FRIEND" } + ] + }, + { + "id": "CWH_CONFUSED_1_IDEAS2", + "type": "talk_topic", + "dynamic_line": "What, don't you remember? No, sorry, that's not fair, it was a weird time. OK, well, I guess this all started with the riots, didn't it? We were just leading our lives, doing our jobs, and then people started rioting. Not the usual protests that turned violent or anything, either, people just left their houses and started breaking shit. The news tried to downplay it but they couldn't keep it off the internet. I don't know what caused it, they said it was some kind of drug or toxin in the water? Still, I didn't really realize how bad it was getting at first. Somewhere along the way the \"rioters\" started getting up and walking around with holes in their chests, and that's when the real panic took over. The next few days - or weeks, not really sure - are a blur to me. You'd have to ask someone else how we got from there to total collapse.", + "responses": [ { "text": "Thanks for filling me in.", "topic": "TALK_FRIEND" } ] } ] diff --git a/data/json/npcs/Backgrounds/cop_2.json b/data/json/npcs/Backgrounds/cop_2.json index 77ea7453edfcf..6d0a9ff34786c 100644 --- a/data/json/npcs/Backgrounds/cop_2.json +++ b/data/json/npcs/Backgrounds/cop_2.json @@ -11,7 +11,7 @@ { "id": "BGSS_COP_2_STORY2", "type": "talk_topic", - "dynamic_line": "Eventually yes. It had been quiet for hours. I was parched, injured, and terrified. My training was maybe the only thing that kept me from freaking out. I decided to try to pull myself out and see how bad my injuries were. It was easy. The side of the van was torn open, and it turned out I was basically just lying under a little debris, with the ruins of the van tented around me. I wasn't even too badly hurt. I grabbed as much gear as I could, and I slipped out. It was night. I could hear fighting farther away in the city, so I went the other way. I made it a few blocks before I ran into any ... I ran from them. I ran, and I ran, and I ran some more. And here I am.", + "dynamic_line": "Eventually yes. It had been quiet for hours. I was parched, injured, and terrified. My training was maybe the only thing that kept me from freaking out. I decided to try to pull myself out and see how bad my injuries were. It was easy. The side of the van was torn open, and it turned out I was basically just lying under a little debris, with the ruins of the van tented around me. I wasn't even too badly hurt. I grabbed as much gear as I could, and I slipped out. It was night. I could hear fighting farther away in the city, so I went the other way. I made it a few blocks before I ran into any … I ran from them. I ran, and I ran, and I ran some more. And here I am.", "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/dreamer.json b/data/json/npcs/Backgrounds/dreamer.json index 76fcd39c2c7ac..610b694525749 100644 --- a/data/json/npcs/Backgrounds/dreamer.json +++ b/data/json/npcs/Backgrounds/dreamer.json @@ -5,7 +5,7 @@ "dynamic_line": "OK, this is gonna sound crazy but I, like, I knew this was going to happen. Like, before it did. You can even ask my psychic except, like, I think she's dead now. I told her about my dreams a week before the world ended. Serious!", "responses": [ { "text": "What were your dreams?", "topic": "BGSS_DREAMER_STORY2" }, - { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] }, @@ -68,5 +68,21 @@ { "text": "Poor Filthy Dan. ", "topic": "TALK_FRIEND" }, { "text": "Thanks for telling me that stuff. ", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_DREAMER_IDEAS1", + "type": "talk_topic", + "dynamic_line": "So, like, there were some really bad riots, okay? Everyone got realy violent and nasty, and to be honest, I was on a bit of a spirit journey for a lot of it and I don't really remember too well. But the weirdest part is, nobody even *cared* about each other. It's like all our caring got sucked away. I think it was some kind of negative energy thing. And also that made the dead, like, come back to life and stuff. Plus, like, there were some monsters? I'm not really sure how they fit in.", + "responses": [ + { "text": "You seem to know a lot, what do you think caused it all?", "topic": "CWH_DREAMER_IDEAS2" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_DREAMER_IDEAS2", + "type": "talk_topic", + "dynamic_line": "That's a tough one, but I keep thinking back to this dream I had like, a year before it all started. I dreamed there was this big ball of evil energy that was just waiting to suck up all the good thoughts on the earth and turn us into monsters and things? So I guess that's what I think happened. Everything else just seems too far-fetched, you know?", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_1.json b/data/json/npcs/Backgrounds/evacuee_1.json index a645900ebbce1..e449a5a05fbf3 100644 --- a/data/json/npcs/Backgrounds/evacuee_1.json +++ b/data/json/npcs/Backgrounds/evacuee_1.json @@ -54,5 +54,11 @@ "type": "talk_topic", "dynamic_line": "I thought I had those damned figured out. I got braver, started heading out by day more and more. One of those screamer zombies spotted me and called in a horde, with a giant beastie at the head of it, the size of a volkswagen and all covered in bone plates. I know when I'm outclassed. The big guy was held back by his own horde of buddies, and I managed to book it back to my place. I closed the windows, locked it down, but it was too late. The giant followed me and just started hammering right through the walls. I grabbed what I could and made for the horizon. Last I saw of my squat, it was collapsing on the bastard. For all I know, it died in the crash, but I am not going back to find out.", "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "What happened? I'm not really sure. You must know about the riots and all that, that the government and the police totally failed to contain. I don't have a good guess what caused that. I thought it was the usual stuff at first, and I gotta admit, I was sort of excited and scared it was the start of a revolution. Not excited enough to join in though, and I guess anyone who was is probably dead now. I tried to wait it out at home, packed a little bug-out bag, but then the internet started showing videos of rioters getting back up and fighting with crazy injuries. I don't know how many people really believed it at first, but I took that as my sign and ditched town for the evac shelter. I don't know exactly what happened after that. The center I was in was heavily vandalized and empty, and I never saw anyone else. The cell phone grid was locked up, except for one emergency message that came through around a day later saying the government had fallen. Power went out a few days later.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_2.json b/data/json/npcs/Backgrounds/evacuee_2.json index 806fef3d56d82..2dc69e2e061ec 100644 --- a/data/json/npcs/Backgrounds/evacuee_2.json +++ b/data/json/npcs/Backgrounds/evacuee_2.json @@ -27,5 +27,11 @@ "dynamic_line": "What do you think happened? You see them around anywhere?", "speaker_effect": [ { "effect": { "npc_add_effect": "player_BGSS_SAIDNO", "duration": "14000" } } ], "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_2_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Well, I assume you know about the riots and the military and police and the freakin' nightmare monsters walking the earth beside zombies, right? If you're asking what I think caused it all, well, I dunno. My best guess it was some huge government overreach, maybe some kind of experimental bioweapon that got away. They tried to lie so much at the start about everything that was going on, I don't think the whole 'Chinese attack' shit measures up. They were trying to cover something up. As for the real end times, maybe the rest of the world tried to contain it. I heard there were honest-to-god nukes going off here on American soil. To me that seems like somewhere else, maybe Europe, trying to get whatever is going on here contained. Maybe it even worked. It's bad now but it's not like it was.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_3.json b/data/json/npcs/Backgrounds/evacuee_3.json index 7a855cb2f739d..f753a6fdd053b 100644 --- a/data/json/npcs/Backgrounds/evacuee_3.json +++ b/data/json/npcs/Backgrounds/evacuee_3.json @@ -64,10 +64,22 @@ "id": "BGSS_EVACUEE_3_STORY4", "type": "talk_topic", "dynamic_line": "Yeah. I had it pretty good there, but eventually I just started going a bit nuts. Always dark, a bit cold, living off scavenged junk food… a soul can only live like that for so long. When the weather above ground got warmer and the daylight hours got longer I decided to get a bit braver. I'd learned enough about the that I was able to live pretty well after that. I've camped a few places, scavenged berries and whatnot, lived a pretty good life compared to those first few months.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_3_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Woah, , I don't even know where to start. The riots? I think it was going on sooner than that. There were bad murmurs going on a few weeks before that happened. Lots of really scary crimes, not your usual stuff but like cannibalism and some real unspeakable shit, you know? When the riots started, I think I was already primed to think of it as something different from a normal equality riot or anything like that. I think that's part of how I got out safer, I had had some time to get some stuff and get going, and didn't try to make shopping trips. People were abso-fuckin-lutely crazy in those days. It was a lot like the pandemic a few years back, except the police were out in the streets in force, gunning people down like it was going out of style.", "responses": [ - { "text": "I didn't meet you in the subway though. You left.", "topic": "BGSS_EVACUEE_3_STORY4" }, - { "text": "", "topic": "TALK_FRIEND" }, + { "text": "Do you have any idea what the actual cause was?", "topic": "CWH_EVACUEE_3_IDEAS2" }, + { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_3_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Not really. Government fed us all kinds of conflicting stories, and there was some absolutely heinous stuff going on. I mean, you can't have missed that video of the woman killing her own baby, right? God, that still gives me nightmares. I don't know what it was about it, something about the look on her face. Worse stuff came out of course, and now we've both seen worse things with our own eyes, but that one still comes back to haunt me. Anyway, they never could control the riots, and by the time the rioters started turning into undead it was way too late. I don't know if morale just broke or what but I heard rumours the military and police started turning on each other as much as the crowds. What actually made the dead come back to life though? I haven't got a clue.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_4.json b/data/json/npcs/Backgrounds/evacuee_4.json index 6552689ebf4e8..d3c04bfc340a5 100644 --- a/data/json/npcs/Backgrounds/evacuee_4.json +++ b/data/json/npcs/Backgrounds/evacuee_4.json @@ -3,6 +3,32 @@ "id": "BGSS_EVACUEE_4_STORY1", "type": "talk_topic", "dynamic_line": "They were shipping me with a bunch of evacuees over to a refugee center, when the bus got smashed in by the biggest zombie you ever saw. It was busy with the other passengers, so I did what anyone would do and fucked right out of there.", + "responses": [ + { "text": "Don't leave me hanging, what happened next?", "topic": "BGSS_EVACUEE_4_STORY2" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_EVACUEE_4_STORY2", + "type": "talk_topic", + "dynamic_line": "I ran until I felt like my lungs were going to jump right out of my mouth. I holed up in the forest for the night, under a fir tree. In the morning I heard someone talking, so I went to see. I was playing it pretty careful though, there were still a lot of psychos and rioters around. I snuck up on some kind of thing, some monster worse than any zombie. Some huge bug thing, saying random phrases like some kind of broken tape recorder. It was dragging a few human bodies behind it, I couldn't tell if they were dead or unconscious. Honestly I didn't wait to find out, I ducked into the bushes and tried not to breath until I couldn't hear it anymore.", + "responses": [ + { "text": "Where did you go from there?", "topic": "BGSS_EVACUEE_4_STORY3" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_EVACUEE_4_STORY3", + "type": "talk_topic", + "dynamic_line": "Once I was okay leaving the bushes, I made my way to an old shed I could see a ways off. It was falling in but it kept the rain and wind off and gave me a place out of sight. I stayed there until I ran out of those ass-tasting ration bars I'd filled my backpack with. Then I took on the wanderin' life until we met.", "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_4_IDEAS1", + "type": "talk_topic", + "dynamic_line": "What's this, some kinda Back to the Future thing? How could you not know what happened? The world damn well ended, that's what. And it didn't start with an earthquake, birds, snakes, or aeroplanes. It started with riots, and they had to dispatch cops and then the military to take care of the criminals. The government tried to pad it claiming it was some kind of mind control, but I didn't see too much different from the usual bullshit: entitled babies looking for an excuse to break the law. It just got way worse, this time, until it was time to get out of dodge. I heard rumours they were even bombing some of the urban centers to try to control it - which, I have to admit, is maybe a bit too hard-core.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_5.json b/data/json/npcs/Backgrounds/evacuee_5.json index 67f7866f4ed82..5891624f6c4b8 100644 --- a/data/json/npcs/Backgrounds/evacuee_5.json +++ b/data/json/npcs/Backgrounds/evacuee_5.json @@ -25,7 +25,7 @@ "topic": "BGSS_EVACUEE_5_WASPS", "condition": { "u_has_perception": 8 } }, - { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] }, @@ -37,5 +37,21 @@ { "text": "Sorry. Could you tell me more about them?", "topic": "BGSS_EVACUEE_5_BEES" }, { "text": "Right. Sorry.", "topic": "TALK_FRIEND" } ] + }, + { + "id": "CWH_EVACUEE_5_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Okay listen. Don't believe that government stuff. There's a common thread to all of it: the riots, the military failing to contain it, even the giant monsters they said were appearing in the last few days and had to be wiped out with nukes.", + "responses": [ + { "text": "You've got my attention.", "topic": "CWH_EVACUEE_5_IDEAS2" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_EVACUEE_5_IDEAS1", + "type": "talk_topic", + "dynamic_line": "You ever see the Matrix? This is it. In real life. To keep us locked in here, the creators of the simulation have to make sure we're just the right level of miserable. I think their algorithms got messed up though, and went into overdrive, because all this is a little implausible. Still, I guess we're still jacked in, so maybe it's working.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/evacuee_6.json b/data/json/npcs/Backgrounds/evacuee_6.json index 252ff39d42f61..b447e06fc22fe 100644 --- a/data/json/npcs/Backgrounds/evacuee_6.json +++ b/data/json/npcs/Backgrounds/evacuee_6.json @@ -3,6 +3,12 @@ "id": "BGSS_EVACUEE_6_STORY1", "type": "talk_topic", "dynamic_line": "Well, I was at home when the cell phone alert went off and told me to get to an evac shelter. So I went to an evac shelter. And then the shelter got too crowded, and people were waiting to get taken to the refugee center, but the buses never came. You must already know about all that. It turned into panic, and then fighting. I didn't stick around to see what happened next; I headed into the woods with what tools I could snatch from the lockers. I went back a few days later, but the place was totally abandoned. No idea what happened to all those people.", - "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_EVACUEE_6_IDEAS1", + "type": "talk_topic", + "dynamic_line": "I gotta be honest with you, I heard a lot of stories back at the shelter, and only one of them really stuck. This is some kind of science experiment gone wrong. I don't know what caused the riots and the undead in the first place, but there's no way it's this out of control everywhere. Yeah, I got the same 'the government has fallen' text as everyone, but it doesn't make *sense* that it could be so widespread so fast. I think we're in some sort of exclusion zone, where they're letting whatever is going on run its course to see how it works so they can fight it better next time. Somewhere out there, outside the zone, it's more or less business as usual.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/fema_evacuee_1.json b/data/json/npcs/Backgrounds/fema_evacuee_1.json index ad01bae9c82e4..03963ba1ca279 100644 --- a/data/json/npcs/Backgrounds/fema_evacuee_1.json +++ b/data/json/npcs/Backgrounds/fema_evacuee_1.json @@ -81,5 +81,31 @@ "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_FEMA_EVACUEE_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Woof, you ready for a real hot take? The government did this to us. Intentionally, or at least sort-of intentionally.", + "responses": [ + { "text": "Oh?", "topic": "CWH_FEMA_EVACUEE_1_IDEAS2" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_FEMA_EVACUEE_1_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Damn right. They lied to us for god knows how long about what was going on because they didn't want us to figure it out. It probably started as a way to keep the people in line, but it backfired somehow. My guess is they tried to de-educate us, tried to mislead us, and when that wasn't working they tried actual drugs in the water to make us stupid or something. Instead of just stupid, some people got violent. Then they tried to leverage that to put in martial law, but that didn't work and they wound up fighting hordes of people. Only they didn't realize their brain drugs were some kind of mutagen that turn people into zombies.", + "responses": [ + { "text": "What about all the other stuff?", "topic": "CWH_FEMA_EVACUEE_1_IDEAS3" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_FEMA_EVACUEE_1_IDEAS3", + "type": "talk_topic", + "dynamic_line": "I think it's mostly mutation. I don't know what they used, but it's some real mad science shit, I didn't think most of this was even possible. I also wonder if whatever they put in the water has made us a bit crazy. Maybe some of this is just a hallucination? That one blows my mind a bit, I'm not sure I believe it but I got nothin' else.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/left_for_dead_1.json b/data/json/npcs/Backgrounds/left_for_dead_1.json index c9649b57f09fd..e8b32a4800a04 100644 --- a/data/json/npcs/Backgrounds/left_for_dead_1.json +++ b/data/json/npcs/Backgrounds/left_for_dead_1.json @@ -3,6 +3,37 @@ "id": "BGSS_LEFT_FOR_DEAD_1_STORY1", "type": "talk_topic", "dynamic_line": "I was late to evacuate when the shit hit the fan. Got stuck in town for a few days, survived by hiding in basements eating girl scout cookies and drinking warm root beer. Eventually I managed to weasel my way out without getting caught by the . I spent a few days holed up in an abandoned mall, but I needed food so I headed out to fend for myself in the woods. I wasn't doing a great job of it, so I'm kinda glad you showed up.", - "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Okay, so, hear me out. This might sound crazy, but we're dealing with the walking dead, so I think I get a pass on that. You know your Greek mythology at all?", + "responses": [ + { "text": "Not really. How is that relevant?", "topic": "CWH_LEFT_FOR_DEAD_1_EXPLAIN" }, + { "text": "Sure, why?", "topic": "CWH_LEFT_FOR_DEAD_1_IDEAS2" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_1_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Okay, well, I know this sounds like an Indiana Jones B-plot, but I think someone found Pandora's Box, the actual thing or close to it. I think they tried to somehow harness it, to use the power in it for something. Maybe even something good, who knows, the power of the gods seems like it would be a green energy source to me. Whatever it was, they screwed it up, and released it for real. Not just a metaphorical thing like in the stories, but actually set the forces of Hades loose on Earth. Yeah, I know it's farfetched, but like I said: I think I get a pass on that.", + "responses": [ + { "text": "What? Pandora's box?", "topic": "CWH_LEFT_FOR_DEAD_1_EXPLAIN" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_1_EXPLAIN", + "type": "talk_topic", + "dynamic_line": "According to legend, Pandora was in the house of the gods and found an unopened box. She decided to investigate, and when she opened it and unthinkable horrors and diseases spilled out. Sound familiar?", + "responses": [ + { "text": "Sure, what's that go to do with anything?", "topic": "CWH_LEFT_FOR_DEAD_1_IDEAS2" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] } ] diff --git a/data/json/npcs/Backgrounds/left_for_dead_2.json b/data/json/npcs/Backgrounds/left_for_dead_2.json index 981701eb77d7d..8885d485adb3d 100644 --- a/data/json/npcs/Backgrounds/left_for_dead_2.json +++ b/data/json/npcs/Backgrounds/left_for_dead_2.json @@ -27,5 +27,21 @@ { "text": "Thanks for telling me all that. ", "topic": "TALK_FRIEND" }, { "text": "Thanks for telling me all that. ", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_2_IDEAS1", + "type": "talk_topic", + "dynamic_line": "You mean what caused the riots and all that? Well, they told us it was a Chinese bioweapon but I have troubles believing anyone could engineer a bioweapon that could do all this. The only answer I can come up with, silly though it sounds, is aliens.", + "responses": [ + { "text": "You think this is an invasion?", "topic": "CWH_LEFT_FOR_DEAD_2_IDEAS2" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_2_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Well, maybe, but I'd guess it's too disorganized to be a proper invasion. If I had to guess, I'd say there was something locked in the polar ice. Like, remember a few years back there was that big thing online about an alien body found in the ice? I don't know if you remember but it was all over the news for a while until it turned out to be a hoax. Only, since then, I've seen some aliens walking around that look a *lot* like that ice body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those aliens had some kind of virus. It went around the world and infected everything silently until, somehow, it activated and caused the violence and monsters and mutations.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/left_for_dead_3.json b/data/json/npcs/Backgrounds/left_for_dead_3.json new file mode 100644 index 0000000000000..ddaaaf7ce79b0 --- /dev/null +++ b/data/json/npcs/Backgrounds/left_for_dead_3.json @@ -0,0 +1,74 @@ +[ + { + "id": "BGSS_LEFT_FOR_DEAD_3_STORY1", + "type": "talk_topic", + "dynamic_line": "Let's not dance around it: I joined the riots, at first. I don't really remember what I was thinking. I'd protested stuff like police brutality before, but this was different. I didn't make a sign and go down there expecting to chant and march, I grabbed a bat and went outside planning to fuck shit up. I've never felt so angry before. The riots had already been going on a while at that point, and to me, it just looked like the government trying to squash the people again.", + "responses": [ + { "text": "Those rioters had a reputation for being absolutely psycho.", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY2" }, + { "text": "Not many people made it out of the riots alive.", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY3" }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_LEFT_FOR_DEAD_3_STORY2", + "type": "talk_topic", + "dynamic_line": "Yeah, you're telling me. The rioters… they weren't even like humans, let alone protestors. Nothing like any protest I'd ever been in before. That didn't stop me. I joined them, and I was as bad as a bunch of them. Smashed windows, beat up bystanders, burnt cars. I remember ripping riot gear off a cop and… nevermind. I don't want to remember that.", + "responses": [ + { "text": "How did you survive?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY3" }, + { "text": "What made you come back?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY4" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_LEFT_FOR_DEAD_3_STORY3", + "type": "talk_topic", + "dynamic_line": "At some point, I felt like I was waking up. It was around the time they were busting out those humvees with riot control turrets on top. Says something about my frame of mind that I don't even remember if I'd seen them before that point. Anyway I heard the gunfire going off and just kinda realized I was on the edges of a mob charging a heavily armed military emplacement. That's when I started seeing the mob for what it was, seeing the wild-eyed animals, even the zombies. I turned and ran.", + "responses": [ + { "text": "What made you come back?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY4" }, + { "text": "Where did you go from there?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY5" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_LEFT_FOR_DEAD_3_STORY4", + "type": "talk_topic", + "dynamic_line": "I honestly don't know. I wonder if some of the others would have come back to their senses, given time. I don't think I'm anything special. Maybe a lot of them did, and just weren't on the edge of the crowd at the time. I'll tell you, almost as soon as I came back to myself, I could see some of the rioters looking at me like I was prey. I didn't stick around to see what would happen.", + "responses": [ + { "text": "Where did you go from there?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY5" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "BGSS_LEFT_FOR_DEAD_3_STORY5", + "type": "talk_topic", + "dynamic_line": "I knew the city pretty well. I went for an abandoned building I knew about, headed through a broken window, and holed up in there for a few days. I had a fair bit of stolen food and I just kept to myself. When things started to quiet down, I headed out, and here I am.", + "responses": [ + { "text": "Thanks for telling me all that. ", "topic": "TALK_FRIEND" }, + { "text": "Thanks for telling me all that. ", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_3_IDEAS1", + "type": "talk_topic", + "dynamic_line": "So, I remember the time leading up to the riots, same as anyone. Things were bad, there were some really awful crimes being reported in the news, and there was a lot of racial tension as usual from the way the cops were handling it. Then people started rioting, which isn't unusual, but it was weird the kind of places that the riots were starting in. Like, upper middle class neighbourhoods, midwestern small towns, things like that. Anyway, I joined the riots and I don't remember a lot of clear stuff after that.", + "responses": [ + { "text": "You joined the riots?", "topic": "BGSS_LEFT_FOR_DEAD_3_STORY1" }, + { + "text": "You must have some insights into what caused all this, then.", + "topic": "CWH_LEFT_FOR_DEAD_3_IDEAS2" + }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_LEFT_FOR_DEAD_3_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Kinda, I guess. I heard people blaming the riots on some kind of mind control drug, and frankly I'm not sure that's far off base. That's kinda what it felt like, although the whole time I really felt like myself. It wasn't until I snapped out of it that I realized how weird it was. That doesn't explain anything else though: the zombies, the monsters, all this stuff is way off base. Anything I've tried to guess just sounds like bad science fiction, like demonic curses or alien weapons kinda stuff.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + } +] diff --git a/data/json/npcs/Backgrounds/no_past_1.json b/data/json/npcs/Backgrounds/no_past_1.json index 825764c371ba9..aefc1e8f46f84 100644 --- a/data/json/npcs/Backgrounds/no_past_1.json +++ b/data/json/npcs/Backgrounds/no_past_1.json @@ -4,5 +4,20 @@ "type": "talk_topic", "dynamic_line": "Before ? Who cares about that? This is a new world, and yeah, it's pretty . It's the one we've got though, so let's not dwell in the past when we should be making the best of what little we have left.", "responses": [ { "text": "I can respect that.", "topic": "TALK_FRIEND" } ] + }, + { + "id": "CWH_NO_PAST_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "I don't really want to talk about the time before, you know?", + "responses": [ + { "text": "Keep it vague if you want, but please, can you fill me in a little?", "topic": "CWH_NO_PAST_1_IDEAS2" }, + { "text": "Never mind then.", "topic": "TALK_FRIEND" } + ] + }, + { + "id": "CWH_NO_PAST_1_IDEAS2", + "type": "talk_topic", + "dynamic_line": "I - fine. Drugs in the water, some kind of bioweapon I guess. You know how things were with China, they blamed it on them mostly. Made people violent and ugly. There were riots. People I cared about joined them, and I guess I'll never know why. Riots led to military and police action, which made the riots worse. People acted like animals, not just the rioters but everyone. Then came the monsters and nightmares walking the world like real Armageddon, and everyone died, and started coming back as monsters themselves. There's your story. If you want more, talk to someone else.", + "responses": [ { "text": "Thanks for that.", "topic": "TALK_FRIEND" } ] } ] diff --git a/data/json/npcs/Backgrounds/no_past_2.json b/data/json/npcs/Backgrounds/no_past_2.json index 28f8010581e62..be7c226dee10c 100644 --- a/data/json/npcs/Backgrounds/no_past_2.json +++ b/data/json/npcs/Backgrounds/no_past_2.json @@ -1,8 +1,14 @@ [ + { + "id": "CWH_NO_PAST_2_IDEAS1", + "type": "talk_topic", + "dynamic_line": "To be honest… I don't really remember. I remember vague details of my life before the world was like this, but itself? It's all a blur. I think something pretty bad must have happened to me. I remember a few things: snatches of violence, something about a woman killing her baby. I feel like I'd rather not remember.", + "responses": [ { "text": "Huh.", "topic": "TALK_FRIEND" } ] + }, { "id": "BGSS_NO_PAST_2_STORY1", "type": "talk_topic", - "dynamic_line": "To be honest… I don't really remember. I remember vague details of my life before the world was like this, but itself? It's all a blur. I don't know how I got where I am now, or how any of this happened. I think something pretty bad must have happened to me. Or maybe I was just hit in the head really hard. Or both. Both seems likely.", + "dynamic_line": "To be honest… I don't really remember. I remember vague details of my life before the world was like this, but itself? It's all a blur. I don't know how I got where I am now, or how any of this happened. I think something pretty bad must have happened to me. Or maybe I was just hit in the head really hard. Or both. Both seems likely. First thing I remember is seeing an already-read text on my phone from the emergency government broadcast system, saying the United States had fallen.", "responses": [ { "text": "Huh.", "topic": "TALK_FRIEND" } ] } ] diff --git a/data/json/npcs/Backgrounds/no_past_4.json b/data/json/npcs/Backgrounds/no_past_4.json index 29f6f55b30de8..d4194568a047a 100644 --- a/data/json/npcs/Backgrounds/no_past_4.json +++ b/data/json/npcs/Backgrounds/no_past_4.json @@ -33,5 +33,44 @@ "type": "talk_topic", "dynamic_line": "Listen. I said it clearly, and if you keep picking at it I'm gonna get mad. Who I was is gone. Dead. I don't give a shit about your 'healthy', don't ask again.", "responses": [ { "text": "What were you saying before?", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_NO_PAST_4_IDEAS1", + "type": "talk_topic", + "dynamic_line": "You're asking me what I think caused all this? It was all over the news. Some kind of Chinese bio-weapon. It's no different from the pandemic a few years back, but this time they got the formula right. Maybe too right. Doesn't matter anyway, I hear it got out on them and wiped them out too. Serves em right.", + "responses": [ + { "text": "Can you tell me more about what actually went down, though?", "topic": "CWH_NO_PAST_4_IDEAS2" }, + { + "condition": { "or": [ { "u_has_perception": 7 }, { "u_has_intelligence": 8 } ] }, + "text": "How does that explain all the other crazy stuff?", + "topic": "CWH_NO_PAST_4_SKEPTIC" + }, + { "text": "", "topic": "TALK_NONE" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_NO_PAST_4_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Well, you know. First there were the riots from the mind-control drugs in the water. Except I think we can all see now it was actually a virus again. The military and the cops did their damndest to put it down but it got out of hand. Then the virus mutated and started bringing the dead back to life like in some kinda B-movie, and shit got really real. They let the big things loose, or they set them on us, I dunno. Huge unspeakable monsters… still makes me shudder to think of them. They obviously weren't built for combat though, and the military took 'em down fast.", + "responses": [ + { + "condition": { "or": [ { "u_has_perception": 7 }, { "u_has_intelligence": 8 } ] }, + "text": "How does that explain all the other crazy stuff?", + "topic": "CWH_NO_PAST_4_SKEPTIC" + }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_NO_PAST_4_SKEPTIC", + "type": "talk_topic", + "dynamic_line": "What? Of course it does. They started with a bioweapon and then it went full nuclear. Only the weapons we had now were a lot worse than H-bombs. Uncle Sam managed to beat back the really nasty stuff, but I guess it was with his dying breath.", + "responses": [ + { "text": "Can you tell me more about what actually went down, though?", "topic": "CWH_NO_PAST_4_IDEAS2" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] } ] diff --git a/data/json/npcs/Backgrounds/prisoner_1.json b/data/json/npcs/Backgrounds/prisoner_1.json index 70c9ee5bf9c42..61e5c15bea938 100644 --- a/data/json/npcs/Backgrounds/prisoner_1.json +++ b/data/json/npcs/Backgrounds/prisoner_1.json @@ -190,7 +190,7 @@ { "id": "BGSS_PRISONER_1_IN_FOR_TAXEVASION", "type": "talk_topic", - "dynamic_line": "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot of money in some very clever ways. Not clever enough, it turns out...", + "dynamic_line": "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot of money in some very clever ways. Not clever enough, it turns out…", "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] }, { diff --git a/data/json/npcs/Backgrounds/religious_1.json b/data/json/npcs/Backgrounds/religious_1.json index 5b3c7d9a11cde..93b87422af825 100644 --- a/data/json/npcs/Backgrounds/religious_1.json +++ b/data/json/npcs/Backgrounds/religious_1.json @@ -58,5 +58,21 @@ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_RELIGIOUS_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "It's clear enough, isn't it? That… that end, was the Rapture. I'm still here, and I still don't understand why, but I will keep Jesus in my heart through the Tribulations to come. When they're past, I'm sure He will welcome me into the Kingdom of Heaven. Or… or something along those lines.", + "responses": [ + { "text": "I meant more the actual events. What happened?", "topic": "CWH_RELIGIOUS_1_IDEAS2" }, + { "text": "", "topic": "TALK_FRIEND" }, + { "text": "", "topic": "TALK_DONE" } + ] + }, + { + "id": "CWH_RELIGIOUS_1_IDEAS2", + "type": "talk_topic", + "dynamic_line": "Oh. Well, I think it follows the good word in Revelations, if I remember right. I haven't talked to a preacher in a bit, you know. There were the plagues… the first one was the one a couple years ago, that big pandemic, that was when people started talking about the end being near. Then there was a plague of blood, or was it violence? That was the riots. Then the seas turned red with blood, that was from all the people being shot. Then a plague of fire, I remember that one for sure, that was when there were bombs and things going off everywhere to try to contain the riots. And then demons and monsters walked the Earth, and the dead rose from their graves, and finally the meek inherited. Clear as day.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/religious_2.json b/data/json/npcs/Backgrounds/religious_2.json index 738627e08696d..608a264499165 100644 --- a/data/json/npcs/Backgrounds/religious_2.json +++ b/data/json/npcs/Backgrounds/religious_2.json @@ -4,5 +4,11 @@ "type": "talk_topic", "dynamic_line": "Same as anyone. I turned away from God, and now I'm paying the price. The Rapture has come, and I was left behind. So now, I guess I wander through Hell on Earth. I wish I'd paid more attention in Sunday School.", "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_RELIGIOUS_2_IDEAS1", + "type": "talk_topic", + "dynamic_line": "Well, I guess that was the Rapture. It didn't play out how I thought it would. They made me think it was gonna be a flash of light and then *poof*, everyone's gone. Instead it was messy and dirty. Riots in the streets, the military and police serving the Antichrist to gun down the people like - what was it my dad used to say - like wheat before the chaff? Then when we'd really showed our Sin, God came in with the real plagues. The dead started walking, getting up with machine gun holes in them to fight the military, and the military started turning on each other too. After that, the legions of Hell itself came out. Huge monsters, worse than anything I'd ever imagined, just tore through the cities ripping everything to shreds. Then they started dying off as quick as they'd arrived, and we were left trying to run and hide from the undead. A day or two later the power started going out.", + "responses": [ { "text": "", "topic": "TALK_FRIEND" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/wedding_1.json b/data/json/npcs/Backgrounds/wedding_1.json index 6a15b083266e4..8eb2f0c19c0e4 100644 --- a/data/json/npcs/Backgrounds/wedding_1.json +++ b/data/json/npcs/Backgrounds/wedding_1.json @@ -33,6 +33,7 @@ { "id": "BGSS_WEDDING_1_CALM", "type": "talk_topic", + "//": "Some day it would be nice to have a demographically selected chance of this not being heteronormative", "dynamic_line": { "npc_female": true, "yes": "Well, I have this weird hope. It's probably stupid, but I saw my fiancé peel out of there with his sister - my maid of honor - in her pickup truck as things went bad. So, until I run into them again one way or another, I'm just gonna keep on believing they're out there, doing well. That's more than most of us have.", @@ -42,5 +43,11 @@ { "text": "What were you saying before that?", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] + }, + { + "id": "CWH_WEDDING_1_IDEAS1", + "type": "talk_topic", + "dynamic_line": "I'll be honest with you, I was paying more attention to wedding planning than current events leading up to things. I knew there were riots going on, but they were out of town. Even when they got closer to home, I tried to ignore them so we could have our big day. After the zombies started coming, though, well that's when stuff got really weird. When I was running from the wedding I swear I saw the sky rip open and monsters fly out of the hole, like something out of Independence Day. I don't know what it all was, it looked like black magic or something.", + "responses": [ { "text": "", "topic": "TALK_NONE" }, { "text": "", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/Backgrounds/whathappened_table_of_contents.json b/data/json/npcs/Backgrounds/whathappened_table_of_contents.json new file mode 100644 index 0000000000000..5f7efe6ebc643 --- /dev/null +++ b/data/json/npcs/Backgrounds/whathappened_table_of_contents.json @@ -0,0 +1,111 @@ +[ + { + "id": "TALK_FRIEND_CONVERSATION", + "type": "talk_topic", + "//": "the 'CWH' prefix stands for 'Cataclysm: what happened', and refers to stories where NPCs answer your questions about what they think happened in the cataclysm.", + "responses": [ + { + "text": "", + "topic": "CWH_CONFUSED_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Confused_1" } + }, + { + "text": "", + "topic": "CWH_NO_PAST_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_No_Past_1" } + }, + { + "text": "", + "topic": "CWH_NO_PAST_2_IDEAS1", + "condition": { "npc_has_trait": "BGSS_No_Past_2" } + }, + { + "text": "", + "topic": "BGSS_NO_PAST_3_STORY1", + "//": "No_past_3'S amnesia story would be the same for either of these questions.", + "condition": { "npc_has_trait": "BGSS_No_Past_3" } + }, + { + "text": "", + "topic": "CWH_NO_PAST_4_IDEAS1", + "condition": { "npc_has_trait": "BGSS_No_Past_4" } + }, + { + "text": "", + "topic": "BGSS_NO_PAST_5_STORY1", + "//": "No_past_5'S unwillingness to talk about it would be the same for either of these questions.", + "condition": { "npc_has_trait": "BGSS_No_Past_5" } + }, + { + "text": "", + "topic": "CWH_RELIGIOUS_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Religious_1" } + }, + { + "text": "", + "topic": "CWH_RELIGIOUS_2_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Religious_2" } + }, + { + "text": "", + "topic": "CWH_DREAMER_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Dreamer" } + }, + { + "text": "", + "topic": "CWH_WEDDING_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Wedding_1" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_1" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_2_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_2" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_3_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_3" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_4_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_4" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_5_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_5" } + }, + { + "text": "", + "topic": "CWH_EVACUEE_6_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Evacuee_6" } + }, + { + "text": "", + "topic": "CWH_FEMA_EVACUEE_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_FEMA_Evacuee_1" } + }, + { + "text": "", + "topic": "CWH_LEFT_FOR_DEAD_1_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Left_for_Dead_1" } + }, + { + "text": "", + "topic": "CWH_LEFT_FOR_DEAD_2_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Left_for_Dead_2" } + }, + { + "text": "", + "topic": "CWH_LEFT_FOR_DEAD_3_IDEAS1", + "condition": { "npc_has_trait": "BGSS_Left_for_Dead_3" } + } + ] + } +] diff --git a/data/json/npcs/NC_DOCTOR.json b/data/json/npcs/NC_DOCTOR.json index 1ddddeb50d826..1125717aa3620 100644 --- a/data/json/npcs/NC_DOCTOR.json +++ b/data/json/npcs/NC_DOCTOR.json @@ -81,7 +81,8 @@ "id": "NC_DOCTOR_misc", "subtype": "distribution", "entries": [ - { "item": "bandages", "prob": 50 }, + { "item": "bandages", "prob": 30 }, + { "item": "adhesive_bandages", "prob": 30 }, { "item": "cotton_ball", "prob": 50 }, { "item": "1st_aid", "prob": 35 }, { "item": "saline", "prob": 25 }, diff --git a/data/json/npcs/NC_SOLDIER.json b/data/json/npcs/NC_SOLDIER.json index 4abb8d3099882..2f50c50526697 100644 --- a/data/json/npcs/NC_SOLDIER.json +++ b/data/json/npcs/NC_SOLDIER.json @@ -168,7 +168,7 @@ { "item": "mre_chickenpesto_box", "prob": 45 }, { "item": "mre_southwestbeef_box", "prob": 45 }, { "item": "mre_hotdog_box", "prob": 45 }, - { "item": "1st_aid", "prob": 35 }, + { "item": "ifak", "prob": 35 }, { "item": "saline", "prob": 10 }, { "item": "con_milk", "prob": 10 }, { "item": "sports_drink", "prob": 40 }, diff --git a/data/json/npcs/NPC_Brigitte_LaCroix.json b/data/json/npcs/NPC_Brigitte_LaCroix.json index 8d3eecaf658d2..04b243421e9e9 100644 --- a/data/json/npcs/NPC_Brigitte_LaCroix.json +++ b/data/json/npcs/NPC_Brigitte_LaCroix.json @@ -101,13 +101,13 @@ "type": "dialogue", "context": "first_meeting", "value": "yes", - "no": "You there. Quiet down. Can you hear it? The song?", + "no": "You there. Quiet down. Can you hear it? The song?", "yes": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes", - "no": "You're back. Have you come to listen to the song?", + "no": "You're back. Have you come to listen to the song?", "yes": "Acolyte." } }, @@ -146,7 +146,7 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_SONG", - "dynamic_line": "Listen carefully. The bones… they sing. Can you hear it? The song they weave? The stories they hold?", + "dynamic_line": "Listen carefully. The bones… they sing. Can you hear it? The song they weave? The stories they hold?", "responses": [ { "text": "What? Singing bones? What are you talking about?", "topic": "TALK_BONE_SEER_SONG2" }, { "text": "Uh… yeah, sure. I think I'll just be on my way.", "topic": "TALK_DONE" } @@ -155,7 +155,7 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_SONG2", - "dynamic_line": "When it all happened, the Cataclysm, something… changed. You can see it in all creatures, but most of all their bones. They break, morph, rise again, in an infinite cycle. Living dead walk. Monsters rip and tear each other apart. You can see the resonance, the quiet hum of raw strength, and only by taking the bones does the cycle end - their story, their song, their strength, become yours to use.", + "dynamic_line": "When it all happened, the Cataclysm, something… changed. You can see it in all creatures, but most of all their bones. They break, morph, rise again, in an infinite cycle. Living dead walk. Monsters rip and tear each other apart. You can see the resonance, the quiet hum of raw strength, and only by taking the bones does the cycle end - their story, their song, their strength, become yours to use.", "responses": [ { "text": "So what do you actually do with the bones?", "topic": "TALK_BONE_SEER_BONES" }, { "text": "I'm still not quite sure what you mean about songs or strength.", "topic": "TALK_BONE_SEER_SONG3" }, @@ -165,13 +165,13 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_SONG3", - "dynamic_line": "Only when you crush the bones of a body does it cease to rise. Only if you examine the bones can you see what was. Thus is the story. Whatever causes this change is alive, moving within us all, an inevitable part of this new world. It holds the power of change. When we hold the bones, we hold the power. Thus the strength. Together… they form a beautiful song.", + "dynamic_line": "Only when you crush the bones of a body does it cease to rise. Only if you examine the bones can you see what was. Thus is the story. Whatever causes this change is alive, moving within us all, an inevitable part of this new world. It holds the power of change. When we hold the bones, we hold the power. Thus the strength. Together… they form a beautiful song.", "responses": [ { "text": "I think I understand what you mean, though I am not sure if I agree.", "topic": "TALK_NONE" } ] }, { "type": "talk_topic", "id": "TALK_BONE_SEER_OTHERS", - "dynamic_line": "There are others who follow this cause. You'd do well to aid them, for though we may not be numerous, we are emboldened by the songs we carry.", + "dynamic_line": "There are others who follow this cause. You'd do well to aid them, for though we may not be numerous, we are emboldened by the songs we carry.", "responses": [ { "text": "I will bear that in mind.", "topic": "TALK_NONE" }, { "text": "Cause? Why do you gather these bones anyway?", "topic": "TALK_BONE_SEER_BONES" } @@ -180,13 +180,13 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_BONES", - "dynamic_line": "The song can be weaved in many forms. Carved bone charms, weapons and armor all hold immense power, and when the time comes, me and my kindred shall gather a great amount of song and sing it to restore this world. Restore it, or end it. Makes no difference.", + "dynamic_line": "The song can be weaved in many forms. Carved bone charms, weapons and armor all hold immense power, and when the time comes, me and my kindred shall gather a great amount of song and sing it to restore this world. Restore it, or end it. Makes no difference.", "responses": [ { "text": "End the world? What?", "topic": "TALK_BONE_SEER_END" } ] }, { "type": "talk_topic", "id": "TALK_BONE_SEER_END", - "dynamic_line": "We believe that enough power in one song could revert the Cataclysm - or accelerate it to a time beyond all, ending it all the same. But with the world looking as is, both options are preferable.", + "dynamic_line": "We believe that enough power in one song could revert the Cataclysm - or accelerate it to a time beyond all, ending it all the same. But with the world looking as is, both options are preferable.", "responses": [ { "text": "Sounds somewhat… doomsday-ish, but I suppose it's a belief like any other. Still, at least you have a goal to help the world, one way or another.", @@ -198,13 +198,13 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_ACOLYTE", - "dynamic_line": "Your mind is open. More than most. Perhaps one day, you too will feel the power of the song and become Kindred. For now, Acolyte, listen, listen and feel the song.", + "dynamic_line": "Your mind is open. More than most. Perhaps one day, you too will feel the power of the song and become Kindred. For now, Acolyte, listen, listen and feel the song.", "responses": [ { "text": "I… thank you.", "topic": "TALK_BONE_SEER" } ] }, { "type": "talk_topic", "id": "TALK_BONE_SEER_INSULT", - "dynamic_line": "Your skepticism does not surprise me. Perhaps one day, you too will hear the inevitability of the song, feel its power. But until then, you will remain an Acolyte, path to the Kindred closed.", + "dynamic_line": "Your skepticism does not surprise me. Perhaps one day, you too will hear the inevitability of the song, feel its power. But until then, you will remain an Acolyte, path to the Kindred closed.", "responses": [ { "text": "Yeah, alright.", "topic": "TALK_BONE_SEER" } ] }, { @@ -277,7 +277,7 @@ { "id": "TALK_MISSION_OFFER_SEER", "type": "talk_topic", - "dynamic_line": "If you wish to be set on the path to enlightenment, first you must learn to listen and hear the song. Go out, butcher a creature and feel the power between your fingertips. Then bring me the bones and I shall carve them for you. ", + "dynamic_line": "If you wish to be set on the path to enlightenment, first you must learn to listen and hear the song. Go out, butcher a creature and feel the power between your fingertips. Then bring me the bones and I shall carve them for you.", "responses": [ { "text": "Well, I guess I oughta see where this goes. I'm in.", @@ -290,7 +290,7 @@ { "id": "TALK_MISSION_ACCEPTED_SEER", "type": "talk_topic", - "dynamic_line": "Excellent. Now be on your way.", + "dynamic_line": "Excellent. Now be on your way.", "responses": [ { "text": "Consider it done. But I also wanted to ask…", "topic": "TALK_BONE_SEER" }, { "text": "Where should I start?", "topic": "TALK_MISSION_ADVICE_SEER" }, @@ -301,13 +301,13 @@ { "id": "TALK_MISSION_ADVICE_SEER", "type": "talk_topic", - "dynamic_line": "The shambling corpses we see all around move in discord. Their song can be used, but for an Acolyte, this would be needlessly hard. Be sure to carve an unspoiled living creature.", + "dynamic_line": "The shambling corpses we see all around move in discord. Their song can be used, but for an Acolyte, this would be needlessly hard. Be sure to carve an unspoiled living creature.", "responses": [ { "text": "So, a creature that isn't a zombie, or a monster. Got it.", "topic": "TALK_NONE" } ] }, { "id": "TALK_SHARE_EQUIPMENT_SEER", "type": "talk_topic", - "dynamic_line": "The path to enlightenment is for you to walk. For me to aid you would ultimately impede your progress and muddle your song.", + "dynamic_line": "The path to enlightenment is for you to walk. For me to aid you would ultimately impede your progress and muddle your song.", "responses": [ { "text": "I see. Very well then.", "topic": "TALK_NONE" } ] }, { @@ -316,7 +316,7 @@ "dynamic_line": { "u_has_trait": "seer_mark", "no": "Only those who bear my mark will prove themselves worthy of my skills.", - "yes": "You bear my mark, meaning I believe you have potential to learn to truly listen to the Song. Yes, I will lend my skills to you, for now." + "yes": "You bear my mark, meaning I believe you have potential to learn to truly listen to the Song. Yes, I will lend my skills to you, for now." }, "responses": [ { "text": "I see. Very well then.", "topic": "TALK_NONE", "condition": { "not": { "u_has_trait": "seer_mark" } } }, @@ -336,7 +336,7 @@ { "id": "TALK_MISSION_REJECTED_SEER", "type": "talk_topic", - "dynamic_line": "I understand your reluctancy. Feel free to return when you see the way.", + "dynamic_line": "I understand your reluctancy. Feel free to return when you see the way.", "responses": [ { "text": "Maybe some other time. Changing the topic…", "topic": "TALK_NONE" }, { "text": "Alright, but I have to go now.", "topic": "TALK_DONE" } @@ -345,7 +345,7 @@ { "type": "talk_topic", "id": "TALK_BONE_SEER_CYCLE", - "dynamic_line": "It's not just walking horrors and monsters that have changed with the Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only see it in others, but it happens to us, even you and I. How many times have you fallen? Your flesh rent from your body, devoured. Or perhaps it was the quiet whimper of death to exposure. But your bones rose again. Different flesh, different name, sometimes even different knowledge, but the bones, the same. We are all trapped in the same cycle. We just keep forgetting. That's why we need to amass the Song. That's why it has to end, even if it means the destruction, not restoration.", + "dynamic_line": "It's not just walking horrors and monsters that have changed with the Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only see it in others, but it happens to us, even you and I. How many times have you fallen? Your flesh rent from your body, devoured. Or perhaps it was the quiet whimper of death to exposure. But your bones rose again. Different flesh, different name, sometimes even different knowledge, but the bones, the same. We are all trapped in the same cycle. We just keep forgetting. That's why we need to amass the Song. That's why it has to end, even if it means the destruction, not restoration.", "responses": [ { "text": "That is… that's really one hell of a belief. Well, if it helps you deal with the world, who am I to argue.", diff --git a/data/json/npcs/TALK_ALLY_TUTORIAL.json b/data/json/npcs/TALK_ALLY_TUTORIAL.json index 0f3b82d484c34..cabdf3cb49029 100644 --- a/data/json/npcs/TALK_ALLY_TUTORIAL.json +++ b/data/json/npcs/TALK_ALLY_TUTORIAL.json @@ -6,6 +6,25 @@ "responses": [ { "text": "Forget I asked.", "topic": "TALK_FRIEND" }, { "text": "Skip it, let's get going.", "topic": "TALK_DONE" }, + { + "text": "Any hints about the world we now live in?", + "trial": { + "type": "CONDITION", + "condition": { + "or": [ + { "npc_need": "thirst", "amount": 80 }, + { "npc_need": "hunger", "amount": 160 }, + { "npc_need": "fatigue", "level": "TIRED" }, + { "npc_has_effect": "asked_to_hint" }, + "u_driving", + "npc_driving" + ] + } + }, + "success": { "topic": "TALK_SHELTER_DENY_ADVICE" }, + "failure": { "topic": "TALK_SHELTER_ADVICE", "effect": { "npc_add_effect": "asked_to_hint", "duration": 300 } } + }, + { "text": "Let's talk about faction camps.", "topic": "TALK_CAMP_GENERAL" }, { "text": "What do you mean, \"mostly\" willing to follow my lead?", "topic": "TALK_ALLY_TUTORIAL_MUTINY" }, { "text": "What's that about giving instructions?", "topic": "TALK_ALLY_TUTORIAL_TALK" }, { "text": "We can talk with radios?", "topic": "TALK_ALLY_TUTORIAL_RADIO" }, @@ -110,7 +129,7 @@ { "id": "TALK_ALLY_TUTORIAL_ACTIVITIES", "type": "talk_topic", - "dynamic_line": "I can help with some tasks if you show me where to work.\n Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much.", + "dynamic_line": "I can help with some tasks if you show me where to work.\n Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much.", "responses": [ { "text": "Good to know. Can you perform first aid?", "topic": "TALK_ALLY_TUTORIAL_MEDIC" }, { "text": "What about carrying stuff in general?", "topic": "TALK_ALLY_TUTORIAL_MULE" }, diff --git a/data/json/npcs/TALK_CITY_COP.json b/data/json/npcs/TALK_CITY_COP.json index a2ad99073acdb..03d6ccabf40e0 100644 --- a/data/json/npcs/TALK_CITY_COP.json +++ b/data/json/npcs/TALK_CITY_COP.json @@ -7,7 +7,7 @@ "type": "dialogue", "context": "survivor_cop", "value": "yes", - "no": "STOP, Put your hands in the air! Ha, startled you didn't I…there is no law anymore...", + "no": "STOP, Put your hands in the air! Ha, startled you didn't I… there is no law anymore…", "yes": "Hi there, ." }, "responses": [ @@ -25,7 +25,7 @@ { "type": "talk_topic", "id": "TALK_CITY_COP_INTRO", - "dynamic_line": "I was watching the station when things went sideways. None of the other officers returned from the last call, well not as humans anyway...", + "dynamic_line": "I was watching the station when things went sideways. None of the other officers returned from the last call, well not as humans anyway…", "responses": [ { "text": "Why don't you go somewhere else?", "topic": "TALK_CITY_COP_LEAVE" }, { "text": "Let's trade then.", "effect": "start_trade", "topic": "TALK_CITY_COP" }, diff --git a/data/json/npcs/TALK_COMMON_ALLY.json b/data/json/npcs/TALK_COMMON_ALLY.json index 893f2ab47a465..b1845426208b7 100644 --- a/data/json/npcs/TALK_COMMON_ALLY.json +++ b/data/json/npcs/TALK_COMMON_ALLY.json @@ -13,12 +13,12 @@ "no": { "npc_need": "fatigue", "level": "TIRED", - "no": "Just few minutes more...", + "no": "Just few minutes more…", "yes": "Make it quick, I want to go back to sleep." }, "yes": "Just let me sleep, !" }, - "yes": "No, just no..." + "yes": "No, just no…" }, "no": "Anything to do before I go to sleep?" }, @@ -46,7 +46,71 @@ "responses": [ { "text": "I want to give you some commands for combat.", "topic": "TALK_COMBAT_COMMANDS" }, { "text": "I want to set some miscellaneous rules.", "topic": "TALK_MISC_RULES" }, + { + "text": "I'd like to know a bit more about your abilities.", + "topic": "TALK_FRIEND", + "effect": "reveal_stats" + }, + { "text": "There's something I want you to do.", "topic": "TALK_ALLY_ORDERS" }, + { "text": "I just wanted to talk for a bit.", "topic": "TALK_ALLY_SOCIAL" }, + { "text": "Can you help me understand something? (HELP/TUTORIAL)", "topic": "TALK_ALLY_TUTORIAL" }, + { "text": "I'm going to go my own way for a while.", "topic": "TALK_LEAVE" }, + { "text": "Let's go.", "topic": "TALK_DONE" } + ] + }, + { + "id": [ "TALK_ALLY_SOCIAL" ], + "type": "talk_topic", + "dynamic_line": { + "is_by_radio": " *tshk* Are you serious? This isn't a cell phone. Can it wait until we're in the same place?", + "no": "Sure, what did you want to say?" + }, + "responses": [ + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_FRIEND_CONVERSATION", + "condition": { + "and": [ "at_safe_space", { "or": [ { "npc_has_trait_flag": "BG_SURVIVAL_STORY" }, { "npc_has_trait": "NPC_STATIC_NPC" } ] } ] + }, + "//": "If the NPC already has a BG story, or started out as a static NPC (and so probably doesn't need a random bg story), then go on.", + "switch": true + }, + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_FRIEND_CONVERSATION", + "condition": "at_safe_space", + "switch": true, + "effect": { "npc_add_trait": "BGSS_Confused_1" }, + "//": "If the NPC doesn't have a BG survival story flagged trait, and didn't start the game as a static NPC, give them a BG story.", + "//2": "This is a stand-in for some kind of better system to add a random trait." + }, + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_CONVERSATION_DANGER", + "condition": { "not": "at_safe_space" }, + "switch": true + }, + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_CONVERSATION_RADIO", + "condition": { "not": "is_by_radio" }, + "switch": true + }, + { + "text": "Let's just chitchat for a while, I could use some relaxation.", + "topic": "TALK_FRIEND_CHAT", + "condition": { "not": { "npc_has_effect": "asked_to_socialize" } } + }, { "text": "Can I do anything for you?", "topic": "TALK_MISSION_LIST" }, + { "text": "I changed my mind, wanted to ask you something else.", "topic": "TALK_NONE" }, + { "text": "Let's go.", "topic": "TALK_DONE" } + ] + }, + { + "id": [ "TALK_ALLY_ORDERS" ], + "type": "talk_topic", + "dynamic_line": [ "I'm all ears, my friend.", "You gonna give me orders?", "What would you like?", "Just say the word." ], + "responses": [ { "text": "Can you teach me anything?", "condition": { "not": "is_by_radio" }, @@ -66,13 +130,6 @@ "success": { "topic": "TALK_DENY_TRAIN" }, "failure": { "topic": "TALK_TRAIN_PERSUADE" } }, - { - "text": "Let's trade items", - "topic": "TRADE_HALLU", - "condition": { "npc_has_trait": "HALLUCINATION" }, - "switch": true, - "default": false - }, { "text": "Let's trade items.", "condition": { "not": "is_by_radio" }, @@ -81,6 +138,13 @@ "switch": true, "default": true }, + { + "text": "Let's trade items", + "topic": "TRADE_HALLU", + "condition": { "npc_has_trait": "HALLUCINATION" }, + "switch": true, + "default": false + }, { "text": "I want you to use this item.", "condition": { "not": "is_by_radio" }, @@ -105,8 +169,6 @@ "topic": "TALK_FRIEND_GUARD", "effect": "assign_camp" }, - { "text": "Let's talk about your current activity.", "topic": "TALK_ACTIVITIES" }, - { "text": "Let's talk about faction camps.", "topic": "TALK_CAMP_GENERAL" }, { "text": "Find a horse and mount up!", "condition": { "not": "npc_is_riding" }, @@ -126,58 +188,32 @@ "effect": "goto_location" }, { - "text": "I'd like to know a bit more about your abilities.", - "topic": "TALK_FRIEND", - "effect": "reveal_stats" - }, - { - "text": "Any hints about the world we now live in?", - "trial": { - "type": "CONDITION", - "condition": { - "or": [ - { "npc_need": "thirst", "amount": 80 }, - { "npc_need": "hunger", "amount": 160 }, - { "npc_need": "fatigue", "level": "TIRED" }, - { "npc_has_effect": "asked_to_hint" }, - "u_driving", - "npc_driving" - ] - } - }, - "success": { "topic": "TALK_SHELTER_DENY_ADVICE" }, - "failure": { "topic": "TALK_SHELTER_ADVICE", "effect": { "npc_add_effect": "asked_to_hint", "duration": 300 } } - }, - { - "text": "Mind if we just chat for a bit about your history?", - "topic": "TALK_FRIEND_CONVERSATION", - "condition": { - "and": [ "at_safe_space", { "or": [ { "npc_has_trait_flag": "BG_SURVIVAL_STORY" }, { "npc_has_trait": "NPC_STATIC_NPC" } ] } ] - }, - "//": "If the NPC already has a BG story, or started out as a static NPC (and so probably doesn't need a random bg story), then go on.", + "text": "I want you to build a camp here.", + "topic": "TALK_HALLU_CAMP", + "condition": { "npc_has_trait": "HALLUCINATION" }, "switch": true }, { - "text": "Mind if we just chat for a bit about your history?", - "topic": "TALK_FRIEND_CONVERSATION", - "condition": "at_safe_space", + "text": "I want you to build a camp here.", + "topic": "TALK_DONE", + "effect": "start_camp", + "condition": { "npc_at_om_location": "FACTION_CAMP_START" }, "switch": true, - "effect": { "npc_add_trait": "BGSS_Confused_1" }, - "//": "If the NPC doesn't have a BG survival story flagged trait, and didn't start the game as a static NPC, give them a BG story.", - "//2": "This is a stand-in for some kind of better system to add a random trait." + "default": true }, { - "text": "Mind if we just chat for a bit about your history?", - "topic": "TALK_CONVERSATION_DANGER", - "condition": { "not": "at_safe_space" } + "text": "We need to abandon this camp.", + "condition": { "npc_at_om_location": "FACTION_CAMP_ANY" }, + "topic": "TALK_DONE", + "effect": "abandon_camp" }, { - "text": "Let's just chitchat for a while, I could use some relaxation.", - "topic": "TALK_FRIEND_CHAT", - "condition": { "not": { "npc_has_effect": "asked_to_socialize" } } + "text": "Show me what needs to be done at the camp.", + "topic": "TALK_DONE", + "effect": "basecamp_mission", + "condition": { "npc_at_om_location": "FACTION_CAMP_ANY" } }, - { "text": "Tell me about giving you orders (NPC TUTORIAL).", "topic": "TALK_ALLY_TUTORIAL" }, - { "text": "I'm going to go my own way for a while.", "topic": "TALK_LEAVE" }, + { "text": "Let's talk about your current activity.", "topic": "TALK_ACTIVITIES" }, { "text": "Let's go.", "topic": "TALK_DONE" } ] }, @@ -883,56 +919,6 @@ "dynamic_line": "Sure thing, I'll make my way there.", "responses": [ { "text": "Affirmative.", "topic": "TALK_DONE" } ] }, - { - "id": "TALK_FRIEND_CHAT", - "type": "talk_topic", - "dynamic_line": [ - { "u_has_item": "beer", "yes": "", "no": "" }, - { "u_has_item": "european_pilsner", "yes": "", "no": "" }, - { "u_has_item": "pale_ale", "yes": "", "no": "" }, - { "u_has_item": "india_pale_ale", "yes": "", "no": "" }, - { "u_has_item": "wine_barley", "yes": "", "no": "" }, - { - "is_season": "summer", - "yes": "Yeah, this summer heat is hitting me hard, let's take a quick break, how goes it ?", - "no": "" - }, - { - "is_season": "winter", - "yes": "OK, maybe it'll stop me from freezing in this weather, what's up?", - "no": "" - }, - { - "is_day": "Well, it's the time of day for a quick break surely! How are you holding up?", - "no": "Man it's dark out isn't it? what's up?" - }, - { - "npc_has_effect": "infected", - "yes": "Well, I'm feeling pretty sick… are you doing OK though?", - "no": "" - }, - { - "has_no_assigned_mission": "", - "no": { - "has_many_assigned_missions": "Definitely, by the way, thanks for helping me so much with my tasks! Anyway, you coping OK, ? ", - "no": "OK, let's take a moment, oh, and thanks for helping me with that thing, so… what's up?" - } - }, - { - "days_since_cataclysm": 30, - "yes": "Now, we've got a moment, I was just thinking it's been a month or so since… since all this, how are you coping with it all?", - "no": "" - } - ], - "responses": [ - { - "text": "Oh you know, not bad, not bad…", - "topic": "TALK_DONE", - "switch": true, - "effect": [ "morale_chat_activity", { "npc_add_effect": "asked_to_socialize", "duration": 7000 } ] - } - ] - }, { "id": "TRADE_HALLU", "type": "talk_topic", diff --git a/data/json/npcs/TALK_COMMON_GREET.json b/data/json/npcs/TALK_COMMON_GREET.json index 1be7967e15d8e..b59242d6d8e2f 100644 --- a/data/json/npcs/TALK_COMMON_GREET.json +++ b/data/json/npcs/TALK_COMMON_GREET.json @@ -82,7 +82,7 @@ { "id": "TALK_STRANGER_WARY", "type": "talk_topic", - "dynamic_line": "Okay, no sudden movements...", + "dynamic_line": "Okay, no sudden movements…", "responses": [ { "text": "Bye.", "topic": "TALK_DONE" } ] }, { diff --git a/data/json/npcs/TALK_COMMON_OTHER.json b/data/json/npcs/TALK_COMMON_OTHER.json index de6a348c8db12..53d8d0028c216 100644 --- a/data/json/npcs/TALK_COMMON_OTHER.json +++ b/data/json/npcs/TALK_COMMON_OTHER.json @@ -72,7 +72,7 @@ "no": "Why should I travel with you?", "yes": "You asked me recently; ask again later." }, - "yes": "Not until I get some antibiotics..." + "yes": "Not until I get some antibiotics…" }, "responses": [ { @@ -225,7 +225,7 @@ "no": { "npc_has_effect": "asked_to_train", "no": "I have some reason for denying you training.", - "yes": "Give it some time, I'll show you something new later..." + "yes": "Give it some time, I'll show you something new later…" }, "yes": "I'm too tired, let me rest first." }, @@ -264,7 +264,7 @@ { "id": "TALK_FRIEND_UNCOMFORTABLE", "type": "talk_topic", - "dynamic_line": "I really don't feel comfortable doing so...", + "dynamic_line": "I really don't feel comfortable doing so…", "responses": [ { "text": "I'll give you some space.", "topic": "TALK_FRIEND" } ] }, { @@ -361,7 +361,7 @@ { "id": "TALK_STOLE_ITEM", "type": "talk_topic", - "dynamic_line": "You picked up something that does not belong to you...", + "dynamic_line": "You picked up something that does not belong to you…", "responses": [ { "text": "Okay, okay, this is all a misunderstanding. Sorry, I'll drop it now.", diff --git a/data/json/npcs/TALK_CYBORG_1.json b/data/json/npcs/TALK_CYBORG_1.json index c8bf7001283c5..9adf354fdc2bc 100644 --- a/data/json/npcs/TALK_CYBORG_1.json +++ b/data/json/npcs/TALK_CYBORG_1.json @@ -7,8 +7,8 @@ "type": "dialogue", "context": "cyborg", "value": "yes", - "no": "I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person I've seen in a long time.", - "yes": "Hey again. *kzzz*" + "no": "I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person I've seen in a long time.", + "yes": "Hey again. *kzzz*" }, "speaker_effect": { "effect": { "npc_add_var": "cyborg_has_talked", "type": "dialogue", "context": "cyborg", "value": "yes" } }, "responses": [ @@ -45,7 +45,7 @@ { "id": "TALK_CYBORG_FRIENDLY", "type": "talk_topic", - "dynamic_line": "*buzz* Great! So what happens now?", + "dynamic_line": "*buzz* Great! So what happens now?", "responses": [ { "text": "Come with me. We can help each other out.", @@ -59,7 +59,7 @@ { "id": "TALK_CYBORG_WARY", "type": "talk_topic", - "dynamic_line": "...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as them!", + "dynamic_line": "…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as them!", "responses": [ { "text": "I wouldn't have pulled your chip out if I didn't want you to think for yourself.", @@ -79,7 +79,7 @@ { "id": "TALK_CYBORG_FEARFUL", "type": "talk_topic", - "dynamic_line": "Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!", + "dynamic_line": "Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!", "responses": [ { "text": "Follow me and do my bidding, then.", @@ -104,7 +104,7 @@ { "id": "TALK_CYBORG_BREAKDOWN", "type": "talk_topic", - "dynamic_line": "...kill… *ZTZTZT* …you!", + "dynamic_line": "…kill… *ZTZTZT* …you!", "responses": [ { "text": "Run while you still can!", diff --git a/data/json/npcs/TALK_FRIEND_CONVERSATION.json b/data/json/npcs/TALK_FRIEND_CONVERSATION.json index d1561687f2bc6..78ee3d0a6ffe4 100644 --- a/data/json/npcs/TALK_FRIEND_CONVERSATION.json +++ b/data/json/npcs/TALK_FRIEND_CONVERSATION.json @@ -2,7 +2,7 @@ { "id": "TALK_CONVERSATION_DANGER", "type": "talk_topic", - "dynamic_line": "Are you sure? This doesn't seem like a particularly safe place for small talk...", + "dynamic_line": "Are you sure? This doesn't seem like a particularly safe place for small talk…", "responses": [ { "text": "It's fine, we've got a moment.", @@ -28,5 +28,90 @@ "type": "talk_topic", "dynamic_line": "What did you want to talk about?", "responses": [ { "text": "Actually, never mind.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FRIEND_CHAT", + "type": "talk_topic", + "dynamic_line": [ + { + "days_since_cataclysm": 100, + "yes": [ + { "u_has_item": "beer", "yes": " ", "no": "" }, + { + "u_has_item": "european_pilsner", + "yes": " ", + "no": "" + }, + { + "u_has_item": "pale_ale", + "yes": " ", + "no": "" + }, + { + "u_has_item": "india_pale_ale", + "yes": " ", + "no": "" + }, + { + "u_has_item": "wine_barley", + "yes": " ", + "no": "" + }, + { + "is_season": "summer", + "yes": " ", + "no": "" + }, + { + "is_season": "winter", + "yes": " ", + "no": "" + }, + { + "npc_has_effect": "infected", + "yes": " ", + "no": "" + }, + { "npc_has_intelligence": 8, "yes": "", "no": "" }, + { "npc_has_perception": 8, "yes": "", "no": "" } + ], + "no": [ + { "u_has_item": "beer", "yes": " ", "no": "" }, + { + "u_has_item": "european_pilsner", + "yes": " ", + "no": "" + }, + { "u_has_item": "pale_ale", "yes": " ", "no": "" }, + { + "u_has_item": "india_pale_ale", + "yes": " ", + "no": "" + }, + { + "u_has_item": "wine_barley", + "yes": " ", + "no": "" + }, + { "is_season": "summer", "yes": " ", "no": "" }, + { "is_season": "winter", "yes": " ", "no": "" }, + { + "npc_has_effect": "infected", + "yes": " ", + "no": "" + }, + { "npc_has_intelligence": 8, "yes": "", "no": "" }, + { "npc_has_perception": 8, "yes": "", "no": "" } + ] + } + ], + "responses": [ + { + "text": "", + "topic": "TALK_DONE", + "switch": true, + "effect": [ "morale_chat_activity", { "npc_add_effect": "asked_to_socialize", "duration": 7000 } ] + } + ] } ] diff --git a/data/json/npcs/TALK_MARLOSS_VOICE.json b/data/json/npcs/TALK_MARLOSS_VOICE.json index f27f620e9820e..b3ba9b7efbd8a 100644 --- a/data/json/npcs/TALK_MARLOSS_VOICE.json +++ b/data/json/npcs/TALK_MARLOSS_VOICE.json @@ -18,7 +18,7 @@ "May you find your peace, traveler.", "We might have lost everything, but hope remains.", "May the earth flourish beneath our paths.", - "Unity of spirit, of mind, and body...", + "Unity of spirit, of mind, and body…", "Look for the bonds which define you, and act in accord." ], "responses": [ diff --git a/data/json/npcs/TALK_NC_FARMER.json b/data/json/npcs/TALK_NC_FARMER.json index 6523b82c20560..acce03aaa0496 100644 --- a/data/json/npcs/TALK_NC_FARMER.json +++ b/data/json/npcs/TALK_NC_FARMER.json @@ -82,7 +82,7 @@ { "type": "talk_topic", "id": "TALK_NC_FARMER_EXPERTISE", - "dynamic_line": "I grew up on the farm, I don't know much about ghosts and goblins, but I've spent a lot of time growing food and I work hard. It's better in the country, cleaner. Not as dangerous. I hope.", + "dynamic_line": "I grew up on the farm, I don't know much about ghosts and goblins, but I've spent a lot of time growing food and I work hard. It's better in the country, cleaner. Not as dangerous. I hope.", "responses": [ { "text": "Why don't you go somewhere else?", "topic": "TALK_NC_FARMER_LEAVE" }, { "text": "Wanna get outta here?", "topic": "TALK_SUGGEST_FOLLOW" }, diff --git a/data/json/npcs/TALK_TEST.json b/data/json/npcs/TALK_TEST.json index 93cdab41ac3b3..6c23dd217571c 100644 --- a/data/json/npcs/TALK_TEST.json +++ b/data/json/npcs/TALK_TEST.json @@ -605,6 +605,31 @@ } ] }, + { + "type": "talk_topic", + "id": "TALK_TEST_VARS_TIME", + "dynamic_line": "This is a test conversation that shouldn't appear in the game.", + "responses": [ + { "text": "This is a basic test response.", "topic": "TALK_DONE" }, + { + "text": "This is a u_add_var time test response.", + "topic": "TALK_DONE", + "effect": { "u_add_var": "test", "type": "test", "context": "var_time_test", "time": true }, + "condition": { "not": { "u_has_var": "test", "type": "test", "context": "var_time_test", "time": true } } + }, + { + "text": "This is a npc_add_var time test response.", + "topic": "TALK_DONE", + "effect": { "npc_add_var": "test", "type": "test", "context": "var_time_test", "time": true }, + "condition": { "not": { "u_has_var": "test", "type": "test", "context": "var_time_test", "time": true } } + }, + { + "text": "This is a u_compare_var time test response for > 3_days.", + "topic": "TALK_DONE", + "condition": { "u_compare_time_since_var": "test", "type": "test", "context": "var_time_test", "op": ">", "time": "3 days" } + } + ] + }, { "type": "talk_topic", "id": "TALK_TEST_ADJUST_VARS", diff --git a/data/json/npcs/TALK_TRUE_FOODPERSON.json b/data/json/npcs/TALK_TRUE_FOODPERSON.json index dddd7c3b0391b..126759d4d3ab3 100644 --- a/data/json/npcs/TALK_TRUE_FOODPERSON.json +++ b/data/json/npcs/TALK_TRUE_FOODPERSON.json @@ -135,7 +135,7 @@ { "id": "TALK_FOODPERSON_INTRODUCTION", "type": "talk_topic", - "dynamic_line": "Indeed it is I! The one and only FOODPERSON!", + "dynamic_line": "Indeed it is I! The one and only FOODPERSON!", "responses": [ { "text": "Wow! Such an honor to meet you in person!", diff --git a/data/json/npcs/factions.json b/data/json/npcs/factions.json index ab58aa84435c4..a02e7fa68c8f8 100644 --- a/data/json/npcs/factions.json +++ b/data/json/npcs/factions.json @@ -54,6 +54,7 @@ "type": "faction", "id": "robofac", "name": "Hub 01", + "mon_faction": "robofac", "likes_u": -200, "respects_u": 0, "known_by_u": false, diff --git a/data/json/npcs/hints.json b/data/json/npcs/hints.json index a6494cfc0a08d..d25e659098279 100644 --- a/data/json/npcs/hints.json +++ b/data/json/npcs/hints.json @@ -1,175 +1,177 @@ -{ - "type": "snippet", - "category": "hint", - "text": [ - "Squirrels are pretty yummy, but if you shoot them with a high-powered gun you'll probably be left with no meat! Use a BB gun or maybe a .22 rifle.", - "Squirrels really ain't such a bad snack if you don't blast them all to hell.", - "Ever run into those big worm things? If you see trails of churned-up dirt, you can be sure they're around.", - "Try to stay on the roads as much as you can. Giant worms can't cross them!", - "Don't relax after killing a giant worm. Little bits of them can break off and still attack!", - "If you see a big mob of zombies coming, RUN! Trying to fight them all is impossible unless you have a big tactical advantage.", - "If you see a big mob of zombies coming, you better run. Trying to fight them all is suicide!", - "When you see a swarm of zombies coming it's time to run!", - "If you're getting chased by a hoard of zombies, try ducking into the subways and traveling a block or two, then coming back up.", - "Watch out for those zombies that shriek; they'll let other zombies know where you are, and will attract them from all over.", - "Those acid-spitting zombies are pretty nasty, but if you're smart, you can get other zombies to wade through the acid.", - "If there's a pool of acid blocking your way, trying tossing a junk item into it. Eating up items will help neutralize the acid faster.", - "Rubber boots aren't as tough as combat boots and you don't run very fast in them. But I've seen zombies vomiting puddles of acid, and I'd hate to have my feet melt off, so I'd consider having a pair of those.", - "There's this type of zombie that can shoot bolts of lightning! Stay away from walls and stuff when they do… the electricity can travel along solid surfaces.", - "Zombie hulks are NASTY, but they're easy to outsmart. If there's other monsters between you and them, they'll kill the monster for you!", - "If you run into a zombie hulk, it's probably a good idea to run. They're fast as hell, but pretty dumb; they'll try to smash through obstacles rather than going around, and that slows them down a lot.", - "Zombie brutes and hulks have really tough hide, but skeletal juggernauts with their bone plates are the worst. Don't bother shooting at them with lower-caliber guns, the bullet will bounce right off!", - "Try not to kill a boomer if it's standing right next to you. They tend to explode when they die, and that pink goop will get all over you.", - "Skeletons are a tough target for a gun. They're so skinny and full of holes that it's hard to make a good hit. And those big ones are hard as nails too.", - "Small skeletons are too delicate to smash through doors or windows. Big ones can walk in through a wall. At least they can't smell you, unlike zombies, so if you turn your light off at night you can sneak right past.", - "Don't try to take on a skeleton with a bladed weapon… you'll just leave scratch marks. You've got to shatter those bones with a hammer or something.", - "It's a good idea to butcher corpses if you have the time. I've seen these weird zombies bring their friends back from the dead!", - "I have a buddy who was sleeping in this cabin way out in the woods, when he suddenly woke up to trees and vines growing right up through the floor and walls! He said it was some kind of huge tree beast…", - "Oh man, have you gone down into the old subway systems? I'd be careful… there's these things down there that are like zombies, but tougher.", - "There's snakes down in most of the old sewer systems. They're slow on land, but boy, those suckers can swim fast!", - "If you're planning on wandering around the sewers--not that you'd have a reason too--watch out for those fish. Those suckers are fast, and vicious too!", - "Have you seen those eyebots flying around? It's hard to say, but some faction's controlling them--maybe the military. All I know is, I don't want them taking my picture…", - "Ever go toe-to-toe with a manhack? Tiny little helicopters covered in knives. Best be packing a shotgun!", - "They're rare, but molebots are nasty things. They bore through the ground, then pop up to stab ya. Still, you're safe from them if you stay on pavement…", - "Don't fire your gun if you can help it - the noise attracts monsters. If you could get a silencer, or make one, it would give you some advantage.", - "Standing behind a window is a good tactic. It takes zombies a long time to crawl through, giving you lots of opportunities to hit them.", - "Zombies are pretty dumb… heck, most monsters are! If you can get a fire going between you and them, they'll just run straight through it.", - "I know it's tempting to just go full-auto and unload as many bullets as possible, but don't except as a last resort. It's inaccurate and wastes ammo.", - "If there's a bunch of zombies in a straight line, try unloading a burst from your gun. Be sure to aim at the zombie furthest away; you'll hit more of them that way.", - "If you shoot a zombie, but don't quite kill it, try to finish it off with a punch or something instead of wasting a bullet.", - "If you're in a corridor or something, and there's a bunch of zombies chasing you down it, try to wound the guy in front badly. He'll start moving slow and cause a serious traffic jam!", - "Here's a trick for taking care of a huge swarm of zombies chasing you: head into a liquor store, shoot out as many bottles as you can, then light the alcohol on fire. Then duck out the back door, and watch the zombies run into a burning building!", - "Sledge hammers may seem like a great weapon, but swinging them is really slow, and you won't do much damage unless you're really strong.", - "For a good melee weapon, you can't beat a machete. I've seen a guy take down a zombie brute with one! Of course, if you can find a katana, that might be even better…", - "A knife spear makes a good weapon in a pinch, but a spike strapped to a stick isn't the sturdiest construction. At least you can strap the spike back on when it comes off.", - "You know, a glass bottle can make a good weapon in a pinch. If you break it over someone's head, the shattering glass will hurt them extra. Of course, it might hurt your hands, too…", - "You know what makes a nice weapon? Take a two by four, or a baseball bat or something, and stick a bunch of nails through the end!", - "BB guns may seem like a joke, but they've got their uses. They're good for hunting small game, or getting to know the basics of rifles.", - "Crossbows are a great weapon for long term use. Most of the time, you can retrieve the bolt after shooting it, so running out of ammo is less of a concern.", - "Consider going Robin Hood, if you have the strength to pull the string of a bow. Those larger ones need significant muscle power, but they hit hard, and are silent.", - "I hid in a dumpster once or twice. I may smell bad, but I'm not dead, as they say.", - "It's good to keep a pistol handy, in case your main gun runs out of ammo or something. They're also better than most guns at short range.", - "Shotguns are nice; you can take out lots of baddies with a single shot. Just remember that they're noisy as hell, and you might end up attracting more than you kill.", - "A good submachine gun can't be beat. Most of them use common ammo, they're good at short and long range, and you can burst-fire if you need to!", - "Hunting rifles are great at long range, but suck close up. Plus, most of them don't carry many rounds. Keep a pistol as a sidearm if you use a rifle.", - "You know, you don't have to go full auto with an assault rifle. Firing single shots is more accurate and efficient!", - "I've seen a couple guys running around with laser pistols. They seem like the perfect weapon: quiet, accurate, and deadly. But I've never found one, and I bet ammo is wicked scarce…", - "When it comes to footwear, you've got two basic choices as far as I see it; sneakers, for running extra fast, or boots for durability. Depends on your style, I guess.", - "You don't really need to wear gloves most of the time, but once in a while they'll really come in handy.", - "I wish I could still use those rollerblades. I would be so fast. But I took an arrow to the knee, and all that.", - "It's good to keep a filter mask or gas mask handy. You never know when you'll have to go into a smoke-filled room or something.", - "There's basically no reason not to wear safety glasses… nothing is worse than taking a hit to the eyes and getting blinded for a few seconds.", - "Ski goggles are a great choice if you're worried about getting stuff in your eyes. Perfect for dealing with boomers!", - "If you get a pair of night vision goggles, hold on to them! A flashlight will give you away, but with goggles you can be sneaky. Beware that some types of zombies are camouflaged against it, and require proper light to be visible.", - "I know they look dumb, but wearing a fanny pack gives you that extra bit of storage without encumbering you.", - "Backpacks let you carry lots of stuff, but they limit your movement a lot. If you have to fight a zombie at close range, don't wear one, or at least drop it on the ground before the fight.", - "Don't underestimate a good book. Not only will it keep you company on lonely nights, but you can learn a hell of a lot from some of them.", - "It's a good idea to carry around a couple of empty bottles. You can fill them up with water, gasoline, or whatever!", - "First aid 101 for you. Always bandage your wounds, they will heal faster that way. Bandages are plenty and you can make makeshift ones easily, so there is no reason not to.", - "I can bandage you if you are wounded, so give me some spare bandages, if you have any.", - "If you have extra antiseptic, use it to disinfect your wounds, even if they aren't infected. They will recover faster that way.", - "Treat your infected wounds as soon as possible. If the infection spreads only antibiotics may help you, but it will take time, and you may still die from it if it's too serious.", - "If you need a bunch of rags for making Molotov cocktails, take a pair of scissors to an old t-shirt or something.", - "Carrying a lighter is something all veterans do. It takes up almost no space, and can easily save your life.", - "If you can spare the space, you might want to carry a fire extinguisher along. Nothing is worse than being trapped in a burning building!", - "Crowbars not only make a pretty good weapon, they're also useful for opening locked doors and lifting manhole covers.", - "If you're spending the night in a dangerous area, grab a shovel and dig pits all around your camp. If it's more than one night, you might want to put broken glass or sticks inside the pits for better effect.", - "A chainsaw may seem like a great weapon, but remember that they're slow, unwieldy, and very noisy.", - "Bubblewrap is pretty harmless, but setting it up around you before going to sleep will keep you from waking up to a zombie punching you.", - "Bear traps are a nice way to cover an escape. If you place one in a doorway, the first zombie through will get stuck, and the rest won't be able to get past!", - "Smoke grenades aren't really offensive weapons, but they'll cover up your scent and hide you from view--perfect for making a quick escape.", - "Don't use Molotovs indoors. Especially in a liquor store.", - "If you're going to be playing with Molotov cocktails around a gas station, just make sure you're a long way from those pumps.", - "I once knew a guy who figured he'd survive a night in the subway by setting fires blocking off the tunnel in both directions and sleeping between them. He wound up asphyxiating on the smoke.", - "Don't light a Molotov until you're ready to throw it. Not only can they go out, but if you accidentally drop it or something, you're in trouble.", - "If you're weak or clumsy, it might be a good idea not to mess with Molotovs or grenades. Accidentally dropping them when you meant to throw them could be deadly.", - "If you're not particularly agile it might be good not to mess with Molotovs or grenades. Accidents involving these sort of items tend to be grievous.", - "If you're wandering in the wilderness, or following a road, keep an eye out for wild strawberries, blueberries and other gifts of nature.", - "Be careful eating wild mushrooms. Some are poisonous, and others can make you hallucinate.", - "Try to go around swamps, if you can. Some of them have sinkholes that can pull you right underground.", - "I heard about this group that raided a bee hive a while ago. Everyone got massacred but one, and he came home with this weird, magic honey stuff.", - "If you need to, you can swim across a river to escape; some monsters can't swim. Just make sure you drop as much stuff as possible first, and maybe strip naked, or you'll sink like a rock.", - "Houses can be a surprisingly good resource for all kinds of stuff; clothing, medication, food, books, and more. People kept all the odd things around, especially in basements.", - "While there's not much to loot, gas stations are a good source for gasoline, to power tools or to make Molotov cocktails.", - "It's not like in the movies; shooting a gas pump won't make it explode. But it WILL make it leak all over the place, which is a definite fire hazard.", - "I know grocery stores and stuff are full of fruit, but be careful, it's probably rotten.", - "Next time you visit a grocery store, load up on canned goods. They never go bad!", - "Load up on canned goods if you ever find a grocery store. Cans never go bad!", - "I've found more good weapons in hardware stores than anywhere else. Except gun stores, of course.", - "Liquor stores are a great place to pick up non-alcoholic beverages, too. Not that I mind alcohol!", - "Most gun stores follow pretty similar layouts. The restricted stuff - SMGs, assault rifles, and most importantly ammo - are always behind the counter.", - "I've spent many nights in the changing rooms at the back of clothing stores. Walls on four sides, far from the store's entrance, a corridor for easy defense… it's perfect!", - "Have you seen those weird science labs out in the middle of nowhere? I think you need some kind of special ID card to get in.", - "I have a dream of raiding a military bunker, but zombies and armor are a scary mix. And the sheer thought of being sprayed with bullets by a turret is giving me the shivers.", - "I've thought about raiding an ant hill before, but I realized it wasn't worth the risk. I doubt they have any loot beyond some scraps of food, you know?", - "This guy I know was walking through the subway when he came across a giant rift in the earth, with lava far below. Weird, huh?", - "In a lot of places, there's little hallways connecting the subways with the sewers, with heavy metal doors on both ends. It's a perfect place to sleep!", - "Be careful of drinking water from rivers and stuff, it's a good way to get sick. But if you have a water purifier, it'll make it safe.", - "Autodocs are probably your best bet to install bionics - if you can find one! However, I heard they won't work if you don't bring anesthetics to put you in a sleep.", - "Be wary of anything deeper than your average basement. Some folks heard scary screams from the ventilation shafts of mines and labs. Very unsettling screams.", - "A screwdriver a day keeps the scurvy away!", - "Hungrier than usual? Natural oils can help. Not tasty at all, but who cares when eating your leg is the second option?", - "Terrain can turn the tide of a battle. Make sure you use it against your enemies, lest it be used against you.", - "Folks that passed by the mine said something about foul smell. If you plan a visit there consider taking a gas mask with you.", - "Knowledge is power. Seriously, just pick up a book.", - "Knowledge is power. And books are power you can read.", - "Knowledge is power. But not every book you find contains true knowledge.", - "Some days are full of sadness. Reading can help, if you have the right book.", - "Nothing can kill you if everything is already dead. Well, except cold, hunger, and… never mind.", - "I met a girl that insisted that she saw a land shark boring through rock, walls, and dirt alike. I'd consider it a fable, but I've seen things, and can't just say it's a lie.", - "Boil first, then drink. Ten men caravan once drank from a spring, and they are now known as a three man caravan.", - "I've once seen a full duffel bag pass hands five times in a week. Having a lot of stuff is a moot point if you can't run from zombies.", - "Tim says you can drive a car through a horde of zombies. Tim is now a zombie. Any questions?", - "They said: go solar, save the environment and yourself. Well… there is no environment to save now, but one can still save thyself I guess.", - "If you can't find a knife try smashing potted plants. It just might give you everything you need to make one.", - "What's the difference between a good and a bad choke point? The good one has another back door behind you.", - "So, methinks: if you could convince the cop-bots that you are their superior…", - "You'd be surprised how many items can be disassembled into their components. A guy around here, McSomething whatever his name is, is a master at this.", - "A soldering iron can be an aspiring mechanic's best friend. You can also cauterize a wound with it, but as many people died as lived from that treatment, so I guess it's a last resort.", - "I've seen some folks running with freshly installed CBMs. That means there is a way to get them from places other than ransacked shops. Maybe that explains those cut-up bodies I've seen around.", - "I'm fed up with smoked meat, but it lasts so long. Well… if I had more heart for learning cooking I guess I'd be able to diversify my food without sacrificing its shelf life.", - "Tricky Joe was hanged for his inventive ways of killing zombies. Yeah, burning down a building to smoke few hordes is ok, but burning a whole town with all the loot certainly is not.", - "Mr Tombstone always said: take nothing with you for the raids, save the space for loot. He was known as Joe then and he rightfully earned his nickname as the first tombstone 'owner' around this place.", - "When the whole town is one big supermarket a shopping cart becomes your best friend.", - "A friend is a second mouth to fill, but when it comes to work four hands are always better than two.", - "I was against drugs until I was almost killed by a zombie. I was hauling my sorry ass away from the horde, with nothing more but some white powder I got from that zombie. Saved me that time.", - "Not sure if Mike is sane any more. He was unfortunate enough to be driven in to a school one time. This experience broke more than his ribs then.", - "A thought about explosives. If you can still run and it did not went boom yet, run some more. There is no such thing as excess space between you and a stick of dynamite.", - "Avoid using launchers in narrow hallways, you might miss.", - "Met a mad chemist once. She made a battery from a potato… or was it lemon?", - "Met a mad chemist once. She made a battery from a potato, and then nobody was willing to eat the potato.", - "Police brutality lives on it seems. It's just more mechanical now, with all the cops dead and cop robots roaming free on the loose. If you'll get arrested who will give you justice? A zombie judge? Will they put you in a zombie prison? No thanks, I'll pass.", - "Is it dead yet? How can you tell if it was dead before and it's dead now? I prefer asking: are? *smash* you? *smash* dead? *smash* yet? *smash smash smash*", - "I hear there's strange big berries around, but why don't I hear first hand if they are filling for their size or not?", - "I've heard of a gang called The Doctors. You know, bank robbers wearing stethoscopes. What are they trying to achieve? I use paper money to start fires now.", - "You can hole up on a roof if you need to. Yeah, the rain will fall on your head, but it's harder for the dead to get you there. Get a tent, a rollmat, a sleeping bag and you're set.", - "I thought about putting a bag on my dog to carry some of my stuff. It didn't work, because it was a chihuahua, and it was eaten by a rottweiler. Should have put some Kevlar on it like those Z9. Oh well…", - "Stuff from zombies is filthy but perfectly fine otherwise. Using soap or other detergents won't hurt you. Quick wash and you're equipped for days.", - "Civilization has made a step back in time, so let's learn from the past. No fridges? Build a root cellar or keep food cool in the basement. No guns? Make a pointy stick or a cudgel, and work from there. The end of the world is not the end, it seems.", - "Hey, if you happen to find a set of two two-way radios, give one to me and we will be able to talk while being away from each other.", - "If I had the skill to do it, I'd build a boat and sail down the river. Maybe even towards the ocean. Or make an amphibious vehicle that could drive on land too. That would be useful.", - "I sink like a rock in water, but I once used a scuba tank to cross a river that had no bridge nearby.", - "Can you imagine? I've heard of people digging graves for loot. Whole cities lay dead for the taking and they dig graves! Madness!", - "When I broke a leg few years ago they had this great machine at the hospital that set the bones in place. I'd hate to break a limb in this apocalypse, but it's something to remember. You never know.", - "You, me, and another pair of hands and we might even think of settling down. Making a base of our own. A bastion of hope in the apocalypse. Think of it.", - "Hey if you are leading, just tell me what to do. You want me to shoot, go melee, use grenades? I can adjust to your style of fighting.", - "Everything seems to mutate nowadays. Even survivors. I wonder if I would look good with bunny ears? Would I hear better?", - "Everything seems to mutate nowadays. Even survivors. Do you think I'd still look good if I had piranha teeth?", - "Everything seems to mutate nowadays. Even survivors. You think I'd look good with thorns growing from my face?", - "Everything seems to mutate nowadays. Even survivors. If my eyeballs began shooting lasers do you think I would still be able see?", - "Everything seems to mutate nowadays. Even survivors. I wonder how I would look with antlers? Hats would be out of the question…", - "Winter is a harsh lady. You need fire to survive, to heat yourself and your water and food. Keep a cooking device to melt what is frozen, and a thermos for the liquids.", - "There is not much gas left for the vehicles. If I'd plan for the long run, I'd consider learning about steam engines, or maybe making biodiesel.", - "Heard a rumor that few cities were evacuated to a place that's not on the maps. Tough luck finding them now. But perhaps they don't want to be found. Or worse - perhaps you don't know that you don't want to find them either, if you catch my drift.", - "Heard a rumor about a lady on rollerblades with a fire extinguisher strapped to her back. Zipping around, hardly wearing no clothes, smashing cannibals in the face with a baseball bat. Don't that beat all?", - "Ok, some weird shit now. Before we met I saw a knight. No, I'm fine under the hood. A guy in a full medieval armor was cornered by some zombies. Much to be said, but half an hour later, he was still alive. Guess you can take a punch being a walking tin can.", - "If you're into electronics, you may try to make a noise emitter from a talking doll, or something that has a speaker. Why? To distract the zombies, of course.", - "A friend of mine was a hunter and showed me once how to butcher properly. You need a flat clean surface to place the products, a rack to hang the carcass in the air, and a good knife. If you're in a forest you may use a tree and a rope. Big game might require a saw too.", - "A friend of mine was a hunter and told me, that if you field dress a corpse, it will stay fresh a bit longer.", - "Look at the sky before you go for adventure. You will know what weather to expect. It's nothing compared to the old meteorology and satellite pictures, but at least you may know if you need the umbrella.", - "Be extra careful on roads. They are easy to travel on, but occasional minefield or a road block can make you feel sorry in an instant. I've even seen a tank once. I ran away like never before.", - "I know it's not best of times, but try to sleep well. You're not yourself if you're sleep deprived. Grab a pillow and a blanket. If you can't, even a teddy bear under your head and a pile of clothes to keep you warm can make a difference. And pick a spot well, even a chair or a bench is better than a cold ground.", - "There's no rule against wearing more than one set of pants. Well, I mean, there probably is, but nothing stopping you from breaking it!", - "There are two ways of throwing grenades. The smart one is throwing from behind a corner. The less smart one involves getting shot while throwing in the open and being torn apart by the resulting explosion." - ] -} +[ + { + "type": "snippet", + "category": "hint", + "text": [ + "Squirrels are pretty yummy, but if you shoot them with a high-powered gun you'll probably be left with no meat! Use a BB gun or maybe a .22 rifle.", + "Squirrels really ain't such a bad snack if you don't blast them all to hell.", + "Ever run into those big worm things? If you see trails of churned-up dirt, you can be sure they're around.", + "Try to stay on the roads as much as you can. Giant worms can't cross them!", + "Don't relax after killing a giant worm. Little bits of them can break off and still attack!", + "If you see a big mob of zombies coming, RUN! Trying to fight them all is impossible unless you have a big tactical advantage.", + "If you see a big mob of zombies coming, you better run. Trying to fight them all is suicide!", + "When you see a swarm of zombies coming it's time to run!", + "If you're getting chased by a hoard of zombies, try ducking into the subways and traveling a block or two, then coming back up.", + "Watch out for those zombies that shriek; they'll let other zombies know where you are, and will attract them from all over.", + "Those acid-spitting zombies are pretty nasty, but if you're smart, you can get other zombies to wade through the acid.", + "If there's a pool of acid blocking your way, trying tossing a junk item into it. Eating up items will help neutralize the acid faster.", + "Rubber boots aren't as tough as combat boots and you don't run very fast in them. But I've seen zombies vomiting puddles of acid, and I'd hate to have my feet melt off, so I'd consider having a pair of those.", + "There's this type of zombie that can shoot bolts of lightning! Stay away from walls and stuff when they do… the electricity can travel along solid surfaces.", + "Zombie hulks are NASTY, but they're easy to outsmart. If there's other monsters between you and them, they'll kill the monster for you!", + "If you run into a zombie hulk, it's probably a good idea to run. They're fast as hell, but pretty dumb; they'll try to smash through obstacles rather than going around, and that slows them down a lot.", + "Zombie brutes and hulks have really tough hide, but skeletal juggernauts with their bone plates are the worst. Don't bother shooting at them with lower-caliber guns, the bullet will bounce right off!", + "Try not to kill a boomer if it's standing right next to you. They tend to explode when they die, and that pink goop will get all over you.", + "Skeletons are a tough target for a gun. They're so skinny and full of holes that it's hard to make a good hit. And those big ones are hard as nails too.", + "Small skeletons are too delicate to smash through doors or windows. Big ones can walk in through a wall. At least they can't smell you, unlike zombies, so if you turn your light off at night you can sneak right past.", + "Don't try to take on a skeleton with a bladed weapon… you'll just leave scratch marks. You've got to shatter those bones with a hammer or something.", + "It's a good idea to butcher corpses if you have the time. I've seen these weird zombies bring their friends back from the dead!", + "I have a buddy who was sleeping in this cabin way out in the woods, when he suddenly woke up to trees and vines growing right up through the floor and walls! He said it was some kind of huge tree beast…", + "Oh man, have you gone down into the old subway systems? I'd be careful… there's these things down there that are like zombies, but tougher.", + "There's snakes down in most of the old sewer systems. They're slow on land, but boy, those suckers can swim fast!", + "If you're planning on wandering around the sewers--not that you'd have a reason too--watch out for those fish. Those suckers are fast, and vicious too!", + "Have you seen those eyebots flying around? It's hard to say, but some faction's controlling them--maybe the military. All I know is, I don't want them taking my picture…", + "Ever go toe-to-toe with a manhack? Tiny little helicopters covered in knives. Best be packing a shotgun!", + "They're rare, but molebots are nasty things. They bore through the ground, then pop up to stab ya. Still, you're safe from them if you stay on pavement…", + "Don't fire your gun if you can help it - the noise attracts monsters. If you could get a silencer, or make one, it would give you some advantage.", + "Standing behind a window is a good tactic. It takes zombies a long time to crawl through, giving you lots of opportunities to hit them.", + "Zombies are pretty dumb… heck, most monsters are! If you can get a fire going between you and them, they'll just run straight through it.", + "I know it's tempting to just go full-auto and unload as many bullets as possible, but don't except as a last resort. It's inaccurate and wastes ammo.", + "If there's a bunch of zombies in a straight line, try unloading a burst from your gun. Be sure to aim at the zombie furthest away; you'll hit more of them that way.", + "If you shoot a zombie, but don't quite kill it, try to finish it off with a punch or something instead of wasting a bullet.", + "If you're in a corridor or something, and there's a bunch of zombies chasing you down it, try to wound the guy in front badly. He'll start moving slow and cause a serious traffic jam!", + "Here's a trick for taking care of a huge swarm of zombies chasing you: head into a liquor store, shoot out as many bottles as you can, then light the alcohol on fire. Then duck out the back door, and watch the zombies run into a burning building!", + "Sledge hammers may seem like a great weapon, but swinging them is really slow, and you won't do much damage unless you're really strong.", + "For a good melee weapon, you can't beat a machete. I've seen a guy take down a zombie brute with one! Of course, if you can find a katana, that might be even better…", + "A knife spear makes a good weapon in a pinch, but a spike strapped to a stick isn't the sturdiest construction. At least you can strap the spike back on when it comes off.", + "You know, a glass bottle can make a good weapon in a pinch. If you break it over someone's head, the shattering glass will hurt them extra. Of course, it might hurt your hands, too…", + "You know what makes a nice weapon? Take a two by four, or a baseball bat or something, and stick a bunch of nails through the end!", + "BB guns may seem like a joke, but they've got their uses. They're good for hunting small game, or getting to know the basics of rifles.", + "Crossbows are a great weapon for long term use. Most of the time, you can retrieve the bolt after shooting it, so running out of ammo is less of a concern.", + "Consider going Robin Hood, if you have the strength to pull the string of a bow. Those larger ones need significant muscle power, but they hit hard, and are silent.", + "I hid in a dumpster once or twice. I may smell bad, but I'm not dead, as they say.", + "It's good to keep a pistol handy, in case your main gun runs out of ammo or something. They're also better than most guns at short range.", + "Shotguns are nice; you can take out lots of baddies with a single shot. Just remember that they're noisy as hell, and you might end up attracting more than you kill.", + "A good submachine gun can't be beat. Most of them use common ammo, they're good at short and long range, and you can burst-fire if you need to!", + "Hunting rifles are great at long range, but suck close up. Plus, most of them don't carry many rounds. Keep a pistol as a sidearm if you use a rifle.", + "You know, you don't have to go full auto with an assault rifle. Firing single shots is more accurate and efficient!", + "I've seen a couple guys running around with laser pistols. They seem like the perfect weapon: quiet, accurate, and deadly. But I've never found one, and I bet ammo is wicked scarce…", + "When it comes to footwear, you've got two basic choices as far as I see it; sneakers, for running extra fast, or boots for durability. Depends on your style, I guess.", + "You don't really need to wear gloves most of the time, but once in a while they'll really come in handy.", + "I wish I could still use those rollerblades. I would be so fast. But I took an arrow to the knee, and all that.", + "It's good to keep a filter mask or gas mask handy. You never know when you'll have to go into a smoke-filled room or something.", + "There's basically no reason not to wear safety glasses… nothing is worse than taking a hit to the eyes and getting blinded for a few seconds.", + "Ski goggles are a great choice if you're worried about getting stuff in your eyes. Perfect for dealing with boomers!", + "If you get a pair of night vision goggles, hold on to them! A flashlight will give you away, but with goggles you can be sneaky. Beware that some types of zombies are camouflaged against it, and require proper light to be visible.", + "I know they look dumb, but wearing a fanny pack gives you that extra bit of storage without encumbering you.", + "Backpacks let you carry lots of stuff, but they limit your movement a lot. If you have to fight a zombie at close range, don't wear one, or at least drop it on the ground before the fight.", + "Don't underestimate a good book. Not only will it keep you company on lonely nights, but you can learn a hell of a lot from some of them.", + "It's a good idea to carry around a couple of empty bottles. You can fill them up with water, gasoline, or whatever!", + "First aid 101 for you. Always bandage your wounds, they will heal faster that way. Bandages are plenty and you can make makeshift ones easily, so there is no reason not to.", + "I can bandage you if you are wounded, so give me some spare bandages, if you have any.", + "If you have extra antiseptic, use it to disinfect your wounds, even if they aren't infected. They will recover faster that way.", + "Treat your infected wounds as soon as possible. If the infection spreads only antibiotics may help you, but it will take time, and you may still die from it if it's too serious.", + "If you need a bunch of rags for making Molotov cocktails, take a pair of scissors to an old t-shirt or something.", + "Carrying a lighter is something all veterans do. It takes up almost no space, and can easily save your life.", + "If you can spare the space, you might want to carry a fire extinguisher along. Nothing is worse than being trapped in a burning building!", + "Crowbars not only make a pretty good weapon, they're also useful for opening locked doors and lifting manhole covers.", + "If you're spending the night in a dangerous area, grab a shovel and dig pits all around your camp. If it's more than one night, you might want to put broken glass or sticks inside the pits for better effect.", + "A chainsaw may seem like a great weapon, but remember that they're slow, unwieldy, and very noisy.", + "Bubblewrap is pretty harmless, but setting it up around you before going to sleep will keep you from waking up to a zombie punching you.", + "Bear traps are a nice way to cover an escape. If you place one in a doorway, the first zombie through will get stuck, and the rest won't be able to get past!", + "Smoke grenades aren't really offensive weapons, but they'll cover up your scent and hide you from view--perfect for making a quick escape.", + "Don't use Molotovs indoors. Especially in a liquor store.", + "If you're going to be playing with Molotov cocktails around a gas station, just make sure you're a long way from those pumps.", + "I once knew a guy who figured he'd survive a night in the subway by setting fires blocking off the tunnel in both directions and sleeping between them. He wound up asphyxiating on the smoke.", + "Don't light a Molotov until you're ready to throw it. Not only can they go out, but if you accidentally drop it or something, you're in trouble.", + "If you're weak or clumsy, it might be a good idea not to mess with Molotovs or grenades. Accidentally dropping them when you meant to throw them could be deadly.", + "If you're not particularly agile it might be good not to mess with Molotovs or grenades. Accidents involving these sort of items tend to be grievous.", + "If you're wandering in the wilderness, or following a road, keep an eye out for wild strawberries, blueberries and other gifts of nature.", + "Be careful eating wild mushrooms. Some are poisonous, and others can make you hallucinate.", + "Try to go around swamps, if you can. Some of them have sinkholes that can pull you right underground.", + "I heard about this group that raided a bee hive a while ago. Everyone got massacred but one, and he came home with this weird, magic honey stuff.", + "If you need to, you can swim across a river to escape; some monsters can't swim. Just make sure you drop as much stuff as possible first, and maybe strip naked, or you'll sink like a rock.", + "Houses can be a surprisingly good resource for all kinds of stuff; clothing, medication, food, books, and more. People kept all the odd things around, especially in basements.", + "While there's not much to loot, gas stations are a good source for gasoline, to power tools or to make Molotov cocktails.", + "It's not like in the movies; shooting a gas pump won't make it explode. But it WILL make it leak all over the place, which is a definite fire hazard.", + "I know grocery stores and stuff are full of fruit, but be careful, it's probably rotten.", + "Next time you visit a grocery store, load up on canned goods. They never go bad!", + "Load up on canned goods if you ever find a grocery store. Cans never go bad!", + "I've found more good weapons in hardware stores than anywhere else. Except gun stores, of course.", + "Liquor stores are a great place to pick up non-alcoholic beverages, too. Not that I mind alcohol!", + "Most gun stores follow pretty similar layouts. The restricted stuff - SMGs, assault rifles, and most importantly ammo - are always behind the counter.", + "I've spent many nights in the changing rooms at the back of clothing stores. Walls on four sides, far from the store's entrance, a corridor for easy defense… it's perfect!", + "Have you seen those weird science labs out in the middle of nowhere? I think you need some kind of special ID card to get in.", + "I have a dream of raiding a military bunker, but zombies and armor are a scary mix. And the sheer thought of being sprayed with bullets by a turret is giving me the shivers.", + "I've thought about raiding an ant hill before, but I realized it wasn't worth the risk. I doubt they have any loot beyond some scraps of food, you know?", + "This guy I know was walking through the subway when he came across a giant rift in the earth, with lava far below. Weird, huh?", + "In a lot of places, there's little hallways connecting the subways with the sewers, with heavy metal doors on both ends. It's a perfect place to sleep!", + "Be careful of drinking water from rivers and stuff, it's a good way to get sick. But if you have a water purifier, it'll make it safe.", + "Autodocs are probably your best bet to install bionics - if you can find one! However, I heard they won't work if you don't bring anesthetics to put you in a sleep.", + "Be wary of anything deeper than your average basement. Some folks heard scary screams from the ventilation shafts of mines and labs. Very unsettling screams.", + "A screwdriver a day keeps the scurvy away!", + "Hungrier than usual? Natural oils can help. Not tasty at all, but who cares when eating your leg is the second option?", + "Terrain can turn the tide of a battle. Make sure you use it against your enemies, lest it be used against you.", + "Folks that passed by the mine said something about foul smell. If you plan a visit there consider taking a gas mask with you.", + "Knowledge is power. Seriously, just pick up a book.", + "Knowledge is power. And books are power you can read.", + "Knowledge is power. But not every book you find contains true knowledge.", + "Some days are full of sadness. Reading can help, if you have the right book.", + "Nothing can kill you if everything is already dead. Well, except cold, hunger, and… never mind.", + "I met a girl that insisted that she saw a land shark boring through rock, walls, and dirt alike. I'd consider it a fable, but I've seen things, and can't just say it's a lie.", + "Boil first, then drink. Ten men caravan once drank from a spring, and they are now known as a three man caravan.", + "I've once seen a full duffel bag pass hands five times in a week. Having a lot of stuff is a moot point if you can't run from zombies.", + "Tim says you can drive a car through a horde of zombies. Tim is now a zombie. Any questions?", + "They said: go solar, save the environment and yourself. Well… there is no environment to save now, but one can still save thyself I guess.", + "If you can't find a knife try smashing potted plants. It just might give you everything you need to make one.", + "What's the difference between a good and a bad choke point? The good one has another back door behind you.", + "So, methinks: if you could convince the cop-bots that you are their superior…", + "You'd be surprised how many items can be disassembled into their components. A guy around here, McSomething whatever his name is, is a master at this.", + "A soldering iron can be an aspiring mechanic's best friend. You can also cauterize a wound with it, but as many people died as lived from that treatment, so I guess it's a last resort.", + "I've seen some folks running with freshly installed CBMs. That means there is a way to get them from places other than ransacked shops. Maybe that explains those cut-up bodies I've seen around.", + "I'm fed up with smoked meat, but it lasts so long. Well… if I had more heart for learning cooking I guess I'd be able to diversify my food without sacrificing its shelf life.", + "Tricky Joe was hanged for his inventive ways of killing zombies. Yeah, burning down a building to smoke few hordes is ok, but burning a whole town with all the loot certainly is not.", + "Mr Tombstone always said: take nothing with you for the raids, save the space for loot. He was known as Joe then and he rightfully earned his nickname as the first tombstone 'owner' around this place.", + "When the whole town is one big supermarket a shopping cart becomes your best friend.", + "A friend is a second mouth to fill, but when it comes to work four hands are always better than two.", + "I was against drugs until I was almost killed by a zombie. I was hauling my sorry ass away from the horde, with nothing more but some white powder I got from that zombie. Saved me that time.", + "Not sure if Mike is sane any more. He was unfortunate enough to be driven in to a school one time. This experience broke more than his ribs then.", + "A thought about explosives. If you can still run and it did not went boom yet, run some more. There is no such thing as excess space between you and a stick of dynamite.", + "Avoid using launchers in narrow hallways, you might miss.", + "Met a mad chemist once. She made a battery from a potato… or was it lemon?", + "Met a mad chemist once. She made a battery from a potato, and then nobody was willing to eat the potato.", + "Police brutality lives on it seems. It's just more mechanical now, with all the cops dead and cop robots roaming free on the loose. If you'll get arrested who will give you justice? A zombie judge? Will they put you in a zombie prison? No thanks, I'll pass.", + "Is it dead yet? How can you tell if it was dead before and it's dead now? I prefer asking: are? *smash* you? *smash* dead? *smash* yet? *smash smash smash*", + "I hear there's strange big berries around, but why don't I hear first hand if they are filling for their size or not?", + "I've heard of a gang called The Doctors. You know, bank robbers wearing stethoscopes. What are they trying to achieve? I use paper money to start fires now.", + "You can hole up on a roof if you need to. Yeah, the rain will fall on your head, but it's harder for the dead to get you there. Get a tent, a rollmat, a sleeping bag and you're set.", + "I thought about putting a bag on my dog to carry some of my stuff. It didn't work, because it was a chihuahua, and it was eaten by a rottweiler. Should have put some Kevlar on it like those Z9. Oh well…", + "Stuff from zombies is filthy but perfectly fine otherwise. Using soap or other detergents won't hurt you. Quick wash and you're equipped for days.", + "Civilization has made a step back in time, so let's learn from the past. No fridges? Build a root cellar or keep food cool in the basement. No guns? Make a pointy stick or a cudgel, and work from there. The end of the world is not the end, it seems.", + "Hey, if you happen to find a set of two two-way radios, give one to me and we will be able to talk while being away from each other.", + "If I had the skill to do it, I'd build a boat and sail down the river. Maybe even towards the ocean. Or make an amphibious vehicle that could drive on land too. That would be useful.", + "I sink like a rock in water, but I once used a scuba tank to cross a river that had no bridge nearby.", + "Can you imagine? I've heard of people digging graves for loot. Whole cities lay dead for the taking and they dig graves! Madness!", + "When I broke a leg few years ago they had this great machine at the hospital that set the bones in place. I'd hate to break a limb in this apocalypse, but it's something to remember. You never know.", + "You, me, and another pair of hands and we might even think of settling down. Making a base of our own. A bastion of hope in the apocalypse. Think of it.", + "Hey if you are leading, just tell me what to do. You want me to shoot, go melee, use grenades? I can adjust to your style of fighting.", + "Everything seems to mutate nowadays. Even survivors. I wonder if I would look good with bunny ears? Would I hear better?", + "Everything seems to mutate nowadays. Even survivors. Do you think I'd still look good if I had piranha teeth?", + "Everything seems to mutate nowadays. Even survivors. You think I'd look good with thorns growing from my face?", + "Everything seems to mutate nowadays. Even survivors. If my eyeballs began shooting lasers do you think I would still be able see?", + "Everything seems to mutate nowadays. Even survivors. I wonder how I would look with antlers? Hats would be out of the question…", + "Winter is a harsh lady. You need fire to survive, to heat yourself and your water and food. Keep a cooking device to melt what is frozen, and a thermos for the liquids.", + "There is not much gas left for the vehicles. If I'd plan for the long run, I'd consider learning about steam engines, or maybe making biodiesel.", + "Heard a rumor that few cities were evacuated to a place that's not on the maps. Tough luck finding them now. But perhaps they don't want to be found. Or worse - perhaps you don't know that you don't want to find them either, if you catch my drift.", + "Heard a rumor about a lady on rollerblades with a fire extinguisher strapped to her back. Zipping around, hardly wearing no clothes, smashing cannibals in the face with a baseball bat. Don't that beat all?", + "Ok, some weird shit now. Before we met I saw a knight. No, I'm fine under the hood. A guy in a full medieval armor was cornered by some zombies. Much to be said, but half an hour later, he was still alive. Guess you can take a punch being a walking tin can.", + "If you're into electronics, you may try to make a noise emitter from a talking doll, or something that has a speaker. Why? To distract the zombies, of course.", + "A friend of mine was a hunter and showed me once how to butcher properly. You need a flat clean surface to place the products, a rack to hang the carcass in the air, and a good knife. If you're in a forest you may use a tree and a rope. Big game might require a saw too.", + "A friend of mine was a hunter and told me, that if you field dress a corpse, it will stay fresh a bit longer.", + "Look at the sky before you go for adventure. You will know what weather to expect. It's nothing compared to the old meteorology and satellite pictures, but at least you may know if you need the umbrella.", + "Be extra careful on roads. They are easy to travel on, but occasional minefield or a road block can make you feel sorry in an instant. I've even seen a tank once. I ran away like never before.", + "I know it's not best of times, but try to sleep well. You're not yourself if you're sleep deprived. Grab a pillow and a blanket. If you can't, even a teddy bear under your head and a pile of clothes to keep you warm can make a difference. And pick a spot well, even a chair or a bench is better than a cold ground.", + "There's no rule against wearing more than one set of pants. Well, I mean, there probably is, but nothing stopping you from breaking it!", + "There are two ways of throwing grenades. The smart one is throwing from behind a corner. The less smart one involves getting shot while throwing in the open and being torn apart by the resulting explosion." + ] + } +] diff --git a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json index 5eb1f6b9f4c65..b884653ed51b2 100644 --- a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json @@ -151,7 +151,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_CARLOS_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "I heard about Barry, can you tell me what captured him?", diff --git a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json index 3a1722506f42c..14b09df676204 100644 --- a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json @@ -144,7 +144,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_CHRIS_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "Your dad asked me to come find you, said you've been looking for your uncle.", diff --git a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json index bdd946365427f..945369f171555 100644 --- a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json @@ -181,7 +181,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_EDDIE_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "Your son helps with the dairy?", "topic": "TALK_EDDIE_LUKE" }, { "text": "So, Jesse runs the horse farm?", "topic": "TALK_EDDIE_JESSE" }, diff --git a/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json index 8814f688f6f88..8f98a076cf814 100644 --- a/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json @@ -258,7 +258,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_JACK_TOPICS", - "dynamic_line": "Go on ...", + "dynamic_line": "Go on…", "responses": [ { "text": "I'm here to deliver some resources.", @@ -312,7 +312,7 @@ "difficulty": 3, "value": 20000, "item": "jar_3l_glass", - "count": 20, + "count": 10, "origins": [ "ORIGIN_SECONDARY" ], "has_generic_rewards": false, "followup": "MISSION_ISHERWOOD_JACK_2", @@ -322,7 +322,7 @@ }, "dialogue": { "describe": "I could use some help scavenging.", - "offer": "We could use some 3 liter jars to preserve our produce. Can you bring me 20 large three liter jars? I'll give you some preserves in exchange.", + "offer": "We could use some 3 liter jars to preserve our produce. Can you bring me 10 large three liter jars? I'll give you some preserves in exchange.", "accepted": "Thank you. It's important to preserve foods while we can.", "rejected": "Oh well. I'll see if I can find another way, thanks.", "advice": "Grocery stores, house kitchens, there's plenty of places to look.", diff --git a/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json index 20fa52bb87b22..a09209e1eb02e 100644 --- a/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json @@ -170,7 +170,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_JESSE_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "Looks like you are doing well here.", "topic": "TALK_ISHERWOOD_JESSE_TALK1" }, { "text": "Do you have any animal care tips?", "topic": "TALK_ISHERWOOD_JESSE_TIPS" }, diff --git a/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json index bc9966c1d2a9d..bf0cc45c3d7d0 100644 --- a/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json @@ -123,7 +123,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_LISA_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "Hi, I'm looking for Jesse.", "topic": "TALK_LISA_JESSE" }, { "text": "Hi, I'm looking for Chris.", "topic": "TALK_LISA_CHRIS" }, diff --git a/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json index bd77065d5a349..6e7206e5d2658 100644 --- a/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json @@ -142,7 +142,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_LUKE_TOPICS", - "dynamic_line": "Go on...", + "dynamic_line": "Go on…", "responses": [ { "text": "Must be tough having the world fall apart when you had you future to look forward to.", diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index ce2dfede61614..674dfc10f1654 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -364,7 +364,8 @@ [ "backpack", 5 ], [ "bacon", 2 ], [ "banana", 1 ], - [ "bandages", 25 ], + [ "bandages", 20 ], + [ "adhesive_bandages", 20 ], [ "barrel_ported", 1 ], [ "baseball", 1 ], [ "bat", 5 ], diff --git a/data/json/npcs/missiondef.json b/data/json/npcs/missiondef.json index 882496f30c7ac..9ae846640a61e 100644 --- a/data/json/npcs/missiondef.json +++ b/data/json/npcs/missiondef.json @@ -731,10 +731,10 @@ "dialogue": { "describe": "It's hard to tell who actually has the skills to survive these days…", "offer": "It's hard surviving out here on our own, and we'd probably have a better chance working together. Problem is, I don't really know you and what you're capable of. You might have what it takes, or you might not. Either way, I'm going to need some proof. Come back in a few days and I'll gladly follow you. It's basically a win-win for me: either you come back and I'll know you've got what it takes, or you don't and I'll know that I was right not to follow you.", - "accepted": "I'll see you then…or I won't, and then I'll know I made the right decision.", + "accepted": "I'll see you then… or I won't, and then I'll know I made the right decision.", "rejected": "Ya, it was a long shot I admit.", "advice": "Don't die. If you're asking me for advice, that doesn't bode well for you.", - "inquire": "Well, you're not dead…yet.", + "inquire": "Well, you're not dead… yet.", "success": "I'll be honest, I wasn't really expecting to see you again. A promise is a promise, I'll follow you now!", "success_lie": "I know time is relative and all that.", "failure": "I'm not quite sure how you failed to survive AND are talking to me." diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json b/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json index 141ff4165be2a..837720dc4240b 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_5_Yusuke_Taylor.json @@ -100,7 +100,7 @@ { "type": "talk_topic", "id": "TALK_REFUGEE_BEGGAR_5_FUR", - "dynamic_line": "Gross, isn't it? Feels like pubes. I just started growing it everywhere a little while after the Cataclysm. No idea what caused it. I can't blame them for hating it, I hate it.", + "dynamic_line": "Gross, isn't it? Feels like pubes. I just started growing it everywhere a little while after the Cataclysm. No idea what caused it. I can't blame them for hating it, I hate it.", "responses": [ { "text": "Why live out here?", "topic": "TALK_REFUGEE_BEGGAR_5_TALK2" }, { diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json index 3557e2c7f2738..374bca1837018 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Draco_Dune.json @@ -150,7 +150,7 @@ { "type": "talk_topic", "id": "TALK_REFUGEE_Draco_3", - "dynamic_line": "Oh you don't have time for all that, do you? Well, I'll give you the short version. I've gotten kinda tired of it in the telling. Frankly, it's not as heroic, not as inspiring, not as tragic, and certainly not as funny as some of the tales around here. But it's mine, ya know? I'm a musician. Guitar's my baby. You like folk and the blues, friend? Well, that was my bag and I sure could please my own ear with em, anyway. Folks who's bein' generous might also say it pleased theirs. Problem is, I seem to be between guitars right now, you know? Temporarily guitar-light, if you get my saying. Problem is, in the run for my life, I had to use old Jasmine as a bit of a billy club. Had to curb some rowdy dudes on my way here. It was her or me, you understand? You wouldn't begrudge a man breakin' his instrument to save his life, would ya?", + "dynamic_line": "Oh you don't have time for all that, do you? Well, I'll give you the short version. I've gotten kinda tired of it in the telling. Frankly, it's not as heroic, not as inspiring, not as tragic, and certainly not as funny as some of the tales around here. But it's mine, ya know? I'm a musician. Guitar's my baby. You like folk and the blues, friend? Well, that was my bag and I sure could please my own ear with em, anyway. Folks who's bein' generous might also say it pleased theirs. Problem is, I seem to be between guitars right now, you know? Temporarily guitar-light, if you get my saying. Problem is, in the run for my life, I had to use old Jasmine as a bit of a billy club. Had to curb some rowdy dudes on my way here. It was her or me, you understand? You wouldn't begrudge a man breakin' his instrument to save his life, would ya?", "responses": [ { "text": "I think I would've done the same. Nobody around here has a guitar?", "topic": "TALK_REFUGEE_Draco_4" }, { "text": "Yes, yes I would… you monster.", "topic": "TALK_DONE" } diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json index dcca034326a96..54c8e6059c60e 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Pablo_Nunez.json @@ -144,7 +144,7 @@ { "type": "talk_topic", "id": "TALK_REFUGEE_Pablo_Background2", - "dynamic_line": "Dana and I were evacuated early, because of her pregnancy. They took us to a concentration center, and then we got on a bus to come here. The bus though, it was rolled over by a giant monster, and many died. We made it out along with a few others, and we kept going until we made it here. It wasn't much farther, and for some reason the monster didn't chase us, just kept tearing at the bus.", + "dynamic_line": "Dana and I were evacuated early, because of her pregnancy. They took us to a concentration center, and then we got on a bus to come here. The bus though, it was rolled over by a giant monster, and many died. We made it out along with a few others, and we kept going until we made it here. It wasn't much farther, and for some reason the monster didn't chase us, just kept tearing at the bus.", "responses": [ { "text": "What about the pregnancy?", "topic": "TALK_REFUGEE_Pablo_Background2_pregnancy" }, { "text": "What happened to the other crash survivors?", "topic": "TALK_REFUGEE_Pablo_Background2_survivors" }, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json index f9d92d96dea22..e211e7e563265 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Rhyzaea_Johnny.json @@ -113,7 +113,7 @@ { "type": "talk_topic", "id": "TALK_REFUGEE_Rhyzaea_Background", - "dynamic_line": "It's a long, long story. I'm not from around here, I'm actually from way out in Western Canada. I'd always wanted to see New England, and I was down here on vacation when, well, you know. I got evacuated, but because I'm not a US citizen they weren't willing to take me downstairs. I can understand that, even if I don't like it much. To tell you the truth I'm still coming to terms with the fact that I'll probably never know how my family and my band are doing.", + "dynamic_line": "It's a long, long story. I'm not from around here, I'm actually from way out in Western Canada. I'd always wanted to see New England, and I was down here on vacation when, well, you know. I got evacuated, but because I'm not a US citizen they weren't willing to take me downstairs. I can understand that, even if I don't like it much. To tell you the truth I'm still coming to terms with the fact that I'll probably never know how my family and my band are doing.", "responses": [ { "text": "Tell me about yourself.", "topic": "TALK_REFUGEE_Rhyzaea_Background2" }, { "text": "Tell me about your family.", "topic": "TALK_REFUGEE_Rhyzaea_Family" }, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json index 55349288b0141..454e105f1cd9c 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Stan_Borichenko.json @@ -76,7 +76,7 @@ "type": "general", "context": "meeting", "value": "yes", - "yes": [ "Hi.", "Hello.", "Hm? Oh, hi.", "...Hi." ], + "yes": [ "Hi.", "Hello.", "Hm? Oh, hi.", "…Hi." ], "no": "Hello. I'm sorry, if we've met before, I don't really remember. I'm… I'm Stan." }, "responses": [ diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json index d27d188c43c2b..f579c93e2cfde 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json @@ -163,7 +163,7 @@ "context": "recruit", "value": "yes", "yes": "I do. I don't know what you did to convince them to move out, but our supply chain and I both thank you. I hope it wasn't too unseemly.", - "no": "Even once we got things sorted out, there weren't enough beds for everyone, and definitely not enough supplies. These are harsh times. We're doing what we can for those folks… at least they've got shelter." + "no": "Even once we got things sorted out, there weren't enough beds for everyone, and definitely not enough supplies. These are harsh times. We're doing what we can for those folks… at least they've got shelter." } }, { @@ -175,7 +175,7 @@ { "type": "talk_topic", "id": "TALK_FREE_MERCHANT_STOCKS_SEALED1wrong", - "dynamic_line": "We didn't have great organization when we first arrived. A few of the earliest arrivals set up a triage and sorting system, with the sick and infirm getting set aside to wait. It's cruel, but we could see there was only space for so many, and we didn't know what was causing people to turn into zombies at the time, so we were trying to quarantine out infection. A couple folks died in there, and it escalated. One of the first people here, Jacob, had taken charge of the whole thing. When the triage area had to be evacuated he stayed behind to make sure everyone who could get out got out. It was a hell of a loss.", + "dynamic_line": "We didn't have great organization when we first arrived. A few of the earliest arrivals set up a triage and sorting system, with the sick and infirm getting set aside to wait. It's cruel, but we could see there was only space for so many, and we didn't know what was causing people to turn into zombies at the time, so we were trying to quarantine out infection. A couple folks died in there, and it escalated. One of the first people here, Jacob, had taken charge of the whole thing. When the triage area had to be evacuated he stayed behind to make sure everyone who could get out got out. It was a hell of a loss.", "speaker_effect": [ { "effect": { "u_add_var": "told_about_FM_evacuation", "type": "general", "context": "conversation", "value": "yes" } } ], diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_guard_generic.json b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_guard_generic.json index 7c5306be2a3f2..3a5a09be2e9d5 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_guard_generic.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_guard_generic.json @@ -14,7 +14,7 @@ "id": "TALK_GUARD", "type": "talk_topic", "dynamic_line": [ - "I'm not in charge here, you're looking for someone else...", + "I'm not in charge here, you're looking for someone else…", "Keep civil or I'll bring the pain.", "Just on watch, move along.", { diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json index 0d4c57d67424f..c549babbe622e 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json @@ -257,7 +257,7 @@ { "id": "TALK_EVAC_MERCHANT", "type": "talk_topic", - "dynamic_line": { "u_is_wearing": "badge_marshal", "yes": "Welcome marshal...", "no": "Welcome..." } + "dynamic_line": { "u_is_wearing": "badge_marshal", "yes": "Welcome marshal…", "no": "Welcome…" } }, { "id": "TALK_EVAC_MERCHANT_NEW", diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_old_guard_doctor.json b/data/json/npcs/refugee_center/surface_staff/NPC_old_guard_doctor.json index 1bad332985496..dd4421cb5b79e 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_old_guard_doctor.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_old_guard_doctor.json @@ -15,7 +15,7 @@ { "id": "TALK_SCIENCE_REP", "type": "talk_topic", - "dynamic_line": { "u_has_any_trait": [ "PROF_FED" ], "yes": "Marshal...", "no": "Citizen..." }, + "dynamic_line": { "u_has_any_trait": [ "PROF_FED" ], "yes": "Marshal…", "no": "Citizen…" }, "responses": [ { "text": "Who are you?", "topic": "TALK_SCIENCE_REP_NEW" }, { "text": "Heard anything about the outside world?", "topic": "TALK_SCIENCE_REP_WORLD" }, diff --git a/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json b/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json index 347d8d2c097f6..d874374cf56a1 100644 --- a/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json +++ b/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json @@ -24,7 +24,7 @@ { "id": "TALK_OLD_GUARD_REP", "type": "talk_topic", - "dynamic_line": { "u_has_any_trait": [ "PROF_FED" ], "yes": "Marshal...", "no": "Citizen..." }, + "dynamic_line": { "u_has_any_trait": [ "PROF_FED" ], "yes": "Marshal…", "no": "Citizen…" }, "responses": [ { "text": "Who are you?", "topic": "TALK_OLD_GUARD_REP_NEW" }, { "text": "Heard anything about the outside world?", "topic": "TALK_OLD_GUARD_REP_WORLD" }, diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json index 3ec807bd27bb0..c1c680f3700e5 100644 --- a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json +++ b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json @@ -336,7 +336,7 @@ { "id": "TALK_ROBOFAC_INTERCOM_BUY_PROTECTIVE_GEAR", "type": "talk_topic", - "dynamic_line": "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n\nthe intercom: Hmm wait, we might not have your size...", + "dynamic_line": "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n\nthe intercom: Hmm wait, we might not have your size…", "responses": [ { "text": "[ 2 HGC ] Deal!", diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json b/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json index 4d5df70e8b950..c9ebebb28b448 100644 --- a/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json +++ b/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json @@ -205,9 +205,9 @@ "id": "TALK_ROBOFAC_MERC_1_RANDOM_THOUGHTS", "type": "talk_topic", "dynamic_line": [ - "Thinking I should go hunt something soon...", - "Wondering if things will get better someday...", - "Hmm? Nothing, I guess I just like resting in this place.", + "Thinking I should go hunt something soon…", + "Wondering if things will get better someday…", + "Hmm? Nothing, I guess I just like resting in this place.", "Have you ever noticed how… wait no, never mind.", "I heard some strange dimensional resonance caused all this, do you think it has happened to other places?", "You noticed this place has working WI-FI? Well not the rest of the net works anyways." diff --git a/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json b/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json index c6a1d7bd1c294..ca60953a66160 100644 --- a/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json +++ b/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json @@ -91,11 +91,11 @@ "dynamic_line": { "u_is_wearing": "badge_marshal", "yes": [ - "Still plenty of outlaws in the roads, perhaps you should tend to your job, marshal...", + "Still plenty of outlaws in the roads, perhaps you should tend to your job, marshal…", "You see anything you want, marshal?", "Oh, a U.S. marshal, how quaint." ], - "no": [ "Welcome...", "Here to trade, I hope?", "Safe travels, scavenger." ] + "no": [ "Welcome…", "Here to trade, I hope?", "Safe travels, scavenger." ] }, "responses": [ { "text": "Let's trade.", "effect": "start_trade", "topic": "TALK_ROBOFAC_FREE_MERCHANT" }, diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_barber.json b/data/json/npcs/tacoma_ranch/NPC_ranch_barber.json index 44d2152c5ec8c..823ffa9106c48 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_barber.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_barber.json @@ -47,7 +47,7 @@ { "type": "talk_topic", "id": "TALK_RANCH_BARBER_CUT", - "dynamic_line": "Stand still while I get my clippers...", + "dynamic_line": "Stand still while I get my clippers…", "responses": [ { "text": "Thanks…", "topic": "TALK_DONE" } ] } ] diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json b/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json index 20a73f82d8e59..bf995c956e7ed 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json @@ -122,7 +122,7 @@ "place_nested": [ { "chunks": [ "tacoma_commune_west_wall_door" ], "x": 22, "y": 0 } ] }, { - "om_terrain": "ranch_camp_66", + "om_terrain": "ranch_camp_75", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_east_wall_door" ], "x": 0, "y": 0 }, diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_guard.json b/data/json/npcs/tacoma_ranch/NPC_ranch_guard.json index d1af5c89f34c0..7e07ad2c3c409 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_guard.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_guard.json @@ -14,7 +14,7 @@ "id": "TALK_RANCH_GUARD", "type": "talk_topic", "dynamic_line": [ - "I'm not in charge here, you're looking for someone else...", + "I'm not in charge here, you're looking for someone else…", "Keep civil or I'll bring the pain.", "Just on watch, move along.", { diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json b/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json index b20c25c6d1cf6..22683ad1b3de2 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json @@ -36,9 +36,11 @@ "repeat_responses": { "for_item": [ "1st_aid", + "ifak", "antibiotics", "aspirin", "bandages", + "adhesive_bandages", "bfipowder", "chem_hydrogen_peroxide", "codeine", diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_scavenger.json b/data/json/npcs/tacoma_ranch/NPC_ranch_scavenger.json index d55784f1dbd87..d3ea627c516e5 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_scavenger.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_scavenger.json @@ -49,7 +49,7 @@ "goal": "MGOAL_FIND_ITEM", "difficulty": 5, "value": 50000, - "item": "spear_knife", + "item": "spear_knife_superior", "count": 12, "origins": [ "ORIGIN_SECONDARY" ], "followup": "MISSION_RANCH_SCAVENGER_2", diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_sickly_laborer.json b/data/json/npcs/tacoma_ranch/NPC_ranch_sickly_laborer.json index fd43d2fa40cee..ec1e2cabc6805 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_sickly_laborer.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_sickly_laborer.json @@ -13,7 +13,7 @@ { "type": "talk_topic", "id": "TALK_RANCH_ILL_1", - "dynamic_line": "Please leave me alone...", + "dynamic_line": "Please leave me alone…", "responses": [ { "text": "What is your job here?", "topic": "TALK_RANCH_ILL_1_JOB" }, { "text": "Do you need any help?", "topic": "TALK_RANCH_ILL_1_HIRE" }, @@ -30,13 +30,13 @@ { "type": "talk_topic", "id": "TALK_RANCH_ILL_1_HIRE", - "dynamic_line": "I don't know what you could do. I've tried everything. Just give me time...", + "dynamic_line": "I don't know what you could do. I've tried everything. Just give me time…", "responses": [ { "text": "OK.", "topic": "TALK_RANCH_ILL_1" } ] }, { "type": "talk_topic", "id": "TALK_RANCH_ILL_1_SICK", - "dynamic_line": "I keep getting sick! At first I thought it was something I ate but now it seems like I can't keep anything down...", + "dynamic_line": "I keep getting sick! At first I thought it was something I ate but now it seems like I can't keep anything down…", "responses": [ { "text": "Uhm.", "topic": "TALK_RANCH_ILL_1" } ] } ] diff --git a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json index ebe45aa9e9f71..abc144cef0d05 100644 --- a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json +++ b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json @@ -815,15 +815,8 @@ "W.......rW ", "WWW....WWW " ], - "terrain": { - "r": "t_dirtfloor", - "W": "t_wall_log", - ".": "t_dirtfloor", - "c": "t_conveyor", - "m": "t_machinery_old", - "M": "t_machinery_heavy" - }, - "furniture": { "r": "f_rack" }, + "terrain": { "r": "t_dirtfloor", "W": "t_wall_log", ".": "t_dirtfloor", "m": "t_dirtfloor", "M": "t_dirtfloor", "c": "t_conveyor" }, + "furniture": { "m": "f_machinery_old", "M": "f_machinery_heavy", "r": "f_rack" }, "place_item": [ { "item": "log", "x": 3, "y": 0 }, { "item": "log", "x": 3, "y": 1 }, diff --git a/data/json/npcs/talk_tags.json b/data/json/npcs/talk_tags.json index c0c5dea450a1d..64a791efe598e 100644 --- a/data/json/npcs/talk_tags.json +++ b/data/json/npcs/talk_tags.json @@ -148,40 +148,6 @@ "I'd kill for a sip of water right now." ] }, - { - "type": "snippet", - "category": "", - "//": "Used when chit-chatting while the avatar has a beer", - "text": [ - "Yeah sure, can't help but notice you got beer with you! Let's crack a cold one and chat, , how goes it?", - "Oh definitely, how about one of those beers I see on you? What's up anyway?", - "Yeah you share those beers I see you hoarding and then we chat all you like! Only joking, what's up ?", - "Hey , I bet a chat would be all the sweeter with a nice, cold beer in hand. How's it going?", - "While we chat, what say you we open a beer and just… pretend the world isn't ending, just for a while?", - "Pass me one and let's talk about the good ol' days, ." - ] - }, - { - "type": "snippet", - "category": "", - "//": "General chit chat messages", - "text": [ - "Hey, sure thing, , I need a break anyway, how are you?", - "Yeah OK, , how's it going?", - "Sure, let's shoot the shit! You OK?", - "Why not? How you doing?", - "I'm OK with that, what's up?", - "I can spare a few minutes, how's things?", - "Sure thing , you good?", - "Alright, you got something to get off your chest?", - "Always ready for a good chat! But why, you OK?", - "OK , we should get to know each other, how are you coping?", - "Definitely, I'm game. How you holding up?", - "Good idea . Let's forget the world for a while. How you doin'?", - "Ah, what the heck. How's life been treating you?", - "Sure. So, how about that weather ey?" - ] - }, { "type": "snippet", "category": "", @@ -1181,6 +1147,16 @@ "Was it rough surviving thus far?" ] }, + { + "type": "snippet", + "category": "", + "//": "avatar response to an NPC that opens up their theories about what the cataclysm was.", + "text": [ + "How do you think we ended up here? What even happened?", + "What's going on? Like, big picture, what the hell happened?", + "Have you heard anything about how the apocalypse came about?" + ] + }, { "type": "snippet", "category": "", diff --git a/data/json/npcs/talk_tags_chat.json b/data/json/npcs/talk_tags_chat.json new file mode 100644 index 0000000000000..55a9b672fd038 --- /dev/null +++ b/data/json/npcs/talk_tags_chat.json @@ -0,0 +1,118 @@ +[ + { + "type": "snippet", + "category": "", + "//": "Used when chit-chatting while the avatar has a beer; goes before a general chitchat message", + "text": [ + "Yeah sure, want to crack open one of them beers?", + "Oh definitely, how about one of those beers you got?", + "Yeah you share those beers I see you hoarding and then we chat all you like! Only joking, heh.", + "Hey , I bet a chat would be all the sweeter with a nice, cold beer in hand.", + "While we chat, what say you we open a beer and just… pretend the world isn't ending.", + "Pass me one and let's talk, ." + ] + }, + { + "type": "snippet", + "category": "", + "//": "A sentence regarding the season to go before a more general chitchat message.", + "text": [ + "Yeah, this summer heat is hitting me hard, you know?", + "Enjoying the summer.", + "Kinda wishing it would cool off a bit, to be honest." + ] + }, + { + "type": "snippet", + "category": "", + "//": "A sentence regarding the season to go before a more general chitchat message.", + "text": [ + "OK, maybe it'll stop me from freezing in this weather.", + "Gotta say, I'm not minding the snow.", + "It's weird the zombies don't freeze." + ] + }, + { + "type": "snippet", + "category": "", + "//": "A sentence about being sick to go before a more general chitchat message.", + "text": [ "Well, I'm feeling pretty sick… but sure." ] + }, + { + "type": "snippet", + "category": "", + "//": "General chit chat messages", + "text": [ + "", + "I need a break anyway, how are you?", + "So, how's it going?", + "Let's shoot the shit! You OK, ?", + "I'm OK with that, what's up?", + "I guess I can spare a few minutes, how's things?", + "Sure thing , you good?", + "Alright, you got something to get off your chest?", + "Always ready for a good chat! But why, you OK?", + "OK , how are you coping?", + "I'm game. How you holding up?", + "Let's forget the world for a while. How you doin'?", + "What the heck. How's life been treating you?", + "So, how about that weather, eh?", + "Nice of you to make time. How's it been for you lately?", + "My dogs’ve been barkin’ lately, you know?", + "I feel great today. Not sure what it is, just one of those days." + ] + }, + { + "type": "snippet", + "category": "", + "//": "General chit chat messages for NPCs having big thoughts. Tends to be more about establishing game lore.", + "text": [ + "I just can't believe it's over. I keep running my head back to the days it all fell apart. The riots. The lies. The psychos. It never really felt like it was going to go like this.", + "You ever think there's any truth to the crap they were spouting before the world ended? Mind control drugs in the water, bio-terrorism? Some of it would make sense, but it seems so far-fetched. Then again, we're dealing with actual zombies.", + "I wonder if I should be getting more religious now, or less. You know what I'm sayin', ?", + "I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna go for my weapon and accidentally pull out a granola bar, right?", + "You ever wonder why we even bother? We’re all just gonna be zombies eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the damn point?", + "I wish I could go bust a cap in one of those zombies right now, without all the fuss about being scared for my life.", + "Every time I close my eyes, I can still see the riots. Do you get that, or is it just me?", + "You ever feel like the whole time before the apocalypse was just a dream you’re waking up from?", + "When do you think you realized the world was ending? For me, it was that damned YouTube video with the lady killing the baby. Holy shit, you know?", + "I wonder if the government's still out there, holed up in some bunker.", + "Remember some of the crazy news from the end of the world? The stuff that got drowned out by the riot coverage I mean. Like, didn't the governor of Rhode Island secede from the Union or something?", + "I keep having dreams that zombies still remember who they were as people, and are just trapped inside the bodies watching everything happen. Haven't been sleeping well.", + "Those mind-control drugs they put in the water to make people riot… you think they're still in there?" + ] + }, + { + "type": "snippet", + "category": "", + "//": "General chit chat messages for intelligent or perceptive NPCs", + "text": [ + "I can't stop wondering who fucked up to make all this happen. Obviously we can't trust the news, they claimed the zombies were \"rioters\" for weeks. Why? Where did this come from?", + "If what they told us about the Chinese was even partly true, do you think it's like this in China? Or maybe the US is some kind of quarantine zone, and at least some of the world is still out there.", + "Have you noticed injuries aren’t healing the same as usual? I started spotting it before the world ended, but it’s become more pronounced. There’s hardly even a granulation step after a cut closes.", + "I still don’t understand how these zombies are powered. They’re like perpetual motion machines.", + "So many parts of this still don't fit together. Who created the zombies? What powers them? Maybe the rumours of mind control drugs were true all along, and someone found a way to bioengineer living dead." + ] + }, + { + "type": "snippet", + "category": "", + "//": "General chit chat messages for further past the apocalypse", + "text": [ + "", + "", + "How do these zombies even keep going? What are they eating? Do you think they'll ever rot away?", + "I been thinkin', one of these days, we're gonna run out of toilet paper. What then?", + "Do you think it’s weird how we’ll, like, open a locked building and find a lone zombie inside? How’d it even get there?", + "Sometimes I wonder if we're all psychos, not just the ones that went crazy and rioted. I never would have thought I could do the things I've done since the world ended.", + "You read any good books lately? I'm glad we still got books.", + "You know what I miss? Movie theaters. You think Hollywood survived this? Maybe there's a bunch of zombie actors out there, filmin' shit out of reflex. Hah, I'd watch that shit." + ] + }, + { + "type": "snippet", + "category": "", + "//": "General chit chat responses from the player", + "text": [ "I hear you, …", "That reminds me of something…", "Right, right. Say, you ever thought about…" ] + } +] diff --git a/data/json/obsolete.json b/data/json/obsolete.json index 41c9ecc8981cb..411006155d94f 100644 --- a/data/json/obsolete.json +++ b/data/json/obsolete.json @@ -24,7 +24,7 @@ "blackpowder_tolerance": 60, "clip_size": 1, "loudness": 25, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "built_in_mods": [ "combination_gun_shotgun_pipe" ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], "valid_mod_locations": [ @@ -83,7 +83,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "1000 ml", + "barrel_volume": "1000 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -121,7 +121,7 @@ "durability": 6, "blackpowder_tolerance": 60, "reload": 200, - "barrel_length": "500 ml", + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -231,7 +231,7 @@ "loudness": 25, "clip_size": 1, "reload": 200, - "barrel_length": "1000 ml", + "barrel_volume": "1000 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], @@ -1231,5 +1231,429 @@ "install": { "skills": [ [ "mechanics", 5 ], [ "electronics", 5 ] ] }, "removal": { "skills": [ [ "mechanics", 3 ] ] } } + }, + { + "type": "terrain", + "id": "t_gas_tank", + "name": "fuel tank", + "description": "A tank filled with gasoline.", + "looks_like": "f_gas_tank", + "symbol": "Q", + "color": "brown_red", + "move_cost": 0, + "coverage": 50 + }, + { + "type": "terrain", + "id": "t_gas_tank_smashed", + "name": "broken fuel tank", + "description": "A broken tank which was filled with gasoline.", + "looks_like": "f_gas_tank_smashed", + "symbol": "Q", + "color": "light_red", + "move_cost": 0, + "coverage": 50 + }, + { + "type": "terrain", + "id": "t_diesel_tank", + "name": "fuel tank", + "description": "A tank filled with diesel.", + "looks_like": "f_diesel_tank", + "symbol": "Q", + "color": "brown_red", + "move_cost": 0, + "coverage": 50 + }, + { + "type": "terrain", + "id": "t_diesel_tank_smashed", + "name": "broken diesel tank", + "description": "A broken tank which was filled with diesel.", + "looks_like": "f_diesel_tank_smashed", + "symbol": "Q", + "color": "light_red", + "move_cost": 0, + "coverage": 50 + }, + { + "type": "terrain", + "id": "t_centrifuge", + "name": "centrifuge", + "description": "This is a centrifuge, a liquid separating device with an automated analyzer unit. It could be used to analyze a medical fluid sample, such as blood, if a test tube was placed in it.", + "symbol": "{", + "color": "magenta", + "move_cost": 0, + "coverage": 30, + "flags": [ "TRANSPARENT", "PERMEABLE" ], + "bash": { + "str_min": 3, + "str_max": 45, + "sound": "crunch!", + "sound_fail": "whack!", + "ter_set": "t_rock_floor", + "items": [ + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 1, 6 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 5 ] }, + { "item": "steel_chunk", "count": [ 0, 3 ] }, + { "item": "sheet_metal", "count": [ 1, 3 ] }, + { "item": "cable", "charges": [ 1, 15 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_plut_generator", + "name": "plutonium generator", + "description": "This imposing apparatus harnesses the power of the atom. Refined nuclear fuel is 'burned' to provide nearly limitless electrical power. It's not doing much good here though. Perhaps it could be salvaged for other purposes.", + "symbol": "0", + "color": "light_green", + "looks_like": "f_machinery_electronic", + "move_cost": 0, + "flags": [ "TRANSPARENT", "NOITEM", "SEALED", "REDUCE_SCENT", "PERMEABLE" ], + "bash": { + "str_min": 50, + "str_max": 400, + "explosive": 25, + "ter_set": "t_concrete", + "sound": "metal screeching!", + "sound_fail": "clang!", + "items": [ + { "item": "scrap", "count": [ 4, 16 ] }, + { "item": "steel_chunk", "count": [ 1, 6 ] }, + { "item": "plutonium", "charges": [ 0, 3 ] }, + { "item": "lead", "charges": [ 12, 18 ] } + ] + }, + "deconstruct": { + "ter_set": "t_concrete", + "items": [ + { "item": "RAM", "count": [ 4, 8 ] }, + { "item": "cable", "charges": [ 8, 16 ] }, + { "item": "small_lcd_screen", "count": [ 2, 4 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 12, 24 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 4, 8 ] }, + { "item": "amplifier", "count": [ 3, 6 ] }, + { "item": "plutonium", "charges": [ 2, 8 ] }, + { "item": "scrap", "count": [ 8, 16 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_machinery_light", + "name": "light machinery", + "description": "Assorted light machinery. You could scavenge it for parts.", + "symbol": "$", + "color": "dark_gray", + "move_cost": 10, + "coverage": 65, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 40 }, + { "item": "cu_pipe", "prob": 40 }, + { "item": "scrap", "count": [ 1, 4 ] }, + { "item": "hose", "count": 1 }, + { "item": "steel_chunk", "count": [ 1, 5 ] }, + { "item": "bearing", "charges": [ 4, 12 ] }, + { "item": "frame", "prob": 50 }, + { "item": "motor", "prob": 50 } + ] + }, + "bash": { + "str_min": 16, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": 2, "prob": 40 }, + { "item": "chain", "prob": 20 }, + { "item": "cu_pipe", "prob": 10 }, + { "item": "scrap", "count": [ 3, 8 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "bearing", "charges": [ 2, 8 ] }, + { "item": "frame", "prob": 20 }, + { "item": "motor", "prob": 10 } + ] + } + }, + { + "type": "terrain", + "id": "t_machinery_heavy", + "name": "heavy machinery", + "description": "Assorted heavy machinery. You could scavenge it for parts.", + "symbol": "%", + "color": "light_gray", + "move_cost": 0, + "coverage": 75, + "flags": [ "BASHABLE", "CONTAINER", "SEALED", "PLACE_ITEM" ], + "deconstruct": { + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 60 }, + { "item": "cu_pipe", "prob": 20 }, + { "item": "steel_lump", "count": [ 1, 2 ] }, + { "item": "hose", "count": 1 }, + { "item": "sheet_metal", "count": [ 1, 3 ] }, + { "item": "steel_chunk", "count": [ 1, 3 ] }, + { "item": "bearing", "charges": [ 4, 12 ] }, + { "item": "frame", "prob": 60 }, + { "item": "motor", "prob": 30 }, + { "item": "metal_tank", "prob": 30 }, + { "item": "motor_large", "prob": 10 } + ] + }, + "bash": { + "str_min": 18, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": 1 }, + { "item": "chain", "prob": 20 }, + { "item": "steel_lump", "count": 1 }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "sheet_metal", "count": 2 }, + { "item": "steel_chunk", "count": [ 1, 2 ] }, + { "item": "bearing", "charges": [ 2, 8 ] }, + { "item": "frame", "prob": 30 }, + { "item": "motor", "prob": 10 }, + { "item": "metal_tank", "prob": 20 }, + { "item": "motor_large", "prob": 5 } + ] + } + }, + { + "type": "terrain", + "id": "t_machinery_old", + "name": "old machinery", + "description": "Assorted old machinery. You could scavenge it for parts.", + "symbol": "&", + "color": "brown", + "move_cost": 4, + "coverage": 55, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 40 }, + { "item": "cu_pipe", "prob": 60 }, + { "item": "scrap", "count": [ 1, 3 ] }, + { "item": "hose", "count": 1 }, + { "item": "steel_chunk", "count": [ 1, 3 ] }, + { "item": "bearing", "charges": [ 1, 5 ] }, + { "item": "frame", "prob": 30 }, + { "item": "motor", "prob": 30 }, + { "item": "splinter", "count": 3, "prob": 30 }, + { "item": "2x4", "count": [ 1, 4 ] }, + { "item": "nail", "charges": [ 3, 10 ] } + ] + }, + "bash": { + "str_min": 10, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": 1 }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "chain", "prob": 20 }, + { "item": "cu_pipe", "prob": 10 }, + { "item": "scrap", "count": [ 1, 5 ] }, + { "item": "steel_chunk", "count": [ 1, 2 ] }, + { "item": "motor", "prob": 10 }, + { "item": "splinter", "count": [ 4, 8 ] }, + { "item": "2x4", "count": 2 }, + { "item": "nail", "charges": [ 2, 5 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_machinery_electronic", + "name": "electronic machinery", + "description": "Assorted electronic machinery. You could scavenge it for parts.", + "symbol": "$", + "color": "yellow", + "move_cost": 8, + "coverage": 55, + "flags": [ "TRANSPARENT", "BASHABLE", "CONTAINER", "SEALED", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "count": [ 1, 3 ] }, + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "bearing", "charges": [ 2, 6 ] }, + { "item": "motor", "prob": 40 }, + { "item": "processor", "count": 1 }, + { "item": "RAM", "count": [ 1, 4 ] }, + { "item": "cable", "charges": [ 1, 4 ] }, + { "item": "small_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 5, 10 ] }, + { "item": "circuit", "count": [ 3, 8 ] }, + { "item": "power_supply", "count": [ 1, 3 ] }, + { "item": "amplifier", "count": [ 1, 3 ] }, + { "item": "plastic_chunk", "count": [ 2, 8 ] }, + { "item": "scrap", "count": [ 1, 5 ] } + ] + }, + "bash": { + "str_min": 10, + "str_max": 80, + "sound": "clang!", + "sound_fail": "ting.", + "ter_set": "t_rock_floor", + "items": [ + { "item": "wire", "prob": 40 }, + { "item": "pipe", "prob": 40 }, + { "item": "steel_chunk", "prob": 40 }, + { "item": "bearing", "charges": [ 2, 4 ] }, + { "item": "motor", "prob": 10 }, + { "item": "processor", "prob": 40 }, + { "item": "RAM", "count": [ 1, 2 ] }, + { "item": "cable", "charges": [ 1, 2 ] }, + { "item": "small_lcd_screen", "prob": 40 }, + { "item": "e_scrap", "count": [ 3, 8 ] }, + { "item": "circuit", "count": [ 1, 3 ] }, + { "item": "power_supply", "prob": 40 }, + { "item": "amplifier", "prob": 40 }, + { "item": "plastic_chunk", "count": [ 2, 8 ] }, + { "item": "scrap", "count": [ 3, 8 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_console_broken", + "name": "broken console", + "description": "This is a standalone computer terminal. It doesn't seem to be working. It's the broken screen and shattered circuit boards that's telling you that.", + "symbol": "6", + "color": "light_gray", + "move_cost": 0, + "coverage": 50, + "roof": "t_flat_roof", + "flags": [ "TRANSPARENT", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], + "deconstruct": { + "ter_set": "t_floor", + "items": [ + { "item": "processor", "count": [ 1, 2 ] }, + { "item": "RAM", "count": [ 4, 8 ] }, + { "item": "cable", "charges": [ 4, 6 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 10, 16 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 2, 4 ] }, + { "item": "amplifier", "count": [ 2, 4 ] }, + { "item": "plastic_chunk", "count": [ 10, 12 ] }, + { "item": "scrap", "count": [ 6, 8 ] } + ] + }, + "bash": { + "str_min": 16, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "whack!", + "ter_set": "t_floor", + "items": [ + { "item": "processor", "prob": 25 }, + { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, + { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, + { "item": "large_lcd_screen", "prob": 25 }, + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, + { "item": "power_supply", "prob": 25 }, + { "item": "amplifier", "prob": 25 }, + { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } + ] + } + }, + { + "type": "terrain", + "id": "t_console", + "name": "computer console", + "description": "This is a standalone computer terminal. It can be used to view contents and perform any allowed functions. It might even be possible to hack it, given the skills.", + "symbol": "6", + "color": "blue", + "move_cost": 0, + "coverage": 50, + "light_emitted": 10, + "roof": "t_flat_roof", + "flags": [ "TRANSPARENT", "CONSOLE", "NOITEM", "INDOORS", "SHORT", "PERMEABLE" ], + "deconstruct": { + "ter_set": "t_floor", + "items": [ + { "item": "processor", "count": [ 1, 2 ] }, + { "item": "RAM", "count": [ 4, 8 ] }, + { "item": "cable", "charges": [ 4, 6 ] }, + { "item": "large_lcd_screen", "count": 1 }, + { "item": "e_scrap", "count": [ 10, 16 ] }, + { "item": "circuit", "count": [ 6, 10 ] }, + { "item": "power_supply", "count": [ 2, 4 ] }, + { "item": "amplifier", "count": [ 2, 4 ] }, + { "item": "plastic_chunk", "count": [ 10, 12 ] }, + { "item": "scrap", "count": [ 6, 8 ] } + ] + }, + "bash": { + "str_min": 8, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "whack!", + "ter_set": "t_console_broken", + "items": [ + { "item": "processor", "prob": 25 }, + { "item": "RAM", "count": [ 0, 2 ], "prob": 50 }, + { "item": "cable", "charges": [ 1, 2 ], "prob": 50 }, + { "item": "large_lcd_screen", "prob": 25 }, + { "item": "e_scrap", "count": [ 1, 4 ], "prob": 50 }, + { "item": "circuit", "count": [ 0, 2 ], "prob": 50 }, + { "item": "power_supply", "prob": 25 }, + { "item": "amplifier", "prob": 25 }, + { "item": "plastic_chunk", "count": [ 4, 10 ], "prob": 50 }, + { "item": "scrap", "count": [ 2, 6 ], "prob": 50 } + ] + } + }, + { + "type": "terrain", + "id": "t_generator_broken", + "name": "broken generator", + "description": "This generator is broken and will not help you produce usable electricity.", + "symbol": "&", + "color": "light_gray", + "looks_like": "f_machinery_old", + "move_cost": 0, + "coverage": 30, + "flags": [ "TRANSPARENT", "NOITEM", "REDUCE_SCENT", "MOUNTABLE", "PERMEABLE" ], + "bash": { + "str_min": 20, + "str_max": 150, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_pavement", + "items": [ + { "item": "steel_lump", "prob": 50 }, + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 7 ] } + ] + } } ] diff --git a/data/json/obsolete_terrains.json b/data/json/obsolete_terrains.json index 27f16350b7ec6..e87ea95d62cce 100644 --- a/data/json/obsolete_terrains.json +++ b/data/json/obsolete_terrains.json @@ -2,315 +2,23 @@ { "type": "obsolete_terrain", "terrains": [ - "apartments_con_tower_1", - "apartments_con_tower_1_entrance", - "apartments_mod_tower_1", - "apartments_mod_tower_1_entrance", - "bridge_ew", - "bridge_ns", - "public_works", - "public_works_entrance", - "hdwr_large_entrance", - "hdwr_large_SW", - "hdwr_large_NW", - "hdwr_large_NE", - "hdwr_large_backroom", - "hdwr_large_loadingbay", - "cemetery_4square_00", - "cemetery_4square_10", - "cemetery_4square_01", - "cemetery_4square_11", - "loffice_tower_1", - "loffice_tower_2", - "loffice_tower_3", - "loffice_tower_4", - "loffice_tower_5", - "loffice_tower_6", - "loffice_tower_7", - "loffice_tower_8", - "loffice_tower_9", - "loffice_tower_10", - "loffice_tower_11", - "loffice_tower_12", - "loffice_tower_13", - "loffice_tower_14", - "loffice_tower_15", - "loffice_tower_16", - "school_1", - "school_2", - "school_3", - "school_4", - "school_5", - "school_6", - "school_7", - "school_8", - "school_9", - "prison_1", - "prison_2", - "prison_3", - "prison_4", - "prison_5", - "prison_6", - "prison_7", - "prison_8", - "prison_9", - "prison_b_entrance", - "prison_b", - "hospital_entrance", - "hospital", - "cathedral_1_entrance", - "cathedral_1", - "cathedral_b_entrance", - "cathedral_b", - "hotel_tower_1_1", - "hotel_tower_1_2", - "hotel_tower_1_3", - "hotel_tower_1_4", - "hotel_tower_1_5", - "hotel_tower_1_6", - "hotel_tower_1_7", - "hotel_tower_1_8", - "hotel_tower_1_9", - "hotel_tower_b_1", - "hotel_tower_b_2", - "hotel_tower_b_3", - "bunker", - "farm", - "farm_field", - "subway_station", - "mansion", - "mansion_entrance", - "ranch_camp_1", - "ranch_camp_2", - "ranch_camp_3", - "ranch_camp_4", - "ranch_camp_5", - "ranch_camp_6", - "ranch_camp_7", - "ranch_camp_8", - "ranch_camp_9", - "ranch_camp_10", - "ranch_camp_11", - "ranch_camp_12", - "ranch_camp_13", - "ranch_camp_14", - "ranch_camp_15", - "ranch_camp_16", - "ranch_camp_17", - "ranch_camp_18", - "ranch_camp_19", - "ranch_camp_20", - "ranch_camp_21", - "ranch_camp_22", - "ranch_camp_23", - "ranch_camp_24", - "ranch_camp_25", - "ranch_camp_26", - "ranch_camp_27", - "ranch_camp_28", - "ranch_camp_29", - "ranch_camp_30", - "ranch_camp_31", - "ranch_camp_32", - "ranch_camp_33", - "ranch_camp_34", - "ranch_camp_35", - "ranch_camp_36", - "ranch_camp_37", - "ranch_camp_38", - "ranch_camp_39", - "ranch_camp_40", - "ranch_camp_41", - "ranch_camp_42", - "ranch_camp_43", - "ranch_camp_44", - "ranch_camp_45", - "ranch_camp_46", - "ranch_camp_47", - "ranch_camp_48", - "ranch_camp_49", - "ranch_camp_50", - "ranch_camp_51", - "ranch_camp_52", - "ranch_camp_53", - "ranch_camp_54", - "ranch_camp_55", - "ranch_camp_56", - "ranch_camp_57", - "ranch_camp_58", - "ranch_camp_59", - "ranch_camp_60", - "ranch_camp_61", - "ranch_camp_62", - "ranch_camp_63", - "ranch_camp_64", - "ranch_camp_65", - "ranch_camp_66", - "ranch_camp_67", - "ranch_camp_68", - "ranch_camp_69", - "ranch_camp_70", - "ranch_camp_71", - "ranch_camp_72", - "ranch_camp_73", - "ranch_camp_74", - "ranch_camp_75", - "ranch_camp_76", - "ranch_camp_77", - "ranch_camp_78", - "ranch_camp_79", - "ranch_camp_80", - "ranch_camp_81", - "ranch_camp_57_roof", - "ranch_camp_65_roof", - "ranch_camp_66_roof", - "ranch_camp_67_roof", - "ranch_camp_68_roof", - "ranch_camp_74_roof", - "ranch_camp_75_roof", - "ranch_camp_57_silo", - "ranch_camp_57_silocap", - "bandit_cabin", - "bandit_camp_1", - "bandit_camp_2", - "bandit_camp_3", - "bandit_camp_4", - "bandit_garage_1", - "bandit_garage_2", - "cabin", - "cabin_strange", - "cabin_strange_b", - "campsite", - "campsite_a", - "campsite_cabin_incomplete", - "campsite_field_biker", - "campsite_field_biker_destroyed", - "haz_sar", - "haz_sar_entrance", - "haz_sar_b1", - "haz_sar_entrance_b1", - "hunter_shack", - "basement_bionic", - "lmoe", - "lmoe_roof", - "lmoe_under", - "lmoe_under_empty", - "magic_basement", - "outpost", - "park", - "pond_field", - "pond_forest", - "pond_swamp", - "pool", - "pwr_large_entrance", - "pwr_large_2", - "pwr_large_3", - "pwr_large_4", - "pwr_sub_s", - "radio_tower", - "robofachq_ai_a0", - "robofachq_ai_a1", - "robofachq_ai_a2", - "robofachq_ai_a3", - "robofachq_ai_b0", - "robofachq_ai_b1", - "robofachq_ai_b2", - "robofachq_ai_b3", - "robofachq_aiutl_a0", - "robofachq_aiutl_a1", - "robofachq_aiutl_a2", - "robofachq_aiutl_a3", - "robofachq_aiutl_b0", - "robofachq_aiutl_b1", - "robofachq_aiutl_b2", - "robofachq_aiutl_b3", - "robofachq_hab_a0", - "robofachq_hab_a1", - "robofachq_hab_a2", - "robofachq_hab_a3", - "robofachq_hab_b0", - "robofachq_hab_b1", - "robofachq_hab_b2", - "robofachq_hab_b3", - "robofachq_roof_a0", - "robofachq_roof_a1", - "robofachq_roof_a2", - "robofachq_roof_a3", - "robofachq_surface_a0", - "robofachq_surface_a1", - "robofachq_surface_a2", - "robofachq_surface_a3", - "robofachq_surface_b0", - "robofachq_surface_b1", - "robofachq_surface_b2", - "robofachq_surface_b3", - "robofachq_surface_parking", - "robofachq_surface_entrance", - "robofachq_surface_car_entrance", - "sai", - "shelter", - "shelter_1", - "shelter_2", - "shelter_roof", - "shelter_roof_1", - "shelter_roof_2", - "shelter_under", - "shipwreck_river_1", - "shipwreck_river_2", - "shipwreck_river_3", - "shipwreck_river_4", - "toxic_dump", - "orchard_tree_apple", - "orchard_stall", - "orchard_processing", - "sewage_treatment", - "sewage_treatment_hub", - "sewage_treatment_under", - "dairy_farm_NW", - "dairy_farm_NE", - "dairy_farm_SW", - "dairy_farm_SE", - "megastore", - "megastore_entrance", - "haz_sar_entrance", - "haz_sar", - "haz_sar_entrance_b1", - "haz_sar_b1", - "haz_sar_entrance_north", - "haz_sar_north", - "haz_sar_entrance_b1_north", - "haz_sar_b1_north", - "haz_sar_entrance_east", - "haz_sar_east", - "haz_sar_entrance_b1_east", - "haz_sar_b1_east", - "haz_sar_entrance_south", - "haz_sar_south", - "haz_sar_entrance_b1_south", - "haz_sar_b1_south", - "haz_sar_entrance_west", - "haz_sar_west", - "haz_sar_entrance_b1_west", - "haz_sar_b1_west", - "house_base", - "house_base_north", - "house_base_south", - "house_base_east", - "house_base_west", "mass_grave_north", "mass_grave_south", "mass_grave_east", "mass_grave_west", - "house", - "house_north", - "house_south", - "house_east", - "house_west", - "rural_house", - "rural_house_north", - "rural_house_south", - "rural_house_east", - "rural_house_west" + "bridge_north", + "bridge_east", + "bridge_south", + "bridge_west", + "fema", + "fema_entrance", + "fema_1_3", + "fema_2_1", + "fema_2_2", + "fema_2_3", + "fema_3_1", + "fema_3_2", + "fema_3_3" ] } ] diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index 479b5e287cf4c..cf1b46c120bae 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -869,7 +869,25 @@ { "point": [ 1, 1, -1 ], "overmap": "prison_1_b_4_north" }, { "point": [ -1, 2, -1 ], "overmap": "prison_1_b_9_north" }, { "point": [ 0, 2, -1 ], "overmap": "prison_1_b_8_north" }, - { "point": [ 1, 2, -1 ], "overmap": "prison_1_b_7_north" } + { "point": [ 1, 2, -1 ], "overmap": "prison_1_b_7_north" }, + { "point": [ -1, 0, 1 ], "overmap": "prison_1_2f_3_north" }, + { "point": [ 0, 0, 1 ], "overmap": "prison_1_2f_2_north" }, + { "point": [ 1, 0, 1 ], "overmap": "prison_1_2f_1_north" }, + { "point": [ -1, 1, 1 ], "overmap": "prison_1_2f_6_north" }, + { "point": [ 0, 1, 1 ], "overmap": "prison_1_2f_5_north" }, + { "point": [ 1, 1, 1 ], "overmap": "prison_1_2f_4_north" }, + { "point": [ -1, 2, 1 ], "overmap": "prison_1_2f_9_north" }, + { "point": [ 0, 2, 1 ], "overmap": "prison_1_2f_8_north" }, + { "point": [ 1, 2, 1 ], "overmap": "prison_1_2f_7_north" }, + { "point": [ -1, 0, 2 ], "overmap": "prison_1_3f_3_north" }, + { "point": [ 0, 0, 2 ], "overmap": "prison_1_3f_2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "prison_1_3f_1_north" }, + { "point": [ -1, 1, 2 ], "overmap": "prison_1_3f_6_north" }, + { "point": [ 0, 1, 2 ], "overmap": "prison_1_3f_5_north" }, + { "point": [ 1, 1, 2 ], "overmap": "prison_1_3f_4_north" }, + { "point": [ -1, 2, 2 ], "overmap": "prison_1_3f_9_north" }, + { "point": [ 0, 2, 2 ], "overmap": "prison_1_3f_8_north" }, + { "point": [ 1, 2, 2 ], "overmap": "prison_1_3f_7_north" } ], "connections": [ { "point": [ 0, -1, 0 ] } ], "locations": [ "land", "swamp" ], @@ -961,7 +979,25 @@ { "point": [ 1, 1, -1 ], "overmap": "prison_1_b_4_north" }, { "point": [ -1, 2, -1 ], "overmap": "prison_1_b_9_hidden_north" }, { "point": [ 0, 2, -1 ], "overmap": "prison_1_b_8_hidden_lab_stairs_north" }, - { "point": [ 1, 2, -1 ], "overmap": "prison_1_b_7_hidden_north" } + { "point": [ 1, 2, -1 ], "overmap": "prison_1_b_7_hidden_north" }, + { "point": [ -1, 0, 1 ], "overmap": "prison_1_2f_3_north" }, + { "point": [ 0, 0, 1 ], "overmap": "prison_1_2f_2_north" }, + { "point": [ 1, 0, 1 ], "overmap": "prison_1_2f_1_north" }, + { "point": [ -1, 1, 1 ], "overmap": "prison_1_2f_6_north" }, + { "point": [ 0, 1, 1 ], "overmap": "prison_1_2f_5_north" }, + { "point": [ 1, 1, 1 ], "overmap": "prison_1_2f_4_north" }, + { "point": [ -1, 2, 1 ], "overmap": "prison_1_2f_9_north" }, + { "point": [ 0, 2, 1 ], "overmap": "prison_1_2f_8_north" }, + { "point": [ 1, 2, 1 ], "overmap": "prison_1_2f_7_north" }, + { "point": [ -1, 0, 2 ], "overmap": "prison_1_3f_3_north" }, + { "point": [ 0, 0, 2 ], "overmap": "prison_1_3f_2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "prison_1_3f_1_north" }, + { "point": [ -1, 1, 2 ], "overmap": "prison_1_3f_6_north" }, + { "point": [ 0, 1, 2 ], "overmap": "prison_1_3f_5_north" }, + { "point": [ 1, 1, 2 ], "overmap": "prison_1_3f_4_north" }, + { "point": [ -1, 2, 2 ], "overmap": "prison_1_3f_9_north" }, + { "point": [ 0, 2, 2 ], "overmap": "prison_1_3f_8_north" }, + { "point": [ 1, 2, 2 ], "overmap": "prison_1_3f_7_north" } ], "connections": [ { "point": [ 0, -1, 0 ] } ], "locations": [ "land", "swamp" ], @@ -4473,8 +4509,8 @@ { "point": [ 4, 0, -4 ], "overmap": "microlab_generic_edge" }, { "point": [ 5, 0, -4 ], "overmap": "microlab_generic_edge" }, { "point": [ 6, 0, -4 ], "overmap": "microlab_rock_border" }, - { "point": [ -1, 1, -4 ], "overmap": "microlab_rock_border" }, - { "point": [ 0, 1, -4 ], "overmap": "microlab_generic_edge" }, + { "point": [ -1, 1, -4 ], "overmap": "microlab_reactor_west" }, + { "point": [ 0, 1, -4 ], "overmap": "microlab_generic_edge_room_connector_west" }, { "point": [ 1, 1, -4 ], "overmap": "microlab_generic" }, { "point": [ 2, 1, -4 ], "overmap": "microlab_generic" }, { "point": [ 3, 1, -4 ], "overmap": "microlab_generic_hallway_start_south" }, @@ -4505,7 +4541,8 @@ { "point": [ 4, 4, -4 ], "overmap": "microlab_rock_border" }, { "point": [ 5, 4, -4 ], "overmap": "microlab_rock_border" }, { "point": [ 6, 4, -4 ], "overmap": "microlab_rock_border" }, - { "point": [ 3, 4, -5 ], "overmap": "microlab_generic_isolated_elevator_pit_north" } + { "point": [ 3, 4, -5 ], "overmap": "microlab_generic_isolated_elevator_pit_north" }, + { "point": [ -1, 1, -5 ], "overmap": "microlab_reactor_b_west" } ], "locations": [ "wilderness" ], "city_distance": [ 3, -1 ], diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json b/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json index c4b7d67100c19..ed96bee77eab9 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json @@ -62,6 +62,7 @@ "microlab_generic_firebreak", "microlab_generic_hallway", "microlab_generic_stairs_down", + "microlab_generic_edge_room_connector", "microlab_generic_isolated_stairs_odd", "microlab_generic_isolated_stairs_even", "microlab_generic_isolated_stairs_up", @@ -73,6 +74,15 @@ "see_cost": 5, "flags": [ "RISK_HIGH", "SOURCE_CHEMISTRY", "SOURCE_MEDICINE" ] }, + { + "type": "overmap_terrain", + "id": [ "microlab_reactor", "microlab_reactor_b" ], + "name": "science lab reactor", + "sym": "L", + "color": "light_red", + "see_cost": 5, + "flags": [ "RISK_HIGH" ] + }, { "type": "overmap_terrain", "id": "microlab_generic_surface", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json index 609cdb67d480c..0ad3993e462e1 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json @@ -206,6 +206,24 @@ "prison_1_b_7", "prison_1_b_8", "prison_1_b_9", + "prison_1_2f_1", + "prison_1_2f_2", + "prison_1_2f_3", + "prison_1_2f_4", + "prison_1_2f_5", + "prison_1_2f_6", + "prison_1_2f_7", + "prison_1_2f_8", + "prison_1_2f_9", + "prison_1_3f_1", + "prison_1_3f_2", + "prison_1_3f_3", + "prison_1_3f_4", + "prison_1_3f_5", + "prison_1_3f_6", + "prison_1_3f_7", + "prison_1_3f_8", + "prison_1_3f_9", "prison_1_b_7_hidden", "prison_1_b_8_hidden_lab_stairs", "prison_1_b_9_hidden", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json index eb7a6f94d496e..ad2842be6c13a 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json @@ -62,16 +62,41 @@ }, { "type": "overmap_terrain", - "id": "bridge", + "abstract": "generic_bridge", "copy-from": "generic_transportation", "name": "bridge", "sym": "│", "color": "white", - "see_cost": 2, - "extras": "bridge", - "mapgen": [ { "method": "builtin", "name": "bridge" } ], + "see_cost": 2 + }, + { + "type": "overmap_terrain", + "id": "bridge", + "copy-from": "generic_bridge", + "color": "blue", "flags": [ "RIVER" ] }, + { + "type": "overmap_terrain", + "id": "bridge_road", + "copy-from": "generic_bridge", + "name": "bridge (overpass)" + }, + { + "type": "overmap_terrain", + "id": "bridgehead_ground", + "copy-from": "generic_bridge", + "name": "bridgehead (ground)", + "sym": "v", + "extras": "bridgehead_ground" + }, + { + "type": "overmap_terrain", + "id": "bridgehead_ramp", + "copy-from": "generic_bridge", + "name": "bridgehead (ramp)", + "sym": "^" + }, { "type": "overmap_terrain", "id": [ "roadstop", "roadstop_roof" ], diff --git a/data/json/player_activities.json b/data/json/player_activities.json index 9db49f5ac2afa..f66090b8e2350 100644 --- a/data/json/player_activities.json +++ b/data/json/player_activities.json @@ -866,5 +866,33 @@ "activity_level": "NO_EXERCISE", "verb": "consuming", "based_on": "time" + }, + { + "id": "ACT_WORKOUT_HARD", + "type": "activity_type", + "activity_level": "EXTRA_EXERCISE", + "verb": { "ctxt": "training", "str": "working out" }, + "based_on": "time" + }, + { + "id": "ACT_WORKOUT_ACTIVE", + "type": "activity_type", + "activity_level": "ACTIVE_EXERCISE", + "verb": { "ctxt": "training", "str": "working out" }, + "based_on": "time" + }, + { + "id": "ACT_WORKOUT_MODERATE", + "type": "activity_type", + "activity_level": "MODERATE_EXERCISE", + "verb": { "ctxt": "training", "str": "working out" }, + "based_on": "time" + }, + { + "id": "ACT_WORKOUT_LIGHT", + "type": "activity_type", + "activity_level": "LIGHT_EXERCISE", + "verb": { "ctxt": "training", "str": "working out" }, + "based_on": "time" } ] diff --git a/data/json/professions.json b/data/json/professions.json index 906b1d31aa10f..42dc0b75fc90e 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -17,6 +17,12 @@ "id": "charged_cell_phone", "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "cell_phone" } ] }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_smart_phone", + "entries": [ { "item": "smart_phone", "ammo-item": "battery", "charges": 120 } ] + }, { "type": "item_group", "subtype": "collection", @@ -41,6 +47,18 @@ "id": "charged_tazer", "entries": [ { "item": "medium_disposable_cell", "ammo-item": "battery", "charges": 1200, "container-item": "tazer" } ] }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_ref_lighter", + "entries": [ { "item": "ref_lighter", "charges": 50 } ] + }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_matches", + "entries": [ { "item": "matches", "charges": 20 } ] + }, { "type": "item_group", "subtype": "collection", @@ -346,10 +364,9 @@ "knit_scarf", "jug_plastic", "can_beans", - "pockknife", - "matches" + "pockknife" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] }, "male": [ "boxer_briefs" ], "female": [ "bra", "panties" ] @@ -397,11 +414,11 @@ "knit_scarf", "backpack", "canteen", - "smart_phone", "wristwatch", "binoculars" ], "entries": [ + { "group": "charged_smart_phone" }, { "item": "crossbow", "ammo-item": "bolt_steel", "charges": 1, "contents-item": "shoulder_strap" }, { "item": "quiver", "contents-group": "quiver_bionic_prepper" }, { "item": "machete", "container-item": "scabbard" } @@ -419,19 +436,8 @@ "points": 0, "items": { "both": { - "items": [ - "jeans", - "longshirt", - "socks", - "coat_winter", - "boots_winter", - "knit_scarf", - "pockknife", - "water_clean", - "matches", - "wristwatch" - ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "jeans", "longshirt", "socks", "coat_winter", "boots_winter", "knit_scarf", "pockknife", "water_clean", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -455,8 +461,8 @@ ], "items": { "both": { - "items": [ "pants", "tshirt", "socks", "sweater", "sneakers", "multitool", "water_clean", "matches", "wristwatch" ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "pants", "tshirt", "socks", "sweater", "sneakers", "multitool", "water_clean", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -480,11 +486,11 @@ "boots_hiking", "knife_folding", "water_clean", - "matches", "wristwatch" ], "entries": [ { "group": "charged_two_way_radio" }, + { "group": "charged_matches" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "m1911", "ammo-item": "45_acp", "charges": 7, "container-item": "holster" }, { "item": "45_acp", "charges": 23 }, @@ -569,8 +575,11 @@ ], "items": { "both": { - "items": [ "dress_shirt", "pants", "socks", "boots", "coat_lab", "gloves_rubber", "glasses_safety", "smart_phone", "wristwatch" ], - "entries": [ { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "chemistry_set" } ] + "items": [ "dress_shirt", "pants", "socks", "boots", "coat_lab", "gloves_rubber", "glasses_safety", "wristwatch" ], + "entries": [ + { "group": "charged_smart_phone" }, + { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "chemistry_set" } + ] }, "male": [ "briefs" ], "female": [ "bra", "panties" ] @@ -642,7 +651,6 @@ "items": { "both": { "items": [ - "honey_scraper", "beekeeping_hood", "beekeeping_suit", "beekeeping_gloves", @@ -653,7 +661,7 @@ "honey_bottled", "honey_bottled" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "item": "honey_scraper", "container-item": "sheath" } ] }, "male": [ "boxer_briefs" ], "female": [ "bra", "panties" ] @@ -893,6 +901,7 @@ "wristwatch", "water_clean", "bandages", + "adhesive_bandages", "aspirin", "1st_aid", "stethoscope" @@ -989,6 +998,7 @@ "coat_lab", "water_clean", "bandages", + "adhesive_bandages", "aspirin", "grahmcrackers", "stethoscope" @@ -1062,7 +1072,7 @@ "description": "Cocaine. It is, indeed, a helluva drug. You blew your money on some dust, and before you knew it you were turning tricks behind the local CVS just to score one more line. Where are you going to get your next fix now?", "points": -1, "items": { - "both": [ "crackpipe", "crack", "crack", "ref_lighter", "tank_top" ], + "both": { "items": [ "crackpipe", "crack", "crack", "tank_top" ], "entries": [ { "group": "charged_ref_lighter" } ] }, "male": [ "jeans", "flip_flops" ], "female": [ "jeans", "heels" ] }, @@ -1075,7 +1085,10 @@ "description": "Society drove you to the fringes and left you with no home, no family, no friends. You found solace in the bottom of a bottle. Well, society doesn't mean a thing anymore, and for all the crap thrown your way, you're still standing. God damn, you need a drink.", "points": -1, "items": { - "both": [ "pants", "knit_scarf", "whiskey", "gin", "bum_wine", "ragpouch", "bindle", "can_beans", "pockknife", "matches" ], + "both": { + "items": [ "pants", "knit_scarf", "whiskey", "gin", "bum_wine", "ragpouch", "bindle", "can_beans", "pockknife" ], + "entries": [ { "group": "charged_matches" } ] + }, "male": [ "undershirt" ], "female": [ "camisole" ] }, @@ -1110,7 +1123,7 @@ "description": "You got your pilot's license, and earned a living ferrying businessmen and tourists around. The Cataclysm has grounded you for now, but the sky still calls to you…", "points": 4, "skills": [ { "level": 4, "name": "driving" }, { "level": 1, "name": "speech" }, { "level": 3, "name": "mechanics" } ], - "traits": [ "PROF_HELI_PILOT" ], + "proficiencies": [ "prof_helicopter_pilot" ], "items": { "both": { "items": [ "pants_cargo", "socks", "polo_shirt", "boots", "wristwatch", "fancy_sunglasses" ], @@ -1151,21 +1164,26 @@ "description": "Everyone is dead? Oh well, it doesn't matter; it's not like you got along with people much anyway. Your beloved cats are all the friends you need!", "points": 5, "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "cooking" }, { "level": 1, "name": "tailor" } ], - "pets": [ { "name": "mon_cat", "amount": 30 } ], + "pets": [ + { "name": "mon_cat", "amount": 5 }, + { "name": "mon_cat_tabby", "amount": 4 }, + { "name": "mon_cat_longhair", "amount": 3 }, + { "name": "mon_cat_persian", "amount": 3 }, + { "name": "mon_cat_siamese", "amount": 3 }, + { "name": "mon_cat_calico", "amount": 2 }, + { "name": "mon_cat_maine_coon", "amount": 2 }, + { "name": "mon_cat_devon_rex", "amount": 2 }, + { "name": "mon_cat_bengal", "amount": 1 }, + { "name": "mon_cat_sphynx", "amount": 1 }, + { "name": "mon_cat_chonker_kitten", "amount": 1 }, + { "name": "mon_cat_longhair_kitten", "amount": 1 }, + { "name": "mon_cat_calico_kitten", "amount": 1 }, + { "name": "mon_cat_tabby_kitten", "amount": 1 } + ], "items": { "both": { - "items": [ - "jeans", - "longshirt", - "socks", - "coat_winter", - "boots_winter", - "knit_scarf", - "pockknife", - "water_clean", - "matches", - "wristwatch" - ] + "items": [ "jeans", "longshirt", "socks", "coat_winter", "boots_winter", "knit_scarf", "pockknife", "water_clean", "wristwatch" ], + "entries": [ { "group": "charged_matches" } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -1217,12 +1235,12 @@ "wristwatch", "socks", "dress_shoes", - "cig", - "ref_lighter" + "cig" ], "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_two_way_radio" }, + { "group": "charged_ref_lighter" }, { "item": "sw_619", "ammo-item": "357mag_fmj", "charges": 6, "container-item": "holster" }, { "item": "357mag_fmj", "charges": 24 } ] @@ -1590,8 +1608,11 @@ "skills": [ { "level": 4, "name": "computer" } ], "items": { "both": { - "items": [ "pants", "tshirt_text", "socks", "sneakers", "mbag", "laptop", "smart_phone", "caffeine" ], - "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "portable_game" } ] + "items": [ "pants", "tshirt_text", "socks", "sneakers", "mbag", "laptop", "caffeine" ], + "entries": [ + { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "portable_game" }, + { "group": "charged_smart_phone" } + ] }, "male": [ "briefs" ], "female": [ "panties" ] @@ -1673,8 +1694,9 @@ "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "smg" }, { "level": 3, "name": "lockpick" } ], "items": { "both": { - "items": [ "waistcoat", "pants", "dress_shirt", "socks", "dress_shoes", "knit_scarf", "gold_watch", "smart_phone" ], + "items": [ "waistcoat", "pants", "dress_shirt", "socks", "dress_shoes", "knit_scarf", "gold_watch" ], "entries": [ + { "group": "charged_smart_phone" }, { "item": "briefcase_smg", "ammo-item": "9mm", "charges": 30 }, { "item": "mp5mag", "ammo-item": "9mm", "charges": 30 } ] @@ -1785,18 +1807,10 @@ "bio_power_storage_mkII" ], "items": { - "both": [ - "socks", - "tshirt", - "jeans", - "leather_belt", - "boots_steel", - "gloves_work", - "glasses_safety", - "hat_hard", - "smart_phone", - "wristwatch" - ], + "both": { + "items": [ "socks", "tshirt", "jeans", "leather_belt", "boots_steel", "gloves_work", "glasses_safety", "hat_hard", "wristwatch" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "sports_bra", "panties" ] } @@ -1809,18 +1823,20 @@ "points": 5, "CBMs": [ "bio_str_enhancer", "bio_adrenaline", "bio_hydraulics", "bio_metabolics", "bio_power_storage_mkII" ], "items": { - "both": [ - "socks_ankle", - "under_armor_shorts", - "under_armor", - "tshirt", - "shorts", - "lowtops", - "fanny", - "protein_drink", - "smart_phone", - "wristwatch" - ], + "both": { + "items": [ + "socks_ankle", + "under_armor_shorts", + "under_armor", + "tshirt", + "shorts", + "lowtops", + "fanny", + "protein_drink", + "wristwatch" + ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "sports_bra", "panties" ] } @@ -1833,18 +1849,20 @@ "points": 4, "CBMs": [ "bio_adrenaline", "bio_torsionratchet", "bio_power_storage_mkII", "bio_jointservo" ], "items": { - "both": [ - "socks_ankle", - "under_armor_shorts", - "under_armor", - "tshirt", - "shorts", - "lowtops", - "fanny", - "sports_drink", - "smart_phone", - "wristwatch" - ], + "both": { + "items": [ + "socks_ankle", + "under_armor_shorts", + "under_armor", + "tshirt", + "shorts", + "lowtops", + "fanny", + "sports_drink", + "wristwatch" + ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "sports_bra", "panties" ] } @@ -1870,19 +1888,10 @@ "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "pistol" } ], "items": { "both": { - "items": [ - "tac_fullhelmet", - "police_belt", - "pants_cargo", - "under_armor", - "socks", - "boots", - "badge_cybercop", - "smart_phone", - "wristwatch" - ], + "items": [ "tac_fullhelmet", "police_belt", "pants_cargo", "under_armor", "socks", "boots", "badge_cybercop", "wristwatch" ], "entries": [ { "group": "charged_two_way_radio" }, + { "group": "charged_smart_phone" }, { "item": "glock_18c", "ammo-item": "9mmP", "container-item": "holster" }, { "item": "tacvest", "contents-group": "army_mags_glock17" } ] @@ -1933,7 +1942,10 @@ "skills": [ { "level": 2, "name": "barter" }, { "level": 2, "name": "speech" } ], "no_bonus": "teleumbrella", "items": { - "both": [ "socks", "suit", "dress_shoes", "gold_watch", "knit_scarf", "briefcase", "smart_phone", "file", "teleumbrella" ], + "both": { + "items": [ "socks", "suit", "dress_shoes", "gold_watch", "knit_scarf", "briefcase", "file", "teleumbrella" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] } @@ -2076,7 +2088,10 @@ ], "skills": [ { "level": 2, "name": "speech" } ], "items": { - "both": [ "dress_shoes", "socks", "knit_scarf", "suit", "wristwatch", "smart_phone" ], + "both": { + "items": [ "dress_shoes", "socks", "knit_scarf", "suit", "wristwatch" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -2100,7 +2115,10 @@ ], "skills": [ { "level": 3, "name": "dodge" } ], "items": { - "both": [ "dress_shoes", "dress_shirt", "knit_scarf", "wristwatch", "blazer", "wristwatch", "smart_phone" ], + "both": { + "items": [ "dress_shoes", "dress_shirt", "knit_scarf", "wristwatch", "blazer", "wristwatch" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs", "socks", "pants" ], "female": [ "bra", "panties", "stockings", "skirt" ] } @@ -2134,9 +2152,9 @@ "both": { "items": [ "suit", "bowhat", "socks", "dress_shoes", "knit_scarf", "cig", "switchblade", "mag_porn", "sunglasses", "shot_00" ], "entries": [ + { "group": "charged_ref_lighter" }, { "item": "glock_19", "ammo-item": "9mm", "container-item": "holster", "charges": 15 }, - { "item": "glockmag", "ammo-item": "9mm", "charges": 15 }, - { "item": "ref_lighter", "charges": 100 } + { "item": "glockmag", "ammo-item": "9mm", "charges": 15 } ] }, "male": [ "boxer_shorts" ], @@ -2176,7 +2194,7 @@ "CBMs": [ "bio_flashlight", "bio_tools", "bio_ups", "bio_watch", "bio_batteries", "bio_power_storage_mkII" ], "skills": [ { "level": 4, "name": "electronics" }, { "level": 2, "name": "fabrication" } ], "items": { - "both": [ "tshirt", "sneakers", "jacket_light", "wristwatch", "smart_phone" ], + "both": { "items": [ "tshirt", "sneakers", "jacket_light", "wristwatch" ], "entries": [ { "group": "charged_smart_phone" } ] }, "male": [ "briefs", "socks", "pants" ], "female": [ "bra", "panties", "stockings", "skirt" ] } @@ -2213,10 +2231,13 @@ "wristwatch", "tobacco", "rolling_paper", - "matches", "backpack" ], - "entries": [ { "group": "charged_cell_phone" }, { "item": "knife_hunting", "container-item": "sheath" } ] + "entries": [ + { "group": "charged_cell_phone" }, + { "group": "charged_matches" }, + { "item": "knife_hunting", "container-item": "sheath" } + ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "boxer_shorts" ] @@ -2229,6 +2250,7 @@ "description": "You ran into trouble coming out of class at your community college's metalsmithing program, but despite the havoc you've managed to keep ahold of some of the equipment you were carrying.", "points": 1, "skills": [ { "level": 4, "name": "fabrication" } ], + "proficiencies": [ "prof_blacksmithing" ], "items": { "both": { "items": [ "jeans", "socks", "boots", "tank_top", "apron_leather", "fire_gauntlets", "wristwatch", "hammer" ], @@ -2260,7 +2282,9 @@ "description": "In the rush to safety, you were separated from your master by cruel fate. Now you are on your own, with nothing to your name but a suit of really kinky black leather. Unfortunately, there are no safewords in the apocalypse.", "points": -1, "flags": [ "NO_BONUS_ITEMS" ], - "items": { "both": [ "bondage_suit", "bondage_mask", "boots", "leather_belt", "matches" ] } + "items": { + "both": { "items": [ "bondage_suit", "bondage_mask", "boots", "leather_belt" ], "entries": [ { "group": "charged_matches" } ] } + } }, { "type": "profession", @@ -2270,8 +2294,8 @@ "points": 0, "items": { "both": { - "items": [ "tobacco", "pipe_tobacco", "ref_lighter", "socks", "dress_shoes", "knit_scarf" ], - "entries": [ { "item": "cane", "custom-flags": [ "auto_wield" ] } ] + "items": [ "tobacco", "pipe_tobacco", "socks", "dress_shoes", "knit_scarf" ], + "entries": [ { "group": "charged_ref_lighter" }, { "item": "cane", "custom-flags": [ "auto_wield" ] } ] }, "male": [ "briefs", "dress_shirt", "pants_checkered", "pocketwatch" ], "female": [ "panties", "bra", "dress", "fanny", "gold_watch" ] @@ -2326,18 +2350,8 @@ "points": 0, "items": { "both": { - "items": [ - "trenchcoat", - "gloves_fingerless", - "socks", - "boots_combat", - "weed", - "tobacco", - "rolling_paper", - "ref_lighter", - "wristwatch" - ], - "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" } ] + "items": [ "trenchcoat", "gloves_fingerless", "socks", "boots_combat", "weed", "tobacco", "rolling_paper", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" }, { "group": "charged_ref_lighter" } ] }, "male": [ "pants_cargo", "tank_top", "boxer_shorts" ], "female": [ "skirt", "corset", "boxer_shorts" ] @@ -2379,19 +2393,8 @@ "points": 0, "items": { "both": { - "items": [ - "dress_shirt", - "tie_skinny", - "sunglasses", - "pants", - "socks", - "dress_shoes", - "rolling_paper", - "tobacco", - "wristwatch", - "ref_lighter" - ], - "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" } ] + "items": [ "dress_shirt", "tie_skinny", "sunglasses", "pants", "socks", "dress_shoes", "rolling_paper", "tobacco", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" }, { "group": "charged_ref_lighter" } ] }, "male": [ "briefs" ], "female": [ "bra", "panties" ] @@ -2474,8 +2477,8 @@ "skills": [ { "level": 2, "name": "chemistry" }, { "level": 2, "name": "firstaid" } ], "items": { "both": { - "items": [ "striped_shirt", "striped_pants", "sneakers", "socks", "adderall", "matches" ], - "entries": [ { "item": "condom", "contents-item": "dayquil" } ] + "items": [ "striped_shirt", "striped_pants", "sneakers", "socks", "adderall" ], + "entries": [ { "item": "condom", "contents-item": "dayquil" }, { "group": "charged_matches" } ] }, "male": [ "briefs" ], "female": [ "bra", "panties" ] @@ -2553,17 +2556,10 @@ "CBMs": [ "bio_razors", "bio_armor_eyes", "bio_sunglasses", "bio_dex_enhancer", "bio_ears", "bio_carbon" ], "skills": [ { "level": 2, "name": "melee" }, { "level": 2, "name": "unarmed" }, { "level": 2, "name": "dodge" } ], "items": { - "both": [ - "socks", - "tank_top", - "jacket_leather", - "pants_leather", - "boots", - "gloves_fingerless", - "smart_phone", - "wristwatch", - "gum" - ], + "both": { + "items": [ "socks", "tank_top", "jacket_leather", "pants_leather", "boots", "gloves_fingerless", "wristwatch", "gum" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "sports_bra", "boy_shorts" ] } @@ -2589,8 +2585,8 @@ "skills": [ { "level": 1, "name": "electronics" }, { "level": 1, "name": "firstaid" }, { "level": 1, "name": "computer" } ], "items": { "both": { - "items": [ "tank_top", "shorts", "socks", "lowtops", "aspirin", "anesthetic_kit", "pockknife", "backpack", "wristwatch" ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "tank_top", "shorts", "socks", "lowtops", "aspirin", "pockknife", "backpack", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "item": "anesthetic_kit", "charges": 3000 } ] }, "male": [ "briefs" ], "female": [ "camisole", "panties" ] @@ -2650,19 +2646,21 @@ "points": 1, "skills": [ { "level": 1, "name": "barter" }, { "level": 2, "name": "speech" } ], "items": { - "both": [ - "suit", - "tie_necktie", - "tieclip", - "socks", - "dress_shoes", - "knit_scarf", - "wristwatch", - "smart_phone", - "briefcase", - "money_bundle", - "file" - ], + "both": { + "items": [ + "suit", + "tie_necktie", + "tieclip", + "socks", + "dress_shoes", + "knit_scarf", + "wristwatch", + "briefcase", + "money_bundle", + "file" + ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -3145,6 +3143,7 @@ { "level": 2, "name": "chemistry" }, { "level": 3, "name": "cooking" } ], + "proficiencies": [ "prof_knapping" ], "items": { "both": { "items": [ @@ -3160,11 +3159,11 @@ "leather_funnel", "clay_pot", "waterskin", - "needle_bone", "fur_rollmat", "fire_drill" ], "entries": [ + { "item": "needle_bone", "ammo-item": "sinew", "charges": 200 }, { "item": "primitive_knife", "container-item": "sheath" }, { "item": "quiver", "contents-group": "quiver_naturalist" } ] @@ -3221,8 +3220,8 @@ ], "items": { "both": { - "items": [ "stockings", "pockknife", "matches", "pipe_tobacco", "tobacco", "backpack" ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "stockings", "pockknife", "pipe_tobacco", "tobacco", "backpack" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] }, "male": { "items": [ @@ -3245,20 +3244,21 @@ { "item": "lamp_oil", "container-item": "bottle_plastic_small" } ] }, - "female": [ - "dress", - "apron_leather", - "boots", - "gloves_leather", - "long_knit_scarf", - "hat_fur", - "purse", - "oil_lamp", - "needle_wood", - "pot", - "cornmeal", - "salt" - ] + "female": { + "items": [ + "dress", + "apron_leather", + "boots", + "gloves_leather", + "long_knit_scarf", + "hat_fur", + "purse", + "pot", + "cornmeal", + "salt" + ], + "entries": [ { "item": "needle_wood", "ammo-item": "thread", "charges": 200 }, { "item": "oil_lamp", "charges": 750 } ] + } } }, { @@ -3275,23 +3275,24 @@ ], "items": { "both": { - "items": [ "stockings", "pockknife", "matches", "pipe_tobacco", "tobacco", "backpack" ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "stockings", "pockknife", "pipe_tobacco", "tobacco", "backpack" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] + }, + "male": { + "items": [ + "dress", + "apron_leather", + "boots", + "gloves_leather", + "long_knit_scarf", + "hat_fur", + "purse", + "pot", + "cornmeal", + "salt" + ], + "entries": [ { "item": "needle_wood", "ammo-item": "thread", "charges": 200 }, { "item": "oil_lamp", "charges": 750 } ] }, - "male": [ - "dress", - "apron_leather", - "boots", - "gloves_leather", - "long_knit_scarf", - "hat_fur", - "needle_wood", - "purse", - "oil_lamp", - "pot", - "cornmeal", - "salt" - ], "female": { "items": [ "knee_high_boots", @@ -3375,7 +3376,6 @@ "sneakers", "gloves_fingerless", "slingpack", - "matches", "hairpin", "hairpin", "mag_comic", @@ -3384,7 +3384,7 @@ "marble", "slingshot" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_matches" } ] }, "male": [ "briefs" ], "female": [ "boy_shorts" ] @@ -3434,22 +3434,24 @@ "points": 3, "CBMs": [ "bio_batteries", "bio_power_storage", "bio_int_enhancer", "bio_memory" ], "items": { - "both": [ - "dress_shirt", - "jacket_light", - "pants", - "socks", - "dress_shoes", - "tie_clipon", - "tieclip", - "fancy_sunglasses", - "knit_scarf", - "wristwatch", - "mbag", - "water_mineral", - "smart_phone", - "money_bundle" - ], + "both": { + "items": [ + "dress_shirt", + "jacket_light", + "pants", + "socks", + "dress_shoes", + "tie_clipon", + "tieclip", + "fancy_sunglasses", + "knit_scarf", + "wristwatch", + "mbag", + "water_mineral", + "money_bundle" + ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "panties" ] } @@ -3592,15 +3594,12 @@ "hat_cotton", "knit_scarf", "backpack", - "ref_lighter", "hatchet", "e_tool", "tent_kit", "rollmat", "sleeping_bag_roll", "knife_swissarmy", - "gasoline_lantern", - "canteen", "granola", "pur_tablets", "wristwatch", @@ -3608,6 +3607,9 @@ ], "entries": [ { "group": "charged_cell_phone" }, + { "group": "charged_ref_lighter" }, + { "item": "gasoline_lantern", "charges": 500 }, + { "item": "water_clean", "ammo-item": "water_clean", "container-item": "canteen" }, { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "mess_kit" } ] }, @@ -3634,10 +3636,10 @@ "e_tool", "tool_belt", "mbag", - "wristwatch", - "matches" + "wristwatch" ], "entries": [ + { "group": "charged_matches" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "jackhammer", "charges": 400 }, { "item": "light_minus_disposable_cell", "charges": 100 }, @@ -3667,10 +3669,10 @@ "mbag", "briefcase", "wristwatch", - "hat_hard", - "matches" + "hat_hard" ], "entries": [ + { "group": "charged_matches" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "dynamite", "count": 8 }, { "item": "dynamite", "count": 4 }, @@ -3752,12 +3754,11 @@ "dress_shoes", "coat_lab", "bandages", - "anesthetic_kit", "1st_aid", "wristwatch", "stethoscope" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "item": "anesthetic_kit", "charges": 3000 } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -3799,7 +3800,10 @@ { "level": 1, "name": "throw" } ], "items": { - "both": [ "jeans", "polo_shirt", "socks", "dress_shoes", "mbag", "caffeine", "smart_phone", "wristwatch" ], + "both": { + "items": [ "jeans", "polo_shirt", "socks", "dress_shoes", "mbag", "caffeine", "wristwatch" ], + "entries": [ { "group": "charged_smart_phone" } ] + }, "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -3882,10 +3886,9 @@ "antibiotics", "oxycodone", "1st_aid", - "smart_phone", "wristwatch" ], - "entries": [ { "item": "medium_battery_cell", "charges": 500 } ] + "entries": [ { "group": "charged_smart_phone" }, { "item": "medium_battery_cell", "charges": 500 } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -3941,19 +3944,10 @@ "skills": [ { "level": 4, "name": "barter" }, { "level": 6, "name": "speech" } ], "traits": [ "LIAR" ], "items": { - "both": [ - "suit", - "tieclip", - "socks_wool", - "dress_shoes", - "smart_phone", - "gold_watch", - "briefcase", - "tie_skinny", - "file", - "ref_lighter", - "cigar" - ], + "both": { + "items": [ "suit", "tieclip", "socks_wool", "dress_shoes", "gold_watch", "briefcase", "tie_skinny", "file", "cigar" ], + "entries": [ { "group": "charged_ref_lighter" }, { "group": "charged_smart_phone" } ] + }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] } @@ -4001,19 +3995,8 @@ "both": { "ammo": 100, "magazine": 100, - "items": [ - "tshirt_tour", - "jeans", - "socks", - "boots_steel", - "multitool", - "wristwatch", - "gloves_work", - "mbag", - "soldering_iron", - "matches" - ], - "entries": [ { "group": "charged_cell_phone" }, { "item": "jacket_jean" } ] + "items": [ "tshirt_tour", "jeans", "socks", "boots_steel", "multitool", "wristwatch", "gloves_work", "mbag", "soldering_iron" ], + "entries": [ { "group": "charged_cell_phone" }, { "item": "jacket_jean" }, { "group": "charged_matches" } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "boy_shorts" ] @@ -4108,7 +4091,10 @@ "skills": [ { "level": 1, "name": "speech" }, { "level": 2, "name": "driving" } ], "vehicle": "car_sports", "items": { - "both": { "items": [ "gold_watch", "water_mineral", "smart_phone", "money_bundle", "cig", "ref_lighter" ] }, + "both": { + "items": [ "gold_watch", "water_mineral", "money_bundle", "cig" ], + "entries": [ { "group": "charged_ref_lighter" }, { "group": "charged_smart_phone" } ] + }, "male": [ "boxer_shorts", "pants", "dress_shoes", "polo_shirt", "socks" ], "female": [ "tank_top", "bra", "panties", "skirt", "heels", "jacket_leather", "stockings" ] } @@ -4125,7 +4111,7 @@ { "level": 3, "name": "mechanics" }, { "level": 3, "name": "gun" } ], - "traits": [ "PROF_HELI_PILOT" ], + "proficiencies": [ "prof_helicopter_pilot" ], "items": { "both": { "items": [ @@ -4153,5 +4139,117 @@ "female": [ "sports_bra", "boy_shorts" ] }, "flags": [ "SCEN_ONLY" ] + }, + { + "type": "profession", + "ident": "emt", + "name": "EMT", + "description": "You were responding to a call with your partner before you got separated. Now all you have is your trusty ambulance, ready to transport patients through the apocalypse.", + "points": 4, + "skills": [ + { "level": 3, "name": "driving" }, + { "level": 2, "name": "mechanics" }, + { "level": 1, "name": "electronics" }, + { "level": 3, "name": "firstaid" } + ], + "vehicle": "ambulance", + "items": { + "both": { + "items": [ "technician_shirt_gray", "pants", "socks", "gloves_medical", "multitool", "wristwatch", "boots" ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "paramedic", + "name": "Paramedic", + "description": "You were separated from your partner while out on a call. You managed to hang onto some medical supplies, but it's looking like the only life that needs saving now is yours.", + "points": 3, + "skills": [ { "level": 2, "name": "driving" }, { "level": 1, "name": "mechanics" }, { "level": 5, "name": "firstaid" } ], + "items": { + "both": { + "items": [ + "technician_shirt_gray", + "pants", + "socks", + "gloves_medical", + "wristwatch", + "boots", + "mask_dust", + "mbag", + "bandages", + "stethoscope", + "scissors", + "1st_aid", + "syringe", + "morphine" + ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "mili_medic", + "name": "Combat Medic", + "description": "You were on the front-lines when everything happened, patching up the wounded and providing support. But they wouldn't stop coming. Now you're on your own.", + "points": 5, + "skills": [ + { "level": 2, "name": "gun" }, + { "level": 2, "name": "rifle" }, + { "level": 2, "name": "melee" }, + { "level": 2, "name": "stabbing" }, + { "level": 1, "name": "dodge" }, + { "level": 4, "name": "firstaid" } + ], + "items": { + "both": { + "items": [ + "pants_army", + "undershirt", + "jacket_army", + "ballistic_vest_esapi", + "helmet_army", + "gloves_liner", + "gloves_tactical", + "socks", + "boots_combat", + "wristwatch", + "thermometer", + "bandages", + "1st_aid", + "scalpel", + "syringe", + "morphine", + "molle_pack" + ], + "entries": [ + { "group": "charged_two_way_radio" }, + { "item": "legpouch_large", "contents-group": "army_mags_m4" }, + { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, + { "item": "gloves_medical", "custom-flags": [ "no_auto_equip" ] }, + { "item": "mask_dust", "custom-flags": [ "no_auto_equip" ] }, + { "item": "stethoscope", "custom-flags": [ "no_auto_equip" ] }, + { "item": "knife_combat", "container-item": "sheath" }, + { "item": "m4a1", "ammo-item": "556", "charges": 30, "contents-item": [ "shoulder_strap", "holo_sight" ] } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "sports_bra", "boxer_shorts" ] + } + }, + { + "type": "profession", + "ident": "heroin_addict", + "name": "Heroin Addict", + "description": "The last thing you remember was meeting God behind the local Foodplace. Then people started eating each other. This doesn't feel like a fever dream.", + "points": -3, + "items": { "both": [ "shorts", "heroin", "syringe" ], "male": [ "briefs" ], "female": [ "bra", "panties" ] }, + "addictions": [ { "intensity": 40, "type": "opiate" } ] } ] diff --git a/data/json/proficiencies/misc.json b/data/json/proficiencies/misc.json new file mode 100644 index 0000000000000..5e1c79be5479d --- /dev/null +++ b/data/json/proficiencies/misc.json @@ -0,0 +1,17 @@ +[ + { + "type": "proficiency", + "id": "prof_knapping", + "name": { "str": "Knapping" } + }, + { + "type": "proficiency", + "id": "prof_blacksmithing", + "name": { "str": "Blacksmithing" } + }, + { + "type": "proficiency", + "id": "prof_helicopter_pilot", + "name": { "str": "Helicopter Piloting" } + } +] diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 200771e9c45fb..a8d29aa576dd5 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -1017,12 +1017,13 @@ "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_HEAD", "skill_used": "fabrication", - "time": "6 m", + "time": "5 m", "autolearn": true, + "reversible": true, "components": [ [ [ "hat_hard", 1 ], [ "helmet_bike", 1 ] ], [ [ "flashlight", 1 ] ], - [ [ "cordage", 1, "LIST" ], [ "duct_tape", 10 ], [ "medical_tape", 20 ] ] + [ [ "rag", 2 ], [ "leather", 2 ], [ "cordage", 1, "LIST" ], [ "duct_tape", 10 ], [ "medical_tape", 20 ] ] ] }, { diff --git a/data/json/recipes/armor/pets_horse.json b/data/json/recipes/armor/pets_horse.json index 2fb9e1057eb80..343944527e500 100644 --- a/data/json/recipes/armor/pets_horse.json +++ b/data/json/recipes/armor/pets_horse.json @@ -77,6 +77,8 @@ [ "wax", 6 ], [ "tallow", 24 ], [ "mutant_tallow", 24 ], + [ "human_tallow", 24 ], + [ "demihuman_tallow", 24 ], [ "tallow_tainted", 24 ], [ "vinegar", 30 ], [ "pine_bough", 60 ] diff --git a/data/json/recipes/armor/storage.json b/data/json/recipes/armor/storage.json index c91e914ba261e..6ce5d2eeb6df9 100644 --- a/data/json/recipes/armor/storage.json +++ b/data/json/recipes/armor/storage.json @@ -346,7 +346,7 @@ "time": "36 s", "reversible": true, "autolearn": true, - "components": [ [ [ "raw_leather", 6 ], [ "raw_hleather", 6 ], [ "raw_fur", 6 ], [ "raw_hfur", 6 ] ] ], + "components": [ [ [ "raw_leather", 6 ], [ "raw_hleather", 6 ], [ "raw_demihumanleather", 6 ], [ "raw_fur", 6 ], [ "raw_hfur", 6 ] ] ], "flags": [ "BLIND_EASY" ] }, { diff --git a/data/json/recipes/chem/fuel.json b/data/json/recipes/chem/fuel.json index ae77278af0984..0ed8983868f12 100644 --- a/data/json/recipes/chem/fuel.json +++ b/data/json/recipes/chem/fuel.json @@ -66,7 +66,6 @@ [ "edible_tallow_lard", 8, "LIST" ], [ "tallow_tainted", 8 ], [ "any_fat", 16, "LIST" ], - [ "fat_tainted", 16 ], [ "lamp_oil", 1000 ], [ "motor_oil", 1000 ] ] @@ -93,7 +92,7 @@ [ "cooking_oil", 16 ], [ "cooking_oil2", 16 ], [ "any_fat", 6, "LIST" ], - [ "fat_tainted", 6 ] + [ "ghee", 16 ] ] ], "//": "Making lamp oil from (tainted) fat directly is less efficient than using lard/tallow, but allows processing of spoilt fats. See #29770", diff --git a/data/json/recipes/chem/mutagens.json b/data/json/recipes/chem/mutagens.json index 5cafd8da8cfe9..b3d139ee8e677 100644 --- a/data/json/recipes/chem/mutagens.json +++ b/data/json/recipes/chem/mutagens.json @@ -269,7 +269,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 5 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -299,7 +299,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -329,7 +329,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 1 ], [ "meat_scrap", 10 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -359,7 +359,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -389,7 +389,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -419,7 +419,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_animal", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { @@ -543,7 +543,7 @@ "batch_time_factors": [ 80, 20 ], "book_learn": [ [ "recipe_maiar", 6 ] ], "using": [ [ "mutagen_production_standard", 25 ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ], [ "meat_scrap", 30 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], "flags": [ "SECRET" ] }, { diff --git a/data/json/recipes/food/baking.json b/data/json/recipes/food/baking.json index 6a55087e0f570..37f03ea498baf 100644 --- a/data/json/recipes/food/baking.json +++ b/data/json/recipes/food/baking.json @@ -15,9 +15,9 @@ "components": [ [ [ "flour", 4 ] ], [ [ "yeast", 2 ] ], - [ [ "apple_cider", 2 ], [ "apple", 2 ] ], - [ [ "pumpkin", 2 ] ], - [ [ "sugar", 4 ] ], + [ [ "apple_cider", 2 ], [ "apple", 2 ], [ "irradiated_apple", 2 ] ], + [ [ "pumpkin", 2 ], [ "irradiated_pumpkin", 2 ] ], + [ [ "sugar", 4 ], [ "artificial_sweetener", 4 ] ], [ [ "powder_eggs", 2 ], [ "eggs_bird", 2, "LIST" ], [ "egg_reptile", 2 ] ], [ [ "any_butter_or_oil", 2, "LIST" ] ], [ [ "salt", 2 ] ], diff --git a/data/json/recipes/food/bread.json b/data/json/recipes/food/bread.json index 004c61edfb773..bae81e2bef4d4 100644 --- a/data/json/recipes/food/bread.json +++ b/data/json/recipes/food/bread.json @@ -15,9 +15,9 @@ "components": [ [ [ "flour", 40 ] ], [ [ "yeast", 2 ] ], - [ [ "milk", 2 ], [ "milk_raw", 2 ] ], - [ [ "pumpkin", 2 ] ], - [ [ "sugar", 4 ] ], + [ [ "milk_standard_raw", 2, "LIST" ] ], + [ [ "pumpkin", 2 ], [ "irradiated_pumpkin", 2 ] ], + [ [ "sugar", 4 ], [ "artificial_sweetener", 4 ] ], [ [ "powder_eggs", 2 ], [ "eggs_bird", 2, "LIST" ], [ "egg_reptile", 2 ] ], [ [ "any_butter_or_oil", 2, "LIST" ] ], [ [ "salt", 2 ] ] diff --git a/data/json/recipes/food/brewing.json b/data/json/recipes/food/brewing.json index 450837636adda..013e218daeffa 100644 --- a/data/json/recipes/food/brewing.json +++ b/data/json/recipes/food/brewing.json @@ -27,10 +27,7 @@ "batch_time_factors": [ 50, 4 ], "book_learn": [ [ "survival_book", 3 ], [ "textbook_survival", 3 ], [ "manual_survival", 3 ], [ "dairy_book", 3 ] ], "using": [ [ "milk_standard", 15 ] ], - "components": [ - [ [ "vinegar", 3 ] ], - [ [ "wild_herbs", 40 ], [ "stomach_large", 1 ], [ "hstomach_large", 1 ], [ "stomach", 2 ], [ "hstomach", 2 ] ] - ] + "components": [ [ [ "vinegar", 3 ] ], [ [ "wild_herbs", 40 ], [ "meat_stomach", 1, "LIST" ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/food/canned.json b/data/json/recipes/food/canned.json index dce8b0130e2bd..7c88cc18b716e 100644 --- a/data/json/recipes/food/canned.json +++ b/data/json/recipes/food/canned.json @@ -15,11 +15,7 @@ "result_mult": 2, "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], - "components": [ - [ [ "water", 11 ], [ "water_clean", 11 ] ], - [ [ "jar_glass", 1 ] ], - [ [ "offal", 2 ], [ "liver", 5 ], [ "sweetbread", 5 ], [ "kidney", 5 ] ] - ] + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat_offal", 2, "LIST" ] ] ] }, { "result": "offal_canned", @@ -43,7 +39,7 @@ [ [ "canister_empty", 1 ], [ "can_food", 1 ] ], [ [ "scrap", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "offal", 1 ], [ "liver", 3 ], [ "sweetbread", 3 ], [ "kidney", 3 ] ] + [ [ "meat_offal", 1, "LIST" ] ] ] }, { @@ -64,7 +60,7 @@ "components": [ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], [ [ "jar_glass", 1 ] ], - [ [ "offal", 2 ], [ "liver", 5 ], [ "sweetbread", 5 ], [ "kidney", 5 ] ], + [ [ "meat_offal", 2, "LIST" ] ], [ [ "vinegar", 1 ] ] ] }, @@ -86,7 +82,7 @@ "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], - [ [ "meat", 1 ], [ "fish", 1 ] ], + [ [ "meat_red_raw", 1, "LIST" ], [ "fish", 1 ] ], [ [ "veggy", 1 ], [ "veggy_wild", 1 ] ] ] }, @@ -113,7 +109,7 @@ [ [ "can_medium", 1 ] ], [ [ "scrap", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "meat", 1 ], [ "fish", 1 ] ], + [ [ "meat_red_raw", 1, "LIST" ], [ "fish", 1 ] ], [ [ "veggy", 1 ], [ "veggy_wild", 1 ] ] ] }, @@ -136,7 +132,7 @@ "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], - [ [ "meat", 6 ], [ "fish", 6 ] ], + [ [ "meat_red_raw", 6, "LIST" ], [ "fish", 6 ] ], [ [ "veggy", 6 ], [ "veggy_wild", 6 ] ] ] }, @@ -156,7 +152,7 @@ "result_mult": 2, "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], - "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat", 4 ], [ "fish", 4 ] ] ] + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat_red_raw", 4, "LIST" ], [ "fish", 4 ] ] ] }, { "type": "recipe", @@ -181,7 +177,7 @@ [ [ "canister_empty", 1 ], [ "can_food", 1 ] ], [ [ "scrap", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "meat", 2 ], [ "fish", 2 ] ] + [ [ "meat_red_raw", 2, "LIST" ], [ "fish", 2 ] ] ] }, { @@ -200,7 +196,11 @@ "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], - "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "meat", 24 ], [ "fish", 24 ] ] ] + "components": [ + [ [ "water", 16 ], [ "water_clean", 16 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "meat_red_raw", 24, "LIST" ], [ "fish", 24 ] ] + ] }, { "type": "recipe", @@ -938,11 +938,7 @@ "container": "jar_3l_glass_sealed", "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], - "components": [ - [ [ "water", 16 ], [ "water_clean", 16 ] ], - [ [ "jar_3l_glass", 1 ] ], - [ [ "offal", 12 ], [ "liver", 30 ], [ "sweetbread", 30 ], [ "kidney", 30 ] ] - ] + "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "meat_offal", 12, "LIST" ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/food/frozen.json b/data/json/recipes/food/frozen.json index 8889cfa1c251a..d4a8c999cc749 100644 --- a/data/json/recipes/food/frozen.json +++ b/data/json/recipes/food/frozen.json @@ -144,7 +144,7 @@ "components": [ [ [ "icecream", 1 ], [ "icecream_artificial", 1 ] ], [ [ "chocolate", 1 ], [ "candy", 1 ], [ "candy2", 1 ], [ "candy3", 1 ], [ "maple_candy", 1 ], [ "syrup", 1 ] ], - [ [ "sugar", 5 ] ] + [ [ "sugar", 5 ], [ "artificial_sweetener", 5 ] ] ] }, { diff --git a/data/json/recipes/food/offal_dishes.json b/data/json/recipes/food/offal_dishes.json index 8915083ef24af..7df9508df6a26 100644 --- a/data/json/recipes/food/offal_dishes.json +++ b/data/json/recipes/food/offal_dishes.json @@ -20,7 +20,7 @@ "result": "lung_cooked", "qualities": [ { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], - "components": [ [ [ "lung", 1 ] ] ] + "components": [ [ [ "meat_lung", 1, "LIST" ] ] ] }, { "type": "recipe", @@ -129,7 +129,7 @@ "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "components": [ - [ [ "small_stomach_boiled", 2 ], [ "stomach_boiled", 1 ] ], + [ [ "meat_stomach_boiled", 1, "LIST" ] ], [ [ "water", 4 ], [ "water_clean", 4 ] ], [ [ "veggy_any", 2, "LIST" ], @@ -182,7 +182,7 @@ "tools": [ [ [ "surface_heat", 75, "LIST" ] ], [ [ "rock_quern", -1 ], [ "clay_quern", -1 ], [ "food_processor", 20 ] ] ], "components": [ [ [ "liver", 8 ] ], - [ [ "edible_fat", 2, "LIST" ], [ "lard", 2 ], [ "mutant_lard", 2 ] ], + [ [ "edible_fat", 2, "LIST" ], [ "edible_lard", 2, "LIST" ] ], [ [ "powder_eggs", 10 ], [ "eggs_bird", 2, "LIST" ] ], [ [ "onion", 1 ], [ "irradiated_onion", 1 ] ], [ [ "flour", 2 ] ], @@ -231,7 +231,7 @@ [ [ "salt", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "mustard", 1 ] ], - [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ] ] + [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ], [ "irradiated_tomato", 1 ] ] ] }, { @@ -307,7 +307,7 @@ "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ - [ [ "lung", 4 ] ], + [ [ "meat_lung", 4, "LIST" ] ], [ [ "flour", 4 ] ], [ [ "onion", 1 ], [ "irradiated_onion", 1 ] ], [ [ "cooking_oil", 1 ], [ "cooking_oil2", 1 ] ], @@ -315,7 +315,7 @@ [ [ "pepper", 6 ] ], [ [ "worthy_wine", 3, "LIST" ] ], [ [ "garlic_clove", 1 ] ], - [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ] ] + [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ], [ "irradiated_tomato", 1 ] ] ] }, { @@ -332,17 +332,17 @@ "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ - [ [ "lung", 4 ] ], + [ [ "meat_lung", 4, "LIST" ] ], [ [ "kidney", 4 ] ], [ [ "brain", 4 ] ], [ [ "onion", 3 ], [ "irradiated_onion", 3 ] ], [ [ "any_butter", 4, "LIST" ] ], [ [ "salt", 6 ] ], [ [ "mustard", 3 ] ], - [ [ "sugar_standard", 3, "LIST" ] ], + [ [ "sugar_standard", 3, "LIST" ], [ "artificial_sweetener", 42 ] ], [ [ "worthy_wine", 3, "LIST" ] ], [ [ "batter", 4, "LIST" ] ], - [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ] ] + [ [ "sauce_pesto", 1 ], [ "sauce_red", 1 ], [ "tomato", 1 ], [ "irradiated_tomato", 1 ] ] ] }, { @@ -385,7 +385,12 @@ "book_learn": [ [ "offalcooking", 3 ] ], "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT_FINE", "level": 1 } ], "tools": [ [ [ "funnel", -1 ] ] ], - "components": [ [ [ "stomach", 2 ], [ "stomach_large", 1 ] ], [ [ "salt", 20 ] ], [ [ "water", 2 ] ], [ [ "bag_plastic", 1 ] ] ] + "components": [ + [ [ "meat_stomach", 1, "LIST" ] ], + [ [ "salt", 20 ] ], + [ [ "water", 2 ], [ "water_clean", 2 ] ], + [ [ "bag_plastic", 1 ] ] + ] }, { "type": "recipe", diff --git a/data/json/recipes/food/other.json b/data/json/recipes/food/other.json new file mode 100644 index 0000000000000..669fae5381065 --- /dev/null +++ b/data/json/recipes/food/other.json @@ -0,0 +1,17 @@ +[ + { + "type": "recipe", + "result": "molasses", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_OTHER", + "skill_used": "cooking", + "difficulty": 3, + "time": "50 m", + "batch_time_factors": [ 20, 1 ], + "charges": 1, + "autolearn": true, + "qualities": [ { "id": "BOIL", "level": 2 } ], + "tools": [ [ [ "surface_heat", 16, "LIST" ] ] ], + "components": [ [ [ "beet_syrup", 6 ] ] ] + } +] diff --git a/data/json/recipes/other/containers.json b/data/json/recipes/other/containers.json index 6e3e135ef5672..eedc8d6b5dc44 100644 --- a/data/json/recipes/other/containers.json +++ b/data/json/recipes/other/containers.json @@ -91,8 +91,8 @@ "tools": [ [ [ "water_boiling_heat", 3, "LIST" ] ] ], "components": [ [ [ "water", 5 ], [ "water_clean", 5 ] ], - [ [ "stomach", 1 ], [ "hstomach", 1 ], [ "demihuman_stomach", 1 ] ], - [ [ "cordage_short", 2, "LIST" ], [ "filament", 50, "LIST" ] ] + [ [ "meat_stomach_small", 1, "LIST" ] ], + [ [ "cordage_short", 2, "LIST" ], [ "filament", 100, "LIST" ] ] ] }, { @@ -109,7 +109,7 @@ "tools": [ [ [ "water_boiling_heat", 4, "LIST" ] ] ], "components": [ [ [ "water", 8 ], [ "water_clean", 8 ] ], - [ [ "stomach_large", 1 ], [ "hstomach_large", 1 ], [ "demihuman_stomach_large", 1 ] ], + [ [ "meat_stomach_large", 1, "LIST" ] ], [ [ "cordage_short", 3, "LIST" ], [ "filament", 150, "LIST" ] ] ] }, diff --git a/data/json/recipes/other/medical.json b/data/json/recipes/other/medical.json index e3ca6e2b9ec27..fae569ecd4be0 100644 --- a/data/json/recipes/other/medical.json +++ b/data/json/recipes/other/medical.json @@ -51,6 +51,47 @@ "tools": [ [ [ "water_boiling_heat", 9, "LIST" ] ] ], "components": [ [ [ "bandages_makeshift", 3 ] ], [ [ "water_clean", 3 ], [ "water", 3 ] ] ] }, + { + "result": "adhesive_bandages", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MEDICAL", + "skill_used": "firstaid", + "difficulty": 1, + "time": "5 m", + "batch_time_factors": [ 50, 2 ], + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "medical_gauze", 5 ] ], [ [ "duct_tape", 20 ], [ "medical_tape", 10 ] ] ] + }, + { + "result": "tourniquet_upper", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MEDICAL", + "skill_used": "firstaid", + "difficulty": 1, + "time": "1 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ + [ "leather_belt", 1 ], + [ "hose", 1 ], + [ "rope_6", 1 ], + [ "cordage_6", 1 ], + [ "vine_6", 1 ], + [ "rope_makeshift_6", 1 ], + [ "towel", 1 ], + [ "blanket", 1 ], + [ "bandana", 1 ], + [ "cable", 1 ], + [ "wire", 1 ], + [ "tie_skinny", 1 ] + ], + [ [ "stick", 1 ], [ "cu_pipe", 1 ] ] + ] + }, { "result": "disinfectant", "type": "recipe", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index 28b875b32c929..94344672a5659 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -622,6 +622,26 @@ [ [ "steel_chunk", 12 ] ] ] }, + { + "result": "broken_robofac_laserturret_mk1", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 6, + "time": "3 h", + "using": [ [ "soldering_standard", 10 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ + [ [ "ai_module", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "targeting_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "medium_storage_battery", 1 ] ], + [ [ "power_supply", 1 ] ], + [ [ "robot_controls", 1 ] ], + [ [ "turret_chassis", 1 ] ] + ] + }, { "result": "broken_eyebot", "type": "uncraft", @@ -1158,6 +1178,183 @@ [ [ "storage_battery", 1 ] ] ] }, + { + "result": "broken_exodii_worker", + "type": "uncraft", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 9 ], [ "computer", 9 ] ], + "difficulty": 9, + "time": "8 h", + "using": [ [ "soldering_standard", 30 ], [ "welding_standard", 20 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 }, + { "id": "HAMMER", "level": 3 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ + [ [ "android_legs", 1 ] ], + [ [ "android_chassis", 1 ] ], + [ [ "android_arms", 1 ] ], + [ [ "self_monitoring_module", 1 ] ], + [ [ "exodii_sensor", 1 ] ], + [ [ "exodii_computer", 1 ] ], + [ [ "exodii_module", 2 ] ], + [ [ "exodii_motor", 6 ] ], + [ [ "power_supply", 3 ] ], + [ [ "amplifier", 1 ] ], + [ [ "e_scrap", 10 ] ], + [ [ "clockworks", 1 ] ], + [ [ "steel_chunk", 2 ] ], + [ [ "scrap", 2 ] ], + [ [ "cyborg_matrix", 1 ] ], + [ [ "storage_battery", 1 ] ], + [ [ "plut_cell", 2 ] ], + [ [ "steel_armor", 2 ] ], + [ [ "sheet_metal_small", 6 ] ], + [ [ "motor", 1 ] ], + [ [ "cable", 2 ] ], + [ [ "solder_wire", 20 ] ] + ] + }, + { + "result": "broken_exodii_quad", + "type": "uncraft", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 9 ], [ "computer", 9 ] ], + "difficulty": 9, + "time": "10 h", + "using": [ [ "soldering_standard", 60 ], [ "welding_standard", 30 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 }, + { "id": "HAMMER", "level": 3 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ + [ [ "sensor_module", 1 ] ], + [ [ "spidery_legs_big", 2 ] ], + [ [ "exodii_chassis", 1 ] ], + [ [ "targeting_module", 1 ] ], + [ [ "self_monitoring_module", 1 ] ], + [ [ "exodii_sensor", 2 ] ], + [ [ "exodii_computer", 1 ] ], + [ [ "exodii_module", 2 ] ], + [ [ "exodii_motor", 8 ] ], + [ [ "gun_module", 3 ] ], + [ [ "flamethrower", 1 ] ], + [ [ "tazer", 1 ] ], + [ [ "m4a1", 1 ] ], + [ [ "pamd68", 1 ] ], + [ [ "power_supply", 20 ] ], + [ [ "amplifier", 5 ] ], + [ [ "e_scrap", 50 ] ], + [ [ "clockworks", 4 ] ], + [ [ "steel_chunk", 10 ] ], + [ [ "scrap", 10 ] ], + [ [ "cyborg_matrix", 1 ] ], + [ [ "storage_battery", 2 ] ], + [ [ "plut_cell", 4 ] ], + [ [ "mil_plate", 2 ] ], + [ [ "hard_steel_armor", 10 ] ], + [ [ "sheet_metal_small", 40 ] ], + [ [ "motor", 1 ] ], + [ [ "cable", 10 ] ], + [ [ "omnicamera", 1 ] ], + [ [ "betavoltaic", 20 ] ], + [ [ "solder_wire", 20 ] ] + ] + }, + { + "result": "broken_exodii_turret", + "type": "uncraft", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 9 ], [ "computer", 9 ] ], + "difficulty": 9, + "time": "8 h", + "using": [ [ "soldering_standard", 60 ], [ "welding_standard", 30 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 }, + { "id": "HAMMER", "level": 3 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ + [ [ "turret_chassis", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "self_monitoring_module", 1 ] ], + [ [ "exodii_computer", 1 ] ], + [ [ "exodii_module", 3 ] ], + [ [ "exodii_sensor", 2 ] ], + [ [ "exodii_motor", 4 ] ], + [ [ "gun_module", 2 ] ], + [ [ "targeting_module", 1 ] ], + [ [ "pamd68", 1 ] ], + [ [ "flamethrower", 1 ] ], + [ [ "storage_battery", 1 ] ], + [ [ "plut_cell", 4 ] ], + [ [ "power_supply", 10 ] ], + [ [ "amplifier", 3 ] ], + [ [ "e_scrap", 30 ] ], + [ [ "clockworks", 6 ] ], + [ [ "steel_chunk", 10 ] ], + [ [ "scrap", 15 ] ], + [ [ "mil_plate", 2 ] ], + [ [ "hard_steel_armor", 6 ] ], + [ [ "sheet_metal_small", 40 ] ], + [ [ "motor", 1 ] ], + [ [ "cable", 25 ] ], + [ [ "omnicamera", 1 ] ], + [ [ "betavoltaic", 40 ] ], + [ [ "solder_wire", 20 ] ] + ] + }, + { + "result": "broken_exodii_sniper_drone", + "type": "uncraft", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 9 ], [ "computer", 9 ] ], + "difficulty": 9, + "time": "8 h", + "using": [ [ "soldering_standard", 50 ], [ "welding_standard", 20 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 }, + { "id": "HAMMER", "level": 3 }, + { "id": "SAW_M", "level": 1 } + ], + "components": [ + [ [ "exodii_drone_chassis", 1 ] ], + [ [ "exodii_computer", 1 ] ], + [ [ "exodii_module", 1 ] ], + [ [ "exodii_sensor", 1 ] ], + [ [ "exodii_motor", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "targeting_module", 1 ] ], + [ [ "pamd71z", 1 ] ], + [ [ "small_storage_battery", 1 ] ], + [ [ "plut_cell", 2 ] ], + [ [ "power_supply", 1 ] ], + [ [ "amplifier", 1 ] ], + [ [ "e_scrap", 20 ] ], + [ [ "clockworks", 2 ] ], + [ [ "scrap", 10 ] ], + [ [ "sheet_metal_small", 20 ] ], + [ [ "quad_rotors", 2 ] ], + [ [ "omnicamera", 1 ] ], + [ [ "betavoltaic", 5 ] ], + [ [ "plastic_sheet", 8 ] ], + [ [ "solder_wire", 3 ] ] + ] + }, { "result": "broken_dispatch_military", "type": "uncraft", @@ -1179,7 +1376,8 @@ [ [ "plut_cell", 1 ] ], [ [ "broken_manhack", 4 ] ], [ [ "omnicamera", 1 ] ], - [ [ "storage_battery", 1 ] ] + [ [ "storage_battery", 1 ] ], + [ [ "solder_wire", 20 ] ] ] }, { @@ -3347,12 +3545,31 @@ [ [ "aspirin", 10 ] ], [ [ "disinfectant", 10 ] ], [ [ "saline", 5 ] ], - [ [ "bandages", 6 ] ], + [ [ "adhesive_bandages", 6 ] ], + [ [ "bandages", 3 ] ], [ [ "medical_gauze", 6 ] ], [ [ "booklet_firstaid", 1 ] ] ], "flags": [ "BLIND_EASY", "UNCRAFT_LIQUIDS_CONTAINED" ] }, + { + "result": "ifak", + "type": "uncraft", + "time": "6 s", + "components": [ + [ [ "medical_tape", 20 ] ], + [ [ "tourniquet_upper", 1 ] ], + [ [ "disinfectant", 5 ] ], + [ [ "quikclot", 5 ] ], + [ [ "bandages", 9 ] ], + [ [ "medical_gauze", 3 ] ], + [ [ "adhesive_bandages", 3 ] ], + [ [ "pur_tablets", 3 ] ], + [ [ "gloves_medical", 1 ] ], + [ [ "scissors", 1 ] ] + ], + "flags": [ "BLIND_EASY", "UNCRAFT_LIQUIDS_CONTAINED" ] + }, { "result": "survival_kit", "type": "uncraft", @@ -3571,6 +3788,26 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "rag", 25 ] ], [ [ "element", 5 ] ], [ [ "cable", 5 ] ] ] }, + { + "result": "wearable_light", + "type": "uncraft", + "skill_used": "fabrication", + "time": "30 s", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "flashlight", 1 ] ], [ [ "rag", 2 ] ] ] + }, + { + "result": "miner_hat", + "type": "uncraft", + "skill_used": "fabrication", + "time": "30 s", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "hat_hard", 1 ], [ "helmet_bike", 1 ] ], + [ [ "flashlight", 1 ] ], + [ [ "rag", 2 ], [ "leather", 2 ], [ "cordage", 1, "LIST" ], [ "duct_tape", 10 ], [ "medical_tape", 20 ] ] + ] + }, { "result": "adobe_pallet_done", "type": "uncraft", diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 72efc1959606a..10e1058db472e 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -48,7 +48,7 @@ "skill_used": "cooking", "time": "5 m", "autolearn": true, - "batch_time_factors": [ 80, 4 ], + "batch_time_factors": [ 20, 1 ], "qualities": [ { "id": "BOIL", "level": 1 } ], "tools": [ [ [ "water_boiling_heat", 3, "LIST" ] ] ], "components": [ [ [ "water", 1 ] ] ] @@ -1247,6 +1247,36 @@ [ [ "nachos", 3 ] ] ] }, + { + "type": "recipe", + "result": "nachosv", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_SNACK", + "skill_used": "cooking", + "time": "20 m", + "charges": 5, + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], + "components": [ [ [ "can_beans", 2 ], [ "beans_cooked", 2 ] ], [ [ "nachos", 3 ] ] ] + }, + { + "type": "recipe", + "result": "nachosvc", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_SNACK", + "skill_used": "cooking", + "time": "20 m", + "charges": 3, + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], + "components": [ + [ [ "can_beans", 2 ], [ "beans_cooked", 2 ] ], + [ [ "cheese", 1 ], [ "cheese_hard", 1 ], [ "can_cheese", 1 ] ], + [ [ "nachos", 3 ] ] + ] + }, { "type": "recipe", "result": "fresh_fries", @@ -4296,11 +4326,11 @@ "book_learn": [ [ "family_cookbook", 2 ], [ "mag_cooking", 2 ] ], "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ - [ [ "fish_cooked", 1 ], [ "fish_fried", 1 ], [ "can_salmon", 1 ] ], + [ [ "fish_cooked", 1 ], [ "can_salmon", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "spinach", 1 ] ], [ [ "cooking_oil", 1 ] ], - [ [ "lemon", 1 ] ], + [ [ "lemon", 1 ], [ "irradiated_lemon", 1 ] ], [ [ "vinegar", 1 ] ], [ [ "scrambled_eggs", 1 ], [ "boiled_egg", 1 ] ] ] @@ -4679,7 +4709,7 @@ "skill_used": "cooking", "time": "1 m", "book_learn": [ [ "mag_glam", 1 ] ], - "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "any_butter", 4, "LIST" ], [ "ghee", 4 ] ], [ [ "sprinkles", 3 ] ] ] + "components": [ [ [ "bread_sandwich", 1, "LIST" ] ], [ [ "any_butter", 1, "LIST" ] ], [ [ "sprinkles", 3 ] ] ] }, { "type": "recipe", @@ -5473,16 +5503,9 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ - [ "stomach", 1 ], - [ "stomach_large", 1 ], - [ "hstomach", 1 ], - [ "hstomach_large", 1 ], - [ "demihuman_stomach", 1 ], - [ "demihuman_stomach_large", 1 ] - ], - [ [ "offal", 1 ], [ "liver", 2 ], [ "lung", 2 ], [ "kidney", 2 ] ], - [ [ "oatmeal", 2 ], [ "buckwheat", 1 ] ] + [ [ "meat_stomach_small", 1, "LIST" ] ], + [ [ "meat_offal", 1, "LIST" ] ], + [ [ "oatmeal", 16 ], [ "buckwheat", 1 ] ] ] }, { @@ -5503,16 +5526,9 @@ "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "water", 2 ], [ "water_clean", 2 ] ], - [ - [ "stomach", 2 ], - [ "stomach_large", 1 ], - [ "hstomach", 2 ], - [ "hstomach_large", 1 ], - [ "demihuman_stomach", 2 ], - [ "demihuman_stomach_large", 1 ] - ], - [ [ "offal", 2 ], [ "liver", 4 ], [ "lung", 4 ], [ "kidney", 4 ] ], - [ [ "oatmeal", 4 ], [ "buckwheat", 1 ] ] + [ [ "meat_stomach_large", 1, "LIST" ] ], + [ [ "meat_offal", 2, "LIST" ] ], + [ [ "oatmeal", 32 ], [ "buckwheat", 2 ] ] ] }, { @@ -5750,7 +5766,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "tools": [ [ [ "food_processor", 20 ] ] ], - "components": [ [ [ "bone", 1 ] ] ] + "components": [ [ [ "bone", 1 ], [ "bone_human", 1 ] ] ] }, { "result": "meal_bone_tainted", @@ -5886,7 +5902,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "tools": [ [ [ "food_processor", 20 ] ] ], - "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ] ] ] + "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ], [ "endochitin", 1 ] ] ] }, { "result": "chilly-p", @@ -5916,8 +5932,8 @@ "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 10 ] ] ], "components": [ - [ [ "offal", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], - [ [ "stomach", 2 ], [ "stomach_large", 1 ] ], + [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], + [ [ "meat_stomach", 1, "LIST" ] ], [ [ "salt_water", 4 ], [ "saline", 8 ], @@ -5960,8 +5976,8 @@ "batch_time_factors": [ 50, 3 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], "components": [ - [ [ "offal", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], - [ [ "stomach", 2 ], [ "stomach_large", 1 ] ], + [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], + [ [ "meat_stomach", 1, "LIST" ] ], [ [ "salt_water", 4 ], [ "saline", 8 ], @@ -6262,7 +6278,7 @@ "//": "Making the very first starter is a lot more finnicky than splitting it once it's mature.", "autolearn": true, "qualities": [ { "id": "CONTAIN", "level": 1 } ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "flour", 4 ] ] ] + "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "flour", 4 ] ] ] }, { "type": "recipe", @@ -6275,7 +6291,7 @@ "result_mult": 2, "autolearn": true, "qualities": [ { "id": "CONTAIN", "level": 1 } ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "flour", 4 ] ], [ [ "sourdough_starter", 1 ] ] ] + "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "flour", 4 ] ], [ [ "sourdough_starter", 1 ] ] ] }, { "type": "recipe", @@ -6290,7 +6306,13 @@ "autolearn": true, "qualities": [ { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], - "components": [ [ [ "flour", 10 ] ], [ [ "sourdough_starter", 1 ] ], [ [ "water", 3 ], [ "water_clean", 3 ] ] ] + "//": "The single water_clean here is for feeding the new starter.", + "components": [ + [ [ "flour", 10 ] ], + [ [ "sourdough_starter", 1 ] ], + [ [ "water", 2 ], [ "water_clean", 2 ] ], + [ [ "water_clean", 1 ] ] + ] }, { "type": "recipe", @@ -6507,7 +6529,7 @@ "components": [ [ [ "horseradish_root", 1 ] ], [ [ "salt", 1 ], [ "seasoning_salt", 1 ] ], - [ [ "sugar", 4 ] ], + [ [ "sugar", 4 ], [ "artificial_sweetener", 4 ] ], [ [ "water_clean", 1 ] ] ] }, @@ -6554,7 +6576,7 @@ [ [ "mustard_powder", 20 ] ], [ [ "salt", 2 ], [ "seasoning_salt", 2 ] ], [ [ "vinegar", 1 ] ], - [ [ "sugar", 1 ] ], + [ [ "sugar", 1 ], [ "artificial_sweetener", 1 ] ], [ [ "water_clean", 1 ] ] ] }, diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index 17261fd56247b..a9fe058d18c81 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -227,7 +227,11 @@ [ "isherwood_herbal_remedies", 2 ] ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], - "components": [ [ [ "meal_bone", 1 ] ], [ [ "dry_fruit", 1 ], [ "sugar", 45 ] ], [ [ "water_clean", 1 ] ] ] + "components": [ + [ [ "meal_bone", 1 ] ], + [ [ "dry_fruit", 1 ], [ "sugar", 45 ], [ "artificial_sweetener", 45 ] ], + [ [ "water_clean", 1 ] ] + ] }, { "type": "recipe", diff --git a/data/json/recipes/recipe_obsolete.json b/data/json/recipes/recipe_obsolete.json index 1cb21d004dbb5..2d9f696a4e43d 100644 --- a/data/json/recipes/recipe_obsolete.json +++ b/data/json/recipes/recipe_obsolete.json @@ -2499,5 +2499,10 @@ "type": "recipe", "result": "bone_plate", "obsolete": true + }, + { + "type": "recipe", + "result": "slam_shotgun", + "obsolete": true } ] diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index e133f16a8c9c8..60147c164d97d 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -274,7 +274,7 @@ "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], "tools": [ [ [ "rock_quern", -1 ], [ "clay_quern", -1 ] ] ], - "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ] ] ] + "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ], [ "endochitin", 1 ] ] ] }, { "type": "recipe", @@ -290,7 +290,7 @@ "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], "tools": [ [ [ "mortar_pestle", -1 ] ] ], - "components": [ [ [ "chitin_piece", 1 ] ] ] + "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ], [ "endochitin", 1 ] ] ] }, { "type": "recipe", @@ -452,7 +452,7 @@ "subcategory": "CSC_OTHER_TOOLS", "skill_used": "fabrication", "difficulty": 1, - "time": "20 m", + "time": "5 m", "reversible": true, "autolearn": true, "qualities": [ { "id": "CUT", "level": 1 } ], @@ -491,6 +491,7 @@ "difficulty": 2, "time": "25 m", "autolearn": true, + "reversible": true, "using": [ [ "soldering_standard", 10 ] ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], "components": [ @@ -776,6 +777,7 @@ "difficulty": 3, "time": "1 h", "autolearn": true, + "proficiencies": [ { "proficiency": "prof_knapping", "required": true } ], "book_learn": [ [ "mag_survival", 1 ], [ "atomic_survival", 1 ], [ "textbook_carpentry", 2 ] ], "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ @@ -984,7 +986,7 @@ "time": "7 m", "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 1 ] ], [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + "components": [ [ [ "pipe", 1 ] ], [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ], [ [ "pipe_fittings", 1 ] ] ] }, { "type": "recipe", @@ -1026,7 +1028,7 @@ "decomp_learn": 1, "autolearn": true, "using": [ [ "welding_standard", 5 ] ], - "components": [ [ [ "pipe", 8 ] ], [ [ "sheet_metal", 2 ] ], [ [ "sheet_metal_small", 4 ] ] ] + "components": [ [ [ "pipe", 8 ] ], [ [ "sheet_metal", 2 ] ], [ [ "sheet_metal_small", 4 ] ], [ [ "pipe_fittings", 4 ] ] ] }, { "type": "recipe", @@ -1039,7 +1041,7 @@ "reversible": true, "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "WRENCH", "level": 1 } ], - "components": [ [ [ "pipe", 1 ] ], [ [ "steel_chunk", 2 ], [ "scrap", 6 ] ], [ [ "chain", 1 ] ] ] + "components": [ [ [ "pipe", 1 ] ], [ [ "steel_chunk", 2 ], [ "scrap", 6 ] ], [ [ "chain", 1 ] ], [ [ "pipe_fittings", 2 ] ] ] }, { "type": "recipe", @@ -1053,7 +1055,7 @@ "autolearn": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal_small", 5 ] ] ] + "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal_small", 5 ] ], [ [ "pipe_fittings", 1 ] ] ] }, { "type": "recipe", @@ -1066,7 +1068,7 @@ "reversible": true, "autolearn": true, "using": [ [ "sewing_standard", 50 ], [ "welding_standard", 5 ] ], - "components": [ [ [ "pipe", 4 ] ], [ [ "spring", 2 ] ], [ [ "rag", 20 ], [ "sheet", 1 ] ] ] + "components": [ [ [ "pipe", 4 ] ], [ [ "spring", 2 ] ], [ [ "rag", 20 ], [ "sheet", 1 ] ], [ [ "pipe_fittings", 4 ] ] ] }, { "type": "recipe", @@ -1083,6 +1085,7 @@ [ [ "pipe", 4 ] ], [ [ "spring", 2 ] ], [ [ "leather", 12 ], [ "fur", 12 ], [ "tanned_hide", 3 ], [ "tanned_pelt", 3 ] ], + [ [ "pipe_fittings", 4 ] ], [ [ "rag", 8 ] ] ] }, @@ -1192,7 +1195,13 @@ "book_learn": [ [ "textbook_fabrication", 5 ], [ "textbook_mechanics", 3 ], [ "manual_mechanics", 3 ] ], "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 }, { "id": "WRENCH", "level": 1 } ], - "components": [ [ [ "pipe", 6 ] ], [ [ "steel_chunk", 4 ], [ "scrap", 12 ] ], [ [ "wire", 3 ] ], [ [ "cable", 10 ] ] ] + "components": [ + [ [ "pipe", 6 ] ], + [ [ "steel_chunk", 4 ], [ "scrap", 12 ] ], + [ [ "wire", 3 ] ], + [ [ "cable", 10 ] ], + [ [ "pipe_fittings", 4 ] ] + ] }, { "type": "recipe", @@ -1575,7 +1584,7 @@ "decomp_learn": 2, "autolearn": true, "using": [ [ "cordage", 1 ] ], - "components": [ [ [ "shotgun_d", 1 ] ], [ [ "shot_00", 2 ], [ "shot_slug", 2 ], [ "shot_flechette", 2 ] ] ] + "components": [ [ [ "slamfire_shotgun_d", 1 ] ], [ [ "shot_00", 2 ], [ "shot_slug", 2 ], [ "shot_flechette", 2 ] ] ] }, { "type": "recipe", @@ -2135,7 +2144,7 @@ "autolearn": true, "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 2 } ], "tools": [ [ [ "forge", 150 ], [ "oxy_torch", 30 ] ] ], - "components": [ [ [ "steel_lump", 1 ], [ "steel_chunk", 4 ], [ "scrap", 12 ], [ "pipe", 3 ] ] ] + "components": [ [ [ "steel_lump", 1 ], [ "steel_chunk", 4 ], [ "scrap", 12 ], [ "pipe", 3 ], [ "pipe_fittings", 1 ] ] ] }, { "type": "recipe", @@ -2660,7 +2669,8 @@ [ [ "pilot_light", 1 ] ], [ [ "steel_lump", 3 ], [ "steel_chunk", 12 ], [ "scrap", 36 ] ], [ [ "metal_tank_little", 1 ] ], - [ [ "pipe", 3 ] ] + [ [ "pipe", 3 ] ], + [ [ "pipe_fittings", 2 ] ] ] }, { @@ -2753,7 +2763,8 @@ [ [ "cable", 4 ] ], [ [ "power_supply", 1 ] ], [ [ "metal_tank_little", 1 ] ], - [ [ "pipe", 8 ] ] + [ [ "pipe", 8 ] ], + [ [ "pipe_fittings", 4 ] ] ] }, { @@ -2814,7 +2825,12 @@ { "id": "WRENCH", "level": 1 } ], "tools": [ [ [ "welder", 150 ], [ "welder_crude", 225 ], [ "toolset", 225 ], [ "soldering_iron", 225 ], [ "oxy_torch", 30 ] ] ], - "components": [ [ [ "steel_lump", 5 ], [ "steel_chunk", 20 ], [ "scrap", 60 ] ], [ [ "metal_tank_little", 1 ] ], [ [ "pipe", 6 ] ] ] + "components": [ + [ [ "steel_lump", 5 ], [ "steel_chunk", 20 ], [ "scrap", 60 ] ], + [ [ "metal_tank_little", 1 ] ], + [ [ "pipe", 6 ] ], + [ [ "pipe_fittings", 4 ] ] + ] }, { "type": "recipe", @@ -3092,12 +3108,12 @@ "category": "CC_OTHER", "subcategory": "CSC_OTHER_TOOLS", "skill_used": "fabrication", - "difficulty": 3, - "time": "30 m", + "difficulty": 1, + "autolearn": true, + "time": "2 m", "reversible": true, "book_learn": [ [ "mag_survival", 4 ], [ "atomic_survival", 3 ], [ "textbook_survival", 2 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "rope_superior", 1, "LIST" ] ], [ [ "scrap", 4 ] ] ] + "components": [ [ [ "rope_superior", 1, "LIST" ] ], [ [ "grip_hook", 4 ] ] ] }, { "type": "recipe", @@ -3642,7 +3658,7 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "salt_water", 1 ], [ "saline", 2 ], [ "salt", 2 ] ], - [ [ "raw_leather", 1 ], [ "raw_tainted_leather", 1 ], [ "raw_hleather", 1 ] ] + [ [ "raw_leather", 1 ], [ "raw_tainted_leather", 1 ], [ "raw_hleather", 1 ], [ "raw_demihumanleather", 1 ] ] ] }, { @@ -4153,7 +4169,14 @@ "reversible": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "steel_plate", 2 ] ], [ [ "frame", 1 ] ], [ [ "wheel", 1 ] ], [ [ "motor", 1 ] ] ] + "components": [ + [ [ "pipe", 2 ] ], + [ [ "steel_plate", 2 ] ], + [ [ "frame", 1 ] ], + [ [ "wheel", 1 ] ], + [ [ "motor", 1 ] ], + [ [ "pipe_fittings", 2 ] ] + ] }, { "type": "recipe", @@ -4296,6 +4319,42 @@ "components": [ [ [ "felt_patch", 10 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "bundle_plank", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "time": "1 m", + "autolearn": true, + "reversible": true, + "components": [ [ [ "2x4", 10 ] ], [ [ "rope_any_short", 1, "LIST" ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "bundle_branch", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "time": "1 m", + "autolearn": true, + "reversible": true, + "components": [ [ [ "stick", 10 ] ], [ [ "rope_any_short", 1, "LIST" ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "bundle_branch_long", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "time": "1 m", + "autolearn": true, + "reversible": true, + "components": [ [ [ "stick_long", 5 ] ], [ [ "rope_any_short", 2, "LIST" ] ] ], + "flags": [ "BLIND_EASY" ] + }, { "type": "recipe", "result": "metal_butcher_rack", @@ -4319,7 +4378,8 @@ [ [ "nail", 12 ] ], [ [ "wire", 6 ], [ "rope_6", 6 ], [ "vine_6", 6 ], [ "rope_makeshift_6", 6 ] ], [ [ "chain", 1 ], [ "rope_natural", 1, "LIST" ] ], - [ [ "spike", 2 ] ] + [ [ "spike", 2 ] ], + [ [ "pipe_fittings", 24 ] ] ] }, { @@ -4344,7 +4404,8 @@ [ [ "pipe", 15 ], [ "cu_pipe", 15 ], [ "frame", 2 ] ], [ [ "nail", 12 ] ], [ [ "wire", 6 ], [ "rope_natural_short", 6, "LIST" ] ], - [ [ "spike", 4 ] ] + [ [ "spike", 4 ] ], + [ [ "pipe_fittings", 30 ] ] ] }, { @@ -4358,7 +4419,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", 1 ] ] ] + "components": [ [ [ "scrap", 6 ] ], [ [ "pipe", 6 ] ], [ [ "nail", 12 ] ], [ [ "sheet_metal", 1 ] ], [ [ "pipe_fittings", 6 ] ] ] }, { "type": "recipe", @@ -4562,5 +4623,33 @@ "autolearn": true, "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "sheet_metal", -1 ] ], [ [ "forge", 75 ] ] ], "components": [ [ [ "plastic_chunk", 200 ] ] ] + }, + { + "type": "recipe", + "result": "funnel_separation", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "1 h", + "book_learn": [ [ "glassblowing_book", 5 ] ], + "qualities": [ { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "pipe", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 75 ] ] ], + "components": [ + [ [ "glass_shard", 3 ], [ "pipe_glass", 1 ], [ "flask_glass", 3 ], [ "test_tube", 6 ], [ "marble", 75 ] ], + [ [ "stopcock", 1 ] ] + ] + }, + { + "type": "recipe", + "result": "stopcock", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_OTHER", + "skill_used": "fabrication", + "difficulty": 4, + "time": "30 m", + "autolearn": true, + "tools": [ [ [ "mold_plastic", -1 ] ], [ [ "surface_heat", 5, "LIST" ] ] ], + "components": [ [ [ "plastic_chunk", 1 ] ] ] } ] diff --git a/data/json/recipes/recipe_vehicle.json b/data/json/recipes/recipe_vehicle.json index bf1e03435106e..85624474a32ac 100644 --- a/data/json/recipes/recipe_vehicle.json +++ b/data/json/recipes/recipe_vehicle.json @@ -464,6 +464,23 @@ "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 1 } ], "components": [ [ [ "nail", 4 ] ], [ [ "2x4", 2 ] ], [ [ "stick", 2 ], [ "2x4", 2 ] ], [ [ "towel", 3 ] ] ] }, + { + "type": "recipe", + "result": "wheel_mount_wood", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_VEHICLE", + "skill_used": "mechanics", + "skills_required": [ "fabrication", 4 ], + "difficulty": 2, + "time": "30 m", + "autolearn": true, + "qualities": [ { "id": "DRILL", "level": 2 }, { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 2 } ], + "components": [ [ [ "nail", 50 ] ], [ [ "2x4", 5 ] ], [ [ "cordage_36", 1 ] ], [ [ "scrap", 5 ], [ "steel_chunk", 4 ] ] ], + "tools": [ + [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], + [ [ "welder", 30 ], [ "welder_crude", 40 ], [ "toolset", 40 ], [ "forge", 20 ], [ "oxy_torch", 5 ] ] + ] + }, { "type": "recipe", "result": "wheel_mount_light", @@ -634,6 +651,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "45 m", + "proficiencies": [ { "proficiency": "prof_blacksmithing", "time_multiplier": 10.0 } ], "reversible": true, "autolearn": true, "using": [ [ "steel_standard", 20 ] ], @@ -651,6 +669,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "1 h 30 m", + "proficiencies": [ { "proficiency": "prof_blacksmithing", "time_multiplier": 10.0 } ], "reversible": true, "autolearn": true, "qualities": [ { "id": "GLARE", "level": 2 } ], diff --git a/data/json/recipes/recipe_weapon.json b/data/json/recipes/recipe_weapon.json index ca4668cdb0a11..a7eba09f741dd 100644 --- a/data/json/recipes/recipe_weapon.json +++ b/data/json/recipes/recipe_weapon.json @@ -1582,7 +1582,6 @@ "autolearn": true, "using": [ [ "blacksmithing_standard", 3 ], [ "steel_tiny", 3 ] ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CHISEL", "level": 3 } ], - "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ] ] }, { diff --git a/data/json/recipes/weapon/ranged.json b/data/json/recipes/weapon/ranged.json index cdf1df3b28f6e..ac8a885227af8 100644 --- a/data/json/recipes/weapon/ranged.json +++ b/data/json/recipes/weapon/ranged.json @@ -260,13 +260,13 @@ }, { "type": "recipe", - "result": "slam_shotgun", + "result": "slamfire_shotgun", "category": "CC_WEAPON", "subcategory": "CSC_WEAPON_RANGED", "skill_used": "mechanics", "skills_required": [ [ "gun", 1 ] ], "difficulty": 1, - "time": "2 h", + "time": "4 h", "autolearn": true, "book_learn": [ [ "manual_shotgun", 1 ] ], "qualities": [ @@ -274,7 +274,7 @@ { "id": "GLARE", "level": 2 }, { "id": "HAMMER", "level": 2 }, { "id": "FILE", "level": 1 }, - { "id": "WELD", "level": 2 } + { "id": "WELD", "level": 1 } ], "tools": [ [ @@ -301,5 +301,193 @@ ] ], "components": [ [ [ "pipe", 2 ] ], [ [ "nail", 1 ] ], [ [ "scrap", 3 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun", + "id_suffix": "without_welding", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "time": "2 h", + "autolearn": true, + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "DRILL", "level": 2 } + ], + "tools": [ + [ + [ "shot_00", -1 ], + [ "shot_bird", -1 ], + [ "shot_dragon", -1 ], + [ "shot_flechette", -1 ], + [ "shot_slug", -1 ], + [ "shot_scrap", -1 ], + [ "shot_he", -1 ], + [ "shot_beanbag", -1 ], + [ "reloaded_shot_00", -1 ], + [ "reloaded_shot_bird", -1 ], + [ "reloaded_shot_dragon", -1 ], + [ "reloaded_shot_flechette", -1 ], + [ "reloaded_shot_slug", -1 ], + [ "bp_shot_00", -1 ], + [ "bp_shot_bird", -1 ], + [ "bp_shot_dragon", -1 ], + [ "bp_shot_flechette", -1 ], + [ "bp_shot_slug", -1 ], + [ "bp_shot_scrap", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 2 ] ], [ [ "nail", 1 ] ], [ [ "pipe_fittings", 1 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "with_tape", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "time": "1 h", + "autolearn": true, + "components": [ [ [ "four_winds_shotgun", 2 ] ], [ [ "duct_tape", 100 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "difficulty": 2, + "time": "6 h", + "autolearn": true, + "book_learn": [ [ "manual_shotgun", 1 ] ], + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "GLARE", "level": 2 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WELD", "level": 1 } + ], + "tools": [ + [ + [ "shot_00", -1 ], + [ "shot_bird", -1 ], + [ "shot_dragon", -1 ], + [ "shot_flechette", -1 ], + [ "shot_slug", -1 ], + [ "shot_scrap", -1 ], + [ "shot_he", -1 ], + [ "shot_beanbag", -1 ], + [ "reloaded_shot_00", -1 ], + [ "reloaded_shot_bird", -1 ], + [ "reloaded_shot_dragon", -1 ], + [ "reloaded_shot_flechette", -1 ], + [ "reloaded_shot_slug", -1 ], + [ "bp_shot_00", -1 ], + [ "bp_shot_bird", -1 ], + [ "bp_shot_dragon", -1 ], + [ "bp_shot_flechette", -1 ], + [ "bp_shot_slug", -1 ], + [ "bp_shot_scrap", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 4 ] ], [ [ "nail", 2 ] ], [ [ "scrap", 6 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "welded_together", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "difficulty": 2, + "time": "6 h", + "autolearn": true, + "book_learn": [ [ "manual_shotgun", 1 ] ], + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "GLARE", "level": 2 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WELD", "level": 1 } + ], + "tools": [ + [ + [ "shot_00", -1 ], + [ "shot_bird", -1 ], + [ "shot_dragon", -1 ], + [ "shot_flechette", -1 ], + [ "shot_slug", -1 ], + [ "shot_scrap", -1 ], + [ "shot_he", -1 ], + [ "shot_beanbag", -1 ], + [ "reloaded_shot_00", -1 ], + [ "reloaded_shot_bird", -1 ], + [ "reloaded_shot_dragon", -1 ], + [ "reloaded_shot_flechette", -1 ], + [ "reloaded_shot_slug", -1 ], + [ "bp_shot_00", -1 ], + [ "bp_shot_bird", -1 ], + [ "bp_shot_dragon", -1 ], + [ "bp_shot_flechette", -1 ], + [ "bp_shot_slug", -1 ], + [ "bp_shot_scrap", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "four_winds_shotgun", 2 ] ], [ [ "scrap", 1 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "bolted_and_welded", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "time": "2 h", + "autolearn": true, + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "DRILL", "level": 2 }, + { "id": "WELD", "level": 1 } + ], + "tools": [ + [ + [ "shot_00", -1 ], + [ "shot_bird", -1 ], + [ "shot_dragon", -1 ], + [ "shot_flechette", -1 ], + [ "shot_slug", -1 ], + [ "shot_scrap", -1 ], + [ "shot_he", -1 ], + [ "shot_beanbag", -1 ], + [ "reloaded_shot_00", -1 ], + [ "reloaded_shot_bird", -1 ], + [ "reloaded_shot_dragon", -1 ], + [ "reloaded_shot_flechette", -1 ], + [ "reloaded_shot_slug", -1 ], + [ "bp_shot_00", -1 ], + [ "bp_shot_bird", -1 ], + [ "bp_shot_dragon", -1 ], + [ "bp_shot_flechette", -1 ], + [ "bp_shot_slug", -1 ], + [ "bp_shot_scrap", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 4 ] ], [ [ "nail", 2 ] ], [ [ "pipe_fittings", 2 ] ], [ [ "scrap", 3 ] ] ] } ] diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 4d45cca7a5304..3b0ec60531d91 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -499,8 +499,8 @@ "mx_prison_bus": 15 } }, + "bridgehead_ground": { "chance": 5, "extras": { "mx_minefield": 100 } }, "road_nesw_manhole": { "chance": 20, "extras": { "mx_city_trap": 100 } }, - "bridge": { "chance": 5, "extras": { "mx_minefield": 100 } }, "build": { "chance": 90, "extras": { @@ -918,7 +918,22 @@ "base_acid": 0.0, "base_wind": 3.4, "base_wind_distrib_peaks": 80, - "base_wind_season_variation": 50 + "base_wind_season_variation": 50, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "acid_drizzle", + "acid_rain", + "flurries", + "snowing", + "snowstorm" + ] }, "overmap_feature_flag_settings": { "clear_blacklist": false, "blacklist": [ ], "clear_whitelist": false, "whitelist": [ ] } } diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index 832f913805a87..c1e103dddfc8f 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -167,13 +167,22 @@ "id": "meat_offal", "type": "requirement", "//": "Anything you might consider offal or intestines.", - "components": [ [ [ "lung", 4 ], [ "liver", 4 ], [ "kidney", 4 ], [ "sweetbread", 4 ], [ "offal", 1 ] ] ] + "components": [ + [ + [ "meat_lung", 4, "LIST" ], + [ "liver", 4 ], + [ "kidney", 4 ], + [ "sweetbread", 4 ], + [ "offal", 1 ], + [ "mutant_bug_organs", 1 ] + ] + ] }, { "id": "meat_raw_steak", "type": "requirement", "//": "An unbroken slab of raw meat. For when scraps just aren't good enough.", - "components": [ [ [ "meat", 1 ], [ "mutant_meat", 1 ], [ "human_flesh", 1 ], [ "mutant_human_flesh", 1 ] ] ] + "components": [ [ [ "meat", 1 ], [ "mutant_meat", 1 ], [ "human_flesh", 1 ], [ "mutant_human_flesh", 1 ], [ "demihuman_flesh", 1 ] ] ] }, { "id": "meat_red_raw", @@ -187,6 +196,51 @@ "//": "Anything you might consider raw 'red' meat. About 250mL of meat.", "components": [ [ [ "meat_red_raw", 1, "LIST" ], [ "rehydrated_meat", 1 ], [ "meat_canned", 1 ] ] ] }, + { + "id": "meat_lung", + "type": "requirement", + "//": "Anything you might consider raw lung. About 250mL of lungs.", + "components": [ [ [ "lung", 1 ], [ "mutant_bug_lungs", 1 ] ] ] + }, + { + "id": "meat_stomach", + "type": "requirement", + "//": "Anything you might consider a raw stomach. About 500mL of stomachs.", + "components": [ [ [ "meat_stomach_small", 2, "LIST" ], [ "meat_stomach_large", 1, "LIST" ] ] ] + }, + { + "id": "meat_stomach_cooked", + "type": "requirement", + "//": "Anything you might consider a cooked stomach. About 500mL of stomachs.", + "components": [ [ [ "meat_stomach_small", 2, "LIST" ], [ "meat_stomach_large", 1, "LIST" ] ] ] + }, + { + "id": "meat_stomach_boiled", + "type": "requirement", + "//": "Anything you might consider a boiled stomach. About 500mL of stomachs.", + "components": [ + [ + [ "small_stomach_boiled", 2 ], + [ "stomach_boiled", 1 ], + [ "small_hstomach_boiled", 2 ], + [ "hstomach_boiled", 1 ], + [ "small_demihuman_stomach_boiled", 2 ], + [ "demihuman_stomach_boiled", 1 ] + ] + ] + }, + { + "id": "meat_stomach_large", + "type": "requirement", + "//": "Anything you might consider a small raw stomach.", + "components": [ [ [ "stomach_large", 1 ], [ "hstomach_large", 1 ], [ "demihuman_stomach_large", 1 ] ] ] + }, + { + "id": "meat_stomach_small", + "type": "requirement", + "//": "Anything you might consider a small raw stomach.", + "components": [ [ [ "stomach", 1 ], [ "hstomach", 1 ], [ "demihuman_stomach", 1 ] ] ] + }, { "id": "meat_nofish", "type": "requirement", @@ -196,7 +250,7 @@ [ "meat_red", 1, "LIST" ], [ "liver", 5 ], [ "kidney", 5 ], - [ "lung", 5 ], + [ "meat_lung", 5, "LIST" ], [ "sweetbread", 5 ], [ "bacon", 4 ], [ "lunchmeat", 5 ], @@ -223,6 +277,7 @@ [ "mutant_meat_scrap_cooked", 10 ], [ "human_cooked", 1 ], [ "mutant_human_cooked", 1 ], + [ "demihuman_cooked", 1 ], [ "meat_pickled", 1 ], [ "meat_smoked", 1 ], [ "meat_salted", 1 ], @@ -398,19 +453,27 @@ "id": "any_fat", "type": "requirement", "//": "Any type of raw fat.", - "components": [ [ [ "fat", 1 ], [ "mutant_fat", 1 ], [ "fat_tainted", 1 ], [ "edible_fat", 1, "LIST" ], [ "fat_tainted", 1 ] ] ] + "components": [ [ [ "edible_fat", 1, "LIST" ], [ "fat_tainted", 1 ] ] ] }, { "id": "edible_fat", "type": "requirement", "//": "Any type of edible raw fat.", - "components": [ [ [ "fat", 1 ], [ "mutant_fat", 1 ], [ "human_fat", 1 ], [ "mutant_human_fat", 1 ] ] ] + "components": [ [ [ "fat", 1 ], [ "mutant_fat", 1 ], [ "human_fat", 1 ], [ "mutant_human_fat", 1 ], [ "demihuman_fat", 1 ] ] ] }, { "id": "edible_tallow", "type": "requirement", "//": "Any type of edible tallow.", - "components": [ [ [ "tallow", 1 ], [ "mutant_tallow", 1 ], [ "human_tallow", 1 ], [ "mutant_human_tallow", 1 ] ] ] + "components": [ + [ + [ "tallow", 1 ], + [ "mutant_tallow", 1 ], + [ "human_tallow", 1 ], + [ "mutant_human_tallow", 1 ], + [ "demihuman_tallow", 1 ] + ] + ] }, { "id": "any_tallow", @@ -422,7 +485,7 @@ "id": "edible_lard", "type": "requirement", "//": "Lard that is safe for consumption.", - "components": [ [ [ "lard", 1 ], [ "mutant_lard", 1 ], [ "human_lard", 1 ], [ "mutant_human_lard", 1 ] ] ] + "components": [ [ [ "lard", 1 ], [ "mutant_lard", 1 ], [ "human_lard", 1 ], [ "mutant_human_lard", 1 ], [ "demihuman_lard", 1 ] ] ] }, { "id": "edible_tallow_lard", diff --git a/data/json/requirements/materials.json b/data/json/requirements/materials.json index fee059bafc45a..61c2947ef1a2f 100644 --- a/data/json/requirements/materials.json +++ b/data/json/requirements/materials.json @@ -119,6 +119,12 @@ "//": "Materials used for lashing, when choice of makeshift rope is sensible, per 216 g/180 cm of rope.", "components": [ [ [ "rope_6", 1 ], [ "vine_6", 1 ], [ "rope_makeshift_6", 1 ] ] ] }, + { + "id": "rope_any_short", + "type": "requirement", + "//": "Materials used for lashing, when any rope or wire is sensible, per 216 g/180 cm of rope.", + "components": [ [ [ "rope_6", 1 ], [ "vine_6", 1 ], [ "rope_makeshift_6", 1 ], [ "wire", 1 ] ] ] + }, { "id": "rope_superior", "type": "requirement", diff --git a/data/json/scenarios.json b/data/json/scenarios.json index 1c4a7b522cf01..b976718303e29 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -195,7 +195,7 @@ "sloc_cemetery" ], "professions": [ "svictim", "tweaker" ], - "flags": [ "FIRE_START", "INFECTED", "BAD_DAY", "CHALLENGE", "CITY_START" ] + "flags": [ "FIRE_START", "INFECTED", "BAD_DAY", "CHALLENGE", "CITY_START", "LONE_START" ] }, { "type": "scenario", diff --git a/data/json/scores.json b/data/json/scores.json index e7ea7f4adffca..641d0ed4e60f7 100644 --- a/data/json/scores.json +++ b/data/json/scores.json @@ -63,5 +63,70 @@ "id": "score_max_move_z", "type": "score", "statistic": "max_move_z" + }, + { + "id": "score_cut_trees", + "type": "score", + "statistic": "num_cuts_tree" + }, + { + "id": "score_buried_corpses", + "type": "score", + "statistic": "num_buried_corpses" + }, + { + "id": "score_exhumed_graves", + "type": "score", + "statistic": "num_exhumed_graves" + }, + { + "id": "score_installs_cbm", + "type": "score", + "statistic": "num_installs_cbm" + }, + { + "id": "score_installs_faulty_cbm", + "type": "score", + "statistic": "num_installs_faulty_cbm" + }, + { + "id": "score_gains_mutation", + "type": "score", + "statistic": "num_gains_mutation" + }, + { + "id": "score_crosses_mutation_threshold", + "type": "score", + "statistic": "num_crosses_mutation_threshold" + }, + { + "id": "score_broken_bones", + "type": "score", + "statistic": "num_broken_bone" + }, + { + "id": "score_broken_right_leg", + "type": "score", + "statistic": "num_broken_right_leg" + }, + { + "id": "score_broken_left_leg", + "type": "score", + "statistic": "num_broken_left_leg" + }, + { + "id": "score_broken_right_arm", + "type": "score", + "statistic": "num_broken_right_arm" + }, + { + "id": "score_broken_left_arm", + "type": "score", + "statistic": "num_broken_left_arm" + }, + { + "id": "score_skill_levels_gained", + "type": "score", + "statistic": "num_gains_skill_level" } ] diff --git a/data/json/snippets/fliers.json b/data/json/snippets/fliers.json index 54ca6acac2266..f4cd2afd3ed6a 100644 --- a/data/json/snippets/fliers.json +++ b/data/json/snippets/fliers.json @@ -2,7 +2,6 @@ { "type": "snippet", "category": "flier", - "//": "Missing flier_ 27, 29, 30", "text": [ { "id": "flier_1", @@ -108,10 +107,22 @@ "id": "flier_26", "text": "This is an advertisement for Rivtech brand ammunition. It shows a picture of an armored steel plate with a gaping hole blasted through the middle. Sitting beside the plate is a block of brightly colored caseless ammunition. The caption reads: \"Rivtech 8x40mm caseless. Nothing else comes close.\"" }, + { + "id": "flier_27", + "text": "This is an advertisement for SUDS Laundromat. It shows words surrounded by bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! 50% off on all washers and driers!\"" + }, { "id": "flier_28", "text": "This is a propaganda poster showing the Northrop Dispatch's military variant. It depicts the iconic dark green, arachnoid dispatch, standing before a fence and facing away from the camera as blurring machines rush forward from its back towards black silhouettes menacing on the horizon. It reads: \"WE ARE HERE TO PROTECT YOU.\"" }, + { + "id": "flier_29", + "text": "This is an advertisement for Iron Gym. It shows pictures of people performing various exercises such as running, yoga and weight lifting. It reads: \"I lift things up and put them down!\"" + }, + { + "id": "flier_30", + "text": "This is an advertisement for Space Time Inc. It has pictures of astronauts floating around a spaceship with the Moon in the background. It reads: \"Own your own piece of the Moon! For only $29.99 a month, you can have prime real estate amongst the stars!\"" + }, { "id": "flier_31", "text": "This is a public notice from the Centers for Disease Control. Its message, repeated in several languages, reads: \"BOIL WATER ADVISORY. An unidentified agent has contaminated local groundwater. It is highly infectious and can cause erratic and violent behavior. Boil all water, and isolate any loved ones showing concerning symptoms. Visit www.cdc.gov/cdda-advisory for more information.\"" diff --git a/data/json/species.json b/data/json/species.json index 4b3fef2d02a05..0122bda32e612 100644 --- a/data/json/species.json +++ b/data/json/species.json @@ -17,6 +17,12 @@ "description": "a bird", "fear_triggers": [ "HURT", "SOUND" ] }, + { + "type": "SPECIES", + "id": "CYBORG", + "description": "an alien cyborg", + "footsteps": "heavy thuds." + }, { "type": "SPECIES", "id": "REPTILE", diff --git a/data/json/start_locations.json b/data/json/start_locations.json index 920bd7f8d173e..673ecc79b677a 100644 --- a/data/json/start_locations.json +++ b/data/json/start_locations.json @@ -305,7 +305,7 @@ "type": "start_location", "id": "sloc_prison", "name": "Prison", - "terrain": [ "prison_1_b_5" ] + "terrain": [ "prison_1_5" ] }, { "type": "start_location", diff --git a/data/json/statistics.json b/data/json/statistics.json index cdfad956e91c1..417e625ebce40 100644 --- a/data/json/statistics.json +++ b/data/json/statistics.json @@ -337,5 +337,1248 @@ "stat_type": "last_value", "event_transformation": "avatar_enters_oter_type", "field": "oter_type_id" + }, + { + "id": "avatar_cuts_tree", + "type": "event_transformation", + "event_type": "cuts_tree", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character" ] + }, + { + "id": "num_cuts_tree", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_cuts_tree", + "description": { "str": "tree cut down", "str_pl": "trees cut down" } + }, + { + "id": "avatar_exhumes_grave", + "type": "event_transformation", + "event_type": "exhumes_grave", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character" ] + }, + { + "id": "num_exhumed_graves", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_exhumes_grave", + "description": { "str": "grave exhumed", "str_pl": "graves exhumed" } + }, + { + "id": "avatar_buries_corpse", + "type": "event_transformation", + "event_type": "buries_corpse", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "corpse_type", "corpse_name" ] + }, + { + "id": "num_buried_corpses", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_buries_corpse", + "description": { "str": "corpse buried", "str_pl": "corpses buried" } + }, + { + "id": "avatar_installs_cbm", + "type": "event_transformation", + "event_type": "installs_cbm", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "bionic" ] + }, + { + "id": "avatar_installs_faulty_cbm", + "type": "event_transformation", + "event_type": "installs_faulty_cbm", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "bionic" ] + }, + { + "id": "num_installs_cbm", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_installs_cbm", + "description": { "str": "bionic implant installed", "str_pl": "bionic implants installed" } + }, + { + "id": "num_installs_faulty_cbm", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_installs_faulty_cbm", + "description": { "str": "faulty bionic implant installed", "str_pl": "faulty bionic implants installed" } + }, + { + "id": "avatar_gains_mutation", + "type": "event_transformation", + "event_type": "gains_mutation", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "trait" ] + }, + { + "id": "num_gains_mutation", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_mutation", + "description": { "str": "mutation gained", "str_pl": "mutations gained" } + }, + { + "id": "avatar_crosses_mutation_threshold", + "type": "event_transformation", + "event_type": "crosses_mutation_threshold", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "category" ] + }, + { + "id": "num_crosses_mutation_threshold", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_crosses_mutation_threshold", + "description": { "str": "mutation threshold crossed", "str_pl": "mutation thresholds crossed" } + }, + { + "id": "avatar_broken_bone", + "type": "event_transformation", + "event_type": "broken_bone", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "part" ] + }, + { + "id": "num_broken_bone", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_bone", + "description": { "str": "bone broken", "str_pl": "bones broken" } + }, + { + "id": "avatar_broken_right_leg", + "type": "event_transformation", + "event_type": "broken_bone", + "value_constraints": { "part": { "equals": [ "body_part", "bp_leg_r" ] } } + }, + { + "id": "avatar_broken_left_leg", + "type": "event_transformation", + "event_type": "broken_bone", + "value_constraints": { "part": { "equals": [ "body_part", "bp_leg_l" ] } } + }, + { + "id": "avatar_broken_right_arm", + "type": "event_transformation", + "event_type": "broken_bone", + "value_constraints": { "part": { "equals": [ "body_part", "bp_arm_r" ] } } + }, + { + "id": "avatar_broken_left_arm", + "type": "event_transformation", + "event_type": "broken_bone", + "value_constraints": { "part": { "equals": [ "body_part", "bp_arm_l" ] } } + }, + { + "id": "num_broken_bone", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_bone", + "description": { "str": "bone broken", "str_pl": "bones broken" } + }, + { + "id": "num_broken_right_leg", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_right_leg", + "description": { "str_sp": "broken right leg" } + }, + { + "id": "num_broken_left_leg", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_left_leg", + "description": { "str_sp": "broken left leg" } + }, + { + "id": "num_broken_right_arm", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_right_arm", + "description": { "str_sp": "broken right arm" } + }, + { + "id": "num_broken_left_arm", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_broken_left_arm", + "description": { "str_sp": "broken left arm" } + }, + { + "id": "avatar_gains_skill_level", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_skill_level", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_skill_level", + "description": { "str": "skill level gained", "str_pl": "skill levels gained" } + }, + { + "id": "avatar_gains_barter_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "barter" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_barter_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_barter_level_7", + "description": { "str_sp": "bartering skill level 7 gained" } + }, + { + "id": "avatar_gains_speech_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "speech" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_speech_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_speech_level_7", + "description": { "str_sp": "speaking skill level 7 gained" } + }, + { + "id": "avatar_gains_computer_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "computer" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_computer_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_computer_level_7", + "description": { "str_sp": "computers skill level 7 gained" } + }, + { + "id": "avatar_gains_firstaid_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "firstaid" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_firstaid_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_firstaid_level_7", + "description": { "str_sp": "first aid skill level 7 gained" } + }, + { + "id": "avatar_gains_mechanics_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "mechanics" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_mechanics_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_mechanics_level_7", + "description": { "str_sp": "mechanics skill level 7 gained" } + }, + { + "id": "avatar_gains_traps_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "traps" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_traps_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_traps_level_7", + "description": { "str_sp": "trapping skill level 7 gained" } + }, + { + "id": "avatar_gains_driving_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "driving" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_driving_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_driving_level_7", + "description": { "str_sp": "driving skill level 7 gained" } + }, + { + "id": "avatar_gains_swimming_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "swimming" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_swimming_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_swimming_level_7", + "description": { "str_sp": "swimming skill level 7 gained" } + }, + { + "id": "avatar_gains_fabrication_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "fabrication" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_fabrication_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_fabrication_level_7", + "description": { "str_sp": "fabrication skill level 7 gained" } + }, + { + "id": "avatar_gains_cooking_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "cooking" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_cooking_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_cooking_level_7", + "description": { "str_sp": "cooking skill level 7 gained" } + }, + { + "id": "avatar_gains_tailor_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "tailor" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_tailor_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_tailor_level_7", + "description": { "str_sp": "tailoring skill level 7 gained" } + }, + { + "id": "avatar_gains_survival_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "survival" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_survival_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_survival_level_7", + "description": { "str_sp": "survival skill level 7 gained" } + }, + { + "id": "avatar_gains_electronics_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "electronics" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_electronics_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_electronics_level_7", + "description": { "str_sp": "electronics skill level 7 gained" } + }, + { + "id": "avatar_gains_archery_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "archery" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_archery_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_archery_level_7", + "description": { "str_sp": "archery skill level 7 gained" } + }, + { + "id": "avatar_gains_gun_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "gun" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_gun_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_gun_level_7", + "description": { "str_sp": "marksmanship skill level 7 gained" } + }, + { + "id": "avatar_gains_launcher_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "launcher" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_launcher_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_launcher_level_7", + "description": { "str_sp": "launchers skill level 7 gained" } + }, + { + "id": "avatar_gains_pistol_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "pistol" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_pistol_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_pistol_level_7", + "description": { "str_sp": "handguns skill level 7 gained" } + }, + { + "id": "avatar_gains_rifle_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "rifle" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_rifle_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_survival_level_7", + "description": { "str_sp": "rifles skill level 7 gained" } + }, + { + "id": "avatar_gains_shotgun_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "shotgun" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_shotgun_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_shotgun_level_7", + "description": { "str_sp": "shotguns skill level 7 gained" } + }, + { + "id": "avatar_gains_smg_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "smg" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_smg_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_smg_level_7", + "description": { "str_sp": "submachine guns skill level 7 gained" } + }, + { + "id": "avatar_gains_throw_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "throw" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_throw_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_throw_level_7", + "description": { "str_sp": "throwing skill level 7 gained" } + }, + { + "id": "avatar_gains_melee_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "melee" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_melee_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_melee_level_7", + "description": { "str_sp": "melee skill level 7 gained" } + }, + { + "id": "avatar_gains_bashing_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "bashing" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_bashing_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_bashing_level_7", + "description": { "str_sp": "bashing weapons skill level 7 gained" } + }, + { + "id": "avatar_gains_cutting_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "cutting" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_cutting_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_cutting_level_7", + "description": { "str_sp": "cutting weapons skill level 7 gained" } + }, + { + "id": "avatar_gains_dodge_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "dodge" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_dodge_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_dodge_level_7", + "description": { "str_sp": "dodging skill level 7 gained" } + }, + { + "id": "avatar_gains_stabbing_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "stabbing" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_stabbing_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_stabbing_level_7", + "description": { "str_sp": "piercing weapons skill level 7 gained" } + }, + { + "id": "avatar_gains_unarmed_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "unarmed" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_unarmed_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_unarmed_level_7", + "description": { "str_sp": "unarmed skill level 7 gained" } + }, + { + "id": "avatar_gains_lockpick_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "lockpick" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_lockpick_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_lockpick_level_7", + "description": { "str_sp": "lock picking skill level 7 gained" } + }, + { + "id": "avatar_gains_chemistry_level_7", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "chemistry" ] }, + "new_level": { "equals": [ "int", "7" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_chemistry_level_7", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_chemistry_level_7", + "description": { "str_sp": "chemistry skill level 7 gained" } + }, + { + "id": "avatar_gains_barter_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "barter" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_barter_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_barter_level_10", + "description": { "str_sp": "bartering skill level 10 gained" } + }, + { + "id": "avatar_gains_speech_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "speech" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_speech_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_speech_level_10", + "description": { "str_sp": "speaking skill level 10 gained" } + }, + { + "id": "avatar_gains_computer_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "computer" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_computer_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_computer_level_10", + "description": { "str_sp": "computers skill level 10 gained" } + }, + { + "id": "avatar_gains_firstaid_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "firstaid" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_firstaid_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_firstaid_level_10", + "description": { "str_sp": "first aid skill level 10 gained" } + }, + { + "id": "avatar_gains_mechanics_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "mechanics" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_mechanics_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_mechanics_level_10", + "description": { "str_sp": "mechanics skill level 10 gained" } + }, + { + "id": "avatar_gains_traps_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "traps" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_traps_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_traps_level_10", + "description": { "str_sp": "trapping skill level 10 gained" } + }, + { + "id": "avatar_gains_driving_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "driving" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_driving_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_driving_level_10", + "description": { "str_sp": "driving skill level 10 gained" } + }, + { + "id": "avatar_gains_swimming_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "swimming" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_swimming_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_swimming_level_10", + "description": { "str_sp": "swimming skill level 10 gained" } + }, + { + "id": "avatar_gains_fabrication_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "fabrication" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_fabrication_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_fabrication_level_10", + "description": { "str_sp": "fabrication skill level 10 gained" } + }, + { + "id": "avatar_gains_cooking_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "cooking" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_cooking_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_cooking_level_10", + "description": { "str_sp": "cooking skill level 10 gained" } + }, + { + "id": "avatar_gains_tailor_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "tailor" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_tailor_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_tailor_level_10", + "description": { "str_sp": "tailoring skill level 10 gained" } + }, + { + "id": "avatar_gains_survival_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "survival" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_survival_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_survival_level_10", + "description": { "str_sp": "survival skill level 10 gained" } + }, + { + "id": "avatar_gains_electronics_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "electronics" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_electronics_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_electronics_level_10", + "description": { "str_sp": "electronics skill level 10 gained" } + }, + { + "id": "avatar_gains_archery_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "archery" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_archery_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_archery_level_10", + "description": { "str_sp": "archery skill level 10 gained" } + }, + { + "id": "avatar_gains_gun_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "gun" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_gun_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_gun_level_10", + "description": { "str_sp": "marksmanship skill level 10 gained" } + }, + { + "id": "avatar_gains_launcher_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "launcher" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_launcher_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_launcher_level_10", + "description": { "str_sp": "launchers skill level 10 gained" } + }, + { + "id": "avatar_gains_pistol_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "pistol" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_pistol_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_pistol_level_10", + "description": { "str_sp": "handguns skill level 10 gained" } + }, + { + "id": "avatar_gains_rifle_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "rifle" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_rifle_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_survival_level_10", + "description": { "str_sp": "rifles skill level 10 gained" } + }, + { + "id": "avatar_gains_shotgun_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "shotgun" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_shotgun_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_shotgun_level_10", + "description": { "str_sp": "shotguns skill level 10 gained" } + }, + { + "id": "avatar_gains_smg_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "smg" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_smg_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_smg_level_10", + "description": { "str_sp": "submachine guns skill level 10 gained" } + }, + { + "id": "avatar_gains_throw_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "throw" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_throw_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_throw_level_10", + "description": { "str_sp": "throwing skill level 10 gained" } + }, + { + "id": "avatar_gains_melee_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "melee" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_melee_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_melee_level_10", + "description": { "str_sp": "melee skill level 10 gained" } + }, + { + "id": "avatar_gains_bashing_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "bashing" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_bashing_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_bashing_level_10", + "description": { "str_sp": "bashing weapons skill level 10 gained" } + }, + { + "id": "avatar_gains_cutting_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "cutting" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_cutting_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_cutting_level_10", + "description": { "str_sp": "cutting weapons skill level 10 gained" } + }, + { + "id": "avatar_gains_dodge_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "dodge" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_dodge_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_dodge_level_10", + "description": { "str_sp": "dodging skill level 10 gained" } + }, + { + "id": "avatar_gains_stabbing_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "stabbing" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_stabbing_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_stabbing_level_10", + "description": { "str_sp": "piercing weapons skill level 10 gained" } + }, + { + "id": "avatar_gains_unarmed_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "unarmed" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_unarmed_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_unarmed_level_10", + "description": { "str_sp": "unarmed skill level 10 gained" } + }, + { + "id": "avatar_gains_lockpick_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "lockpick" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_lockpick_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_lockpick_level_10", + "description": { "str_sp": "lock picking skill level 10 gained" } + }, + { + "id": "avatar_gains_chemistry_level_10", + "type": "event_transformation", + "event_type": "gains_skill_level", + "value_constraints": { + "character": { "equals_statistic": "avatar_id" }, + "skill": { "equals": [ "skill_id", "chemistry" ] }, + "new_level": { "equals": [ "int", "10" ] } + }, + "drop_fields": [ "character", "skill", "new_level" ] + }, + { + "id": "num_gains_chemistry_level_10", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_gains_chemistry_level_10", + "description": { "str_sp": "chemistry skill level 10 gained" } + }, + { + "id": "avatar_reads_book", + "type": "event_transformation", + "event_type": "reads_book", + "value_constraints": { "character": { "equals_statistic": "avatar_id" } }, + "drop_fields": [ "character", "itype" ] + }, + { + "id": "num_reads_book", + "type": "event_statistic", + "stat_type": "count", + "event_transformation": "avatar_reads_book", + "description": { "str_sp": "read a book" } } ] diff --git a/data/json/test_regions.json b/data/json/test_regions.json index d46d4f3782a68..6d606d5fdea3e 100644 --- a/data/json/test_regions.json +++ b/data/json/test_regions.json @@ -127,7 +127,27 @@ "s_lot": 6 } }, - "weather": { "base_temperature": 8.0, "base_humidity": 40.0, "base_pressure": 1015.0, "base_acid": 0.0 }, + "weather": { + "base_temperature": 8.0, + "base_humidity": 40.0, + "base_pressure": 1015.0, + "base_acid": 0.0, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "acid_drizzle", + "acid_rain", + "flurries", + "snowing", + "snowstorm" + ] + }, "overmap_feature_flag_settings": { "clear_blacklist": false, "blacklist": [ ], "clear_whitelist": false, "whitelist": [ ] } }, { @@ -180,8 +200,6 @@ ",": "t_pavement_y", "_": "t_pavement", "r": "t_floor", - "6": "t_console", - "x": "t_console_broken", "^": "t_floor", ".": "t_floor", "-": "t_wall", @@ -201,6 +219,8 @@ "s": "t_sidewalk" }, "furniture": { + "6": "f_console", + "x": "f_console_broken", "d": "f_dumpster", "O": "f_oven", "r": "f_rack", diff --git a/data/json/traps.json b/data/json/traps.json index e6d1c5f3ad5ea..7a547c334bcee 100644 --- a/data/json/traps.json +++ b/data/json/traps.json @@ -139,7 +139,7 @@ { "type": "trap", "id": "tr_beartrap", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "bear trap", "color": "blue", "symbol": "^", @@ -161,7 +161,7 @@ { "type": "trap", "id": "tr_beartrap_buried", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "buried bear trap", "color": "blue", "symbol": "^", @@ -234,7 +234,7 @@ { "type": "trap", "id": "tr_crossbow", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "crossbow trap", "color": "green", "symbol": "^", @@ -257,7 +257,7 @@ { "type": "trap", "id": "tr_shotgun_2", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "shotgun trap", "color": "red", "symbol": "^", @@ -265,7 +265,7 @@ "avoidance": 5, "difficulty": 6, "action": "shotgun", - "drops": [ "string_36", "shotgun_d", { "item": "shot_00", "quantity": 2, "charges": 1 } ], + "drops": [ "string_36", "slamfire_shotgun_d", { "item": "shot_00", "quantity": 2, "charges": 1 } ], "vehicle_data": { "chance": 70, "damage": 300, @@ -279,7 +279,7 @@ { "type": "trap", "id": "tr_shotgun_2_1", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "shotgun trap", "color": "red", "symbol": "^", @@ -287,7 +287,7 @@ "avoidance": 5, "difficulty": 6, "action": "shotgun", - "drops": [ "string_36", "shotgun_d", { "item": "shot_00", "quantity": 1, "charges": 1 } ], + "drops": [ "string_36", "slamfire_shotgun_d", { "item": "shot_00", "quantity": 1, "charges": 1 } ], "vehicle_data": { "chance": 70, "damage": 300, @@ -296,13 +296,13 @@ "sound_type": "fire_gun", "sound_variant": "shotgun_d", "remove_trap": true, - "spawn_items": [ "shotgun_d", "string_6" ] + "spawn_items": [ "slamfire_shotgun_d", "string_6" ] } }, { "type": "trap", "id": "tr_shotgun_1", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "shotgun trap", "color": "red", "symbol": "^", @@ -310,7 +310,7 @@ "avoidance": 5, "difficulty": 6, "action": "shotgun", - "drops": [ "string_36", "shotgun_s", { "item": "shot_00", "quantity": 1, "charges": 1 } ], + "drops": [ "string_36", "slamfire_shotgun", { "item": "shot_00", "quantity": 1, "charges": 1 } ], "vehicle_data": { "chance": 70, "damage": 300, @@ -319,13 +319,13 @@ "sound_type": "fire_gun", "sound_variant": "shotgun_s", "remove_trap": true, - "spawn_items": [ "shotgun_s", "string_6" ] + "spawn_items": [ "four_winds_shotgun", "string_6" ] } }, { "type": "trap", "id": "tr_engine", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "spinning blade engine", "color": "light_red", "symbol": "_", @@ -351,7 +351,7 @@ { "type": "trap", "id": "tr_landmine", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "land mine", "color": "red", "symbol": "^", @@ -373,7 +373,7 @@ { "type": "trap", "id": "tr_landmine_buried", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "buried land mine", "color": "red", "symbol": "_", @@ -395,7 +395,7 @@ { "type": "trap", "id": "tr_telepad", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "teleport pad", "color": "magenta", "symbol": "_", @@ -502,7 +502,7 @@ { "type": "trap", "id": "tr_boobytrap", - "trigger_weight": 200, + "trigger_weight": "200 g", "name": "booby trap", "color": "light_cyan", "symbol": "^", diff --git a/data/json/uncraft/ammo/40x46mm.json b/data/json/uncraft/ammo/40x46mm.json index 2230dd0716ab2..27b8a4471ede1 100644 --- a/data/json/uncraft/ammo/40x46mm.json +++ b/data/json/uncraft/ammo/40x46mm.json @@ -6,7 +6,12 @@ "difficulty": 4, "time": "3 m", "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "PULL", "level": 1 } ], - "components": [ [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder_shotgun", 35 ] ], [ [ "38_casing", 1 ] ] ], + "components": [ + [ [ "smpistol_primer", 1 ] ], + [ [ "gunpowder_shotgun", 35 ] ], + [ [ "32_casing", 1 ] ], + [ [ "40x46mm_m212_casing", 1 ] ] + ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, { @@ -16,7 +21,13 @@ "difficulty": 4, "time": "3 m", "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "PULL", "level": 1 } ], - "components": [ [ [ "smpistol_primer", 1 ] ], [ [ "combatnail", 70 ] ], [ [ "gunpowder_shotgun", 35 ] ], [ [ "impact_fuze", 1 ] ] ], + "components": [ + [ [ "smpistol_primer", 1 ] ], + [ [ "combatnail", 70 ] ], + [ [ "gunpowder_shotgun", 35 ] ], + [ [ "impact_fuze", 1 ] ], + [ [ "40x46mm_m118_casing", 1 ] ] + ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, { @@ -30,7 +41,8 @@ [ [ "lgpistol_primer", 1 ] ], [ [ "chem_compositionb", 32 ] ], [ [ "gunpowder_shotgun", 35 ] ], - [ [ "impact_fuze", 1 ] ] + [ [ "impact_fuze", 1 ] ], + [ [ "40x46mm_m199_casing", 1 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, @@ -41,7 +53,7 @@ "difficulty": 4, "time": "3 m", "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "PULL", "level": 1 } ], - "components": [ [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder_shotgun", 35 ] ] ], + "components": [ [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder_shotgun", 35 ] ], [ [ "40x46mm_m195_casing", 1 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] } ] diff --git a/data/json/vehicle_groups.json b/data/json/vehicle_groups.json index 2d85139ae9b96..ba344589253dc 100644 --- a/data/json/vehicle_groups.json +++ b/data/json/vehicle_groups.json @@ -13,6 +13,7 @@ [ "suv_electric", 200 ], [ "suv_electric", 120 ], [ "car_mini", 400 ], + [ "car_hybrid", 500 ], [ "beetle", 500 ], [ "bicycle", 800 ], [ "bicycle_dirt", 200 ], @@ -97,7 +98,8 @@ [ "cube_van", 500 ], [ "cube_van_cheap", 500 ], [ "hippie_van", 500 ], - [ "4x4_car", 500 ] + [ "4x4_car", 500 ], + [ "car_hybrid", 500 ] ] }, { @@ -113,6 +115,7 @@ [ "car_anmlcmpt", 250 ], [ "car_hatch", 1000 ], [ "electric_car", 500 ], + [ "car_hybrid", 500 ], [ "car_sports", 1000 ], [ "car_sports_electric", 300 ], [ "pickup", 600 ], @@ -159,6 +162,7 @@ [ "car_hatch", 500 ], [ "car_mini", 250 ], [ "electric_car", 500 ], + [ "car_hybrid", 400 ], [ "beetle", 300 ], [ "car_sports", 100 ], [ "car_sports_electric", 50 ], @@ -225,6 +229,7 @@ [ "car_anmlcmpt", 100 ], [ "car_hatch", 500 ], [ "electric_car", 750 ], + [ "car_hybrid", 500 ], [ "hippie_van", 750 ], [ "golf_cart", 300 ], [ "scooter", 300 ], @@ -327,6 +332,7 @@ [ "car_hatch", 750 ], [ "car_chassis", 2000 ], [ "electric_car", 400 ], + [ "car_hybrid", 400 ], [ "car_sports", 400 ], [ "car_sports_electric", 100 ], [ "car_racing_electric", 5 ], @@ -350,6 +356,7 @@ [ "car_sports", 200 ], [ "suv", 400 ], [ "car_mini", 250 ], + [ "car_hybrid", 200 ], [ "rv", 250 ], [ "meth_lab", 50 ], [ "beetle", 400 ], @@ -369,6 +376,7 @@ [ "car_hatch", 475 ], [ "car_anmlcmpt", 150 ], [ "electric_car", 100 ], + [ "car_hybrid", 100 ], [ "suv", 800 ], [ "suv_electric", 100 ], [ "suv_electric_rack", 100 ], @@ -392,6 +400,7 @@ [ "suv", 400 ], [ "rv", 200 ], [ "car_sports", 300 ], + [ "car_hybrid", 200 ], [ "cube_van_cheap", 200 ], [ "pickup", 500 ], [ "hippie_van", 300 ] @@ -409,6 +418,7 @@ [ "car_hatch", 500 ], [ "car_anmlcmpt", 150 ], [ "electric_car", 750 ], + [ "car_hybrid", 500 ], [ "hippie_van", 750 ], [ "motorcycle", 500 ], [ "superbike", 50 ], @@ -570,6 +580,7 @@ [ "car", 2000 ], [ "car_hatch", 1000 ], [ "electric_car", 500 ], + [ "car_hybrid", 500 ], [ "suv", 800 ], [ "suv_electric", 200 ], [ "car_mini", 400 ], @@ -600,6 +611,7 @@ [ "4x4_car", 200 ], [ "car_sports_electric", 100 ], [ "car_mini", 375 ], + [ "car_hybrid", 200 ], [ "beetle", 750 ], [ "car", 1500 ], [ "car_hatch", 750 ], @@ -630,6 +642,7 @@ [ "car", 1000 ], [ "car_hatch", 500 ], [ "electric_car", 500 ], + [ "car_hybrid", 400 ], [ "suv", 800 ], [ "suv_electric", 200 ], [ "car_mini", 400 ], @@ -666,6 +679,7 @@ [ "car", 2000 ], [ "car_hatch", 1000 ], [ "electric_car", 500 ], + [ "car_hybrid", 400 ], [ "suv", 800 ], [ "suv_electric", 200 ], [ "car_mini", 400 ], @@ -692,6 +706,7 @@ [ "car", 2000 ], [ "car_hatch", 1000 ], [ "electric_car", 500 ], + [ "car_hybrid", 400 ], [ "car_mini", 250 ], [ "suv", 800 ], [ "suv_electric", 200 ], @@ -711,6 +726,7 @@ "vehicles": [ [ "car", 500 ], [ "electric_car", 100 ], + [ "car_hybrid", 100 ], [ "car_sports", 300 ], [ "car_sports_electric", 300 ], [ "suv", 500 ], diff --git a/data/json/vehicleparts/alternator.json b/data/json/vehicleparts/alternator.json index 889f25dc779ac..16bbe1aba1961 100644 --- a/data/json/vehicleparts/alternator.json +++ b/data/json/vehicleparts/alternator.json @@ -20,7 +20,7 @@ "power": -75, "epower": 36, "damage_modifier": 80, - "folded_volume": 5, + "folded_volume": "1250 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 2, 5 ] }, { "item": "steel_chunk", "count": [ 2, 5 ] }, @@ -45,7 +45,7 @@ "power": -746, "epower": 360, "damage_modifier": 80, - "folded_volume": 5, + "folded_volume": "1250 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 2, 5 ] }, { "item": "steel_chunk", "count": [ 2, 5 ] }, diff --git a/data/json/vehicleparts/armor.json b/data/json/vehicleparts/armor.json index ecaf99b14af4a..877bc725586b9 100644 --- a/data/json/vehicleparts/armor.json +++ b/data/json/vehicleparts/armor.json @@ -10,7 +10,7 @@ "color": "dark_gray", "broken_color": "light_gray", "durability": 150, - "folded_volume": 4, + "folded_volume": "1 L", "description": "Improvised armor plate. Will partially protect other components on the same frame from damage.", "breaks_into": [ { "item": "rebar", "count": [ 1, 2 ] }, { "item": "scrap", "count": [ 4, 8 ] } ], "requirements": { diff --git a/data/json/vehicleparts/battery.json b/data/json/vehicleparts/battery.json index 60a067d272265..146b2c24d6bf0 100644 --- a/data/json/vehicleparts/battery.json +++ b/data/json/vehicleparts/battery.json @@ -10,7 +10,7 @@ "broken_color": "red", "durability": 120, "description": "A battery for storing electrical power, and discharging it to power electrical devices built into the vehicle.", - "folded_volume": 25, + "folded_volume": "6250 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 6, 9 ] }, { "item": "steel_chunk", "count": [ 6, 9 ] }, @@ -30,7 +30,7 @@ "name": { "str": "motorbike battery" }, "item": "battery_motorbike", "durability": 100, - "folded_volume": 5, + "folded_volume": "1250 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 4, 7 ] }, { "item": "steel_chunk", "count": [ 4, 7 ] }, @@ -44,7 +44,7 @@ "name": { "str": "motorbike battery, small" }, "item": "battery_motorbike_small", "durability": 30, - "folded_volume": 3, + "folded_volume": "750 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 4, 7 ] }, { "item": "steel_chunk", "count": [ 4, 7 ] }, @@ -87,7 +87,7 @@ "item": "medium_storage_battery", "difficulty": 1, "durability": 250, - "folded_volume": 10, + "folded_volume": "2500 ml", "breaks_into": [ { "item": "scrap", "count": [ 1, 4 ] }, { "item": "small_storage_battery", "count": [ 0, 7 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 0 ] ], "time": "200 s", "using": "vehicle_screw" }, @@ -103,7 +103,7 @@ "item": "small_storage_battery", "difficulty": 1, "durability": 100, - "folded_volume": 2, + "folded_volume": "500 ml", "breaks_into": [ { "item": "scrap", "count": [ 1, 2 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 0 ] ], "time": "100 s", "using": [ ] }, diff --git a/data/json/vehicleparts/boards.json b/data/json/vehicleparts/boards.json index 8814901c21146..be688b28d1a25 100644 --- a/data/json/vehicleparts/boards.json +++ b/data/json/vehicleparts/boards.json @@ -25,7 +25,7 @@ "broken_color": "dark_gray", "durability": 15, "description": "A cloth wall. Keeps zombies outside the vehicle and prevents people from seeing through it.", - "folded_volume": 15, + "folded_volume": "3750 ml", "breaks_into": "ig_vp_cloth", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "30 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, diff --git a/data/json/vehicleparts/combustion.json b/data/json/vehicleparts/combustion.json index b0c18208eccc6..7624cca3377c9 100644 --- a/data/json/vehicleparts/combustion.json +++ b/data/json/vehicleparts/combustion.json @@ -128,7 +128,7 @@ "epower": 0, "power": 7370, "energy_consumption": 18425, - "folded_volume": 6, + "folded_volume": "1500 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 5, 10 ] }, { "item": "steel_chunk", "count": [ 5, 10 ] }, @@ -152,7 +152,7 @@ "epower": 0, "power": 41000, "energy_consumption": 124500, - "folded_volume": 8, + "folded_volume": "2 L", "breaks_into": [ { "item": "steel_lump", "count": [ 6, 12 ] }, { "item": "steel_chunk", "count": [ 6, 12 ] }, @@ -177,7 +177,7 @@ "epower": 0, "power": 3728, "energy_consumption": 9320, - "folded_volume": 3, + "folded_volume": "750 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 2, 4 ] }, { "item": "steel_chunk", "count": [ 2, 4 ] }, @@ -326,7 +326,7 @@ "epower": -50, "power": 37300, "energy_consumption": 124500, - "folded_volume": 8, + "folded_volume": "2 L", "breaks_into": [ { "item": "steel_lump", "count": [ 10, 20 ] }, { "item": "steel_chunk", "count": [ 10, 20 ] }, diff --git a/data/json/vehicleparts/engineering.json b/data/json/vehicleparts/engineering.json index 79d9e5f7bbd80..2070c6f612518 100644 --- a/data/json/vehicleparts/engineering.json +++ b/data/json/vehicleparts/engineering.json @@ -42,7 +42,7 @@ "broken_color": "light_blue", "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 line of sight to where it is going and it must be within four tiles of it.", - "folded_volume": 12, + "folded_volume": "3 L", "breaks_into": [ { "item": "pipe", "count": [ 2, 8 ] }, { "item": "scrap", "count": [ 2, 6 ] } ], "qualities": [ [ "LIFT", 7 ], [ "JACK", 7 ] ], "requirements": { @@ -65,7 +65,7 @@ "broken_color": "light_blue", "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 line of sight to where it is going and it must be within four tiles of it.", - "folded_volume": 12, + "folded_volume": "3 L", "breaks_into": [ { "item": "pipe", "count": [ 1, 4 ] }, { "item": "scrap", "count": [ 2, 6 ] } ], "qualities": [ [ "LIFT", 1 ], [ "JACK", 1 ] ], "requirements": { @@ -118,7 +118,7 @@ "damage_modifier": 100, "durability": 300, "description": "A large metal disc, powered by the vehicle's engines. Use the vehicle controls to turn it on or off. When turned on, it will stop the vehicle unless it has a strong engine. When turned on, it will dig a shallow pit in dirt. Mount it on the edge of your vehicle.", - "folded_volume": 12, + "folded_volume": "3 L", "power": -70000, "breaks_into": [ { "item": "steel_lump", "count": [ 4, 6 ] }, diff --git a/data/json/vehicleparts/frames.json b/data/json/vehicleparts/frames.json index defb4b4042ed0..c33698dc5e5d4 100644 --- a/data/json/vehicleparts/frames.json +++ b/data/json/vehicleparts/frames.json @@ -8,7 +8,7 @@ "symbol": "h", "durability": 50, "description": "A light metal framework, designed to fold. Other vehicle components can be mounted on it. If all the frames and components of a vehicle are foldable, the vehicle can be folding into a small package and picked up as a normal item.", - "folded_volume": 10, + "folded_volume": "2500 ml", "breaks_into": [ { "item": "steel_chunk", "count": [ 0, 2 ] }, { "item": "scrap", "count": [ 1, 2 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -29,7 +29,7 @@ "broken_color": "brown", "durability": 15, "description": "A light wooden framework, designed to fold. Other vehicle components can be mounted on it. If all the frames and components of a vehicle are foldable, the vehicle can be folding into a small package and picked up as a normal item.", - "folded_volume": 15, + "folded_volume": "3750 ml", "breaks_into": [ { "item": "splinter", "count": [ 0, 6 ] }, { "item": "nail", "charges": [ 1, 15 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, diff --git a/data/json/vehicleparts/lights.json b/data/json/vehicleparts/lights.json index 51caac902cb0b..c13d49af51785 100644 --- a/data/json/vehicleparts/lights.json +++ b/data/json/vehicleparts/lights.json @@ -12,7 +12,7 @@ "//": "essentially an 800lm 10W LED flashlight", "epower": -10, "bonus": 30, - "folded_volume": 2, + "folded_volume": "500 ml", "breaks_into": [ { "item": "scrap", "count": [ 0, 2 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -33,7 +33,7 @@ "durability": 20, "description": "A bright light, self-powered by an atomic decay reaction that never stops. When turned on, it illuminates several squares inside the vehicle.", "bonus": 30, - "folded_volume": 4, + "folded_volume": "1 L", "breaks_into": [ { "item": "scrap", "prob": 50 } ], "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -50,7 +50,7 @@ "item": "atomic_light", "description": "A very dim light, self-powered by an atomic decay reaction that never stops. When turned on, it illuminates a single square inside the vehicle that isn't suitable for crafting.", "bonus": 5, - "folded_volume": 2 + "folded_volume": "500 ml" }, { "id": "floodlight", @@ -67,7 +67,7 @@ "epower": -200, "bonus": 8000, "damage_modifier": 10, - "folded_volume": 8, + "folded_volume": "2 L", "breaks_into": [ { "item": "cable", "charges": [ 1, 4 ] }, { "item": "steel_chunk", "count": [ 0, 2 ] }, @@ -106,7 +106,7 @@ "epower": -100, "bonus": 8000, "damage_modifier": 10, - "folded_volume": 1, + "folded_volume": "250 ml", "breaks_into": [ { "item": "cable", "charges": [ 1, 4 ] }, { "item": "scrap", "count": [ 0, 2 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -129,7 +129,7 @@ "epower": -187, "bonus": 8000, "damage_modifier": 10, - "folded_volume": 1, + "folded_volume": "250 ml", "breaks_into": [ { "item": "cable", "charges": [ 1, 4 ] }, { "item": "scrap", "count": [ 0, 2 ] } ], "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -181,7 +181,7 @@ "epower": -10, "bonus": 500, "damage_modifier": 10, - "folded_volume": 2, + "folded_volume": "500 ml", "breaks_into": [ { "item": "steel_lump", "count": [ 4, 6 ] }, { "item": "steel_chunk", "count": [ 4, 6 ] }, diff --git a/data/json/vehicleparts/manual.json b/data/json/vehicleparts/manual.json index 2cff4f94bc3fd..6e7add470d963 100644 --- a/data/json/vehicleparts/manual.json +++ b/data/json/vehicleparts/manual.json @@ -25,7 +25,7 @@ "description": "A set of bicycle style foot pedals. If mounted on the same tile as seat, they allow you to move the vehicle at the cost of your stamina.", "power": 1600, "muscle_power_factor": 140, - "folded_volume": 2, + "folded_volume": "500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 0 ] ], "time": "60 m", "using": [ [ "vehicle_bolt", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "30 m", "using": [ [ "vehicle_bolt", 1 ] ] }, @@ -46,7 +46,7 @@ "power": 800, "muscle_power_factor": 50, "damage_modifier": 50, - "folded_volume": 2, + "folded_volume": "500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 0 ] ], "time": "60 m", "using": [ [ "vehicle_bolt", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "30 m", "using": [ [ "vehicle_bolt", 1 ] ] }, diff --git a/data/json/vehicleparts/motor.json b/data/json/vehicleparts/motor.json index 203e7d8eaa0af..eca2fe9945b12 100644 --- a/data/json/vehicleparts/motor.json +++ b/data/json/vehicleparts/motor.json @@ -25,7 +25,7 @@ "power": 800, "energy_consumption": 1000, "damage_modifier": 80, - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "60 m", "using": [ [ "vehicle_screw", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -44,7 +44,7 @@ "power": 7040, "energy_consumption": 8000, "damage_modifier": 80, - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "60 m", "using": [ [ "vehicle_screw", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -68,7 +68,7 @@ "power": 36000, "energy_consumption": 40000, "damage_modifier": 80, - "folded_volume": 6, + "folded_volume": "1500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "vehicle_bolt", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_bolt", 1 ] ] }, diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json index ed35d78115482..78eda76c26d9c 100644 --- a/data/json/vehicleparts/vehicle_parts.json +++ b/data/json/vehicleparts/vehicle_parts.json @@ -247,7 +247,7 @@ "item": "veh_tracker", "//": "10W GPS transponder like an XPC-TR", "epower": -10, - "folded_volume": 2, + "folded_volume": "500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "200 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -268,7 +268,7 @@ "damage_modifier": 20, "durability": 80, "description": "A padded wedge that you straddle, like a bicycle or motorcycle.", - "folded_volume": 5, + "folded_volume": "1250 ml", "comfort": 1, "floor_bedding_warmth": 200, "item": "saddle", @@ -294,7 +294,7 @@ "durability": 20, "description": "A crude seat, too uncomfortable to sleep in.", "item": "sheet", - "folded_volume": 10, + "folded_volume": "2500 ml", "location": "anywhere", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "200 s", "using": [ [ "vehicle_bolt", 1 ] ] }, @@ -340,7 +340,7 @@ "broken_color": "light_cyan", "durability": 30, "description": "A pair of handles. You can mount other items on top of it.", - "folded_volume": 3, + "folded_volume": "750 ml", "item": "pipe", "location": "structure", "requirements": { @@ -517,7 +517,7 @@ "broken_color": "dark_gray", "durability": 15, "description": "A cloth roof.", - "folded_volume": 15, + "folded_volume": "3750 ml", "item": "sheet", "location": "roof", "requirements": { @@ -818,7 +818,7 @@ "durability": 200, "description": "A blade, welded to the vehicle, for cutting up zombies.", "item": "blade", - "folded_volume": 3, + "folded_volume": "750 ml", "location": "structure", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -840,7 +840,7 @@ "durability": 200, "description": "A blade, welded to the vehicle, for cutting up zombies.", "item": "blade", - "folded_volume": 3, + "folded_volume": "750 ml", "location": "structure", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -863,7 +863,7 @@ "durability": 250, "description": "A metal spike, welded to the vehicle, to increase injury when crashing into things.", "item": "spike", - "folded_volume": 1, + "folded_volume": "250 ml", "location": "structure", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -1237,7 +1237,7 @@ "broken_color": "brown", "damage_modifier": 60, "durability": 65, - "folded_volume": 6, + "folded_volume": "1500 ml", "size": 120, "item": "foldwoodframe", "location": "center", @@ -1260,7 +1260,7 @@ "broken_color": "dark_gray", "damage_modifier": 60, "durability": 15, - "folded_volume": 4, + "folded_volume": "1 L", "size": 60, "item": "bag_canvas", "location": "center", @@ -1283,7 +1283,7 @@ "broken_color": "brown", "damage_modifier": 60, "durability": 75, - "folded_volume": 6, + "folded_volume": "1500 ml", "size": 80, "item": "bike_basket", "location": "center", @@ -1329,7 +1329,7 @@ "damage_modifier": 60, "durability": 75, "size": 600, - "folded_volume": 24, + "folded_volume": "6 L", "item": "folding_basket", "location": "center", "requirements": { @@ -1554,7 +1554,7 @@ "durability": 50, "item": "inflatable_section", "location": "structure", - "folded_volume": 3, + "folded_volume": "750 ml", "requirements": { "install": { "skills": [ [ "mechanics", 3 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_weld_removal", 1 ] ] }, @@ -1576,7 +1576,7 @@ "durability": 40, "item": "inflatable_airbag", "location": "under", - "folded_volume": 3, + "folded_volume": "750 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_weld_removal", 1 ] ] }, @@ -1603,7 +1603,7 @@ "exclusions": [ "wind" ], "item": "sail", "location": "engine_block", - "folded_volume": 2, + "folded_volume": "500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m" }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m" }, @@ -1640,7 +1640,7 @@ "exclusions": [ "manual" ], "item": "hand_paddles", "location": "engine_block", - "folded_volume": 2, + "folded_volume": "500 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "60 m" }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m" }, @@ -1663,7 +1663,7 @@ "bonus": 10, "damage_modifier": 5, "item": "reins_tackle", - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "6 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "3 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, @@ -1684,7 +1684,7 @@ "durability": 250, "description": "A steering wheel and accelerator and brake pedals.", "bonus": 10, - "folded_volume": 6, + "folded_volume": "1500 ml", "item": "vehicle_controls", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -1782,7 +1782,7 @@ "epower": -25, "item": "electronics_controls", "description": "Some switches and knobs to control the vehicle's electrical systems.", - "folded_volume": 3, + "folded_volume": "750 ml", "requirements": { "install": { "skills": [ [ "mechanics", 3 ], [ "electronics", 3 ] ], "time": "350 s", "using": [ [ "vehicle_screw", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 3 ] ], "time": "350 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -1829,7 +1829,7 @@ "damage_modifier": 10, "durability": 35, "description": "A belt, attached to a seat.", - "folded_volume": 2, + "folded_volume": "500 ml", "bonus": 25, "item": "rope_6", "location": "on_seat", @@ -1854,7 +1854,7 @@ "description": "A bunch of electronics that make it difficult to start the vehicle without the proper key, and that will sound an alarm if you try. The alarm can be disabled.", "epower": -10, "bonus": 120, - "folded_volume": 1, + "folded_volume": "250 ml", "item": "processor", "location": "on_controls", "requirements": { @@ -1872,6 +1872,35 @@ "flags": [ "ON_CONTROLS", "SECURITY", "FOLDABLE", "ENABLED_DRAINS_EPOWER" ], "breaks_into": "ig_vp_device" }, + { + "type": "vehicle_part", + "id": "smart_engine_controller", + "name": { "str": "smart engine controller" }, + "symbol": "'", + "color": "light_gray", + "broken_symbol": "'", + "broken_color": "red", + "damage_modifier": 10, + "durability": 35, + "description": "Electronic module that automatically switches combustion and electric engines on and off minimizing fuel consumption and optimizing power output and battery charge rate. Must be turned on to work. Simplified ruleset: 1. When throttling, maximize acceleration. 2. Keep battery at 90%. 3. Minimize fuel consumption.", + "epower": -25, + "folded_volume": 1, + "item": "processor", + "requirements": { + "install": { + "skills": [ [ "mechanics", 4 ], [ "electronics", 4 ] ], + "time": "5 m", + "qualities": [ { "id": "SCREW_FINE", "level": 1 } ] + }, + "removal": { + "skills": [ [ "mechanics", 4 ], [ "electronics", 4 ] ], + "time": "5 m", + "qualities": [ { "id": "SCREW_FINE", "level": 1 } ] + } + }, + "flags": [ "ON_CONTROLS", "FOLDABLE", "ENABLED_DRAINS_EPOWER", "SMART_ENGINE_CONTROLLER" ], + "breaks_into": "ig_vp_device" + }, { "type": "vehicle_part", "id": "seatbelt_heavyduty", @@ -1883,7 +1912,7 @@ "damage_modifier": 10, "durability": 100, "description": "A series of straps attached to the seat, intended to fasten together after going over your shoulders and hips and between your legs.", - "folded_volume": 4, + "folded_volume": "1 L", "bonus": 25, "item": "rope_30", "location": "on_seat", @@ -2172,7 +2201,7 @@ "damage_modifier": 10, "description": "A water faucet.", "durability": 45, - "folded_volume": 1, + "folded_volume": "250 ml", "item": "water_faucet", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "5 m", "qualities": [ { "id": "WRENCH", "level": 1 } ] }, @@ -2558,7 +2587,7 @@ "damage_modifier": 10, "durability": 75, "description": "A small horn. Use the vehicle controls and select the honk option to make noise.", - "folded_volume": 1, + "folded_volume": "250 ml", "bonus": 45, "item": "horn_bicycle", "requirements": { @@ -2623,7 +2652,7 @@ "durability": 90, "description": "An electronic noise maker. It will automatically make noise when you drive in reverse, alerting things behind you to move out of the way.", "bonus": 40, - "folded_volume": 1, + "folded_volume": "250 ml", "item": "beeper", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "150 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -2813,7 +2842,7 @@ "repair": { "skills": [ [ "mechanics", 4 ] ], "time": "30 m", "using": [ [ "adhesive", 1 ] ] } }, "flags": [ "INTERNAL", "RECHARGE", "FOLDABLE", "ENABLED_DRAINS_EPOWER" ], - "folded_volume": 8, + "folded_volume": "2 L", "breaks_into": [ { "item": "steel_chunk", "count": [ 0, 2 ] }, { "item": "scrap", "count": [ 1, 2 ] }, @@ -2837,7 +2866,7 @@ "repair": { "skills": [ [ "mechanics", 3 ] ], "time": "30 m", "using": [ [ "adhesive", 1 ] ] } }, "delete": { "flags": [ "ENABLED_DRAINS_EPOWER" ] }, - "folded_volume": 1, + "folded_volume": "250 ml", "breaks_into": "ig_vp_device", "copy-from": "recharge_station" }, @@ -2852,7 +2881,7 @@ "damage_modifier": 10, "durability": 20, "description": "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.", - "folded_volume": 2, + "folded_volume": "500 ml", "item": "mirror", "location": "structure", "requirements": { @@ -2874,7 +2903,7 @@ "damage_modifier": 10, "durability": 30, "description": "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.", - "folded_volume": 1, + "folded_volume": "250 ml", "item": "mirror", "location": "on_windshield", "requirements": { @@ -3062,7 +3091,7 @@ "durability": 150, "description": "A wooden spike, attached to the vehicle, to increase injury when crashing into things.", "item": "pointy_stick", - "folded_volume": 5, + "folded_volume": "1250 ml", "location": "structure", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, @@ -3181,7 +3210,7 @@ "durability": 50, "description": "A small electric motor. Installed on the same frame as a door or curtain, it will allow you to remotely open the door or curtain from the vehicle controls.", "item": "motor_tiny", - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_screw", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -3222,7 +3251,7 @@ "damage_modifier": 20, "durability": 200, "description": "An LCD display attached to one or more cameras. When turned on, it lets you see from the cameras, but drains power from the vehicle's batteries. You can 'e'xamine the tile to access the controls, or use the vehicle control key (default '^').", - "folded_volume": 10, + "folded_volume": "2500 ml", "item": "camera_control", "epower": -20, "requirements": { @@ -3244,7 +3273,7 @@ "damage_modifier": 10, "durability": 100, "description": "A small camera. Will relay what it can see to a camera control station.", - "folded_volume": 8, + "folded_volume": "2 L", "bonus": 24, "item": "omnicamera", "//": "Cameras without a DVR can run on under 10W", @@ -3270,7 +3299,7 @@ "durability": 300, "description": "A set of controls to allow a vehicle to drive itself, or you to drive it remotely using a controller.", "item": "robot_controls", - "folded_volume": 5, + "folded_volume": "1250 ml", "location": "center", "requirements": { "install": { "skills": [ [ "mechanics", 4 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, @@ -3295,7 +3324,7 @@ "durability": 20, "description": "A clock, so you know what time it is.", "epower": 0, - "folded_volume": 1, + "folded_volume": "250 ml", "item": "wristwatch", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "150 s", "using": [ [ "vehicle_screw", 1 ] ] }, @@ -3320,7 +3349,7 @@ "size": 200, "item": "leather_funnel", "location": "on_roof", - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "6 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "3 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, @@ -3344,7 +3373,7 @@ "size": 240, "item": "birchbark_funnel", "location": "on_roof", - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 2 ] ], "time": "6 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "3 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, @@ -3368,7 +3397,7 @@ "size": 200, "item": "makeshift_funnel", "location": "on_roof", - "folded_volume": 1, + "folded_volume": "250 ml", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "6 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "3 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, @@ -3611,7 +3640,7 @@ "broken_color": "light_gray", "durability": 25, "description": "A set of locks. Attached to a suitable cargo space, it will prevent other people from accessing the cargo and taking your stuff.", - "folded_volume": 1, + "folded_volume": "250 ml", "item": "cargo_lock", "location": "on_lockable_cargo", "requirements": { @@ -3658,7 +3687,7 @@ "epower": -250, "item": "turret_controls", "description": "A set of motor, camera, and an AI unit which allows for tracking targets, friend-or-foe identification, and firing the connected turret in full automatic mode. When installed over the turret, it will enable auto targeting mode for said turret.", - "folded_volume": 3, + "folded_volume": "750 ml", "flags": [ "ENABLED_DRAINS_EPOWER", "TURRET_CONTROLS", "UNMOUNT_ON_DAMAGE" ], "requirements": { "install": { diff --git a/data/json/vehicleparts/vp_flags.json b/data/json/vehicleparts/vp_flags.json index 50299b7a1a5d6..34b5a82490319 100644 --- a/data/json/vehicleparts/vp_flags.json +++ b/data/json/vehicleparts/vp_flags.json @@ -54,6 +54,12 @@ "context": [ "vehicle_part" ], "info": "With a seat or saddle, you drive from here. You can 'e'xamine the tile to access the controls, or use the vehicle control key (default '^')." }, + { + "id": "SMART_ENGINE_CONTROLLER", + "type": "json_flag", + "context": [ "vehicle_part" ], + "info": "When active, turns engines on and off automatically." + }, { "id": "COVERED", "type": "json_flag", diff --git a/data/json/vehicleparts/wheel.json b/data/json/vehicleparts/wheel.json index 72a7a4520365d..51bdd6f701df9 100644 --- a/data/json/vehicleparts/wheel.json +++ b/data/json/vehicleparts/wheel.json @@ -1,4 +1,34 @@ [ + { + "type": "vehicle_part", + "id": "wheel_mount_wood", + "name": { "str": "wooden wheel mount" }, + "symbol": "-", + "color": "brown", + "location": "axle", + "broken_symbol": "X", + "broken_color": "light_gray", + "damage_modifier": 40, + "folded_volume": "250 ml", + "durability": 80, + "description": "A piece of wood with holes suitable for a bike or motorbike wheel.", + "item": "wheel_mount_wood", + "requirements": { + "install": { "skills": [ [ "mechanics", 2 ] ], "time": "20 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, + "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "20 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, + "repair": { "skills": [ [ "mechanics", 3 ] ], "time": "10 m", "using": [ [ "adhesive", 2 ] ] } + }, + "flags": [ "WHEEL_MOUNT_LIGHT", "NEEDS_JACKING", "FOLDABLE" ], + "breaks_into": [ { "item": "2x4", "count": [ 2, 5 ] } ], + "damage_reduction": { "all": 8 } + }, + { + "id": "wheel_mount_wood_steerable", + "copy-from": "wheel_mount_wood", + "type": "vehicle_part", + "name": { "str": "wooden wheel mount (steerable)" }, + "extend": { "flags": [ "STEERABLE" ] } + }, { "type": "vehicle_part", "id": "wheel_mount_light", @@ -9,7 +39,7 @@ "broken_symbol": "X", "broken_color": "light_gray", "damage_modifier": 80, - "folded_volume": 1, + "folded_volume": "250 ml", "durability": 120, "description": "A piece of metal with holes suitable for a bike or motorbike wheel.", "item": "wheel_mount_light", @@ -239,7 +269,7 @@ "durability": 70, "description": "A small wheel.", "damage_modifier": 50, - "folded_volume": 9, + "folded_volume": "2250 ml", "breaks_into": [ { "item": "steel_lump" }, { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 1, 3 ] } ], "rolling_resistance": 1.62, "wheel_type": "off-road", @@ -264,7 +294,7 @@ "durability": 40, "description": "A thin bicycle wheel.", "damage_modifier": 50, - "folded_volume": 14, + "folded_volume": "3500 ml", "breaks_into": [ { "item": "steel_lump", "prob": 50 }, { "item": "steel_chunk", "count": [ 1, 2 ] }, @@ -302,7 +332,7 @@ "durability": 70, "description": "A set of small wheels, mounted on pivots, like the ones on a rolling office chair or grocery cart.", "damage_modifier": 50, - "folded_volume": 5, + "folded_volume": "1250 ml", "breaks_into": [ { "item": "steel_lump", "prob": 50 }, { "item": "steel_chunk", "count": [ 1, 2 ] }, @@ -329,7 +359,7 @@ "color": "dark_gray", "durability": 120, "description": "A set of 10\" wheels with tough rubber tires.", - "folded_volume": 10, + "folded_volume": "2500 ml", "breaks_into": [ { "item": "steel_lump", "prob": 50 }, { "item": "steel_chunk", "count": [ 1, 5 ] }, @@ -397,7 +427,7 @@ "durability": 70, "description": "A small wheel.", "damage_modifier": 50, - "folded_volume": 9, + "folded_volume": "2250 ml", "breaks_into": [ { "item": "steel_lump" }, { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 1, 3 ] } ], "rolling_resistance": 1.5, "wheel_type": "racing", @@ -476,7 +506,7 @@ "durability": 40, "description": "A pair of wheelchair wheels.", "damage_modifier": 50, - "folded_volume": 25, + "folded_volume": "6250 ml", "breaks_into": [ { "item": "steel_lump", "prob": 50 }, { "item": "steel_chunk", "count": [ 1, 2 ] }, diff --git a/data/json/vehicles/cars.json b/data/json/vehicles/cars.json index b7965cc0d8f3f..e0467dd473ae0 100644 --- a/data/json/vehicles/cars.json +++ b/data/json/vehicles/cars.json @@ -467,6 +467,62 @@ { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ] }, + { + "id": "car_hybrid", + "type": "vehicle", + "name": "Hybrid Car", + "blueprint": [ + [ "o-++-o" ], + [ "+=##'|" ], + [ "+=##'|" ], + [ "o-++-o" ] + ], + "parts": [ + { "x": 0, "y": 0, "part": "frame_vertical_2" }, + { "x": 0, "y": 0, "parts": [ "reclining_seat", "seatbelt" ] }, + { + "x": 0, + "y": 0, + "parts": [ "controls", "dashboard", "vehicle_clock", "smart_engine_controller", "stereo", "horn_car", "vehicle_alarm" ] + }, + { "x": 0, "y": 0, "part": "roof" }, + { "x": 0, "y": 1, "parts": [ "frame_vertical_2", "reclining_seat", "seatbelt", "roof" ] }, + { "x": 0, "y": -1, "parts": [ "frame_vertical", "door" ] }, + { "x": 0, "y": 2, "parts": [ "frame_vertical", "door" ] }, + { "x": -1, "y": 0, "parts": [ "frame_vertical_2", "seat", "seatbelt", "roof" ] }, + { "x": -1, "y": 1, "parts": [ "frame_vertical_2", "seat", "seatbelt", "roof" ] }, + { "x": -1, "y": -1, "parts": [ "frame_vertical", "door" ] }, + { "x": -1, "y": 2, "parts": [ "frame_vertical", "door" ] }, + { "x": 1, "y": 0, "parts": [ "frame_horizontal", "windshield" ] }, + { "x": 1, "y": 1, "parts": [ "frame_horizontal", "windshield" ] }, + { "x": 1, "y": -1, "parts": [ "frame_vertical", "windshield" ] }, + { "x": 1, "y": 2, "parts": [ "frame_vertical", "windshield" ] }, + { "x": 2, "y": 0, "parts": [ "frame_horizontal", "halfboard_horizontal" ] }, + { "x": 2, "y": 0, "parts": [ "engine_inline4", "alternator_truck" ] }, + { "x": 2, "y": 1, "parts": [ "frame_horizontal", "engine_electric", "halfboard_horizontal" ] }, + { "x": 2, "y": -1, "parts": [ "frame_nw", "halfboard_nw", "headlight" ] }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": 2, "y": 2, "parts": [ "frame_ne", "halfboard_ne", "headlight" ] }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -2, "y": 0, "parts": [ "frame_vertical", "medium_storage_battery", "trunk", "muffler", "roof" ] }, + { "x": -2, "y": 1, "parts": [ "frame_vertical", "medium_storage_battery", "trunk", "roof" ] }, + { "x": -2, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical", "tank" ] }, + { "x": -2, "y": 2, "parts": [ "frame_vertical", "halfboard_vertical" ] }, + { "x": -3, "y": -1, "parts": [ "frame_horizontal", "halfboard_sw", "wheel_mount_medium", "wheel" ] }, + { "x": -3, "y": 0, "parts": [ "frame_horizontal", "door_trunk" ] }, + { "x": -3, "y": 1, "parts": [ "frame_horizontal", "door_trunk" ] }, + { "x": -3, "y": 2, "parts": [ "frame_horizontal", "halfboard_se", "wheel_mount_medium", "wheel" ] } + ], + "items": [ + { "x": 0, "y": 0, "chance": 14, "item_groups": [ "car_misc" ] }, + { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] }, + { "x": 0, "y": 1, "chance": 8, "item_groups": [ "car_misc" ] }, + { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }, + { "x": -2, "y": 0, "chance": 11, "item_groups": [ "car_kit" ] }, + { "x": -2, "y": 1, "chance": 15, "item_groups": [ "car_kit" ] }, + { "x": -2, "y": 1, "chance": 15, "items": [ "jack_small", "wheel" ] } + ] + }, { "id": "car_mini", "type": "vehicle", diff --git a/data/json/vehicles/emergency.json b/data/json/vehicles/emergency.json index cfc02a7289754..a6028b961397f 100644 --- a/data/json/vehicles/emergency.json +++ b/data/json/vehicles/emergency.json @@ -151,6 +151,7 @@ { "x": -2, "y": 0, "chance": 25, "item_groups": [ "ambulance_equipment" ] }, { "x": -3, "y": 0, "chance": 15, "items": [ "bandages" ] }, { "x": -3, "y": 0, "chance": 15, "items": [ "1st_aid" ] }, + { "x": -3, "y": 0, "chance": 15, "items": [ "ifak" ] }, { "x": -3, "y": 0, "chance": 5, "items": [ "adrenaline_injector" ] }, { "x": -3, "y": 0, "chance": 5, "items": [ "oxycodone" ] }, { "x": -3, "y": 0, "chance": 5, "items": [ "tramadol" ] }, diff --git a/data/json/vehicles/helicopters.json b/data/json/vehicles/helicopters.json index f9769e43c3c80..cc3a99e7c62c9 100644 --- a/data/json/vehicles/helicopters.json +++ b/data/json/vehicles/helicopters.json @@ -421,7 +421,7 @@ "items": [ { "x": -1, "y": 0, "chance": 100, "items": [ "1st_aid" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "mag_firstaid" ] }, - { "x": -1, "y": 2, "chance": 100, "items": [ "1st_aid" ] }, + { "x": -1, "y": 2, "chance": 100, "items": [ "ifak" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "gloves_medical" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "ampoule" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "rx12_injector" ] }, @@ -597,7 +597,7 @@ { "x": -2, "y": 0, "chance": 100, "items": [ "bone_human" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "1st_aid" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "mag_firstaid" ] }, - { "x": -1, "y": 2, "chance": 100, "items": [ "1st_aid" ] }, + { "x": -1, "y": 2, "chance": 100, "items": [ "ifak" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "gloves_medical" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "ampoule" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "rx12_injector" ] }, @@ -781,7 +781,7 @@ "items": [ { "x": -1, "y": 0, "chance": 100, "items": [ "mag_firstaid" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "1st_aid" ] }, - { "x": -1, "y": 2, "chance": 100, "items": [ "1st_aid" ] }, + { "x": -1, "y": 2, "chance": 100, "items": [ "ifak" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "gloves_medical" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "ampoule" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "rx12_injector" ] }, @@ -895,7 +895,7 @@ { "x": -2, "y": 2, "chance": 100, "items": [ "bone_human" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "mag_firstaid" ] }, { "x": -1, "y": 0, "chance": 100, "items": [ "1st_aid" ] }, - { "x": -1, "y": 2, "chance": 100, "items": [ "1st_aid" ] }, + { "x": -1, "y": 2, "chance": 100, "items": [ "ifak" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "gloves_medical" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "ampoule" ] }, { "x": -1, "y": 2, "chance": 100, "items": [ "rx12_injector" ] }, @@ -1090,7 +1090,7 @@ { "x": -1, "y": -1, "chance": 5, "items": [ "mre_chicken_box" ] }, { "x": -1, "y": -1, "chance": 10, "items": [ "canteen" ] }, { "x": -1, "y": -1, "chance": 10, "items": [ "light_plus_battery_cell" ] }, - { "x": -1, "y": -1, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -1, "y": -1, "chance": 10, "items": [ "ifak" ] }, { "x": -1, "y": -1, "chance": 10, "items": [ "mag_fieldrepair" ] }, { "x": -1, "y": -1, "chance": 15, "items": [ "e_scrap" ] }, { "x": -1, "y": -1, "chance": 7, "items": [ "screwdriver" ] }, @@ -1241,7 +1241,7 @@ { "x": -1, "y": -1, "chance": 7, "items": [ "mre_chicken_box" ] }, { "x": -1, "y": -1, "chance": 10, "items": [ "canteen" ] }, { "x": -1, "y": -1, "chance": 10, "items": [ "light_plus_battery_cell" ] }, - { "x": -1, "y": -1, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -1, "y": -1, "chance": 10, "items": [ "ifak" ] }, { "x": -1, "y": -1, "chance": 7, "items": [ "mag_fieldrepair" ] }, { "x": -1, "y": -1, "chance": 15, "items": [ "e_scrap" ] }, { "x": -1, "y": -1, "chance": 7, "items": [ "screwdriver" ] }, @@ -1387,7 +1387,7 @@ { "x": -1, "y": 1, "chance": 7, "items": [ "mre_chicken_box" ] }, { "x": -1, "y": 1, "chance": 10, "items": [ "canteen" ] }, { "x": -1, "y": 1, "chance": 10, "items": [ "light_plus_battery_cell" ] }, - { "x": -1, "y": 1, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -1, "y": 1, "chance": 10, "items": [ "ifak" ] }, { "x": -1, "y": 1, "chance": 7, "items": [ "mag_fieldrepair" ] }, { "x": -1, "y": 1, "chance": 15, "items": [ "e_scrap" ] }, { "x": -1, "y": 1, "chance": 7, "items": [ "screwdriver" ] }, @@ -2359,7 +2359,7 @@ { "x": -4, "y": -1, "chance": 7, "ammo": 80, "items": [ "mp3" ] }, { "x": -2, "y": -1, "chance": 7, "items": [ "aspirin" ] }, { "x": -2, "y": -1, "chance": 7, "items": [ "bandages" ] }, - { "x": -2, "y": -1, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -2, "y": -1, "chance": 10, "items": [ "ifak" ] }, { "x": -2, "y": 1, "chance": 7, "items": [ "screwdriver" ] }, { "x": -2, "y": 1, "chance": 10, "items": [ "mag_fieldrepair" ] }, { "x": -2, "y": 1, "chance": 7, "items": [ "wrench" ] }, @@ -2933,7 +2933,7 @@ { "x": -3, "y": 0, "chance": 7, "items": [ "knife_combat" ] }, { "x": -1, "y": 0, "chance": 7, "items": [ "aspirin" ] }, { "x": -1, "y": 0, "chance": 7, "items": [ "bandages" ] }, - { "x": -1, "y": 0, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -1, "y": 0, "chance": 10, "items": [ "ifak" ] }, { "x": -1, "y": 0, "chance": 10, "items": [ "pocket_firstaid" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "screwdriver" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "wrench" ] }, @@ -3130,7 +3130,7 @@ { "x": -3, "y": 0, "chance": 7, "items": [ "knife_combat" ] }, { "x": -1, "y": 0, "chance": 7, "items": [ "aspirin" ] }, { "x": -1, "y": 0, "chance": 7, "items": [ "bandages" ] }, - { "x": -1, "y": 0, "chance": 10, "items": [ "1st_aid" ] }, + { "x": -1, "y": 0, "chance": 10, "items": [ "ifak" ] }, { "x": -1, "y": 0, "chance": 10, "items": [ "pocket_firstaid" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "screwdriver" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "wrench" ] }, diff --git a/data/json/vitamin.json b/data/json/vitamin.json index 369b4d945b566..fe8e36e0acf72 100644 --- a/data/json/vitamin.json +++ b/data/json/vitamin.json @@ -75,5 +75,29 @@ "rate": "4 h", "flags": [ "NO_DISPLAY" ], "disease_excess": [ [ 10, 19 ], [ 20, 29 ], [ 30, 40 ] ] + }, + { + "id": "blood", + "type": "vitamin", + "vit_type": "counter", + "name": { "str": "Blood" }, + "deficiency": "hypovolemia", + "min": -50000, + "max": 0, + "rate": "-6 s", + "flags": [ "NO_DISPLAY" ], + "disease": [ [ -5000, -7500 ], [ -7510, -15000 ], [ -15010, -20000 ], [ -20010, -50000 ] ] + }, + { + "id": "redcells", + "type": "vitamin", + "vit_type": "counter", + "name": { "str": "Red Blood Cells" }, + "deficiency": "redcells_anemia", + "min": -50000, + "max": 0, + "rate": "-12 s", + "flags": [ "NO_DISPLAY" ], + "disease": [ [ -7510, -20000 ], [ -20010, -35000 ], [ -35010, -50000 ] ] } ] diff --git a/data/json/weather_type.json b/data/json/weather_type.json new file mode 100644 index 0000000000000..72e79533d3b44 --- /dev/null +++ b/data/json/weather_type.json @@ -0,0 +1,332 @@ +[ + { + "id": "null", + "type": "weather_type", + "name": "NULL Weather - BUG", + "color": "c_magenta", + "map_color": "c_magenta_red", + "glyph": "0", + "ranged_penalty": 0, + "sight_penalty": 0.0, + "light_modifier": 0, + "sound_attn": 0, + "dangerous": false, + "precip": "none", + "rains": false, + "acidic": false, + "sun_intensity": "normal" + }, + { + "id": "clear", + "type": "weather_type", + "name": "Clear", + "color": "c_cyan", + "map_color": "c_yellow_white", + "glyph": " ", + "ranged_penalty": 0, + "sight_penalty": 1.0, + "light_modifier": 0, + "sound_attn": 0, + "dangerous": false, + "precip": "none", + "rains": false, + "acidic": false, + "sun_intensity": "normal" + }, + { + "id": "sunny", + "type": "weather_type", + "name": "Sunny", + "color": "c_light_cyan", + "map_color": "c_yellow_white", + "glyph": "*", + "ranged_penalty": 0, + "sight_penalty": 1.0, + "light_modifier": 2, + "sound_attn": 0, + "dangerous": false, + "precip": "none", + "rains": false, + "acidic": false, + "sun_intensity": "high", + "requirements": { "pressure_min": 1020, "humidity_max": 70, "time": "day" } + }, + { + "id": "cloudy", + "type": "weather_type", + "name": "Cloudy", + "color": "c_light_gray", + "map_color": "c_dark_gray_white", + "glyph": "~", + "ranged_penalty": 0, + "sight_penalty": 1.0, + "light_modifier": -20, + "sound_attn": 0, + "dangerous": false, + "precip": "none", + "rains": false, + "acidic": false, + "sun_intensity": "light", + "requirements": { "pressure_max": 1010, "humidity_min": 40 } + }, + { + "id": "light_drizzle", + "type": "weather_type", + "name": "Light Drizzle", + "color": "c_light_blue", + "map_color": "h_light_blue", + "glyph": ".", + "ranged_penalty": 0, + "sight_penalty": 1.01, + "light_modifier": -10, + "sound_attn": 0, + "dangerous": false, + "precip": "very_light", + "rains": true, + "acidic": false, + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.01, "color": "c_light_blue", "glyph": "," }, + "sound_category": "drizzle", + "sun_intensity": "light", + "requirements": { "pressure_max": 1003, "humidity_min": 96, "humidity_and_pressure": false, "required_weathers": [ "cloudy" ] } + }, + { + "id": "drizzle", + "type": "weather_type", + "name": "Drizzle", + "color": "c_light_blue", + "map_color": "h_light_blue", + "glyph": ".", + "ranged_penalty": 1, + "sight_penalty": 1.03, + "light_modifier": -20, + "sound_attn": 1, + "dangerous": false, + "precip": "light", + "rains": true, + "acidic": false, + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.01, "color": "c_light_blue", "glyph": "." }, + "sound_category": "drizzle", + "sun_intensity": "light", + "requirements": { "pressure_max": 1000, "humidity_min": 97, "humidity_and_pressure": false, "required_weathers": [ "light_drizzle" ] } + }, + { + "id": "rain", + "type": "weather_type", + "name": "Rain", + "color": "c_blue", + "map_color": "h_blue", + "glyph": "o", + "ranged_penalty": 3, + "sight_penalty": 1.1, + "light_modifier": -30, + "sound_attn": 4, + "dangerous": false, + "precip": "heavy", + "rains": true, + "acidic": false, + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.02, "color": "c_light_blue", "glyph": "," }, + "sound_category": "rainy", + "sun_intensity": "light", + "requirements": { + "pressure_max": 993, + "humidity_min": 98, + "humidity_and_pressure": false, + "required_weathers": [ "light_drizzle", "drizzle" ] + } + }, + { + "id": "thunder", + "type": "weather_type", + "name": "Thunder Storm", + "color": "c_dark_gray", + "map_color": "i_blue", + "glyph": "%", + "ranged_penalty": 4, + "sight_penalty": 1.2, + "light_modifier": -40, + "sound_attn": 8, + "dangerous": false, + "precip": "heavy", + "rains": true, + "acidic": false, + "effects": [ + { + "one_in_chance": 50, + "must_be_outside": false, + "sound_message": "You hear a distant rumble of thunder.", + "sound_effect": "thunder_far" + } + ], + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.02, "color": "c_light_blue", "glyph": "." }, + "sound_category": "thunder", + "sun_intensity": "none", + "requirements": { "pressure_max": 996, "required_weathers": [ "rain" ] } + }, + { + "id": "lightning", + "type": "weather_type", + "name": "Lightning Storm", + "color": "c_yellow", + "map_color": "h_yellow", + "glyph": "%", + "ranged_penalty": 4, + "sight_penalty": 1.25, + "light_modifier": -45, + "sound_attn": 8, + "dangerous": false, + "precip": "heavy", + "rains": true, + "acidic": false, + "effects": [ + { + "one_in_chance": 50, + "must_be_outside": false, + "sound_message": "You hear a distant rumble of thunder.", + "sound_effect": "thunder_far" + }, + { + "one_in_chance": 600, + "must_be_outside": false, + "message": "A flash of lightning illuminates your surroundings!.", + "sound_effect": "thunder_near", + "lightning": true + } + ], + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.04, "color": "c_light_blue", "glyph": "," }, + "sound_category": "thunder", + "sun_intensity": "none", + "requirements": { "pressure_max": 990, "required_weathers": [ "thunder" ] } + }, + { + "id": "acid_drizzle", + "type": "weather_type", + "name": "Acidic Drizzle", + "color": "c_light_green", + "map_color": "c_yellow_green", + "glyph": ".", + "ranged_penalty": 2, + "sight_penalty": 1.03, + "light_modifier": -20, + "sound_attn": 1, + "dangerous": true, + "precip": "light", + "rains": true, + "acidic": true, + "effects": [ + { + "time_between": "3 minutes", + "must_be_outside": true, + "message": "The acid rain stings, but is mostly harmless for now…", + "rain_proof": true, + "pain_max": 10, + "pain": 1 + } + ], + "tiles_animation": "weather_acid_drop", + "weather_animation": { "factor": 0.01, "color": "c_light_green", "glyph": "." }, + "sound_category": "drizzle", + "sun_intensity": "normal", + "requirements": { "acidic": true, "required_weathers": [ "drizzle" ] } + }, + { + "id": "acid_rain", + "type": "weather_type", + "name": "Acid Rain", + "color": "c_green", + "map_color": "c_yellow_green", + "glyph": "o", + "ranged_penalty": 4, + "sight_penalty": 1.1, + "light_modifier": -30, + "sound_attn": 4, + "dangerous": true, + "precip": "heavy", + "rains": true, + "acidic": true, + "effects": [ + { + "time_between": "2 seconds", + "must_be_outside": true, + "message": "The acid rain burns!", + "rain_proof": true, + "pain_max": 100, + "pain": 3 + } + ], + "tiles_animation": "weather_acid_drop", + "weather_animation": { "factor": 0.02, "color": "c_light_green", "glyph": "," }, + "sound_category": "rainy", + "sun_intensity": "none", + "requirements": { "acidic": true, "required_weathers": [ "rain" ] } + }, + { + "id": "flurries", + "type": "weather_type", + "name": "Flurries", + "color": "c_white", + "map_color": "c_dark_gray_cyan", + "glyph": ".", + "ranged_penalty": 2, + "sight_penalty": 1.12, + "light_modifier": -15, + "sound_attn": 2, + "dangerous": false, + "precip": "light", + "rains": false, + "acidic": false, + "tiles_animation": "weather_snowflake", + "weather_animation": { "factor": 0.01, "color": "c_white", "glyph": "." }, + "sound_category": "flurries", + "sun_intensity": "light", + "requirements": { "temperature_max": 33, "required_weathers": [ "drizzle" ] } + }, + { + "id": "snowing", + "type": "weather_type", + "name": "Snowing", + "color": "c_white", + "map_color": "c_dark_gray_cyan", + "glyph": "*", + "ranged_penalty": 4, + "sight_penalty": 1.3, + "light_modifier": -20, + "sound_attn": 4, + "dangerous": false, + "precip": "heavy", + "rains": false, + "acidic": false, + "effects": [ { "must_be_outside": true, "wet": 10 } ], + "tiles_animation": "weather_snowflake", + "weather_animation": { "factor": 0.02, "color": "c_white", "glyph": "," }, + "sound_category": "snow", + "sun_intensity": "light", + "requirements": { "temperature_max": 33, "required_weathers": [ "rain", "thunder", "lightning" ] } + }, + { + "id": "snowstorm", + "type": "weather_type", + "name": "Snowstorm", + "color": "c_white", + "map_color": "c_white_cyan", + "glyph": "%", + "ranged_penalty": 6, + "sight_penalty": 1.2, + "light_modifier": -30, + "sound_attn": 6, + "dangerous": false, + "precip": "heavy", + "rains": false, + "acidic": false, + "effects": [ { "must_be_outside": true, "wet": 40 } ], + "tiles_animation": "weather_snowflake", + "weather_animation": { "factor": 0.04, "color": "c_white", "glyph": "*" }, + "sound_category": "snowstorm", + "sun_intensity": "none", + "requirements": { "temperature_max": 33, "windpower_min": 15, "required_weathers": [ "thunder", "lightning" ] } + } +] diff --git a/data/legacy/1/obsolete.json b/data/legacy/1/obsolete.json index ae5e8e6bda3fd..d42cc839b842f 100644 --- a/data/legacy/1/obsolete.json +++ b/data/legacy/1/obsolete.json @@ -8,8 +8,8 @@ "color": "yellow", "description": "Conical Ball .22 is a variety of .22 ammunition with a very small propellant charge and generally lacks gunpowder. The end result is a subsonic round. It is nearly silent, but is so weak as to be nearly useless. This one has been handmade using an intact casing.", "material": [ "steel", "powder" ], - "volume": 1, - "weight": 3, + "volume": "250 ml", + "weight": "3 g", "bashing": 1, "ammo_type": "22", "casing": "22_casing", @@ -30,8 +30,8 @@ "color": "yellow", "description": "Rat-shot is extremely weak ammunition, designed for killing rats, snakes, or other small vermin while being unable to damage walls. It has an extremely short range and is unable to injure all but the smallest creatures. This one has been handmade using an intact casing.", "material": [ "steel", "powder" ], - "volume": 1, - "weight": 3, + "volume": "250 ml", + "weight": "3 g", "bashing": 1, "ammo_type": "22", "casing": "22_casing", @@ -52,8 +52,8 @@ "color": "red", "description": "A hand-reloaded beanbag round for shotguns, not deadly but designed to disable.", "material": [ "plastic", "powder" ], - "volume": 1, - "weight": 46, + "volume": "250 ml", + "weight": "46 g", "ammo_type": "shot", "casing": "shot_hull", "damage": 8, @@ -72,8 +72,8 @@ "description": "A homemade, rechargeable power cell built from salvaged electronics. With enough electronics skill, you could attach it to an electric-powered device to provide it with energy. The power cell is not compatible with standard batteries; it must be re-energized via a special recharging station.", "price": 2000, "material": [ "plastic", "aluminum" ], - "weight": 142, - "volume": 1, + "weight": "142 g", + "volume": "250 ml", "to_hit": -2, "category": "spare_parts" }, @@ -82,7 +82,7 @@ "id": "brew_bum_wine", "name": "cheap wine must", "description": "Unfermented grape wine. A hearty mix of pressed grapes, with some added brandy to fortify it.", - "weight": 46, + "weight": "46 g", "color": "red", "container": "jug_plastic", "flags": [ "TRADER_AVOID" ], @@ -92,7 +92,7 @@ "fun": -15, "price": 0, "material": [ "fruit", "water" ], - "volume": 1, + "volume": "250 ml", "charges": 7, "phase": "liquid", "comestible_type": "DRINK", @@ -110,8 +110,8 @@ "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], "skill": "shotgun", "ammo": [ "shot" ], - "weight": 1814, - "volume": 4, + "weight": "1814 g", + "volume": "1 L", "bashing": 12, "to_hit": -1, "ranged_damage": 4, @@ -146,8 +146,8 @@ "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ], "skill": "shotgun", "ammo": [ "shot" ], - "weight": 1133, - "volume": 6, + "weight": "1133 g", + "volume": "1500 ml", "bashing": 12, "to_hit": -1, "ranged_damage": 1, @@ -166,12 +166,12 @@ "name": "spare magazine", "description": "A spare magazine you can keep on hand to make reloads faster, but must itself be reloaded before it can be used again.", "location": "accessories", - "weight": 330, + "weight": "330 g", "color": "light_gray", "symbol": ":", "material": [ "steel", "plastic" ], "mod_targets": [ "pistol", "shotgun", "smg", "rifle" ], - "volume": 1, + "volume": "250 ml", "price": 5000 }, { @@ -181,13 +181,13 @@ "clip_size_modifier": 50, "description": "Increases the ammunition capacity of your firearm by 50%.", "location": "magazine", - "weight": 495, + "weight": "495 g", "to_hit": -1, "color": "light_gray", "symbol": ":", "material": [ "steel", "plastic" ], "mod_targets": [ "pistol", "shotgun", "smg", "rifle" ], - "volume": 1, + "volume": "250 ml", "price": 5600 }, { @@ -197,12 +197,12 @@ "clip_size_modifier": 100, "description": "Completely doubles the ammunition capacity of your firearm.", "location": "magazine", - "weight": 660, + "weight": "660 g", "color": "light_gray", "symbol": ":", "material": [ "steel", "plastic" ], "mod_targets": [ "shotgun", "smg", "rifle", "pistol" ], - "volume": 2, + "volume": "500 ml", "price": 7200 }, { @@ -215,8 +215,8 @@ "description": "10 plastic bags, folded smooth and wrapped tightly together with a string.", "price": 500, "material": [ "plastic" ], - "weight": 10, - "volume": 1, + "weight": "10 g", + "volume": "250 ml", "to_hit": 1 }, { @@ -227,13 +227,13 @@ "dispersion_modifier": 90, "damage_modifier": 6, "description": "This is a complete conversion kit, designed to turn a rifle into a powerful battle rifle. It reduces accuracy, and increases noise and recoil, but also increases damage and fire rate.", - "weight": 589, + "weight": "589 g", "color": "magenta", "symbol": ":", "material": [ "steel" ], "mod_targets": [ "rifle" ], - "volume": 2, - "integral_volume": 0, + "volume": "500 ml", + "integral_volume": "0 L", "burst_modifier": 4, "recoil_modifier": 60, "price": 68000, @@ -248,13 +248,13 @@ "dispersion_modifier": -150, "damage_modifier": 8, "description": "This is a complete conversion kit, designed to turn a rifle into a deadly sniper rifle. It removes any automatic fire capabilities but also increases accuracy and damage.", - "weight": 589, + "weight": "589 g", "color": "green", "symbol": ":", "material": [ "steel" ], "mod_targets": [ "rifle" ], - "volume": 2, - "integral_volume": 0, + "volume": "500 ml", + "integral_volume": "0 L", "burst_modifier": -99, "price": 66000, "min_skills": [ [ "gun", 8 ] ], @@ -270,8 +270,8 @@ "description": "A large block of semi-processed coal.", "price": 60000, "material": [ "stone" ], - "weight": 13840, - "volume": 72, + "weight": "13840 g", + "volume": "18 L", "bashing": 8, "to_hit": -5 }, @@ -285,8 +285,8 @@ "color": "dark_gray", "description": "These are smaller pieces of charcoal used in smaller heating devices.", "material": [ "wood" ], - "volume": 1, - "weight": 22, + "volume": "250 ml", + "weight": "22 g", "phase": "solid", "ammo_type": "charcoal", "count": 10, @@ -302,8 +302,8 @@ "color": "dark_gray", "description": "These are smaller pieces of coal used in smaller heating devices.", "material": [ "wood" ], - "volume": 1, - "weight": 22, + "volume": "250 ml", + "weight": "22 g", "ammo_type": "charcoal", "count": 10, "stack_size": 20 @@ -317,8 +317,8 @@ "color": "white", "description": "Also known as a flight, this item provides aerodynamic stabilization of arrows. You'll need to put these on your arrows to make them functional.", "material": [ "paper" ], - "volume": 1, - "weight": 1, + "volume": "250 ml", + "weight": "1 g", "bashing": 1, "ammo_type": "components", "count": 10, @@ -328,7 +328,7 @@ "type": "ARMOR", "id": "helmet_netting", "name": "helmet netting", - "weight": 25, + "weight": "25 g", "color": "green", "covers": [ "HEAD" ], "to_hit": -1, @@ -337,7 +337,7 @@ "flags": [ "OVERSIZE", "BELTED", "WATER_FRIENDLY" ], "price": 2000, "material": [ "cotton" ], - "volume": 0, + "volume": "0 L", "coverage": 12, "material_thickness": 1 }, @@ -350,8 +350,8 @@ "category": "other", "description": "A small metal tank for holding gas or liquids. Useful for crafting.", "price": 6000, - "weight": 3200, - "volume": 45, + "weight": "3200 g", + "volume": "11250 ml", "bashing": 5, "to_hit": -3, "material": [ "steel" ] @@ -367,8 +367,8 @@ "material": [ "steel", "plastic" ], "flags": [ "CHARGE", "NO_UNLOAD", "NEVER_JAMS", "NO_UNLOAD" ], "skill": "rifle", - "weight": 1814, - "volume": 13, + "weight": "1814 g", + "volume": "3250 ml", "bashing": 8, "to_hit": -1, "dispersion": 10, @@ -396,8 +396,8 @@ "color": "yellow", "description": "A single capacitor charged with current to be used by a laser weapon or similar armament.", "material": [ "steel" ], - "volume": 1, - "weight": 5 + "volume": "250 ml", + "weight": "5 g" }, { "id": "inhaler_stimgas", @@ -405,8 +405,8 @@ "comestible_type": "MED", "name": "stimgas inhaler", "description": "A powerful stimulant with no risk of addiction.", - "weight": 10, - "volume": 1, + "weight": "10 g", + "volume": "250 ml", "price": 750, "charges": 25, "material": [ "plastic" ], @@ -422,8 +422,8 @@ "comestible_type": "MED", "name": "sewagas inhaler", "description": "A powerful hallucinogen with low risk of addiction.", - "weight": 10, - "volume": 1, + "weight": "10 g", + "volume": "250 ml", "price": 500, "charges": 25, "material": [ "plastic" ], @@ -451,8 +451,8 @@ "flags": [ "RELOAD_AND_SHOOT", "NEVER_JAMS", "PRIMITIVE_RANGED_WEAPON" ], "skill": "archery", "ammo": [ "dart" ], - "weight": 440, - "volume": 4, + "weight": "440 g", + "volume": "1 L", "bashing": 8, "to_hit": -2, "dispersion": 75, @@ -470,8 +470,8 @@ "color": "yellow", "description": "A handful of darts, useful as ammunition for blowguns.", "material": [ "wood" ], - "volume": 1, - "weight": 1, + "volume": "250 ml", + "weight": "1 g", "ammo_type": "dart", "damage": 1, "range": 30, @@ -490,8 +490,8 @@ "description": "An electrode plate from a lead-acid battery.", "price": 10, "material": [ "steel" ], - "weight": 400, - "volume": 1, + "weight": "400 g", + "volume": "250 ml", "bashing": 4, "to_hit": -2 }, @@ -501,8 +501,8 @@ "name": "active nail bomb", "description": "This is an active nail bomb, likely to explode any second now. Better throw it!", "category": "weapons", - "weight": 290, - "volume": 2, + "weight": "290 g", + "volume": "500 ml", "price": 0, "material": [ "steel", "plastic" ], "symbol": "*", @@ -528,8 +528,8 @@ "name": "forged sword", "description": "A common short sword, forged from several pieces of steel. The pointy end is the dangerous one.", "material": [ "steel" ], - "volume": 8, - "weight": 700, + "volume": "2 L", + "weight": "700 g", "bashing": 4, "cutting": 14, "to_hit": 2, @@ -546,8 +546,8 @@ "category": "other", "material": [ "wood" ], "flags": [ "NO_SALVAGE", "TRADER_AVOID" ], - "weight": 6, - "volume": 0, + "weight": "6 g", + "volume": "0 L", "to_hit": -5, "qualities": [ [ "COOK", 1 ] ] }, diff --git a/data/legacy/3/crazy.json b/data/legacy/3/crazy.json index c1b2cef436118..4ddad28328f6f 100644 --- a/data/legacy/3/crazy.json +++ b/data/legacy/3/crazy.json @@ -9,8 +9,8 @@ "category": "weapons", "name": "Granade", "description": "Attached to this grenade is a name tag with the name Kevin written on it. Does not seem to work like a grenade, handle with care.", - "weight": 180, - "volume": 1, + "weight": "180 g", + "volume": "250 ml", "price": 40000, "to_hit": -1, "bashing": 6, @@ -25,8 +25,8 @@ "category": "weapons", "name": "active Granade", "description": "Attached to this grenade is a name tag with the name Kevin written on it. Does not seem to work like a grenade, handle with care. Better throw it!", - "weight": 180, - "volume": 1, + "weight": "180 g", + "volume": "250 ml", "price": 0, "to_hit": -1, "bashing": 6, diff --git a/data/legacy/4/boots.json b/data/legacy/4/boots.json index 368d17a085ae2..36d9718eb42b8 100644 --- a/data/legacy/4/boots.json +++ b/data/legacy/4/boots.json @@ -4,8 +4,8 @@ "type": "ARMOR", "name": { "str": "pair of boots", "str_pl": "pairs of boots" }, "description": "Tough leather boots. Very durable.", - "weight": 1060, - "volume": 10, + "weight": "1060 g", + "volume": "2500 ml", "price": 10000, "to_hit": -1, "bashing": 1, @@ -43,8 +43,8 @@ "category": "armor", "name": { "str": "pair of bone armor boots", "str_pl": "pairs of bone armor boots" }, "description": "Leather boots armored with reinforcements made from bone. Light and strong.", - "weight": 1824, - "volume": 17, + "weight": "1824 g", + "volume": "4250 ml", "price": 13500, "to_hit": -1, "bashing": 4, @@ -82,8 +82,8 @@ "category": "armor", "name": { "str": "pair of turnout boots", "str_pl": "pairs of turnout boots" }, "description": "A pair of steel-toed rubber boots, the sort worn by firefighters. Highly resistant to heat and flame, they provide excellent protection from injury.", - "weight": 1930, - "volume": 14, + "weight": "1930 g", + "volume": "3500 ml", "price": 13000, "to_hit": 2, "material": [ "plastic", "nomex" ], @@ -120,8 +120,8 @@ "category": "armor", "name": { "str": "pair of chitinous boots", "str_pl": "pairs of chitinous boots" }, "description": "Boots made from the exoskeletons of insects. Light and durable.", - "weight": 1620, - "volume": 17, + "weight": "1620 g", + "volume": "4250 ml", "price": 13500, "to_hit": -1, "bashing": 4, @@ -159,8 +159,8 @@ "category": "armor", "name": { "str": "pair of combat boots", "str_pl": "pairs of combat boots" }, "description": "Modern reinforced tactical combat boots. Very durable.", - "weight": 1060, - "volume": 8, + "weight": "1060 g", + "volume": "2 L", "price": 7000, "to_hit": -1, "bashing": 1, @@ -198,8 +198,8 @@ "category": "armor", "name": { "str": "pair of survivor fireboots", "str_pl": "pairs of survivor fireboots" }, "description": "A pair of customized, Kevlar armored Nomex boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1980, - "volume": 12, + "weight": "1980 g", + "volume": "3 L", "price": 24000, "to_hit": -1, "bashing": 1, @@ -236,8 +236,8 @@ "type": "ARMOR", "name": { "str": "pair of fur boots", "str_pl": "pairs of fur boots" }, "description": "Boots lined with fur for warmth.", - "weight": 1890, - "volume": 18, + "weight": "1890 g", + "volume": "4500 ml", "price": 14000, "to_hit": -1, "bashing": 1, @@ -275,8 +275,8 @@ "category": "armor", "name": { "str": "pair of survivor wetsuit boots", "str_pl": "pairs of survivor wetsuit boots" }, "description": "A pair of customized, Kevlar armored neoprene boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1180, - "volume": 6, + "weight": "1180 g", + "volume": "1500 ml", "price": 24000, "to_hit": -1, "bashing": 1, @@ -313,8 +313,8 @@ "type": "ARMOR", "name": { "str": "pair of hiking boots", "str_pl": "pairs of hiking boots" }, "description": "Tough yet light leather boots. Durable and comfortable.", - "weight": 960, - "volume": 8, + "weight": "960 g", + "volume": "2 L", "price": 14000, "to_hit": -1, "bashing": 1, @@ -352,8 +352,8 @@ "category": "armor", "name": { "str": "pair of heavy survivor boots", "str_pl": "pairs of heavy survivor boots" }, "description": "A pair of customized Kevlar boots, heavily armored with steel and modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1610, - "volume": 12, + "weight": "1610 g", + "volume": "3 L", "price": 24000, "to_hit": -1, "bashing": 1, @@ -391,8 +391,8 @@ "category": "armor", "name": { "str": "pair of leather armor boots", "str_pl": "pairs of leather armor boots" }, "description": "Thick leather boots made specifically to protect the feet. Light and tough.", - "weight": 902, - "volume": 8, + "weight": "902 g", + "volume": "2 L", "price": 12500, "to_hit": -1, "bashing": 4, @@ -430,8 +430,8 @@ "category": "armor", "name": { "str": "pair of light survivor boots", "str_pl": "pairs of light survivor boots" }, "description": "A pair of customized, Kevlar armored cloth boots, modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1120, - "volume": 8, + "weight": "1120 g", + "volume": "2 L", "price": 24000, "to_hit": -1, "bashing": 1, @@ -469,8 +469,8 @@ "category": "armor", "name": { "str": "pair of armored boots", "str_pl": "pairs of armored boots" }, "description": "An extremely heavy set of armor plated boots.", - "weight": 1890, - "volume": 13, + "weight": "1890 g", + "volume": "3250 ml", "price": 50000, "to_hit": -2, "bashing": 7, @@ -507,8 +507,8 @@ "type": "ARMOR", "name": { "str": "pair of rubber boots", "str_pl": "pairs of rubber boots" }, "description": "A pair of rubber boots, often used while cleaning with caustic materials.", - "weight": 980, - "volume": 14, + "weight": "980 g", + "volume": "3500 ml", "price": 8000, "to_hit": 2, "material": [ "plastic" ], @@ -544,8 +544,8 @@ "type": "ARMOR", "name": { "str": "pair of steeltoed boots", "str_pl": "pairs of steeltoed boots" }, "description": "Leather boots with a steel toe. Extremely durable.", - "weight": 1320, - "volume": 12, + "weight": "1320 g", + "volume": "3 L", "price": 12000, "to_hit": -1, "bashing": 4, @@ -583,8 +583,8 @@ "category": "armor", "name": { "str": "pair of survivor boots", "str_pl": "pairs of survivor boots" }, "description": "A pair of customized leather boots, armored with Kevlar and modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1330, - "volume": 10, + "weight": "1330 g", + "volume": "2500 ml", "price": 24000, "to_hit": -1, "bashing": 1, @@ -621,8 +621,8 @@ "type": "ARMOR", "name": { "str": "pair of western boots", "str_pl": "pairs of western boots" }, "description": "Stiff leather boots with intricate embroidery and one-inch heels. They look good, but aren't made for running.", - "weight": 1060, - "volume": 10, + "weight": "1060 g", + "volume": "2500 ml", "price": 15000, "to_hit": -1, "bashing": 1, @@ -659,8 +659,8 @@ "type": "ARMOR", "name": { "str": "pair of winter boots", "str_pl": "pairs of winter boots" }, "description": "Cumbersome boots designed for warmth.", - "weight": 1640, - "volume": 14, + "weight": "1640 g", + "volume": "3500 ml", "price": 7000, "to_hit": -1, "material": [ "wool", "plastic" ], @@ -697,8 +697,8 @@ "category": "armor", "name": { "str": "pair of winter survivor boots", "str_pl": "pairs of winter survivor boots" }, "description": "A pair of customized, Kevlar armored fur boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1760, - "volume": 14, + "weight": "1760 g", + "volume": "3500 ml", "price": 24000, "to_hit": -1, "bashing": 1, @@ -736,8 +736,8 @@ "category": "armor", "name": { "str": "pair of XL survivor boots", "str_pl": "pairs of XL survivor boots" }, "description": "A massive pair of customized leather boots, armored with Kevlar and modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 2460, - "volume": 20, + "weight": "2460 g", + "volume": "5 L", "price": 24000, "to_hit": -1, "bashing": 1, @@ -774,8 +774,8 @@ "type": "ARMOR", "name": { "str": "pair of knee-high boots", "str_pl": "pairs of knee-high boots" }, "description": "Very long leather boots that cover the lower legs. Difficult to wear but extremely durable.", - "weight": 1520, - "volume": 15, + "weight": "1520 g", + "volume": "3750 ml", "price": 8000, "to_hit": -1, "bashing": 1, @@ -812,8 +812,8 @@ "type": "ARMOR", "name": { "str": "pair of rollerblades", "str_pl": "pairs of rollerblades" }, "description": "A pair of inline skates. Very fast on flat floors, but they make it hard to move on rough terrain, or to dodge effectively.", - "weight": 1640, - "volume": 15, + "weight": "1640 g", + "volume": "3750 ml", "price": 8500, "to_hit": -2, "material": [ "plastic", "cotton" ], @@ -849,8 +849,8 @@ "type": "ARMOR", "name": { "str": "pair of rollerskates", "str_pl": "pairs of rollerskates" }, "description": "An old-fashioned pair of leather rollerskates with steel frames. While quite fast on flat floors, they make it difficult to move on rough terrain.", - "weight": 2720, - "volume": 12, + "weight": "2720 g", + "volume": "3 L", "price": 8500, "to_hit": -2, "bashing": 6, diff --git a/data/legacy/5/vehicle_parts.json b/data/legacy/5/vehicle_parts.json index 924fe9d2faf1c..63ba8bcd2170f 100644 --- a/data/legacy/5/vehicle_parts.json +++ b/data/legacy/5/vehicle_parts.json @@ -4,12 +4,12 @@ "id": "v_curtain_item", "name": { "str": "vehicle curtain" }, "description": "A rod, a few metal rings, and a large piece of cloth with some strings attached for securely fastening the edges.", - "weight": 2200, + "weight": "2200 g", "to_hit": -4, "color": "white", "symbol": "\"", "material": [ "cotton", "steel" ], - "volume": 20, + "volume": "5 L", "bashing": 1, "category": "veh_parts", "price": 3500 diff --git a/data/mods/Aftershock/itemgroups/bionics_groups.json b/data/mods/Aftershock/itemgroups/bionics_groups.json new file mode 100644 index 0000000000000..2fee362616910 --- /dev/null +++ b/data/mods/Aftershock/itemgroups/bionics_groups.json @@ -0,0 +1,44 @@ +[ + { + "id": "bionics", + "type": "item_group", + "items": [ + [ "bn_bio_solar", 10 ], + [ "afs_bio_wind_turbine", 5 ], + [ "afs_bio_missiles", 10 ], + [ "afs_bio_linguistic_coprocessor", 10 ], + [ "afs_bio_dopamine_stimulators", 10 ], + [ "bio_blaster", 5 ] + ] + }, + { + "id": "bionics_common", + "type": "item_group", + "items": [ [ "bn_bio_solar", 10 ], [ "afs_bio_wind_turbine", 5 ], [ "afs_bio_linguistic_coprocessor", 8 ] ] + }, + { + "id": "bionics_mil", + "type": "item_group", + "items": [ [ "bio_blaster", 5 ] ] + }, + { + "id": "bionics_sci", + "type": "item_group", + "items": [ [ "bn_bio_solar", 5 ], [ "afs_bio_wind_turbine", 2 ] ] + }, + { + "id": "bionics_op", + "type": "item_group", + "items": [ + [ "bn_bio_solar", 15 ], + [ "afs_bio_wind_turbine", 10 ], + [ "afs_bio_missiles", 10 ], + [ "afs_bio_dopamine_stimulators", 10 ] + ] + }, + { + "id": "bionics_subs", + "type": "item_group", + "items": [ [ "afs_bio_missiles", 10 ], [ "afs_bio_dopamine_stimulators", 15 ] ] + } +] diff --git a/data/mods/Aftershock/items/item_groups.json b/data/mods/Aftershock/itemgroups/item_groups.json similarity index 63% rename from data/mods/Aftershock/items/item_groups.json rename to data/mods/Aftershock/itemgroups/item_groups.json index e8b118bc87a82..5c4387a424d0b 100644 --- a/data/mods/Aftershock/items/item_groups.json +++ b/data/mods/Aftershock/itemgroups/item_groups.json @@ -1,4 +1,174 @@ [ + { + "id": "afs_weapons_rare", + "type": "item_group", + "items": [ + [ "emp_gun", 3 ], + [ "laser_rifle", 5 ], + [ "v29", 7 ], + [ "afs_hydraulic_gauntlet", 3 ], + [ "afs_energy_saber_off", 3 ], + [ "ftk93", 5 ], + [ "afs_hardlight_longbow", 2 ] + ] + }, + { + "id": "afs_lab_mechanics_books", + "type": "item_group", + "items": [ + [ "manual_mechanics", 6 ], + [ "textbook_mechanics", 3 ], + [ "textbook_biodiesel", 3 ], + [ "mag_fieldrepair", 4 ], + [ "book_icef", 4 ] + ] + }, + { + "id": "chem_lab", + "type": "item_group", + "items": [ [ "panacea", 1 ], [ "afs_calorie_pill", 5 ], [ "afs_sundew", 8 ] ] + }, + { + "id": "rare", + "type": "item_group", + "items": [ + [ "afs_calorie_pill", 10 ], + [ "afs_sundew", 10 ], + [ "afs_bag_of_holding", 1 ], + [ "afs_atomic_smartphone", 5 ], + [ "laser_pack", 10 ], + [ "ftk93", 5 ], + [ "atomic_butterchurn", 5 ] + ] + }, + { + "id": "spider", + "type": "item_group", + "items": [ [ "afs_energy_saber_off", 1 ], [ "afs_bag_of_holding", 2 ], [ "afs_hydraulic_gauntlet", 1 ] ] + }, + { + "id": "survivorzed_extra", + "type": "item_group", + "items": [ [ "afs_rolling_pin_barbed_wire", 5 ], [ "afs_chain_wrench", 8 ] ] + }, + { + "id": "camping", + "type": "item_group", + "items": [ [ "afs_rope_lighter", 10 ], [ "atomic_light", 1 ] ] + }, + { + "id": "allsporting", + "type": "item_group", + "items": [ [ "afs_rope_lighter", 10 ] ] + }, + { + "id": "traveler", + "type": "item_group", + "items": [ [ "afs_rope_lighter", 10 ] ] + }, + { + "id": "drugdealer", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 3 ], [ "afs_bio_missiles", 8 ] ] + }, + { + "id": "kitchen", + "type": "item_group", + "items": [ [ "afs_atompot", 1 ], [ "atomic_butterchurn", 1 ] ] + }, + { + "id": "oven", + "type": "item_group", + "items": [ [ "afs_atompot", 3 ] ] + }, + { + "id": "bed", + "type": "item_group", + "items": [ [ "afs_quilt", 10 ], [ "afs_quilt_patchwork", 8 ] ] + }, + { + "id": "livingroom", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] + }, + { + "id": "bedroom", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] + }, + { + "id": "consumer_electronics", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 2 ], [ "atomic_light", 4 ] ] + }, + { + "id": "electronics", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] + }, + { + "id": "lab_dorm", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 5 ], [ "atomic_light", 3 ] ] + }, + { + "id": "subway", + "type": "item_group", + "items": [ [ "afs_atomic_smartphone", 1 ] ] + }, + { + "id": "hardware", + "type": "item_group", + "items": [ [ "afs_power_cutter", 5 ], [ "atomic_butterchurn", 1 ] ] + }, + { + "id": "hardware_bulk", + "type": "item_group", + "//": "Not something you get in bulk, but it makes sense to be out in the back area", + "items": [ [ "afs_power_cutter", 1 ] ] + }, + { + "id": "mischw", + "type": "item_group", + "subtype": "collection", + "items": [ [ "afs_power_cutter", 5 ] ] + }, + { + "id": "book_gunref", + "type": "item_group", + "items": [ + [ "afs_textbook_shotguns", 3 ], + [ "afs_textbook_handguns", 3 ], + [ "afs_textbook_rifles", 3 ], + [ "afs_textbook_launchers", 3 ] + ] + }, + { + "id": "book_military", + "type": "item_group", + "items": [ + [ "afs_textbook_shotguns", 20 ], + [ "afs_textbook_handguns", 20 ], + [ "afs_textbook_rifles", 20 ], + [ "afs_textbook_launchers", 10 ] + ] + }, + { + "id": "textbooks", + "type": "item_group", + "items": [ + [ "afs_textbook_shotguns", 3 ], + [ "afs_textbook_handguns", 3 ], + [ "afs_textbook_rifles", 3 ], + [ "afs_textbook_launchers", 3 ], + [ "textbook_atomic", 8 ] + ] + }, + { + "id": "guns_pistol_improvised", + "type": "item_group", + "items": [ [ "v29_cheap", 10 ] ] + }, { "type": "item_group", "id": "afs_gardener_worn", @@ -104,98 +274,6 @@ [ "afs_neural_io_2", 15 ] ] }, - { - "id": "surgery", - "//": "extension of vanilla itemgroup", - "type": "item_group", - "items": [ [ "bionic_maintenance_toolkit", 20 ], [ "afs_biomaterial_4", 10 ], [ "afs_neural_io_3", 5 ] ] - }, - { - "id": "jewelry_accessories", - "type": "item_group", - "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_tooth", 35 ], [ "afs_titanium_ring", 35 ] ] - }, - { - "id": "rings_and_things", - "type": "item_group", - "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] - }, - { - "id": "jewelry_back", - "type": "item_group", - "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] - }, - { - "id": "jewelry_front", - "type": "item_group", - "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] - }, - { - "id": "weapons", - "type": "item_group", - "items": [ [ "afs_titanium_bat", 40 ] ] - }, - { - "id": "allsporting", - "type": "item_group", - "items": [ [ "afs_titanium_bat", 40 ] ] - }, - { - "id": "sports", - "type": "item_group", - "items": [ [ "afs_titanium_bat", 40 ] ] - }, - { - "id": "college_sports", - "type": "item_group", - "items": [ [ "afs_titanium_bat", 60 ] ] - }, - { - "id": "supplies_mechanics", - "type": "item_group", - "items": [ [ "afs_titanium_frame", 5 ] ] - }, - { - "id": "bikeshop_tools", - "type": "item_group", - "items": [ [ "afs_titanium_frame", 5 ] ] - }, - { - "type": "item_group", - "id": "steel_mill_foundry", - "items": [ [ "afs_titanium_small", 5 ], { "item": "afs_scrap_titanium", "prob": 5, "count": [ 1, 4 ] } ] - }, - { - "id": "oa_ig_rd_metal_trash", - "type": "item_group", - "items": [ [ "afs_titanium_frame", 5 ], { "item": "afs_scrap_titanium", "prob": 10, "count": [ 2, 8 ] } ] - }, - { - "id": "supplies_metal", - "type": "item_group", - "items": [ - { "item": "afs_titanium_frame", "prob": 5 }, - { "item": "afs_scrap_titanium", "prob": 5, "count": [ 2, 8 ] }, - [ "afs_titanium_small", 5 ] - ] - }, - { - "id": "clothing_watch", - "type": "item_group", - "items": [ { "item": "afs_titanium_watch", "prob": 50 } ] - }, - { - "id": "accessory_ring", - "type": "item_group", - "subtype": "distribution", - "items": [ { "item": "afs_titanium_ring", "prob": 50 } ] - }, - { - "id": "accessory_teeth", - "type": "item_group", - "subtype": "distribution", - "items": [ [ "afs_titanium_tooth", 25 ] ] - }, { "id": "swat_gear", "type": "item_group", @@ -254,29 +332,6 @@ "subtype": "collection", "items": [ [ "q_solarpack", 1 ] ] }, - { - "type": "item_group", - "id": "afs_scrapgroup", - "items": [ - [ "afs_biomaterial_1", 40 ], - [ "afs_biomaterial_2", 20 ], - [ "afs_biomaterial_3", 10 ], - [ "afs_biomaterial_4", 3 ], - [ "afs_circuitry_1", 25 ], - [ "afs_circuitry_2", 14 ], - [ "afs_circuitry_3", 6 ], - [ "afs_energy_storage_1", 30 ], - [ "afs_energy_storage_2", 19 ], - [ "afs_energy_storage_3", 2 ], - [ "afs_magnet_1", 18 ], - [ "afs_material_1", 100 ], - [ "afs_material_2", 40 ], - [ "afs_material_3", 20 ], - [ "afs_neural_io_1", 65 ], - [ "afs_neural_io_2", 10 ], - [ "plut_cell", 20 ] - ] - }, { "type": "item_group", "id": "exoticplants", diff --git a/data/mods/Aftershock/itemgroups/nuclear_reactor_groups.json b/data/mods/Aftershock/itemgroups/nuclear_reactor_groups.json new file mode 100644 index 0000000000000..f7d6375203b55 --- /dev/null +++ b/data/mods/Aftershock/itemgroups/nuclear_reactor_groups.json @@ -0,0 +1,31 @@ +[ + { + "id": "nuclear_waste", + "type": "item_group", + "subtype": "collection", + "entries": [ { "item": "nuclear_waste", "container-item": "hazardous_waste_drum", "charges": 10 } ] + }, + { + "id": "nuclear_reactor", + "type": "item_group", + "subtype": "collection", + "entries": [ + { "item": "nuclear_waste", "count-min": 5, "count-max": 10 }, + { "item": "nuclear_fuel", "count-min": 1, "count-max": 10 } + ] + }, + { + "id": "reactor_gear", + "type": "item_group", + "subtype": "collection", + "entries": [ + { "item": "hazmat_suit", "prob": 33 }, + { "item": "prussian_blue", "prob": 33 }, + { "item": "rad_monitor", "prob": 33 }, + { "item": "iodine", "prob": 33 }, + { "item": "flashlight", "prob": 33 }, + { "item": "1st_aid", "prob": 15 }, + { "item": "geiger_off", "prob": 15 } + ] + } +] diff --git a/data/mods/Aftershock/itemgroups/scrap_groups.json b/data/mods/Aftershock/itemgroups/scrap_groups.json new file mode 100644 index 0000000000000..293f81b734a66 --- /dev/null +++ b/data/mods/Aftershock/itemgroups/scrap_groups.json @@ -0,0 +1,30 @@ +[ + { + "id": "surgery", + "type": "item_group", + "items": [ [ "bionic_maintenance_toolkit", 20 ], [ "afs_biomaterial_4", 10 ], [ "afs_neural_io_3", 5 ] ] + }, + { + "type": "item_group", + "id": "afs_scrapgroup", + "items": [ + [ "afs_biomaterial_1", 40 ], + [ "afs_biomaterial_2", 20 ], + [ "afs_biomaterial_3", 10 ], + [ "afs_biomaterial_4", 3 ], + [ "afs_circuitry_1", 25 ], + [ "afs_circuitry_2", 14 ], + [ "afs_circuitry_3", 6 ], + [ "afs_energy_storage_1", 30 ], + [ "afs_energy_storage_2", 19 ], + [ "afs_energy_storage_3", 2 ], + [ "afs_magnet_1", 18 ], + [ "afs_material_1", 100 ], + [ "afs_material_2", 40 ], + [ "afs_material_3", 20 ], + [ "afs_neural_io_1", 65 ], + [ "afs_neural_io_2", 10 ], + [ "plut_cell", 20 ] + ] + } +] diff --git a/data/mods/Aftershock/itemgroups/titanium_groups.json b/data/mods/Aftershock/itemgroups/titanium_groups.json new file mode 100644 index 0000000000000..2fdbdb5687126 --- /dev/null +++ b/data/mods/Aftershock/itemgroups/titanium_groups.json @@ -0,0 +1,89 @@ +[ + { + "//": "extension of vanilla itemgroups, all adding titanium", + "id": "jewelry_accessories", + "type": "item_group", + "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_tooth", 35 ], [ "afs_titanium_ring", 35 ] ] + }, + { + "id": "rings_and_things", + "type": "item_group", + "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] + }, + { + "id": "jewelry_back", + "type": "item_group", + "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] + }, + { + "id": "jewelry_front", + "type": "item_group", + "items": [ [ "afs_titanium_watch", 35 ], [ "afs_titanium_ring", 35 ] ] + }, + { + "id": "weapons", + "type": "item_group", + "items": [ [ "afs_titanium_bat", 40 ] ] + }, + { + "id": "allsporting", + "type": "item_group", + "items": [ [ "afs_titanium_bat", 40 ] ] + }, + { + "id": "sports", + "type": "item_group", + "items": [ [ "afs_titanium_bat", 40 ] ] + }, + { + "id": "college_sports", + "type": "item_group", + "items": [ [ "afs_titanium_bat", 60 ] ] + }, + { + "id": "supplies_mechanics", + "type": "item_group", + "items": [ [ "afs_titanium_frame", 5 ] ] + }, + { + "id": "bikeshop_tools", + "type": "item_group", + "items": [ [ "afs_titanium_frame", 5 ] ] + }, + { + "type": "item_group", + "id": "steel_mill_foundry", + "items": [ [ "afs_titanium_small", 5 ], { "item": "afs_scrap_titanium", "prob": 5, "count": [ 1, 4 ] } ] + }, + { + "id": "oa_ig_rd_metal_trash", + "type": "item_group", + "items": [ [ "afs_titanium_frame", 5 ], { "item": "afs_scrap_titanium", "prob": 10, "count": [ 2, 8 ] } ] + }, + { + "id": "supplies_metal", + "type": "item_group", + "items": [ + { "item": "afs_titanium_frame", "prob": 5 }, + { "item": "afs_scrap_titanium", "prob": 5, "count": [ 2, 8 ] }, + [ "afs_titanium_small", 5 ] + ] + }, + { + "id": "clothing_watch", + "type": "item_group", + "items": [ { "item": "afs_titanium_watch", "prob": 50 } ] + }, + { + "id": "accessory_ring", + "type": "item_group", + "subtype": "distribution", + "items": [ { "item": "afs_titanium_ring", "prob": 50 } ] + }, + { + "id": "accessory_teeth", + "type": "item_group", + "subtype": "distribution", + "items": [ [ "afs_titanium_tooth", 25 ] ] + } +] diff --git a/data/mods/Aftershock/items/cbms.json b/data/mods/Aftershock/items/cbms.json index 2169f16fb3a6b..0446f6db69961 100644 --- a/data/mods/Aftershock/items/cbms.json +++ b/data/mods/Aftershock/items/cbms.json @@ -55,5 +55,15 @@ "price": 0, "price_postapoc": 0, "difficulty": 8 + }, + { + "id": "afs_bio_skullgun", + "copy-from": "bionic_general", + "type": "BIONIC_ITEM", + "name": { "str": "Skullgun CBM" }, + "description": "Concealed in your head is a single shot .40 pistol. Activate the bionic to fire and reload the skullgun.", + "price": 100000, + "price_postapoc": 1500, + "difficulty": 16 } ] diff --git a/data/mods/Aftershock/items/comestibles.json b/data/mods/Aftershock/items/comestibles.json index 127bf14320281..635e8bb42b274 100644 --- a/data/mods/Aftershock/items/comestibles.json +++ b/data/mods/Aftershock/items/comestibles.json @@ -12,7 +12,7 @@ "quench": -5, "description": "A crumbly white pill half the size of your thumb, packed with vitamins and calories. Provides a whole day's nutrition in portable form, but it's a little hard to keep down, thanks to the rancid taste and chalky texture.", "price": 10000, - "volume": 0, + "volume": "0 L", "charges": 5, "looks_like": "vitamins", "fun": -8, diff --git a/data/mods/Aftershock/items/gun/projectile.json b/data/mods/Aftershock/items/gun/projectile.json new file mode 100644 index 0000000000000..7531f3f51c598 --- /dev/null +++ b/data/mods/Aftershock/items/gun/projectile.json @@ -0,0 +1,25 @@ +[ + { + "id": "bio_skullgun_gun", + "looks_like": "glock_17", + "type": "GUN", + "name": { "str": "bionic skullgun" }, + "description": "Bionic one-shot subdermal .40 pistol integrated with your head.", + "volume": "80 ml", + "price": 0, + "to_hit": -2, + "bashing": 3, + "material": [ "superalloy", "plastic" ], + "symbol": "(", + "color": "magenta", + "skill": "shotgun", + "ammo": [ "40" ], + "ranged_damage": { "damage_type": "bullet", "amount": -8 }, + "dispersion": 855, + "durability": 6, + "clip_size": 1, + "reload": 200, + "flags": [ "NEVER_JAMS", "RELOAD_EJECT", "NO_UNWIELD", "TRADER_AVOID" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "40": 1 } } ] + } +] diff --git a/data/mods/Aftershock/items/items.json b/data/mods/Aftershock/items/items.json index 9673c7f78054e..7251757f304da 100644 --- a/data/mods/Aftershock/items/items.json +++ b/data/mods/Aftershock/items/items.json @@ -20,7 +20,7 @@ "description": "A wide, shallow basin used to hold liquid, hammered from a piece of sheet metal. Ideal for collecting water.", "weight": "5 kg", "looks_like": "ceramic_bowl", - "volume": "2500 ml", + "volume": "2625 ml", "price": 1000, "to_hit": -1, "bashing": 1, diff --git a/data/mods/Aftershock/items/monster_drops.json b/data/mods/Aftershock/items/monster_drops.json deleted file mode 100644 index 23b6f3084a857..0000000000000 --- a/data/mods/Aftershock/items/monster_drops.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "item_group", - "subtype": "collection", - "id": "mon_afs_sentinel_lx_drops", - "entries": [ - { "item": "afs_sentinel_cloak" } - ] -} diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index fe119be50a8da..8597032339992 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -221,21 +221,11 @@ "name": { "str": "UPS", "str_pl": "UPS's" }, "description": "This is a unified power supply, or UPS. It is a device developed jointly by military and scientific interests for use in combat and the field. The UPS is designed to power armor and some guns, but drains batteries quickly. It can be worn around to either leg for ease of access, and it's been waterproofed to protect the delicate electronics. Has it's own custom battery, with higher capacity and rechargeable, but not removeable", "coverage": 5, - "ammo": "battery", - "initial_charges": 1000, - "max_charges": 1500, + "ammo": [ "battery" ], "encumbrance": 2, "covers": [ "LEG_EITHER" ], - "flags": [ "RECHARGE", "WAIST", "FRAGILE", "OVERSIZE", "WATERPROOF", "IS_UPS", "NO_RELOAD", "NO_UNLOAD" ], - "pocket_data": [ - { - "pocket_type": "MAGAZINE_WELL", - "holster": true, - "max_contains_volume": "20 L", - "max_contains_weight": "20 kg", - "item_restriction": [ ] - } - ] + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "battery": 1500 } } ], + "flags": [ "RECHARGE", "WAIST", "FRAGILE", "OVERSIZE", "WATERPROOF", "IS_UPS" ] }, { "id": "adv_UPS_off", diff --git a/data/mods/Aftershock/maps/item_groups.json b/data/mods/Aftershock/maps/item_groups.json deleted file mode 100644 index e1ac01ca46cdc..0000000000000 --- a/data/mods/Aftershock/maps/item_groups.json +++ /dev/null @@ -1,243 +0,0 @@ -[ - { - "id": "afs_weapons_rare", - "type": "item_group", - "items": [ - [ "emp_gun", 3 ], - [ "laser_rifle", 5 ], - [ "v29", 7 ], - [ "afs_hydraulic_gauntlet", 3 ], - [ "afs_energy_saber_off", 3 ], - [ "ftk93", 5 ], - [ "afs_hardlight_longbow", 2 ] - ] - }, - { - "id": "afs_lab_mechanics_books", - "type": "item_group", - "items": [ - [ "manual_mechanics", 6 ], - [ "textbook_mechanics", 3 ], - [ "textbook_biodiesel", 3 ], - [ "mag_fieldrepair", 4 ], - [ "book_icef", 4 ] - ] - }, - { - "id": "bionics", - "type": "item_group", - "items": [ - [ "bn_bio_solar", 10 ], - [ "afs_bio_wind_turbine", 5 ], - [ "afs_bio_missiles", 10 ], - [ "afs_bio_linguistic_coprocessor", 10 ], - [ "afs_bio_dopamine_stimulators", 10 ], - [ "bio_blaster", 5 ] - ] - }, - { - "id": "bionics_common", - "type": "item_group", - "items": [ [ "bn_bio_solar", 10 ], [ "afs_bio_wind_turbine", 5 ], [ "afs_bio_linguistic_coprocessor", 8 ] ] - }, - { - "id": "bionics_mil", - "type": "item_group", - "items": [ [ "bio_blaster", 5 ] ] - }, - { - "id": "bionics_sci", - "type": "item_group", - "items": [ [ "bn_bio_solar", 5 ], [ "afs_bio_wind_turbine", 2 ] ] - }, - { - "id": "bionics_op", - "type": "item_group", - "items": [ - [ "bn_bio_solar", 15 ], - [ "afs_bio_wind_turbine", 10 ], - [ "afs_bio_missiles", 10 ], - [ "afs_bio_dopamine_stimulators", 10 ] - ] - }, - { - "id": "bionics_subs", - "type": "item_group", - "items": [ [ "afs_bio_missiles", 10 ], [ "afs_bio_dopamine_stimulators", 15 ] ] - }, - { - "id": "chem_lab", - "type": "item_group", - "items": [ [ "panacea", 1 ], [ "afs_calorie_pill", 5 ], [ "afs_sundew", 8 ] ] - }, - { - "id": "rare", - "type": "item_group", - "items": [ - [ "afs_calorie_pill", 10 ], - [ "afs_sundew", 10 ], - [ "afs_bag_of_holding", 1 ], - [ "afs_atomic_smartphone", 5 ], - [ "laser_pack", 10 ], - [ "ftk93", 5 ], - [ "atomic_butterchurn", 5 ] - ] - }, - { - "id": "spider", - "type": "item_group", - "items": [ [ "afs_energy_saber_off", 1 ], [ "afs_bag_of_holding", 2 ], [ "afs_hydraulic_gauntlet", 1 ] ] - }, - { - "id": "survivorzed_extra", - "type": "item_group", - "items": [ [ "afs_rolling_pin_barbed_wire", 5 ], [ "afs_chain_wrench", 8 ] ] - }, - { - "id": "camping", - "type": "item_group", - "items": [ [ "afs_rope_lighter", 10 ], [ "atomic_light", 1 ] ] - }, - { - "id": "allsporting", - "type": "item_group", - "items": [ [ "afs_rope_lighter", 10 ] ] - }, - { - "id": "traveler", - "type": "item_group", - "items": [ [ "afs_rope_lighter", 10 ] ] - }, - { - "id": "drugdealer", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 3 ], [ "afs_bio_missiles", 8 ] ] - }, - { - "id": "kitchen", - "type": "item_group", - "items": [ [ "afs_atompot", 1 ], [ "atomic_butterchurn", 1 ] ] - }, - { - "id": "oven", - "type": "item_group", - "items": [ [ "afs_atompot", 3 ] ] - }, - { - "id": "bed", - "type": "item_group", - "items": [ [ "afs_quilt", 10 ], [ "afs_quilt_patchwork", 8 ] ] - }, - { - "id": "livingroom", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] - }, - { - "id": "bedroom", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] - }, - { - "id": "consumer_electronics", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 2 ], [ "atomic_light", 4 ] ] - }, - { - "id": "electronics", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] - }, - { - "id": "lab_dorm", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 5 ], [ "atomic_light", 3 ] ] - }, - { - "id": "subway", - "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ] ] - }, - { - "id": "hardware", - "type": "item_group", - "items": [ [ "afs_power_cutter", 5 ], [ "atomic_butterchurn", 1 ] ] - }, - { - "id": "hardware_bulk", - "type": "item_group", - "//": "Not something you get in bulk, but it makes sense to be out in the back area", - "items": [ [ "afs_power_cutter", 1 ] ] - }, - { - "id": "mischw", - "type": "item_group", - "subtype": "collection", - "items": [ [ "afs_power_cutter", 5 ] ] - }, - { - "id": "book_gunref", - "type": "item_group", - "items": [ - [ "afs_textbook_shotguns", 3 ], - [ "afs_textbook_handguns", 3 ], - [ "afs_textbook_rifles", 3 ], - [ "afs_textbook_launchers", 3 ] - ] - }, - { - "id": "book_military", - "type": "item_group", - "items": [ - [ "afs_textbook_shotguns", 20 ], - [ "afs_textbook_handguns", 20 ], - [ "afs_textbook_rifles", 20 ], - [ "afs_textbook_launchers", 10 ] - ] - }, - { - "id": "textbooks", - "type": "item_group", - "items": [ - [ "afs_textbook_shotguns", 3 ], - [ "afs_textbook_handguns", 3 ], - [ "afs_textbook_rifles", 3 ], - [ "afs_textbook_launchers", 3 ], - [ "textbook_atomic", 8 ] - ] - }, - { - "id": "guns_pistol_improvised", - "type": "item_group", - "items": [ [ "v29_cheap", 10 ] ] - }, - { - "id": "nuclear_waste", - "type": "item_group", - "subtype": "collection", - "entries": [ { "item": "nuclear_waste", "container-item": "hazardous_waste_drum", "charges": 10 } ] - }, - { - "id": "nuclear_reactor", - "type": "item_group", - "subtype": "collection", - "entries": [ - { "item": "nuclear_waste", "count-min": 5, "count-max": 10 }, - { "item": "nuclear_fuel", "count-min": 1, "count-max": 10 } - ] - }, - { - "id": "reactor_gear", - "type": "item_group", - "subtype": "collection", - "entries": [ - { "item": "hazmat_suit", "prob": 33 }, - { "item": "prussian_blue", "prob": 33 }, - { "item": "rad_monitor", "prob": 33 }, - { "item": "iodine", "prob": 33 }, - { "item": "flashlight", "prob": 33 }, - { "item": "1st_aid", "prob": 15 }, - { "item": "geiger_off", "prob": 15 } - ] - } -] diff --git a/data/mods/Aftershock/mobs/uplifted_monsters.json b/data/mods/Aftershock/mobs/uplifted_monsters.json index 68c0f64e938c9..792161a8afd45 100644 --- a/data/mods/Aftershock/mobs/uplifted_monsters.json +++ b/data/mods/Aftershock/mobs/uplifted_monsters.json @@ -49,11 +49,12 @@ "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT", "PLAYER_NEAR_BABY" ], "death_function": [ "NORMAL" ], + "zombify_into": "mon_zombie_upliftedbear", "death_drops": "xl_uplift_death_drop", "harvest": "demihuman_large_fur", "reproduction": { "baby_monster": "mon_uplifted_bear_cub", "baby_count": 1, "baby_timer": 700 }, "baby_flags": [ "SPRING" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BLEED", "BASHES", "ATTACKMON" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BASHES", "ATTACKMON" ] }, { "id": "mon_uplifted_bear_cub", @@ -106,6 +107,7 @@ "harvest": "demihuman_large_fur", "special_attacks": [ [ "scratch", 20 ] ], "death_function": [ "NORMAL" ], + "zombify_into": "mon_uplifted_ape_zed", "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "BASHES", "GROUP_BASH", "ANIMAL", "PATH_AVOID_DANGER_1", "PATH_AVOID_DANGER_1" ] } ] diff --git a/data/mods/Aftershock/mobs/zombies.json b/data/mods/Aftershock/mobs/zombies.json index de87ed9d283e1..f794db9288ba9 100644 --- a/data/mods/Aftershock/mobs/zombies.json +++ b/data/mods/Aftershock/mobs/zombies.json @@ -31,7 +31,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -77,7 +76,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -129,7 +127,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -153,7 +150,7 @@ "material": [ "flesh" ], "symbol": "&", "color": "white", - "aggression": 0, + "aggression": 100, "morale": 100, "melee_skill": 6, "melee_dice": 2, @@ -174,7 +171,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", diff --git a/data/mods/Aftershock/items/monsterdrops.json b/data/mods/Aftershock/monsterdrops/monsterdrops.json similarity index 93% rename from data/mods/Aftershock/items/monsterdrops.json rename to data/mods/Aftershock/monsterdrops/monsterdrops.json index ac52557be4859..29c72ce088d0a 100644 --- a/data/mods/Aftershock/items/monsterdrops.json +++ b/data/mods/Aftershock/monsterdrops/monsterdrops.json @@ -1,4 +1,10 @@ [ + { + "type": "item_group", + "subtype": "collection", + "id": "mon_afs_sentinel_lx_drops", + "entries": [ { "item": "afs_sentinel_cloak" } ] + }, { "type": "item_group", "id": "tripod", diff --git a/data/mods/Aftershock/npcs/prepnet_dialogue.json b/data/mods/Aftershock/npcs/prepnet_dialogue.json index d95f96b172d71..2ce76101afdca 100644 --- a/data/mods/Aftershock/npcs/prepnet_dialogue.json +++ b/data/mods/Aftershock/npcs/prepnet_dialogue.json @@ -94,7 +94,7 @@ { "type": "talk_topic", "id": "TALK_PrepNet_gardener_ask_goods", - "dynamic_line": "Here? Fruits and berries. Maybe the occasional piece of farm equipment, but you need crypto coins", + "dynamic_line": "Here? Fruits and berries. Maybe the occasional piece of farm equipment, but you need crypto coins", "responses": [ { "text": "Ok.", "topic": "TALK_PrepNet_gardener_1" }, { diff --git a/data/mods/Aftershock/player/bionics.json b/data/mods/Aftershock/player/bionics.json index 079cbff55c97c..9e40266d1387a 100644 --- a/data/mods/Aftershock/player/bionics.json +++ b/data/mods/Aftershock/player/bionics.json @@ -57,5 +57,19 @@ "description": "You've worked for some nasty people. People who installed a bomb at the top of your spine. They are all dead now but there is unfortunately a dead man switch if you don't check in roughly every thirty days. You need this out and fast.", "occupied_bodyparts": [ [ "head", 2 ] ], "enchantments": [ "cranial_explosion" ] + }, + { + "type": "bionic", + "id": "afs_bio_skullgun", + "name": { "str": "Skullgun CBM" }, + "description": "Concealed in your head is a single shot .40 pistol. Activate the bionic to fire and reload the skullgun.", + "occupied_bodyparts": [ [ "head", 5 ] ], + "encumbrance": [ [ "head", 5 ] ], + "act_cost": "35 J", + "fake_item": "bio_skullgun_gun", + "flags": [ "BIONIC_TOGGLED", "BIONIC_WEAPON", "NO_UNWIELD" ], + "stat_bonus": [ [ "INT", -4 ], [ "PER", -2 ] ], + "canceled_mutations": [ "INT_UP", "INT_UP_2", "INT_UP_3", "INT_UP_4", "INT_ALPHA" ], + "spell_on_activation": { "id": "skullgun_snapback", "hit_self": true } } ] diff --git a/data/mods/Aftershock/spells/spells.json b/data/mods/Aftershock/spells/spells.json index 540295dcb5968..96126eee3bbe1 100644 --- a/data/mods/Aftershock/spells/spells.json +++ b/data/mods/Aftershock/spells/spells.json @@ -10,5 +10,19 @@ "min_damage": 82, "max_damage": 166, "damage_type": "fire" + }, + { + "id": "skullgun_snapback", + "type": "SPELL", + "name": "Skullgun Snapback", + "//": "Used for activating skullgun cbm, not castable", + "description": "This fake spell occurs on skullgun activation. May be fatal if done in critical condition.", + "effect": "target_attack", + "valid_targets": [ "self" ], + "flags": [ "SILENT", "NO_LEGS", "NO_HANDS", "NO_FAIL" ], + "min_damage": 10, + "max_damage": 10, + "message": "Your head snaps back from the force of the shot.", + "damage_type": "bio" } ] diff --git a/data/mods/BlazeIndustries/items/vehicle/blaze_gun.json b/data/mods/BlazeIndustries/items/vehicle/blaze_gun.json new file mode 100644 index 0000000000000..9430546f27c10 --- /dev/null +++ b/data/mods/BlazeIndustries/items/vehicle/blaze_gun.json @@ -0,0 +1,85 @@ +[ + { + "id": "blaze_marlin_9a", + "looks_like": "ar15", + "type": "GUN", + "reload_noise_volume": 10, + "name": { "str_sp": "modified Marlin 39A" }, + "description": "A Marlin 39A, modified for use in a vehicle turret.", + "weight": "2948 g", + "volume": "2500 ml", + "price": 23000, + "price_postapoc": 2000, + "to_hit": -1, + "bashing": 12, + "material": [ "iron", "wood" ], + "symbol": "(", + "color": "brown", + "ammo": [ "22" ], + "skill": "rifle", + "ranged_damage": { "damage_type": "bullet", "amount": 5 }, + "dispersion": 90, + "durability": 8, + "blackpowder_tolerance": 56, + "clip_size": 19, + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "muzzle", 1 ], + [ "rail", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "underbarrel", 1 ] + ], + "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], + "flags": [ "RELOAD_ONE" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "22": 19 } } ] + }, + { + "id": "blaze_sks", + "looks_like": "ar15", + "type": "GUN", + "reload_noise_volume": 10, + "name": { "str": "modified SKS" }, + "description": "An SKS, modified to be suitable for use in a vehicle turret.", + "weight": "3850 g", + "volume": "2838 ml", + "longest_side": "103 cm", + "price": 38000, + "price_postapoc": 3500, + "to_hit": -1, + "bashing": 12, + "material": [ "steel", "wood" ], + "symbol": "(", + "color": "brown", + "ammo": [ "762" ], + "skill": "rifle", + "ranged_damage": { "damage_type": "bullet", "amount": 1 }, + "dispersion": 90, + "durability": 8, + "clip_size": 10, + "barrel_volume": "500 ml", + "built_in_mods": [ "inter_bayonet" ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "muzzle", 1 ], + [ "rail", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "underbarrel", 1 ] + ], + "flags": [ "RELOAD_ONE", "NEVER_JAMS" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "762": 10 } } ] + } +] diff --git a/data/mods/BlazeIndustries/recipes/blaze_gun_recipes.json b/data/mods/BlazeIndustries/recipes/blaze_gun_recipes.json new file mode 100644 index 0000000000000..9e9ca36c76dcd --- /dev/null +++ b/data/mods/BlazeIndustries/recipes/blaze_gun_recipes.json @@ -0,0 +1,26 @@ +[ + { + "result": "blaze_sks", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "mechanics", + "difficulty": 2, + "time": "20 m", + "autolearn": true, + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], + "components": [ [ [ "sks", 1 ] ] ] + }, + { + "result": "blaze_marlin_9a", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "mechanics", + "difficulty": 2, + "time": "20 m", + "autolearn": true, + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], + "components": [ [ [ "marlin_9a", 1 ] ] ] + } +] diff --git a/data/mods/BlazeIndustries/vehicleparts/blaze_other_parts.json b/data/mods/BlazeIndustries/vehicleparts/blaze_other_parts.json index 6819a22b409f4..368af3213d0a4 100644 --- a/data/mods/BlazeIndustries/vehicleparts/blaze_other_parts.json +++ b/data/mods/BlazeIndustries/vehicleparts/blaze_other_parts.json @@ -149,7 +149,7 @@ "broken_color": "white", "durability": 10, "description": "A length of heavy duty copper wire, useful for routing power from one part of a vehicle to another part.", - "folded_volume": 1, + "folded_volume": "250 ml", "breaks_into": [ { "item": "wire", "prob": 50 } ], "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "60 s" }, diff --git a/data/mods/BlazeIndustries/vehicleparts/blaze_turrets_vanilla.json b/data/mods/BlazeIndustries/vehicleparts/blaze_turrets_vanilla.json index 7a80bf31e28e4..cb7e6e71e2feb 100644 --- a/data/mods/BlazeIndustries/vehicleparts/blaze_turrets_vanilla.json +++ b/data/mods/BlazeIndustries/vehicleparts/blaze_turrets_vanilla.json @@ -366,8 +366,8 @@ "copy-from": "turret", "type": "vehicle_part", "name": { "str": "mounted Marlin 39A" }, - "item": "marlin_9a", - "breaks_into": [ { "item": "marlin_9a", "prob": 50 } ], + "item": "blaze_marlin_9a", + "breaks_into": [ { "item": "blaze_marlin_9a", "prob": 50 } ], "requirements": { "install": { "skills": [ [ "mechanics", 3 ] ] }, "removal": { "skills": [ [ "mechanics", 1 ] ] } } }, { @@ -614,8 +614,8 @@ "copy-from": "turret", "type": "vehicle_part", "name": { "str": "mounted SKS" }, - "item": "sks", - "breaks_into": [ { "item": "sks", "prob": 50 } ], + "item": "blaze_sks", + "breaks_into": [ { "item": "blaze_sks", "prob": 50 } ], "requirements": { "install": { "skills": [ [ "mechanics", 3 ] ] }, "removal": { "skills": [ [ "mechanics", 1 ] ] } } }, { diff --git a/data/mods/CRT_EXPANSION/deadspace/deadspaceitems.json b/data/mods/CRT_EXPANSION/deadspace/deadspaceitems.json index 5cf4fcf49f003..c5f374b482a68 100644 --- a/data/mods/CRT_EXPANSION/deadspace/deadspaceitems.json +++ b/data/mods/CRT_EXPANSION/deadspace/deadspaceitems.json @@ -38,7 +38,16 @@ "coverage": 100, "encumbrance": 25, "warmth": 15, - "storage": 50, + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "12500 ml", + "max_contains_weight": "1000 kg", + "max_item_length": "500 cm", + "weight_multiplier": 0.01, + "moves": 200 + } + ], "material_thickness": 3, "environmental_protection": 18, "use_action": [ "WEATHER_TOOL" ], diff --git a/data/mods/CRT_EXPANSION/items/crt_gunmods.json b/data/mods/CRT_EXPANSION/items/crt_gunmods.json index 5934e0ffedf7c..605911a93c984 100644 --- a/data/mods/CRT_EXPANSION/items/crt_gunmods.json +++ b/data/mods/CRT_EXPANSION/items/crt_gunmods.json @@ -23,7 +23,7 @@ "name": "CQB SI shotgun", "description": "The integrated underbarrel shotgun of this gun which holds a single shot. It's irremovable.", "weight": "2600 g", - "volume": 0, + "volume": "0 L", "price": 95000, "to_hit": -1, "material": [ "steel" ], @@ -43,7 +43,7 @@ "description": ", A military-grade stock which folds reducing the guns volume. The weight and the pivoting hook which latches onto your forearm allows for greater stability. ", "weight": "500 g", "volume": "125 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 42000, "material": [ "plastic", "steel" ], "symbol": ":", @@ -74,7 +74,7 @@ "description": "A compact flashlight which is mounted to the side of your weapon, not powerful, but good enough for tight hallways.", "weight": "250 g", "volume": "125 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 42000, "material": [ "plastic", "steel" ], "symbol": ":", @@ -102,7 +102,7 @@ "description": "A compact flashlight which is attached to the side of your weapon, not powerful, but good enough for tight hallways.", "weight": "250 g", "volume": "125 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 42000, "material": [ "plastic", "steel" ], "symbol": ":", diff --git a/data/mods/CRT_EXPANSION/items/crt_makeshift_survival.json b/data/mods/CRT_EXPANSION/items/crt_makeshift_survival.json index 3fe7d53b9af10..7e1a56be307c2 100644 --- a/data/mods/CRT_EXPANSION/items/crt_makeshift_survival.json +++ b/data/mods/CRT_EXPANSION/items/crt_makeshift_survival.json @@ -5,8 +5,8 @@ "category": "armor", "name": "plant fiber tunic", "description": "A loose garment cobbled together from a collection of plant bundles and wound together by makeshift cordage", - "weight": 1520, - "volume": 23, + "weight": "1520 g", + "volume": "5750 ml", "price": 0, "to_hit": -5, "material": [ "dry_plant" ], @@ -15,7 +15,6 @@ "covers": [ "TORSO", "LEGS" ], "coverage": 50, "encumbrance": 15, - "storage": 0, "warmth": 7, "material_thickness": 3, "flags": [ "OVERSIZE" ] @@ -26,8 +25,8 @@ "category": "armor", "name": "plant fiber bracelet", "description": "A bracelet wound together by makeshift cordage. Has some cool looking pebbles. ", - "weight": 1520, - "volume": 23, + "weight": "1520 g", + "volume": "5750 ml", "price": 0, "to_hit": -5, "material": [ "dry_plant" ], @@ -35,7 +34,6 @@ "color": "black_green", "coverage": 0, "encumbrance": 0, - "storage": 0, "warmth": 7, "material_thickness": 1, "flags": [ "OVERSIZE" ] diff --git a/data/mods/CRT_EXPANSION/monsters/crt_monster.json b/data/mods/CRT_EXPANSION/monsters/crt_monster.json index 32bf1fb739c10..05269cca0bbd4 100644 --- a/data/mods/CRT_EXPANSION/monsters/crt_monster.json +++ b/data/mods/CRT_EXPANSION/monsters/crt_monster.json @@ -35,7 +35,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -78,7 +77,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -117,7 +115,7 @@ "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], "death_drops": "mon_zombie_cop_death_drops", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "BLEED", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] + "flags": [ "SEES", "HEARS", "REVIVES", "NO_BREATHE", "POISON", "FILTHY" ] }, { "id": "mon_leaper", @@ -203,7 +201,7 @@ "death_drops": "default_zombie_death_drops", "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_scorched", - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "BLEED", "FILTHY" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "FILTHY" ] }, { "id": "mon_pack", @@ -233,20 +231,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "burn_into": "mon_zombie_child_scorched", - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BLEED", - "BASHES", - "POISON", - "NO_BREATHE", - "REVIVES", - "CLIMBS", - "FILTHY", - "SWARMS" - ], + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "CLIMBS", "FILTHY", "SWARMS" ], "//": "no GUILT because it no longer looks enough like a child to evoke pity" }, { @@ -292,7 +277,6 @@ "NO_BREATHE", "REVIVES", "PUSH_MON", - "BLEED", "FILTHY" ] } diff --git a/data/mods/CRT_EXPANSION/monsters/monster.json b/data/mods/CRT_EXPANSION/monsters/monster.json index 8169eee163789..d3f189c90b4db 100644 --- a/data/mods/CRT_EXPANSION/monsters/monster.json +++ b/data/mods/CRT_EXPANSION/monsters/monster.json @@ -27,7 +27,7 @@ "harvest": "zombie", "special_attacks": [ [ "TENTACLE", 2 ], [ "scratch", 10 ] ], "death_function": [ "NORMAL" ], - "flags": [ "HEARS", "GOODHEARING", "WARM", "CLIMBS", "NOHEAD", "POISON", "BLEED", "NO_BREATHE" ] + "flags": [ "HEARS", "GOODHEARING", "WARM", "CLIMBS", "NOHEAD", "POISON", "NO_BREATHE" ] }, { "id": "mon_dullahan", @@ -56,6 +56,6 @@ "harvest": "zombie", "special_attacks": [ [ "TENTACLE", 7 ], [ "scratch", 8 ] ], "death_function": [ "NORMAL" ], - "flags": [ "WARM", "CLIMBS", "NOHEAD", "POISON", "BLEED", "NO_BREATHE" ] + "flags": [ "WARM", "CLIMBS", "NOHEAD", "POISON", "NO_BREATHE" ] } ] diff --git a/data/mods/CRT_EXPANSION/scenarios/crt_classes.json b/data/mods/CRT_EXPANSION/scenarios/crt_classes.json index 86520b79a1d60..4939fe02f2188 100644 --- a/data/mods/CRT_EXPANSION/scenarios/crt_classes.json +++ b/data/mods/CRT_EXPANSION/scenarios/crt_classes.json @@ -183,7 +183,7 @@ "mre_veggy_box", "crt_la_boots", "two_way_radio", - "1st_aid", + "ifak", "bandages", "crt_backpack", "UPS_off" diff --git a/data/mods/CrazyCataclysm/crazy_monsters.json b/data/mods/CrazyCataclysm/crazy_monsters.json index efbbd93694aa7..57808d7c97670 100644 --- a/data/mods/CrazyCataclysm/crazy_monsters.json +++ b/data/mods/CrazyCataclysm/crazy_monsters.json @@ -42,7 +42,7 @@ "vision_night": 3, "death_drops": "skeltal_drops", "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "BLEED", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "FILTHY" ], + "flags": [ "SEES", "HEARS", "HARDTOSHOOT", "REVIVES", "NO_BREATHE", "FILTHY" ], "harvest": "mr_bones", "special_attacks": [ [ "DOOT", 50 ] ] }, @@ -111,7 +111,6 @@ "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", - "BLEED", "BASHES", "ATTACKMON", "FIREPROOF", diff --git a/data/mods/Dark-Skies-Above/monsters/wild_aliens/alien_fauna.json b/data/mods/Dark-Skies-Above/monsters/wild_aliens/alien_fauna.json index 26fe1c9488859..cdd09651e361f 100644 --- a/data/mods/Dark-Skies-Above/monsters/wild_aliens/alien_fauna.json +++ b/data/mods/Dark-Skies-Above/monsters/wild_aliens/alien_fauna.json @@ -122,7 +122,6 @@ "KEENNOSE", "PATH_AVOID_DANGER_1", "ANIMAL", - "BLEED", "PET_WONT_FOLLOW", "PET_MOUNTABLE", "CATTLEFODDER" @@ -170,7 +169,6 @@ "PATH_AVOID_DANGER_1", "GROUP_MORALE", "ANIMAL", - "BLEED", "ATTACKMON", "SWIMS" ] diff --git a/data/mods/Dark-Skies-Above/monsters/wild_aliens/strays.json b/data/mods/Dark-Skies-Above/monsters/wild_aliens/strays.json index a455b09e196b9..b90862c2dcd0d 100644 --- a/data/mods/Dark-Skies-Above/monsters/wild_aliens/strays.json +++ b/data/mods/Dark-Skies-Above/monsters/wild_aliens/strays.json @@ -30,7 +30,7 @@ "death_drops": "default_zombie_death_drops", "death_function": [ "NORMAL" ], "upgrades": { "half_life": 21, "into_group": "DKS_GROUP_STRAY_UPGRADE" }, - "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "POISON", "BLEED", "FILTHY", "BASHES", "GROUP_BASH", "PUSH_MON", "REVIVES" ] + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "POISON", "FILTHY", "BASHES", "GROUP_BASH", "PUSH_MON", "REVIVES" ] }, { "id": "dks_mon_stray_cop", @@ -68,20 +68,7 @@ "death_drops": "mon_zombie_cop_death_drops", "upgrades": { "half_life": 60, "into": "dks_mon_crystal_baby" }, "death_function": [ "NORMAL" ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "STUMBLES", - "WARM", - "BASHES", - "GROUP_BASH", - "POISON", - "BLEED", - "PUSH_MON", - "FILTHY", - "REVIVES" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "GROUP_BASH", "POISON", "PUSH_MON", "FILTHY", "REVIVES" ] }, { "id": "dks_mon_stray_soldier", @@ -121,7 +108,7 @@ "death_drops": "mon_zombie_soldier_death_drops", "death_function": [ "NORMAL" ], "upgrades": { "half_life": 60, "into": "dks_mon_crystal_baby" }, - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "BLEED", "PUSH_MON", "FILTHY", "REVIVES" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "BASHES", "GROUP_BASH", "POISON", "PUSH_MON", "FILTHY", "REVIVES" ] }, { "id": "dks_mon_stray_fireman", @@ -166,7 +153,6 @@ "BASHES", "GROUP_BASH", "POISON", - "BLEED", "NO_BREATHE", "REVIVES", "PUSH_MON", @@ -207,20 +193,7 @@ "death_drops": "default_zombie_death_drops", "death_function": [ "NORMAL" ], "upgrades": { "half_life": 21, "into": "dks_mon_stray_eater" }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "BASHES", - "GROUP_BASH", - "PUSH_MON", - "STUMBLES", - "WARM", - "POISON", - "BLEED", - "FILTHY", - "REVIVES" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "BASHES", "GROUP_BASH", "PUSH_MON", "STUMBLES", "WARM", "POISON", "FILTHY", "REVIVES" ] }, { "id": "dks_mon_stray_eater", @@ -466,7 +439,6 @@ "PUSH_MON", "PATH_AVOID_FIRE", "FILTHY", - "BLEED", "REVIVES" ] }, @@ -521,7 +493,6 @@ "PATH_AVOID_FALL", "PATH_AVOID_FIRE", "FILTHY", - "BLEED", "REVIVES" ] }, @@ -577,7 +548,6 @@ "PUSH_MON", "PATH_AVOID_DANGER_1", "FILTHY", - "BLEED", "REVIVES" ] }, @@ -772,20 +742,7 @@ "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_children_clothes", 100 ], [ "child_items", 65 ] ] }, "death_function": [ "NORMAL" ], "upgrades": { "half_life": 50, "into": "dks_mon_stray_wretch" }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "BASHES", - "GROUP_BASH", - "STUMBLES", - "WARM", - "BLEED", - "GUILT", - "POISON", - "FILTHY", - "REVIVES" - ] + "flags": [ "SEES", "HEARS", "SMELLS", "BASHES", "GROUP_BASH", "STUMBLES", "WARM", "GUILT", "POISON", "FILTHY", "REVIVES" ] }, { "id": "dks_mon_stray_wretch_burnt", @@ -823,7 +780,6 @@ "SMELLS", "KEENNOSE", "BASHES", - "BLEED", "WARM", "POISON", "HIT_AND_RUN", @@ -876,7 +832,6 @@ "HEARS", "SMELLS", "KEENNOSE", - "BLEED", "WARM", "POISON", "CLIMBS", @@ -927,7 +882,6 @@ "SMELLS", "KEENNOSE", "ELECTRIC", - "BLEED", "WARM", "POISON", "CLIMBS", @@ -973,7 +927,6 @@ "SMELLS", "KEENNOSE", "ELECTRIC", - "BLEED", "HARDTOSHOOT", "WARM", "POISON", @@ -1064,7 +1017,6 @@ "HEARS", "SMELLS", "KEENNOSE", - "BLEED", "ELECTRIC", "WARM", "POISON", @@ -1278,7 +1230,7 @@ "special_attacks": [ [ "BOOMER_GLOW", 20 ], [ "STRETCH_ATTACK", 20 ], [ "LONGSWIPE", 20 ] ], "special_when_hit": [ "ZAPBACK", 100 ], "death_function": [ "BOOMER_GLOW", "DISINTEGRATE" ], - "flags": [ "SEES", "IMMOBILE", "NOGIB", "ELECTRIC", "BLEED", "WARM", "NO_BREATHE", "NOHEAD", "ARTHROPOD_BLOOD" ] + "flags": [ "SEES", "IMMOBILE", "NOGIB", "ELECTRIC", "WARM", "NO_BREATHE", "NOHEAD", "ARTHROPOD_BLOOD" ] }, { "id": "dks_mon_crystal_mite", diff --git a/data/mods/DinoMod/NPC/NC_BO_BARONYX.json b/data/mods/DinoMod/NPC/NC_BO_BARONYX.json index fb1bef2dd2977..9ad99814f7dd3 100644 --- a/data/mods/DinoMod/NPC/NC_BO_BARONYX.json +++ b/data/mods/DinoMod/NPC/NC_BO_BARONYX.json @@ -41,7 +41,7 @@ "type": "dialogue", "context": "first_meeting", "value": "yes", - "no": "You look hungry friend. So much hunger in this world. This is the time of the eaters.", + "no": "You look hungry friend. So much hunger in this world. This is the time of the eaters.", "yes": { "u_has_var": "asked_about_eating", "type": "dialogue", @@ -219,7 +219,7 @@ { "id": "TALK_MISSION_ACCEPTED_SWAMPER", "type": "talk_topic", - "dynamic_line": "Excellent. Make it happen.", + "dynamic_line": "Excellent. Make it happen.", "responses": [ { "text": "Consider it done. But I also wanted to ask…", "topic": "TALK_SWAMPER" }, { "text": "Where should I start?", "topic": "TALK_MISSION_ADVICE_SWAMPER" }, diff --git a/data/mods/DinoMod/egg.json b/data/mods/DinoMod/egg.json index 615beeec8dfc8..851bf76b47ecc 100644 --- a/data/mods/DinoMod/egg.json +++ b/data/mods/DinoMod/egg.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "egg_dino", "name": "dinosaur egg", - "weight": 75, + "weight": "75 g", "color": "green", "spoils_in": "4 days", "comestible_type": "FOOD", @@ -14,7 +14,7 @@ "description": "Pale, football-shaped egg laid by a dinosaur.", "price": 500, "material": [ "egg" ], - "volume": 1, + "volume": "250 ml", "stack_size": 4, "fun": -6, "flags": [ "FREEZERBURN" ], diff --git a/data/mods/DinoMod/hints.json b/data/mods/DinoMod/hints.json index aa9a0929281f8..ba04cc89fbe86 100644 --- a/data/mods/DinoMod/hints.json +++ b/data/mods/DinoMod/hints.json @@ -1,14 +1,16 @@ -{ - "type": "snippet", - "category": "hint", - "text": [ - "I've seen some big dinosaurs out there. I know that should be scary, but all I felt was hungry.", - "I think those little dinosaurs are kind of cute, like a cat kind of. Do you think they eat cat food?", - "Dinosaurs are a bow hunter's best friend. Feathers forever!", - "A buddy of mine wandered close to the swamps and was eaten by a T-Rex, a big lizard. I'd be careful unless you have a gun and plenty of ammo.", - "I hear the zombies have been in the swamps. Bad news if they bite a dinosaur before it bites them.", - "I know there aren't alligators in the sewer, but I heard there was some kind of big lizard down there. Probably not a good idea to check.", - "Some of those big dinosaurs seem halfway all right. I bet if you fed them something nice and gave them a pet you could ride them like a pony. Or maybe they'd eat you instead.", - "One time I found a strange egg out in the woods. It was probably a dinosaur, but I cooked it and it was pretty good!" - ] -} +[ + { + "type": "snippet", + "category": "hint", + "text": [ + "I've seen some big dinosaurs out there. I know that should be scary, but all I felt was hungry.", + "I think those little dinosaurs are kind of cute, like a cat kind of. Do you think they eat cat food?", + "Dinosaurs are a bow hunter's best friend. Feathers forever!", + "A buddy of mine wandered close to the swamps and was eaten by a T-Rex, a big lizard. I'd be careful unless you have a gun and plenty of ammo.", + "I hear the zombies have been in the swamps. Bad news if they bite a dinosaur before it bites them.", + "I know there aren't alligators in the sewer, but I heard there was some kind of big lizard down there. Probably not a good idea to check.", + "Some of those big dinosaurs seem halfway all right. I bet if you fed them something nice and gave them a pet you could ride them like a pony. Or maybe they'd eat you instead.", + "One time I found a strange egg out in the woods. It was probably a dinosaur, but I cooked it and it was pretty good!" + ] + } +] diff --git a/data/mods/DinoMod/lab_notes.json b/data/mods/DinoMod/lab_notes.json index b1a4ed17a7c93..1c510ded13218 100644 --- a/data/mods/DinoMod/lab_notes.json +++ b/data/mods/DinoMod/lab_notes.json @@ -1,11 +1,13 @@ -{ - "type": "snippet", - "category": "lab_notes", - "text": [ - "Research on our visitors is proceeding nicely. The raptor DNA is of special interest, with some novel protein chains that may lead to medical breakthroughs.", - "Research proceeds apace on our visitors. While Operation Major Laser did not receive enough funding as hoped, our more humble bio-operator protocols were already prepared and are proceeding ahead of schedule. The hosts are most receptive to improvement.", - "Dr. Yoshimi has been reprimanded for unauthorized contact with the procompsignathids. Disgusting behavior, and a terrible example to the junior researchers.", - "Dr. Yoshimi has escaped, along with an unknown number of dinosaurs. Unfortunately, we have bigger problems with XE037.", - "Strange sounds have been reported from the swamp nearby. An enhanced security team was dispatched, but has not returned in 48 hours. The facility is on lockdown. We can’t let them get back in." - ] -} +[ + { + "type": "snippet", + "category": "lab_notes", + "text": [ + "Research on our visitors is proceeding nicely. The raptor DNA is of special interest, with some novel protein chains that may lead to medical breakthroughs.", + "Research proceeds apace on our visitors. While Operation Major Laser did not receive enough funding as hoped, our more humble bio-operator protocols were already prepared and are proceeding ahead of schedule. The hosts are most receptive to improvement.", + "Dr. Yoshimi has been reprimanded for unauthorized contact with the procompsignathids. Disgusting behavior, and a terrible example to the junior researchers.", + "Dr. Yoshimi has escaped, along with an unknown number of dinosaurs. Unfortunately, we have bigger problems with XE037.", + "Strange sounds have been reported from the swamp nearby. An enhanced security team was dispatched, but has not returned in 48 hours. The facility is on lockdown. We can’t let them get back in." + ] + } +] diff --git a/data/mods/DinoMod/mapgen/DinoLabFinale.json b/data/mods/DinoMod/mapgen/DinoLabFinale.json index 79b63086be8de..5a49179a2fd33 100644 --- a/data/mods/DinoMod/mapgen/DinoLabFinale.json +++ b/data/mods/DinoMod/mapgen/DinoLabFinale.json @@ -1,87 +1,87 @@ -{ - "//": "dino operating theater", - "type": "mapgen", - "method": "json", - "om_terrain": [ - "lab_finale_1level" - ], - "weight": 75, - "object": { - "rotation": [ 0, 3 ], - "fill_ter": "t_thconc_floor", - "rows": [ - "..cccccc.|...|,,,|..|,,,", - "c........|...|,,,|.6|,,,", - "c..Ccxc..|...|,,,g..g,,,", - "c........g...|,,,g..g,,,", - "c........g...|,,,L..L,,,", - "......llS|...|---|..|---", - "--gg-G---|...|,,,|..|,,,", - ".............|,,,g..g,,,", - ".............|,,,g..g,,,", - ".............|,,,L..L,,,", - "........|-ggg----|..|---", - "........|r,,,r|t--G-|...", - "........g,,/,,L.....G...", - "........g,,?,,|-ggg-|...", - "........|r,,,r|.........", - "........|-ggg-|.........", - "........................", - "........................", - "..........dd7dd.........", - "..........d.h.d.........", - "...ddxdd.........ddxdd..", - "...d.h.d.........d.h.d..", - "........................", - "........................" - ], - "palettes": [ "lab_palette", "lab_loot_research" ], - "furniture": { "?": "f_autodoc", "/": "f_autodoc_couch" }, - "terrain": { - ",": "t_floor_blue", - "C": "t_centrifuge", - "?": "t_floor_blue", - "/": "t_floor_blue", - "7": "t_console", - "r": "t_floor_blue" - }, - "place_loot": [ - { "item": "anesthetic_kit", "x": 15, "y": 11, "repeat": [ 4, 9 ], "ammo": 100 }, - { "item": "id_science", "x": 7, "y": 11, "chance": 100 }, - { "item": "cattlefodder", "x": 7, "y": 11, "chance": 100 } - ], - "mapping": { - "r": { - "items": [ - { "item": "bionics_common", "chance": 40 }, - { "item": "bionics", "chance": 20 }, - { "item": "hospital_medical_items", "chance": 80 }, - { "item": "dissection", "chance": 60 } - ] - } - }, - "computers": { - "6": { - "name": "DinoLab Operating Theater Controls", - "security": 0, - "options": [ { "name": "EMERGENCY EVAC - OPEN ALL DOORS", "action": "open", "security": 0 } ], - "failures": [ { "action": "damage" }, { "action": "shutdown" } ] +[ + { + "//": "dino operating theater", + "type": "mapgen", + "method": "json", + "om_terrain": [ "lab_finale_1level" ], + "weight": 75, + "object": { + "rotation": [ 0, 3 ], + "fill_ter": "t_thconc_floor", + "rows": [ + "..cccccc.|...|,,,|..|,,,", + "c........|...|,,,|.6|,,,", + "c..Ccxc..|...|,,,g..g,,,", + "c........g...|,,,g..g,,,", + "c........g...|,,,L..L,,,", + "......llS|...|---|..|---", + "--gg-G---|...|,,,|..|,,,", + ".............|,,,g..g,,,", + ".............|,,,g..g,,,", + ".............|,,,L..L,,,", + "........|-ggg----|..|---", + "........|r,,,r|t--G-|...", + "........g,,/,,L.....G...", + "........g,,?,,|-ggg-|...", + "........|r,,,r|.........", + "........|-ggg-|.........", + "........................", + "........................", + "..........dd7dd.........", + "..........d.h.d.........", + "...ddxdd.........ddxdd..", + "...d.h.d.........d.h.d..", + "........................", + "........................" + ], + "palettes": [ "lab_palette", "lab_loot_research" ], + "furniture": { "?": "f_autodoc", "/": "f_autodoc_couch" }, + "terrain": { + ",": "t_floor_blue", + "C": "t_centrifuge", + "?": "t_floor_blue", + "/": "t_floor_blue", + "7": "t_console", + "r": "t_floor_blue" }, - "7": { - "name": "DinoLab Operating Theater Controls", - "security": 2, - "options": [ { "name": "UNLOCK AUTODOC DOOR", "action": "unlock", "security": 6 } ], - "failures": [ { "action": "damage" }, { "action": "shutdown" } ] - } - }, - "place_monster": [ - { "monster": [ "mon_deino_bio_op" ], "x": [ 14, 16 ], "y": [ 1, 4 ], "chance": 90 }, - { "monster": [ "mon_deino_bio_op" ], "x": [ 14, 16 ], "y": [ 6, 9 ], "chance": 90 }, - { "monster": [ "mon_deino_bio_op" ], "x": [ 21, 22 ], "y": [ 1, 4 ], "chance": 90 }, - { "monster": [ "mon_deino_bio_op" ], "x": [ 21, 22 ], "y": [ 6, 9 ], "chance": 90 }, - { "monster": [ "mon_trice_bio_op" ], "x": [ 11, 13 ], "y": [ 13, 14 ], "chance": 100 }, - { "monster": "mon_zeinonychus", "x": [ 15, 19 ], "y": 12, "chance": 90, "repeat": [ 1, 2 ] }, - { "monster": "mon_zeinonychus", "x": [ 9, 10 ], "y": [ 12, 13 ] } - ] + "place_loot": [ + { "item": "anesthetic_kit", "x": 15, "y": 11, "repeat": [ 4, 9 ], "ammo": 100 }, + { "item": "id_science", "x": 7, "y": 11, "chance": 100 }, + { "item": "cattlefodder", "x": 7, "y": 11, "chance": 100 } + ], + "mapping": { + "r": { + "items": [ + { "item": "bionics_common", "chance": 40 }, + { "item": "bionics", "chance": 20 }, + { "item": "hospital_medical_items", "chance": 80 }, + { "item": "dissection", "chance": 60 } + ] + } + }, + "computers": { + "6": { + "name": "DinoLab Operating Theater Controls", + "security": 0, + "options": [ { "name": "EMERGENCY EVAC - OPEN ALL DOORS", "action": "open", "security": 0 } ], + "failures": [ { "action": "damage" }, { "action": "shutdown" } ] + }, + "7": { + "name": "DinoLab Operating Theater Controls", + "security": 2, + "options": [ { "name": "UNLOCK AUTODOC DOOR", "action": "unlock", "security": 6 } ], + "failures": [ { "action": "damage" }, { "action": "shutdown" } ] + } + }, + "place_monster": [ + { "monster": [ "mon_deino_bio_op" ], "x": [ 14, 16 ], "y": [ 1, 4 ], "chance": 90 }, + { "monster": [ "mon_deino_bio_op" ], "x": [ 14, 16 ], "y": [ 6, 9 ], "chance": 90 }, + { "monster": [ "mon_deino_bio_op" ], "x": [ 21, 22 ], "y": [ 1, 4 ], "chance": 90 }, + { "monster": [ "mon_deino_bio_op" ], "x": [ 21, 22 ], "y": [ 6, 9 ], "chance": 90 }, + { "monster": [ "mon_trice_bio_op" ], "x": [ 11, 13 ], "y": [ 13, 14 ], "chance": 100 }, + { "monster": "mon_zeinonychus", "x": [ 15, 19 ], "y": 12, "chance": 90, "repeat": [ 1, 2 ] }, + { "monster": "mon_zeinonychus", "x": [ 9, 10 ], "y": [ 12, 13 ] } + ] + } } -} +] diff --git a/data/mods/DinoMod/monstergroups/dinosaur.json b/data/mods/DinoMod/monstergroups/dinosaur.json index 63c0568c8586f..d1543cede0246 100644 --- a/data/mods/DinoMod/monstergroups/dinosaur.json +++ b/data/mods/DinoMod/monstergroups/dinosaur.json @@ -85,19 +85,87 @@ "name": "GROUP_DINOSAUR_ZOMBIE", "default": "mon_null", "monsters": [ - { "monster": "mon_zeinonychus", "freq": 3, "cost_multiplier": 30, "starts": 72, "pack_size": [ 2, 3 ] }, + { "monster": "mon_zallimimus", "freq": 50, "cost_multiplier": 10, "starts": 72, "pack_size": [ 4, 8 ] }, + { "monster": "mon_zachycephalosaurus", "freq": 25, "cost_multiplier": 10, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zamptosaurus", "freq": 100, "cost_multiplier": 10, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zpinosaurus", "freq": 1, "cost_multiplier": 90, "starts": 72 }, { "monster": "mon_zyrannosaurus", "freq": 1, "cost_multiplier": 80, "starts": 72 }, - { "monster": "mon_zpinosaurus", "freq": 1, "cost_multiplier": 90, "starts": 72 } + { "monster": "mon_zalbertosaurus", "freq": 4, "cost_multiplier": 70, "starts": 72 }, + { "monster": "mon_zriceratops", "freq": 3, "cost_multiplier": 60, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_ztegosaurus", "freq": 5, "cost_multiplier": 40, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zankylosaurus", "freq": 5, "cost_multiplier": 40, "starts": 72 }, + { "monster": "mon_zapatosaurus", "freq": 5, "cost_multiplier": 50, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zeratosaurus", "freq": 1, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zallosaurus", "freq": 8, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zeinonychus", "freq": 3, "cost_multiplier": 30, "starts": 72, "pack_size": [ 2, 3 ] }, + { "monster": "mon_zutahraptor", "freq": 5, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zarasaurolophus", "freq": 3, "cost_multiplier": 20, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zimorphodon", "freq": 50, "cost_multiplier": 10, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zilophosaurus", "freq": 1, "cost_multiplier": 20, "starts": 72, "pack_size": [ 1, 2 ] } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zpinosaurus_UPGRADE", + "default": "mon_zpinosaurus_brute", + "monsters": [ + { "monster": "mon_zpinosaurus_shady", "freq": 15, "cost_multiplier": 5 }, + { "monster": "mon_zpinosaurus_brute", "freq": 23, "cost_multiplier": 5 } ] }, { "type": "monstergroup", "name": "GROUP_zyrannosaurus_UPGRADE", "default": "mon_syrannosaurus", - "//": "No dogs, humans, bionics, or profession-types", "monsters": [ { "monster": "mon_syrannosaurus", "freq": 45, "cost_multiplier": 5 }, - { "monster": "mon_zyrannosaurus_shady", "freq": 15, "cost_multiplier": 5 } + { "monster": "mon_zyrannosaurus_shady", "freq": 15, "cost_multiplier": 5 }, + { "monster": "mon_zyrannosaurus_brute", "freq": 23, "cost_multiplier": 5 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zalbertosaurus_UPGRADE", + "default": "mon_salbertosaurus", + "monsters": [ + { "monster": "mon_salbertosaurus", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_zalbertosaurus_brute", "freq": 23, "cost_multiplier": 5 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zeratosaurus_UPGRADE", + "default": "mon_seratosaurus", + "monsters": [ + { "monster": "mon_seratosaurus", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_zeratosaurus_brute", "freq": 23, "cost_multiplier": 5 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zallosaurus_UPGRADE", + "default": "mon_sallosaurus", + "monsters": [ + { "monster": "mon_sallosaurus", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_zallosaurus_brute", "freq": 23, "cost_multiplier": 5 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zeinonychus_UPGRADE", + "default": "mon_zeinonychus_brute", + "monsters": [ + { "monster": "mon_zeinonychus_shady", "freq": 15, "cost_multiplier": 5 }, + { "monster": "mon_zeinonychus_brute", "freq": 23, "cost_multiplier": 5 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_zutahraptor_UPGRADE", + "default": "mon_sutahraptor", + "monsters": [ + { "monster": "mon_sutahraptor", "freq": 45, "cost_multiplier": 5 }, + { "monster": "mon_zutahraptor_brute", "freq": 23, "cost_multiplier": 5 } ] }, { @@ -105,9 +173,23 @@ "name": "GROUP_ZOMBIE", "default": "mon_zombie", "monsters": [ - { "monster": "mon_zeinonychus", "freq": 3, "cost_multiplier": 30, "starts": 72, "pack_size": [ 2, 3 ] }, + { "monster": "mon_zallimimus", "freq": 5, "cost_multiplier": 10, "starts": 72, "pack_size": [ 4, 8 ] }, + { "monster": "mon_zachycephalosaurus", "freq": 3, "cost_multiplier": 10, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zamptosaurus", "freq": 10, "cost_multiplier": 10, "starts": 72, "pack_size": [ 1, 2 ] }, { "monster": "mon_zpinosaurus", "freq": 1, "cost_multiplier": 90, "starts": 72 }, - { "monster": "mon_zyrannosaurus", "freq": 1, "cost_multiplier": 80, "starts": 72 } + { "monster": "mon_zyrannosaurus", "freq": 1, "cost_multiplier": 80, "starts": 72 }, + { "monster": "mon_zalbertosaurus", "freq": 4, "cost_multiplier": 70, "starts": 72 }, + { "monster": "mon_zriceratops", "freq": 3, "cost_multiplier": 60, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_ztegosaurus", "freq": 5, "cost_multiplier": 40, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zankylosaurus", "freq": 5, "cost_multiplier": 40, "starts": 72 }, + { "monster": "mon_zapatosaurus", "freq": 5, "cost_multiplier": 50, "starts": 72, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zeratosaurus", "freq": 1, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zallosaurus", "freq": 8, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zeinonychus", "freq": 3, "cost_multiplier": 30, "starts": 72, "pack_size": [ 2, 3 ] }, + { "monster": "mon_zutahraptor", "freq": 5, "cost_multiplier": 60, "starts": 72 }, + { "monster": "mon_zarasaurolophus", "freq": 3, "cost_multiplier": 20, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zimorphodon", "freq": 5, "cost_multiplier": 10, "starts": 72, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zilophosaurus", "freq": 1, "cost_multiplier": 20, "starts": 72, "pack_size": [ 1, 2 ] } ] } ] diff --git a/data/mods/DinoMod/monsters/dinosaur.json b/data/mods/DinoMod/monsters/dinosaur.json index 02f4d63e989cb..4c861b0a7b85f 100644 --- a/data/mods/DinoMod/monsters/dinosaur.json +++ b/data/mods/DinoMod/monsters/dinosaur.json @@ -42,7 +42,6 @@ "HIT_AND_RUN", "ANIMAL", "PATH_AVOID_DANGER_1", - "BLEED", "WARM", "SWIMS", "CATFOOD", @@ -81,6 +80,7 @@ "armor_bullet": 1, "hp": 40, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zallimimus", "description": "A feathered bipedal dinosaur, standing as tall as a human. It looks somewhat like a reptilian ostrich.", "reproduction": { "baby_egg": "egg_gallimimus", "baby_count": 3, "baby_timer": 12 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -124,6 +124,7 @@ "armor_cut": 1, "hp": 40, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zachycephalosaurus", "description": "A feathered bipedal dinosaur, standing as tall as a human. It looks like a reptilian ostrich with a round hard-looking domed head.", "reproduction": { "baby_egg": "egg_pachycephalosaurus", "baby_count": 3, "baby_timer": 12 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -169,6 +170,7 @@ "armor_bullet": 1, "hp": 80, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zamptosaurus", "description": "A large feathered bipedal dinosaur with strong legs, broad shoulders and a pointed beak. It moves slowly but with enormous strength.", "reproduction": { "baby_egg": "egg_camptosaurus", "baby_count": 3, "baby_timer": 12 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -215,23 +217,12 @@ "armor_bullet": 2, "hp": 400, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zpinosaurus", "description": "A huge dinosaur about the size of a small house, with a ferocious crocodile-like head and a sail on its back.", "reproduction": { "baby_egg": "egg_spinosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "ANIMAL", - "PATH_AVOID_DANGER_1", - "BASHES", - "DESTROYS", - "BLEED", - "ATTACKMON", - "WARM", - "SWIMS" - ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "ATTACKMON", "WARM", "SWIMS" ], "harvest": "mammal_large_leather", "anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -262,11 +253,12 @@ "armor_bullet": 2, "hp": 300, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zyrannosaurus", "description": "Enormous teeth in a massive jaw, fierce eyes and a powerful frame to drive it forward.", "reproduction": { "baby_egg": "egg_tyrannosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "BLEED", "ATTACKMON", "WARM" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "ATTACKMON", "WARM" ], "harvest": "dino_feather_leather", "anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -298,11 +290,12 @@ "armor_bullet": 2, "hp": 200, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zalbertosaurus", "description": "Looks like a smaller tyrannosaurus rex, but those arms are much longer", "reproduction": { "baby_egg": "egg_albertosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "BLEED", "ATTACKMON", "WARM" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "ATTACKMON", "WARM" ], "special_attacks": [ [ "GRAB", 7 ], [ "LUNGE", 5 ] ], "harvest": "dino_feather_leather", "anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT" ], @@ -335,6 +328,7 @@ "armor_bullet": 2, "hp": 150, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zriceratops", "description": "A massive rhino-like dinosaur with a bony crest from which three large horns emerge.", "reproduction": { "baby_egg": "egg_triceratops", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -419,6 +413,7 @@ "armor_bullet": 1, "hp": 150, "death_function": [ "NORMAL" ], + "zombify_into": "mon_ztegosaurus", "description": "A large slow quadruped dinosaur with plates on its back, and a spiked tail.", "reproduction": { "baby_egg": "egg_stegosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -453,6 +448,7 @@ "armor_bullet": 3, "hp": 120, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zankylosaurus", "special_attacks": [ { "id": "slam", "cooldown": 10, "damage_max_instance": [ { "damage_type": "bash", "amount": 12 } ] }, [ "SMASH", 30 ] @@ -489,6 +485,7 @@ "armor_bullet": 1, "hp": 400, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zapatosaurus", "special_attacks": [ { "id": "slam", "cooldown": 10, "damage_max_instance": [ { "damage_type": "bash", "amount": 12 } ] }, [ "SMASH", 30 ] @@ -528,11 +525,12 @@ "armor_bullet": 1, "hp": 70, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zeratosaurus", "description": "A large, fast predatory bipedal dinosaur, decorated with three colorful horns on its head and dotted with bright skin bones with long sharp teeth and a long flexible tail.", "reproduction": { "baby_egg": "egg_ceratosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "BLEED", "ATTACKMON", "WARM", "SWIMS" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "ATTACKMON", "WARM", "SWIMS" ], "harvest": "mammal_large_leather", "anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -563,11 +561,12 @@ "armor_bullet": 1, "hp": 120, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zallosaurus", "description": "A large predatory bipedal dinosaur, with tiger-like stripes on its broad back.", "reproduction": { "baby_egg": "egg_allosaurus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "BLEED", "ATTACKMON", "WARM" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "ATTACKMON", "WARM" ], "harvest": "mammal_large_leather", "anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -640,7 +639,7 @@ "reproduction": { "baby_egg": "egg_velociraptor", "baby_count": 3, "baby_timer": 18 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "BLEED", "WARM", "CLIMBS" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM", "CLIMBS" ], "harvest": "dino_feather_leather", "anger_triggers": [ "STALK", "FRIEND_ATTACKED", "FRIEND_DIED", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -671,6 +670,7 @@ "armor_bullet": 1, "hp": 60, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zeinonychus", "vision_night": 5, "special_attacks": [ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true } ], "description": "A medium-sized bipedal dinosaur covered with feathers. At the end of each foot is a large sickle-like claw.", @@ -684,7 +684,6 @@ "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", - "BLEED", "ATTACKMON", "WARM", "CLIMBS", @@ -726,7 +725,6 @@ "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", - "BLEED", "ATTACKMON", "WARM", "CLIMBS", @@ -762,13 +760,14 @@ "armor_bullet": 1, "hp": 100, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zutahraptor", "vision_night": 5, "special_attacks": [ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true } ], "description": "A large bipedal dinosaur with feathered arms, a long tail, and scythe-like claws.", "reproduction": { "baby_egg": "egg_utahraptor", "baby_count": 3, "baby_timer": 18 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "BLEED", "ATTACKMON", "WARM", "CLIMBS" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "ATTACKMON", "WARM", "CLIMBS" ], "harvest": "dino_feather_leather", "anger_triggers": [ "STALK", "FRIEND_ATTACKED", "FRIEND_DIED", "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], @@ -799,6 +798,7 @@ "armor_bullet": 3, "hp": 300, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zarasaurolophus", "description": "A huge mottled dinosaur with a blunt head crest. It contentedly strips leaves from a nearby shrub.", "reproduction": { "baby_egg": "egg_parasaurolophus", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], @@ -833,11 +833,12 @@ "vision_day": 50, "hp": 30, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zimorphodon", "description": "A feathered flying reptile over three feet long, with short wings and a big colorful beak.", "reproduction": { "baby_egg": "egg_dimorphodon", "baby_count": 3, "baby_timer": 24 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "HIT_AND_RUN", "ANIMAL", "PATH_AVOID_DANGER_1", "BLEED" ], + "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "HIT_AND_RUN", "ANIMAL", "PATH_AVOID_DANGER_1" ], "harvest": "animal_noskin", "fear_triggers": [ "PLAYER_CLOSE", "FIRE", "FRIEND_DIED" ], "placate_triggers": [ "MEAT" ], @@ -852,7 +853,7 @@ "symbol": "D", "color": "magenta_green", "volume": "400000 ml", - "weight": 400000, + "weight": "400 kg", "material": [ "flesh" ], "aggression": 10, "morale": 30, @@ -867,11 +868,12 @@ "armor_bullet": 1, "hp": 120, "death_function": [ "NORMAL" ], + "zombify_into": "mon_zilophosaurus", "description": "A medium dinosaur with sharp teeth and two prominent bony crests on its head.", "reproduction": { "baby_egg": "egg_dilophosaurus", "baby_count": 3, "baby_timer": 18 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 3 }, - "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "BLEED", "WARM" ], + "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM" ], "harvest": "mammal_leather", "anger_triggers": [ "PLAYER_WEAK", "HURT" ], "placate_triggers": [ "MEAT" ], diff --git a/data/mods/DinoMod/monsters/fungus.json b/data/mods/DinoMod/monsters/fungus.json index 551957b6e7f0c..122d5d67bff80 100644 --- a/data/mods/DinoMod/monsters/fungus.json +++ b/data/mods/DinoMod/monsters/fungus.json @@ -18,7 +18,7 @@ "vision_day": 5, "vision_night": 5, "special_attacks": [ [ "FUNGUS", 200 ], { "type": "bite", "cooldown": 5 } ], - "upgrades": { "into": "mon_zpinosaurus_fungus" }, + "upgrades": { }, "flags": [ "SEES", "SMELLS", "POISON", "STUMBLES", "BASHES", "DESTROYS", "NO_BREATHE", "FILTHY", "WARM", "SWIMS" ] }, { @@ -40,7 +40,7 @@ "vision_day": 5, "vision_night": 5, "special_attacks": [ [ "FUNGUS", 200 ], { "type": "bite", "cooldown": 5 } ], - "upgrades": { "half_life": 1400000, "into_group": "GROUP_zyrannosaurus_UPGRADE" }, + "upgrades": { }, "flags": [ "SEES", "SMELLS", "POISON", "STUMBLES", "BASHES", "DESTROYS", "NO_BREATHE", "FILTHY", "WARM" ] }, { @@ -62,7 +62,7 @@ "vision_day": 5, "vision_night": 5, "special_attacks": [ [ "FUNGUS", 200 ], { "type": "bite", "cooldown": 5 } ], - "upgrades": { "into": "mon_zeinonychus_fungus" }, + "upgrades": { }, "flags": [ "SEES", "SMELLS", "KEENNOSE", "POISON", "STUMBLES", "NO_BREATHE", "FILTHY", "WARM" ] } ] diff --git a/data/mods/DinoMod/monsters/zed-dinosaur.json b/data/mods/DinoMod/monsters/zed-dinosaur.json index 6789cf645a720..effe0b13ee955 100644 --- a/data/mods/DinoMod/monsters/zed-dinosaur.json +++ b/data/mods/DinoMod/monsters/zed-dinosaur.json @@ -26,6 +26,7 @@ "death_function": [ "NORMAL" ], "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid.", + "upgrades": { "half_life": 14, "into": "mon_zallimimus_brute" }, "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ], "vision_night": 3, "harvest": "zed_dino_feather_leather", @@ -57,6 +58,7 @@ "death_function": [ "NORMAL" ], "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid. It looks like a reptilian ostrich with a round hard-looking domed head.", + "upgrades": { "half_life": 14, "into": "mon_zachycephalosaurus_brute" }, "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ], "vision_night": 3, "harvest": "zed_dino_feather_leather", @@ -89,6 +91,7 @@ "death_function": [ "NORMAL" ], "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], "description": "The shuffling corpse of a large feathered bipedal dinosaur with strong legs, broad shoulders and a pointed beak. Its tattered feathers are stained with black, sticky liquid.", + "upgrades": { "half_life": 14, "into": "mon_zamptosaurus_brute" }, "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM", "BASHES" ], "vision_night": 3, "harvest": "zed_dino_feather_leather", @@ -120,7 +123,7 @@ "death_function": [ "NORMAL" ], "description": "Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing black eyes, and a tattered sail on its back.", "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], - "upgrades": { "half_life": 14, "into": "mon_zpinosaurus_shady" }, + "upgrades": { "half_life": 14, "into_group": "GROUP_zpinosaurus_UPGRADE" }, "flags": [ "SEES", "SMELLS", @@ -129,7 +132,6 @@ "STUMBLES", "BASHES", "DESTROYS", - "BLEED", "NO_BREATHE", "REVIVES", "FILTHY", @@ -140,33 +142,6 @@ "harvest": "zed_dino_feather_leather", "categories": [ "DINOSAUR", "CLASSIC" ] }, - { - "type": "MONSTER", - "id": "mon_zpinosaurus_shady", - "name": { "str": "Spinosaurus shady zombie" }, - "copy-from": "mon_zpinosaurus", - "color": "light_gray", - "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a huge bipedal dinosaur with a tattered sail. The head is long and narrow with a V-shaped snout.", - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "POISON", - "STUMBLES", - "BASHES", - "DESTROYS", - "BLEED", - "NO_BREATHE", - "REVIVES", - "FILTHY", - "WARM", - "SWIMS", - "NIGHT_INVISIBILITY" - ], - "vision_day": 3, - "vision_night": 30, - "categories": [ "DINOSAUR" ] - }, { "type": "MONSTER", "id": "mon_zyrannosaurus", @@ -194,74 +169,11 @@ "description": "Massive piles of ragged, stinking flesh lifting enormous teeth.", "special_attacks": [ [ "scratch", 10 ], { "type": "bite", "cooldown": 5 } ], "upgrades": { "half_life": 14, "into_group": "GROUP_zyrannosaurus_UPGRADE" }, - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "POISON", - "STUMBLES", - "BASHES", - "DESTROYS", - "BLEED", - "NO_BREATHE", - "REVIVES", - "FILTHY", - "WARM" - ], + "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "BASHES", "DESTROYS", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ], "vision_night": 3, "harvest": "zed_dino_feather_leather", "categories": [ "DINOSAUR", "CLASSIC" ] }, - { - "type": "MONSTER", - "id": "mon_zyrannosaurus_shady", - "name": { "str": "Shady Z-Rex" }, - "copy-from": "mon_zyrannosaurus", - "color": "light_gray", - "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a huge bipedal dinosaur with feathery edges. The head looks big, lots of big teeth would fit in it.", - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "POISON", - "STUMBLES", - "BASHES", - "DESTROYS", - "BLEED", - "NO_BREATHE", - "REVIVES", - "FILTHY", - "WARM", - "NIGHT_INVISIBILITY" - ], - "vision_day": 3, - "vision_night": 30, - "categories": [ "DINOSAUR" ] - }, - { - "type": "MONSTER", - "id": "mon_syrannosaurus", - "name": { "str": "S-Rex", "str_pl": "S-Rexes" }, - "copy-from": "mon_zyrannosaurus", - "color": "white", - "material": [ "bone" ], - "speed": 35, - "melee_skill": 13, - "melee_dice": 4, - "melee_dice_sides": 12, - "melee_cut": 20, - "armor_bash": 0, - "armor_cut": 30, - "armor_bullet": 30, - "armor_stab": 30, - "armor_acid": 3, - "vision_day": 30, - "hp": 200, - "description": "Monstrous columns of dense bone lifting enormous sharp pointed teeth dripping with black goo.", - "flags": [ "SEES", "HEARS", "POISON", "HARDTOSHOOT", "BLEED", "NO_BREATHE", "REVIVES", "FILTHY" ], - "harvest": "mr_bones", - "categories": [ "DINOSAUR" ] - }, { "type": "MONSTER", "id": "mon_zalbertosaurus", @@ -275,7 +187,8 @@ "armor_bullet": 3, "hp": 330, "special_attacks": [ { "type": "bite", "cooldown": 5 }, [ "GRAB", 7 ], [ "scratch", 20 ], [ "LUNGE", 5 ] ], - "description": "Massive jaws drooling black liquid lifted over grasping claws by a huge shuffling dinosaur corpse." + "description": "Massive jaws drooling black liquid lifted over grasping claws by a huge shuffling dinosaur corpse.", + "upgrades": { "half_life": 14, "into_group": "GROUP_zalbertosaurus_UPGRADE" } }, { "type": "MONSTER", @@ -295,7 +208,8 @@ "armor_cut": 5, "armor_bullet": 3, "hp": 250, - "description": "A massive shambling rhino-like dinosaur corpse with a bony crest from which three wicked looking horns emerge. Its black eyes ooze like tears." + "description": "A massive shambling rhino-like dinosaur corpse with a bony crest from which three wicked looking horns emerge. Its black eyes ooze like tears.", + "upgrades": { "half_life": 14, "into": "mon_zriceratops_brute" } }, { "type": "MONSTER", @@ -315,7 +229,8 @@ "armor_cut": 4, "armor_bullet": 2, "hp": 250, - "description": "A large shambling quadruped dinosaur corpse dragging with the weight of the plates on its back, waving a much livelier looking spiked tail." + "description": "A large shambling quadruped dinosaur corpse dragging with the weight of the plates on its back, waving a much livelier looking spiked tail.", + "upgrades": { "half_life": 14, "into": "mon_ztegosaurus_brute" } }, { "type": "MONSTER", @@ -335,7 +250,8 @@ "armor_cut": 7, "armor_bullet": 4, "hp": 200, - "description": "The shuffling corpse of what looks like a giant armadillo with peeling armored plates and black, glistening eyes. Its tail ends in a massive spiked club of bone." + "description": "The shuffling corpse of what looks like a giant armadillo with peeling armored plates and black, glistening eyes. Its tail ends in a massive spiked club of bone.", + "upgrades": { "half_life": 14, "into": "mon_zankylosaurus_brute" } }, { "type": "MONSTER", @@ -358,7 +274,8 @@ { "id": "slam", "cooldown": 10, "damage_max_instance": [ { "damage_type": "bash", "amount": 12 } ] }, [ "SMASH", 30 ] ], - "description": "Massive, long-necked, four-legged dinosaur corpse with a long, whip-like tail. The head is upright and the neck looks like it would still make a good strong club." + "description": "Massive, long-necked, four-legged dinosaur corpse with a long, whip-like tail. The head is upright and the neck looks like it would still make a good strong club.", + "upgrades": { "half_life": 14, "into": "mon_zapatosaurus_brute" } }, { "type": "MONSTER", @@ -378,20 +295,8 @@ "armor_bullet": 2, "hp": 115, "description": "This zombie is enormous, scaly, studded with bony spikes, and it moves with horrible speed. Its colorful horns are worn and wet with filth and its bright scales and bone spikes have taken a beating.", - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "BASHES", - "BLEED", - "POISON", - "STUMBLES", - "NO_BREATHE", - "REVIVES", - "FILTHY", - "WARM", - "SWIMS" - ] + "upgrades": { "half_life": 14, "into_group": "GROUP_zeratosaurus_UPGRADE" }, + "flags": [ "SEES", "SMELLS", "HEARS", "BASHES", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM", "SWIMS" ] }, { "type": "MONSTER", @@ -411,7 +316,8 @@ "armor_bullet": 2, "hp": 200, "description": "The shambling corpse of a large predatory bipedal dinosaur, with tiger-like stripes on its broad, scaled back.", - "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "BASHES", "BLEED", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ] + "upgrades": { "half_life": 14, "into_group": "GROUP_zallosaurus_UPGRADE" }, + "flags": [ "SEES", "SMELLS", "HEARS", "POISON", "STUMBLES", "BASHES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ] }, { "type": "MONSTER", @@ -444,38 +350,13 @@ { "type": "bite", "cooldown": 5 } ], "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid. Both feet brandish a large sickle-like claw.", - "upgrades": { "half_life": 14, "into": "mon_zeinonychus_shady" }, - "flags": [ "SEES", "SMELLS", "HEARS", "KEENNOSE", "BLEED", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ], + "upgrades": { "half_life": 14, "into_group": "GROUP_zeinonychus_UPGRADE" }, + "flags": [ "SEES", "SMELLS", "HEARS", "KEENNOSE", "POISON", "STUMBLES", "NO_BREATHE", "REVIVES", "FILTHY", "WARM" ], "vision_day": 30, "vision_night": 10, "harvest": "zed_dino_feather_leather", "categories": [ "DINOSAUR", "CLASSIC" ] }, - { - "type": "MONSTER", - "id": "mon_zeinonychus_shady", - "name": { "str": "Deinonychus shady zombie" }, - "copy-from": "mon_zeinonychus", - "color": "light_gray", - "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a medium-sized bipedal dinosaur with feathery edges. Both feet brandish a large sickle-like claw.", - "flags": [ - "SEES", - "SMELLS", - "HEARS", - "KEENNOSE", - "BLEED", - "POISON", - "STUMBLES", - "NO_BREATHE", - "REVIVES", - "FILTHY", - "WARM", - "NIGHT_INVISIBILITY" - ], - "vision_day": 3, - "vision_night": 40, - "categories": [ "DINOSAUR" ] - }, { "type": "MONSTER", "id": "mon_zutahraptor", @@ -493,7 +374,8 @@ "armor_cut": 4, "armor_bullet": 2, "hp": 170, - "description": "The swaying, hopping corpse of a large bipedal dinosaur with feathered arms, a long tail, and long sharp scythe-like claws." + "description": "The swaying, hopping corpse of a large bipedal dinosaur with feathered arms, a long tail, and long sharp scythe-like claws.", + "upgrades": { "half_life": 14, "into_group": "GROUP_zutahraptor_UPGRADE" } }, { "type": "MONSTER", @@ -513,7 +395,8 @@ "armor_cut": 7, "armor_bullet": 4, "hp": 500, - "description": "A huge mottled dinosaur with a blunt head crest, dead and walking, eyes vacant and swollen." + "description": "A huge mottled dinosaur with a blunt head crest, dead and walking, eyes vacant and swollen.", + "upgrades": { "half_life": 14, "into": "mon_zarasaurolophus_brute" } }, { "type": "MONSTER", @@ -533,7 +416,8 @@ "armor_cut": 4, "armor_bullet": 1, "hp": 50, - "description": "The raggedly flying corpse of a feathered reptile over three feet long, with short wings and a big colorful beak." + "description": "The raggedly flying corpse of a feathered reptile over three feet long, with short wings and a big colorful beak.", + "upgrades": { "half_life": 14, "into": "mon_zimorphodon_brute" } }, { "type": "MONSTER", @@ -552,6 +436,7 @@ "armor_cut": 4, "armor_bullet": 2, "hp": 200, - "description": "The shuffling corpse of a medium dinosaur with sharp teeth and two prominent bony crests on its head with ragged strips of ripped flesh hanging down like a frill." + "description": "The shuffling corpse of a medium dinosaur with sharp teeth and two prominent bony crests on its head with ragged strips of ripped flesh hanging down like a frill.", + "upgrades": { "half_life": 14, "into": "mon_zilophosaurus_brute" } } ] diff --git a/data/mods/DinoMod/monsters/zinosaur_upgrade.json b/data/mods/DinoMod/monsters/zinosaur_upgrade.json new file mode 100644 index 0000000000000..0ec03170a5bf2 --- /dev/null +++ b/data/mods/DinoMod/monsters/zinosaur_upgrade.json @@ -0,0 +1,596 @@ +[ + { + "type": "MONSTER", + "id": "mon_zallimimus_brute", + "name": { "str": "Gruesome Gallimimus" }, + "copy-from": "mon_zallimimus", + "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zachycephalosaurus_brute", + "name": { "str": "Skull Breaker" }, + "copy-from": "mon_zachycephalosaurus", + "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid. Its round, hard-looking domed head sits on a body bulging with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zamptosaurus_brute", + "name": { "str": "Crusher Camp" }, + "copy-from": "mon_zamptosaurus", + "description": "The shuffling corpse of a large feathered bipedal dinosaur with grossly bulging legs, massive hulking shoulders and a vicious pointed beak. Its tattered feathers are stained with black, sticky liquid.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zpinosaurus_brute", + "name": { "str": "Spino Sledge" }, + "copy-from": "mon_zpinosaurus", + "description": "Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing black eyes, and a tattered sail on its back. Its body is even bigger than normal, bulging with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zyrannosaurus_brute", + "name": { "str": "Rage Rex" }, + "copy-from": "mon_zyrannosaurus", + "description": "Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zalbertosaurus_brute", + "name": { "str": "Alberta Anvil" }, + "copy-from": "mon_zalbertosaurus", + "description": "Massive jaws and grabbing claws lifting by a body bulging with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ], [ "GRAB", 7 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zriceratops_brute", + "name": { "str": "Triceratruck" }, + "copy-from": "mon_zriceratops", + "description": "A massive shambling rhino-like dinosaur corpse with a bony crest from which three wicked looking horns emerge. Its black eyes ooze like tears. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_ztegosaurus_brute", + "name": { "str": "Stegosaurus Sledge" }, + "copy-from": "mon_ztegosaurus", + "description": "A large shambling quadruped dinosaur corpse with plates on its back, waving a spiked tail. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zankylosaurus_brute", + "name": { "str": "Dino Tank" }, + "copy-from": "mon_zankylosaurus", + "description": "Heavily armored zombie dinosaur. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zapatosaurus_brute", + "name": { "str": "Zombie Dreadnought" }, + "copy-from": "mon_zapatosaurus", + "description": "Massive, long-necked, four-legged dinosaur corpse with a long, whip-like tail. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zeratosaurus_brute", + "name": { "str": "Draco Titan" }, + "copy-from": "mon_zeratosaurus", + "description": "This zombie is enormous, scaly, studded with bony spikes, and it moves with horrible speed. Its colorful horns and bone spikes sit on a body bulging with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zallosaurus_brute", + "name": { "str": "Allosaurus Avalanche" }, + "copy-from": "mon_zallosaurus", + "description": "The shambling corpse of a large predatory bipedal dinosaur. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zeinonychus_brute", + "name": { "str": "Deino Destroyer" }, + "copy-from": "mon_zeinonychus", + "description": "The shuffling corpse of a medium-sized bipedal dinosaur covered with tattered feathers and black putrid liquid. Both feet brandish a large sickle-like claw. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zutahraptor_brute", + "name": { "str": "Utah Hoodoo" }, + "copy-from": "mon_zutahraptor", + "description": "The swaying, hopping corpse of a large bipedal dinosaur with feathered arms, a long tail, and long sharp scythe-like claws. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zarasaurolophus_brute", + "name": { "str": "Parasaur Punch" }, + "copy-from": "mon_zarasaurolophus", + "description": "A huge mottled dinosaur with a blunt head crest, dead and walking, eyes vacant and swollen. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zimorphodon_brute", + "name": { "str": "Winged Horror" }, + "copy-from": "mon_zimorphodon", + "description": "The flying corpse of a feathered reptile over three feet long, with short wings and a big colorful beak. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zilophosaurus_brute", + "name": { "str": "Crested Crusher" }, + "copy-from": "mon_zilophosaurus", + "description": "The shuffling corpse of a medium dinosaur with sharp teeth and two prominent bony crests on its head with ragged strips of ripped flesh hanging down like a frill. Its entire body bulges with distended muscles and swollen, festering wounds.", + "diff": 2, + "color": "red", + "proportional": { "hp": 1.5, "speed": 1.5 }, + "relative": { + "melee_dice": 1, + "melee_dice_sides": 5, + "melee_cut": 2, + "armor_bash": 4, + "armor_cut": 6, + "armor_bullet": 5, + "vision_night": 1 + }, + "upgrades": { }, + "special_attacks": [ [ "SMASH", 30 ] ], + "extend": { "flags": [ "GROUP_BASH", "PUSH_MON", "PUSH_VEH" ] }, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zpinosaurus_shady", + "name": { "str": "Spinosaurus shady zombie" }, + "copy-from": "mon_zpinosaurus", + "color": "light_gray", + "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a huge bipedal dinosaur with a tattered sail. The head is long and narrow with a V-shaped snout.", + "upgrades": { }, + "flags": [ + "SEES", + "SMELLS", + "HEARS", + "POISON", + "STUMBLES", + "BASHES", + "DESTROYS", + "NO_BREATHE", + "REVIVES", + "FILTHY", + "WARM", + "SWIMS", + "NIGHT_INVISIBILITY" + ], + "vision_day": 3, + "vision_night": 30, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zyrannosaurus_shady", + "name": { "str": "Shady Z-Rex" }, + "copy-from": "mon_zyrannosaurus", + "color": "light_gray", + "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a huge bipedal dinosaur with feathery edges. The head looks big, lots of big teeth would fit in it.", + "upgrades": { }, + "flags": [ + "SEES", + "SMELLS", + "HEARS", + "POISON", + "STUMBLES", + "BASHES", + "DESTROYS", + "NO_BREATHE", + "REVIVES", + "FILTHY", + "WARM", + "NIGHT_INVISIBILITY" + ], + "vision_day": 3, + "vision_night": 30, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_zeinonychus_shady", + "name": { "str": "Deinonychus shady zombie" }, + "copy-from": "mon_zeinonychus", + "color": "light_gray", + "description": "An uncanny shadow envelops this dinosaur. You can make out the outline of a medium-sized bipedal dinosaur with feathery edges. Both feet brandish a large sickle-like claw.", + "upgrades": { }, + "flags": [ + "SEES", + "SMELLS", + "HEARS", + "KEENNOSE", + "POISON", + "STUMBLES", + "NO_BREATHE", + "REVIVES", + "FILTHY", + "WARM", + "NIGHT_INVISIBILITY" + ], + "vision_day": 3, + "vision_night": 40, + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_syrannosaurus", + "name": { "str": "S-Rex", "str_pl": "S-Rexes" }, + "copy-from": "mon_zyrannosaurus", + "color": "white", + "material": [ "bone" ], + "armor_bash": 0, + "description": "Monstrous columns of dense bone lifting enormous sharp pointed teeth dripping with black goo.", + "proportional": { "hp": 0.4, "speed": 0.875 }, + "relative": { + "melee_dice": 9, + "melee_dice_sides": 5, + "melee_cut": 7, + "armor_cut": 22, + "armor_bullet": 30, + "armor_stab": 30, + "armor_acid": 3, + "vision_day": -20 + }, + "upgrades": { }, + "extend": { "flags": [ "HARDTOSHOOT" ] }, + "harvest": "mr_bones", + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_salbertosaurus", + "name": { "str": "Skeletal Albertosaurus" }, + "copy-from": "mon_zalbertosaurus", + "color": "white", + "material": [ "bone" ], + "armor_bash": 0, + "description": "Monstrous columns of dense bone lifting sharp pointed teeth dripping with black goo. Skeletal claws reach ahead.", + "proportional": { "hp": 0.4, "speed": 0.875 }, + "relative": { + "melee_dice": 9, + "melee_dice_sides": 5, + "melee_cut": 7, + "armor_cut": 22, + "armor_bullet": 30, + "armor_stab": 30, + "armor_acid": 3, + "vision_day": -20 + }, + "upgrades": { }, + "extend": { "flags": [ "HARDTOSHOOT" ] }, + "harvest": "mr_bones", + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_seratosaurus", + "name": { "str": "Bone Dragon" }, + "copy-from": "mon_zeratosaurus", + "color": "white", + "material": [ "bone" ], + "armor_bash": 0, + "description": "Monstrous columns of dense bone lifting sharp pointed teeth dripping with black goo. Spikes and colorful horns jut out to complete the effect.", + "proportional": { "hp": 0.4, "speed": 0.875 }, + "relative": { + "melee_dice": 9, + "melee_dice_sides": 5, + "melee_cut": 7, + "armor_cut": 22, + "armor_bullet": 30, + "armor_stab": 30, + "armor_acid": 3, + "vision_day": -20 + }, + "upgrades": { }, + "extend": { "flags": [ "HARDTOSHOOT" ] }, + "harvest": "mr_bones", + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_sallosaurus", + "name": { "str": "Skeletal allosaurus" }, + "copy-from": "mon_zallosaurus", + "color": "white", + "material": [ "bone" ], + "armor_bash": 0, + "description": "Monstrous columns of dense bone lifting sharp pointed teeth dripping with black goo.", + "proportional": { "hp": 0.4, "speed": 0.875 }, + "relative": { + "melee_dice": 9, + "melee_dice_sides": 5, + "melee_cut": 7, + "armor_cut": 22, + "armor_bullet": 30, + "armor_stab": 30, + "armor_acid": 3, + "vision_day": -20 + }, + "upgrades": { }, + "extend": { "flags": [ "HARDTOSHOOT" ] }, + "harvest": "mr_bones", + "categories": [ "DINOSAUR" ] + }, + { + "type": "MONSTER", + "id": "mon_sutahraptor", + "name": { "str": "Utah Bones" }, + "copy-from": "mon_zutahraptor", + "color": "white", + "material": [ "bone" ], + "armor_bash": 0, + "description": "Monstrous columns of dense bone lifting sharp pointed teeth dripping with black goo. There is a long tail and long sharp scythe-like claws", + "proportional": { "hp": 0.4, "speed": 0.875 }, + "relative": { + "melee_dice": 9, + "melee_dice_sides": 5, + "melee_cut": 7, + "armor_cut": 22, + "armor_bullet": 30, + "armor_stab": 30, + "armor_acid": 3, + "vision_day": -20 + }, + "upgrades": { }, + "extend": { "flags": [ "HARDTOSHOOT" ] }, + "harvest": "mr_bones", + "categories": [ "DINOSAUR" ] + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json index 7e3544246d05f..d73f21557f905 100644 --- a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json @@ -67,7 +67,7 @@ "i": "f_locker", "j": "f_bench", "k": "f_locker", - "l": "f_treadmill", + "l": [ "f_treadmill", "f_treadmill_mechanical" ], "m": "f_shower", "n": "f_toilet", "p": "f_sink", diff --git a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json index a3bb83542b657..398eaa75f7b0e 100644 --- a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json +++ b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json @@ -306,5 +306,15 @@ ], "type": "MIGRATION", "replace": "shot_pump" + }, + { + "id": "slamfire_shotgun", + "type": "MIGRATION", + "replace": "slamfire_shotgun" + }, + { + "id": "slamfire_shotgun_d", + "type": "MIGRATION", + "replace": "slamfire_shotgun_d" } ] diff --git a/data/mods/Generic_Guns/firearms/pistol_magnum.json b/data/mods/Generic_Guns/firearms/pistol_magnum.json index f1079f276cb95..1b935c3138296 100644 --- a/data/mods/Generic_Guns/firearms/pistol_magnum.json +++ b/data/mods/Generic_Guns/firearms/pistol_magnum.json @@ -44,7 +44,7 @@ "durability": 6, "blackpowder_tolerance": 60, "loudness": 25, - "barrel_length": 1, + "barrel_volume": "250 ml", "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], diff --git a/data/mods/Generic_Guns/firearms/shot.json b/data/mods/Generic_Guns/firearms/shot.json index 85f7ddeea8119..d566b22c79a9a 100644 --- a/data/mods/Generic_Guns/firearms/shot.json +++ b/data/mods/Generic_Guns/firearms/shot.json @@ -50,25 +50,19 @@ "ammo": [ "ammo_shot" ] }, { - "id": "slam_shotgun", - "copy-from": "slam_shotgun", + "id": "slamfire_shotgun", + "copy-from": "slamfire_shotgun", "type": "GUN", - "name": { "str": "slam-fire shotgun" }, + "name": { "str": "slam-fire pipe shotgun" }, "description": "A crude shotgun, composed of two thick steel pipes, an end cap and a nail. The lack of sights make this weapon only useful at point-blank range.", - "weight": "3629 g", - "volume": "2264 ml", - "looks_like": "pipe", - "price": 8500, - "price_postapoc": 1000, - "bashing": 8, - "material": [ "steel" ], - "ranged_damage": { "damage_type": "bullet", "amount": -2 }, - "dispersion": 960, - "durability": 4, - "clip_size": 1, - "modes": [ [ "DEFAULT", "single", 1 ] ], - "valid_mod_locations": [ [ "sling", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], - "flags": [ "RELOAD_EJECT" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "shot": 1 } } ] + "ammo": [ "ammo_shot" ] + }, + { + "id": "slamfire_shotgun_d", + "copy-from": "slamfire_shotgun_d", + "type": "GUN", + "name": { "str": "double slam-fire pipe shotgun" }, + "description": "A crude shotgun, composed of two thick steel pipes, an end cap and a nail. The lack of sights make this weapon only useful at point-blank range.", + "ammo": [ "ammo_shot" ] } ] diff --git a/data/mods/Generic_Guns/gunmods/gg_gunmods_blacklist.json b/data/mods/Generic_Guns/gunmods/gg_gunmods_blacklist.json index 338c6338da274..dcdc92531250c 100644 --- a/data/mods/Generic_Guns/gunmods/gg_gunmods_blacklist.json +++ b/data/mods/Generic_Guns/gunmods/gg_gunmods_blacklist.json @@ -1,23 +1,25 @@ -{ - "type": "ITEM_BLACKLIST", - "whitelist": false, - "items": [ - "lemat_revolver_shotgun", - "llink", - "dias", - "M6_shotgun", - "ksg_aux_shotgun", - "ksg25_aux_shotgun", - "combination_gun_shotgun", - "combination_gun_shotgun_pipe", - "belt_clip", - "retool_ar15_300blk", - "ts12_aux_shotgun", - "ts12_aux_shotgun2", - "lwfeed", - "lead_barrel_big", - "lead_barrel_heavy_duty", - "inter_bayonet", - "factory_handguard" - ] -} +[ + { + "type": "ITEM_BLACKLIST", + "whitelist": false, + "items": [ + "lemat_revolver_shotgun", + "llink", + "dias", + "M6_shotgun", + "ksg_aux_shotgun", + "ksg25_aux_shotgun", + "combination_gun_shotgun", + "combination_gun_shotgun_pipe", + "belt_clip", + "retool_ar15_300blk", + "ts12_aux_shotgun", + "ts12_aux_shotgun2", + "lwfeed", + "lead_barrel_big", + "lead_barrel_heavy_duty", + "inter_bayonet", + "factory_handguard" + ] + } +] diff --git a/data/mods/Generic_Guns/magazines/gg_magazines_blacklist.json b/data/mods/Generic_Guns/magazines/gg_magazines_blacklist.json index 5c231166b1920..3283ee853d85c 100644 --- a/data/mods/Generic_Guns/magazines/gg_magazines_blacklist.json +++ b/data/mods/Generic_Guns/magazines/gg_magazines_blacklist.json @@ -1,7 +1,7 @@ -{ - "type": "ITEM_BLACKLIST", - "whitelist": false, - "items": [ - "m74_clip" - ] -} +[ + { + "type": "ITEM_BLACKLIST", + "whitelist": false, + "items": [ "m74_clip" ] + } +] diff --git a/data/mods/Generic_Guns/magazines/grenade.json b/data/mods/Generic_Guns/magazines/grenade.json index 13d8f2c655acd..d5fc0146d0af8 100644 --- a/data/mods/Generic_Guns/magazines/grenade.json +++ b/data/mods/Generic_Guns/magazines/grenade.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": { "str": "grenade machine gun belt" }, "description": "An ammo belt consisting of metal linkages which separate from the belt upon firing. This one holds grenade cartridges and is too bulky to be worn like other ammo belts.", - "volume": 0, + "volume": "0 L", "price": 0, "material": [ "steel" ], "symbol": "#", diff --git a/data/mods/Generic_Guns/obsolete.json b/data/mods/Generic_Guns/obsolete.json index 452cccd75d252..69beceb33f2fb 100644 --- a/data/mods/Generic_Guns/obsolete.json +++ b/data/mods/Generic_Guns/obsolete.json @@ -43,5 +43,10 @@ "type": "recipe", "result": "rifle_pipe_rifle", "obsolete": true + }, + { + "type": "recipe", + "result": "slam_shotgun", + "obsolete": true } ] diff --git a/data/mods/Generic_Guns/recipes/recipes_firearms_single.json b/data/mods/Generic_Guns/recipes/recipes_firearms_single.json index 1c2998dfd75bc..b2914a75b4556 100644 --- a/data/mods/Generic_Guns/recipes/recipes_firearms_single.json +++ b/data/mods/Generic_Guns/recipes/recipes_firearms_single.json @@ -125,7 +125,7 @@ }, { "type": "recipe", - "result": "slam_shotgun", + "result": "slamfire_shotgun", "category": "CC_WEAPON", "subcategory": "CSC_WEAPON_RANGED", "skill_used": "mechanics", @@ -139,14 +139,13 @@ { "id": "GLARE", "level": 2 }, { "id": "HAMMER", "level": 2 }, { "id": "FILE", "level": 1 }, - { "id": "WELD", "level": 2 } + { "id": "WELD", "level": 1 } ], "tools": [ [ [ "shot_buck", -1 ], [ "shot_fowl", -1 ], [ "shot_pyro", -1 ], - [ "shot_dart", -1 ], [ "shot_foster", -1 ], [ "shot_bean", -1 ], [ "reloaded_shot_buck", -1 ], @@ -165,5 +164,158 @@ ] ], "components": [ [ [ "pipe", 2 ] ], [ [ "nail", 1 ] ], [ [ "scrap", 3 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun", + "id_suffix": "without_welding", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "time": "1 h", + "autolearn": true, + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "DRILL", "level": 2 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WRENCH", "level": 1 } + ], + "tools": [ + [ + [ "shot_buck", -1 ], + [ "shot_fowl", -1 ], + [ "shot_pyro", -1 ], + [ "shot_foster", -1 ], + [ "shot_bean", -1 ], + [ "reloaded_shot_buck", -1 ], + [ "reloaded_shot_fowl", -1 ], + [ "reloaded_shot_pyro", -1 ], + [ "reloaded_shot_dart", -1 ], + [ "reloaded_shot_foster", -1 ], + [ "reloaded_shot_junk", -1 ], + [ "bp_shot_buck", -1 ], + [ "bp_shot_fowl", -1 ], + [ "bp_shot_pyro", -1 ], + [ "bp_shot_dart", -1 ], + [ "bp_shot_foster", -1 ], + [ "bp_shot_junk", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 2 ] ], [ [ "nail", 1 ] ], [ [ "pipe_fittings", 1 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "difficulty": 2, + "time": "2 h", + "autolearn": true, + "book_learn": [ [ "manual_shotgun", 1 ] ], + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "GLARE", "level": 2 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WELD", "level": 1 } + ], + "tools": [ + [ + [ "shot_buck", -1 ], + [ "shot_fowl", -1 ], + [ "shot_pyro", -1 ], + [ "shot_foster", -1 ], + [ "shot_bean", -1 ], + [ "reloaded_shot_buck", -1 ], + [ "reloaded_shot_fowl", -1 ], + [ "reloaded_shot_pyro", -1 ], + [ "reloaded_shot_dart", -1 ], + [ "reloaded_shot_foster", -1 ], + [ "reloaded_shot_junk", -1 ], + [ "bp_shot_buck", -1 ], + [ "bp_shot_fowl", -1 ], + [ "bp_shot_pyro", -1 ], + [ "bp_shot_dart", -1 ], + [ "bp_shot_foster", -1 ], + [ "bp_shot_junk", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 4 ] ], [ [ "nail", 2 ] ], [ [ "scrap", 5 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "welded_and_bolted", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "difficulty": 2, + "time": "2 h", + "autolearn": true, + "book_learn": [ [ "manual_shotgun", 1 ] ], + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "GLARE", "level": 2 }, + { "id": "HAMMER", "level": 2 }, + { "id": "FILE", "level": 1 }, + { "id": "WRENCH", "level": 1 }, + { "id": "WELD", "level": 1 } + ], + "tools": [ + [ + [ "shot_buck", -1 ], + [ "shot_fowl", -1 ], + [ "shot_pyro", -1 ], + [ "shot_foster", -1 ], + [ "shot_bean", -1 ], + [ "reloaded_shot_buck", -1 ], + [ "reloaded_shot_fowl", -1 ], + [ "reloaded_shot_pyro", -1 ], + [ "reloaded_shot_dart", -1 ], + [ "reloaded_shot_foster", -1 ], + [ "reloaded_shot_junk", -1 ], + [ "bp_shot_buck", -1 ], + [ "bp_shot_fowl", -1 ], + [ "bp_shot_pyro", -1 ], + [ "bp_shot_dart", -1 ], + [ "bp_shot_foster", -1 ], + [ "bp_shot_junk", -1 ], + [ "shot_hull", -1 ] + ] + ], + "components": [ [ [ "pipe", 4 ] ], [ [ "nail", 2 ] ], [ [ "pipe_fittings", 2 ] ], [ [ "scrap", 2 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "welded_together", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "difficulty": 1, + "time": "2 h", + "autolearn": true, + "qualities": [ { "id": "WELD", "level": 1 } ], + "components": [ [ [ "slamfire_shotgun", 2 ] ], [ [ "scrap", 2 ] ] ] + }, + { + "type": "recipe", + "result": "slamfire_shotgun_d", + "id_suffix": "taped_together", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "mechanics", + "skills_required": [ [ "gun", 1 ] ], + "time": "1 h", + "autolearn": true, + "components": [ [ [ "slamfire_shotgun", 2 ] ], [ [ "duct_tape", 100 ] ] ] } ] diff --git a/data/mods/Graphical_Overmap/go_overmap_terrain_residential.json b/data/mods/Graphical_Overmap/go_overmap_terrain_residential.json index 647c86343033e..6216b3a5d7279 100644 --- a/data/mods/Graphical_Overmap/go_overmap_terrain_residential.json +++ b/data/mods/Graphical_Overmap/go_overmap_terrain_residential.json @@ -988,6 +988,244 @@ "sym": "\u00E0", "color": "light_gray" }, + { + "type": "overmap_terrain", + "id": "house_26", + "copy-from": "house_26", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_26_roof", + "copy-from": "house_26_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_27", + "copy-from": "house_27", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_27_roof", + "copy-from": "house_27_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_28", + "copy-from": "house_28", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_28_roof", + "copy-from": "house_28_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_29", + "copy-from": "house_29", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_29_roof", + "copy-from": "house_29_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_30", + "copy-from": "house_30", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_30_roof", + "copy-from": "house_30_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_31", + "copy-from": "house_31", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_31_roof", + "copy-from": "house_31_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_32", + "copy-from": "house_32", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_32_roof", + "copy-from": "house_32_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_33", + "copy-from": "house_33", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_33_roof", + "copy-from": "house_33_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_34", + "copy-from": "house_34", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_34_roof", + "copy-from": "house_34_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_35", + "copy-from": "house_35", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_35_roof", + "copy-from": "house_35_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_36", + "copy-from": "house_36", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_36_roof", + "copy-from": "house_36_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_37", + "copy-from": "house_37", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_37_roof", + "copy-from": "house_37_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_38", + "copy-from": "house_38", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_38_roof", + "copy-from": "house_38_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_39", + "copy-from": "house_39", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_39_roof", + "copy-from": "house_39_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_40", + "copy-from": "house_40", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_40_roof", + "copy-from": "house_40_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_41", + "copy-from": "house_41", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_41_roof", + "copy-from": "house_41_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_42", + "copy-from": "house_42", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "house_42_roof", + "copy-from": "house_42_roof", + "sym": "\u00E0", + "color": "light_gray" + }, { "type": "overmap_terrain", "id": "house_vacant", @@ -1452,5 +1690,362 @@ "copy-from": "house_crack3_roof", "sym": "\u00E0", "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "2storyModern01_basement", + "copy-from": "2storyModern01_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "2storyModern01_first", + "copy-from": "2storyModern01_first", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "2storyModern01_second", + "copy-from": "2storyModern01_second", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "2storyModern01_roof", + "copy-from": "2storyModern01_roof", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_1", + "copy-from": "urban_1_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_2", + "copy-from": "urban_1_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_3", + "copy-from": "urban_1_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_4", + "copy-from": "urban_1_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_1_basement", + "copy-from": "urban_1_1_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_2_basement", + "copy-from": "urban_1_2_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_1_6", + "copy-from": "urban_1_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_1", + "copy-from": "urban_4_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_2", + "copy-from": "urban_4_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_3", + "copy-from": "urban_4_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_4", + "copy-from": "urban_4_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_5", + "copy-from": "urban_4_5", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_6", + "copy-from": "urban_4_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_7", + "copy-from": "urban_4_7", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_4_8", + "copy-from": "urban_4_8", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_1", + "copy-from": "urban_5_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_2", + "copy-from": "urban_5_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_3", + "copy-from": "urban_5_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_4", + "copy-from": "urban_5_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_5", + "copy-from": "urban_5_5", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_6", + "copy-from": "urban_5_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_1_basement", + "copy-from": "urban_5_1_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_5_2_basement", + "copy-from": "urban_5_2_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_1", + "copy-from": "urban_6_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_2", + "copy-from": "urban_6_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_3", + "copy-from": "urban_6_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_4", + "copy-from": "urban_6_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_5", + "copy-from": "urban_6_5", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_6", + "copy-from": "urban_6_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_1_basement", + "copy-from": "urban_6_1_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_6_2_basement", + "copy-from": "urban_6_2_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_1", + "copy-from": "urban_2_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_2", + "copy-from": "urban_2_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_3", + "copy-from": "urban_2_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_4", + "copy-from": "urban_2_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_5", + "copy-from": "urban_2_5", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_6", + "copy-from": "urban_2_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_1_basement", + "copy-from": "urban_2_1_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_2_2_basement", + "copy-from": "urban_2_2_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_1", + "copy-from": "urban_3_1", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_2", + "copy-from": "urban_3_2", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_3", + "copy-from": "urban_3_3", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_4", + "copy-from": "urban_3_4", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_5", + "copy-from": "urban_3_5", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_6", + "copy-from": "urban_3_6", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_1_basement", + "copy-from": "urban_3_1_basement", + "sym": "\u00E0", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "urban_3_2_basement", + "copy-from": "urban_3_2_basement", + "sym": "\u00E0", + "color": "light_gray" } ] diff --git a/data/mods/MMA/martialarts.json b/data/mods/MMA/martialarts.json index b311eabf46790..be0c25296e697 100644 --- a/data/mods/MMA/martialarts.json +++ b/data/mods/MMA/martialarts.json @@ -400,7 +400,20 @@ "mma_tec_setting_sun_throw", "mma_tec_setting_sun_throw_crit" ], - "weapons": [ "i_staff", "shock_staff", "sword_crude", "sword_nail", "sword_wood", "q_staff" ] + "weapons": [ + "i_staff", + "kris", + "kris_fake", + "shock_staff", + "sword_crude", + "sword_nail", + "sword_wood", + "sword_xiphos", + "q_staff", + "wakizashi", + "wakizashi_inferior", + "wakizashi_fake" + ] }, { "type": "martial_art", diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index d437e715b6483..2433112624798 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -187,6 +187,30 @@ "energy_source": "MANA", "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] }, + { + "id": "soulrend", + "type": "SPELL", + "name": "Soulrend", + "description": "Violently tears the spirit from the body, and bounds the resulting shade to your will.", + "valid_targets": [ "hostile", "ally" ], + "flags": [ "NO_LEGS", "LOUD", "SOMATIC", "POLYMORPH_GROUP", "FRIENDLY_POLY" ], + "effect": "targeted_polymorph", + "effect_str": "GROUP_POLYMORPH_SHADOW", + "spell_class": "ANIMIST", + "energy_source": "MANA", + "difficulty": 15, + "min_damage": 40, + "max_damage": 140, + "damage_increment": 2.5, + "max_level": 40, + "base_casting_time": 200, + "casting_time_increment": -2.0, + "final_casting_time": 120, + "base_energy_cost": 200, + "min_range": 5, + "max_range": 30, + "range_increment": 1.0 + }, { "id": "summon_wisps", "type": "SPELL", diff --git a/data/mods/Magiclysm/Spells/debug.json b/data/mods/Magiclysm/Spells/debug.json index 00ae21011c60e..f8bb3733743a9 100644 --- a/data/mods/Magiclysm/Spells/debug.json +++ b/data/mods/Magiclysm/Spells/debug.json @@ -89,6 +89,25 @@ "base_energy_cost": 100, "energy_source": "FATIGUE" }, + { + "id": "debug_polymorph", + "type": "SPELL", + "name": "Debug polymorph", + "description": "Well you wanted to lose weight, right?", + "valid_targets": [ "hostile", "ally" ], + "flags": [ "NO_LEGS", "LOUD", "SOMATIC" ], + "effect": "targeted_polymorph", + "energy_source": "MANA", + "difficulty": 1, + "min_damage": 9999, + "max_damage": 9999, + "max_level": 1, + "base_casting_time": 10, + "base_energy_cost": 1, + "final_energy_cost": 1, + "min_range": 30, + "max_range": 30 + }, { "id": "debug_hp", "type": "SPELL", diff --git a/data/mods/Magiclysm/Spells/kelvinist.json b/data/mods/Magiclysm/Spells/kelvinist.json index 9d6accf1b4be4..db7d093729da0 100644 --- a/data/mods/Magiclysm/Spells/kelvinist.json +++ b/data/mods/Magiclysm/Spells/kelvinist.json @@ -73,7 +73,7 @@ "description": "You hurl a pea-sized glowing orb that when reaches its target or an obstacle produces a pressure-less blast of searing heat.", "effect": "projectile_attack", "valid_targets": [ "self", "ally", "hostile", "ground" ], - "flags": [ "SOMATIC", "VERBAL", "NO_LEGS" ], + "flags": [ "SOMATIC", "VERBAL", "NO_LEGS", "IGNITE_FLAMMABLE" ], "max_level": 20, "min_damage": 24, "max_damage": 68, @@ -127,7 +127,7 @@ "description": "You're pretty sure you saw this in a game somewhere. You fire a short-range cone of fire.", "effect": "cone_attack", "valid_targets": [ "ally", "hostile", "ground" ], - "flags": [ "SOMATIC", "VERBAL" ], + "flags": [ "SOMATIC", "VERBAL", "IGNITE_FLAMMABLE" ], "max_level": 20, "min_damage": 8, "max_damage": 65, diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index f6d54d304ffb7..70d3f2d7e95a3 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -133,6 +133,29 @@ "max_duration": 12000, "duration_increment": 600 }, + { + "id": "magus_baleful_polymorph", + "type": "SPELL", + "name": "Baleful Polymorph", + "description": "Transform your enemies into frogs.", + "valid_targets": [ "hostile" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS" ], + "effect": "targeted_polymorph", + "effect_str": "mon_baleful_polymorph_frog", + "spell_class": "MAGUS", + "energy_source": "MANA", + "base_casting_time": 150, + "base_energy_cost": 150, + "difficulty": 8, + "max_level": 20, + "min_damage": 20, + "max_damage": 40, + "damage_increment": 2, + "damage_type": "none", + "min_range": 5, + "max_range": 30, + "range_increment": 1.5 + }, { "id": "magus_mana_beam", "type": "SPELL", diff --git a/data/mods/Magiclysm/Spells/monsterspells.json b/data/mods/Magiclysm/Spells/monsterspells.json index f9e5eab85b216..f38aef607981e 100644 --- a/data/mods/Magiclysm/Spells/monsterspells.json +++ b/data/mods/Magiclysm/Spells/monsterspells.json @@ -83,6 +83,7 @@ "id": "mon_demon_fireball", "name": "Demon Fireball", "description": "This is a monster only spell.", + "flags": [ "IGNITE_FLAMMABLE" ], "valid_targets": [ "hostile", "ground", "ally", "self" ], "min_damage": 15, "max_damage": 15, diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json index d4bc49915a91d..3806b2c6bef61 100644 --- a/data/mods/Magiclysm/itemgroups/spellbooks.json +++ b/data/mods/Magiclysm/itemgroups/spellbooks.json @@ -87,6 +87,7 @@ [ "spell_scroll_vicious_tentacle", 40 ], [ "spell_scroll_bio_bonespear", 20 ], [ "spell_scroll_megablast", 10 ], + [ "spell_scroll_baleful_polymorph", 20 ], [ "spell_scroll_eshaper_shardstorm", 50 ], [ "spell_scroll_fireball", 50 ], [ "spell_scroll_cone_cold", 50 ], @@ -153,6 +154,7 @@ "id": "spellbook_tier_3", "type": "item_group", "items": [ + [ "animist_shadows", 5 ], [ "magus_spellbook", 15 ], [ "magus_spellbook_move", 30 ], [ "translocate_spellbook", 20 ], diff --git a/data/mods/Magiclysm/items/alchemy_items.json b/data/mods/Magiclysm/items/alchemy_items.json index 1ea8c222106b0..9345100f06711 100644 --- a/data/mods/Magiclysm/items/alchemy_items.json +++ b/data/mods/Magiclysm/items/alchemy_items.json @@ -119,7 +119,7 @@ "description": "The powdered remains of a will-o-wisps's physical form. It seems to still possess an otherworldly glow.", "material": [ "powder" ], "weight": "5 g", - "volume": 1 + "volume": "250 ml" }, { "id": "glow_light", @@ -165,7 +165,7 @@ "description": "The great plates from behind a bulette's head have always been prized for use in shield and armor making.", "material": [ "arcane_skin" ], "weight": "30 kg", - "volume": 12 + "volume": "3 L" }, { "id": "bulette_pearl", @@ -176,7 +176,7 @@ "description": "As a bulette burrows through the earth its gills collect minute amounts of precious metals and gems which slowly aggregate into lustrous gemstones prized for their beauty and power.", "material": [ "stone" ], "weight": "120 g", - "volume": 1 + "volume": "250 ml" }, { "id": "dragon_essence", diff --git a/data/mods/Magiclysm/items/books_lore.json b/data/mods/Magiclysm/items/books_lore.json index d7920c471160f..33b24e508593e 100644 --- a/data/mods/Magiclysm/items/books_lore.json +++ b/data/mods/Magiclysm/items/books_lore.json @@ -43,7 +43,7 @@ "name": "old photo", "description": "A photo of a jovial, old wizard, he seems to be dancing with a coat rack in this basement. There is a stack of suitcases in the background.", "weight": "1 g", - "volume": 0, + "volume": "0 L", "price": 800, "material": [ "paper" ], "symbol": "*", diff --git a/data/mods/Magiclysm/items/enchanted_belts.json b/data/mods/Magiclysm/items/enchanted_belts.json index 376bd9a23aaf3..a44fbf944485a 100644 --- a/data/mods/Magiclysm/items/enchanted_belts.json +++ b/data/mods/Magiclysm/items/enchanted_belts.json @@ -47,32 +47,88 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_pockets_lesser", - "name": { "str": "Lesser Girdle of Pockets", "str_pl": "Lesser Girdles of Pockets" }, - "description": "A wide girdle that fits around your waist, coverd in numerous small pouches that hold a lot more than they should, and the weight of their contents is greatly reduced.", + "name": { "str": "lesser dimensional toolbelt" }, + "description": "A sturdy workman's belt that fits around your waist, covered in easy to access pouches. Like all dimensional spaces, they hold more than they should with a fair weight reduction.", "coverage": 10, "encumbrance": 4, - "weight_capacity_bonus": "5 kg", + "max_encumbrance": 10, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "9 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "9 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "9 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "3 L", "max_contains_weight": "9 kg", "moves": 80 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "9 kg", + "moves": 90, + "weight_multiplier": 0.5, + "volume_multiplier": 0.35 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "9 kg", + "moves": 90, + "weight_multiplier": 0.5, + "volume_multiplier": 0.35 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "9 kg", + "moves": 90, + "weight_multiplier": 0.5, + "volume_multiplier": 0.35 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "3 L", + "max_contains_weight": "9 kg", + "moves": 90, + "weight_multiplier": 0.5, + "volume_multiplier": 0.35 + } ] }, { "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_pockets_greater", - "name": { "str": "Greater Girdle of Pockets", "str_pl": "Greater Girdles of Pockets" }, - "description": "A wide girdle that fits around your waist, coverd in numerous small pouches that hold a lot more than they should, and the weight of their contents is greatly reduced.", + "name": { "str": "greater dimensional toolbelt" }, + "description": "A heavy duty workman's belt that fits around your waist, covered in easy to access pouches. Like all dimensional spaces, they hold far more than they should with a substantial weight reduction.", "coverage": 10, "encumbrance": 6, - "weight_capacity_bonus": "10 kg", + "max_encumbrance": 8, "pocket_data": [ - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "12 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "12 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "12 kg", "moves": 80 }, - { "pocket_type": "CONTAINER", "max_contains_volume": "5 L", "max_contains_weight": "12 kg", "moves": 80 } + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "12 kg", + "moves": 80, + "weight_multiplier": 0.3, + "volume_multiplier": 0.2 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "12 kg", + "moves": 80, + "weight_multiplier": 0.3, + "volume_multiplier": 0.2 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "12 kg", + "moves": 80, + "weight_multiplier": 0.3, + "volume_multiplier": 0.2 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "5 L", + "max_contains_weight": "12 kg", + "moves": 80, + "weight_multiplier": 0.3, + "volume_multiplier": 0.2 + } ] }, { diff --git a/data/mods/Magiclysm/items/enchanted_gunmods.json b/data/mods/Magiclysm/items/enchanted_gunmods.json index 3ac8615b79ec5..073a736aab194 100644 --- a/data/mods/Magiclysm/items/enchanted_gunmods.json +++ b/data/mods/Magiclysm/items/enchanted_gunmods.json @@ -29,7 +29,7 @@ "description": "A small visible-light laser using light shown through a mana crystal that mounts on a firearm's accessory rail to enhance ease and speed of target acquisition. Aside from increased weight, there are no drawbacks. You can rotate the attachment rail to fit under the barrel.", "weight": "108 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 36000, "material": [ "plastic", "steel" ], "symbol": ":", @@ -48,7 +48,7 @@ "description": "A small visible-light laser using light shown through a mana crystal that mounts on a firearm's accessory rail to enhance ease and speed of target acquisition. Aside from increased weight, there are no drawbacks. You can rotate the attachment rail to fit on the rail.", "weight": "108 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 36000, "material": [ "plastic", "steel" ], "symbol": ":", @@ -68,7 +68,7 @@ "description": "Adds a blue dot optic made from crystallized mana to the top of your gun, replacing the iron sights. Increases accuracy and weight.", "weight": "270 g", "volume": "250 ml", - "integral_volume": 0, + "integral_volume": "0 L", "price": 68000, "material": [ "plastic", "steel" ], "symbol": ":", diff --git a/data/mods/Magiclysm/items/enchanted_misc.json b/data/mods/Magiclysm/items/enchanted_misc.json index a31fd6860ca07..39b097220230a 100644 --- a/data/mods/Magiclysm/items/enchanted_misc.json +++ b/data/mods/Magiclysm/items/enchanted_misc.json @@ -53,7 +53,7 @@ "name": { "str": "skeleton key of opening", "str_pl": "skeleton keys of opening" }, "description": "A small gold skeleton key. You can activate it to unlock locked things.", "weight": "20 g", - "volume": 0, + "volume": "0 L", "price": 500000, "material": [ "gold" ], "symbol": "[", diff --git a/data/mods/Magiclysm/items/enchanted_ranged.json b/data/mods/Magiclysm/items/enchanted_ranged.json index 9669ff05c6055..31119a80b097f 100644 --- a/data/mods/Magiclysm/items/enchanted_ranged.json +++ b/data/mods/Magiclysm/items/enchanted_ranged.json @@ -85,7 +85,7 @@ "modes": [ [ "DEFAULT", "single", 1 ] ], "ammo": [ "shot" ], "reload": 200, - "barrel_length": 2, + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "mechanism", 1 ] ], "reload_noise": "chuk chuk.", "flags": [ "RELOAD_ONE", "PUMP_ACTION", "DURABLE_MELEE", "SHEATH_SWORD" ], diff --git a/data/mods/Magiclysm/items/enchanted_rings.json b/data/mods/Magiclysm/items/enchanted_rings.json index 09ec19b12640e..0cdac26a70129 100644 --- a/data/mods/Magiclysm/items/enchanted_rings.json +++ b/data/mods/Magiclysm/items/enchanted_rings.json @@ -5,7 +5,7 @@ "name": "copper magic ring", "description": "A generic copper magic ring.", "weight": "4 g", - "volume": 0, + "volume": "0 L", "price": 5000, "material": [ "copper" ], "symbol": "[", @@ -21,7 +21,7 @@ "name": "magic ring", "description": "A generic silver magic ring.", "weight": "5 g", - "volume": 0, + "volume": "0 L", "price": 5000, "material": [ "silver" ], "symbol": "[", @@ -37,7 +37,7 @@ "name": "magic ring", "description": "A generic gold magic ring.", "weight": "9 g", - "volume": 0, + "volume": "0 L", "price": 5000, "material": [ "gold" ], "symbol": "[", @@ -53,7 +53,7 @@ "name": "magic ring", "description": "A generic platinum magic ring.", "weight": "11 g", - "volume": 0, + "volume": "0 L", "price": 5000, "material": [ "platinum" ], "symbol": "[", diff --git a/data/mods/Magiclysm/items/enchanted_unarmed.json b/data/mods/Magiclysm/items/enchanted_unarmed.json index 6daa637744fae..6434e14d8b5cf 100644 --- a/data/mods/Magiclysm/items/enchanted_unarmed.json +++ b/data/mods/Magiclysm/items/enchanted_unarmed.json @@ -88,7 +88,7 @@ "range": -8, "modes": [ [ "DEFAULT", "single", 1 ], [ "DOUBLE", "double", 2 ] ], "reload": 200, - "barrel_length": 2, + "barrel_volume": "500 ml", "valid_mod_locations": [ [ "mechanism", 1 ] ], "flags": [ "UNARMED_WEAPON", "DURABLE_MELEE", "NEVER_JAMS", "RELOAD_EJECT", "RELOAD_ONE" ], "faults": [ "fault_gun_blackpowder", "fault_gun_dirt" ], diff --git a/data/mods/Magiclysm/items/enchanted_wands.json b/data/mods/Magiclysm/items/enchanted_wands.json index 95deaa50f545f..1288ad08863eb 100644 --- a/data/mods/Magiclysm/items/enchanted_wands.json +++ b/data/mods/Magiclysm/items/enchanted_wands.json @@ -36,9 +36,8 @@ "material": [ "wood" ], "symbol": "|", "color": "brown", - "flags": [ "BELT_CLIP", "NONCONDUCTIVE" ], - "initial_charges": 20, - "max_charges": 20, + "flags": [ "BELT_CLIP", "NONCONDUCTIVE", "NO_UNLOAD", "NO_RELOAD" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "holster": true, "ammo_restriction": { "crystallized_mana": 20 } } ], "charges_per_use": 1 }, { diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json index 7c6fc71d1432d..2cc6e97e9f495 100644 --- a/data/mods/Magiclysm/items/ethereal_items.json +++ b/data/mods/Magiclysm/items/ethereal_items.json @@ -83,8 +83,8 @@ "category": "tools", "name": "magic light", "description": "A small magical light that you can read by.", - "weight": 0, - "volume": 0, + "weight": "0 kg", + "volume": "0 L", "price": 0, "symbol": ",", "color": "light_green", @@ -234,8 +234,8 @@ "type": "ARMOR", "name": { "str": "flesh pouch", "str_pl": "flesh pouches" }, "description": "A large pouch of tough flesh on your back, filled with tiny tentacles that grasp and hold anything you place inside. It shifts and adjusts itself to minimize encumbrance.", - "weight": 0, - "volume": 0, + "weight": "0 kg", + "volume": "0 L", "price": 0, "material": [ "flesh" ], "symbol": "[", @@ -260,7 +260,6 @@ "UNBREAKABLE_MELEE", "REACH_ATTACK", "SPEAR", - "REACH2", "NONCONDUCTIVE", "SHEATH_SPEAR", "ONLY_ONE", diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index b929312195135..a688d765d5743 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -82,6 +82,15 @@ "description": "With an intense ritual that resembles crossfit, you manage to put some of your pain at bay.", "use_action": { "type": "learn_spell", "spells": [ "recover_pain" ] } }, + { + "type": "BOOK", + "copy-from": "spell_scroll", + "id": "spell_scroll_baleful_polymorph", + "//": "Technomancer spell", + "name": { "str": "Scroll of Baleful Polymorph", "str_pl": "Scrolls of Baleful Polymorph" }, + "description": "Transform your enemies into frogs.", + "use_action": { "type": "learn_spell", "spells": [ "magus_baleful_polymorph" ] } + }, { "type": "BOOK", "copy-from": "spell_scroll", diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 248c3de9a628b..121c4a3fa3cbd 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -338,6 +338,19 @@ "color": "light_gray", "use_action": { "type": "learn_spell", "spells": [ "taze", "laze" ] } }, + { + "id": "animist_shadows", + "type": "BOOK", + "name": { "str": "Runic Tablet shard" }, + "//": "1 classless spell", + "description": "A small tablet of blackened stone, apparently cut from a much larger slab. Golden runes glow over its surface, and slowly shift into intelligible sentences when you stare at them.", + "weight": "4000 g", + "volume": "2500 ml", + "material": [ "stone" ], + "symbol": "?", + "color": "light_gray", + "use_action": { "type": "learn_spell", "spells": [ "soulrend" ] } + }, { "id": "translocate_spellbook", "type": "BOOK", diff --git a/data/mods/Magiclysm/items/tools.json b/data/mods/Magiclysm/items/tools.json index 37b941a5355c2..d70976c0e1a84 100644 --- a/data/mods/Magiclysm/items/tools.json +++ b/data/mods/Magiclysm/items/tools.json @@ -52,6 +52,7 @@ "color": "red", "ammo": [ "alumentum" ], "sub": "forge", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 500 } } ], "max_charges": 500, "flags": [ "ALLOWS_REMOTE_USE" ] }, diff --git a/data/mods/Magiclysm/items/weapons.json b/data/mods/Magiclysm/items/weapons.json index c8f7f6817b412..4fc8c67375c52 100644 --- a/data/mods/Magiclysm/items/weapons.json +++ b/data/mods/Magiclysm/items/weapons.json @@ -38,7 +38,7 @@ "description": "This weapon measures about 3 feet in length and is fletched like an arrow for better accuracy. The business end of the javelin has wicked-looking barbs which could cause significant bleeding.", "weight": "2500 g", "volume": "2830 ml", - "flags": [ "SPEAR", "SHEATH_SPEAR", "JAVELIN", "TRADER_AVOID", "BLEED", "NO_REPAIR" ] + "flags": [ "SPEAR", "SHEATH_SPEAR", "JAVELIN", "TRADER_AVOID", "NO_REPAIR" ] }, { "id": "lizardfolk_javelin_gun", diff --git a/data/mods/Magiclysm/martialarts.json b/data/mods/Magiclysm/martialarts.json index f62196d17e1a4..d404b96f8de55 100644 --- a/data/mods/Magiclysm/martialarts.json +++ b/data/mods/Magiclysm/martialarts.json @@ -58,6 +58,8 @@ "cudgel_plus_two", "rapier_plus_one", "rapier_plus_two", + "estoc_plus_one", + "estoc_plus_two", "cavalry_sabre_plus_one", "cavalry_sabre_plus_two", "broadsword_plus_one", diff --git a/data/mods/Magiclysm/monstergroups.json b/data/mods/Magiclysm/monstergroups.json index c9636e361e5af..9fcfdc9297c13 100644 --- a/data/mods/Magiclysm/monstergroups.json +++ b/data/mods/Magiclysm/monstergroups.json @@ -45,6 +45,16 @@ { "monster": "mon_lemure", "freq": 5, "cost_multiplier": 2, "pack_size": [ 1, 4 ] } ] }, + { + "type": "monstergroup", + "name": "GROUP_POLYMORPH_SHADOW", + "default": "mon_shadow", + "is_animal": true, + "monsters": [ + { "monster": "mon_shadow", "freq": 100, "cost_multiplier": 1 }, + { "monster": "mon_shadow_snake", "freq": 10, "cost_multiplier": 1 } + ] + }, { "type": "monstergroup", "name": "GROUP_WORM", diff --git a/data/mods/Magiclysm/monsters/goblin.json b/data/mods/Magiclysm/monsters/goblin.json index 0a0798d1653b1..8d4c275c9ba4a 100644 --- a/data/mods/Magiclysm/monsters/goblin.json +++ b/data/mods/Magiclysm/monsters/goblin.json @@ -35,7 +35,7 @@ ] }, "death_function": [ "NORMAL" ], - "flags": [ "SEES", "HEARS", "WARM", "BASHES", "BLEED", "FILTHY", "PATH_AVOID_DANGER_2" ] + "flags": [ "SEES", "HEARS", "WARM", "BASHES", "FILTHY", "PATH_AVOID_DANGER_2" ] }, { "type": "MONSTER", diff --git a/data/mods/Magiclysm/monsters/monsters.json b/data/mods/Magiclysm/monsters/monsters.json index de043cea2e404..2a15957aab636 100644 --- a/data/mods/Magiclysm/monsters/monsters.json +++ b/data/mods/Magiclysm/monsters/monsters.json @@ -248,7 +248,7 @@ "death_function": [ "NORMAL" ], "special_attacks": [ { "type": "bite", "cooldown": 30 }, [ "GRAB", 15 ], [ "scratch", 15 ], [ "slam", 10 ], [ "SMASH", 30 ] ], "regenerates": 1, - "flags": [ "SEES", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "WARM", "GRABS", "BLEED", "FLAMMABLE" ] + "flags": [ "SEES", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "WARM", "GRABS", "FLAMMABLE" ] }, { "id": "mon_stirge", @@ -307,6 +307,28 @@ "death_function": [ "NORMAL" ], "flags": [ "SEES", "NOHEAD", "POISON", "IMMOBILE", "NO_BREATHE", "PACIFIST" ] }, + { + "id": "mon_baleful_polymorph_frog", + "type": "MONSTER", + "name": { "str": "frog" }, + "description": "A conspicuously average american bullfrog. You better keep prince charming away from it.", + "default_faction": "magical_beast", + "species": [ "AMPHIBIAN" ], + "volume": "750 ml", + "weight": "1 kg", + "hp": 3, + "speed": 80, + "material": [ "flesh" ], + "symbol": "b", + "color": "green", + "melee_cut": 0, + "dodge": 6, + "harvest": "mammal_tiny", + "special_attacks": [ { "type": "leap", "cooldown": 10, "max_range": 5 } ], + "fear_triggers": [ "PLAYER_CLOSE" ], + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "SMELLS", "HEARS", "SWIMS" ] + }, { "id": "mon_lemure", "type": "MONSTER", diff --git a/data/mods/Magiclysm/npc/TALK_OLD_MAGUS.json b/data/mods/Magiclysm/npc/TALK_OLD_MAGUS.json index 4c4066e4b998a..5ee961b6072d0 100644 --- a/data/mods/Magiclysm/npc/TALK_OLD_MAGUS.json +++ b/data/mods/Magiclysm/npc/TALK_OLD_MAGUS.json @@ -7,7 +7,7 @@ "type": "dialogue", "context": "old_magus", "value": "yes", - "no": "Huh? *mumble mumble* … Who are you?", + "no": "Huh? *mumble mumble* … Who are you?", "yes": "Oh, you again." }, "responses": [ @@ -52,7 +52,7 @@ { "type": "talk_topic", "id": "TALK_OLD_MAGUS_LEAVE", - "dynamic_line": "And leave my tower and all my research? I think not.", + "dynamic_line": "And leave my tower and all my research? I think not.", "responses": [ { "text": "Wanna get outta here?", "topic": "TALK_SUGGEST_FOLLOW" }, { "text": "What can you sell me?", "topic": "TALK_OLD_MAGUS", "effect": "start_trade" }, diff --git a/data/mods/Magiclysm/professions.json b/data/mods/Magiclysm/professions.json index 8bf2697ec6c34..cd898e0b6809a 100644 --- a/data/mods/Magiclysm/professions.json +++ b/data/mods/Magiclysm/professions.json @@ -45,7 +45,7 @@ "skills": [ { "level": 3, "name": "speech" } ], "items": { "both": { - "items": [ "pants", "longshirt", "socks", "cassock", "dress_shoes", "holy_symbol", "holybook_bible1", "priest_beginner" ], + "items": [ "pants", "longshirt", "socks", "cassock", "dress_shoes", "holy_symbol", "holybook_bible1", "priest_beginner", "mbag" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], @@ -62,7 +62,7 @@ "skills": [ { "level": 1, "name": "fabrication" }, { "level": 1, "name": "tailor" } ], "items": { "both": { - "items": [ "kariginu", "eboshi", "pants", "tabi_dress", "geta", "holy_symbol", "holybook_kojiki", "priest_beginner" ], + "items": [ "kariginu", "eboshi", "pants", "tabi_dress", "geta", "holy_symbol", "holybook_kojiki", "priest_beginner", "mbag" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], @@ -80,7 +80,7 @@ "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "barter" } ], "items": { "both": { - "items": [ "pants", "tshirt", "socks", "kufi", "thawb", "lowtops", "holybook_quran", "priest_beginner" ], + "items": [ "pants", "tshirt", "socks", "kufi", "thawb", "lowtops", "holybook_quran", "priest_beginner", "mbag" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], @@ -108,7 +108,8 @@ "holy_symbol", "holybook_talmud", "holybook_tanakh", - "priest_beginner" + "priest_beginner", + "mbag" ], "entries": [ { "group": "charged_cell_phone" } ] }, @@ -270,6 +271,7 @@ "boots", "wristwatch", "holy_symbol", + "mbag", "priest_beginner", "whiskey", "whiskey", diff --git a/data/mods/Magiclysm/traits/manatouched.json b/data/mods/Magiclysm/traits/manatouched.json index 6941c40c94613..138cb2e0af7e4 100644 --- a/data/mods/Magiclysm/traits/manatouched.json +++ b/data/mods/Magiclysm/traits/manatouched.json @@ -78,7 +78,7 @@ "passive_mods": { "str_mod": -2 }, "points": -1, "description": "Your body is unnaturally weak. -2 Strength.", - "category": [ "MANATOUCHED" ], + "category": [ "MANATOUCHED", "MOUSE", "RAT", "BIRD", "SLIME" ], "cancels": [ "STR_UP_2", "STR_UP_3", "STR_UP_4", "STR_ALPHA" ] }, { @@ -121,6 +121,12 @@ "copy-from": "ALBINO", "extend": { "category": [ "MANATOUCHED" ] } }, + { + "type": "mutation", + "id": "BIOLUM0", + "copy-from": "BIOLUM0", + "extend": { "category": [ "MANATOUCHED" ] } + }, { "type": "mutation", "id": "ROT2", diff --git a/data/mods/Magiclysm/worldgen/magic_academy.json b/data/mods/Magiclysm/worldgen/magic_academy.json index 5fe37bae294f2..124cc479cd113 100644 --- a/data/mods/Magiclysm/worldgen/magic_academy.json +++ b/data/mods/Magiclysm/worldgen/magic_academy.json @@ -115,7 +115,13 @@ "palettes": [ "standard_domestic_palette" ], "traps": { "=": "tr_rollmat" }, "terrain": { " ": "t_thconc_floor", "`": "t_rock", "]": "t_door_glass_green_c", "#": "t_rock_blue", "~": "t_water_pool" }, - "furniture": { ")": "f_beaded_door", "}": "f_huge_mana_crystal", "!": "f_ergometer", "$": "f_treadmill", "%": "f_exercise" }, + "furniture": { + ")": "f_beaded_door", + "}": "f_huge_mana_crystal", + "!": [ "f_ergometer", "f_ergometer_mechanical" ], + "$": [ "f_treadmill", "f_treadmill_mechanical" ], + "%": "f_exercise" + }, "place_loot": [ { "item": "television", "x": 8, "y": 1, "chance": 100 }, { "item": "stereo", "x": 7, "y": 1, "chance": 100 } ], "items": { "q": [ diff --git a/data/mods/More_Locations/bandit_tower/bandit_tower_2trc_04.json b/data/mods/More_Locations/bandit_tower/bandit_tower_2trc_04.json index e3b27dfb5eadd..4dcb0b10af242 100644 --- a/data/mods/More_Locations/bandit_tower/bandit_tower_2trc_04.json +++ b/data/mods/More_Locations/bandit_tower/bandit_tower_2trc_04.json @@ -36,7 +36,7 @@ "rotation": 1, "palettes": [ "tri_tower", "upper_level", "bandit_tower_stuff" ], "terrain": { "5": "t_pavement", "8": "t_bridge", "y": "t_wall_wood" }, - "furniture": { "Y": "f_exercise", "J": "f_treadmill" }, + "furniture": { "Y": "f_exercise", "J": [ "f_treadmill", "f_treadmill_mechanical" ] }, "items": { "l": { "item": "sports", "chance": 20 }, "x": { "item": "allsporting", "chance": 20 } }, "npcs": { "@": { "class": "thug" } } } diff --git a/data/mods/More_Locations/tpalettes.json b/data/mods/More_Locations/tpalettes.json index 064bb40945c8f..d1257d5566d95 100644 --- a/data/mods/More_Locations/tpalettes.json +++ b/data/mods/More_Locations/tpalettes.json @@ -120,7 +120,7 @@ "P": "f_piano", "W": "f_wardrobe", "Y": "f_statue", - "Z": [ "f_treadmill", "f_exercise" ] + "Z": [ "f_treadmill", "f_treadmill_mechanical", "f_exercise" ] }, "items": { "$": { "item": "art", "chance": 75 }, @@ -642,7 +642,7 @@ "3": "f_dryer", "5": "f_pool_table", "7": "f_exercise", - "8": "f_treadmill", + "8": [ "f_treadmill", "f_treadmill_mechanical" ], "9": "f_pinball_machine", "0": "f_arcade_machine" } diff --git a/data/mods/My_Sweet_Cataclysm/sweet_effect.json b/data/mods/My_Sweet_Cataclysm/sweet_effect.json index 416caf3b97bf7..310b98db195a9 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_effect.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_effect.json @@ -7,10 +7,11 @@ "apply_message": "You're covered in gum!", "rating": "bad", "miss_messages": [ [ "The gum webs constrict your movement.", 4 ] ], - "max_intensity": 3, + "max_intensity": 6, "max_duration": "30 s", "base_mods": { "speed_mod": [ -20 ] }, "scaling_mods": { "speed_mod": [ -20 ] }, + "flags": [ "EFFECT_IMPEDING" ], "show_in_info": true } ] diff --git a/data/mods/My_Sweet_Cataclysm/sweet_field_type.json b/data/mods/My_Sweet_Cataclysm/sweet_field_type.json index 77c43ffcd5850..73df21fc1a46c 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_field_type.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_field_type.json @@ -4,6 +4,7 @@ "type": "field_type", "legacy_enum_id": 5, "immune_mtypes": [ "mon_spider_gum" ], + "decrease_intensity_on_contact": true, "intensity_levels": [ { "name": "flimsy gum webs", @@ -12,7 +13,7 @@ "effects": [ { "effect_id": "gummed", - "intensity": 1, + "intensity": 2, "min_duration": "2 seconds", "immune_in_vehicle": true, "is_environmental": false, @@ -27,7 +28,7 @@ "effects": [ { "effect_id": "gummed", - "intensity": 2, + "intensity": 4, "min_duration": "20 seconds", "immune_in_vehicle": true, "is_environmental": false, @@ -43,7 +44,7 @@ "effects": [ { "effect_id": "gummed", - "intensity": 3, + "intensity": 6, "min_duration": "40 seconds", "immune_in_vehicle": true, "is_environmental": false, @@ -57,7 +58,6 @@ "description_affix": "covered_in", "priority": 2, "phase": "solid", - "half_life": "2 h", "bash": { "str_min": 1, "str_max": 3, diff --git a/data/mods/My_Sweet_Cataclysm/sweet_med.json b/data/mods/My_Sweet_Cataclysm/sweet_med.json index 8880438c139a3..61543fc42d57f 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_med.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_med.json @@ -14,6 +14,6 @@ "charges": 3, "stack_size": 9, "flags": [ "NO_INGEST", "CANT_HEAL_EVERYONE" ], - "use_action": { "type": "heal", "bandages_power": 15, "bleed": 1, "move_cost": 300 } + "use_action": { "type": "heal", "bandages_power": 15, "bleed": 30, "move_cost": 300 } } ] diff --git a/data/mods/My_Sweet_Cataclysm/sweet_mutations.json b/data/mods/My_Sweet_Cataclysm/sweet_mutations.json index b56219f0ac8ce..6cf1e1159746b 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_mutations.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_mutations.json @@ -35,7 +35,7 @@ "vitamin_rates": [ [ "vitC", -900 ], [ "vitB", -900 ], [ "vitA", -900 ], [ "iron", -900 ], [ "calcium", -900 ] ], "starting_trait": true, "healing_awake": 0.0, - "healing_resting": 0.0, + "healing_resting": -1.0, "healthy_rate": 0.0, "bleed_resist": 1000, "fat_to_max_hp": 0.1, @@ -49,6 +49,6 @@ "bash": 5 } ], - "flags": [ "NO_THIRST", "NO_DISEASE", "NO_RADIATION" ] + "flags": [ "NO_THIRST", "NO_DISEASE", "NO_RADIATION", "NO_MINIMAL_HEALING" ] } ] diff --git a/data/mods/My_Sweet_Cataclysm/sweet_snippets.json b/data/mods/My_Sweet_Cataclysm/sweet_snippets.json index 4a0690dd0d4f3..01424e780f204 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_snippets.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_snippets.json @@ -1,10 +1,12 @@ -{ - "type": "snippet", - "category": "flier", - "text": [ - { - "id": "flier_my_sweet_cataclysm_1", - "text": "A flyer for some kind of candy. It shows a picture of a gleaming human made of smooth candy looking at you in terror. \"SugarKin the first life-size human candy! Are you a real monster? Will you be able to devour it all?\"" - } - ] -} +[ + { + "type": "snippet", + "category": "flier", + "text": [ + { + "id": "flier_my_sweet_cataclysm_1", + "text": "A flyer for some kind of candy. It shows a picture of a gleaming human made of smooth candy looking at you in terror. \"SugarKin the first life-size human candy! Are you a real monster? Will you be able to devour it all?\"" + } + ] + } +] diff --git a/data/mods/National_Guard_Camp/palettes/national_guard_camp.json b/data/mods/National_Guard_Camp/palettes/national_guard_camp.json index cc2263d43e805..eb4d7b3a4d59e 100644 --- a/data/mods/National_Guard_Camp/palettes/national_guard_camp.json +++ b/data/mods/National_Guard_Camp/palettes/national_guard_camp.json @@ -32,7 +32,7 @@ "t": "f_toilet", "u": "f_shower", "v": "f_oven", - "y": "f_treadmill" + "y": [ "f_treadmill", "f_treadmill_mechanical" ] }, "terrain": { " ": "t_thconc_floor", diff --git a/data/mods/National_Guard_Camp/palettes/national_guard_camp_b.json b/data/mods/National_Guard_Camp/palettes/national_guard_camp_b.json index e9e81b21b3ff2..83d7b77b4e9a8 100644 --- a/data/mods/National_Guard_Camp/palettes/national_guard_camp_b.json +++ b/data/mods/National_Guard_Camp/palettes/national_guard_camp_b.json @@ -31,7 +31,7 @@ "t": "f_toilet", "u": "f_shower", "v": "f_oven", - "y": "f_treadmill", + "y": [ "f_treadmill", "f_treadmill_mechanical" ], "z": "f_trashcan" }, "terrain": { diff --git a/data/mods/TEST_DATA/items.json b/data/mods/TEST_DATA/items.json index ee58dd44714f8..334b13bbe79a7 100644 --- a/data/mods/TEST_DATA/items.json +++ b/data/mods/TEST_DATA/items.json @@ -33,7 +33,7 @@ "material": [ "cotton" ], "symbol": ",", "color": "white", - "use_action": [ { "type": "heal", "move_cost": 200, "used_up_item": "rag_bloody", "bleed": 0.5, "limb_power": 0 }, "WASH_HARD_ITEMS" ], + "use_action": [ { "type": "heal", "move_cost": 200, "used_up_item": "rag_bloody", "bleed": 5, "limb_power": 0 }, "WASH_HARD_ITEMS" ], "flags": [ "NO_SALVAGE" ] }, { @@ -96,6 +96,7 @@ { "holster": true, "min_item_volume": "50 ml", + "max_item_length": "60 cm", "max_contains_volume": "1500 ml", "max_contains_weight": "1000 g", "moves": 50, @@ -104,6 +105,7 @@ { "holster": true, "min_item_volume": "50 ml", + "max_item_length": "60 cm", "max_contains_volume": "1500 ml", "max_contains_weight": "1000 g", "moves": 50, @@ -112,6 +114,7 @@ { "holster": true, "min_item_volume": "50 ml", + "max_item_length": "60 cm", "max_contains_volume": "1500 ml", "max_contains_weight": "1000 g", "moves": 50, @@ -120,6 +123,7 @@ { "holster": true, "min_item_volume": "50 ml", + "max_item_length": "60 cm", "max_contains_volume": "1500 ml", "max_contains_weight": "1000 g", "moves": 50, @@ -277,7 +281,7 @@ "holster": true, "max_contains_volume": "20 L", "max_contains_weight": "20 kg", - "item_restriction": [ "test_battery_disposable", "test_battery_rechargeable" ] + "item_restriction": [ "test_battery_disposable", "test_battery_rechargable" ] } ] }, @@ -559,7 +563,7 @@ "name": "TEST gallon jug", "description": "A standard plastic jug used for milk and household cleaning chemicals.", "weight": "190 g", - "volume": "3750 ml", + "volume": "3938 ml", "price": 0, "to_hit": 1, "material": [ "plastic" ], @@ -662,7 +666,7 @@ "name": "TEST briefcase", "description": "Useful for carrying money, documents, or smuggled goods.", "weight": "1700 g", - "volume": "15 L", + "volume": "15750 ml", "price": 24000, "to_hit": -2, "bashing": 5, @@ -919,7 +923,7 @@ "name": { "str": "test box" }, "description": "A simple 1-liter cardboard box of deliberately undefined proportions.", "weight": "100 g", - "volume": "1 L", + "volume": "1050 ml", "price": 0, "price_postapoc": 25, "material": [ "cardboard" ], diff --git a/data/mods/Urban_Development/building_jsons/urban_20_duplex.json b/data/mods/Urban_Development/building_jsons/urban_20_duplex.json index ab03813b0dcf8..95e6333f27ef2 100644 --- a/data/mods/Urban_Development/building_jsons/urban_20_duplex.json +++ b/data/mods/Urban_Development/building_jsons/urban_20_duplex.json @@ -78,7 +78,7 @@ ], "palettes": [ "acidia_residential_commercial_palette" ], "terrain": { "7": "t_strconc_floor" }, - "furniture": { "7": "f_treadmill" }, + "furniture": { "7": [ "f_treadmill", "f_treadmill_mechanical" ] }, "items": { "'": { "item": "cleaning", "chance": 2 }, "D": { "item": "allclothes", "chance": 60 }, diff --git a/data/mods/Urban_Development/building_jsons/urban_33_hotel.json b/data/mods/Urban_Development/building_jsons/urban_33_hotel.json index e42a6a3a02bfa..9173d3810cf80 100644 --- a/data/mods/Urban_Development/building_jsons/urban_33_hotel.json +++ b/data/mods/Urban_Development/building_jsons/urban_33_hotel.json @@ -515,7 +515,7 @@ ], "palettes": [ "acidia_commercial_palette" ], "terrain": { " ": "t_linoleum_white", "!": "t_linoleum_white", "2": "t_linoleum_white" }, - "furniture": { "!": "f_ergometer", "2": "f_treadmill" }, + "furniture": { "!": [ "f_ergometer", "f_ergometer_mechanical" ], "2": [ "f_treadmill", "f_treadmill_mechanical" ] }, "items": { " ": { "item": "traveler", "chance": 1 }, "3": { "item": "traveler", "chance": 1 } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 11 ], "y": [ 1, 18 ], "density": 0.4 } ] } diff --git a/data/mods/default.json b/data/mods/default.json index 0b73848d036ac..75f02b0fd2ec8 100644 --- a/data/mods/default.json +++ b/data/mods/default.json @@ -1,10 +1,9 @@ -{ - "type": "MOD_INFO", - "ident": "dev:default", - "name": "default", - "description": "contains all the mods recommended by the developers", - "dependencies": [ - "dda", - "no_npc_food" - ] -} +[ + { + "type": "MOD_INFO", + "ident": "dev:default", + "name": "default", + "description": "contains all the mods recommended by the developers", + "dependencies": [ "dda", "no_npc_food" ] + } +] diff --git a/data/mods/desert_region/desert_mammal.json b/data/mods/desert_region/desert_mammal.json index 828f178611574..53b6e8189a7ba 100644 --- a/data/mods/desert_region/desert_mammal.json +++ b/data/mods/desert_region/desert_mammal.json @@ -38,7 +38,6 @@ "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", - "BLEED", "PUSH_MON", "DESTROYS", "CATTLEFODDER", diff --git a/data/mods/desert_region/desert_monsters.json b/data/mods/desert_region/desert_monsters.json index bce4b7ea0cdd7..17685e7e77f94 100644 --- a/data/mods/desert_region/desert_monsters.json +++ b/data/mods/desert_region/desert_monsters.json @@ -57,7 +57,7 @@ "special_attacks": [ [ "FUNGUS", 200 ], [ "SMASH", 15 ], [ "FUNGUS_BRISTLE", 20 ], [ "FUNGUS_BIG_BLOSSOM", 30 ] ], "extend": { "flags": [ "POISON", "NO_BREATHE" ] }, "delete": { - "flags": [ "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BLEED", "CATTLEFODDER", "GROUP_MORALE", "GOODHEARING", "SWARMS" ] + "flags": [ "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CATTLEFODDER", "GROUP_MORALE", "GOODHEARING", "SWARMS" ] } }, { diff --git a/data/mods/desert_region/desert_regional_map_settings.json b/data/mods/desert_region/desert_regional_map_settings.json index d292d51678de5..d23a5d52b67a9 100644 --- a/data/mods/desert_region/desert_regional_map_settings.json +++ b/data/mods/desert_region/desert_regional_map_settings.json @@ -709,7 +709,22 @@ "spring_humidity_manual_mod": 10, "summer_humidity_manual_mod": 0, "autumn_humidity_manual_mod": 10, - "winter_humidity_manual_mod": 15 + "winter_humidity_manual_mod": 15, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "acid_drizzle", + "acid_rain", + "flurries", + "snowing", + "snowstorm" + ] }, "overmap_feature_flag_settings": { "clear_blacklist": false, "blacklist": [ ], "clear_whitelist": false, "whitelist": [ ] } } diff --git a/data/mods/rural_biome/rural_regional_map_settings.json b/data/mods/rural_biome/rural_regional_map_settings.json index c254c1cc0fbc3..32519ed5125c8 100644 --- a/data/mods/rural_biome/rural_regional_map_settings.json +++ b/data/mods/rural_biome/rural_regional_map_settings.json @@ -608,7 +608,22 @@ "base_acid": 0.0, "base_wind": 3.4, "base_wind_distrib_peaks": 80, - "base_wind_season_variation": 50 + "base_wind_season_variation": 50, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "acid_drizzle", + "acid_rain", + "flurries", + "snowing", + "snowstorm" + ] }, "overmap_feature_flag_settings": { "clear_blacklist": false, diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index d5c5154fa7a23..5c022b87163ae 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -1108,6 +1108,20 @@ "name": "Toggle sorting order", "bindings": [ { "input_method": "keyboard", "key": "s" } ] }, + { + "type": "keybinding", + "id": "RANDOMIZE", + "category": "NEW_CHAR_PROFESSIONS", + "name": "Randomize profession", + "bindings": [ { "input_method": "keyboard", "key": "*" } ] + }, + { + "type": "keybinding", + "id": "RANDOMIZE", + "category": "NEW_CHAR_SCENARIOS", + "name": "Randomize scenario", + "bindings": [ { "input_method": "keyboard", "key": "*" } ] + }, { "type": "keybinding", "id": "SORT", @@ -1841,6 +1855,12 @@ "id": "sleep", "bindings": [ { "input_method": "keyboard", "key": "$" } ] }, + { + "type": "keybinding", + "name": "Workout", + "category": "DEFAULTMODE", + "id": "workout" + }, { "type": "keybinding", "name": "Control Vehicle", diff --git a/data/raw/keybindings/vehicle.json b/data/raw/keybindings/vehicle.json index f3cc5141bceb2..433cefb64acbc 100644 --- a/data/raw/keybindings/vehicle.json +++ b/data/raw/keybindings/vehicle.json @@ -223,6 +223,13 @@ "name": "Toggle tracking", "bindings": [ { "input_method": "keyboard", "key": "K" } ] }, + { + "id": "TOGGLE_SMART_ENGINE_CONTROLLER", + "type": "keybinding", + "category": "VEHICLE", + "name": "Toggle smart engine controller", + "bindings": [ { "input_method": "keyboard", "key": "Y" } ] + }, { "id": "TURRET_FIRE_MODE", "type": "keybinding", diff --git a/data/title/en.title b/data/title/en.title index bd29cf9c38118..fd6006120b898 100644 --- a/data/title/en.title +++ b/data/title/en.title @@ -1,21 +1,21 @@ # The ASCII art must be 18 lines in height (6 lines per ascii art text line). # Max length of a line is 80 characters; the following line is for reference. ################################################################################ - _________ __ .__ - \_ ___ \ _____ _/ |_ _____ ____ | | ___.__ ______ _____ - / \ \/ \__ \ \ __\\__ \ _/ ___\ | | < | | / ___/ / \ - \ \____ / __ \_ | | / __ \_\ \___ | |__ \___ | \___ \ | Y Y \ - \______ /(____ / |__| (____ / \___ >|____/ / ____|/____ >|__|_| / - \/ \/ \/ \/ \/ \/ \/ - ________ .__ ________ - \______ \ _____ _______ | | __ \______ \ _____ ___.__ ______ - | | \ \__ \ \_ __ \| |/ / | | \ \__ \ < | | / ___/ - | ` \ / __ \_ | | \/| < | ` \ / __ \_ \___ | \___ \ - /_______ /(____ / |__| |__|_ \ /_______ /(____ / / ____|/____ > - \/ \/ \/ \/ \/ \/ \/ - _____ .__ .___ - / _ \ | |__ ____ _____ __| _/ - / /_\ \ | | \ _/ __ \ \__ \ / __ | - / | \| Y \\ ___/ / __ \_/ /_/ | - \____|__ /|___| / \___ >(____ /\____ | - \/ \/ \/ \/ \/ \ No newline at end of file + _________ __ .__ + \_ ___ \ _____ _/ |_ _____ ____ | | ___.__ ______ _____ + / \ \/ \__ \ \ __\\__ \ _/ ___\ | | < | | / ___/ / \ + \ \____ / __ \_ | | / __ \_\ \___ | |__ \___ | \___ \ | Y Y \ + \______ /(____ / |__| (____ / \___ >|____/ / ____|/____ >|__|_| / + \/ \/ \/ \/ \/ \/ \/ + ________ .__ ________ + \______ \ _____ _______ | | __ \______ \ _____ ___.__ ______ + | | \ \__ \ \_ __ \| |/ / | | \ \__ \ < | | / ___/ + | ` \ / __ \_ | | \/| < | ` \ / __ \_ \___ | \___ \ + /_______ /(____ / |__| |__|_ \ /_______ /(____ / / ____|/____ > + \/ \/ \/ \/ \/ \/ \/ + _____ .__ .___ + / _ \ | |__ ____ _____ __| _/ + / /_\ \ | | \ _/ __ \ \__ \ / __ | + / | \| Y \\ ___/ / __ \_/ /_/ | + \____|__ /|___| / \___ >(____ /\____ | + \/ \/ \/ \/ \/ diff --git a/data/title/ru.title b/data/title/ru.title index 3ae7e527729c5..eaa35a11b9a36 100644 --- a/data/title/ru.title +++ b/data/title/ru.title @@ -1,18 +1,18 @@ - ______ ___ - \_ |/ _/_____ ________ _____ ___ __ ___ __ __ ______ __ __ - | < \__ \\__ __\\__ \ \ |/ / / \ | | | \____ \ / V \ - | | \ / __ \_ | | / __ \_| < / Y \| / | _(__ <| Y Y \ - |____|__ \(____ / |__| (____ /|__|_ \|___| /\__/ //____ /|__|_| / - \/ \/ \/ \/ \/ \/ \/ \/ - ___________ .. ______ - \__ ___/____ __ __ ___ __ __ __ ____ \___ \ ___ __ __ __ - | | _/ __ \ / V \ \ | || |_| |_/ __ \ / /| \ \ | || | | - | | \ ___/ | Y Y \| || _ \ |\ ___/ _/ /_| \| || / | - |____| \___ >|__|_| /|__| ||____/__| \___ > \ _____ /|__| |\__/ / - \/ \/ \/ \/ \/ \/ \/ \/ - __________ - \______ \ ______ ____ _______ ____ __ __ __ - | | _/ \ |_/ __ \\____ \ _/ __ \ / \ | | | - | |) \ | Y |\ ___/ | |) >\ ___/ _/ /\ \_| / | - |______ / |__| / \___ >| __/ \___ >\ __ /\__/ / - \/ \/ \/ |__| \/ \/ \/ \/ + ______ ___ + \_ |/ _/_____ ________ _____ ___ __ ___ __ __ ______ __ __ + | < \__ \\__ __\\__ \ \ |/ / / \ | | | \____ \ / V \ + | | \ / __ \_ | | / __ \_| < / Y \| / | _(__ <| Y Y \ + |____|__ \(____ / |__| (____ /|__|_ \|___| /\__/ //____ /|__|_| / + \/ \/ \/ \/ \/ \/ \/ \/ + ___________ .. ______ + \__ ___/____ __ __ ___ __ __ __ ____ \___ \ ___ __ __ __ + | | _/ __ \ / V \ \ | || |_| |_/ __ \ / /| \ \ | || | | + | | \ ___/ | Y Y \| || _ \ |\ ___/ _/ /_| \| || / | + |____| \___ >|__|_| /|__| ||____/__| \___ > \ _____ /|__| |\__/ / + \/ \/ \/ \/ \/ \/ \/ \/ + __________ + \______ \ ______ ____ _______ ____ __ __ __ + | | _/ \ |_/ __ \\____ \ _/ __ \ / \ | | | + | |) \ | Y |\ ___/ | |) >\ ___/ _/ /\ \_| / | + |______ / |__| / \___ >| __/ \___ >\ __ /\__/ / + \/ \/ \/ |__| \/ \/ \/ \/ diff --git a/data/title/zh_CN.title b/data/title/zh_CN.title index bcdc98f556bff..caf6cd56a59e0 100644 --- a/data/title/zh_CN.title +++ b/data/title/zh_CN.title @@ -1,18 +1,18 @@ - ** ** ** - ** ** ************* - ** ************** ** * ** - ************* * * ** *** * * - ** ** * * ** * * *** * * *** - * * * ** ** ** * * ******** ** - ** ** ** ** * ** - ** *** ** ** ** ** - *** **** *** *** **** .-. - ****** ***** **** ***** ***** ****** _ | ` - *** **** ***** ***** ***** ***** ',| \ - *** * *** _.. ** -.,,'-., / - * * /-\ ,,,,/ | | \ - *** ==========' ---- ---- ` _/`'., \ _-- - ||'''/ | `````'- /```''- | | - ,\. | '.-_`,,,,,,,,,\.\-- - / | ^ ___,,,,,,,,,,...-------''''''`````````` -*------'''''*`````````` + ** ** ** + ** ** ************* + ** ************** ** * ** + ************* * * ** *** * * + ** ** * * ** * * *** * * *** + * * * ** ** ** * * ******** ** + ** ** ** ** * ** + ** *** ** ** ** ** + *** **** *** *** **** .-. + ****** ***** **** ***** ***** ****** _ | ` + *** **** ***** ***** ***** ***** ',| \ + *** * *** _.. ** -.,,'-., / + * * /-\ ,,,,/ | | \ + *** ==========' ---- ---- ` _/`'., \ _-- + ||'''/ | `````'- /```''- | | + ,\. | '.-_`,,,,,,,,,\.\-- + / | ^ ___,,,,,,,,,,...-------''''''`````````` +*------'''''*`````````` diff --git a/doc/ARTIFACTS.md b/doc/ARTIFACTS.md new file mode 100644 index 0000000000000..f5beaa44006a3 --- /dev/null +++ b/doc/ARTIFACTS.md @@ -0,0 +1,61 @@ +# Artifacts + +## Introduction + +An "artifact" is a special game item with unique "magic" effects. It uses a base item id and enhances it with further abilities. + +## Generation + +The procedural generation of artifacts is defined in Json. The object looks like the following: +```json +{ + "type": "relic_procgen_data", + "id": "cult", + "passive_add_procgen_values": [ + { + "weight": 100, + "min_value": -1, + "max_value": 1, + "type": "STRENGTH", + "increment": 1, + "power_per_increment": 250 + } + ], + "passive_mult_procgen_values": [ + { + "weight": 100, + "min_value": -1.5, + "max_value": 1.5, + "type": "STRENGTH", + "increment": 0.1, + "power_per_increment": 250 + } + ], + "type_weights": [ { "weight": 100, "value": "passive_enchantment_add" } ], + "items": [ { "weight": 100, "item": "spoon" } ] + } +``` + +### passive_add_procgen_values and passive_mult_procgen_values + +As the names suggest, these are *passive* benefits/penalties to having the artifact (ie. always present without activating the artifact's abilities). **Add** values add or subtract from existing scores, and **mult** values multiply them. These are entered as a list of possible 'abilities' the artifact could get. It does not by default get all these abilities, rather when it spawns it selects from the list provided. + +- **weight:** the weight of this value in the list, to be chosen randomly +- **min_value:** the minimum possible value for this value type. for add must be an integer, for mult it can be a float +- **max_value:** the maximum possible value for this value type. for add must be an integer, for mult it can be a float +- **type:** the type of enchantment value. see MAGIC.md for detailed documentation on enchantment values +- **increment:** the increment that is used for the power multiplier +- **power_per_increment:** the power value per increment + +### type_weights +This determines the relative weight of the 'add' and 'mult' types. When generated, an artifact first decides if it is going to apply an 'add' or a 'mult' ability based on the type_weights of each. Then it uses the weights of the entries under the selected type to pick an ability. This continues cycling until the artifact reaches the defined power level. Possible values right now that are functional are: +- passive_enchantment_add +- passive_enchantment_mult + +This must be included in a dataset or it could cause a crash. + +### items +This provides a list of possible items that this artifact can spawn as, if it appears randomly in a hard-coded map extra. + +## Power Level +An artifact's power level is a summation of its attributes. For example, each point of strength addition in the above object, the artifact is a +250 power, so an artifact with +2 strength would have a power level of 500. similarly, if an artifact had a strength multiplier of 0.8, it would have a power level of -500. diff --git a/doc/COMPILING/COMPILING-VS-VCPKG.md b/doc/COMPILING/COMPILING-VS-VCPKG.md index b2637a9b6827d..7a52ec15f119b 100644 --- a/doc/COMPILING/COMPILING-VS-VCPKG.md +++ b/doc/COMPILING/COMPILING-VS-VCPKG.md @@ -25,11 +25,11 @@ Steps from current guide were tested on Windows 10 (64 bit), Visual Studio 2019 ```cmd git clone https://github.com/Microsoft/vcpkg.git cd vcpkg -.\bootstrap-vcpkg.bat +.\bootstrap-vcpkg.bat -disableMetrics .\vcpkg integrate install ``` -4. Install (or upgrade) neccessary packages with following command line: +4. (Optionally) Install (or upgrade) necessary packages with following command line: #### install 64 bit dependencies: @@ -61,7 +61,7 @@ git clone https://github.com/CleverRaven/Cataclysm-DDA.git cd Cataclysm-DDA ``` -2. Open the provided solution (`msvc-full-features\Cataclysm-vcpkg-static.sln`) in `Visual Studio`, select configuration (`Release` or `Debug`) and platform (`x64` or `x86`) and build it. +2. Open the provided solution (`msvc-full-features\Cataclysm-vcpkg-static.sln`) in `Visual Studio`, select configuration (`Release` or `Debug`) and platform (`x64` or `x86`) and build it. All necessary dependencies will be built and cached for future use by vcpkg automatically. **Note**: This will compile release version with Sound, Tiles and Localization support (language files won't be automatically compiled). diff --git a/doc/DEVELOPER_FAQ.md b/doc/DEVELOPER_FAQ.md index d043f579b3247..b98bcfac9af30 100644 --- a/doc/DEVELOPER_FAQ.md +++ b/doc/DEVELOPER_FAQ.md @@ -46,7 +46,7 @@ The comments given in source code to structure `struct overmap_special` explain 1. Edit `data/json/bionics.json` and add your bionic near similar types. See `JSON_INFO.md` for a more in-depth review of the individual fields. 2. If you want the bionic to be available in the game world as an item, add it to `item_groups.json`, and add a bionic item to `data/json/items/bionics.json`. 3. Manually code in effects into the appropriate files, for activated bionics edit the `player::activate_bionic` function in `bionics.cpp`. -4. For bionic ranged weapons add the bionic weapon counterparts to `ranged.json`, give them the `NO_AMMO` and `BIO_WEAPON` flags. +4. For bionic ranged weapons add the bionic weapon counterparts to `ranged.json`, give them the `NO_AMMO` and `BIONIC_WEAPON` flags. 5. For bionic close combat weapons add the bionic weapon to `data/json/items/melee.json` give them `NON_STUCK`, `NO_UNWIELD` at least. ## How armor protection is calculated diff --git a/doc/EFFECTS_JSON.md b/doc/EFFECTS_JSON.md index 5f637266e3e5b..56db3f15fbf4d 100644 --- a/doc/EFFECTS_JSON.md +++ b/doc/EFFECTS_JSON.md @@ -286,6 +286,11 @@ main part (arms, head, legs, etc.). them more pkill. "pain_sizing" and "hurt_sizing" cause large/huge mutations to affect the chance of pain and hurt effects triggering. "harmful_cough" means that the coughs caused by this effect can hurt the player. +### Flags + +"EFFECT_INVISIBLE" Character affected by an effect with this flag are invisible. +"EFFECT_IMPEDING" Character affected by an effect with this flag can't move until they break free from the effect. Breaking free requires a strenght check: `x_in_y( get_str(), 6 * get_effect_int( eff_id )` + ### Effect effects ```C++ "base_mods" : { diff --git a/doc/JSON Mapping Guides/Guide for intermediate mapgen.md b/doc/JSON Mapping Guides/Guide for intermediate mapgen.md new file mode 100644 index 0000000000000..261496dc03af8 --- /dev/null +++ b/doc/JSON Mapping Guides/Guide for intermediate mapgen.md @@ -0,0 +1,616 @@ +**Intermediate Mapgen Guide:** + +This guide assumes you are comfortable with basic mapgen elements and adding regular mapgen. It is meant as a supplement to the mapgen.md and overmap.md documents. + +**This guide will cover:** + +* When to use nested mapgen vs. regular mapgen variants. +* How to make and spawn a nested map. +* Some nested map possibilities. +* NPC spawning. +* Leveraging existing nested maps for modders. +* Basic update_mapgen using traps. +* Merged maps for large buildings. + + +**Files you’ll use:** +* a new or existing file to hold your nested map entries (there is a sub folder in mapgen for nested map files). +* the mapgen file you want your nests to spawn in +* palette (optional) +* the files used in the beginner's tutorial (a mapgen file, overmap_terrain, and specials.json or multitile_city_buildings.json/regional_map_settings.json.) + +**Nested maps vs. variant maps:** + +Variant maps are mapgen files that completely replace another map variant by using the same `om_terrain name` and applying a `weight` entry to each variant for spawning in relation to each other. + +Nested maps are a new layer of map applied to an existing mapgen file. They can overwrite existing terrain, furniture, add spawns for loot, monsters, vehicles, etc. They can contain anything that a regular mapgen contains within the object entry. Nested maps are spawned by adding an entry into the main mapgen’s object entry. They can be any size from a single tile to the entire 24x24 overmap terrain. + +Both approaches offer advantages and disadvantages to adding variety to maps. + +Variants are good for large structural changes or complete overhauls. + +* For example, I may do a portion of a farm with a barn and another with a set of farm plots. +* If I want clearly different variants for an entire map, like the same house as empty, abandoned, and furnished. +* Before we added json roofs (and other linked z levels) to our mapgen, most buildings utilized variants for spawning, most have now been renamed but some variants still exist, especially in older specials. + +Nested maps are good for adding more targeted variety and randomness to maps. In addition to what the variant offers, nested maps can let you do things like: + +* rearrange the furniture in a room, or in every room on a case by case basis. +* add smaller targeted thematic content like set pieces, additional monsters, hidden rooms, rare spawns. +* Have different sets of loot and room themes that randomly spawn across multiple buildings. + + +**Update_mapgen:** + +Update mapgen is triggered during game play instead of being initialized during worldgen. I’ll cover some of the update_mapgen uses in this document but it deserves its own guide. + + * Traps can trigger mapgen changes. + * Allows missions to trigger mapgen changes. + * Used by the faction camp building system for blueprints along with nested maps. + * Used by map_extras. + +update mapgen maps are similar to nested maps but are applied to an existing map, not to the mapgen file. Like nested maps, they can overwrite existing terrain, furniture, add spawns for loot, monsters, vehicles, etc. They can contain anything that a regular mapgen contains within the object entry. They can be any size from a single tile to the entire 24x24 overmap terrain, and can even included nested mapgen objects. + +**Merged Maps** + +Merged maps are when you combine the mapgen entries for several OMTs into a single mapgen entry. The `rows` are combined for a group the maps. This is usually used for improved readability for the json and a more compact file size. They are generally handled the same as a single OMT mapgen, with a few exceptions included in this document. Like any mapgen option, there are tradeoffs, a notable limitation is the single fill_ter entry for multiple OMTs. + +**Creating Nested Maps:** + +You’ll want to make some choices before adding nested maps. + +* Their purpose, where are they spawning, multiple locations? +* If it is within a larger building, will you include doors/walls? +* What size map do you need to make. + +A nested map gives you the ability to overwrite or fill in a portion of an existing mapgen. The contents of the nested map entry can contain any entry within mapgen objects (excepting fill_ter). This includes adding nested maps inside your nested map for extra variability. + +Example json entry for the nested map: + +``` + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "room_9x9_recroom_E", + "//": "an entertainment area for various recreations", + "object": { + "mapgensize": [ 9, 9 ], + "rotation": [ 0, 3 ], + "rows": [ + "|||||||||", + "|HHH...=|", + "|Hl....x|", + "|%.....=|", + "|.A.A..&|", + "|JJ5JJ +", + "| |", + "|mVJ14 T|", + "|||||||||" + ], + "palettes": [ "standard_domestic_palette" ], + "terrain": { + ".": "t_carpet_green", + "H": "t_carpet_green", + "l": "t_carpet_green", + "A": "t_carpet_green", + "=": "t_carpet_green", + "x": "t_carpet_green", + "%": "t_carpet_green", + "&": "t_carpet_green" + }, + "furniture": { "%": "f_arcade_machine", "=": "f_speaker_cabinet", "&": "f_pinball_machine" }, + "place_loot": [ { "item": "stereo", "x": 7, "y": 2, "chance": 100 }, { "item": "laptop", "x": 5, "y": 5, "chance": 60 } ] + } + } + ``` + +This should feel pretty familiar since it looks like the `object` entry in mapgen and shares the same `type`. +Note the ID is now `nested_mapgen_id` and the object uses a new entry `mapgensize` + +* `nested_mapgen_id`: Your ID should provide useful information about the nest. Multiple nests can share the same ID. + +* `weight`: This value is new and most nested maps don't have it yet. It allows you to weight the spawns of nests that share the same `nested_mapgen_id` (aka variants of nests). + +* `mapgensize`: Nested mapgen can be any size from 1x1 to 24x24 but it must be square. You don't have to use every row or column of the `rows` entry. Any unused portions will fall back to the main mapgen. + +* `terrain` & `furniture`: Without `fill_ter`, you need to define every floor terrain under furniture. If you don't it will fall back to the main mapgen's `fill_ter`. In the above example, there's a green carpet in 1/2 the map and the rest picks up the floor of the mapgen (indoor concrete). If you need to overwrite existing furniture in the main mapgen you can use a combination of `t_null` and `f_null` to override preexisting mapgen. + +_Tips:_ +If you're doing interior spaces, pay attention to door placement and access pathways. + +* For walled nests, I generally keep the doors in the center of the walls. +* For open floor plan nests, I try to preserve the corner spaces for doors in the regular mapgen (if I can design the mapgen with the nests). + +example: note the corner tiles are all empty. +``` + "rows": [ + " CR ", + "O ", + " EE ", + " EE " + ], +``` + +example room outline with possible door placements. The `+` denotes any valid door placement for the above nest. This approach gives you the maximum number of possibilities for fitting this nest into enclosed rooms without blocking the doorway. I toss some indoor plants or other small furniture into the unused corners in the main mapgen as well, to fill out the rooms. + +``` + "rows": [ + "|+||+|", + "+ CR +", + "|O |", + "| EE |", + "+ EE +", + "|+||+|" + ], +``` + +Fitting nests into existing foundations/building outlines can be a bit of a puzzle, especially as you add variations that share the same ID or are used over many maps. So having your doors in predictable places in all your nests will aid in their re-use for future maps. + +We use a naming convention that includes the nested map size and some indication of its orientation or we add a comment with extra context in the json entry. + +Some ID's: +* room_9x9_recroom_N +* room_9x9_recroom_S +* 7x7_band_practice_open + + +by using room and a compass direction, it quickly identifies the nest as having walls/door and the door's orientation. The band practice one is an open space, no walls included. Including the map size will make searching, debug spawning and re-using nests easier as well. + + +**Debug testing:** + +So many nests, so hard to find ones to use! + +We've recently gotten the ability to spawn nested maps via debug in game and this is a huge help for making sure nests fit, don't conflict with elements in the existing maps and are oriented well without adjusting spawn weights to force the nest to spawn naturally. + +This is also a good way to "shop around" for existing nests to re-use in your maps. + +To debug spawn a nested map in game: +* Open debug menu (you will need to add a key bind) +* Choose `map` [m] +* Choose `spawn nested map` [n] +* Search list by using [/] +* Use your selector to place the nested map. The indicator is 0,0 coordinate of the nest. + +You'll quickly see why it's good to use a coherent name format. + +**Mini nests:** + +Nests can be as small as one tile which is very useful if you want special or rare spawns for items, monsters, vehicles, NPCs or other elements. + +An example of a spawn for a particular loot group: +These nests were used in a larger nest of a basement study. I didn't want the study to offer all the magiclysm class books at once. I made nests for each spell class item_group: + +3 1x1 nested maps that only include loot placement. They feed into a larger nest. + +``` + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "animist_loot_spawn", + "object": { "mapgensize": [ 1, 1 ], "place_loot": [ { "group": "animist_items", "x": 0, "y": 0, "chance": 70 } ] } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "magus_loot_spawn", + "object": { "mapgensize": [ 1, 1 ], "place_loot": [ { "group": "magus_items", "x": 0, "y": 0, "chance": 70 } ] } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "stormshaper_loot_spawn", + "object": { "mapgensize": [ 1, 1 ], "place_loot": [ { "group": "stormshaper_items", "x": 0, "y": 0, "chance": 70 } ] } + } + ``` + +**NPC spawning:** + +If you use `place_npc` on the main mapgen, the NPC will spawn 100% of the time. NPC's like the refugee center ones get placed like this. + +However, many NPCs should be closer to random encounters. The below example creates a nest that spawns an NPC (and only the NPC): + +``` + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "SEER_Brigitte_LaCroix_spawn", + "object": { "mapgensize": [ 1, 1 ], "place_npcs": [ { "class": "SEER_Brigitte_LaCroix", "x": 0, "y": 0 } ] } + } +``` + +You can also customize the surroundings in which the NPC spawns. For the Chef NPC that spawns in one restaurant, they get their survivor themed setting included: +Note the use of `t_null` in the majority of the map. A lot of the map is unused and relies on the main mapgen. It rearranges furniture to blockade the entrance and adds a little survivor's den flavor. +``` + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "chef_s_restaurant", + "object": { + "mapgensize": [ 13, 13 ], + "rows": [ + "mt_________#t", + "____________r", + "__________ffr", + "___________W_", + "_____________", + "_____________", + "_____________", + "_____________", + "_____________", + "_____________", + "_____________", + "_____________", + "_____________" + ], + "terrain": { "_": "t_null", "-": "t_wall", "W": "t_window_boarded" }, + "furniture": { "r": "f_rack", "f": "f_fridge", "t": "f_table", "#": "f_counter", "m": "f_makeshift_bed" }, + "place_npcs": [ { "class": "survivor_chef", "x": 5, "y": 1 } ], + "place_loot": [ + { "group": "produce", "x": [ 10, 11 ], "y": 2, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "groce_meat", "x": [ 10, 11 ], "y": 2, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "groce_dairyegg", "x": [ 10, 11 ], "y": 2, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "bar_food", "x": [ 10, 11 ], "y": 2, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "bar_fridge", "x": [ 10, 11 ], "y": 2, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "jackets", "x": 0, "y": 0, "chance": 70, "repeat": [ 2, 3 ] }, + { "group": "alcohol_bottled_canned", "x": 1, "y": 0, "chance": 80 }, + { "group": "baked_goods", "x": [ 2, 4 ], "y": 2, "chance": 50, "repeat": [ 2, 3 ] }, + { "group": "groce_bread", "x": [ 2, 4 ], "y": 2, "chance": 50, "repeat": [ 2, 3 ] }, + { "group": "cannedfood", "x": [ 5, 6 ], "y": 0, "chance": 50, "repeat": [ 2, 3 ] }, + { "group": "cannedfood", "x": [ 9, 11 ], "y": 0, "chance": 50, "repeat": [ 2, 3 ] } + ] + } + } +``` + + **Spawning the nested maps** + + You can spawn nests in the usual two methods, using explicit symbol placement or x,y coordinates. I've encountered rare instances where one style works and the other doesn't but haven't pinned down the cause yet. + + + **x,y coordinate placement:** + +This adds some nice variability if you want the nest's spawn location to shift a bit around the map. I used this extensively on roofs since they are open spaces and I wanted to decrease how static they would feel otherwise. + + + In the main mapgen's `object` you enter the following entry: +``` + "place_nested": [ + { + "chunks": [ [ "null", 30 ], [ "roof_6x6_utility", 30 ], [ "roof_4x4_utility_1", 40 ] ], + "x": [ 5, 14 ], + "y": [ 14, 16 ] + } + ] +``` + +A NPC example: + +``` +"place_nested": [ { "chunks": [ [ "SEER_Brigitte_LaCroix_spawn", 20 ], [ "null", 80 ] ], "x": 18, "y": 6 } ] +``` + +The `chunks` are the `nested_mapgen_id` of the nests and each includes their spawn weight in relation to each other. Adding a `null` entry allows for the nest to have a chance to not spawn anything. `Null` also ensures your NPC related nest spawns as a chance instead of being guaranteed. + +**Explicit symbol placement:** + +In the main mapgen's `object` you add the following entry: +Wherever on the main mapgen's `rows` I place a `1` the first set of chunks will spawn. The other set will spawn wherever I place a `2`. The symbol should be placed wherever you want the 0,0 coordinate of your nested map placed. + +``` +"nested": { + "1": { + "chunks": [ [ "null", 60 ], [ "room_10x10_woodworker_E", 30 ], [ "room_10x10_guns_E", 10 ], [ "room_10x10_guns_N", 10 ] ] + }, + "2": { + "chunks": [ + [ "null", 50 ], + [ "room_6x6_brewer_N", 10 ], + [ "room_6x6_junk", 30 ], + [ "room_6x6_office_N", 30 ], + [ "6x6_sewing_open", 20 ], + [ "6x6_electronics_open", 10 ], + [ "room_6x6_brewer_W", 10 ], + [ "room_6x6_junk_W", 30 ], + [ "room_6x6_office_W", 30 ] + ] + } + } +``` + +The main mapgen `rows` with symbols: +``` + "rows": [ + " ", + " ", + " ", + " ", + " |||||||||||||| ", + " |.g...JJJWZ.U| ", + " |F..........<| ", + " |............| ", + " |............| ", + " |......2.....| ", + " |||||||............| ", + " |1.................| ", + " |..................| ", + " |..................| ", + " |..................| ", + " |..........||||||||| ", + " |..........| ", + " |..........| ", + " |..........| ", + " |..........| ", + " |..........| ", + " |||||||||||| ", + " ", + " " + ], +``` + +**Nested maps and z levels:** + +Currently, nested maps do not support z level linking, so any nested map you make will rely on the main mapgen's roof or attempt to generate the c++ roofs. This works with varying degrees of success. Mostly I find it annoying when I can't put a glass roof on greenhouses. + +**Leveraging existing nested maps for modders.** + +As the nested maps used in vanilla increase, modders can make use of these existing entries to incorporate their mod maps into existing buildings. This should greatly expand the mod's ability to add its content into vanilla maps. By using the same `nested mapgen id` and assigning a `weight` to both your new nest and existing nests (as needed). + +I recommend the modder take a look through existing maps and see if there is one that fits the same overall size, orientation, and spawning rarity that they would like their modded nest to have. +You can search for the nested mapgen ids in the github to make sure its representation meets your needs. + + +**Update_mapgen:** + +As mentioned before, Update_mapgen is applied to existing maps due to events that occur during game play. + +Update mapgen will be covered more in advanced guides that address its uses in faction bases and NPC missions. + +For this guide, the most likely use will be for trap triggered update_mapgen. This is a very new feature and currently is used in the microlab and the magiclysm mod's magic basement. + +Since it is still a new feature, it hasn't been expanded upon much. Currently the following limitation applies: +* Traps can only be triggered by a Player or NPC moving on to the trap tile. + +We are going to use the simpler implementation found in the Magiclysm basement over the micro_lab but I'd recommend looking at the micro lab's multi-trap system as well. + +You will need a trap entry (or use an existing one) + +Trap example: +``` + { + "type": "trap", + "id": "tr_magic_door", + "name": "magic door", + "color": "brown", + "symbol": "+", + "visibility": 99, + "avoidance": 99, + "difficulty": 99, + "action": "map_regen", + "map_regen": "magic_door_appear", + "benign": true + } + ``` + + All the trap specific entries can be learned about in other documentation. What concerns us here are the `action` and `map_regen` entries. We want this trap to trigger a `map_regen` action and the `map_regen` references our `update_mapgen_id`. + + update_magen similarities to nested maps: + + * it can target a smaller map chunk. + * it uses the `object` data. + + differences from nested maps: + + * Coordinates used refer to the main mapgen it is updating. + + update_mapgen sample: + + ``` + { + "type": "mapgen", + "update_mapgen_id": "magic_door_appear", + "method": "json", + "object": { + "place_terrain": [ { "ter": "t_carpet_green", "x": 12, "y": 6 } ], + "place_furniture": [ { "furn": "f_beaded_door", "x": 12, "y": 6 } ] + } + } + ``` +In this example, instead of making rows and assigning symbols, I used a condensed alternative with `place_terrain` and `place_furniture`. The x,y coordinates refer to the main mapgen this is altering. This could have used the typical rows coding we normally use in mapgen as well. + +The main mapgen and spawning your trap: + +``` + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "magic_basement" ], + "weight": 100, + "object": { + "fill_ter": "t_carpet_green", + "rows": [ + " ", + " ||||||||||||||| ", + " |gUU|yRRRRRRET| ", + " ||||||~~~%........E| ", + " ||????|||||........L| ", + " ||.......E!|...E....|| ", + " |&.........|.yrrr...<| ", + " ||...$...Py||||||/|||| ", + " ||TIII|||||RRR......| ", + " ||||||88S|.....H..x| ", + " |~~~/.....H..x| ", + " |B~~|.....s..x| ", + " |BYt|RRRR.....| ", + " ||||||||||||||| ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "standard_domestic_palette" ], + "place_traps": [ { "trap": "tr_magic_door", "x": 21, "y": 4 } ] + } + } + ``` + + I've placed the trap under a coat rack to dissuade casual triggering. Note: when triggered, the trap will update the wall across the room with a beaded door entrance. + + +**Merged maps** + +A merged map is json that has grouped several OMTs together within one mapgen entry. There is no size limit but you should do your best to keep the json readable, so break it up into manageable segments. 3 OMTs together left to right is 72 tiles, and fits easily inside CDDA's preference for no more than 100 columns per line, but some people do as many as 5 OMTs together. More than 5 OMTs together left to right can be hard to read on smaller screens and should be avoided. The same logic applies for vertical grouping: 2-3 OMTs fit easily on most screens, but more than that can be hard to read. + +You can insert existing OMT's into your merged map including forest, field, swamp and water tiles. Generic tiles like forests don't need to be added in your mapgen file, they will be called in the specials.json or multitile_city_buildings entry. + +For the most part, merged maps use the exact same rules and entries as regular mapgen files with a few notable exceptions: + +om_terrain value: + This example is for a map that is 4 OMTs wide and 3 OMTs long (4x3) on the overmap. Each row of OMT's are grouped into an array. + +``` +"om_terrain": [ + [ "farm_stills_4", "farm_stills_3", "farm_stills_2", "farm_stills_1" ], + [ "farm_stills_8", "farm_stills_7", "farm_stills_6", "farm_stills_5" ], + [ "farm_stills_12", "farm_stills_11", "farm_stills_10", "farm_stills_9" ] + ] +``` + +Each OMT's coordinates will continue the row and column numbers, they do not reset to 0,0 at each map boundary. + +For our farm the coordinates will be: +* x sets: + * first OMT: 0,23 + * second OMT: 24,47 + * third OMT: 48,71 + * fourth OMT: 72,95 + +* y sets: + * first row: 0,23 + * second row: 24,47 + * third row: 48,71 + + +The object entries rows reflect all the OMTs together and all the other object entries are shared across all the OMTs: + +``` + "rows": [ + " IFFFFFFFI,,,,IFFFFFFFIffffffffffffffff ,,,, ffffIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFI ", + " F ,,,, F ???? ???? P,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , F ", + " F $$$$$$$,,,,$$$$$$$ F -ww- -ww- ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F ---..----..--- ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , F ", + " F ,,,, F -x..........x- ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ F -....hhhh....w ?,? I ,,,, F ", + " F ,,,, F w....tttt....-????,? F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD,F ", + " F ,,,, F w....tttt....+,,,,,? F , Q ,,,, , , F ", + " F $$$$$$$,,,,$$$$$$$ F w....tttt...Y-?????? F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F -....hhhh....w F, ,,,, , F ", + " F ,,,, F -x..........x- -ww- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ F ----......--------HH---- F , ,,,, F ", + " F ,,,, F -......................- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,,Q F w.;;;;;;;;;;;;;;;;;;;;.w F ,,,, , Q F ", + " F $$$$$$$,,,,$$$$$$$ F -.....................x- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F ---+-----+-----+-----+-- F , , ,,,, , F ", + " F ,,,, F -iiiiu-H...-BB...kk-TiS- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ F -Siiiu-t...-.....h.-iii- F , ,,,, , F ", + " F ,,,, F woiiiu-H...-BB.....-iii- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F -eiiiu-.BB.-.....h.-bbb- F ,,,, , F ", + " F $$$$$$$,,,,$$$$$$$ F -iiiiu-.BBd-BBdddkk-bbb- F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F ---+----ww----ww-------- F, , ,,,, ,F ", + " F ,,,, F , F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ Iffff,fffffffffffffffffffffI , ,,,, , F ", + " F ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , Q F ", + " F $$$$$$$,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , F ", + " F ,,,, I ,, ,,,,,O I DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ F #==#==# ,, ##MMMMM## F Q ,,,, , ,F ", + " F ,,,, F #L_q__# ,, ? #E_____O# F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F #L_q__# ,,, #E______# F ,,,, F ", + " F $$$$$$$,,,,$$$$$$$ F #L____# ,, &#E______W F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F #L_c__# ,,,,,,+_______# F , ,,,, , F ", + " F ,,,, F ####### ,, ?#l______# F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ F ? ,, #l______W F, , ,,,, F ", + " F ,,,, F ,,, #l______# F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F ? ,, #_______# F , ,,,, , , F ", + " F $$$$$$$,,,,$$$$$$$ F ? ,,? ######### F DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, F ,, F , ,,,, F ", + " F ,,,, IFFFFFFFFFI,,IFFFFFFFFFFFFFI DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ f ? ,, ? f , , ,,,, , F ", + " F Q ,,,, f 7 7 7,, 7 7 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ? ,, ? f , ,,,, F ", + " F $$$$$$$,,,,$$$$$$$ f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ,, f , ,,,, Q F ", + " F ,,,, f 7 7 7,, 7 7? 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ f ? ,,, ? f, ,,,, , , F ", + " F ,,,, f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ,,, ? f , ,,,, , ,F ", + " F $$$$$$$,,,,$$$$$$$ f 7 7 ,,7 ? 7 7 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f? ? ,, ? f ,,,, F ", + " F ,,,, f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ f ,, ? f , , ,,,, , , F ", + " F ,,,, f 7 7 ,,7 ? 7 7 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ,, ? f , ,,,, F ", + " F $$$$$$$,,,,$$$$$$$ f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ,, ? f, ,,,, , F ", + " F ,,,, f 7 7 ,,7 7 7 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ f ,, ? f , , ,,,, , , F ", + " F ,,,, f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ,, ? f Q ,,,, F ", + " F $$$$$$$,,,,$$$$$$$ f 7 7 ,,7 7 7 7 f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ,,, ? ?f , ,,,, , ,F ", + " F ,,,, Q f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDD,,,,DDDDDDDDDDDDDDDDDDD F ", + " F $$$$$$$,,,,$$$$$$$ f ? ,,, ? f , , ,,,, F ", + " F ,,,, f 7 7 7,, 7 7 7 f,DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ,,, ? f , , , Q F ", + " F $$$$$$$,,,,$$$$$$$ f ,,,,,,,,,,,,,,,,,,,,,, f DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD F ", + " F ,,,, f ? ,, f , , , F ", + " F f 7 7 7 ? 7 7 7 f DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD F ", + " IFFFFFFFFFFFFFFFFFFFFIFFFFFFFFFFFFFFFFFFFFFFFFFFIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFI " + ], +``` + +Important note about spawning items, vehicles and monsters: + +While these maps are merged for the benefit of readability, this isn't automatically recognized by our mapgen processes. When you add spawns using x,y coordinates you can't cross OMT boundaries. Make multiple entries if you want those spawns to occur across more than one OMT. This applies for both x and y coordinates. + +An example: each x coordinate encompasses one OMT from a segment of the mall. +``` +"place_monsters": [ + { "monster": "GROUP_MALL", "x": [ 2, 23 ], "y": [ 2, 23 ], "density": 0.15 }, + { "monster": "GROUP_MALL", "x": [ 26, 47 ], "y": [ 2, 23 ], "density": 0.3 }, + { "monster": "GROUP_MALL", "x": [ 49, 71 ], "y": [ 2, 10 ], "density": 0.2 }, + { "monster": "GROUP_MALL", "x": [ 56, 68 ], "y": [ 17, 21 ], "density": 0.1 }, + { "monster": "GROUP_MALL", "x": [ 73, 95 ], "y": [ 2, 10 ], "density": 0.2 }, + { "monster": "GROUP_MALL", "x": [ 73, 95 ], "y": [ 17, 19 ], "density": 0.1 }, + { "monster": "GROUP_MALL", "x": [ 98, 119 ], "y": [ 0, 11 ], "density": 0.2 }, + { "monster": "GROUP_MALL", "x": [ 96, 105 ], "y": [ 16, 21 ], "density": 0.1 }, + { "monster": "GROUP_MALL", "x": [ 170, 191 ], "y": [ 2, 23 ], "density": 0.1 }, + { "monster": "GROUP_MALL", "x": [ 194, 215 ], "y": [ 2, 23 ], "density": 0.05 } + ] +``` + +* You can mostly get around this by using explicit symbol placement instead, which will apply to all the OMT's within your `rows`. This can get a little messy for monster and vehicle spawns, so I usually keep those to x,y coordinates. + +* Vehicles that spawn across 2 OMT's won't spawn at all. So if you can't get your vehicle to spawn, adjust its placement. Vehicle's 0,0 coordinate can vary depending on the vehicle's own json entry so this usually will take some trial and error to get them spawning nicely. + +* Nested maps of all sorts can be used in a merged map, but they can't cross boundary lines (the nested map will be cut off at the boundary). + +* More information about monster spawning can be found in [doc/MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md#spawn-item-or-monster-groups-with-place_groups) + +Note: set point type entries (see the example below) don't work well with merged maps and the issue has been reported. If you use this entry, the points will be repeated in every OMT in your merged map. + +sample: +``` +"set": [ + { "point": "trap", "id": "tr_funnel", "x": [ 2, 9 ], "y": 19, "repeat": [ 1, 2 ] }, + { "point": "trap", "id": "tr_cot", "x": [ 2, 9 ], "y": [ 15, 17 ], "repeat": [ 1, 2 ] } + ] +``` +I wanted to place this cot and funnel in the first OMT but it is repeated every time it encounters a new OMT boundary. diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index bf473494ac671..c586b27509bfc 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -596,6 +596,8 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```UNSTABLE``` Walking here cause the bouldering effect on the character. - ```USABLE_FIRE``` This terrain or furniture counts as a nearby fire for crafting. - ```WALL``` This terrain is an upright obstacle. Used for fungal conversion, and also implies `CONNECT_TO_WALL`. +- ```WORKOUT_LEGS``` This furniture is for training your legs. Needed for checks like `is_limb_broken()`. +- ```WORKOUT_ARMS``` This furniture is for training your arms. Needed for checks like `is_limb_broken()`. ### Examine Actions @@ -629,7 +631,6 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```shrub_wildveggies``` Pick a wild veggies shrub. - ```slot_machine``` Gamble. - ```toilet``` Either drink or get water out of the toilet. -- ```trap``` Interact with a trap. - ```water_source``` Drink or get water from a water source. ### Fungal Conversions Only @@ -812,7 +813,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```MESSY``` Creates more mess when pulping - ```NO_CVD``` Item can never be used with a CVD machine - ```NO_RELOAD``` Item can never be reloaded (even if has a valid ammo type). -- ```NO_UNWIELD``` Cannot unwield this item. +- ```NO_UNWIELD``` Cannot unwield this item. Fake weapons and tools produced by bionics should have this flag. Such items support unwield as a special case. - ```POLEARM``` Item is clumsy up close and does 70% of normal damage against adjacent targets. Should be paired with REACH_ATTACK. Simple reach piercing weapons like spears should not get this flag. - ```REACH_ATTACK``` Allows to perform reach attack. - ```SHEATH_KNIFE``` Item can be sheathed in a knife sheath, it applicable to small/medium knives (with volume not bigger than 2) @@ -911,7 +912,6 @@ Multiple death functions can be used. Not all combinations make sense. - ```BASHES``` Bashes down doors. - ```BILE_BLOOD``` Makes monster bleed bile. - ```BIRDFOOD``` Becomes friendly / tamed with bird food. -- ```BLEED``` Causes the player to bleed. - ```BONES``` May produce bones and sinews when butchered. - ```BORES``` Tunnels through just about anything (15x bash multiplier: dark wyrms' bash skill 12->180) - ```CAN_DIG``` Can dig _and_ walk. @@ -1114,6 +1114,7 @@ Also see `monster_attacks.json` for more special attacks, for example, impale an - ```NO_DISEASE``` This mutation grants immunity to diseases. - ```NO_THIRST``` Your thirst is not modified by food or drinks. - ```NO_RADIATION``` This mutation grants immunity to radiations. +- ```NO_MINIMAL_HEALING``` This mutation disables the minimal healing of 1 hp a day. ### Categories diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 04aae493c43fa..cdb69bbdc2b3c 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -53,6 +53,7 @@ Use the `Home` key to return to the top. - [`conduct`](#conduct) + [Skills](#skills) + [Traits/Mutations](#traits-mutations) + + [Traps](#traps) + [Vehicle Groups](#vehicle-groups) + [Vehicle Parts](#vehicle-parts) + [Part Resistance](#part-resistance) @@ -394,7 +395,7 @@ This section describes each json file and their contents. Each json has their ow | Identifier | Description |--- |--- | id | Unique ID. Must be one continuous word, use underscores if necessary. -| picture | Array of string, each entry is a line of an ascii picture and must be at most 42 columns long. +| picture | Array of string, each entry is a line of an ascii picture and must be at most 41 columns long. ```C++ { @@ -423,22 +424,25 @@ This section describes each json file and their contents. Each json has their ow | Identifier | Description |--- |--- -| id | Unique ID. Must be one continuous word, use underscores if necessary. -| name | In-game name displayed. -| accusative | Accusative form for this bodypart. -| heading | How it's displayed in headings. -| heading_multiple | Plural form of heading. -| hp_bar_ui_text | How it's displayed next to the hp bar in the panel. -| main_part | What is the main part this one is attached to. (If this is a main part it's attached to itself) -| opposite_part | What is the opposite part ot this one in case of a pair. -| hit_size | Size of the body part when doing an unweighted selection. -| hit_size_relative | Hit sizes for attackers who are smaller, equal in size, and bigger. -| hit_difficulty | How hard is it to hit a given body part, assuming "owner" is hit. Higher number means good hits will veer towards this part, lower means this part is unlikely to be hit by inaccurate attacks. Formula is `chance *= pow(hit_roll, hit_difficulty)` -| stylish_bonus | Mood bonus associated with wearing fancy clothing on this part. (default: `0`) -| hot_morale_mod | Mood effect of being too hot on this part. (default: `0`) -| cold_morale_mod | Mood effect of being too cold on this part. (default: `0`) -| squeamish_penalty | Mood effect of wearing filthy clothing on this part. (default: `0`) -| bionic_slots | How many bionic slots does this part have. +| id | (_mandatory_) Unique ID. Must be one continuous word, use underscores if necessary. +| name | (_mandatory_) In-game name displayed. +| accusative | (_mandatory_) Accusative form for this bodypart. +| heading | (_mandatory_) How it's displayed in headings. +| heading_multiple | (_mandatory_) Plural form of heading. +| hp_bar_ui_text | (_mandatory_) How it's displayed next to the hp bar in the panel. +| main_part | (_mandatory_) What is the main part this one is attached to. (If this is a main part it's attached to itself) +| base_hp | (_mandatory_) The amount of hp this part has before any modification. +| opposite_part | (_mandatory_) What is the opposite part ot this one in case of a pair. +| hit_size | (_mandatory_) Size of the body part when doing an unweighted selection. +| hit_size_relative | (_mandatory_) Hit sizes for attackers who are smaller, equal in size, and bigger. +| hit_difficulty | (_mandatory_) How hard is it to hit a given body part, assuming "owner" is hit. Higher number means good hits will veer towards this part, lower means this part is unlikely to be hit by inaccurate attacks. Formula is `chance *= pow(hit_roll, hit_difficulty)` +| stylish_bonus | (_optional_) Mood bonus associated with wearing fancy clothing on this part. (default: `0`) +| hot_morale_mod | (_optional_) Mood effect of being too hot on this part. (default: `0`) +| cold_morale_mod | (_optional_) Mood effect of being too cold on this part. (default: `0`) +| squeamish_penalty | (_optional_) Mood effect of wearing filthy clothing on this part. (default: `0`) +| stat_hp_mods | (_optional_) Values modifiying hp_max of this part following this formula: `hp_max += int_mod*int_max + dex_mod*dex_max + str_mod*str_max + per_mod*per_max + health_mod*get_healthy()` with X_max being the unmodifed value of the X stat and get_healthy() being the hidden health stat of the character. +| bionic_slots | (_optional_) How many bionic slots does this part have. +| is_limb | (_optional_) Is this bodypart a limb. (default: `false`) ```C++ { @@ -461,6 +465,8 @@ This section describes each json file and their contents. Each json has their ow "hot_morale_mod": 2, "cold_morale_mod": 2, "squeamish_penalty": 6, + "base_hp": 60, + "stat_hp_mods": { "int_mod": 4.0, "dex_mod": 1.0, "str_mod": 1.0, "per_mod": 1.0, "health_mod": 1.0 }, "bionic_slots": 80 } ``` @@ -880,6 +886,17 @@ Example: ] ``` +#### `proficiencies` + +(optional, array of proficiency ids) + +List of starting proficiency ids. + +Example: +```json +"proficiencies": [ "prof_knapping" ] +``` + Mods can modify this list (requires `"edit-mode": "modify"`, see example) via "add:skills" and "remove:skills", removing requires only the skill id. Example: ```C++ { @@ -1016,6 +1033,14 @@ Mods can modify this via `add:traits` and `remove:traits`. [ "survival", 1 ], [ "fabrication", 2 ] ], +"proficiencies" : [ // The proficiencies related to this recipe + { + "proficiency": "prof_knapping", // The id of a proficiency + "required": false, // Whether or not you must have the proficiency to craft it. Incompatible with `time_multiplier` + "time_multiplier": 2.0 // The multiplier on time taken to craft this recipe if you do not have this proficiency + "fail_multiplier": 2.5 // The multiplier on failure chance when crafting without this proficiency. Defaults to 2.5. Multiple proficiencies will multiply this value. (if all have the default, it's fail_multiplier ^ n, where n is the number of proficiencies that are lacked) + } +] "batch_time_factors": [25, 15], // Optional factors for batch crafting time reduction. First number specifies maximum crafting time reduction as percentage, and the second number the minimal batch size to reach that number. In this example given batch size of 20 the last 6 crafts will take only 3750 time units. "flags": [ // A set of strings describing boolean features of the recipe "BLIND_EASY", @@ -1531,6 +1556,39 @@ it is present to help catch errors. | STAMINA | Trigger depends of the stamina value. | TIME | Trigger depends of the time of the day. [ 1am = 1, Midnight = 24 ] +### Traps + +```C++ + "type": "trap", + "id": "tr_beartrap", // Unique ID + "name": "bear trap", // In-game name displayed + "color": "blue", + "symbol": "^", + "visibility": 2, // 1 to ??, affects detection + "avoidance": 7, // 0 to ??, affects avoidance + "difficulty": 3, // 0 to ??, difficulty of assembly & disassembly + "trap_radius": 1, // 0 to ??, trap radius + "action": "blade", + "map_regen": "microlab_shifting_hall", // a valid overmap id, for map_regen action traps + "benign": true, + "always_invisible": true, + "funnel_radius": 200, // milimiters? + "comfort": 4, + "floor_bedding_warmth": -500, + "spell_data": { "id": "bear_trap" }, // data required for trapfunc::spell() + "trigger_weight": "200 g", // If an item with this weight or more is thrown onto the trap, it triggers. TODO: what is the default? + "drops": [ "beartrap" ], // For disassembly? + "vehicle_data": { + "damage": 300, + "sound_volume": 8, + "sound": "SNAP!", + "sound_type": "trap", + "sound_variant": "bear_trap", + "remove_trap": true, + "spawn_items": [ "beartrap" ] + } +``` + ### Vehicle Groups @@ -1690,8 +1748,8 @@ See also VEHICLE_JSON.md "phase": "solid", // (Optional, default = "solid") What phase it is "weight": "350 g", // Weight, weight in grams, mg and kg can be used - "50 mg", "5 g" or "5 kg". For stackable items (ammo, comestibles) this is the weight per charge. "volume": "250 ml", // Volume, volume in ml and L can be used - "50 ml" or "2 L". For stackable items (ammo, comestibles) this is the volume of stack_size charges. -"integral_volume": 0, // Volume added to base item when item is integrated into another (eg. a gunmod integrated to a gun). Volume in ml and L can be used - "50 ml" or "2 L". -"integral_weight": 0, // Weight added to base item when item is integrated into another (eg. a gunmod integrated to a gun) +"integral_volume": "50 ml", // Volume added to base item when item is integrated into another (eg. a gunmod integrated to a gun). Volume in ml and L can be used - "50 ml" or "2 L". Default is the same as volume. +"integral_weight": "50 g", // Weight added to base item when item is integrated into another (eg. a gunmod integrated to a gun). Default is the same as weight. "longest_side": "15 cm", // Length of longest item dimension. Default is cube root of volume. "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 @@ -1769,7 +1827,6 @@ Armor can be defined like this: ... // same entries as above for the generic item. // additional some armor specific entries: "covers" : ["FEET"], // Where it covers. Possible options are TORSO, HEAD, EYES, MOUTH, ARMS, HANDS, LEGS, FEET -"storage" : 0, // (Optional, default = 0) How many volume storage slots it adds "warmth" : 10, // (Optional, default = 0) How much warmth clothing provides "environmental_protection" : 0, // (Optional, default = 0) How much environmental protection it affords "encumbrance" : 0, // Base encumbrance (unfitted value) @@ -1787,7 +1844,6 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it ... // same entries as for the type (e.g. same entries as for any tool), "armor_data" : { // additionally the same armor data like above "covers" : ["FEET"], - "storage" : 0, "warmth" : 10, "environmental_protection" : 0, "encumbrance" : 0, @@ -1804,7 +1860,6 @@ Pet armor can be defined like this: "type" : "PET_ARMOR", // Defines this as armor ... // same entries as above for the generic item. // additional some armor specific entries: -"storage" : 0, // (Optional, default = 0) How many volume storage slots it adds "environmental_protection" : 0, // (Optional, default = 0) How much environmental protection it affords "material_thickness" : 1, // Thickness of material, in millimeter units (approximately). Generally ranges between 1 - 5, more unusual armor types go up to 10 or more "pet_bodytype": // the body type of the pet that this monster will fit. See MONSTERS.md @@ -1817,7 +1872,6 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "pet_armor_data" : { // additionally the same armor data like above - "storage" : 0, "environmental_protection" : 0, "pet_bodytype": "dog", "max_pet_vol": "35000 ml", @@ -1992,6 +2046,7 @@ Any Item can be a container. To add the ability to contain things to an item, yo "fire_protection": false, // Default false. If true, the pocket protects the contained items from exploding if tossed into a fire. "ammo_restriction": { "ammotype": count }, // Restrict pocket to a given ammo type and count. This overrides mandatory volume and weight to use the given ammo type instead. A pocket can contain any number of unique ammotypes each with different counts, and the container will only hold one type (as of now). If this is left out, it will be empty. "flag_restriction": [ "FLAG1", "FLAG2" ], // Items can only be placed into this pocket if they have a flag that matches one of these flags. + "item_restriction": [ "item_id" ], // Only these item IDs can be placed into this pocket. Overrides ammo and flag restrictions. "sealed_data": { "spoil_multiplier": 0.0 } // Having anything in sealed_data means the pocket cannot be resealed. The sealed version of the pocket will override the unsealed version of the same datatype. } @@ -2044,7 +2099,7 @@ Guns can be defined like this: "reload": 450, // Amount of time to reload, 100 = 1 second = 1 "turn" "built_in_mods": ["m203"], //An array of mods that will be integrated in the weapon using the IRREMOVABLE tag. "default_mods": ["m203"] //An array of mods that will be added to a weapon on spawn. -"barrel_length": "30 mL", // Amount of volume lost when the barrel is sawn. Approximately 250 ml per inch is a decent approximation. +"barrel_volume": "30 mL", // Amount of volume lost when the barrel is sawn. Approximately 250 ml per inch is a decent approximation. "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ] ], // The valid locations for gunmods and the mount of slots for that location. ``` Alternately, every item (book, tool, armor, even food) can be used as gun if it has gun_data: @@ -2410,7 +2465,8 @@ The contents of use_action fields can either be a string indicating a built-in f "friendly_msg": "Good!", // (optional) message when the monster is programmed properly and it's friendly. "place_randomly": true, // if true: places the monster randomly around the player, if false: let the player decide where to put it (default: false) "skills": [ "unarmed", "throw" ], // (optional) array of skill IDs. Higher skill level means more likely to place a friendly monster. - "moves": 60 // how many move points the action takes. + "moves": 60, // how many move points the action takes. + "is_pet": false // specifies if the spawned monster is a pet. The monster will only spawn as a pet if it is spawned as friendly, hostile monsters will never be pets. }, "use_action": { "type": "place_npc", // place npc of specific class on the map @@ -2539,7 +2595,7 @@ The contents of use_action fields can either be a string indicating a built-in f "limb_power" : 10, // How much hp to restore when healing limbs? Mandatory value "head_power" : 7, // How much hp to restore when healing head? If unset, defaults to 0.8 * limb_power. "torso_power" : 15, // How much hp to restore when healing torso? If unset, defaults to 1.5 * limb_power. - "bleed" : 0.4, // Chance to remove bleed effect. + "bleed" : 4, // How many bleed effect intensity levels can be reduced by it. Base value. "bite" : 0.95, // Chance to remove bite effect. "infect" : 0.1, // Chance to remove infected effect. "move_cost" : 250, // Cost in moves to use the item. @@ -3048,7 +3104,7 @@ A flat multiplier on the harvest count of the plant. For numbers greater than on "restricted": true, // (optional) If true, clothing must list this mod's flag in "valid_mods" list to use it. Defaults to false. "mod_value": [ // List of mod effect. { - "type": "bash", // "bash", "cut", "bullet", "fire", "acid", "warmth", "storage", and "encumbrance" is available. + "type": "bash", // "bash", "cut", "bullet", "fire", "acid", "warmth", and "encumbrance" is available. "value": 1, // value of effect. "round_up": false // (optional) round up value of effect. defaults to false. "proportion": [ // (optional) value of effect propotions to clothing's parameter. @@ -3414,6 +3470,7 @@ Setting of sprite sheets. Same as `tiles-new` field in `tile_config`. Sprite fil { "name": "shadow", // name of this level of intensity "light_override": 3.7 } //light level on the tile occupied by this field will be set at 3.7 not matter the ambient light. ], + "decrease_intensity_on_contact": true, // Decrease the field intensity by one each time a character walk on it. "bash": { "str_min": 1, // lower bracket of bashing damage required to bash "str_max": 3, // higher bracket diff --git a/doc/MODDING.md b/doc/MODDING.md index 12f4312c6519f..47e528138edef 100644 --- a/doc/MODDING.md +++ b/doc/MODDING.md @@ -13,6 +13,7 @@ A mod is created by creating a folder within Cataclysm's `data/mods` directory. The modinfo.json file is a file that contains metadata for your mod. Every mod must have a `modinfo.json` file in order for Cataclysm to find it. A barebones `modinfo.json` file looks like this: ````json +[ { "type": "MOD_INFO", "ident": "Mod_ID", @@ -22,6 +23,7 @@ A barebones `modinfo.json` file looks like this: "category": "content", "dependencies": [ "dda" ] } +] ```` The `category` attribute denotes where the mod will appear in the mod selection menu. These are the available categories to choose from, with some examples chosen from mods that existed when this document was written. Pick whichever one applies best to your mod when writing your modinfo file. - `content` - A mod that adds a lot of stuff. Typically reserved for very large mods or complete game overhauls (eg: Core game files, Aftershock) @@ -199,6 +201,23 @@ The format is as follows: Valid values for `subtype` are `whitelist` and `blacklist`. `scenarios` is an array of the scenario ids that you want to blacklist or whitelist. +### Adding dialogue to existing NPCs + +You can't edit existing dialog, but you can add new dialogue by adding a new response that can kick off new dialogue and missions. Here is a working example from DinoMod: + +```json + { + "type": "talk_topic", + "id": "TALK_REFUGEE_BEGGAR_2_WEARING", + "responses": [ + { + "text": "Yes. I ask because I noticed there are dinosaurs around. Do you know anything about that?", + "topic": "TALK_REFUGEE_BEGGAR_2_DINO2" + } + ] + } +``` + ## Important note on json files The following characters: `[ { , } ] : "` are *very* important when adding or modifying JSON files. This means a single missing `,` or `[` or `}` can be the difference between a working file and a hanging game at startup. diff --git a/doc/NPCs.md b/doc/NPCs.md index 6248dce2a2aaa..b7c40527e44cc 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -426,7 +426,7 @@ Effect | Description `u_add_trait: trait_string`
`npc_add_trait: trait_string` | Your character or the NPC will gain the trait. `u_lose_effect: effect_string`
`npc_lose_effect: effect_string` | Your character or the NPC will lose the effect if they have it. `u_lose_trait: trait_string`
`npc_lose_trait: trait_string` | Your character or the NPC will lose the trait. -`u_add_var, npc_add_var`: `var_name, type: type_str`, `context: context_str`, `value: value_str` | Your character or the NPC will store `value_str` as a variable that can be later retrieved by `u_has_var` or `npc_has_var`. `npc_add_var` can be used to store arbitrary local variables, and `u_add_var` can be used to store arbitrary "global" variables, and should be used in preference to setting effects. +`u_add_var, npc_add_var`: `var_name, type: type_str`, `context: context_str`, either `value: value_str` or `time: true` | Your character or the NPC will store `value_str` as a variable that can be later retrieved by `u_has_var` or `npc_has_var`. `npc_add_var` can be used to store arbitrary local variables, and `u_add_var` can be used to store arbitrary "global" variables, and should be used in preference to setting effects. If `time` is used instead of `value_str`, then the current turn of the game is stored. `u_lose_var`, `npc_lose_var`: `var_name`, `type: type_str`, `context: context_str` | Your character or the NPC will clear any stored variable that has the same `var_name`, `type_str`, and `context_str`. `u_adjust_var, npc_adjust_var`: `var_name, type: type_str`, `context: context_str`, `adjustment: adjustment_num` | Your character or the NPC will adjust the stored variable by `adjustment_num`. `barber_hair` | Opens a menu allowing the player to choose a new hair style. @@ -554,6 +554,7 @@ Condition | Type | Description `"u_has_any_trait"`
`"npc_has_any_trait"` | array | `true` if the player character or NPC has any trait or mutation in the array. Used to check multiple specific traits. `"u_has_var"`, `"npc_has_var"` | string | `"type": type_str`, `"context": context_str`, and `"value": value_str` are required fields in the same dictionary as `"u_has_var"` or `"npc_has_var"`.
`true` is the player character or NPC has a variable set by `"u_add_var"` or `"npc_add_var"` with the string, `type_str`, `context_str`, and `value_str`. `"u_compare_var"`, `"npc_compare_var"` | dictionary | `"type": type_str`, `"context": context_str`, `"op": op_str`, `"value": value_num` are required fields, referencing a var as in `"u_add_var"` or `"npc_add_var"`.
`true` if the player character or NPC has a stored variable that is true for the provided operator `op_str` (one of `==`, `!=`, `<`, `>`, `<=`, `>=`) and value. +`"u_compare_time_since_var"`, `"npc_compare_time_since_var_"` | dictionary | `"type": type_str`, `"context": context_str`, `"op": op_str`, `"time": time_string` are required fields, referencing a var as in `"u_add_var"` or `"npc_add_var"`.
`true` if the player character or NPC has a stored variable and the current turn and that value (converted to a time point) plus the time_string is true for the provided operator `op_str` (one of `==`, `!=`, `<`, `>`, `<=`, `>=`). *example*: `{ "u_compare_time_since_var": "test", "type": "test", "context": "var_time_test", "op": ">", "time": "3 days" }` returns true if the player character has a "test", "test", "var_time_test" variable and the current turn is greater than that value plus 3 days' worth of turns. `"u_has_strength"`
`"npc_has_strength"` | int | `true` if the player character's or NPC's strength is at least the value of `u_has_strength` or `npc_has_strength`. `"u_has_dexterity"`
`"npc_has_dexterity"` | int | `true` if the player character's or NPC's dexterity is at least the value of `u_has_dexterity` or `npc_has_dexterity`. `"u_has_intelligence"`
`"npc_has_intelligence"` | int | `true` if the player character's or NPC's intelligence is at least the value of `u_has_intelligence` or `npc_has_intelligence`. diff --git a/doc/PROFICIENCY.md b/doc/PROFICIENCY.md new file mode 100644 index 0000000000000..859c401f5b28b --- /dev/null +++ b/doc/PROFICIENCY.md @@ -0,0 +1,19 @@ +# proficiency + +## definition + +```JSON +{ + "id": "prof_knapping", + "type": "proficiency", + "name": { "str": "Knapping" } +}, +``` +### `id` +Mandatory. The id of the proficiency. + +### `type` +Mandatory. Must be `proficiency`. + +### `name` +Mandatory. The name of the proficiency. diff --git a/doc/REGION_SETTINGS.md b/doc/REGION_SETTINGS.md index 4781f29931c00..584f7bb7c913c 100644 --- a/doc/REGION_SETTINGS.md +++ b/doc/REGION_SETTINGS.md @@ -494,6 +494,7 @@ The **weather** section defines the base weather attributes used for the region. | `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | | `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | | `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | +| `weather_types` | Ids of the weather types allowed in this region. When choosing weather they will be iterated over in the order they are listed and the last valid entry will be the weather. | ### Example @@ -507,7 +508,23 @@ The **weather** section defines the base weather attributes used for the region. "base_wind": 5.7, "base_wind_distrib_peaks": 30, "base_wind_season_variation": 64, - "base_acid": 0.0 + "base_acid": 0.0, + "weather_types": [ + "clear", + "sunny", + "cloudy", + "light_drizzle", + "drizzle", + "rain", + "thunder", + "lightning", + "acid_drizzle", + "acid_rain", + "flurries", + "snowing", + "snowstorm" + ] + }, } } ``` diff --git a/doc/TRANSLATING.md b/doc/TRANSLATING.md index 85af77c583d2b..5803eaa09144a 100644 --- a/doc/TRANSLATING.md +++ b/doc/TRANSLATING.md @@ -2,6 +2,7 @@ * [Translators](#translators) * [Getting Started](#getting-Started) + * [Glossary](#glossary) * [Grammatical gender](#grammatical-gender) * [Tips](#tips) * [Developers](#developers) @@ -87,6 +88,22 @@ Click on the "Save" button when you are satisfied with your translation. See [Transifex's documentation][3] for more information. +### Glossary + +This glossary is intended to help explain some CDDA-specific terms and their +etymology in order to help translations. + +* **Exodii**: The Exodii are a bunch of humans from another dimension. When + the Blob invaded their world, they managed to acquire enough technology to + open portals of their own, and now they portal to worlds that have been + attacked by the Blob and try to rescue survivors. Exodii is a horrible + mangling of "Exodus" - the word literally means leaving or going out and has + connotations of forced emigration and refugees. The Exodii are the people of + an Exodus. While Exodus is a Latin word and "ii" to indicate a plural is a + Latin thing, but this isn't actually the [correct Latin + plural](https://www.latin-is-simple.com/en/vocabulary/noun/9294/) for this + word. + ### Grammatical gender For NPC dialogue (and potentially other strings) some languages may wish to diff --git a/doc/VITAMIN.md b/doc/VITAMIN.md index 2abcb854a2708..f00cb5d98073b 100644 --- a/doc/VITAMIN.md +++ b/doc/VITAMIN.md @@ -38,7 +38,7 @@ This is some toxic chemical or component. This currently has no effect. This is a drug. This currently has no effect. #### `counter` -This is a counter for something, that is neither a toxin, vitamin, or drug. This currently has no effect. +This is a counter for something, that is neither a toxin, vitamin, or drug. ### `name` What the vitamin shows up as where vitamins are displayed, such as the vitamins display in the item menu. diff --git a/doc/WEATHER_TYPE.md b/doc/WEATHER_TYPE.md new file mode 100644 index 0000000000000..84af9e821ac1c --- /dev/null +++ b/doc/WEATHER_TYPE.md @@ -0,0 +1,167 @@ +## Weather_type + +Each weather type is a type of weather that occurs, its effects and what causes it. The only required entries are null and clear. + + +##Fields + +| Identifier | Description | +| ------------------------------ | --------------------------------------------------------------------- | +| `name` | UI name of weather type. | +| `color` | UI color of weather type. | +| `map_color` | Map color of weather type. | +| `glyph` | Map glyph of weather type. | +| `ranged_penalty` | Penalty to ranged attacks. | +| `sight_penalty` | Penalty to per-square visibility, applied in transparency map. | +| `light_modifier` | modification to ambient light. | +| `sound_attn` | Sound attenuation of a given weather type. | +| `dangerous` | If true, our activity gets interrupted. | +| `precip` | Amount of associated precipitation. Valid values are: none, very_light, light and heavy | +| `rains` | Whether said precipitation falls as rain. | +| `acidic` | Whether said precipitation is acidic. | +| `tiles_animation` | Optional, name of the tiles animation to use | +| `sound_category` | Optional, if playing sound effects what to use. Valid values are: silent, drizzle, rainy, thunder, flurries, + snowstorm and snow. | +| `sun_intensity` | Strength of the sun. Valid values are: none, light, normal, and high | +| `weather_animation` | Optional, Information controlling weather animations. Members: factor, color and glyph | +| `effects` | Array for the effects the weather has. Descibed in detail below +| `requirements` | Optional, is what determines what weather it is. All members are optional. + When checking what weather it is it loops through the entries in order and uses the last one to succeed. | + + `pressure_min` + `pressure_max` + `humidity_min` + `humidity_max` + `temperature_min` + `temperature_max` + `windpower_min` + `windpower_max` + | These are all minimum and maximum values for which the weather will occur. I.e it will only rain if its humid enough | + + `humidity_and_pressure` | if there are pressure and humidity requirements are they both required or just one | + `acidic` | does this require acidic precipitation | + `time` | Valid values are: day, night, and both. | + `required_weathers` | a string array of possible weathers it is at this point in the loop. i.e. rain can only happen if the conditions for clouds light drizzle or drizzle are present | + +### Example + +```json +{ + "id": "lightning", + "type": "weather_type", + "name": "Lightning Storm", + "color": "c_yellow", + "map_color": "h_yellow", + "glyph": "%", + "ranged_penalty": 4, + "sight_penalty": 1.25, + "light_modifier": -45, + "sound_attn": 8, + "dangerous": false, + "precip": "heavy", + "rains": true, + "acidic": false, + "effects": [ + { + "one_in_chance": 50, + "must_be_outside":false, + "sound_message": "You hear a distant rumble of thunder.", + "sound_effect": "thunder_far" + }, + { + "one_in_chance": 600, + "must_be_outside":false, + "message": "A flash of lightning illuminates your surroundings!.", + "sound_effect": "thunder_near", + "lightning":true + } + ], + "tiles_animation": "weather_rain_drop", + "weather_animation": { "factor": 0.04, "color": "c_light_blue", "glyph": "," }, + "sound_category": "thunder", + "sun_intensity": "none", + "requirements": { "pressure_max": 990, "required_weathers": [ "thunder" ] } + }, +``` +### Weather_effects + +Things that weather can cause to happen. + +##Fields + +| Identifier | Description | +| ------------------------------ | --------------------------------------------------------------------- | +| `message` | Optional: Message displayed when this effect happens. | +| `sound_message` | Optional: Message describing what you hear, will not display if deaf | +| `sound_effect` | Optional: Name of sound effect to play | +| `sound_message` | Optional: Message describing what you hear for this, will not display if deaf. | +| `must_be_outside` | Whether the effect only happens while you are outside. | +| `one_in_chance` | Optional: The chance of the event occuring is 1 in this value, if blank will always happen. | +| `time_between` | Optional: The time between instances of this effect occuring. If both this and one_in_chance are set will only happen when both are true. | +| `lightning` | Optional: Causes the world be bright at night and supercharge monster electric fields. | +| `rain_proof` | Optional: If rainproof, resistant gear will help against this | +| `pain_max` | Optional: If there is a threshold of pain at which this will stop happening. | +| `pain` | Optional: How much pain this causes. | +| `wet` | Optional: How much wet this causes. | +| `radiation` | Optional: How much radiation this causes. | +| `healthy` | Optional: How much healthy this adds or removes. | +| `effect_id` | Optional: String id of an effect to add. | +| `effect_duration` | Optional: How long the above effect will be added for, defaults to 1 second. | +| `target_part` | Optional: Bodypart that above effect or damage are applied to, if blank affects whole body. | +| `damage` | Optional: Hp bashing damage applied. | +| `spawns` | Optional: Array of spawns to cause. If spawns are selected but are unable to spawn the effect is cancelled. | +| `fields` | Optional: Array of fields to cause. Elements are discussed below | + + optional( weather_effect_jo, was_loaded, "", effect.lightning, false ); + ### Example + +```json + { + "must_be_outside":true, + "radiation":10, + "healthy":1, + "message":"Suddenly a something", + "add_effect":"bite", + "effect_duration":"10 minutes", + "target_part": "arm_l", + "damage":5, + "spawns": + [{ + "max_radius":10, + "min_radius":10, + "target":"mon_zombie_survivor_elite", + "hallucination_count":1, + "real_count":0 +}] +``` + ### spawn_type + +How many and what spawns + +##Fields + +| Identifier | Description | +| ------------------------------ | --------------------------------------------------------------------- | +| `max_radius` | Optional: The furthest away a spawn will happen. | +| `min_radius` | Optional: The closest a spawn will happen. | +| `hallucination_count` | Optional: Number of hallucinations of the target to spawn. | +| `real_count` | Optional: Number of real copies to spawn. | +| `target` | Optional: Monster id of target to spawn. If left blank a nearby monster will be used. | +| `target_range` | Optional: If target is left blank how far away to look for something to copy. | + + ### fields + +Fields to create what kind and where + +##Fields + +| Identifier | Description | +| ------------------------------ | --------------------------------------------------------------------- | +| `type` | The string id of the field. | +| `intensity` | Intensity of the field. | +| `age` | Age of the field. | +| `outdoor_only` | Optional: Defaults to true. If true field will only spawn outdoors. | +| `radius` | Optional: Radius around player the effect will spread, defaults to everywhere. | + + + diff --git a/gfx/UltimateCataclysmDemo/giant.png b/gfx/UltimateCataclysmDemo/giant.png index 45f379069c224..2c8dc0a9b2a3a 100644 Binary files a/gfx/UltimateCataclysmDemo/giant.png and b/gfx/UltimateCataclysmDemo/giant.png differ diff --git a/gfx/UltimateCataclysmDemo/large.png b/gfx/UltimateCataclysmDemo/large.png index f1f3c6402fb19..ee9ab1ca7fff2 100644 Binary files a/gfx/UltimateCataclysmDemo/large.png and b/gfx/UltimateCataclysmDemo/large.png differ diff --git a/gfx/UltimateCataclysmDemo/normal.png b/gfx/UltimateCataclysmDemo/normal.png index 28cf1b0d0ec06..cbc7a756646a4 100644 Binary files a/gfx/UltimateCataclysmDemo/normal.png and b/gfx/UltimateCataclysmDemo/normal.png differ diff --git a/gfx/UltimateCataclysmDemo/tall.png b/gfx/UltimateCataclysmDemo/tall.png index 6414703079b69..3aa0cecd810b7 100644 Binary files a/gfx/UltimateCataclysmDemo/tall.png and b/gfx/UltimateCataclysmDemo/tall.png differ diff --git a/gfx/UltimateCataclysmDemo/tile_config.json b/gfx/UltimateCataclysmDemo/tile_config.json index ffe0c7da8b823..08a580d2482dc 100644 --- a/gfx/UltimateCataclysmDemo/tile_config.json +++ b/gfx/UltimateCataclysmDemo/tile_config.json @@ -1 +1 @@ -{"tile_info": [{"width": 32, "height": 32}], "tiles-new": [{"file": "normal.png", "tiles": [{"id": "f_indoor_plant", "fg": 3}, {"id": "f_indoor_plant_y", "fg": 1}, {"id": ["f_indoor_plant_y_season_autumn", "f_indoor_plant_y_season_winter"], "fg": 2}, {"id": "f_recycle_bin", "fg": 4}, {"id": "f_armchair", "fg": 5}, {"id": "f_wreckage", "fg": 6}, {"id": "f_gunsafe_ml", "fg": 8}, {"id": "f_gunsafe_mj", "fg": 7}, {"id": "f_gun_safe_el", "fg": 9}, {"id": "f_mutpoppy", "fg": 10}, {"id": "f_planter_mature", "multitile": true, "fg": 13, "additional_tiles": [{"id": "center", "fg": 14}, {"id": "corner", "fg": [23, 26, 22, 16]}, {"id": "t_connection", "fg": [19, 18, 25, 15]}, {"id": "edge", "fg": [20, 21]}, {"id": "end_piece", "fg": [17, 12, 11, 24]}, {"id": "unconnected", "fg": 13}]}, {"id": "f_boulder_small", "fg": 27}, {"id": "f_dandelion", "fg": 28}, {"id": "f_planter", "multitile": true, "fg": 37, "additional_tiles": [{"id": "center", "fg": 32}, {"id": "corner", "fg": [42, 36, 39, 35]}, {"id": "t_connection", "fg": [29, 40, 44, 43]}, {"id": "edge", "fg": [41, 38]}, {"id": "end_piece", "fg": [33, 34, 30, 31]}, {"id": "unconnected", "fg": 37}]}, {"id": "f_bathtub", "multitile": true, "fg": 54, "additional_tiles": [{"id": "center", "fg": 55}, {"id": "corner", "fg": [53, 50, 48, 56]}, {"id": "t_connection", "fg": [60, 52, 51, 47]}, {"id": "edge", "fg": [59, 57]}, {"id": "end_piece", "fg": [45, 49, 46, 58]}, {"id": "unconnected", "fg": 54}]}, {"id": "f_sofa", "multitile": true, "fg": 65, "additional_tiles": [{"id": "center", "fg": 66}, {"id": "corner", "fg": [74, 69, 76, 62]}, {"id": "t_connection", "fg": [70, 68, 61, 63]}, {"id": "edge", "fg": [75, 73]}, {"id": "end_piece", "fg": [64, 67, 72, 71]}, {"id": "unconnected", "fg": 65}]}, {"id": "f_alien_anemone", "fg": 78}, {"id": "f_alien_table", "fg": 77}, {"id": "f_filing_cabinet", "fg": 79}, {"id": "f_toilet", "fg": 80}, {"id": "f_ash", "fg": 81}, {"id": "f_desk", "multitile": true, "fg": 82, "additional_tiles": [{"id": "center", "fg": 91}, {"id": "corner", "fg": [87, 84, 92, 86]}, {"id": "t_connection", "fg": [90, 89, 85, 95]}, {"id": "edge", "fg": [96, 83]}, {"id": "end_piece", "fg": [97, 94, 93, 88]}, {"id": "unconnected", "fg": 82}]}, {"id": "f_trashcan", "fg": 98}, {"id": "f_entertainment_center", "fg": 99}, {"id": "f_grave_stone", "fg": [{"weight": 1, "sprite": 100}, {"weight": 1, "sprite": 101}]}, {"id": "f_rubble", "fg": 102}, {"id": "f_rubble_rock", "fg": 103}, {"id": "f_sign", "fg": 104}, {"id": "f_flower_spurge", "fg": 105}, {"id": "f_planter_harvest", "multitile": true, "fg": 117, "additional_tiles": [{"id": "center", "fg": 110}, {"id": "corner", "fg": [115, 120, 111, 118]}, {"id": "t_connection", "fg": [112, 113, 121, 107]}, {"id": "edge", "fg": [106, 108]}, {"id": "end_piece", "fg": [116, 114, 109, 119]}, {"id": "unconnected", "fg": 117}]}, {"id": "f_cardboard_box", "fg": 122}, {"id": "f_datura", "fg": 123}, {"id": "f_planter_seedling", "multitile": true, "fg": 131, "additional_tiles": [{"id": "center", "fg": 132}, {"id": "corner", "fg": [134, 125, 136, 128]}, {"id": "t_connection", "fg": [124, 133, 130, 126]}, {"id": "edge", "fg": [139, 137]}, {"id": "end_piece", "fg": [127, 135, 129, 138]}, {"id": "unconnected", "fg": 131}]}, {"id": "f_table", "multitile": true, "fg": 140, "additional_tiles": [{"id": "center", "fg": 154}, {"id": "corner", "fg": [148, 151, 142, 152]}, {"id": "t_connection", "fg": [141, 147, 144, 153]}, {"id": "edge", "fg": [143, 150]}, {"id": "end_piece", "fg": [146, 149, 155, 145]}, {"id": "unconnected", "fg": 140}]}, {"id": "f_boulder_large", "fg": 156}, {"id": "f_flower_tulip", "fg": [{"weight": 1, "sprite": 158}, {"weight": 2, "sprite": 157}]}, {"id": "f_cupboard", "multitile": true, "fg": 174, "additional_tiles": [{"id": "center", "fg": 173}, {"id": "corner", "fg": [167, 164, 166, 160]}, {"id": "t_connection", "fg": [163, 172, 168, 169]}, {"id": "edge", "fg": [171, 162]}, {"id": "end_piece", "fg": [159, 161, 165, 170]}, {"id": "unconnected", "fg": 174}]}, {"id": "f_bluebell", "fg": [{"weight": 1, "sprite": 175}, {"weight": 2, "sprite": 176}]}, {"id": "f_bed", "multitile": true, "fg": 182, "additional_tiles": [{"id": "center", "fg": 178}, {"id": "corner", "fg": [188, 187, 181, 186]}, {"id": "t_connection", "fg": [190, 185, 191, 189]}, {"id": "edge", "fg": [192, 180]}, {"id": "end_piece", "fg": [177, 183, 179, 184]}, {"id": "unconnected", "fg": 182}]}, {"id": "f_firering", "fg": 193}, {"id": "f_bench", "multitile": true, "fg": 207, "additional_tiles": [{"id": "center", "fg": 200}, {"id": "corner", "fg": [203, 205, 197, 196]}, {"id": "t_connection", "fg": [194, 201, 204, 206]}, {"id": "edge", "fg": [198, 202]}, {"id": "end_piece", "fg": [208, 199, 209, 195]}, {"id": "unconnected", "fg": 207}]}, {"id": "f_mailbox", "fg": 210}, {"id": "f_grave_stone_old", "fg": [{"weight": 1, "sprite": 212}, {"weight": 1, "sprite": 211}]}, {"id": "f_rack_wood", "fg": 213}, {"id": "f_boulder_medium", "fg": 214}, {"id": "f_chamomile", "fg": 215}, {"id": "f_hay", "fg": 216}, {"id": "f_counter", "multitile": true, "fg": 223, "additional_tiles": [{"id": "center", "fg": 219}, {"id": "corner", "fg": [228, 220, 226, 224]}, {"id": "t_connection", "fg": [225, 218, 232, 227]}, {"id": "edge", "fg": [222, 221]}, {"id": "end_piece", "fg": [229, 231, 230, 217]}, {"id": "unconnected", "fg": 223}]}, {"id": "f_air_conditioner", "fg": 233}, {"id": "f_chair", "fg": 234}, {"id": "f_stool", "fg": 235}, {"id": "f_dahlia", "fg": [{"weight": 1, "sprite": 236}, {"weight": 2, "sprite": 237}]}, {"id": ["f_displaycase"], "fg": 238}, {"id": "f_rack", "fg": 239}, {"id": "vp_door_trunk", "fg": 240, "rotates": true, "multitile": true, "additional_tiles": [{"id": "open", "fg": 241}]}, {"id": ["vp_headlight", "vp_headlight_reinforced"], "fg": 242}, {"id": "vp_door", "fg": 243, "rotates": true, "multitile": true, "additional_tiles": [{"id": "open", "fg": 244}]}, {"id": "vp_halfboard_ne", "fg": 248, "rotates": true}, {"id": "vp_halfboard_sw", "fg": 250, "rotates": true}, {"id": "vp_halfboard_se", "fg": 245, "rotates": true}, {"id": "vp_halfboard_cover", "fg": 247, "rotates": true}, {"id": "vp_halfboard_vertical_2", "fg": 252, "rotates": true}, {"id": "vp_halfboard_horizontal_2", "fg": 249, "rotates": true}, {"id": "vp_halfboard_vertical", "fg": 246, "rotates": true}, {"id": "vp_halfboard_nw", "fg": 253, "rotates": true}, {"id": "vp_halfboard_horizontal", "fg": 251, "rotates": true}, {"id": "vp_windshield", "fg": 257, "rotates": true, "multitile": true, "additional_tiles": [{"id": "center", "fg": [254, 258, 255, 256]}, {"id": "edge", "fg": 257}, {"id": "unconnected", "fg": 257}, {"id": "end_piece", "fg": [254, 258, 255, 256]}, {"id": "t_connection", "fg": [254, 258, 255, 256]}, {"id": "corner", "fg": [254, 258, 255, 256]}]}, {"id": "powder_candy", "fg": 259}, {"id": "joint", "fg": 261}, {"id": "joint_lit", "fg": 262}, {"id": "joint_roach", "fg": 260}, {"id": "bag_canvas", "fg": 263}, {"id": "wood_panel", "fg": 264}, {"id": "jar_glass", "fg": 265}, {"id": "shot_hull", "fg": 266}, {"id": "wrench", "fg": 267}, {"id": "needle_bone", "fg": 270}, {"id": "needle_curved", "fg": 268}, {"id": "needle_wood", "fg": 269}, {"id": "pinecone", "fg": 271}, {"id": "ash", "fg": 272}, {"id": "lighter", "fg": [{"weight": 1, "sprite": 273}, {"weight": 1, "sprite": 275}, {"weight": 1, "sprite": 274}]}, {"id": "chips", "fg": 276}, {"id": "rifle_flintlock", "fg": 277}, {"id": "balclava", "fg": 301}, {"id": "beret", "fg": 290}, {"id": "boots", "fg": 317}, {"id": "boxer_briefs", "fg": 296}, {"id": "boxer_shorts", "fg": 282}, {"id": "boy_shorts", "fg": 287}, {"id": "bra", "fg": 309}, {"id": "briefs", "fg": 293}, {"id": "corset", "fg": 306}, {"id": "cowboy_hat", "fg": 318}, {"id": "dress_shoes", "fg": 286}, {"id": "hat_ball", "fg": 300}, {"id": "hat_cotton", "fg": 299}, {"id": "hat_fur", "fg": 303}, {"id": "hat_knit", "fg": 281}, {"id": "hat_noise_cancelling", "fg": 326}, {"id": "helmet_army", "fg": 284}, {"id": "helmet_barbute", "fg": 315}, {"id": "helmet_chitin", "fg": 278}, {"id": "helmet_kabuto", "fg": 314}, {"id": "hoodie", "fg": 313}, {"id": "jeans", "fg": 308}, {"id": "longshirt", "fg": 295}, {"id": "maid_dress", "fg": 280}, {"id": "maid_hat", "fg": 294}, {"id": "mask_dust", "fg": 305}, {"id": "panties", "fg": 291}, {"id": "pants", "fg": 288}, {"id": "pants_cargo", "fg": 302}, {"id": "polo_shirt", "fg": 310}, {"id": "ragpouch", "fg": 324}, {"id": "sneakers", "fg": 283}, {"id": "socks", "fg": 298}, {"id": "stockings", "fg": 289}, {"id": "sweater", "fg": 311}, {"id": "sweatshirt", "fg": 285}, {"id": "tank_top", "fg": 325}, {"id": "tshirt", "fg": 307}, {"id": "turban", "fg": 319}, {"id": "undershirt", "fg": 322}, {"id": "coat_lab", "fg": 321}, {"id": "coat_rain", "fg": 292}, {"id": "sports_bra", "fg": 297}, {"id": "skirt", "fg": 279}, {"id": "jacket_light", "fg": 312}, {"id": "jacket_army", "fg": 323}, {"id": "hat_hard", "fg": 320}, {"id": "striped_pants", "fg": 304}, {"id": "striped_shirt", "fg": 316}, {"id": "", "fg": []}, {"id": "bat_metal", "fg": 327}, {"id": "hacksaw", "fg": 328}, {"id": "crucible_clay", "fg": 329}, {"id": "many_years_old_newspaper", "fg": 334}, {"id": "months_old_newspaper", "fg": 330}, {"id": "newest_newspaper", "fg": 333}, {"id": "one_year_old_newspaper", "fg": 332}, {"id": "weeks_old_newspaper", "fg": 331}, {"id": "pointy_stick", "fg": 343}, {"id": "spear_wood", "fg": 342}, {"id": "spear_spike", "fg": 337}, {"id": "spear_knife", "fg": 340}, {"id": "spear_knife_superior", "fg": 341}, {"id": "spear_pipe", "fg": 335}, {"id": "spear_rebar", "fg": 339}, {"id": "spear_steel", "fg": 336}, {"id": "spear_copper", "fg": 338}, {"id": "hickory_root", "fg": 344}, {"id": "flashlight", "fg": 345}, {"id": "heavy_flashlight", "fg": 346}, {"id": "can_drink", "fg": 347}, {"id": "50_casing", "fg": 348}, {"id": "apple", "fg": 350}, {"id": "banana", "fg": 351}, {"id": "broccoli", "fg": 359}, {"id": "corn", "fg": 362}, {"id": "cucumber", "fg": 355}, {"id": "egg_bird", "fg": 361}, {"id": "grapes", "fg": 349}, {"id": "lemon", "fg": 352}, {"id": "onion", "fg": 360}, {"id": "orange", "fg": 354}, {"id": "pear", "fg": 356}, {"id": "potato", "fg": 353}, {"id": "pumpkin", "fg": 358}, {"id": "tomato", "fg": 357}, {"id": "sewing_kit", "fg": 363}, {"id": "jug_plastic", "fg": 364}, {"id": "pot", "fg": 365}, {"id": "backpack", "fg": 366}, {"id": "cattlefodder", "fg": 367}, {"id": "cup_plastic", "fg": 368}, {"id": "knife_meat_cleaver", "fg": 369}, {"id": "fire_ax", "fg": 370}, {"id": "ax", "fg": 372}, {"id": "hatchet", "fg": 371}, {"id": ["glock_17", "glock_19", "glock_18c", "glock_22", "glock_31"], "fg": 373}, {"id": "straw_pile", "fg": 374}, {"id": "thread", "fg": 375}, {"id": "wheat", "fg": 376}, {"id": "pan", "fg": 377}, {"id": "bottle_glass", "fg": 378}, {"id": "nail", "fg": 379}, {"id": "juniper", "fg": 380}, {"id": "pool_ball", "fg": 381}, {"id": "crowbar", "fg": 382}, {"id": "rag", "fg": 383}, {"id": "id_industrial", "fg": 384}, {"id": "corpse_generic_human", "fg": 385}, {"id": "chainsaw_off", "fg": 386}, {"id": "teapot", "fg": 387}, {"id": "mp5mag", "fg": 388}, {"id": "meat", "fg": 389}, {"id": "cig_butt", "fg": 390}, {"id": "usb_drive", "fg": 391}, {"id": "1st_aid", "fg": 392}, {"id": "welder_crude", "fg": 393}, {"id": "nailbat", "fg": 394}, {"id": "remington_870", "fg": 395}, {"id": "sheet_metal_small", "fg": 396}, {"id": "screwdriver", "fg": 397}, {"id": "primitive_hammer", "fg": 398}, {"id": "steel_lump", "fg": 399}, {"id": "string_6", "fg": 400}, {"id": "saw", "fg": 401}, {"id": "aspirin", "fg": 417}, {"id": "bandages", "fg": 403}, {"id": "syringe", "fg": 409}, {"id": "antibiotics", "fg": 416}, {"id": "weak_antibiotic", "fg": 402}, {"id": "strong_antibiotic", "fg": 410}, {"id": "vitamins", "fg": 407}, {"id": "gummy_vitamins", "fg": 408}, {"id": "calcium_tablet", "fg": 413}, {"id": "oxycodone", "fg": 411}, {"id": "tramadol", "fg": 412}, {"id": "codeine", "fg": 406}, {"id": "prussian_blue", "fg": 405}, {"id": "iodine", "fg": 414}, {"id": "antiparasitic", "fg": 415}, {"id": "antifungal", "fg": 404}, {"id": "can_drink_unsealed", "fg": 418}, {"id": "9mm_casing", "fg": 419}, {"id": "wrapper", "fg": 420}, {"id": "rebar", "fg": 421}, {"id": "glass_shard", "fg": 422}, {"id": "pot_copper", "fg": 423}, {"id": "40mm_casing", "fg": 424}, {"id": "nailboard", "fg": 425}, {"id": "scissors", "fg": 426}, {"id": "ak74", "fg": 427}, {"id": "coffeemaker", "fg": 428}, {"id": "blanket", "fg": 430}, {"id": "down_blanket", "fg": 429}, {"id": "longbow", "fg": 431}, {"id": "pneumatic_shotgun", "fg": 432}, {"id": "thermos", "fg": 433}, {"id": "box_cigarette", "fg": 434}, {"id": "m79", "fg": 435}, {"id": "stick", "fg": 436}, {"id": "steel_chunk", "fg": 437}, {"id": "television", "fg": 438}, {"id": "shovel", "fg": 439}, {"id": "id_science", "fg": 440}, {"id": "cable", "fg": 441}, {"id": "pipe", "fg": 442}, {"id": "bottle_plastic", "fg": 443}, {"id": "fp_loyalty_card", "fg": 444}, {"id": "id_military", "fg": 445}, {"id": "water", "fg": 447}, {"id": "water_clean", "fg": 448}, {"id": "blood", "fg": 446}, {"id": "filter_air", "fg": 449}, {"id": "welder", "fg": 450}, {"id": "broom", "fg": 451}, {"id": "rolling_pin", "fg": 452}, {"id": "makeshift_crowbar", "fg": 453}, {"id": "bat", "fg": 454}, {"id": "wood_sheet", "fg": 455}, {"id": "jar_3l_glass_sealed", "fg": 456}, {"id": "plastic_sheet", "fg": 457}, {"id": "box_large", "fg": 458}, {"id": "knife_vegetable_cleaver", "fg": 459}, {"id": "arming_sword", "fg": 460}, {"id": "crossbow", "fg": 461}, {"id": "pot_canning", "fg": 462}, {"id": "sheet_metal", "fg": 463}, {"id": "brick", "fg": 464}, {"id": "wire", "fg": 465}, {"id": "2x4", "fg": 466}, {"id": ["seed_hops", "seed_blackberries", "seed_blueberries", "coffee_pod", "seed_wheat", "roasted_coffee_bean", "seed_chamomile", "coffee_bean", "seed_celery", "fried_seeds", "seed_buckwheat", "seed_oats", "seed_mushroom_morel", "datura_seed", "seed_mushroom", "seed_rhubarb", "seed_wild_herbs", "seed_raw_dandelion", "seed_veggy_wild", "seed_chili_pepper", "seed_dogbane", "seed_mugwort", "seed_bee_balm", "seed_flower", "seed_sunflower", "seed_thyme", "seed_canola", "seed_pumpkin", "seed_beans", "seed_lentils", "soybean_seed", "marloss_seed", "fungal_seeds", "seed_weed", "seed_potato_raw", "seed_cucumber", "seed_corn", "seed_carrot", "garlic_clove", "seed_cactus", "seed_wildcarrot", "seed_cattail", "seed_chicory", "seed_salsify_raw", "seed_dahlia", "seed_garlic", "seed_broccoli", "seed_onion", "seed_zucchini", "seed_cotton_boll", "seed_tomato", "seed_rose", "seed_lettuce", "seed_cabbage", "seed_sugar_beet", "seed_tobacco", "seed_barley", "seed_grapes", "seed_strawberries", "seed_raspberries", "seed_cranberries", "seed_huckleberries", "seed_mulberries", "seed_elderberries"], "fg": 467}, {"id": "acorns", "fg": 468}, {"id": "slingshot", "fg": 469}, {"id": "bottle_plastic_small", "fg": 470}, {"id": "sharp_rock", "fg": 471}, {"id": "bowl_plastic", "fg": 472}, {"id": "contacts", "fg": 473}, {"id": "matches", "fg": 474}, {"id": "box_small", "fg": 475}, {"id": "plastic_shopping_bag", "fg": 476}, {"id": "pillow", "fg": 478}, {"id": "down_pillow", "fg": 477}, {"id": "mop", "fg": 479}, {"id": "board_trap", "fg": 480}, {"id": "can_food", "fg": 481}, {"id": "scrap", "fg": 482}, {"id": "string_36", "fg": 483}, {"id": "file", "fg": 484}, {"id": "box_medium", "fg": 485}, {"id": "paperback_novel", "fg": 507}, {"id": "novel_adventure", "fg": 507}, {"id": "novel_buddy", "fg": 500}, {"id": "novel_coa", "fg": 489}, {"id": "novel_coa2", "fg": 490}, {"id": "novel_crime", "fg": 493}, {"id": "novel_crime2", "fg": 501}, {"id": "novel_drama", "fg": 497}, {"id": "novel_erotic", "fg": 505}, {"id": "novel_experimental", "fg": 496}, {"id": "novel_fantasy", "fg": 502}, {"id": "novel_horror", "fg": 503}, {"id": "novel_mystery", "fg": 506}, {"id": "novel_pulp", "fg": 494}, {"id": "novel_road", "fg": 491}, {"id": "novel_romance", "fg": 488}, {"id": "novel_samurai", "fg": 486}, {"id": "novel_satire", "fg": 498}, {"id": "novel_scifi", "fg": 510}, {"id": "novel_sports", "fg": 509}, {"id": "novel_spy", "fg": 511}, {"id": "novel_swash", "fg": 499}, {"id": "novel_thriller", "fg": 504}, {"id": "novel_tragedy", "fg": 495}, {"id": "novel_war", "fg": 508}, {"id": "novel_war2", "fg": 492}, {"id": "novel_western", "fg": 487}, {"id": "marble", "fg": 512}, {"id": "withered", "fg": 513}, {"id": "bolt_cf", "fg": 514}, {"id": "bolt_explosive", "fg": 522}, {"id": "bolt_metal", "fg": 517}, {"id": ["bolt_steel", "bolt_steel_bodkin", "bolt_steel_target"], "fg": 521}, {"id": ["bolt_wood", "bolt_crude", "bolt_simple_wood", "bolt_simple_small_game", "bolt_makeshift", "bolt_wood_bodkin", "bolt_wood_small_game"], "fg": 531}, {"id": "arrow_cf", "fg": 520}, {"id": "arrow_exploding", "fg": 515}, {"id": "arrow_field_point_fletched", "fg": 524}, {"id": "arrow_fire_hardened_fletched", "fg": 530}, {"id": "arrow_flammable", "fg": 528}, {"id": "arrow_flamming", "fg": 519}, {"id": "arrow_heavy_fire_hardened_fletched", "fg": 529}, {"id": "arrow_metal", "fg": 523}, {"id": "arrow_metal_sharpened_fletched", "fg": 516}, {"id": "arrow_plastic", "fg": 525}, {"id": "arrow_small_game_fletched", "fg": 526}, {"id": "arrow_wood", "fg": 527}, {"id": "arrow_wood_heavy", "fg": 518}, {"id": "rock", "fg": 532}, {"id": "knife_butcher", "fg": 533}, {"id": "stick_long", "fg": 534}, {"id": "log", "fg": 535}, {"id": "jar_glass_sealed", "fg": 536}, {"id": "jar_3l_glass", "fg": 537}, {"id": "knife_butter", "fg": 538}, {"id": "223_casing", "fg": 539}, {"id": "bwirebat", "fg": 540}, {"id": "bag_plastic", "fg": 541}, {"id": ["rifle_9mm", "rifle_3006", "rifle_45", "rifle_22", "rifle_40", "rifle_44", "rifle_38", "rifle_223"], "fg": 542}, {"id": "pipe_shotgun", "fg": 543}, {"id": "spoon", "fg": 544}, {"id": "hammer", "fg": 545}, {"id": "hickory_nut", "fg": 546}, {"id": "glass_plate", "fg": 547}, {"id": "cash_card", "fg": 548}, {"id": "fork", "fg": 549}, {"id": "splinter", "fg": 550}, {"id": "ar15", "fg": 551}, {"id": "pine_bough", "fg": 552}, {"id": "bag_zipper", "fg": 553}, {"id": "tailors_kit", "fg": 554}, {"id": "sponge", "fg": 555}, {"id": "t_strconc_floor", "multitile": true, "fg": 571, "additional_tiles": [{"id": "center", "fg": 568}, {"id": "corner", "fg": [556, 563, 565, 561]}, {"id": "t_connection", "fg": [557, 562, 566, 559]}, {"id": "edge", "fg": [567, 569]}, {"id": "end_piece", "fg": [570, 558, 564, 560]}, {"id": "unconnected", "fg": 571}]}, {"id": "t_tatami", "fg": [{"weight": 100, "sprite": 573}, {"weight": 100, "sprite": 572}]}, {"id": "t_floor_waxed_y", "multitile": true, "fg": 579, "additional_tiles": [{"id": "center", "fg": 585}, {"id": "corner", "fg": [582, 574, 578, 588]}, {"id": "t_connection", "fg": [580, 576, 587, 575]}, {"id": "edge", "fg": [583, 586]}, {"id": "end_piece", "fg": [584, 577, 581, 589]}, {"id": "unconnected", "fg": 579}]}, {"id": "t_pit_shallow", "fg": 590, "bg": [{"weight": 100, "sprite": 1233}, {"weight": 100, "sprite": 1235}]}, {"id": "t_pit_shallow_season_summer", "fg": 590, "bg": [{"weight": 100, "sprite": 1240}, {"weight": 100, "sprite": 1229}]}, {"id": "t_pit_shallow_season_autumn", "fg": 590, "bg": [{"weight": 100, "sprite": 1234}, {"weight": 100, "sprite": 1228}]}, {"id": "t_rock", "fg": 591}, {"id": "t_railroad_rubble", "fg": 592}, {"id": "t_gravel", "fg": 592}, {"id": "t_railroad_rubble_season_winter", "fg": 643}, {"id": "t_sand", "fg": 593}, {"id": "t_sand_season_winter", "fg": 643}, {"id": "t_floor_resin", "multitile": true, "fg": 596, "additional_tiles": [{"id": "center", "fg": 595}, {"id": "corner", "fg": [601, 608, 602, 598]}, {"id": "t_connection", "fg": [600, 594, 604, 603]}, {"id": "edge", "fg": [609, 597]}, {"id": "end_piece", "fg": [606, 607, 605, 599]}, {"id": "unconnected", "fg": 596}]}, {"id": "t_metal_floor", "multitile": true, "fg": 617, "additional_tiles": [{"id": "center", "fg": 611}, {"id": "corner", "fg": [619, 615, 613, 614]}, {"id": "t_connection", "fg": [625, 620, 622, 624]}, {"id": "edge", "fg": [623, 621]}, {"id": "end_piece", "fg": [610, 616, 612, 618]}, {"id": "unconnected", "fg": 617}]}, {"id": ["t_door_metal_locked", "t_door_metal_pickable"], "fg": 626}, {"id": "t_wall_b", "multitile": true, "fg": 630, "additional_tiles": [{"id": "center", "fg": 628}, {"id": "corner", "fg": [641, 634, 640, 632]}, {"id": "t_connection", "fg": [638, 633, 642, 636]}, {"id": "edge", "fg": [627, 629]}, {"id": "end_piece", "fg": [635, 631, 639, 637]}, {"id": "unconnected", "fg": 630}]}, {"id": "t_floor", "multitile": true, "fg": 655, "additional_tiles": [{"id": "center", "fg": 652}, {"id": "corner", "fg": [657, 654, 650, 658]}, {"id": "t_connection", "fg": [656, 645, 651, 659]}, {"id": "edge", "fg": [647, 648]}, {"id": "end_piece", "fg": [653, 649, 660, 646]}, {"id": "unconnected", "fg": 655}]}, {"id": "t_brick_wall", "multitile": true, "fg": 674, "additional_tiles": [{"id": "center", "fg": 676}, {"id": "corner", "fg": [666, 668, 667, 672]}, {"id": "t_connection", "fg": [662, 670, 673, 675]}, {"id": "edge", "fg": [669, 661]}, {"id": "end_piece", "fg": [664, 665, 671, 663]}, {"id": "unconnected", "fg": 674}]}, {"id": "t_wall_wood", "multitile": true, "fg": 684, "additional_tiles": [{"id": "center", "fg": 680}, {"id": "corner", "fg": [677, 686, 690, 688]}, {"id": "t_connection", "fg": [685, 692, 679, 682]}, {"id": "edge", "fg": [678, 689]}, {"id": "end_piece", "fg": [691, 681, 687, 683]}, {"id": "unconnected", "fg": 684}]}, {"id": ["t_linoleum_white", "t_linoleum_white_no_roof"], "multitile": true, "fg": 696, "additional_tiles": [{"id": "center", "fg": 708}, {"id": "corner", "fg": [703, 702, 693, 707]}, {"id": "t_connection", "fg": [695, 705, 701, 704]}, {"id": "edge", "fg": [706, 700]}, {"id": "end_piece", "fg": [694, 697, 699, 698]}, {"id": "unconnected", "fg": 696}]}, {"id": "t_fungus", "multitile": true, "fg": 721, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 716}, {"id": "corner", "bg": 1233, "fg": [718, 722, 710, 711]}, {"id": "t_connection", "bg": 1233, "fg": [723, 709, 715, 717]}, {"id": "edge", "bg": 1233, "fg": [719, 713]}, {"id": "end_piece", "bg": 1233, "fg": [720, 712, 724, 714]}, {"bg": 1233, "id": "unconnected", "fg": 721}]}, {"id": "t_fungus_season_summer", "multitile": true, "fg": 721, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 716}, {"id": "corner", "bg": 1240, "fg": [718, 722, 710, 711]}, {"id": "t_connection", "bg": 1240, "fg": [723, 709, 715, 717]}, {"id": "edge", "bg": 1240, "fg": [719, 713]}, {"id": "end_piece", "bg": 1240, "fg": [720, 712, 724, 714]}, {"bg": 1240, "id": "unconnected", "fg": 721}]}, {"id": "t_fungus_season_autumn", "multitile": true, "fg": 721, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 716}, {"id": "corner", "bg": 1234, "fg": [718, 722, 710, 711]}, {"id": "t_connection", "bg": 1234, "fg": [723, 709, 715, 717]}, {"id": "edge", "bg": 1234, "fg": [719, 713]}, {"id": "end_piece", "bg": 1234, "fg": [720, 712, 724, 714]}, {"bg": 1234, "id": "unconnected", "fg": 721}]}, {"id": "t_fungus_season_winter", "multitile": true, "fg": 721, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": 716}, {"id": "corner", "bg": 643, "fg": [718, 722, 710, 711]}, {"id": "t_connection", "bg": 643, "fg": [723, 709, 715, 717]}, {"id": "edge", "bg": 643, "fg": [719, 713]}, {"id": "end_piece", "bg": 643, "fg": [720, 712, 724, 714]}, {"bg": 643, "id": "unconnected", "fg": 721}]}, {"id": "t_carpet_red", "multitile": true, "fg": 735, "additional_tiles": [{"id": "center", "fg": 732}, {"id": "corner", "fg": [734, 730, 733, 736]}, {"id": "t_connection", "fg": [727, 731, 726, 737]}, {"id": "edge", "fg": [725, 740]}, {"id": "end_piece", "fg": [738, 739, 729, 728]}, {"id": "unconnected", "fg": 735}]}, {"id": ["t_water_moving_sh", "t_swater_moving_sh"], "multitile": true, "fg": 743, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 742}, {"id": "corner", "bg": 1233, "fg": [754, 741, 745, 747]}, {"id": "t_connection", "bg": 1233, "fg": [756, 748, 746, 755]}, {"id": "edge", "bg": 1233, "fg": [751, 752]}, {"id": "end_piece", "bg": 1233, "fg": [753, 744, 749, 750]}, {"bg": 1233, "id": "unconnected", "fg": 743}]}, {"id": ["t_water_moving_sh_season_summer", "t_swater_moving_sh_season_summer"], "multitile": true, "fg": 743, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 742}, {"id": "corner", "bg": 1240, "fg": [754, 741, 745, 747]}, {"id": "t_connection", "bg": 1240, "fg": [756, 748, 746, 755]}, {"id": "edge", "bg": 1240, "fg": [751, 752]}, {"id": "end_piece", "bg": 1240, "fg": [753, 744, 749, 750]}, {"bg": 1240, "id": "unconnected", "fg": 743}]}, {"id": ["t_water_moving_sh_season_autumn", "t_swater_moving_sh_season_autumn"], "multitile": true, "fg": 743, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 742}, {"id": "corner", "bg": 1234, "fg": [754, 741, 745, 747]}, {"id": "t_connection", "bg": 1234, "fg": [756, 748, 746, 755]}, {"id": "edge", "bg": 1234, "fg": [751, 752]}, {"id": "end_piece", "bg": 1234, "fg": [753, 744, 749, 750]}, {"bg": 1234, "id": "unconnected", "fg": 743}]}, {"id": ["t_water_moving_sh_season_winter", "t_swater_moving_sh_season_winter"], "multitile": true, "fg": 743, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": 742}, {"id": "corner", "bg": 643, "fg": [754, 741, 745, 747]}, {"id": "t_connection", "bg": 643, "fg": [756, 748, 746, 755]}, {"id": "edge", "bg": 643, "fg": [751, 752]}, {"id": "end_piece", "bg": 643, "fg": [753, 744, 749, 750]}, {"bg": 643, "id": "unconnected", "fg": 743}]}, {"id": ["t_window", "t_window_alarm"], "fg": 758}, {"id": "t_window_empty", "fg": 762}, {"id": "t_window_domestic", "fg": 761}, {"id": "t_window_open", "fg": 760}, {"id": "t_window_no_curtains", "fg": 759}, {"id": "t_window_no_curtains_open", "fg": 757}, {"id": "t_fence_wire", "multitile": true, "fg": 771, "additional_tiles": [{"id": "center", "fg": 768}, {"id": "corner", "fg": [772, 769, 775, 777]}, {"id": "t_connection", "fg": [774, 767, 770, 763]}, {"id": "edge", "fg": [776, 773]}, {"id": "end_piece", "fg": [765, 766, 764, 778]}, {"id": "unconnected", "fg": 771}]}, {"id": "t_fence_barbed_season_spring", "multitile": true, "fg": 784, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 781}, {"id": "corner", "bg": 1233, "fg": [780, 793, 791, 794]}, {"id": "t_connection", "bg": 1233, "fg": [786, 782, 788, 789]}, {"id": "edge", "bg": 1233, "fg": [792, 787]}, {"id": "end_piece", "bg": 1233, "fg": [783, 779, 785, 790]}, {"bg": 1233, "id": "unconnected", "fg": 784}]}, {"id": "t_fence_barbed_season_summer", "multitile": true, "fg": 784, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 781}, {"id": "corner", "bg": 1240, "fg": [780, 793, 791, 794]}, {"id": "t_connection", "bg": 1240, "fg": [786, 782, 788, 789]}, {"id": "edge", "bg": 1240, "fg": [792, 787]}, {"id": "end_piece", "bg": 1240, "fg": [783, 779, 785, 790]}, {"bg": 1240, "id": "unconnected", "fg": 784}]}, {"id": "t_fence_barbed_season_autumn", "multitile": true, "fg": 784, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 781}, {"id": "corner", "bg": 1234, "fg": [780, 793, 791, 794]}, {"id": "t_connection", "bg": 1234, "fg": [786, 782, 788, 789]}, {"id": "edge", "bg": 1234, "fg": [792, 787]}, {"id": "end_piece", "bg": 1234, "fg": [783, 779, 785, 790]}, {"bg": 1234, "id": "unconnected", "fg": 784}]}, {"id": "t_fence_barbed_season_winter", "multitile": true, "fg": 784, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": 781}, {"id": "corner", "bg": 643, "fg": [780, 793, 791, 794]}, {"id": "t_connection", "bg": 643, "fg": [786, 782, 788, 789]}, {"id": "edge", "bg": 643, "fg": [792, 787]}, {"id": "end_piece", "bg": 643, "fg": [783, 779, 785, 790]}, {"bg": 643, "id": "unconnected", "fg": 784}]}, {"id": "t_floor_waxed", "multitile": true, "fg": 800, "additional_tiles": [{"id": "center", "fg": 809}, {"id": "corner", "fg": [802, 797, 798, 803]}, {"id": "t_connection", "fg": [807, 796, 806, 799]}, {"id": "edge", "fg": [805, 795]}, {"id": "end_piece", "fg": [808, 804, 801, 810]}, {"id": "unconnected", "fg": 800}]}, {"id": "t_curtains", "fg": 811}, {"id": "t_door_glass_c", "fg": 812}, {"id": ["t_wall_glass", "t_wall_glass_alarm"], "multitile": true, "fg": 814, "additional_tiles": [{"id": "center", "fg": 821}, {"id": "corner", "fg": [828, 825, 816, 831]}, {"id": "t_connection", "fg": [829, 819, 818, 824]}, {"id": "edge", "fg": [813, 817]}, {"id": "end_piece", "fg": [815, 827, 832, 820]}, {"id": "unconnected", "fg": 814}]}, {"id": ["t_sidewalk", "t_sidewalk_bg_dp"], "multitile": true, "fg": 846, "additional_tiles": [{"id": "center", "fg": 833}, {"id": "corner", "fg": [834, 848, 835, 839]}, {"id": "t_connection", "fg": [837, 836, 845, 843]}, {"id": "edge", "fg": [842, 847]}, {"id": "end_piece", "fg": [841, 838, 840, 844]}, {"id": "unconnected", "fg": 846}]}, {"id": "t_sidewalk_season_winter", "fg": 643}, {"id": "t_carpet_purple", "multitile": true, "fg": 855, "additional_tiles": [{"id": "center", "fg": 853}, {"id": "corner", "fg": [858, 860, 849, 852]}, {"id": "t_connection", "fg": [862, 864, 856, 854]}, {"id": "edge", "fg": [861, 863]}, {"id": "end_piece", "fg": [857, 859, 851, 850]}, {"id": "unconnected", "fg": 855}]}, {"id": ["t_shrub_raspberry"], "fg": 865, "bg": 1233}, {"id": ["t_shrub_raspberry_harvested"], "fg": 868, "bg": 1240}, {"id": "t_shrub_raspberry_season_summer", "fg": 867, "bg": 1240}, {"id": "t_shrub_raspberry_season_autumn", "fg": 865, "bg": 1234}, {"id": "t_shrub_raspberry_season_winter", "fg": 866, "bg": 644}, {"id": "t_woodchips", "fg": 869}, {"id": "t_woodchips_season_winter", "fg": 643}, {"id": "t_fence_post_season_spring", "fg": 880, "bg": 1233}, {"id": "t_fence_post_season_summer", "fg": 880, "bg": 1240}, {"id": "t_fence_post_season_autumn", "fg": 880, "bg": 1234}, {"id": "t_fence_post_season_winter", "fg": 880, "bg": 643}, {"id": "t_fence_season_spring", "multitile": true, "fg": 880, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 879}, {"id": "corner", "bg": 1233, "fg": [873, 871, 874, 881]}, {"id": "t_connection", "bg": 1233, "fg": [883, 872, 884, 885]}, {"id": "edge", "bg": 1233, "fg": [882, 886]}, {"id": "end_piece", "bg": 1233, "fg": [877, 876, 887, 875]}, {"bg": 1233, "id": "unconnected", "fg": 880}]}, {"id": "t_fence_season_summer", "multitile": true, "fg": 880, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 879}, {"id": "corner", "bg": 1240, "fg": [873, 871, 874, 881]}, {"id": "t_connection", "bg": 1240, "fg": [883, 872, 884, 885]}, {"id": "edge", "bg": 1240, "fg": [882, 886]}, {"id": "end_piece", "bg": 1240, "fg": [877, 876, 887, 875]}, {"bg": 1240, "id": "unconnected", "fg": 880}]}, {"id": "t_fence_season_autumn", "multitile": true, "fg": 880, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 879}, {"id": "corner", "bg": 1234, "fg": [873, 871, 874, 881]}, {"id": "t_connection", "bg": 1234, "fg": [883, 872, 884, 885]}, {"id": "edge", "bg": 1234, "fg": [882, 886]}, {"id": "end_piece", "bg": 1234, "fg": [877, 876, 887, 875]}, {"bg": 1234, "id": "unconnected", "fg": 880}]}, {"id": "t_fence_season_winter", "multitile": true, "fg": 880, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": 879}, {"id": "corner", "bg": 643, "fg": [873, 871, 874, 881]}, {"id": "t_connection", "bg": 643, "fg": [883, 872, 884, 885]}, {"id": "edge", "bg": 643, "fg": [882, 886]}, {"id": "end_piece", "bg": 643, "fg": [877, 876, 887, 875]}, {"bg": 643, "id": "unconnected", "fg": 880}]}, {"id": "t_fencegate_c_season_spring", "fg": 870, "bg": 1233}, {"id": "t_fencegate_c_season_summer", "fg": 870, "bg": 1240}, {"id": "t_fencegate_c_season_autumn", "fg": 870, "bg": 1234}, {"id": "t_fencegate_c_season_winter", "fg": 870, "bg": 643}, {"id": "t_fencegate_o_season_spring", "fg": 878, "bg": 1233}, {"id": "t_fencegate_o_season_summer", "fg": 878, "bg": 1240}, {"id": "t_fencegate_o_season_autumn", "fg": 878, "bg": 1234}, {"id": "t_fencegate_o_season_winter", "fg": 878, "bg": 643}, {"id": "t_wall_y", "multitile": true, "fg": 902, "additional_tiles": [{"id": "center", "fg": 903}, {"id": "corner", "fg": [896, 900, 895, 889]}, {"id": "t_connection", "fg": [893, 898, 892, 897]}, {"id": "edge", "fg": [894, 899]}, {"id": "end_piece", "fg": [890, 891, 901, 888]}, {"id": "unconnected", "fg": 902}]}, {"id": "t_rdoor_c", "fg": 905}, {"id": "t_rdoor_o", "fg": 906}, {"id": "t_rdoor_b", "fg": 904}, {"id": ["t_gates_mech_control"], "fg": 909, "bg": 939}, {"id": ["t_gates_mech_control_lab"], "fg": 911, "bg": 939}, {"id": ["t_gates_control_concrete"], "fg": 908, "bg": 982}, {"id": ["t_gates_control_concrete_lab"], "fg": 911, "bg": 2374}, {"id": ["t_gates_control_brick"], "fg": 908, "bg": 674}, {"id": ["t_gates_control_brick_lab"], "fg": 911, "bg": 674}, {"id": ["t_gates_control_metal"], "fg": 908, "bg": 2382}, {"id": ["t_gates_control_metal_lab"], "fg": 911, "bg": 2382}, {"id": ["t_elevator_control"], "fg": 907, "bg": 939}, {"id": ["t_elevator_control_off"], "fg": 910, "bg": 939}, {"id": ["t_stump"], "fg": 912, "bg": 1233}, {"id": ["t_stump_season_summer"], "fg": 912, "bg": 1240}, {"id": ["t_stump_season_autumn"], "fg": 912, "bg": 1234}, {"id": "t_stump_season_winter", "fg": 912, "bg": 644}, {"id": ["t_water_moving_dp", "t_swater_moving_dp"], "multitile": true, "fg": 916, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 915}, {"id": "corner", "bg": 1233, "fg": [921, 918, 917, 922]}, {"id": "t_connection", "bg": 1233, "fg": [923, 928, 925, 927]}, {"id": "edge", "bg": 1233, "fg": [920, 919]}, {"id": "end_piece", "bg": 1233, "fg": [924, 913, 914, 926]}, {"bg": 1233, "id": "unconnected", "fg": 916}]}, {"id": ["t_water_moving_dp_season_summer", "t_swater_moving_dp_season_summer"], "multitile": true, "fg": 916, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 915}, {"id": "corner", "bg": 1240, "fg": [921, 918, 917, 922]}, {"id": "t_connection", "bg": 1240, "fg": [923, 928, 925, 927]}, {"id": "edge", "bg": 1240, "fg": [920, 919]}, {"id": "end_piece", "bg": 1240, "fg": [924, 913, 914, 926]}, {"bg": 1240, "id": "unconnected", "fg": 916}]}, {"id": ["t_water_moving_dp_season_autumn", "t_swater_moving_dp_season_autumn"], "multitile": true, "fg": 916, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 915}, {"id": "corner", "bg": 1234, "fg": [921, 918, 917, 922]}, {"id": "t_connection", "bg": 1234, "fg": [923, 928, 925, 927]}, {"id": "edge", "bg": 1234, "fg": [920, 919]}, {"id": "end_piece", "bg": 1234, "fg": [924, 913, 914, 926]}, {"bg": 1234, "id": "unconnected", "fg": 916}]}, {"id": ["t_water_moving_dp_season_winter", "t_swater_moving_dp_season_winter"], "multitile": true, "fg": 916, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": 915}, {"id": "corner", "bg": 643, "fg": [921, 918, 917, 922]}, {"id": "t_connection", "bg": 643, "fg": [923, 928, 925, 927]}, {"id": "edge", "bg": 643, "fg": [920, 919]}, {"id": "end_piece", "bg": 643, "fg": [924, 913, 914, 926]}, {"bg": 643, "id": "unconnected", "fg": 916}]}, {"id": "t_thconc_floor", "multitile": true, "fg": 938, "additional_tiles": [{"id": "center", "fg": 939}, {"id": "corner", "fg": [935, 933, 943, 934]}, {"id": "t_connection", "fg": [940, 936, 929, 937]}, {"id": "edge", "fg": [942, 944]}, {"id": "end_piece", "fg": [932, 931, 941, 930]}, {"id": "unconnected", "fg": 938}]}, {"id": "t_carpet_green", "multitile": true, "fg": 955, "additional_tiles": [{"id": "center", "fg": 950}, {"id": "corner", "fg": [946, 956, 954, 952]}, {"id": "t_connection", "fg": [948, 949, 947, 951]}, {"id": "edge", "fg": [960, 953]}, {"id": "end_piece", "fg": [958, 957, 959, 945]}, {"id": "unconnected", "fg": 955}]}, {"id": "t_door_lab_c", "fg": 962}, {"id": "t_door_lab_o", "fg": 961}, {"id": "t_dirtfloor", "multitile": true, "fg": 977, "additional_tiles": [{"id": "center", "fg": 971}, {"id": "corner", "fg": [972, 976, 969, 975]}, {"id": "t_connection", "fg": [974, 966, 978, 965]}, {"id": "edge", "fg": [968, 973]}, {"id": "end_piece", "fg": [970, 967, 963, 964]}, {"id": "unconnected", "fg": 977}]}, {"id": "t_concrete_wall", "multitile": true, "fg": 982, "additional_tiles": [{"id": "center", "fg": 986}, {"id": "corner", "fg": [994, 985, 993, 984]}, {"id": "t_connection", "fg": [989, 979, 987, 983]}, {"id": "edge", "fg": [992, 981]}, {"id": "end_piece", "fg": [991, 988, 990, 980]}, {"id": "unconnected", "fg": 982}]}, {"id": "t_wall_w", "multitile": true, "fg": 996, "additional_tiles": [{"id": "center", "fg": 1006}, {"id": "corner", "fg": [1010, 1002, 1005, 998]}, {"id": "t_connection", "fg": [997, 1009, 999, 995]}, {"id": "edge", "fg": [1000, 1007]}, {"id": "end_piece", "fg": [1008, 1004, 1001, 1003]}, {"id": "unconnected", "fg": 996}]}, {"id": "t_rock_wall", "multitile": true, "fg": 1011, "additional_tiles": [{"id": "center", "fg": 1020}, {"id": "corner", "fg": [1015, 1023, 1012, 1013]}, {"id": "t_connection", "fg": [1016, 1025, 1026, 1022]}, {"id": "edge", "fg": [1014, 1021]}, {"id": "end_piece", "fg": [1017, 1018, 1019, 1024]}, {"id": "unconnected", "fg": 1011}]}, {"id": "t_rock_floor", "multitile": true, "fg": 1034, "additional_tiles": [{"id": "center", "fg": 1038}, {"id": "corner", "fg": [1036, 1042, 1041, 1040]}, {"id": "t_connection", "fg": [1027, 1032, 1035, 1030]}, {"id": "edge", "fg": [1029, 1028]}, {"id": "end_piece", "fg": [1039, 1037, 1033, 1031]}, {"id": "unconnected", "fg": 1034}]}, {"id": "t_grass_tall", "multitile": true, "fg": 1054, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 1052}, {"id": "corner", "bg": 1233, "fg": [1046, 1050, 1056, 1049]}, {"id": "t_connection", "bg": 1233, "fg": [1048, 1044, 1053, 1057]}, {"id": "edge", "bg": 1233, "fg": [1047, 1045]}, {"id": "end_piece", "bg": 1233, "fg": [1051, 1043, 1055, 1058]}, {"bg": 1233, "id": "unconnected", "fg": 1054}]}, {"id": "t_grass_tall_season_summer", "multitile": true, "fg": 1062, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 1069}, {"id": "corner", "bg": 1240, "fg": [1067, 1071, 1074, 1059]}, {"id": "t_connection", "bg": 1240, "fg": [1066, 1073, 1065, 1070]}, {"id": "edge", "bg": 1240, "fg": [1060, 1072]}, {"id": "end_piece", "bg": 1240, "fg": [1061, 1063, 1064, 1068]}, {"bg": 1240, "id": "unconnected", "fg": 1062}]}, {"id": "t_grass_tall_season_autumn", "multitile": true, "fg": 1088, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 1082}, {"id": "corner", "bg": 1234, "fg": [1075, 1090, 1078, 1080]}, {"id": "t_connection", "bg": 1234, "fg": [1086, 1081, 1083, 1085]}, {"id": "edge", "bg": 1234, "fg": [1076, 1077]}, {"id": "end_piece", "bg": 1234, "fg": [1089, 1087, 1084, 1079]}, {"bg": 1234, "id": "unconnected", "fg": 1088}]}, {"id": "t_grass_tall_season_winter", "fg": 644}, {"id": "f_grass_tall", "multitile": true, "fg": 1054, "additional_tiles": [{"id": "center", "fg": 1052}, {"id": "corner", "fg": [1046, 1050, 1056, 1049]}, {"id": "t_connection", "fg": [1048, 1044, 1053, 1057]}, {"id": "edge", "fg": [1047, 1045]}, {"id": "end_piece", "fg": [1051, 1043, 1055, 1058]}, {"id": "unconnected", "fg": 1054}]}, {"id": "f_grass_tall_summer", "multitile": true, "fg": 1062, "additional_tiles": [{"id": "center", "fg": 1069}, {"id": "corner", "fg": [1067, 1071, 1074, 1059]}, {"id": "t_connection", "fg": [1066, 1073, 1065, 1070]}, {"id": "edge", "fg": [1060, 1072]}, {"id": "end_piece", "fg": [1061, 1063, 1064, 1068]}, {"id": "unconnected", "fg": 1062}]}, {"id": "f_grass_tall_autumn", "multitile": true, "fg": 1088, "additional_tiles": [{"id": "center", "fg": 1082}, {"id": "corner", "fg": [1075, 1090, 1078, 1080]}, {"id": "t_connection", "fg": [1086, 1081, 1083, 1085]}, {"id": "edge", "fg": [1076, 1077]}, {"id": "end_piece", "fg": [1089, 1087, 1084, 1079]}, {"id": "unconnected", "fg": 1088}]}, {"id": "t_grass_long", "multitile": true, "fg": 1096, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 1102}, {"id": "corner", "bg": 1233, "fg": [1097, 1100, 1091, 1095]}, {"id": "t_connection", "bg": 1233, "fg": [1098, 1103, 1092, 1106]}, {"id": "edge", "bg": 1233, "fg": [1104, 1094]}, {"id": "end_piece", "bg": 1233, "fg": [1099, 1093, 1105, 1101]}, {"bg": 1233, "id": "unconnected", "fg": 1096}]}, {"id": "t_grass_long_season_autumn", "multitile": true, "fg": 1122, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 1115}, {"id": "corner", "bg": 1234, "fg": [1114, 1121, 1120, 1117]}, {"id": "t_connection", "bg": 1234, "fg": [1108, 1107, 1112, 1119]}, {"id": "edge", "bg": 1234, "fg": [1110, 1113]}, {"id": "end_piece", "bg": 1234, "fg": [1109, 1116, 1111, 1118]}, {"bg": 1234, "id": "unconnected", "fg": 1122}]}, {"id": "t_grass_long_season_summer", "multitile": true, "fg": 1135, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 1132}, {"id": "corner", "bg": 1240, "fg": [1136, 1129, 1125, 1130]}, {"id": "t_connection", "bg": 1240, "fg": [1128, 1133, 1134, 1127]}, {"id": "edge", "bg": 1240, "fg": [1138, 1126]}, {"id": "end_piece", "bg": 1240, "fg": [1124, 1131, 1137, 1123]}, {"bg": 1240, "id": "unconnected", "fg": 1135}]}, {"id": "t_grass_long_season_winter", "fg": 644}, {"id": "f_grass_long", "multitile": true, "fg": 1096, "additional_tiles": [{"id": "center", "fg": 1102}, {"id": "corner", "fg": [1097, 1100, 1091, 1095]}, {"id": "t_connection", "fg": [1098, 1103, 1092, 1106]}, {"id": "edge", "fg": [1104, 1094]}, {"id": "end_piece", "fg": [1099, 1093, 1105, 1101]}, {"id": "unconnected", "fg": 1096}]}, {"id": ["t_shrub_lilac"], "fg": 1142, "bg": 1233}, {"id": ["t_shrub_lilac_harvested"], "fg": 1139, "bg": 1233}, {"id": "t_shrub_lilac_season_summer", "fg": 1141, "bg": 1240}, {"id": "t_shrub_lilac_season_autumn", "fg": 1139, "bg": 1234}, {"id": "t_shrub_lilac_season_winter", "fg": 1140, "bg": 644}, {"id": "t_elevator", "fg": [{"weight": 100, "sprite": 1143}, {"weight": 100, "sprite": 1144}]}, {"id": "t_moss", "fg": 1145}, {"id": "t_moss_season_winter", "fg": 644}, {"id": "t_scrap_floor", "multitile": true, "fg": 1155, "additional_tiles": [{"id": "center", "fg": 1152}, {"id": "corner", "fg": [1150, 1157, 1146, 1161]}, {"id": "t_connection", "fg": [1149, 1160, 1148, 1151]}, {"id": "edge", "fg": [1159, 1153]}, {"id": "end_piece", "fg": [1156, 1147, 1158, 1154]}, {"id": "unconnected", "fg": 1155}]}, {"id": "t_grass_dead", "multitile": true, "fg": 1176, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 1172}, {"id": "corner", "bg": 1233, "fg": [1177, 1168, 1169, 1164]}, {"id": "t_connection", "bg": 1233, "fg": [1171, 1166, 1174, 1165]}, {"id": "edge", "bg": 1233, "fg": [1163, 1170]}, {"id": "end_piece", "bg": 1233, "fg": [1175, 1162, 1167, 1173]}, {"bg": 1233, "id": "unconnected", "fg": 1176}]}, {"id": "t_grass_dead_season_summer", "multitile": true, "fg": 1176, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 1172}, {"id": "corner", "bg": 1240, "fg": [1177, 1168, 1169, 1164]}, {"id": "t_connection", "bg": 1240, "fg": [1171, 1166, 1174, 1165]}, {"id": "edge", "bg": 1240, "fg": [1163, 1170]}, {"id": "end_piece", "bg": 1240, "fg": [1175, 1162, 1167, 1173]}, {"bg": 1240, "id": "unconnected", "fg": 1176}]}, {"id": "t_grass_dead_season_autumn", "multitile": true, "fg": 1176, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 1172}, {"id": "corner", "bg": 1234, "fg": [1177, 1168, 1169, 1164]}, {"id": "t_connection", "bg": 1234, "fg": [1171, 1166, 1174, 1165]}, {"id": "edge", "bg": 1234, "fg": [1163, 1170]}, {"id": "end_piece", "bg": 1234, "fg": [1175, 1162, 1167, 1173]}, {"bg": 1234, "id": "unconnected", "fg": 1176}]}, {"id": "t_grass_dead_season_winter", "fg": 643}, {"id": ["t_water_sh", "t_swater_sh"], "multitile": true, "fg": 1190, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": [{"weight": 1, "sprite": 1186}, {"weight": 1, "sprite": 1193}, {"weight": 1, "sprite": 1188}]}, {"id": "corner", "bg": 1233, "fg": [1181, 1184, 1195, 1192]}, {"id": "t_connection", "bg": 1233, "fg": [1182, 1187, 1191, 1194]}, {"id": "edge", "bg": 1233, "fg": [1180, 1183]}, {"id": "end_piece", "bg": 1233, "fg": [1179, 1185, 1178, 1189]}, {"bg": 1233, "id": "unconnected", "fg": 1190}]}, {"id": ["t_water_sh_season_summer", "t_swater_sh_season_summer"], "multitile": true, "fg": 1190, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": [{"weight": 1, "sprite": 1186}, {"weight": 1, "sprite": 1193}, {"weight": 1, "sprite": 1188}]}, {"id": "corner", "bg": 1240, "fg": [1181, 1184, 1195, 1192]}, {"id": "t_connection", "bg": 1240, "fg": [1182, 1187, 1191, 1194]}, {"id": "edge", "bg": 1240, "fg": [1180, 1183]}, {"id": "end_piece", "bg": 1240, "fg": [1179, 1185, 1178, 1189]}, {"bg": 1240, "id": "unconnected", "fg": 1190}]}, {"id": ["t_water_sh_season_autumn", "t_swater_sh_season_autumn"], "multitile": true, "fg": 1190, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": [{"weight": 1, "sprite": 1186}, {"weight": 1, "sprite": 1193}, {"weight": 1, "sprite": 1188}]}, {"id": "corner", "bg": 1234, "fg": [1181, 1184, 1195, 1192]}, {"id": "t_connection", "bg": 1234, "fg": [1182, 1187, 1191, 1194]}, {"id": "edge", "bg": 1234, "fg": [1180, 1183]}, {"id": "end_piece", "bg": 1234, "fg": [1179, 1185, 1178, 1189]}, {"bg": 1234, "id": "unconnected", "fg": 1190}]}, {"id": ["t_water_sh_season_winter", "t_swater_sh_season_winter"], "multitile": true, "fg": 1190, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": [{"weight": 1, "sprite": 1186}, {"weight": 1, "sprite": 1193}, {"weight": 1, "sprite": 1188}]}, {"id": "corner", "bg": 643, "fg": [1181, 1184, 1195, 1192]}, {"id": "t_connection", "bg": 643, "fg": [1182, 1187, 1191, 1194]}, {"id": "edge", "bg": 643, "fg": [1180, 1183]}, {"id": "end_piece", "bg": 643, "fg": [1179, 1185, 1178, 1189]}, {"bg": 643, "id": "unconnected", "fg": 1190}]}, {"id": "t_reinforced_glass", "multitile": true, "fg": 1207, "additional_tiles": [{"id": "center", "fg": 1198}, {"id": "corner", "fg": [1211, 1206, 1201, 1205]}, {"id": "t_connection", "fg": [1208, 1209, 1200, 1204]}, {"id": "edge", "fg": [1197, 1210]}, {"id": "end_piece", "fg": [1203, 1202, 1196, 1199]}, {"id": "unconnected", "fg": 1207}]}, {"id": "t_carpet_yellow", "multitile": true, "fg": 1213, "additional_tiles": [{"id": "center", "fg": 1226}, {"id": "corner", "fg": [1212, 1221, 1224, 1217]}, {"id": "t_connection", "fg": [1227, 1215, 1214, 1220]}, {"id": "edge", "fg": [1219, 1225]}, {"id": "end_piece", "fg": [1223, 1222, 1218, 1216]}, {"id": "unconnected", "fg": 1213}]}, {"id": "t_dirt", "fg": [{"weight": 100, "sprite": 1233}, {"weight": 70, "sprite": 1235}, {"weight": 30, "sprite": 1239}, {"weight": 30, "sprite": 1230}, {"weight": 10, "sprite": 1237}, {"weight": 20, "sprite": 1231}, {"weight": 20, "sprite": 1232}, {"weight": 10, "sprite": 1236}, {"weight": 10, "sprite": 1238}], "bg": [{"weight": 100, "sprite": 1233}, {"weight": 200, "sprite": 1235}]}, {"id": "t_dirt_season_summer", "fg": [{"weight": 100, "sprite": 1240}, {"weight": 100, "sprite": 1229}, {"weight": 30, "sprite": 1239}, {"weight": 30, "sprite": 1230}, {"weight": 10, "sprite": 1237}, {"weight": 12, "sprite": 1231}, {"weight": 12, "sprite": 1232}, {"weight": 7, "sprite": 1236}, {"weight": 6, "sprite": 1238}], "bg": [{"weight": 100, "sprite": 1240}, {"weight": 100, "sprite": 1229}]}, {"id": "t_dirt_season_autumn", "fg": [{"weight": 100, "sprite": 1234}, {"weight": 100, "sprite": 1228}, {"weight": 30, "sprite": 1239}, {"weight": 30, "sprite": 1230}, {"weight": 10, "sprite": 1237}, {"weight": 6, "sprite": 1231}, {"weight": 6, "sprite": 1232}, {"weight": 6, "sprite": 1236}, {"weight": 4, "sprite": 1238}], "bg": [{"weight": 100, "sprite": 1234}, {"weight": 100, "sprite": 1228}]}, {"id": "t_dirt_season_winter", "fg": 643}, {"id": "t_door_metal_c_peep", "fg": 1241}, {"id": "t_shrub", "fg": 1242, "bg": 1233}, {"id": "t_shrub_season_summer", "fg": 1242, "bg": 1240}, {"id": "t_shrub_season_autumn", "fg": 1242, "bg": 1234}, {"id": "t_shrub_season_winter", "fg": 1243, "bg": 644}, {"id": "t_pit", "fg": 1244, "bg": [{"weight": 100, "sprite": 1233}, {"weight": 100, "sprite": 1235}]}, {"id": "t_pit_season_summer", "fg": 1244, "bg": [{"weight": 100, "sprite": 1240}, {"weight": 100, "sprite": 1229}]}, {"id": "t_pit_season_autumn", "fg": 1244, "bg": [{"weight": 100, "sprite": 1234}, {"weight": 100, "sprite": 1228}]}, {"id": "t_door_c", "fg": 1245}, {"id": "t_door_locked", "fg": 1247}, {"id": "t_door_o", "fg": 1246}, {"id": "t_door_b", "fg": 1248}, {"id": "t_scrap_wall", "multitile": true, "fg": 1263, "additional_tiles": [{"id": "center", "fg": 1260}, {"id": "corner", "fg": [1250, 1264, 1262, 1265]}, {"id": "t_connection", "fg": [1255, 1258, 1254, 1252]}, {"id": "edge", "fg": [1253, 1257]}, {"id": "end_piece", "fg": [1259, 1251, 1249, 1256]}, {"id": "unconnected", "fg": 1263}]}, {"id": "t_clay", "multitile": true, "fg": 1270, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": 1277}, {"id": "corner", "bg": 1233, "fg": [1272, 1267, 1269, 1278]}, {"id": "t_connection", "bg": 1233, "fg": [1280, 1279, 1271, 1275]}, {"id": "edge", "bg": 1233, "fg": [1266, 1268]}, {"id": "end_piece", "bg": 1233, "fg": [1276, 1281, 1274, 1273]}, {"bg": 1233, "id": "unconnected", "fg": 1270}]}, {"id": "t_clay_season_summer", "multitile": true, "fg": 1270, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 1277}, {"id": "corner", "bg": 1240, "fg": [1272, 1267, 1269, 1278]}, {"id": "t_connection", "bg": 1240, "fg": [1280, 1279, 1271, 1275]}, {"id": "edge", "bg": 1240, "fg": [1266, 1268]}, {"id": "end_piece", "bg": 1240, "fg": [1276, 1281, 1274, 1273]}, {"bg": 1240, "id": "unconnected", "fg": 1270}]}, {"id": "t_clay_season_autumn", "multitile": true, "fg": 1270, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 1277}, {"id": "corner", "bg": 1234, "fg": [1272, 1267, 1269, 1278]}, {"id": "t_connection", "bg": 1234, "fg": [1280, 1279, 1271, 1275]}, {"id": "edge", "bg": 1234, "fg": [1266, 1268]}, {"id": "end_piece", "bg": 1234, "fg": [1276, 1281, 1274, 1273]}, {"bg": 1234, "id": "unconnected", "fg": 1270}]}, {"id": "t_clay_season_winter", "fg": 643}, {"id": ["t_shrub_hydrangea"], "fg": 1284, "bg": 1233}, {"id": ["t_shrub_hydrangea_harvested"], "fg": 1285, "bg": 1233}, {"id": "t_shrub_hydrangea_season_summer", "fg": 1282, "bg": 1240}, {"id": "t_shrub_hydrangea_season_autumn", "fg": 1284, "bg": 1234}, {"id": "t_shrub_hydrangea_season_winter", "fg": 1283, "bg": 644}, {"id": "t_bars", "fg": 1286}, {"id": ["t_shrub_grape"], "fg": 1290, "bg": 1233}, {"id": ["t_shrub_grape_harvested"], "fg": 1287, "bg": 1240}, {"id": "t_shrub_grape_season_summer", "fg": 1289, "bg": 1240}, {"id": "t_shrub_grape_season_autumn", "fg": 1290, "bg": 1234}, {"id": "t_shrub_grape_season_winter", "fg": 1288, "bg": 644}, {"id": "t_door_glass_o", "fg": 1291}, {"id": ["t_shrub_rose"], "fg": 1294, "bg": 1233}, {"id": "t_shrub_rose_season_summer", "fg": 1294, "bg": 1240}, {"id": "t_shrub_rose_harvested", "fg": 1294, "bg": 1234}, {"id": "t_shrub_rose_season_autumn", "fg": 1292, "bg": 1234}, {"id": "t_shrub_rose_season_winter", "fg": 1293, "bg": 644}, {"id": "t_wall", "multitile": true, "fg": 1307, "additional_tiles": [{"id": "center", "fg": 1302}, {"id": "corner", "fg": [1308, 1300, 1297, 1306]}, {"id": "t_connection", "fg": [1304, 1299, 1310, 1295]}, {"id": "edge", "fg": [1296, 1298]}, {"id": "end_piece", "fg": [1303, 1309, 1305, 1301]}, {"id": "unconnected", "fg": 1307}]}, {"id": "t_wall_p", "multitile": true, "fg": 1320, "additional_tiles": [{"id": "center", "fg": 1325}, {"id": "corner", "fg": [1313, 1316, 1321, 1318]}, {"id": "t_connection", "fg": [1323, 1317, 1319, 1311]}, {"id": "edge", "fg": [1324, 1312]}, {"id": "end_piece", "fg": [1322, 1314, 1326, 1315]}, {"id": "unconnected", "fg": 1320}]}, {"id": "t_wall_log", "multitile": true, "fg": 1334, "bg": 1233, "additional_tiles": [{"id": "center", "fg": 1338}, {"id": "corner", "fg": [1339, 1328, 1342, 1336]}, {"id": "t_connection", "fg": [1333, 1330, 1341, 1332]}, {"id": "edge", "bg": 1233, "fg": [1329, 1331]}, {"id": "end_piece", "bg": 1233, "fg": [1340, 1335, 1337, 1327]}, {"bg": 1233, "id": "unconnected", "fg": 1334}]}, {"id": "t_wall_g", "multitile": true, "fg": 1348, "additional_tiles": [{"id": "center", "fg": 1352}, {"id": "corner", "fg": [1358, 1355, 1349, 1357]}, {"id": "t_connection", "fg": [1353, 1344, 1354, 1350]}, {"id": "edge", "fg": [1345, 1346]}, {"id": "end_piece", "fg": [1356, 1351, 1347, 1343]}, {"id": "unconnected", "fg": 1348}]}, {"id": "t_door_boarded", "fg": 1359}, {"id": "t_door_boarded_damaged", "fg": 1360}, {"id": ["t_water_pool", "t_water_pool_shallow"], "multitile": true, "fg": 1368, "additional_tiles": [{"id": "center", "fg": [{"weight": 1, "sprite": 1186}, {"weight": 1, "sprite": 1193}, {"weight": 1, "sprite": 1188}]}, {"id": "corner", "fg": [1363, 1372, 1371, 1365]}, {"id": "t_connection", "fg": [1367, 1364, 1369, 1373]}, {"id": "edge", "fg": [1370, 1362]}, {"id": "end_piece", "fg": [1374, 1375, 1361, 1366]}, {"id": "unconnected", "fg": 1368}]}, {"id": "t_pavement", "fg": 1376}, {"id": "t_pavement_season_winter", "fg": 643}, {"id": ["t_water_dp", "t_swater_dp"], "multitile": true, "fg": 1384, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": [{"weight": 1, "sprite": 1386}, {"weight": 1, "sprite": 1387}, {"weight": 1, "sprite": 1393}]}, {"id": "corner", "bg": 1233, "fg": [1392, 1377, 1379, 1388]}, {"id": "t_connection", "bg": 1233, "fg": [1381, 1389, 1391, 1380]}, {"id": "edge", "bg": 1233, "fg": [1383, 1394]}, {"id": "end_piece", "bg": 1233, "fg": [1390, 1385, 1382, 1378]}, {"bg": 1233, "id": "unconnected", "fg": 1384}]}, {"id": ["t_water_dp_season_summer", "t_swater_dp_season_summer"], "multitile": true, "fg": 1384, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": [{"weight": 1, "sprite": 1386}, {"weight": 1, "sprite": 1387}, {"weight": 1, "sprite": 1393}]}, {"id": "corner", "bg": 1240, "fg": [1392, 1377, 1379, 1388]}, {"id": "t_connection", "bg": 1240, "fg": [1381, 1389, 1391, 1380]}, {"id": "edge", "bg": 1240, "fg": [1383, 1394]}, {"id": "end_piece", "bg": 1240, "fg": [1390, 1385, 1382, 1378]}, {"bg": 1240, "id": "unconnected", "fg": 1384}]}, {"id": ["t_water_dp_season_autumn", "t_swater_dp_season_autumn"], "multitile": true, "fg": 1384, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": [{"weight": 1, "sprite": 1386}, {"weight": 1, "sprite": 1387}, {"weight": 1, "sprite": 1393}]}, {"id": "corner", "bg": 1234, "fg": [1392, 1377, 1379, 1388]}, {"id": "t_connection", "bg": 1234, "fg": [1381, 1389, 1391, 1380]}, {"id": "edge", "bg": 1234, "fg": [1383, 1394]}, {"id": "end_piece", "bg": 1234, "fg": [1390, 1385, 1382, 1378]}, {"bg": 1234, "id": "unconnected", "fg": 1384}]}, {"id": ["t_water_dp_season_winter", "t_swater_dp_season_winter"], "multitile": true, "fg": 1384, "bg": 643, "additional_tiles": [{"id": "center", "bg": 643, "fg": [{"weight": 1, "sprite": 1386}, {"weight": 1, "sprite": 1387}, {"weight": 1, "sprite": 1393}]}, {"id": "corner", "bg": 643, "fg": [1392, 1377, 1379, 1388]}, {"id": "t_connection", "bg": 643, "fg": [1381, 1389, 1391, 1380]}, {"id": "edge", "bg": 643, "fg": [1383, 1394]}, {"id": "end_piece", "bg": 643, "fg": [1390, 1385, 1382, 1378]}, {"bg": 643, "id": "unconnected", "fg": 1384}]}, {"id": ["t_linoleum_gray", "t_linoluem_gray_no_roof"], "multitile": true, "fg": 1398, "additional_tiles": [{"id": "center", "fg": 1397}, {"id": "corner", "fg": [1406, 1399, 1405, 1401]}, {"id": "t_connection", "fg": [1402, 1396, 1395, 1408]}, {"id": "edge", "fg": [1400, 1407]}, {"id": "end_piece", "fg": [1404, 1409, 1410, 1403]}, {"id": "unconnected", "fg": 1398}]}, {"id": "t_grass", "multitile": true, "fg": 1417, "bg": 1233, "additional_tiles": [{"id": "center", "bg": 1233, "fg": [{"weight": 1, "sprite": 1418}, {"weight": 1, "sprite": 1421}, {"weight": 1, "sprite": 1433}, {"weight": 1, "sprite": 1432}, {"weight": 1, "sprite": 1413}, {"weight": 1, "sprite": 1424}, {"weight": 1, "sprite": 1415}, {"weight": 1, "sprite": 1434}, {"weight": 1, "sprite": 1428}]}, {"id": "corner", "bg": 1233, "fg": [1427, 1420, 1425, 1416]}, {"id": "t_connection", "bg": 1233, "fg": [1412, 1430, 1411, 1431]}, {"id": "edge", "bg": 1233, "fg": [1426, 1414]}, {"id": "end_piece", "bg": 1233, "fg": [1423, 1429, 1419, 1422]}, {"bg": 1233, "id": "unconnected", "fg": 1417}]}, {"id": "t_grass_season_summer", "multitile": true, "fg": 1417, "bg": 1240, "additional_tiles": [{"id": "center", "bg": 1240, "fg": 1460}, {"id": "corner", "bg": 1240, "fg": [1465, 1452, 1454, 1453]}, {"id": "t_connection", "bg": 1240, "fg": [1455, 1457, 1464, 1463]}, {"id": "edge", "bg": 1240, "fg": [1459, 1458]}, {"id": "end_piece", "bg": 1240, "fg": [1451, 1462, 1461, 1456]}, {"bg": 1240, "id": "unconnected", "fg": 1466}]}, {"id": "t_grass_season_autumn", "multitile": true, "fg": 1417, "bg": 1234, "additional_tiles": [{"id": "center", "bg": 1234, "fg": 1444}, {"id": "corner", "bg": 1234, "fg": [1449, 1435, 1450, 1446]}, {"id": "t_connection", "bg": 1234, "fg": [1447, 1438, 1445, 1443]}, {"id": "edge", "bg": 1234, "fg": [1440, 1439]}, {"id": "end_piece", "bg": 1234, "fg": [1442, 1441, 1437, 1448]}, {"bg": 1234, "id": "unconnected", "fg": 1436}]}, {"id": "t_grass_season_winter", "fg": 643}, {"id": "t_stairs_down", "fg": 1467}, {"id": "t_wood_stairs_down", "fg": 1468}, {"id": "t_floor_wax", "multitile": true, "fg": 1478, "additional_tiles": [{"id": "center", "fg": 1481}, {"id": "corner", "fg": [1483, 1470, 1477, 1474]}, {"id": "t_connection", "fg": [1479, 1484, 1471, 1472]}, {"id": "edge", "fg": [1475, 1480]}, {"id": "end_piece", "fg": [1469, 1482, 1473, 1476]}, {"id": "unconnected", "fg": 1478}]}, {"id": "t_wall_r", "multitile": true, "fg": 1485, "additional_tiles": [{"id": "center", "fg": 1492}, {"id": "corner", "fg": [1494, 1493, 1498, 1499]}, {"id": "t_connection", "fg": [1488, 1490, 1491, 1495]}, {"id": "edge", "fg": [1500, 1497]}, {"id": "end_piece", "fg": [1489, 1496, 1487, 1486]}, {"id": "unconnected", "fg": 1485}]}, {"id": "t_concrete", "multitile": true, "fg": 1508, "additional_tiles": [{"id": "center", "fg": 1502}, {"id": "corner", "fg": [1513, 1510, 1501, 1511]}, {"id": "t_connection", "fg": [1509, 1503, 1515, 1505]}, {"id": "edge", "fg": [1507, 1512]}, {"id": "end_piece", "fg": [1506, 1504, 1516, 1514]}, {"id": "unconnected", "fg": 1508}]}, {"id": "t_concrete_season_winter", "fg": 643}, {"id": "t_wall_resin", "multitile": true, "fg": 1525, "additional_tiles": [{"id": "center", "fg": 1532}, {"id": "corner", "fg": [1520, 1531, 1522, 1528]}, {"id": "t_connection", "fg": [1517, 1523, 1519, 1521]}, {"id": "edge", "fg": [1534, 1533]}, {"id": "end_piece", "fg": [1530, 1524, 1526, 1527]}, {"id": "unconnected", "fg": 1525}]}, {"id": "t_resin_hole_c", "fg": 1529}, {"id": "t_resin_hole_o", "fg": 1518}, {"id": "t_ladder_down", "fg": 1535}, {"id": "tr_nailboard", "fg": 1536, "bg": 480}, {"id": "animation_hit", "fg": 1537}, {"id": ["overlay_effects_bleed"], "fg": 1543}, {"id": ["overlay_effects_deaf"], "fg": 1538}, {"id": ["overlay_effects_downed"], "fg": 1545}, {"id": ["overlay_effects_grabbed"], "fg": 1544}, {"id": ["overlay_effects_winded"], "fg": 1542}, {"id": ["overlay_effects_hot"], "fg": 1539}, {"id": ["overlay_effects_cold"], "fg": 1548}, {"id": ["overlay_male_crouch", "overlay_female_crouch"], "fg": 1541}, {"id": ["overlay_male_run", "overlay_female_run"], "fg": 1546}, {"id": ["overlay_hostile_sees_player"], "fg": 1547}, {"id": ["zombie_revival_indicator"], "fg": 1540}, {"id": "cursor", "fg": 1549}, {"id": "highlight", "fg": 1552}, {"id": "highlight_item", "fg": 1553}, {"id": "line_target", "fg": 1550}, {"id": "line_trail", "fg": 1551}, {"id": "animation_line", "fg": 1554}, {"id": "mon_pig", "fg": [{"weight": 8, "sprite": 1557}, {"weight": 3, "sprite": 1556}, {"weight": 1, "sprite": 1555}], "bg": 1581}, {"id": "mon_piglet", "fg": 1558, "bg": 1582}, {"id": "mon_deer_mouse", "fg": 1559, "bg": 1582}, {"id": "mon_locust_nymph", "fg": 1560, "bg": 1582}, {"id": "mon_skittering_plague", "fg": 1561, "bg": 1581}, {"id": "mon_black_rat", "fg": 1562, "bg": 1582}, {"id": "mon_zolf", "fg": 1563, "bg": 1581}, {"id": "mon_dog", "fg": 1564, "bg": 1581}, {"id": "mon_dog_skeleton", "fg": 1568, "bg": 1581}, {"id": "mon_zombie_dog", "fg": [{"weight": 1, "sprite": 1569}, {"weight": 1, "sprite": 1570}], "bg": 1581}, {"id": "mon_dog_beagle", "fg": 1567, "bg": 1582}, {"id": "mon_dog_gshepherd", "fg": 1566, "bg": 1581}, {"id": "mon_dog_boxer", "fg": 1565, "bg": 1581}, {"id": "mon_dog_dachshund", "fg": 1571, "bg": 1581}, {"id": "mon_blob", "fg": 1572, "bg": 1581}, {"id": "mon_squirrel_red", "fg": 1573, "bg": 1582}, {"id": "mon_plague_vector", "fg": 1574, "bg": 1581}, {"id": "mon_blob_small", "fg": [{"weight": 1, "sprite": 1575}, {"weight": 1, "sprite": 1576}], "bg": 1582}, {"id": "mon_dragonfly", "fg": 1577, "bg": 1582}, {"id": "mon_zombie_child", "fg": [{"weight": 1, "sprite": 1578}, {"weight": 1, "sprite": 1579}], "bg": 1582}, {"id": "mon_plague_nymph", "fg": 1580, "bg": 1582}, {"id": "mon_squirrel", "fg": 1583, "bg": 1582}, {"id": "mon_giant_cockroach", "fg": 1584, "bg": 1581}, {"id": "mon_zombie_pig", "fg": 1585, "bg": 1581}, {"id": "mon_rabbit", "fg": 1586, "bg": 1582}, {"id": "mon_zombeaver", "fg": 1587, "bg": 1582}, {"id": "mon_ant", "fg": 1588, "bg": 1581}, {"id": "mon_ant_acid", "fg": 1593, "bg": 1581}, {"id": "corpse_mon_ant", "fg": 1595}, {"id": "corpse_mon_ant_acid", "fg": 1590}, {"id": "mon_ant_larva", "fg": 1589, "bg": 1582}, {"id": "mon_ant_acid_larva", "fg": 1591, "bg": 1582}, {"id": "corpse_mon_ant_larva", "fg": 1592}, {"id": "corpse_mon_ant_acid_larva", "fg": 1594}, {"id": "mon_centipede_giant", "fg": 1596, "bg": 1581}, {"id": "mon_cat", "fg": [{"weight": 1, "sprite": 1597}, {"weight": 1, "sprite": 1598}], "bg": 1582}, {"id": "mon_beaver", "fg": 1599, "bg": 1582}, {"id": "mon_wolf", "fg": 1600, "bg": 1581}, {"id": "mon_otter", "fg": 1601, "bg": 1582}, {"id": "mon_giant_cockroach_nymph", "fg": 1602, "bg": 1582}, {"id": "mon_duck", "fg": 1603, "bg": 1582}, {"id": "mon_mosquito", "fg": 1604, "bg": 1582}, {"id": "mon_locust", "fg": 1605, "bg": 1581}, {"id": "mon_pregnant_giant_cockroach", "fg": 1606, "bg": 1581}, {"id": "mon_dermatik_larva", "fg": 1607, "bg": 1582}, {"id": "mon_bear_cub", "fg": 1608, "bg": 1582}, {"id": "mon_wasp_small", "fg": 1609, "bg": 1582}, {"id": "fd_fire", "fg": 1610}], "//": "range 1 to 1616"}, {"file": "tall.png", "tiles": [{"id": "f_bookcase", "fg": 1617}, {"id": "f_arcade_machine", "fg": 1618}, {"id": "f_floor_lamp", "fg": 1619}, {"id": "f_dryer", "fg": 1620}, {"id": "f_dresser", "fg": 1621}, {"id": "f_crate_c", "fg": 1623}, {"id": "f_crate_o", "fg": 1622}, {"id": "f_alien_tendril", "fg": 1626}, {"id": "f_alien_zapper", "fg": 1627}, {"id": ["f_alien_pod", "f_alien_pod_organ"], "fg": 1624}, {"id": "f_alien_pod_resin", "fg": 1625}, {"id": "f_glass_cabinet", "fg": 1628}, {"id": "f_shower", "fg": 1629}, {"id": "f_standing_tank", "fg": 1630}, {"id": "f_bigmirror", "fg": 1631}, {"id": "f_glass_fridge", "fg": 1632}, {"id": "f_cattails_season_spring", "fg": 1636, "rotates": false}, {"id": "f_cattails_season_summer", "fg": 1634, "rotates": false}, {"id": "f_cattails_season_autumn", "fg": 1635, "rotates": false}, {"id": "f_cattails_season_winter", "fg": 1633, "rotates": false}, {"id": "f_workbench", "fg": 1637}, {"id": "f_dumpster", "multitile": true, "fg": 1640, "additional_tiles": [{"id": "edge", "fg": [1641, 1644]}, {"id": "end_piece", "fg": [1638, 1642, 1643, 1639]}, {"id": "unconnected", "fg": 1640}]}, {"id": "f_washer", "fg": 1645}, {"id": "f_fireplace", "fg": 1646}, {"id": "f_home_furnace", "fg": 1647}, {"id": "f_locker", "fg": 1648}, {"id": "f_statue", "fg": 1649}, {"id": "f_woodstove", "fg": 1650}, {"id": "f_brazier", "fg": 1651}, {"id": "f_birdbath", "fg": 1652}, {"id": "f_rack_coat", "fg": 1653}, {"id": "f_water_heater", "fg": 1654}, {"id": "f_oven", "fg": 1655}, {"id": "player_male", "fg": 1789}, {"id": "npc_male", "fg": 1789}, {"id": "npc_female", "fg": 1790}, {"id": "player_female", "fg": 1790}, {"id": "t_gutter_downspout", "fg": 1656}, {"id": "t_utility_light", "fg": 1657}, {"id": "t_little_column", "fg": 1658, "bg": 1664}, {"id": "t_machinery_heavy", "fg": 1659, "bg": 1664}, {"id": "t_atm", "fg": 1660, "bg": 1664}, {"id": "t_column", "fg": 1661, "bg": 1664}, {"id": "t_machinery_electronic", "fg": 1668, "bg": 1664}, {"id": "t_machinery_old", "fg": 1669, "bg": 1667}, {"id": "t_stairs_up", "fg": 1670}, {"id": "t_wood_stairs_up", "fg": 1671}, {"id": "t_ladder_up", "fg": 1672}, {"id": "overlay_female_mutation_SCALES", "fg": 1673}, {"id": "overlay_male_mutation_SCALES", "fg": 1674}, {"id": "overlay_female_mutation_TAIL_THICK", "fg": 1675}, {"id": "overlay_male_mutation_TAIL_THICK", "fg": 1676}, {"id": "overlay_female_mutation_TALONS", "fg": 1678}, {"id": "overlay_male_mutation_TALONS", "fg": 1677}, {"id": "overlay_female_mutation_BEAK_PECK", "fg": 1679}, {"id": "overlay_male_mutation_BEAK_PECK", "fg": 1680}, {"id": "overlay_female_mutation_BIRD_EYE", "fg": 1681}, {"id": "overlay_male_mutation_BIRD_EYE", "fg": 1682}, {"id": "overlay_female_mutation_LIZ_EYE", "fg": 1683}, {"id": "overlay_male_mutation_LIZ_EYE", "fg": 1684}, {"id": "overlay_female_mutation_MUZZLE_LONG", "fg": 1686}, {"id": "overlay_male_mutation_MUZZLE_LONG", "fg": 1685}, {"id": "overlay_female_mutation_BEAK_HUM", "fg": 1687}, {"id": "overlay_male_mutation_BEAK_HUM", "fg": 1688}, {"id": "overlay_female_mutation_PLANTSKIN", "fg": 1689}, {"id": "overlay_male_mutation_PLANTSKIN", "fg": 1690}, {"id": "overlay_female_mutation_FANGS", "fg": 1692}, {"id": "overlay_male_mutation_FANGS", "fg": 1691}, {"id": "overlay_female_mutation_CHITIN", "fg": 1693}, {"id": "overlay_male_mutation_CHITIN", "fg": 1694}, {"id": "overlay_female_mutation_ARACHNID_ARMS", "fg": 1695}, {"id": "overlay_male_mutation_ARACHNID_ARMS", "fg": 1696}, {"id": "overlay_female_mutation_FEATHERS", "fg": 1697}, {"id": "overlay_male_mutation_FEATHERS", "fg": 1698}, {"id": "overlay_female_mutation_VINES1", "fg": 1699}, {"id": "overlay_male_mutation_VINES1", "fg": 1700}, {"id": "overlay_female_mutation_WINGS_BIRD", "fg": 1702}, {"id": "overlay_male_mutation_WINGS_BIRD", "fg": 1701}, {"id": "overlay_female_mutation_BEAK", "fg": 1704}, {"id": "overlay_male_mutation_BEAK", "fg": 1703}, {"id": "overlay_female_mutation_CHITIN2", "fg": 1705}, {"id": "overlay_male_mutation_CHITIN2", "fg": 1706}, {"id": "overlay_female_mutation_LEAVES", "fg": 1707}, {"id": "overlay_male_mutation_LEAVES", "fg": 1708}, {"id": "overlay_male_mutation_hair_brown_medium", "fg": 1709}, {"id": "overlay_female_mutation_hair_brown_medium", "fg": 1710}, {"id": "overlay_male_mutation_hair_brown_fro", "fg": 1711}, {"id": "overlay_female_mutation_hair_brown_fro", "fg": 1712}, {"id": "overlay_male_mutation_hair_red_mohawk", "fg": 1713}, {"id": "overlay_female_mutation_hair_red_mohawk", "fg": 1714}, {"id": "overlay_male_mutation_hair_brown_mohawk", "fg": 1716}, {"id": "overlay_female_mutation_hair_brown_mohawk", "fg": 1715}, {"id": "overlay_male_mutation_hair_brown_crewcut", "fg": 1718}, {"id": "overlay_female_mutation_hair_brown_crewcut", "fg": 1717}, {"id": "overlay_male_mutation_hair_black_crewcut", "fg": 1720}, {"id": "overlay_female_mutation_hair_black_crewcut", "fg": 1719}, {"id": "overlay_male_mutation_hair_gray_medium", "fg": 1722}, {"id": "overlay_female_mutation_hair_gray_medium", "fg": 1721}, {"id": "overlay_male_mutation_hair_white_crewcut", "fg": 1723}, {"id": "overlay_female_mutation_hair_white_crewcut", "fg": 1724}, {"id": "overlay_male_mutation_hair_red_medium", "fg": 1726}, {"id": "overlay_female_mutation_hair_red_medium", "fg": 1725}, {"id": "overlay_male_mutation_hair_blond_short", "fg": 1728}, {"id": "overlay_female_mutation_hair_blond_short", "fg": 1727}, {"id": "overlay_male_mutation_hair_white_mohawk", "fg": 1730}, {"id": "overlay_female_mutation_hair_white_mohawk", "fg": 1729}, {"id": "overlay_male_mutation_hair_red_crewcut", "fg": 1732}, {"id": "overlay_female_mutation_hair_red_crewcut", "fg": 1731}, {"id": "overlay_male_mutation_hair_red_fro", "fg": 1734}, {"id": "overlay_female_mutation_hair_red_fro", "fg": 1733}, {"id": "overlay_male_mutation_hair_white_medium", "fg": 1735}, {"id": "overlay_female_mutation_hair_white_medium", "fg": 1736}, {"id": "overlay_male_mutation_hair_black_medium", "fg": 1737}, {"id": "overlay_female_mutation_hair_black_medium", "fg": 1738}, {"id": "overlay_male_mutation_hair_blond_medium", "fg": 1740}, {"id": "overlay_female_mutation_hair_blond_medium", "fg": 1739}, {"id": "overlay_male_mutation_hair_black_fro", "fg": 1742}, {"id": "overlay_female_mutation_hair_black_fro", "fg": 1741}, {"id": "overlay_male_mutation_hair_black_mohawk", "fg": 1743}, {"id": "overlay_female_mutation_hair_black_mohawk", "fg": 1744}, {"id": "overlay_male_mutation_hair_gray_mohawk", "fg": 1745}, {"id": "overlay_female_mutation_hair_gray_mohawk", "fg": 1746}, {"id": "overlay_male_mutation_hair_brown_long", "fg": 1748}, {"id": "overlay_female_mutation_hair_brown_long", "fg": 1747}, {"id": "overlay_male_mutation_hair_gray_short", "fg": 1750}, {"id": "overlay_female_mutation_hair_gray_short", "fg": 1749}, {"id": "overlay_male_mutation_hair_white_short", "fg": 1751}, {"id": "overlay_female_mutation_hair_white_short", "fg": 1752}, {"id": "overlay_male_mutation_hair_white_long", "fg": 1753}, {"id": "overlay_female_mutation_hair_white_long", "fg": 1754}, {"id": "overlay_male_mutation_hair_gray_long", "fg": 1756}, {"id": "overlay_female_mutation_hair_gray_long", "fg": 1755}, {"id": "overlay_male_mutation_hair_brown_short", "fg": 1757}, {"id": "overlay_female_mutation_hair_brown_short", "fg": 1758}, {"id": "overlay_male_mutation_hair_gray_crewcut", "fg": 1760}, {"id": "overlay_female_mutation_hair_gray_crewcut", "fg": 1759}, {"id": "overlay_male_mutation_hair_blond_crewcut", "fg": 1762}, {"id": "overlay_female_mutation_hair_blond_crewcut", "fg": 1761}, {"id": "overlay_male_mutation_hair_black_short", "fg": 1763}, {"id": "overlay_female_mutation_hair_black_short", "fg": 1764}, {"id": "overlay_male_mutation_hair_blond_mohawk", "fg": 1766}, {"id": "overlay_female_mutation_hair_blond_mohawk", "fg": 1765}, {"id": "overlay_male_mutation_hair_black_long", "fg": 1768}, {"id": "overlay_female_mutation_hair_black_long", "fg": 1767}, {"id": "overlay_male_mutation_hair_blond_fro", "fg": 1769}, {"id": "overlay_female_mutation_hair_blond_fro", "fg": 1770}, {"id": "overlay_male_mutation_hair_blond_long", "fg": 1772}, {"id": "overlay_female_mutation_hair_blond_long", "fg": 1771}, {"id": "overlay_male_mutation_hair_gray_fro", "fg": 1774}, {"id": "overlay_female_mutation_hair_gray_fro", "fg": 1773}, {"id": "overlay_male_mutation_hair_red_short", "fg": 1776}, {"id": "overlay_female_mutation_hair_red_short", "fg": 1775}, {"id": "overlay_male_mutation_hair_red_long", "fg": 1778}, {"id": "overlay_female_mutation_hair_red_long", "fg": 1777}, {"id": "overlay_male_mutation_hair_white_fro", "fg": 1779}, {"id": "overlay_female_mutation_hair_white_fro", "fg": 1780}, {"id": "overlay_female_mutation_SKIN_LIGHT", "fg": 1782, "bg": 2179}, {"id": "overlay_male_mutation_SKIN_LIGHT", "fg": 1781, "bg": 2179}, {"id": "overlay_female_mutation_SKIN_DARK", "fg": 1784, "bg": 2179}, {"id": "overlay_male_mutation_SKIN_DARK", "fg": 1783, "bg": 2179}, {"id": "overlay_female_mutation_SKIN_TAN", "fg": 1786, "bg": 2179}, {"id": "overlay_male_mutation_SKIN_TAN", "fg": 1785, "bg": 2179}, {"id": "overlay_male_mutation_SKIN_PINK", "fg": 1788, "bg": 2179}, {"id": "overlay_female_mutation_SKIN_PINK", "fg": 1787, "bg": 2179}, {"id": "overlay_male_mutation_SKIN_MEDIUM", "fg": 1789, "bg": 2179}, {"id": "overlay_female_mutation_SKIN_MEDIUM", "fg": 1790, "bg": 2179}, {"id": "overlay_wielded_bag_canvas", "fg": 1791}, {"id": "overlay_female_wielded_wood_panel", "fg": 1793}, {"id": "overlay_male_wielded_wood_panel", "fg": 1792}, {"id": "overlay_wielded_jar_glass", "fg": 1794}, {"id": "overlay_female_wielded_rifle_flintlock", "fg": 1796}, {"id": "overlay_male_wielded_rifle_flintlock", "fg": 1795}, {"id": "overlay_female_wielded_bat_metal", "fg": 1798}, {"id": "overlay_male_wielded_bat_metal", "fg": 1797}, {"id": "overlay_male_wielded_pointy_stick", "fg": 1799}, {"id": "overlay_female_wielded_pointy_stick", "fg": 1804}, {"id": "overlay_male_wielded_spear_wood", "fg": 1814}, {"id": "overlay_female_wielded_spear_wood", "fg": 1813}, {"id": "overlay_male_wielded_spear_spike", "fg": 1808}, {"id": "overlay_female_wielded_spear_spike", "fg": 1815}, {"id": "overlay_male_wielded_spear_knife", "fg": 1811}, {"id": "overlay_female_wielded_spear_knife", "fg": 1812}, {"id": "overlay_male_wielded_spear_knife_superior", "fg": 1801}, {"id": "overlay_female_wielded_spear_knife_superior", "fg": 1816}, {"id": "overlay_male_wielded_spear_rebar", "fg": 1806}, {"id": "overlay_female_wielded_spear_rebar", "fg": 1810}, {"id": "overlay_male_wielded_spear_pipe", "fg": 1807}, {"id": "overlay_female_wielded_spear_pipe", "fg": 1802}, {"id": "overlay_male_wielded_spear_steel", "fg": 1803}, {"id": "overlay_female_wielded_spear_steel", "fg": 1800}, {"id": "overlay_male_wielded_spear_copper", "fg": 1805}, {"id": "overlay_female_wielded_spear_copper", "fg": 1809}, {"id": "overlay_wielded_flashlight", "fg": 1818}, {"id": "overlay_wielded_heavy_flashlight", "fg": 1817}, {"id": "overlay_wielded_jug_plastic", "fg": 1819}, {"id": "overlay_female_wielded_pot", "fg": 1821}, {"id": "overlay_male_wielded_pot", "fg": 1820}, {"id": "overlay_wielded_fire_ax", "fg": 1822}, {"id": "overlay_wielded_ax", "fg": 1823}, {"id": "overlay_wielded_hatchet", "fg": 1824}, {"id": "overlay_wielded_bottle_glass", "fg": 1825}, {"id": "overlay_female_wielded_rag", "fg": 1826}, {"id": "overlay_male_wielded_rag", "fg": 1827}, {"id": "overlay_female_wielded_corpse_generic_human", "fg": 1828}, {"id": "overlay_male_wielded_corpse_generic_human", "fg": 1829}, {"id": "overlay_male_wielded_chainsaw_off", "fg": 1830}, {"id": "overlay_female_wielded_chainsaw_off", "fg": 1831}, {"id": "overlay_female_wielded_teapot", "fg": 1833}, {"id": "overlay_male_wielded_teapot", "fg": 1832}, {"id": "overlay_male_wielded_1st_aid", "fg": 1834}, {"id": "overlay_female_wielded_1st_aid", "fg": 1835}, {"id": "overlay_female_wielded_nailbat", "fg": 1836}, {"id": "overlay_male_wielded_nailbat", "fg": 1837}, {"id": "overlay_male_wielded_primitive_hammer", "fg": 1838}, {"id": "overlay_female_wielded_primitive_hammer", "fg": 1839}, {"id": "overlay_wielded_steel_lump", "fg": 1840}, {"id": "overlay_wielded_antibiotics", "fg": 1841}, {"id": "overlay_wielded_weak_antibiotic", "fg": 1853}, {"id": "overlay_wielded_strong_antibiotic", "fg": 1848}, {"id": "overlay_wielded_calcium_tablet", "fg": 1843}, {"id": "overlay_wielded_vitamins", "fg": 1851}, {"id": "overlay_wielded_gummy_vitamins", "fg": 1842}, {"id": "overlay_wielded_antifungal", "fg": 1849}, {"id": "overlay_wielded_antiparasitic", "fg": 1846}, {"id": "overlay_wielded_iodine", "fg": 1852}, {"id": "overlay_wielded_prussian_blue", "fg": 1850}, {"id": "overlay_wielded_tramadol", "fg": 1845}, {"id": "overlay_wielded_codeine", "fg": 1844}, {"id": "overlay_wielded_oxycodone", "fg": 1847}, {"id": "overlay_wielded_rebar", "fg": 1854}, {"id": "overlay_wielded_steel_glass_shard", "fg": 1855}, {"id": "overlay_male_wielded_pot_copper", "fg": 1857}, {"id": "overlay_female_wielded_pot_copper", "fg": 1856}, {"id": "overlay_female_wielded_nailboard", "fg": 1858}, {"id": "overlay_male_wielded_nailboard", "fg": 1859}, {"id": "overlay_wielded_scissors", "fg": 1860}, {"id": "overlay_female_wielded_ak74", "fg": 1862}, {"id": "overlay_male_wielded_ak74", "fg": 1861}, {"id": "overlay_wielded_coffeemaker", "fg": 1863}, {"id": "overlay_male_wielded_thermos", "fg": 1865}, {"id": "overlay_female_wielded_thermos", "fg": 1864}, {"id": "overlay_female_wielded_stick", "fg": 1866}, {"id": "overlay_male_wielded_stick", "fg": 1867}, {"id": "overlay_wielded_steel_chunk", "fg": 1868}, {"id": "overlay_wielded_pipe", "fg": 1869}, {"id": "overlay_wielded_bottle_plastic", "fg": 1870}, {"id": "overlay_wielded_broom", "fg": 1871}, {"id": "overlay_wielded_sw_619", "fg": 1872}, {"id": "overlay_wielded_rolling_pin", "fg": 1873}, {"id": "overlay_wielded_makeshift_crowbar", "fg": 1874}, {"id": "overlay_female_wielded_bat", "fg": 1876}, {"id": "overlay_male_wielded_bat", "fg": 1875}, {"id": "overlay_male_wielded_wood_sheet", "fg": 1877}, {"id": "overlay_female_wielded_wood_sheet", "fg": 1878}, {"id": "overlay_wielded_jar_3l_glass_sealed", "fg": 1879}, {"id": "overlay_wielded_box_large", "fg": 1880}, {"id": "overlay_wielded_crowbar", "fg": 1884}, {"id": "overlay_male_wielded_screwdriver", "fg": 1885}, {"id": "overlay_female_wielded_screwdriver", "fg": 1881}, {"id": "overlay_wielded_shovel", "fg": 1886}, {"id": "overlay_wielded_wrench", "fg": 1882}, {"id": "overlay_wielded_hammer", "fg": 1883}, {"id": "overlay_wielded_arming_sword", "fg": 1887}, {"id": "overlay_wielded_brick", "fg": 1888}, {"id": "overlay_male_wielded_2x4", "fg": 1889}, {"id": "overlay_female_wielded_2x4", "fg": 1890}, {"id": "overlay_wielded_katana", "fg": 1891}, {"id": "overlay_wielded_bottle_plastic_small", "fg": 1892}, {"id": "overlay_wielded_sharp_rock", "fg": 1893}, {"id": ["overlay_wielded_glock_17", "overlay_wielded_glock_19", "overlay_wielded_glock_18c", "overlay_wielded_glock_22", "overlay_wielded_glock_31"], "fg": 1894}, {"id": "overlay_wielded_box_small", "fg": 1895}, {"id": "overlay_male_wielded_pillow", "fg": 1897}, {"id": "overlay_female_wielded_pillow", "fg": 1898}, {"id": "overlay_male_wielded_down_pillow", "fg": 1899}, {"id": "overlay_female_wielded_down_pillow", "fg": 1896}, {"id": "overlay_wielded_mop", "fg": 1900}, {"id": ["overlay_wielded_corpse_mon_ant", "overlay_wielded_corpse_mon_ant_soldier", "overlay_wielded_corpse_mon_ant_queen"], "fg": 1902}, {"id": ["overlay_wielded_corpse_mon_ant_acid", "overlay_wielded_corpse_mon_ant_acid_soldier", "overlay_wielded_corpse_mon_ant_acid_queen"], "fg": 1904}, {"id": ["overlay_male_wielded_corpse_mon_zombie", "overlay_male_wielded_corpse_mon_zombie_grappler", "overlay_male_wielded_corpse_mon_zombie_biter", "overlay_male_wielded_corpse_mon_zombie_tough", "overlay_male_wielded_corpse_mon_zombie_hunter", "overlay_male_wielded_corpse_mon_zombie_brute", "overlay_male_wielded_corpse_mon_zombie_predator", "overlay_male_wielded_corpse_mon_zombie_necro", "overlay_male_wielded_corpse_mon_zombie_thorny", "overlay_male_wielded_corpse_mon_zombie_smoker", "overlay_male_wielded_corpse_mon_zombie_shady", "overlay_male_wielded_corpse_mon_zombie_master", "overlay_male_wielded_corpse_mon_zombie_acidic", "overlay_male_wielded_corpse_mon_zombie_fat", "overlay_male_wielded_corpse_mon_zombie_corrosive", "overlay_male_wielded_corpse_mon_zombie_screecher", "overlay_male_wielded_corpse_mon_zombie_scientist", "overlay_male_wielded_corpse_mon_zombie_runner", "overlay_male_wielded_corpse_mon_zombie_spitter", "overlay_male_wielded_corpse_mon_zombie_labsecurity", "overlay_male_wielded_corpse_mon_zombie_child", "overlay_male_wielded_corpse_mon_zombie_hulk", "overlay_male_wielded_corpse_mon_zombie_brute_grappler", "overlay_male_wielded_corpse_mon_zombie_brute_ninja", "overlay_male_wielded_corpse_mon_zombie_kevlar_2", "overlay_male_wielded_corpse_mon_zombie_kevlar_1", "overlay_male_wielded_corpse_mon_zombie_hazmat", "overlay_male_wielded_corpse_mon_zombie_electric", "overlay_male_wielded_corpse_mon_zombie_technician", "overlay_male_wielded_corpse_mon_zombie_fungus", "overlay_male_wielded_corpse_mon_zombie_cop", "overlay_male_wielded_corpse_mon_zombie_child_fungus", "overlay_male_wielded_corpse_mon_zombie_swimmer", "overlay_male_wielded_corpse_mon_zombie_mancroc", "overlay_male_wielded_corpse_mon_zombie_soldier", "overlay_male_wielded_corpse_mon_zombie_skull", "overlay_male_wielded_corpse_mon_zombie_brainless", "overlay_male_wielded_corpse_mon_zombie_survivor", "overlay_male_wielded_corpse_mon_zombie_brute_shocker", "overlay_male_wielded_corpse_mon_zombie_soldier_acid_1", "overlay_male_wielded_corpse_mon_zombie_soldier_blackops_2", "overlay_male_wielded_corpse_mon_zombie_soldier_blackops_1", "overlay_male_wielded_corpse_mon_zombie_soldier_acid_2", "overlay_male_wielded_corpse_mon_zombie_shriekling", "overlay_male_wielded_corpse_mon_zombie_ears", "overlay_male_wielded_corpse_mon_zombie_nullfield", "overlay_male_wielded_corpse_mon_zombie_waif", "overlay_male_wielded_corpse_mon_zombie_sproglodyte", "overlay_male_wielded_corpse_mon_zombie_creepy", "overlay_male_wielded_corpse_mon_zombie_anklebiter", "overlay_male_wielded_corpse_mon_zombie_bio_op", "overlay_male_wielded_corpse_mon_zombie_armored", "overlay_male_wielded_corpse_mon_zombie_prisoner", "overlay_male_wielded_corpse_mon_zombie_military_pilot"], "fg": 1901}, {"id": ["overlay_female_wielded_corpse_mon_zombie", "overlay_female_wielded_corpse_mon_zombie_grappler", "overlay_female_wielded_corpse_mon_zombie_biter", "overlay_female_wielded_corpse_mon_zombie_tough", "overlay_female_wielded_corpse_mon_zombie_hunter", "overlay_female_wielded_corpse_mon_zombie_brute", "overlay_female_wielded_corpse_mon_zombie_predator", "overlay_female_wielded_corpse_mon_zombie_necro", "overlay_female_wielded_corpse_mon_zombie_thorny", "overlay_female_wielded_corpse_mon_zombie_smoker", "overlay_female_wielded_corpse_mon_zombie_shady", "overlay_female_wielded_corpse_mon_zombie_master", "overlay_female_wielded_corpse_mon_zombie_acidic", "overlay_female_wielded_corpse_mon_zombie_fat", "overlay_female_wielded_corpse_mon_zombie_corrosive", "overlay_female_wielded_corpse_mon_zombie_screecher", "overlay_female_wielded_corpse_mon_zombie_scientist", "overlay_female_wielded_corpse_mon_zombie_runner", "overlay_female_wielded_corpse_mon_zombie_spitter", "overlay_female_wielded_corpse_mon_zombie_labsecurity", "overlay_female_wielded_corpse_mon_zombie_child", "overlay_female_wielded_corpse_mon_zombie_hulk", "overlay_female_wielded_corpse_mon_zombie_brute_grappler", "overlay_female_wielded_corpse_mon_zombie_brute_ninja", "overlay_female_wielded_corpse_mon_zombie_kevlar_2", "overlay_female_wielded_corpse_mon_zombie_kevlar_1", "overlay_female_wielded_corpse_mon_zombie_hazmat", "overlay_female_wielded_corpse_mon_zombie_electric", "overlay_female_wielded_corpse_mon_zombie_technician", "overlay_female_wielded_corpse_mon_zombie_fungus", "overlay_female_wielded_corpse_mon_zombie_cop", "overlay_female_wielded_corpse_mon_zombie_child_fungus", "overlay_female_wielded_corpse_mon_zombie_swimmer", "overlay_female_wielded_corpse_mon_zombie_mancroc", "overlay_female_wielded_corpse_mon_zombie_soldier", "overlay_female_wielded_corpse_mon_zombie_skull", "overlay_female_wielded_corpse_mon_zombie_brainless", "overlay_female_wielded_corpse_mon_zombie_survivor", "overlay_female_wielded_corpse_mon_zombie_brute_shocker", "overlay_female_wielded_corpse_mon_zombie_soldier_acid_1", "overlay_female_wielded_corpse_mon_zombie_soldier_blackops_2", "overlay_female_wielded_corpse_mon_zombie_soldier_blackops_1", "overlay_female_wielded_corpse_mon_zombie_soldier_acid_2", "overlay_female_wielded_corpse_mon_zombie_shriekling", "overlay_female_wielded_corpse_mon_zombie_ears", "overlay_female_wielded_corpse_mon_zombie_nullfield", "overlay_female_wielded_corpse_mon_zombie_waif", "overlay_female_wielded_corpse_mon_zombie_sproglodyte", "overlay_female_wielded_corpse_mon_zombie_creepy", "overlay_female_wielded_corpse_mon_zombie_anklebiter", "overlay_female_wielded_corpse_mon_zombie_bio_op", "overlay_female_wielded_corpse_mon_zombie_armored", "overlay_female_wielded_corpse_mon_zombie_prisoner", "overlay_female_wielded_corpse_mon_zombie_military_pilot"], "fg": 1903}, {"id": "overlay_wielded_box_medium", "fg": 1905}, {"id": "overlay_wielded_rock", "fg": 1906}, {"id": "overlay_female_wielded_stick_long", "fg": 1907}, {"id": "overlay_male_wielded_stick_long", "fg": 1908}, {"id": "overlay_wielded_log", "fg": 1909}, {"id": "overlay_female_wielded_television", "fg": 1911}, {"id": "overlay_male_wielded_television", "fg": 1910}, {"id": "overlay_wielded_jar_glass_sealed", "fg": 1912}, {"id": "overlay_wielded_jar_3l_glass", "fg": 1913}, {"id": "overlay_female_wielded_bwirebat", "fg": 1914}, {"id": "overlay_male_wielded_bwirebat", "fg": 1915}, {"id": "overlay_wielded_bag_plastic", "fg": 1916}, {"id": "overlay_female_wielded_splinter", "fg": 1918}, {"id": "overlay_male_wielded_splinter", "fg": 1917}, {"id": "overlay_wielded_ar15", "fg": 1919}, {"id": "overlay_female_worn_pants_army", "fg": 1921}, {"id": "overlay_male_worn_pants_army", "fg": 1920}, {"id": "overlay_female_worn_hat_noise_cancelling", "fg": 1923}, {"id": "overlay_male_worn_hat_noise_cancelling", "fg": 1922}, {"id": "overlay_female_worn_striped_pants", "fg": 1924}, {"id": "overlay_male_worn_striped_pants", "fg": 1925}, {"id": "overlay_female_worn_motorbike_pants", "fg": 1927}, {"id": "overlay_male_worn_motorbike_pants", "fg": 1926}, {"id": "overlay_female_worn_beekeeping_hood", "fg": 1928}, {"id": "overlay_male_worn_beekeeping_hood", "fg": 1929}, {"id": "overlay_male_worn_ski_jacket", "fg": 1931}, {"id": "overlay_female_worn_ski_jacket", "fg": 1930}, {"id": "overlay_female_worn_boots_bunker", "fg": 1932}, {"id": "overlay_male_worn_boots_bunker", "fg": 1933}, {"id": "overlay_male_worn_leg_warmers", "fg": 1935}, {"id": "overlay_female_worn_leg_warmers", "fg": 1934}, {"id": "overlay_worn_dress_shoes", "fg": 1936}, {"id": "overlay_male_worn_glasses_bifocal", "fg": 1938}, {"id": "overlay_female_worn_glasses_bifocal", "fg": 1937}, {"id": "overlay_female_worn_glasses_safety", "fg": 1940}, {"id": "overlay_male_worn_glasses_safety", "fg": 1939}, {"id": "overlay_female_worn_ragpouch", "fg": 1941}, {"id": "overlay_male_worn_ragpouch", "fg": 1942}, {"id": "overlay_female_worn_welding_mask_crude_raised", "fg": 1943}, {"id": "overlay_male_worn_welding_mask_crude_raised", "fg": 1944}, {"id": "overlay_male_worn_gloves_leather", "fg": 1946}, {"id": "overlay_female_worn_gloves_leather", "fg": 1945}, {"id": "overlay_female_worn_helmet_army", "fg": 1947}, {"id": "overlay_male_worn_helmet_army", "fg": 1948}, {"id": "overlay_female_worn_pants_faux_fur", "fg": 1949}, {"id": "overlay_male_worn_pants_faux_fur", "fg": 1950}, {"id": "overlay_male_worn_long_glove_white", "fg": 1952}, {"id": "overlay_female_worn_long_glove_white", "fg": 1951}, {"id": "overlay_female_worn_jacket_army", "fg": 1953}, {"id": "overlay_male_worn_jacket_army", "fg": 1954}, {"id": "overlay_female_worn_pants_cargo", "fg": 1955}, {"id": "overlay_male_worn_pants_cargo", "fg": 1956}, {"id": "overlay_female_worn_gloves_work", "fg": 1957}, {"id": "overlay_male_worn_gloves_work", "fg": 1958}, {"id": "overlay_female_worn_geta", "fg": 1959}, {"id": "overlay_male_worn_geta", "fg": 1960}, {"id": "overlay_male_worn_hat_fur", "fg": 1961}, {"id": "overlay_female_worn_hat_fur", "fg": 1962}, {"id": "overlay_female_worn_gloves_wool", "fg": 1964}, {"id": "overlay_male_worn_gloves_wool", "fg": 1963}, {"id": "overlay_male_worn_arm_warmers", "fg": 1965}, {"id": "overlay_female_worn_arm_warmers", "fg": 1966}, {"id": "overlay_female_worn_beret", "fg": 1968}, {"id": "overlay_male_worn_beret", "fg": 1967}, {"id": "overlay_female_worn_boxer_briefs", "fg": 1969}, {"id": "overlay_male_worn_boxer_briefs", "fg": 1970}, {"id": "overlay_male_worn_touring_suit", "fg": 1972}, {"id": "overlay_female_worn_touring_suit", "fg": 1971}, {"id": "overlay_female_worn_pants_checkered", "fg": 1974}, {"id": "overlay_male_worn_pants_checkered", "fg": 1973}, {"id": "overlay_male_worn_turban", "fg": 1975}, {"id": "overlay_female_worn_turban", "fg": 1976}, {"id": "overlay_female_worn_pants_ski", "fg": 1978}, {"id": "overlay_male_worn_pants_ski", "fg": 1977}, {"id": "overlay_female_worn_glasses_bal", "fg": 1979}, {"id": "overlay_male_worn_glasses_bal", "fg": 1980}, {"id": "overlay_male_worn_boots", "fg": 1981}, {"id": "overlay_female_worn_boots", "fg": 1982}, {"id": "overlay_female_worn_corset", "fg": 1984}, {"id": "overlay_male_worn_corset", "fg": 1983}, {"id": "overlay_female_worn_welding_mask", "fg": 1985}, {"id": "overlay_male_worn_welding_mask", "fg": 1986}, {"id": "overlay_female_worn_jacket_flannel", "fg": 1987}, {"id": "overlay_male_worn_jacket_flannel", "fg": 1988}, {"id": "overlay_male_worn_shorts", "fg": 1990}, {"id": "overlay_female_worn_shorts", "fg": 1989}, {"id": "overlay_female_worn_dinosuit", "fg": 1992}, {"id": "overlay_male_worn_dinosuit", "fg": 1991}, {"id": "overlay_male_worn_undershirt", "fg": 1993}, {"id": "overlay_female_worn_boots_combat", "fg": 1994}, {"id": "overlay_male_worn_boots_combat", "fg": 1995}, {"id": "overlay_female_worn_stockings", "fg": 1996}, {"id": "overlay_male_worn_stockings", "fg": 1997}, {"id": "overlay_male_worn_skirt_leather", "fg": 1999}, {"id": "overlay_female_worn_skirt_leather", "fg": 1998}, {"id": "overlay_female_worn_boots_rubber", "fg": 2001}, {"id": "overlay_male_worn_boots_rubber", "fg": 2000}, {"id": "overlay_female_worn_dress_shirt", "fg": 2002}, {"id": "overlay_male_worn_dress_shirt", "fg": 2003}, {"id": "overlay_female_worn_gloves_golf", "fg": 2005}, {"id": "overlay_male_worn_gloves_golf", "fg": 2004}, {"id": "overlay_female_worn_army_top", "fg": 2006}, {"id": "overlay_male_worn_army_top", "fg": 2007}, {"id": "overlay_female_worn_boxer_shorts", "fg": 2009}, {"id": "overlay_male_worn_boxer_shorts", "fg": 2008}, {"id": "overlay_female_worn_helmet_kabuto", "fg": 2010}, {"id": "overlay_male_worn_helmet_kabuto", "fg": 2011}, {"id": "overlay_male_worn_shoes_bowling", "fg": 2012}, {"id": "overlay_female_worn_shoes_bowling", "fg": 2013}, {"id": "overlay_female_worn_gloves_medical", "fg": 2014}, {"id": "overlay_male_worn_gloves_medical", "fg": 2015}, {"id": "overlay_worn_jacket_jean", "fg": 2016}, {"id": "overlay_female_worn_boots_fur", "fg": 2017}, {"id": "overlay_male_worn_boots_fur", "fg": 2018}, {"id": "overlay_male_worn_blanket", "fg": 2021}, {"id": "overlay_female_worn_blanket", "fg": 2020}, {"id": "overlay_male_worn_down_blanket", "fg": 2019}, {"id": "overlay_female_worn_down_blanket", "fg": 2022}, {"id": "overlay_male_worn_cargo_pants", "fg": 2023}, {"id": "overlay_female_worn_panties", "fg": 2024}, {"id": "overlay_male_worn_panties", "fg": 2025}, {"id": "overlay_female_worn_hat_hard", "fg": 2026}, {"id": "overlay_male_worn_hat_hard", "fg": 2027}, {"id": "overlay_male_worn_glasses_eye", "fg": 2029}, {"id": "overlay_female_worn_glasses_eye", "fg": 2028}, {"id": "overlay_female_worn_helmet_chitin", "fg": 2031}, {"id": "overlay_male_worn_helmet_chitin", "fg": 2030}, {"id": "overlay_female_worn_boy_shorts", "fg": 2032}, {"id": "overlay_male_worn_boy_shorts", "fg": 2033}, {"id": "overlay_male_worn_sweatshirt", "fg": 2034}, {"id": "overlay_female_worn_sweatshirt", "fg": 2035}, {"id": "overlay_male_worn_rucksack", "fg": 2037}, {"id": "overlay_female_worn_rucksack", "fg": 2036}, {"id": "overlay_female_worn_sunglasses", "fg": 2039}, {"id": "overlay_male_worn_sunglasses", "fg": 2038}, {"id": "overlay_female_worn_mask_dust", "fg": 2040}, {"id": "overlay_male_worn_mask_dust", "fg": 2041}, {"id": "overlay_male_worn_helmet_motor", "fg": 2043}, {"id": "overlay_female_worn_helmet_motor", "fg": 2042}, {"id": "overlay_female_worn_sweater", "fg": 2044}, {"id": "overlay_male_worn_sweater", "fg": 2045}, {"id": "overlay_female_worn_jacket_light", "fg": 2046}, {"id": "overlay_male_worn_jacket_light", "fg": 2047}, {"id": "overlay_male_worn_skirt", "fg": 2049}, {"id": "overlay_female_worn_skirt", "fg": 2048}, {"id": "overlay_female_worn_striped_shirt", "fg": 2051}, {"id": "overlay_male_worn_striped_shirt", "fg": 2050}, {"id": "overlay_female_worn_hat_ball", "fg": 2053}, {"id": "overlay_male_worn_hat_ball", "fg": 2052}, {"id": "overlay_male_worn_bra", "fg": 2055}, {"id": "overlay_female_worn_bra", "fg": 2054}, {"id": "overlay_male_worn_glove_jackson", "fg": 2057}, {"id": "overlay_female_worn_glove_jackson", "fg": 2056}, {"id": "overlay_male_worn_boots_western", "fg": 2058}, {"id": "overlay_female_worn_boots_western", "fg": 2059}, {"id": "overlay_female_worn_hazmat_suit", "fg": 2060}, {"id": "overlay_male_worn_hazmat_suit", "fg": 2061}, {"id": "overlay_female_worn_scarf", "fg": 2063}, {"id": "overlay_male_worn_scarf", "fg": 2062}, {"id": "overlay_male_worn_kevlar", "fg": 2065}, {"id": "overlay_female_worn_kevlar", "fg": 2064}, {"id": "overlay_female_worn_backpack_leather", "fg": 2066}, {"id": "overlay_male_worn_backpack_leather", "fg": 2067}, {"id": "overlay_female_worn_armor_samurai", "fg": 2069}, {"id": "overlay_male_worn_armor_samurai", "fg": 2068}, {"id": "overlay_female_worn_jumpsuit", "fg": 2071}, {"id": "overlay_male_worn_jumpsuit", "fg": 2070}, {"id": "overlay_female_worn_jeans", "fg": 2072}, {"id": "overlay_male_worn_jeans", "fg": 2073}, {"id": "overlay_female_worn_boots_winter", "fg": 2075}, {"id": "overlay_male_worn_boots_winter", "fg": 2074}, {"id": "overlay_female_worn_shorts_denim", "fg": 2076}, {"id": "overlay_male_worn_shorts_denim", "fg": 2077}, {"id": "overlay_female_worn_gloves_rubber", "fg": 2079}, {"id": "overlay_male_worn_gloves_rubber", "fg": 2078}, {"id": "overlay_male_worn_hat_cotton", "fg": 2080}, {"id": "overlay_female_worn_hat_cotton", "fg": 2081}, {"id": "overlay_male_worn_robofac_jumpsuit", "fg": 2083}, {"id": "overlay_female_worn_robofac_jumpsuit", "fg": 2082}, {"id": "overlay_female_worn_gloves_liner", "fg": 2084}, {"id": "overlay_male_worn_gloves_liner", "fg": 2085}, {"id": "overlay_female_worn_shorts_cargo", "fg": 2087}, {"id": "overlay_male_worn_shorts_cargo", "fg": 2086}, {"id": "overlay_female_worn_coat_lab", "fg": 2089}, {"id": "overlay_male_worn_coat_lab", "fg": 2088}, {"id": "overlay_male_worn_tank_top", "fg": 2091}, {"id": "overlay_female_worn_tank_top", "fg": 2090}, {"id": "overlay_male_worn_socks", "fg": 2093}, {"id": "overlay_female_worn_socks", "fg": 2092}, {"id": "overlay_female_worn_sports_bra", "fg": 2094}, {"id": "overlay_male_worn_sports_bra", "fg": 2095}, {"id": "overlay_male_worn_bunker_coat", "fg": 2097}, {"id": "overlay_female_worn_bunker_coat", "fg": 2096}, {"id": "overlay_female_worn_gloves_winter", "fg": 2098}, {"id": "overlay_male_worn_gloves_winter", "fg": 2099}, {"id": "overlay_female_worn_mittens", "fg": 2101}, {"id": "overlay_male_worn_mittens", "fg": 2100}, {"id": "overlay_female_worn_glasses_reading", "fg": 2103}, {"id": "overlay_male_worn_glasses_reading", "fg": 2102}, {"id": "overlay_female_worn_longshirt", "fg": 2105}, {"id": "overlay_male_worn_longshirt", "fg": 2104}, {"id": "overlay_female_worn_gloves_cut_resistant", "fg": 2106}, {"id": "overlay_male_worn_gloves_cut_resistant", "fg": 2107}, {"id": "overlay_female_worn_pants", "fg": 2109}, {"id": "overlay_male_worn_pants", "fg": 2108}, {"id": "overlay_female_worn_maid_hat", "fg": 2112}, {"id": "overlay_female_worn_maid_dress", "fg": 2111}, {"id": "overlay_male_worn_maid_hat", "fg": 2110}, {"id": "overlay_male_worn_maid_dress", "fg": 2113}, {"id": "overlay_male_worn_bunker_pants", "fg": 2114}, {"id": "overlay_female_worn_bunker_pants", "fg": 2115}, {"id": "overlay_female_worn_helmet_bike", "fg": 2116}, {"id": "overlay_male_worn_helmet_bike", "fg": 2117}, {"id": "overlay_female_worn_pants_leather", "fg": 2118}, {"id": "overlay_male_worn_pants_leather", "fg": 2119}, {"id": "overlay_male_worn_boots_steel", "fg": 2121}, {"id": "overlay_female_worn_boots_steel", "fg": 2120}, {"id": "overlay_female_worn_survivor_suit", "fg": 2123}, {"id": "overlay_male_worn_survivor_suit", "fg": 2122}, {"id": "overlay_female_worn_pants_fur", "fg": 2124}, {"id": "overlay_male_worn_pants_fur", "fg": 2125}, {"id": "overlay_female_worn_gloves_fingerless", "fg": 2127}, {"id": "overlay_male_worn_gloves_fingerless", "fg": 2126}, {"id": "overlay_female_worn_union_suit", "fg": 2128}, {"id": "overlay_male_worn_union_suit", "fg": 2129}, {"id": "overlay_female_worn_sneakers", "fg": 2130}, {"id": "overlay_male_worn_sneakers", "fg": 2131}, {"id": "overlay_male_worn_flip_flops", "fg": 2133}, {"id": "overlay_female_worn_flip_flops", "fg": 2132}, {"id": "overlay_male_worn_tshirt", "fg": 2135}, {"id": "overlay_female_worn_tshirt", "fg": 2134}, {"id": "overlay_female_worn_boots_hiking", "fg": 2136}, {"id": "overlay_male_worn_boots_hiking", "fg": 2137}, {"id": "overlay_female_worn_gloves_fur", "fg": 2139}, {"id": "overlay_male_worn_gloves_fur", "fg": 2138}, {"id": "overlay_male_worn_firehelmet", "fg": 2141}, {"id": "overlay_female_worn_firehelmet", "fg": 2140}, {"id": "overlay_female_worn_welding_mask_raised", "fg": 2143}, {"id": "overlay_male_worn_welding_mask_raised", "fg": 2142}, {"id": "overlay_female_worn_bandana", "fg": 2144}, {"id": "overlay_male_worn_bandana", "fg": 2145}, {"id": "overlay_male_worn_hat_knit", "fg": 2147}, {"id": "overlay_female_worn_hat_knit", "fg": 2146}, {"id": "overlay_female_worn_hoodie", "fg": 2149}, {"id": "overlay_male_worn_hoodie", "fg": 2148}, {"id": "overlay_male_worn_coat_winter", "fg": 2150}, {"id": "overlay_female_worn_coat_winter", "fg": 2151}, {"id": "overlay_female_worn_duster", "fg": 2152}, {"id": "overlay_male_worn_duster", "fg": 2153}, {"id": "overlay_female_worn_glasses_monocle", "fg": 2154}, {"id": "overlay_male_worn_glasses_monocle", "fg": 2155}, {"id": "overlay_male_worn_welding_mask_crude", "fg": 2157}, {"id": "overlay_female_worn_welding_mask_crude", "fg": 2156}, {"id": "overlay_male_worn_balclava", "fg": 2159}, {"id": "overlay_female_worn_balclava", "fg": 2158}, {"id": "overlay_female_worn_motorbike_boots", "fg": 2161}, {"id": "overlay_male_worn_motorbike_boots", "fg": 2160}, {"id": "overlay_female_worn_helmet_barbute", "fg": 2162}, {"id": "overlay_male_worn_helmet_barbute", "fg": 2163}, {"id": "overlay_female_worn_gloves_tactical", "fg": 2165}, {"id": "overlay_male_worn_gloves_tactical", "fg": 2164}, {"id": "overlay_female_worn_jeans_red", "fg": 2167}, {"id": "overlay_male_worn_jeans_red", "fg": 2166}, {"id": "overlay_female_worn_cowboy_hat", "fg": 2168}, {"id": "overlay_male_worn_cowboy_hat", "fg": 2169}, {"id": "overlay_male_worn_sundress", "fg": 2171}, {"id": "overlay_female_worn_sundress", "fg": 2170}, {"id": "overlay_female_worn_coat_rain", "fg": 2172}, {"id": "overlay_male_worn_coat_rain", "fg": 2173}, {"id": "overlay_male_worn_gloves_light", "fg": 2175}, {"id": "overlay_female_worn_gloves_light", "fg": 2174}, {"id": "mon_skeleton", "fg": 2176, "bg": 2179}, {"id": "mon_dermatik", "fg": 2177, "bg": 2179}, {"id": "mon_zombie_brainless", "fg": 2178, "bg": 2179}, {"id": "mon_zombie_soldier", "fg": 2180, "bg": 2179}, {"id": "mon_fungaloid", "fg": 2181, "bg": 2179}, {"id": "mon_zougar", "fg": 2182, "bg": 2179}, {"id": "mon_bee", "fg": 2183, "bg": 2179}, {"id": "mon_zombie_swimmer", "fg": 2184, "bg": 2179}, {"id": "mon_mosquito_giant", "fg": 2185, "bg": 2179}, {"id": "mon_cougar", "fg": 2186, "bg": 2179}, {"id": "mon_dragonfly_giant", "fg": 2187, "bg": 2179}, {"id": "mon_fly", "fg": 2188, "bg": 2179}], "//": "range 1617 to 2192", "sprite_width": 32, "sprite_height": 64, "sprite_offset_x": 0, "sprite_offset_y": -32}, {"file": "large.png", "tiles": [{"id": "f_rotary_clothesline", "fg": 2193}, {"id": "f_fridge", "fg": 2194}, {"id": "t_tree_young", "fg": [{"weight": 100, "sprite": 2204}, {"weight": 100, "sprite": 2202}], "bg": 2195}, {"id": "t_tree_young_season_summer", "fg": [{"weight": 100, "sprite": 2200}, {"weight": 100, "sprite": 2201}], "bg": 2198, "rotates": false}, {"id": "t_tree_young_season_autumn", "fg": [{"weight": 100, "sprite": 2206}, {"weight": 100, "sprite": 2205}], "bg": 2197, "rotates": false}, {"id": "t_tree_young_season_winter", "fg": [{"weight": 100, "sprite": 2203}, {"weight": 100, "sprite": 2199}], "bg": 2196, "rotates": false}, {"id": "mon_zoose", "fg": 2207, "bg": 2233}, {"id": "mon_zombie_acidic", "fg": 2210, "bg": 2231}, {"id": "mon_zombie_corrosive", "fg": 2208, "bg": 2231}, {"id": "mon_zombie_spitter", "fg": 2211, "bg": 2231}, {"id": "corpse_mon_zombie_spitter", "fg": 2209}, {"id": "mon_moose", "fg": [{"weight": 2, "sprite": 2213}, {"weight": 2, "sprite": 2212}], "bg": 2233}, {"id": "mon_zombear", "fg": 2214, "bg": 2232}, {"id": "mon_zombie_grappler", "fg": [{"weight": 1, "sprite": 2216}, {"weight": 1, "sprite": 2215}], "bg": 2231}, {"id": "mon_boomer", "fg": 2217, "bg": 2231}, {"id": "mon_zombie", "fg": [{"weight": 100, "sprite": 2218}, {"weight": 150, "sprite": 2221}, {"weight": 100, "sprite": 2223}, {"weight": 100, "sprite": 2219}, {"weight": 150, "sprite": 2220}], "bg": 2231}, {"id": ["corpse_mon_zombie", "corpse_mon_zombie_grappler", "corpse_mon_zombie_biter", "corpse_mon_zombie_hunter", "corpse_mon_zombie_brute", "corpse_mon_zombie_predator", "corpse_mon_zombie_necro", "corpse_mon_zombie_thorny", "corpse_mon_zombie_smoker", "corpse_mon_zombie_shady", "corpse_mon_zombie_master", "corpse_mon_zombie_acidic", "corpse_mon_zombie_fat", "corpse_mon_zombie_corrosive", "corpse_mon_zombie_screecher", "corpse_mon_zombie_scientist", "corpse_mon_zombie_runner", "corpse_mon_zombie_labsecurity", "corpse_mon_zombie_child", "corpse_mon_zombie_hulk", "corpse_mon_zombie_brute_grappler", "corpse_mon_zombie_brute_ninja", "corpse_mon_zombie_kevlar_2", "corpse_mon_zombie_kevlar_1", "corpse_mon_zombie_hazmat", "corpse_mon_zombie_electric", "corpse_mon_zombie_technician", "corpse_mon_zombie_fungus", "corpse_mon_zombie_cop", "corpse_mon_zombie_child_fungus", "corpse_mon_zombie_swimmer", "corpse_mon_zombie_mancroc", "corpse_mon_zombie_soldier", "corpse_mon_zombie_skull", "corpse_mon_zombie_brainless", "corpse_mon_zombie_survivor", "corpse_mon_zombie_brute_shocker", "corpse_mon_zombie_soldier_acid_1", "corpse_mon_zombie_soldier_blackops_2", "corpse_mon_zombie_soldier_blackops_1", "corpse_mon_zombie_soldier_acid_2", "corpse_mon_zombie_shriekling", "corpse_mon_zombie_ears", "corpse_mon_zombie_nullfield", "corpse_mon_zombie_waif", "corpse_mon_zombie_sproglodyte", "corpse_mon_zombie_creepy", "corpse_mon_zombie_anklebiter", "corpse_mon_zombie_bio_op", "corpse_mon_zombie_armored", "corpse_mon_zombie_prisoner", "corpse_mon_zombie_military_pilot"], "fg": 2222}, {"id": "mon_zombie_smoker", "fg": 2224, "bg": 2231}, {"id": "mon_zombie_necro", "fg": 2225, "bg": 2231}, {"id": "mon_zombie_biter", "fg": 2226, "bg": 2232}, {"id": "mon_zombie_hunter", "fg": 2228, "bg": 2232}, {"id": "mon_zombie_cop", "fg": 2230, "bg": 2231}, {"id": "mon_zombie_labsecurity", "fg": 2229, "bg": 2231}, {"id": "mon_zombie_rot", "fg": 2234, "bg": 2231}, {"id": "mon_zombie_gasbag", "fg": [{"weight": 1, "sprite": 2236}, {"weight": 1, "sprite": 2235}], "bg": 2231}, {"id": "mon_blob_large", "fg": 2237, "bg": 2233}, {"id": "mon_ant_soldier", "fg": 2242, "bg": 2233}, {"id": "mon_ant_acid_soldier", "fg": 2245, "bg": 2233}, {"id": "corpse_mon_ant_soldier", "fg": 2243}, {"id": "corpse_mon_ant_acid_soldier", "fg": 2241}, {"id": "mon_ant_queen", "fg": 2239, "bg": 2233}, {"id": "mon_ant_acid_queen", "fg": 2238, "bg": 2233}, {"id": "corpse_mon_ant_queen", "fg": 2240}, {"id": "corpse_mon_ant_acid_queen", "fg": 2244}, {"id": "mon_zombie_shady", "fg": 2246, "bg": 2231}, {"id": "mon_zombie_crawler", "fg": 2247, "bg": 2231}, {"id": "mon_zombie_fat", "fg": [{"weight": 1, "sprite": 2248}, {"weight": 1, "sprite": 2249}], "bg": 2231}, {"id": "mon_zombie_tough", "fg": 2250, "bg": 2231}, {"id": "corpse_mon_zombie_tough", "fg": 2251}, {"id": "mon_zombie_electric", "fg": [{"weight": 1, "sprite": 2254}, {"weight": 1, "sprite": 2252}], "bg": 2231}, {"id": "mon_zombie_nullfield", "fg": [{"weight": 1, "sprite": 2253}, {"weight": 1, "sprite": 2255}], "bg": 2231}, {"id": "mon_zombie_scientist", "fg": [{"weight": 1, "sprite": 2257}, {"weight": 1, "sprite": 2256}], "bg": 2231}, {"id": "mon_wasp", "fg": 2258, "bg": 2232}, {"id": "mon_zombie_runner", "fg": 2259, "bg": 2231}, {"id": "mon_mi_go", "fg": 2260, "bg": 2232}, {"id": "mon_zombie_brute", "fg": [{"weight": 100, "sprite": 2261}, {"weight": 100, "sprite": 2262}, {"weight": 50, "sprite": 2264}, {"weight": 50, "sprite": 2263}], "bg": 2232}, {"id": "mon_bear", "fg": 2265, "bg": 2232}], "//": "range 2193 to 2272", "sprite_width": 64, "sprite_height": 64, "sprite_offset_x": -16, "sprite_offset_y": -32}, {"file": "huge.png", "tiles": [{"id": "mon_zombie_hulk", "fg": 2273}], "//": "range 2273 to 2288", "sprite_width": 64, "sprite_height": 96, "sprite_offset_x": -16, "sprite_offset_y": -64}, {"file": "giant.png", "tiles": [{"id": "t_tree", "fg": [{"weight": 100, "sprite": 2297}, {"weight": 100, "sprite": 2296}, {"weight": 100, "sprite": 2298}, {"weight": 100, "sprite": 2292}], "bg": 2302}, {"id": "t_tree_season_summer", "fg": [{"weight": 100, "sprite": 2290}, {"weight": 100, "sprite": 2295}, {"weight": 100, "sprite": 2291}, {"weight": 100, "sprite": 2289}], "bg": 2303}, {"id": "t_tree_season_autumn", "fg": [{"weight": 100, "sprite": 2300}, {"weight": 100, "sprite": 2294}, {"weight": 100, "sprite": 2293}, {"weight": 100, "sprite": 2299}], "bg": 2301}, {"id": "t_tree_season_winter", "fg": [{"weight": 100, "sprite": 2306}, {"weight": 100, "sprite": 2307}, {"weight": 100, "sprite": 2305}, {"weight": 100, "sprite": 2308}], "bg": 2304}, {"id": "t_tree_dead", "fg": [{"weight": 100, "sprite": 2306}, {"weight": 100, "sprite": 2307}, {"weight": 100, "sprite": 2305}, {"weight": 100, "sprite": 2308}, {"weight": 100, "sprite": 2611}], "bg": 2302}, {"id": "t_tree_dead_season_summer", "fg": [{"weight": 100, "sprite": 2306}, {"weight": 100, "sprite": 2307}, {"weight": 100, "sprite": 2305}, {"weight": 100, "sprite": 2308}, {"weight": 100, "sprite": 2611}], "bg": 2303}, {"id": "t_tree_dead_season_autumn", "fg": [{"weight": 100, "sprite": 2306}, {"weight": 100, "sprite": 2307}, {"weight": 100, "sprite": 2305}, {"weight": 100, "sprite": 2308}, {"weight": 100, "sprite": 2611}], "bg": 2301}, {"id": "t_tree_dead_season_winter", "fg": [{"weight": 100, "sprite": 2306}, {"weight": 100, "sprite": 2307}, {"weight": 100, "sprite": 2305}, {"weight": 100, "sprite": 2308}, {"weight": 100, "sprite": 2611}], "bg": 2304}, {"id": "t_tree_birch", "fg": [{"weight": 1, "sprite": 2313}, {"weight": 1, "sprite": 2310}], "bg": 2302}, {"id": "t_tree_birch_season_summer", "fg": [{"weight": 1, "sprite": 2313}, {"weight": 1, "sprite": 2310}], "bg": 2303}, {"id": "t_tree_birch_season_winter", "fg": [{"weight": 1, "sprite": 2314}, {"weight": 1, "sprite": 2311}], "bg": 2304}, {"id": "t_tree_birch_season_autumn", "fg": [{"weight": 1, "sprite": 2312}, {"weight": 1, "sprite": 2309}], "bg": 2301}], "//": "range 2289 to 2320", "sprite_width": 96, "sprite_height": 96, "sprite_offset_x": -32, "sprite_offset_y": -64}, {"file": "incomplete.png", "tiles": [{"id": "f_sink", "multitile": true, "fg": 2331, "additional_tiles": [{"id": "center", "fg": 2336}, {"id": "corner", "fg": [2322, 2334, 2326, 2321]}, {"id": "t_connection", "fg": [2328, 2335, 2330, 2325]}, {"id": "edge", "fg": [2329, 2327]}, {"id": "end_piece", "fg": [2333, 2324, 2323, 2332]}, {"id": "unconnected", "fg": 2331}]}, {"id": "toolbox", "fg": 2337}, {"id": "acoustic_guitar", "fg": 2338}, {"id": "rope_6", "fg": 2339}, {"id": "colt_army", "fg": 2340}, {"id": "ref_lighter", "fg": 2341}, {"id": "soap", "fg": 2342}, {"id": "waffleiron", "fg": 2343}, {"id": "bubblewrap", "fg": 2344}, {"id": "soldering_iron", "fg": 2345}, {"id": "stepladder", "fg": 2346}, {"id": "mag_pistol", "fg": 2347}, {"id": "brazier", "fg": 2348}, {"id": "pliers", "fg": 2349}, {"id": "spray_can", "fg": 2350}, {"id": "condom", "fg": 2351}, {"id": "colt_navy", "fg": 2352}, {"id": "hotplate", "fg": 2353}, {"id": "charcoal", "fg": 2354}, {"id": "stanag30", "fg": 2355}, {"id": "keg", "fg": 2356}, {"id": "pitchfork", "fg": 2357}, {"id": "knife_steak", "fg": 2358}, {"id": "wood_beam", "fg": 2359}, {"id": "smart_phone", "fg": 2360}, {"id": "mosin91_30", "fg": 2361}, {"id": "extinguisher", "fg": 2362}, {"id": "hk_mp5", "fg": 2363}, {"id": "sw_610", "fg": 2364}, {"id": "colt_lightning", "fg": 2365}, {"id": "mag_smg", "fg": 2366}, {"id": "duct_tape", "fg": 2367}, {"id": "t_chainfence", "multitile": true, "rotates": false, "fg": 2368, "bg": 1376, "additional_tiles": [{"id": "edge", "bg": 1376, "fg": [2371, 2368]}, {"id": "end_piece", "bg": 1376, "fg": [2371, 2368, 2371, 2368]}, {"bg": 1376, "id": "unconnected", "fg": 2368}]}, {"id": "t_chainfence_season_winter", "multitile": true, "rotates": false, "fg": 2368, "bg": 643, "additional_tiles": [{"id": "edge", "bg": 643, "fg": [2371, 2368]}, {"id": "end_piece", "bg": 643, "fg": [2371, 2368, 2371, 2368]}, {"bg": 643, "id": "unconnected", "fg": 2368}]}, {"id": "t_chaingate_c", "fg": 2372, "bg": 1376}, {"id": "t_chaingate_l", "fg": 2373, "bg": 1376}, {"id": "t_chaingate_o", "fg": 2369, "bg": 1376}, {"id": "t_chainfence_posts", "fg": 2370, "bg": 1376}, {"id": "t_chaingate_c_season_winter", "fg": 2372, "bg": 643}, {"id": "t_chaingate_l_season_winter", "fg": 2373, "bg": 643}, {"id": "t_chaingate_o_season_winter", "fg": 2369, "bg": 643}, {"id": "t_chainfence_posts_season_winter", "fg": 2370, "bg": 643}, {"id": "t_strconc_wall", "fg": 2374}, {"id": "t_splitrail_fence_season_spring", "fg": 2375, "bg": 1233}, {"id": "t_splitrail_fence_season_summer", "fg": 2375, "bg": 1240}, {"id": "t_splitrail_fence_season_autumn", "fg": 2375, "bg": 1234}, {"id": "t_splitrail_fence_season_winter", "fg": 2375, "bg": 643}, {"id": "t_railing", "fg": 2376, "bg": 1233}, {"id": "t_console", "fg": 2377}, {"id": "t_underbrush", "fg": [{"weight": 100, "sprite": 2380}, {"weight": 100, "sprite": 2379}], "bg": 1233}, {"id": "t_underbrush_harvested", "fg": 2378, "bg": 1233}, {"id": "t_underbrush_season_summer", "fg": [{"weight": 100, "sprite": 2380}, {"weight": 100, "sprite": 2379}], "bg": 1240}, {"id": "t_underbrush_harvested_season_summer", "fg": 2378, "bg": 1240}, {"id": "t_underbrush_season_autumn", "fg": [{"weight": 100, "sprite": 2380}, {"weight": 100, "sprite": 2379}], "bg": 1234}, {"id": "t_underbrush_harvested_season_winter", "fg": 2378, "bg": 644}, {"id": "t_underbrush_season_winter", "fg": [{"weight": 100, "sprite": 2380}, {"weight": 100, "sprite": 2379}], "bg": 644}, {"id": ["t_window_boarded", "t_window_boarded_noglass"], "fg": 2381, "bg": 758}, {"id": "t_wall_metal", "fg": 2382}, {"id": ["t_window_reinforced", "t_window_reinforced_noglass"], "fg": 2383, "bg": 758}, {"id": "t_door_metal_o", "fg": 2384}, {"id": "t_window_frame", "fg": 2385}, {"id": "t_pavement_y", "fg": 2386}, {"id": "t_pavement_y_season_winter", "fg": 643}, {"id": "t_dirtmound", "fg": 2387}, {"id": "t_reinforced_glass_shutter", "fg": 2389}, {"id": "t_reinforced_glass_shutter_open", "fg": 2388}, {"id": "t_trunk", "multitile": true, "fg": [2390, 2391], "bg": [{"weight": 100, "sprite": 1233}, {"weight": 100, "sprite": 1235}]}, {"id": "t_trunk_season_summer", "multitile": true, "fg": [2390, 2391], "bg": [{"weight": 100, "sprite": 1240}, {"weight": 100, "sprite": 1229}]}, {"id": "t_trunk_season_autumn", "multitile": true, "fg": [2390, 2391], "bg": [{"weight": 100, "sprite": 1234}, {"weight": 100, "sprite": 1228}]}, {"id": "t_trunk_season_winter", "multitile": true, "fg": [2390, 2391], "bg": 643}, {"id": "t_console_broken", "fg": 2392}, {"id": ["t_junk_palisade", "t_junk_wall"], "fg": [{"weight": 100, "sprite": 2396}, {"weight": 100, "sprite": 2395}, {"weight": 100, "sprite": 2393}, {"weight": 100, "sprite": 2394}]}, {"id": "t_door_metal_c", "fg": 2397}, {"id": "fd_smoke", "fg": 2400}, {"id": "fd_fungal_haze", "fg": 2399}, {"id": "fd_nuke_gas", "fg": 2398}, {"id": "fd_acid", "fg": 2401}, {"id": "fd_blood", "fg": 2403}, {"id": ["fd_blood_insect", "fd_blood_invertebrate"], "fg": 2402}, {"id": "fd_electricity", "fg": [{"weight": 100, "sprite": 2405}, {"weight": 100, "sprite": 2404}]}, {"id": "fd_web", "fg": [{"weight": 100, "sprite": 2407}, {"weight": 100, "sprite": 2406}, {"weight": 25, "sprite": 2408}, {"weight": 25, "sprite": 2409}]}], "//": "range 2321 to 2416"}, {"file": "fillerhoder.png", "tiles": [{"id": "vp_aisle_horizontal", "fg": 2429}, {"id": "vp_aisle_vertical", "fg": 2426}, {"id": "vp_bed", "fg": 2425}, {"id": "vp_folding_seat", "fg": 2455}, {"id": "vp_frame_cover", "fg": 2503}, {"id": "vp_frame_cross", "fg": 2502}, {"id": "vp_frame_handle", "fg": 2583}, {"id": "vp_frame_horizontal", "fg": 2520}, {"id": "vp_frame_horizontal_2", "fg": 2524}, {"id": "vp_frame_ne", "fg": 2481}, {"id": "vp_frame_nw", "fg": 2568}, {"id": "vp_frame_se", "fg": 2478}, {"id": "vp_frame_sw", "fg": 2566}, {"id": "vp_frame_vertical", "fg": 2488}, {"id": "vp_frame_vertical_2", "fg": 2551}, {"id": "vp_frame_wood_cover", "fg": 2588}, {"id": "vp_frame_wood_cross", "fg": 2533}, {"id": "vp_frame_wood_handle", "fg": 2583}, {"id": "vp_frame_wood_horizontal", "fg": 2452}, {"id": "vp_frame_wood_horizontal_2", "fg": 2428}, {"id": "vp_frame_wood_ne", "fg": 2457}, {"id": "vp_frame_wood_nw", "fg": 2511}, {"id": "vp_frame_wood_se", "fg": 2436}, {"id": "vp_frame_wood_sw", "fg": 2464}, {"id": "vp_frame_wood_vertical", "fg": 2439}, {"id": "vp_frame_wood_vertical_2", "fg": 2565}, {"id": "vp_hdboard_horizontal", "fg": 2577}, {"id": "vp_hdboard_ne", "fg": 2419}, {"id": "vp_hdboard_nw", "fg": 2499}, {"id": "vp_hdboard_se", "fg": 2442}, {"id": "vp_hdboard_sw", "fg": 2458}, {"id": "vp_hdboard_vertical", "fg": 2546}, {"id": "vp_hdframe_cover", "fg": 2572}, {"id": "vp_hdframe_cross", "fg": 2532}, {"id": "vp_hdframe_horizontal", "fg": 2527}, {"id": "vp_hdframe_horizontal_2", "fg": 2475}, {"id": "vp_hdframe_ne", "fg": 2578}, {"id": "vp_hdframe_nw", "fg": 2530}, {"id": "vp_hdframe_se", "fg": 2545}, {"id": "vp_hdframe_sw", "fg": 2484}, {"id": "vp_hdframe_vertical", "fg": 2491}, {"id": "vp_hdframe_vertical_2", "fg": 2592}, {"id": "vp_reclining_seat", "fg": 2455}, {"id": "vp_saddle", "fg": 2476}, {"id": "vp_seat", "fg": 2455}, {"id": "vp_washing_machine", "fg": 2493}, {"id": "vp_woodboard_horizontal", "fg": 2548}, {"id": "vp_woodboard_ne", "fg": 2556}, {"id": "vp_woodboard_nw", "fg": 2453}, {"id": "vp_woodboard_se", "fg": 2507}, {"id": "vp_woodboard_sw", "fg": 2571}, {"id": "vp_woodboard_vertical", "fg": 2514}, {"id": "vp_woodhalfboard_horizontal", "fg": 2548}, {"id": "vp_woodhalfboard_horizontal_2", "fg": 2548}, {"id": "vp_woodhalfboard_ne", "fg": 2556}, {"id": "vp_woodhalfboard_nw", "fg": 2453}, {"id": "vp_woodhalfboard_se", "fg": 2507}, {"id": "vp_woodhalfboard_sw", "fg": 2571}, {"id": "vp_woodhalfboard_vertical", "fg": 2514}, {"id": "vp_woodhalfboard_vertical_2", "fg": 2514}, {"id": "vp_basketlg", "fg": 2462}, {"id": "vp_basketsm", "fg": 2462}, {"id": "vp_battery_motorbike", "fg": 2590}, {"id": "vp_blade_horizontal", "fg": 2589}, {"id": "vp_blade_vertical", "fg": 2433}, {"id": "vp_box", "fg": 2531}, {"id": "vp_cargo_space", "fg": 2486, "bg": 2565}, {"id": "vp_chemlab", "fg": 2431}, {"id": "vp_controls", "fg": 2505}, {"id": "vp_craft_rig", "fg": 2431}, {"id": "vp_door_internal", "fg": 2471}, {"id": "vp_door_opaque", "fg": 2501}, {"id": "vp_door_shutter", "fg": 2473}, {"id": "vp_door_sliding", "fg": 2518}, {"id": "vp_engine_1cyl", "fg": 2563}, {"id": "vp_engine_electric", "fg": 2468}, {"id": "vp_engine_electric_large", "fg": 2541}, {"id": "vp_engine_inline4", "fg": 2535}, {"id": "vp_engine_plasma", "fg": 2482}, {"id": "vp_engine_v12", "fg": 2550, "bg": 2553}, {"id": "vp_engine_v6", "fg": 2550}, {"id": "vp_engine_v8", "fg": 2553}, {"id": "vp_engine_vtwin", "fg": 2423}, {"id": "vp_external_gas_tank", "fg": 2420}, {"id": "vp_flamethrower", "fg": 2539}, {"id": "vp_floodlight", "fg": 2418, "bg": 2480}, {"id": "vp_foot_pedals", "fg": 2504}, {"id": "vp_fusion_gun", "fg": 2490}, {"id": "vp_gas_tank", "fg": 2420}, {"id": "vp_gas_tank_small", "fg": 2420}, {"id": "vp_hatch", "fg": 2557}, {"id": "vp_hatch_opaque", "fg": 2585}, {"id": "vp_hddoor", "fg": 2497}, {"id": "vp_hddoor_internal", "fg": 2519}, {"id": "vp_hddoor_opaque", "fg": 2465}, {"id": "vp_hddoor_shutter", "fg": 2448}, {"id": "vp_hddoor_sliding", "fg": 2521}, {"id": "vp_hddoor_trunk", "fg": 2500}, {"id": "vp_hdhatch", "fg": 2515}, {"id": "vp_hdhatch_opaque", "fg": 2479}, {"id": "vp_hdroof", "fg": 2559}, {"id": "vp_hydrogen_tank", "fg": 2522}, {"id": "vp_kitchen_unit", "fg": 2431}, {"id": "vp_laser_gun", "fg": 2490}, {"id": "vp_light_blue", "fg": 2510, "bg": 2573}, {"id": "vp_light_red", "fg": 2510, "bg": 2472}, {"id": "vp_lit_aisle_horizontal", "fg": 2429}, {"id": "vp_lit_aisle_vertical", "fg": 2426}, {"id": "vp_m249", "fg": 2569}, {"id": "vp_minifridge", "fg": 2529}, {"id": "vp_minireactor", "fg": 2454}, {"id": "vp_mounted_browning", "fg": 2569}, {"id": "vp_mounted_mk19", "fg": 2569}, {"id": "vp_muffler", "fg": 2554}, {"id": ["vp_omnicam", "vp_omnomnicam"], "fg": 2526, "bg": 2559}, {"id": "vp_plasma_gun", "fg": 2508}, {"id": "vp_plating_hard", "fg": 2512}, {"id": "vp_plating_military", "fg": 2430}, {"id": "vp_plating_spiked", "fg": 2547}, {"id": "vp_plating_steel", "fg": 2430}, {"id": "vp_plating_superalloy", "fg": 2460}, {"id": "vp_plating_wood", "fg": 2489}, {"id": "vp_recharge_station", "fg": 2590, "bg": 2531}, {"id": "vp_reinforced_solar_panel", "fg": 2564, "bg": 2441}, {"id": "vp_reinforced_solar_panel_v2", "fg": 2564, "bg": 2441}, {"id": "vp_reinforced_windshield", "fg": 2564, "bg": 2509}, {"id": "vp_roof", "fg": 2480}, {"id": "vp_roof_cloth", "fg": 2528}, {"id": "vp_seatbelt", "fg": 2424}, {"id": "vp_seatbelt_heavyduty", "fg": 2424}, {"id": "vp_small_storage_battery", "fg": 2590}, {"id": "vp_solar_panel", "fg": 2441}, {"id": "vp_solar_panel_v2", "fg": 2441}, {"id": "vp_solar_panel_v3", "fg": 2441}, {"id": "vp_spike", "fg": 2456}, {"id": "vp_storage_battery", "fg": 2590}, {"id": "vp_storage_car", "fg": 2590}, {"id": "vp_storage_truck", "fg": 2590}, {"id": "vp_trunk", "fg": 2531}, {"id": "vp_trunk_floor", "fg": 2434}, {"id": "vp_turret_mount", "fg": 2506, "bg": 2559}, {"id": "vp_v_curtain", "fg": 2438}, {"id": "vp_veh_forge", "fg": 2450}, {"id": "vp_veh_table", "fg": 2586}, {"id": "vp_water_tank", "fg": 2470}, {"id": "vp_welding_rig", "fg": 2574}, {"id": "vp_wheel", "fg": 2591}, {"id": "vp_wheel_armor", "fg": 2591}, {"id": "vp_wheel_armor_steerable", "fg": 2591}, {"id": "vp_wheel_bicycle", "fg": 2562}, {"id": "vp_wheel_bicycle_steerable", "fg": 2562}, {"id": "vp_wheel_caster", "fg": 2467}, {"id": "vp_wheel_motorbike", "fg": 2576}, {"id": "vp_wheel_motorbike_steerable", "fg": 2576}, {"id": "vp_wheel_small", "fg": 2421}, {"id": "vp_wheel_small_steerable", "fg": 2421}, {"id": "vp_wheel_steerable", "fg": 2591}, {"id": "vp_wheel_unicycle", "fg": 2562}, {"id": "vp_wheel_wheelchair", "fg": 2562}, {"id": "vp_wheel_wide", "fg": 2451}, {"id": "vp_wheel_wide_steerable", "fg": 2451}, {"id": "alloy_plate", "fg": 2460, "bg": 2498}, {"id": "foot_crank", "fg": 2504, "bg": 2498}, {"id": "frame", "fg": 2533, "bg": 2498}, {"id": "glass_sheet", "fg": 2509, "bg": 2498}, {"id": "hard_plate", "fg": 2512, "bg": 2498}, {"id": "kitchen_unit", "fg": 2431, "bg": 2498}, {"id": "motor", "fg": 2468, "bg": 2498}, {"id": "motor_large", "fg": 2541, "bg": 2498}, {"id": "muffler", "fg": 2554, "bg": 2498}, {"id": "plasma_engine", "fg": 2482, "bg": 2498}, {"id": "saddle", "fg": 2476, "bg": 2498}, {"id": "seat", "fg": 2455, "bg": 2498}, {"id": "solar_panel", "fg": 2441, "bg": 2498}, {"id": "spiked_plate", "fg": 2547, "bg": 2498}, {"id": "steel_plate", "fg": 2430, "bg": 2498}, {"id": "storage_battery", "fg": 2590, "bg": 2498}, {"id": "vehicle_controls", "fg": 2505, "bg": 2498}, {"id": "weldrig", "fg": 2574, "bg": 2498}, {"id": "forge", "fg": 2450, "bg": 2498}, {"id": "1cyl_combustion", "fg": 2563, "bg": 2498}, {"id": "i4_combustion", "fg": 2535, "bg": 2498}, {"id": "v2_combustion", "fg": 2423, "bg": 2498}, {"id": "v6_combustion", "fg": 2550, "bg": 2498}, {"id": "v8_combustion", "fg": 2553, "bg": 2498}, {"id": "vp_board_horizontal", "fg": 2492}, {"id": "vp_board_ne", "fg": 2461}, {"id": "vp_board_nw", "fg": 2579}, {"id": "vp_board_se", "fg": 2440}, {"id": "vp_board_sw", "fg": 2561}, {"id": "vp_board_vertical", "fg": 2549}, {"id": "vp_hdhalfboard_horizontal", "fg": 2417}, {"id": "vp_hdhalfboard_horizontal_2", "fg": 2449}, {"id": "vp_hdhalfboard_ne", "fg": 2587}, {"id": "vp_hdhalfboard_nw", "fg": 2570}, {"id": "vp_hdhalfboard_se", "fg": 2495}, {"id": "vp_hdhalfboard_sw", "fg": 2517}, {"id": "vp_hdhalfboard_vertical", "fg": 2543}, {"id": "vp_hdhalfboard_vertical_2", "fg": 2559}, {"id": "vp_hdstowboard_horizontal", "fg": 2463}, {"id": "vp_hdstowboard_ne", "fg": 2525}, {"id": "vp_hdstowboard_nw", "fg": 2537}, {"id": "vp_hdstowboard_se", "fg": 2427}, {"id": "vp_hdstowboard_sw", "fg": 2575}, {"id": "vp_hdstowboard_vertical", "fg": 2446}, {"id": "vp_stowboard_horizontal", "fg": 2582}, {"id": "vp_stowboard_ne", "fg": 2444}, {"id": "vp_stowboard_nw", "fg": 2513}, {"id": "vp_stowboard_se", "fg": 2560}, {"id": "vp_stowboard_sw", "fg": 2432}, {"id": "vp_stowboard_vertical", "fg": 2477}, {"id": "vp_wing_mirror", "fg": 2445}, {"id": "[vp_xlframe_cover],[vp_fxlframe_cover]", "fg": 2485}, {"id": "[vp_xlframe_cross],[vp_fxlframe_cross]", "fg": 2483}, {"id": "[vp_xlframe_horizontal_2],[vp_fxlframe_horizontal_2]", "fg": 2558}, {"id": "[vp_xlframe_horizontal],[vp_fxlframe_horizontal]", "fg": 2536}, {"id": "[vp_xlframe_ne],[vp_fxlframe_ne]", "fg": 2459}, {"id": "[vp_xlframe_nw],[vp_fxlframe_nw]", "fg": 2447}, {"id": "[vp_xlframe_se],[vp_fxlframe_se]", "fg": 2523}, {"id": "[vp_xlframe_sw],[vp_fxlframe_sw]", "fg": 2580}, {"id": "[vp_xlframe_vertical_2],[vp_fxlframe_vertical_2]", "fg": 2466}, {"id": "[vp_xlframe_vertical],[vp_fxlframe_vertical]", "fg": 2555}, {"id": "[vp_xlhalfboard_horizontal_2],[vp_fxlhalfboard_horizontal_2]", "fg": 2494}, {"id": "[vp_xlhalfboard_horizontal],[vp_fxlhalfboard_horizontal]", "fg": 2567}, {"id": "[vp_xlhalfboard_ne],[vp_fxlhalfboard_ne]", "fg": 2540}, {"id": "[vp_xlhalfboard_nw],[vp_fxlhalfboard_nw]", "fg": 2435}, {"id": "[vp_xlhalfboard_se],[vp_fxlhalfboard_se]", "fg": 2437}, {"id": "[vp_xlhalfboard_sw],[vp_fxlhalfboard_sw", "fg": 2474}, {"id": "[vp_xlhalfboard_vertical_2],[vp_fxlhalfboard_vertical_2]", "fg": 2487}, {"id": "[vp_xlhalfboard_vertical],[vp_fxlhalfboard_vertical]", "fg": 2443}, {"id": "wheel", "fg": 2591, "bg": 2498}, {"id": "wheel_bicycle", "fg": 2562, "bg": 2498}, {"id": "wheel_motorbike", "fg": 2576, "bg": 2498}, {"id": "wheel_small", "fg": 2421, "bg": 2498}, {"id": "wheel_wide", "fg": 2451, "bg": 2498}], "//": "range 2417 to 2608"}, {"file": "opengameartgiant.png", "tiles": [{"id": "t_tree_chestnut", "fg": 2610, "bg": 2302}, {"id": "t_tree_chestnut_season_summer", "fg": 2611, "bg": 2303}, {"id": "t_tree_chestnut_season_autumn", "fg": 2611, "bg": 2301}, {"id": "t_tree_chestnut_season_winter", "fg": 2611, "bg": 2304}, {"id": "t_tree_pine", "fg": 2614, "bg": 2302}, {"id": "t_tree_pine_season_summer", "fg": 2614, "bg": 2303}, {"id": "t_tree_pine_season_autumn", "fg": 2614, "bg": 2301}, {"id": "t_tree_pine_season_winter", "fg": 2614, "bg": 2304}, {"id": "t_tree_deadpine", "fg": 2612, "bg": 2302}, {"id": "t_tree_deadpine_season_summer", "fg": 2612, "bg": 2303}, {"id": "t_tree_deadpine_season_autumn", "fg": 2612, "bg": 2301}, {"id": "t_tree_deadpine_season_winter", "fg": 2612, "bg": 2304}, {"id": "t_tree_hickory", "fg": 2609, "bg": 2302}, {"id": "t_tree_hickory_season_summer", "fg": 2609, "bg": 2303}, {"id": "t_tree_hickory_season_autumn", "fg": 2609, "bg": 2301}, {"id": "t_tree_hickory_season_winter", "fg": 2613, "bg": 2304}, {"id": "t_tree_hickory_dead", "fg": 2613, "bg": 2302}, {"id": "t_tree_hickory_dead_season_summer", "fg": 2613, "bg": 2303}, {"id": "t_tree_hickory_dead_season_autumn", "fg": 2613, "bg": 2301}, {"id": "t_tree_hickory_dead_season_winter", "fg": 2613, "bg": 2304}], "//": "range 2609 to 2624", "sprite_width": 96, "sprite_height": 96, "sprite_offset_x": -32, "sprite_offset_y": -64}, {"file": "fallback.png", "tiles": [], "ascii": [{"offset": 0, "bold": false, "color": "BLACK"}, {"offset": 256, "bold": true, "color": "WHITE"}, {"offset": 512, "bold": false, "color": "WHITE"}, {"offset": 768, "bold": true, "color": "BLACK"}, {"offset": 1024, "bold": false, "color": "RED"}, {"offset": 1280, "bold": false, "color": "GREEN"}, {"offset": 1536, "bold": false, "color": "BLUE"}, {"offset": 1792, "bold": false, "color": "CYAN"}, {"offset": 2048, "bold": false, "color": "MAGENTA"}, {"offset": 2304, "bold": false, "color": "YELLOW"}, {"offset": 2560, "bold": true, "color": "RED"}, {"offset": 2816, "bold": true, "color": "GREEN"}, {"offset": 3072, "bold": true, "color": "BLUE"}, {"offset": 3328, "bold": true, "color": "CYAN"}, {"offset": 3584, "bold": true, "color": "MAGENTA"}, {"offset": 3840, "bold": true, "color": "YELLOW"}]}]} \ No newline at end of file +{"tile_info": [{"width": 32, "height": 32}], "tiles-new": [{"file": "normal.png", "tiles": [{"id": "f_indoor_plant", "fg": 3}, {"id": "f_indoor_plant_y", "fg": 1}, {"id": ["f_indoor_plant_y_season_autumn", "f_indoor_plant_y_season_winter"], "fg": 2}, {"id": "f_recycle_bin", "fg": 4}, {"id": "f_armchair", "fg": 5}, {"id": "f_wreckage", "fg": 6}, {"id": "f_gunsafe_ml", "fg": 8}, {"id": "f_gunsafe_mj", "fg": 7}, {"id": "f_gun_safe_el", "fg": 9}, {"id": "f_mutpoppy", "fg": 10}, {"id": "f_planter_mature", "multitile": true, "fg": 13, "additional_tiles": [{"id": "center", "fg": 14}, {"id": "corner", "fg": [23, 26, 22, 16]}, {"id": "t_connection", "fg": [19, 18, 25, 15]}, {"id": "edge", "fg": [20, 21]}, {"id": "end_piece", "fg": [17, 12, 11, 24]}, {"id": "unconnected", "fg": 13}]}, {"id": "f_boulder_small", "fg": 27}, {"id": "f_dandelion", "fg": 28}, {"id": "f_planter", "multitile": true, "fg": 37, "additional_tiles": [{"id": "center", "fg": 32}, {"id": "corner", "fg": [42, 36, 39, 35]}, {"id": "t_connection", "fg": [29, 40, 44, 43]}, {"id": "edge", "fg": [41, 38]}, {"id": "end_piece", "fg": [33, 34, 30, 31]}, {"id": "unconnected", "fg": 37}]}, {"id": "f_bathtub", "multitile": true, "fg": 54, "additional_tiles": [{"id": "center", "fg": 55}, {"id": "corner", "fg": [53, 50, 48, 56]}, {"id": "t_connection", "fg": [60, 52, 51, 47]}, {"id": "edge", "fg": [59, 57]}, {"id": "end_piece", "fg": [45, 49, 46, 58]}, {"id": "unconnected", "fg": 54}]}, {"id": "f_sofa", "multitile": true, "fg": 65, "additional_tiles": [{"id": "center", "fg": 66}, {"id": "corner", "fg": [74, 69, 76, 62]}, {"id": "t_connection", "fg": [70, 68, 61, 63]}, {"id": "edge", "fg": [75, 73]}, {"id": "end_piece", "fg": [64, 67, 72, 71]}, {"id": "unconnected", "fg": 65}]}, {"id": "f_alien_anemone", "fg": 78}, {"id": "f_alien_table", "fg": 77}, {"id": "f_filing_cabinet", "fg": 79}, {"id": "f_toilet", "fg": 80}, {"id": "f_ash", "fg": 81}, {"id": "f_desk", "multitile": true, "fg": 82, "additional_tiles": [{"id": "center", "fg": 91}, {"id": "corner", "fg": [87, 84, 92, 86]}, {"id": "t_connection", "fg": [90, 89, 85, 95]}, {"id": "edge", "fg": [96, 83]}, {"id": "end_piece", "fg": [97, 94, 93, 88]}, {"id": "unconnected", "fg": 82}]}, {"id": "f_trashcan", "fg": 98}, {"id": "f_entertainment_center", "fg": 99}, {"id": "f_grave_stone", "fg": [{"weight": 1, "sprite": 100}, {"weight": 1, "sprite": 101}]}, {"id": "f_rubble", "fg": 102}, {"id": "f_rubble_rock", "fg": 103}, {"id": "f_sign", "fg": 104}, {"id": "f_flower_spurge", "fg": 105}, {"id": "f_planter_harvest", "multitile": true, "fg": 117, "additional_tiles": [{"id": "center", "fg": 110}, {"id": "corner", "fg": [115, 120, 111, 118]}, {"id": "t_connection", "fg": [112, 113, 121, 107]}, {"id": "edge", "fg": [106, 108]}, {"id": "end_piece", "fg": [116, 114, 109, 119]}, {"id": "unconnected", "fg": 117}]}, {"id": "f_cardboard_box", "fg": 122}, {"id": "f_datura", "fg": 123}, {"id": "f_planter_seedling", "multitile": true, "fg": 131, "additional_tiles": [{"id": "center", "fg": 132}, {"id": "corner", "fg": [134, 125, 136, 128]}, {"id": "t_connection", "fg": [124, 133, 130, 126]}, {"id": "edge", "fg": [139, 137]}, {"id": "end_piece", "fg": [127, 135, 129, 138]}, {"id": "unconnected", "fg": 131}]}, {"id": "f_table", "multitile": true, "fg": 140, "additional_tiles": [{"id": "center", "fg": 154}, {"id": "corner", "fg": [148, 151, 142, 152]}, {"id": "t_connection", "fg": [141, 147, 144, 153]}, {"id": "edge", "fg": [143, 150]}, {"id": "end_piece", "fg": [146, 149, 155, 145]}, {"id": "unconnected", "fg": 140}]}, {"id": "f_boulder_large", "fg": 156}, {"id": "f_flower_tulip", "fg": [{"weight": 1, "sprite": 158}, {"weight": 2, "sprite": 157}]}, {"id": "f_cupboard", "multitile": true, "fg": 174, "additional_tiles": [{"id": "center", "fg": 173}, {"id": "corner", "fg": [167, 164, 166, 160]}, {"id": "t_connection", "fg": [163, 172, 168, 169]}, {"id": "edge", "fg": [171, 162]}, {"id": "end_piece", "fg": [159, 161, 165, 170]}, {"id": "unconnected", "fg": 174}]}, {"id": "f_metal_crate_r", "fg": 175}, {"id": "f_metal_crate_c", "fg": 177}, {"id": "f_metal_crate_o", "fg": 176}, {"id": "f_bluebell", "fg": [{"weight": 1, "sprite": 178}, {"weight": 2, "sprite": 179}]}, {"id": "f_bed", "multitile": true, "fg": 185, "additional_tiles": [{"id": "center", "fg": 181}, {"id": "corner", "fg": [191, 190, 184, 189]}, {"id": "t_connection", "fg": [193, 188, 194, 192]}, {"id": "edge", "fg": [195, 183]}, {"id": "end_piece", "fg": [180, 186, 182, 187]}, {"id": "unconnected", "fg": 185}]}, {"id": "f_firering", "fg": 196}, {"id": "f_bench", "multitile": true, "fg": 210, "additional_tiles": [{"id": "center", "fg": 203}, {"id": "corner", "fg": [206, 208, 200, 199]}, {"id": "t_connection", "fg": [197, 204, 207, 209]}, {"id": "edge", "fg": [201, 205]}, {"id": "end_piece", "fg": [211, 202, 212, 198]}, {"id": "unconnected", "fg": 210}]}, {"id": "f_mailbox", "fg": 213}, {"id": "f_grave_stone_old", "fg": [{"weight": 1, "sprite": 215}, {"weight": 1, "sprite": 214}]}, {"id": "f_rack_wood", "fg": 216}, {"id": "f_boulder_medium", "fg": 217}, {"id": "f_chamomile", "fg": 218}, {"id": "f_hay", "fg": 219}, {"id": "f_counter", "multitile": true, "fg": 226, "additional_tiles": [{"id": "center", "fg": 222}, {"id": "corner", "fg": [231, 223, 229, 227]}, {"id": "t_connection", "fg": [228, 221, 235, 230]}, {"id": "edge", "fg": [225, 224]}, {"id": "end_piece", "fg": [232, 234, 233, 220]}, {"id": "unconnected", "fg": 226}]}, {"id": "f_air_conditioner", "fg": 236}, {"id": "f_chair", "fg": 237}, {"id": "f_stool", "fg": 238}, {"id": "f_dahlia", "fg": [{"weight": 1, "sprite": 239}, {"weight": 2, "sprite": 240}]}, {"id": ["f_displaycase"], "fg": 241}, {"id": "f_rack", "fg": 242}, {"id": "vp_door_trunk", "fg": 243, "rotates": true, "multitile": true, "additional_tiles": [{"id": "open", "fg": 244}]}, {"id": ["vp_headlight", "vp_headlight_reinforced"], "fg": 245}, {"id": "vp_door", "fg": 246, "rotates": true, "multitile": true, "additional_tiles": [{"id": "open", "fg": 247}]}, {"id": "vp_halfboard_ne", "fg": 251, "rotates": true}, {"id": "vp_halfboard_nw", "fg": 256, "rotates": true}, {"id": "vp_halfboard_se", "fg": 248, "rotates": true}, {"id": "vp_halfboard_sw", "fg": 253, "rotates": true}, {"id": "vp_halfboard_vertical", "fg": 249, "rotates": true}, {"id": "vp_halfboard_horizontal_2", "fg": 252, "rotates": true}, {"id": "vp_halfboard_horizontal", "fg": 254, "rotates": true}, {"id": "vp_halfboard_vertical_2", "fg": 255, "rotates": true}, {"id": "vp_halfboard_cover", "fg": 250, "rotates": true}, {"id": "vp_windshield", "fg": 260, "rotates": true, "multitile": true, "additional_tiles": [{"id": "center", "fg": [257, 261, 258, 259]}, {"id": "edge", "fg": 260}, {"id": "unconnected", "fg": 260}, {"id": "end_piece", "fg": [257, 261, 258, 259]}, {"id": "t_connection", "fg": [257, 261, 258, 259]}, {"id": "corner", "fg": [257, 261, 258, 259]}]}, {"id": ["vp_folding_seat", "vp_reclining_seat", "vp_seat"], "fg": 263}, {"id": "vp_saddle", "fg": 262}, {"id": "powder_candy", "fg": 264}, {"id": "joint", "fg": 266}, {"id": "joint_lit", "fg": 267}, {"id": "joint_roach", "fg": 265}, {"id": "bag_canvas", "fg": 268}, {"id": "wood_panel", "fg": 269}, {"id": "jar_glass", "fg": 270}, {"id": "shot_hull", "fg": 271}, {"id": "wrench", "fg": 272}, {"id": "needle_bone", "fg": 275}, {"id": "needle_curved", "fg": 273}, {"id": "needle_wood", "fg": 274}, {"id": "pinecone", "fg": 276}, {"id": "ash", "fg": 277}, {"id": "lighter", "fg": [{"weight": 1, "sprite": 278}, {"weight": 1, "sprite": 280}, {"weight": 1, "sprite": 279}]}, {"id": "chips", "fg": 281}, {"id": "rifle_flintlock", "fg": 282}, {"id": "balclava", "fg": 306}, {"id": "beret", "fg": 295}, {"id": "boots", "fg": 322}, {"id": "boxer_briefs", "fg": 301}, {"id": "boxer_shorts", "fg": 287}, {"id": "boy_shorts", "fg": 292}, {"id": "bra", "fg": 314}, {"id": "briefs", "fg": 298}, {"id": "corset", "fg": 311}, {"id": "cowboy_hat", "fg": 323}, {"id": "dress_shoes", "fg": 291}, {"id": "hat_ball", "fg": 305}, {"id": "hat_cotton", "fg": 304}, {"id": "hat_fur", "fg": 308}, {"id": "hat_knit", "fg": 286}, {"id": "hat_noise_cancelling", "fg": 331}, {"id": "helmet_army", "fg": 289}, {"id": "helmet_barbute", "fg": 320}, {"id": "helmet_chitin", "fg": 283}, {"id": "helmet_kabuto", "fg": 319}, {"id": "hoodie", "fg": 318}, {"id": "jeans", "fg": 313}, {"id": "longshirt", "fg": 300}, {"id": "maid_dress", "fg": 285}, {"id": "maid_hat", "fg": 299}, {"id": "mask_dust", "fg": 310}, {"id": "panties", "fg": 296}, {"id": "pants", "fg": 293}, {"id": "pants_cargo", "fg": 307}, {"id": "polo_shirt", "fg": 315}, {"id": "ragpouch", "fg": 329}, {"id": "sneakers", "fg": 288}, {"id": "socks", "fg": 303}, {"id": "stockings", "fg": 294}, {"id": "sweater", "fg": 316}, {"id": "sweatshirt", "fg": 290}, {"id": "tank_top", "fg": 330}, {"id": "tshirt", "fg": 312}, {"id": "turban", "fg": 324}, {"id": "undershirt", "fg": 327}, {"id": "coat_lab", "fg": 326}, {"id": "coat_rain", "fg": 297}, {"id": "sports_bra", "fg": 302}, {"id": "skirt", "fg": 284}, {"id": "jacket_light", "fg": 317}, {"id": "jacket_army", "fg": 328}, {"id": "hat_hard", "fg": 325}, {"id": "striped_pants", "fg": 309}, {"id": "striped_shirt", "fg": 321}, {"id": "", "fg": []}, {"id": "bat_metal", "fg": 332}, {"id": "hacksaw", "fg": 333}, {"id": "crucible_clay", "fg": 334}, {"id": "many_years_old_newspaper", "fg": 339}, {"id": "months_old_newspaper", "fg": 335}, {"id": "newest_newspaper", "fg": 338}, {"id": "one_year_old_newspaper", "fg": 337}, {"id": "weeks_old_newspaper", "fg": 336}, {"id": "pointy_stick", "fg": 348}, {"id": "spear_wood", "fg": 347}, {"id": "spear_spike", "fg": 342}, {"id": "spear_knife", "fg": 345}, {"id": "spear_knife_superior", "fg": 346}, {"id": "spear_pipe", "fg": 340}, {"id": "spear_rebar", "fg": 344}, {"id": "spear_steel", "fg": 341}, {"id": "spear_copper", "fg": 343}, {"id": "hickory_root", "fg": 349}, {"id": "flashlight", "fg": 350}, {"id": "heavy_flashlight", "fg": 351}, {"id": "can_drink", "fg": 352}, {"id": "50_casing", "fg": 353}, {"id": "apple", "fg": 355}, {"id": "banana", "fg": 356}, {"id": "broccoli", "fg": 364}, {"id": "corn", "fg": 367}, {"id": "cucumber", "fg": 360}, {"id": "egg_bird", "fg": 366}, {"id": "grapes", "fg": 354}, {"id": "lemon", "fg": 357}, {"id": "onion", "fg": 365}, {"id": "orange", "fg": 359}, {"id": "pear", "fg": 361}, {"id": "potato", "fg": 358}, {"id": "pumpkin", "fg": 363}, {"id": "tomato", "fg": 362}, {"id": "sewing_kit", "fg": 368}, {"id": "jug_plastic", "fg": 369}, {"id": "pot", "fg": 370}, {"id": "backpack", "fg": 371}, {"id": "cattlefodder", "fg": 372}, {"id": "cup_plastic", "fg": 373}, {"id": "knife_meat_cleaver", "fg": 374}, {"id": "fire_ax", "fg": 375}, {"id": "ax", "fg": 377}, {"id": "hatchet", "fg": 376}, {"id": ["glock_17", "glock_19", "glock_18c", "glock_22", "glock_31"], "fg": 378}, {"id": "straw_pile", "fg": 379}, {"id": "thread", "fg": 380}, {"id": "wheat", "fg": 381}, {"id": "pan", "fg": 382}, {"id": "bottle_glass", "fg": 383}, {"id": "nail", "fg": 384}, {"id": "juniper", "fg": 385}, {"id": "pool_ball", "fg": 386}, {"id": "crowbar", "fg": 387}, {"id": "rag", "fg": 388}, {"id": "id_industrial", "fg": 389}, {"id": "corpse_generic_human", "fg": 390}, {"id": "chainsaw_off", "fg": 391}, {"id": "teapot", "fg": 392}, {"id": "mp5mag", "fg": 393}, {"id": "meat", "fg": 394}, {"id": "cig_butt", "fg": 395}, {"id": "usb_drive", "fg": 396}, {"id": "1st_aid", "fg": 397}, {"id": "welder_crude", "fg": 398}, {"id": "nailbat", "fg": 399}, {"id": "remington_870", "fg": 400}, {"id": "sheet_metal_small", "fg": 401}, {"id": "screwdriver", "fg": 402}, {"id": "primitive_hammer", "fg": 403}, {"id": "steel_lump", "fg": 404}, {"id": "string_6", "fg": 405}, {"id": "saw", "fg": 406}, {"id": "aspirin", "fg": 422}, {"id": "bandages", "fg": 408}, {"id": "syringe", "fg": 414}, {"id": "antibiotics", "fg": 421}, {"id": "weak_antibiotic", "fg": 407}, {"id": "strong_antibiotic", "fg": 415}, {"id": "vitamins", "fg": 412}, {"id": "gummy_vitamins", "fg": 413}, {"id": "calcium_tablet", "fg": 418}, {"id": "oxycodone", "fg": 416}, {"id": "tramadol", "fg": 417}, {"id": "codeine", "fg": 411}, {"id": "prussian_blue", "fg": 410}, {"id": "iodine", "fg": 419}, {"id": "antiparasitic", "fg": 420}, {"id": "antifungal", "fg": 409}, {"id": "can_drink_unsealed", "fg": 423}, {"id": "9mm_casing", "fg": 424}, {"id": "wrapper", "fg": 425}, {"id": "rebar", "fg": 426}, {"id": "glass_shard", "fg": 427}, {"id": "pot_copper", "fg": 428}, {"id": "40mm_casing", "fg": 429}, {"id": "nailboard", "fg": 430}, {"id": "scissors", "fg": 431}, {"id": "ak74", "fg": 432}, {"id": "coffeemaker", "fg": 433}, {"id": "blanket", "fg": 435}, {"id": "down_blanket", "fg": 434}, {"id": "longbow", "fg": 436}, {"id": "pneumatic_shotgun", "fg": 437}, {"id": "thermos", "fg": 438}, {"id": "box_cigarette", "fg": 439}, {"id": "m79", "fg": 440}, {"id": "stick", "fg": 441}, {"id": "steel_chunk", "fg": 442}, {"id": "television", "fg": 443}, {"id": "shovel", "fg": 444}, {"id": "id_science", "fg": 445}, {"id": "cable", "fg": 446}, {"id": "pipe", "fg": 447}, {"id": "bottle_plastic", "fg": 448}, {"id": "fp_loyalty_card", "fg": 449}, {"id": "id_military", "fg": 450}, {"id": "water", "fg": 452}, {"id": "water_clean", "fg": 453}, {"id": "blood", "fg": 451}, {"id": "filter_air", "fg": 454}, {"id": "welder", "fg": 455}, {"id": "broom", "fg": 456}, {"id": "rolling_pin", "fg": 457}, {"id": "makeshift_crowbar", "fg": 458}, {"id": "bat", "fg": 459}, {"id": "wood_sheet", "fg": 460}, {"id": "jar_3l_glass_sealed", "fg": 461}, {"id": "plastic_sheet", "fg": 462}, {"id": "box_large", "fg": 463}, {"id": "knife_vegetable_cleaver", "fg": 464}, {"id": "arming_sword", "fg": 465}, {"id": "crossbow", "fg": 466}, {"id": "pot_canning", "fg": 467}, {"id": "sheet_metal", "fg": 468}, {"id": "brick", "fg": 469}, {"id": "wire", "fg": 470}, {"id": "2x4", "fg": 471}, {"id": ["seed_hops", "seed_blackberries", "seed_blueberries", "coffee_pod", "seed_wheat", "roasted_coffee_bean", "seed_chamomile", "coffee_bean", "seed_celery", "fried_seeds", "seed_buckwheat", "seed_oats", "seed_mushroom_morel", "datura_seed", "seed_mushroom", "seed_rhubarb", "seed_wild_herbs", "seed_raw_dandelion", "seed_veggy_wild", "seed_chili_pepper", "seed_dogbane", "seed_mugwort", "seed_bee_balm", "seed_flower", "seed_sunflower", "seed_thyme", "seed_canola", "seed_pumpkin", "seed_beans", "seed_lentils", "soybean_seed", "marloss_seed", "fungal_seeds", "seed_weed", "seed_potato_raw", "seed_cucumber", "seed_corn", "seed_carrot", "garlic_clove", "seed_cactus", "seed_wildcarrot", "seed_cattail", "seed_chicory", "seed_salsify_raw", "seed_dahlia", "seed_garlic", "seed_broccoli", "seed_onion", "seed_zucchini", "seed_cotton_boll", "seed_tomato", "seed_rose", "seed_lettuce", "seed_cabbage", "seed_sugar_beet", "seed_tobacco", "seed_barley", "seed_grapes", "seed_strawberries", "seed_raspberries", "seed_cranberries", "seed_huckleberries", "seed_mulberries", "seed_elderberries"], "fg": 472}, {"id": "acorns", "fg": 473}, {"id": "slingshot", "fg": 474}, {"id": "bottle_plastic_small", "fg": 475}, {"id": "sharp_rock", "fg": 476}, {"id": "bowl_plastic", "fg": 477}, {"id": "contacts", "fg": 478}, {"id": "matches", "fg": 479}, {"id": "box_small", "fg": 480}, {"id": "plastic_shopping_bag", "fg": 481}, {"id": "pillow", "fg": 483}, {"id": "down_pillow", "fg": 482}, {"id": "mop", "fg": 484}, {"id": "board_trap", "fg": 485}, {"id": "can_food", "fg": 486}, {"id": "scrap", "fg": 487}, {"id": "string_36", "fg": 488}, {"id": "file", "fg": 489}, {"id": "box_medium", "fg": 490}, {"id": "paperback_novel", "fg": 512}, {"id": "novel_adventure", "fg": 512}, {"id": "novel_buddy", "fg": 505}, {"id": "novel_coa", "fg": 494}, {"id": "novel_coa2", "fg": 495}, {"id": "novel_crime", "fg": 498}, {"id": "novel_crime2", "fg": 506}, {"id": "novel_drama", "fg": 502}, {"id": "novel_erotic", "fg": 510}, {"id": "novel_experimental", "fg": 501}, {"id": "novel_fantasy", "fg": 507}, {"id": "novel_horror", "fg": 508}, {"id": "novel_mystery", "fg": 511}, {"id": "novel_pulp", "fg": 499}, {"id": "novel_road", "fg": 496}, {"id": "novel_romance", "fg": 493}, {"id": "novel_samurai", "fg": 491}, {"id": "novel_satire", "fg": 503}, {"id": "novel_scifi", "fg": 515}, {"id": "novel_sports", "fg": 514}, {"id": "novel_spy", "fg": 516}, {"id": "novel_swash", "fg": 504}, {"id": "novel_thriller", "fg": 509}, {"id": "novel_tragedy", "fg": 500}, {"id": "novel_war", "fg": 513}, {"id": "novel_war2", "fg": 497}, {"id": "novel_western", "fg": 492}, {"id": "marble", "fg": 517}, {"id": "withered", "fg": 518}, {"id": "bolt_cf", "fg": 519}, {"id": "bolt_explosive", "fg": 527}, {"id": "bolt_metal", "fg": 522}, {"id": ["bolt_steel", "bolt_steel_bodkin", "bolt_steel_target"], "fg": 526}, {"id": ["bolt_wood", "bolt_crude", "bolt_simple_wood", "bolt_simple_small_game", "bolt_makeshift", "bolt_wood_bodkin", "bolt_wood_small_game"], "fg": 536}, {"id": "arrow_cf", "fg": 525}, {"id": "arrow_exploding", "fg": 520}, {"id": "arrow_field_point_fletched", "fg": 529}, {"id": "arrow_fire_hardened_fletched", "fg": 535}, {"id": "arrow_flammable", "fg": 533}, {"id": "arrow_flamming", "fg": 524}, {"id": "arrow_heavy_fire_hardened_fletched", "fg": 534}, {"id": "arrow_metal", "fg": 528}, {"id": "arrow_metal_sharpened_fletched", "fg": 521}, {"id": "arrow_plastic", "fg": 530}, {"id": "arrow_small_game_fletched", "fg": 531}, {"id": "arrow_wood", "fg": 532}, {"id": "arrow_wood_heavy", "fg": 523}, {"id": "rock", "fg": 537}, {"id": "knife_butcher", "fg": 538}, {"id": "stick_long", "fg": 539}, {"id": "log", "fg": 540}, {"id": "jar_glass_sealed", "fg": 541}, {"id": "jar_3l_glass", "fg": 542}, {"id": "knife_butter", "fg": 543}, {"id": "223_casing", "fg": 544}, {"id": "bwirebat", "fg": 545}, {"id": "bag_plastic", "fg": 546}, {"id": ["rifle_9mm", "rifle_3006", "rifle_45", "rifle_22", "rifle_40", "rifle_44", "rifle_38", "rifle_223"], "fg": 547}, {"id": "pipe_shotgun", "fg": 548}, {"id": "spoon", "fg": 549}, {"id": "hammer", "fg": 550}, {"id": "hickory_nut", "fg": 551}, {"id": "glass_plate", "fg": 552}, {"id": "cash_card", "fg": 553}, {"id": "fork", "fg": 554}, {"id": "splinter", "fg": 555}, {"id": "ar15", "fg": 556}, {"id": "pine_bough", "fg": 557}, {"id": "bag_zipper", "fg": 558}, {"id": "tailors_kit", "fg": 559}, {"id": "sponge", "fg": 560}, {"id": "t_strconc_floor", "multitile": true, "fg": 576, "additional_tiles": [{"id": "center", "fg": 573}, {"id": "corner", "fg": [561, 568, 570, 566]}, {"id": "t_connection", "fg": [562, 567, 571, 564]}, {"id": "edge", "fg": [572, 574]}, {"id": "end_piece", "fg": [575, 563, 569, 565]}, {"id": "unconnected", "fg": 576}]}, {"id": "t_tatami", "fg": [{"weight": 100, "sprite": 578}, {"weight": 100, "sprite": 577}]}, {"id": "t_floor_waxed_y", "multitile": true, "fg": 584, "additional_tiles": [{"id": "center", "fg": 590}, {"id": "corner", "fg": [587, 579, 583, 593]}, {"id": "t_connection", "fg": [585, 581, 592, 580]}, {"id": "edge", "fg": [588, 591]}, {"id": "end_piece", "fg": [589, 582, 586, 594]}, {"id": "unconnected", "fg": 584}]}, {"id": "t_pit_shallow", "fg": 595, "bg": [{"weight": 100, "sprite": 1312}, {"weight": 100, "sprite": 1315}]}, {"id": "t_pit_shallow_season_summer", "fg": 595, "bg": [{"weight": 100, "sprite": 1326}, {"weight": 100, "sprite": 1306}]}, {"id": "t_pit_shallow_season_autumn", "fg": 595, "bg": [{"weight": 100, "sprite": 1313}, {"weight": 100, "sprite": 1305}]}, {"id": "t_rock", "fg": 596}, {"id": "t_railroad_rubble", "fg": 597}, {"id": "t_gravel", "fg": 597}, {"id": "t_railroad_rubble_season_winter", "fg": 682}, {"id": "t_sand", "fg": 598}, {"id": "t_floor_resin", "multitile": true, "fg": 601, "additional_tiles": [{"id": "center", "fg": 600}, {"id": "corner", "fg": [606, 613, 607, 603]}, {"id": "t_connection", "fg": [605, 599, 609, 608]}, {"id": "edge", "fg": [614, 602]}, {"id": "end_piece", "fg": [611, 612, 610, 604]}, {"id": "unconnected", "fg": 601}]}, {"id": "t_metal_floor", "multitile": true, "fg": 622, "additional_tiles": [{"id": "center", "fg": 616}, {"id": "corner", "fg": [624, 620, 618, 619]}, {"id": "t_connection", "fg": [630, 625, 627, 629]}, {"id": "edge", "fg": [628, 626]}, {"id": "end_piece", "fg": [615, 621, 617, 623]}, {"id": "unconnected", "fg": 622}]}, {"id": ["t_door_metal_locked", "t_door_metal_pickable"], "fg": 631}, {"id": "t_wall_b", "multitile": true, "fg": 635, "additional_tiles": [{"id": "center", "fg": 633}, {"id": "corner", "fg": [646, 639, 645, 637]}, {"id": "t_connection", "fg": [643, 638, 647, 641]}, {"id": "edge", "fg": [632, 634]}, {"id": "end_piece", "fg": [640, 636, 644, 642]}, {"id": "unconnected", "fg": 635}]}, {"id": "t_floor", "multitile": true, "fg": 695, "additional_tiles": [{"id": "center", "fg": 692}, {"id": "corner", "fg": [697, 694, 690, 698]}, {"id": "t_connection", "fg": [696, 685, 691, 699]}, {"id": "edge", "fg": [687, 688]}, {"id": "end_piece", "fg": [693, 689, 700, 686]}, {"id": "unconnected", "fg": 695}]}, {"id": "t_brick_wall", "multitile": true, "fg": 714, "additional_tiles": [{"id": "center", "fg": 716}, {"id": "corner", "fg": [706, 708, 707, 712]}, {"id": "t_connection", "fg": [702, 710, 713, 715]}, {"id": "edge", "fg": [709, 701]}, {"id": "end_piece", "fg": [704, 705, 711, 703]}, {"id": "unconnected", "fg": 714}]}, {"id": "t_wall_wood", "multitile": true, "fg": 724, "additional_tiles": [{"id": "center", "fg": 720}, {"id": "corner", "fg": [717, 726, 730, 728]}, {"id": "t_connection", "fg": [725, 732, 719, 722]}, {"id": "edge", "fg": [718, 729]}, {"id": "end_piece", "fg": [731, 721, 727, 723]}, {"id": "unconnected", "fg": 724}]}, {"id": ["t_linoleum_white", "t_linoleum_white_no_roof"], "multitile": true, "fg": 736, "additional_tiles": [{"id": "center", "fg": 748}, {"id": "corner", "fg": [743, 742, 733, 747]}, {"id": "t_connection", "fg": [735, 745, 741, 744]}, {"id": "edge", "fg": [746, 740]}, {"id": "end_piece", "fg": [734, 737, 739, 738]}, {"id": "unconnected", "fg": 736}]}, {"id": "t_fungus", "multitile": true, "fg": 761, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 756}, {"id": "corner", "bg": 1312, "fg": [758, 762, 750, 751]}, {"id": "t_connection", "bg": 1312, "fg": [763, 749, 755, 757]}, {"id": "edge", "bg": 1312, "fg": [759, 753]}, {"id": "end_piece", "bg": 1312, "fg": [760, 752, 764, 754]}, {"bg": 1312, "id": "unconnected", "fg": 761}]}, {"id": "t_fungus_season_summer", "multitile": true, "fg": 761, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 756}, {"id": "corner", "bg": 1326, "fg": [758, 762, 750, 751]}, {"id": "t_connection", "bg": 1326, "fg": [763, 749, 755, 757]}, {"id": "edge", "bg": 1326, "fg": [759, 753]}, {"id": "end_piece", "bg": 1326, "fg": [760, 752, 764, 754]}, {"bg": 1326, "id": "unconnected", "fg": 761}]}, {"id": "t_fungus_season_autumn", "multitile": true, "fg": 761, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 756}, {"id": "corner", "bg": 1313, "fg": [758, 762, 750, 751]}, {"id": "t_connection", "bg": 1313, "fg": [763, 749, 755, 757]}, {"id": "edge", "bg": 1313, "fg": [759, 753]}, {"id": "end_piece", "bg": 1313, "fg": [760, 752, 764, 754]}, {"bg": 1313, "id": "unconnected", "fg": 761}]}, {"id": "t_fungus_season_winter", "multitile": true, "fg": 761, "bg": 682, "additional_tiles": [{"id": "center", "bg": 682, "fg": 756}, {"id": "corner", "bg": 682, "fg": [758, 762, 750, 751]}, {"id": "t_connection", "bg": 682, "fg": [763, 749, 755, 757]}, {"id": "edge", "bg": 682, "fg": [759, 753]}, {"id": "end_piece", "bg": 682, "fg": [760, 752, 764, 754]}, {"bg": 682, "id": "unconnected", "fg": 761}]}, {"id": "t_carpet_red", "multitile": true, "fg": 775, "additional_tiles": [{"id": "center", "fg": 772}, {"id": "corner", "fg": [774, 770, 773, 776]}, {"id": "t_connection", "fg": [767, 771, 766, 777]}, {"id": "edge", "fg": [765, 780]}, {"id": "end_piece", "fg": [778, 779, 769, 768]}, {"id": "unconnected", "fg": 775}]}, {"id": ["t_water_moving_sh", "t_swater_moving_sh"], "multitile": true, "fg": 785, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": [{"weight": 1, "sprite": 784}, {"weight": 1, "sprite": 789}, {"weight": 1, "sprite": 783}, {"weight": 1, "sprite": 781}]}, {"id": "corner", "bg": 1312, "fg": [797, 782, 787, 790]}, {"id": "t_connection", "bg": 1312, "fg": [799, 791, 788, 798]}, {"id": "edge", "bg": 1312, "fg": [794, 795]}, {"id": "end_piece", "bg": 1312, "fg": [796, 786, 792, 793]}, {"bg": 1312, "id": "unconnected", "fg": 785}]}, {"id": ["t_water_moving_sh_season_summer", "t_swater_moving_sh_season_summer"], "multitile": true, "fg": 785, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": [{"weight": 1, "sprite": 784}, {"weight": 1, "sprite": 789}, {"weight": 1, "sprite": 783}, {"weight": 1, "sprite": 781}]}, {"id": "corner", "bg": 1326, "fg": [797, 782, 787, 790]}, {"id": "t_connection", "bg": 1326, "fg": [799, 791, 788, 798]}, {"id": "edge", "bg": 1326, "fg": [794, 795]}, {"id": "end_piece", "bg": 1326, "fg": [796, 786, 792, 793]}, {"bg": 1326, "id": "unconnected", "fg": 785}]}, {"id": ["t_water_moving_sh_season_autumn", "t_swater_moving_sh_season_autumn"], "multitile": true, "fg": 785, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": [{"weight": 1, "sprite": 784}, {"weight": 1, "sprite": 789}, {"weight": 1, "sprite": 783}, {"weight": 1, "sprite": 781}]}, {"id": "corner", "bg": 1313, "fg": [797, 782, 787, 790]}, {"id": "t_connection", "bg": 1313, "fg": [799, 791, 788, 798]}, {"id": "edge", "bg": 1313, "fg": [794, 795]}, {"id": "end_piece", "bg": 1313, "fg": [796, 786, 792, 793]}, {"bg": 1313, "id": "unconnected", "fg": 785}]}, {"id": ["t_water_moving_sh_season_winter", "t_swater_moving_sh_season_winter"], "multitile": true, "fg": 785, "bg": 1321, "additional_tiles": [{"id": "center", "bg": 1321, "fg": [{"weight": 1, "sprite": 784}, {"weight": 1, "sprite": 789}, {"weight": 1, "sprite": 783}, {"weight": 1, "sprite": 781}]}, {"id": "corner", "bg": 1321, "fg": [797, 782, 787, 790]}, {"id": "t_connection", "bg": 1321, "fg": [799, 791, 788, 798]}, {"id": "edge", "bg": 1321, "fg": [794, 795]}, {"id": "end_piece", "bg": 1321, "fg": [796, 786, 792, 793]}, {"bg": 1321, "id": "unconnected", "fg": 785}]}, {"id": ["t_window", "t_window_alarm"], "fg": 801}, {"id": "t_window_empty", "fg": 805}, {"id": "t_window_domestic", "fg": 804}, {"id": "t_window_open", "fg": 803}, {"id": "t_window_no_curtains", "fg": 802}, {"id": "t_window_no_curtains_open", "fg": 800}, {"id": "t_fence_wire", "multitile": true, "fg": 814, "additional_tiles": [{"id": "center", "fg": 811}, {"id": "corner", "fg": [815, 812, 818, 820]}, {"id": "t_connection", "fg": [817, 810, 813, 806]}, {"id": "edge", "fg": [819, 816]}, {"id": "end_piece", "fg": [808, 809, 807, 821]}, {"id": "unconnected", "fg": 814}]}, {"id": "t_fence_barbed_season_spring", "multitile": true, "fg": 827, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 824}, {"id": "corner", "bg": 1312, "fg": [823, 836, 834, 837]}, {"id": "t_connection", "bg": 1312, "fg": [829, 825, 831, 832]}, {"id": "edge", "bg": 1312, "fg": [835, 830]}, {"id": "end_piece", "bg": 1312, "fg": [826, 822, 828, 833]}, {"bg": 1312, "id": "unconnected", "fg": 827}]}, {"id": "t_fence_barbed_season_summer", "multitile": true, "fg": 827, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 824}, {"id": "corner", "bg": 1326, "fg": [823, 836, 834, 837]}, {"id": "t_connection", "bg": 1326, "fg": [829, 825, 831, 832]}, {"id": "edge", "bg": 1326, "fg": [835, 830]}, {"id": "end_piece", "bg": 1326, "fg": [826, 822, 828, 833]}, {"bg": 1326, "id": "unconnected", "fg": 827}]}, {"id": "t_fence_barbed_season_autumn", "multitile": true, "fg": 827, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 824}, {"id": "corner", "bg": 1313, "fg": [823, 836, 834, 837]}, {"id": "t_connection", "bg": 1313, "fg": [829, 825, 831, 832]}, {"id": "edge", "bg": 1313, "fg": [835, 830]}, {"id": "end_piece", "bg": 1313, "fg": [826, 822, 828, 833]}, {"bg": 1313, "id": "unconnected", "fg": 827}]}, {"id": "t_fence_barbed_season_winter", "multitile": true, "fg": 827, "bg": 682, "additional_tiles": [{"id": "center", "bg": 682, "fg": 824}, {"id": "corner", "bg": 682, "fg": [823, 836, 834, 837]}, {"id": "t_connection", "bg": 682, "fg": [829, 825, 831, 832]}, {"id": "edge", "bg": 682, "fg": [835, 830]}, {"id": "end_piece", "bg": 682, "fg": [826, 822, 828, 833]}, {"bg": 682, "id": "unconnected", "fg": 827}]}, {"id": "t_floor_waxed", "multitile": true, "fg": 843, "additional_tiles": [{"id": "center", "fg": 852}, {"id": "corner", "fg": [845, 840, 841, 846]}, {"id": "t_connection", "fg": [850, 839, 849, 842]}, {"id": "edge", "fg": [848, 838]}, {"id": "end_piece", "fg": [851, 847, 844, 853]}, {"id": "unconnected", "fg": 843}]}, {"id": "t_curtains", "fg": 854}, {"id": "t_door_glass_c", "fg": 855}, {"id": ["t_wall_glass", "t_wall_glass_alarm"], "multitile": true, "fg": 857, "additional_tiles": [{"id": "center", "fg": 864}, {"id": "corner", "fg": [871, 868, 859, 874]}, {"id": "t_connection", "fg": [872, 862, 861, 867]}, {"id": "edge", "fg": [856, 860]}, {"id": "end_piece", "fg": [858, 870, 875, 863]}, {"id": "unconnected", "fg": 857}]}, {"id": ["t_sidewalk", "t_sidewalk_bg_dp"], "multitile": true, "fg": 889, "additional_tiles": [{"id": "center", "fg": 876}, {"id": "corner", "fg": [877, 891, 878, 882]}, {"id": "t_connection", "fg": [880, 879, 888, 886]}, {"id": "edge", "fg": [885, 890]}, {"id": "end_piece", "fg": [884, 881, 883, 887]}, {"id": "unconnected", "fg": 889}]}, {"id": "t_sidewalk_season_winter", "fg": 682}, {"id": "t_carpet_purple", "multitile": true, "fg": 898, "additional_tiles": [{"id": "center", "fg": 896}, {"id": "corner", "fg": [901, 903, 892, 895]}, {"id": "t_connection", "fg": [905, 907, 899, 897]}, {"id": "edge", "fg": [904, 906]}, {"id": "end_piece", "fg": [900, 902, 894, 893]}, {"id": "unconnected", "fg": 898}]}, {"id": ["t_shrub_raspberry"], "fg": 908, "bg": 1312}, {"id": ["t_shrub_raspberry_harvested"], "fg": 911, "bg": 1326}, {"id": "t_shrub_raspberry_season_summer", "fg": 910, "bg": 1326}, {"id": "t_shrub_raspberry_season_autumn", "fg": 908, "bg": 1313}, {"id": "t_shrub_raspberry_season_winter", "fg": 909, "bg": 649}, {"id": "t_woodchips", "fg": 912}, {"id": "t_woodchips_season_winter", "fg": 682}, {"id": "t_fence_post_season_spring", "fg": 923, "bg": 1312}, {"id": "t_fence_post_season_summer", "fg": 923, "bg": 1326}, {"id": "t_fence_post_season_autumn", "fg": 923, "bg": 1313}, {"id": "t_fence_post_season_winter", "fg": 923, "bg": 682}, {"id": "t_fence_season_spring", "multitile": true, "fg": 923, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 922}, {"id": "corner", "bg": 1312, "fg": [916, 914, 917, 924]}, {"id": "t_connection", "bg": 1312, "fg": [926, 915, 927, 928]}, {"id": "edge", "bg": 1312, "fg": [925, 929]}, {"id": "end_piece", "bg": 1312, "fg": [920, 919, 930, 918]}, {"bg": 1312, "id": "unconnected", "fg": 923}]}, {"id": "t_fence_season_summer", "multitile": true, "fg": 923, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 922}, {"id": "corner", "bg": 1326, "fg": [916, 914, 917, 924]}, {"id": "t_connection", "bg": 1326, "fg": [926, 915, 927, 928]}, {"id": "edge", "bg": 1326, "fg": [925, 929]}, {"id": "end_piece", "bg": 1326, "fg": [920, 919, 930, 918]}, {"bg": 1326, "id": "unconnected", "fg": 923}]}, {"id": "t_fence_season_autumn", "multitile": true, "fg": 923, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 922}, {"id": "corner", "bg": 1313, "fg": [916, 914, 917, 924]}, {"id": "t_connection", "bg": 1313, "fg": [926, 915, 927, 928]}, {"id": "edge", "bg": 1313, "fg": [925, 929]}, {"id": "end_piece", "bg": 1313, "fg": [920, 919, 930, 918]}, {"bg": 1313, "id": "unconnected", "fg": 923}]}, {"id": "t_fence_season_winter", "multitile": true, "fg": 923, "bg": 682, "additional_tiles": [{"id": "center", "bg": 682, "fg": 922}, {"id": "corner", "bg": 682, "fg": [916, 914, 917, 924]}, {"id": "t_connection", "bg": 682, "fg": [926, 915, 927, 928]}, {"id": "edge", "bg": 682, "fg": [925, 929]}, {"id": "end_piece", "bg": 682, "fg": [920, 919, 930, 918]}, {"bg": 682, "id": "unconnected", "fg": 923}]}, {"id": "t_fencegate_c_season_spring", "fg": 913, "bg": 1312}, {"id": "t_fencegate_c_season_summer", "fg": 913, "bg": 1326}, {"id": "t_fencegate_c_season_autumn", "fg": 913, "bg": 1313}, {"id": "t_fencegate_c_season_winter", "fg": 913, "bg": 682}, {"id": "t_fencegate_o_season_spring", "fg": 921, "bg": 1312}, {"id": "t_fencegate_o_season_summer", "fg": 921, "bg": 1326}, {"id": "t_fencegate_o_season_autumn", "fg": 921, "bg": 1313}, {"id": "t_fencegate_o_season_winter", "fg": 921, "bg": 682}, {"id": "t_wall_y", "multitile": true, "fg": 945, "additional_tiles": [{"id": "center", "fg": 946}, {"id": "corner", "fg": [939, 943, 938, 932]}, {"id": "t_connection", "fg": [936, 941, 935, 940]}, {"id": "edge", "fg": [937, 942]}, {"id": "end_piece", "fg": [933, 934, 944, 931]}, {"id": "unconnected", "fg": 945}]}, {"id": "t_rdoor_c", "fg": 948}, {"id": "t_rdoor_o", "fg": 949}, {"id": "t_rdoor_b", "fg": 947}, {"id": ["t_gates_mech_control"], "fg": 952, "bg": 983}, {"id": ["t_gates_mech_control_lab"], "fg": 954, "bg": 983}, {"id": ["t_gates_control_concrete"], "fg": 951, "bg": 1026}, {"id": ["t_gates_control_concrete_lab"], "fg": 954, "bg": 2534}, {"id": ["t_gates_control_brick"], "fg": 951, "bg": 714}, {"id": ["t_gates_control_brick_lab"], "fg": 954, "bg": 714}, {"id": ["t_gates_control_metal"], "fg": 951, "bg": 2542}, {"id": ["t_gates_control_metal_lab"], "fg": 954, "bg": 2542}, {"id": ["t_elevator_control"], "fg": 950, "bg": 983}, {"id": ["t_elevator_control_off"], "fg": 953, "bg": 983}, {"id": ["t_stump"], "fg": 955, "bg": 1312}, {"id": ["t_stump_season_summer"], "fg": 955, "bg": 1326}, {"id": ["t_stump_season_autumn"], "fg": 955, "bg": 1313}, {"id": "t_stump_season_winter", "fg": 955, "bg": 649}, {"id": ["t_water_moving_dp", "t_swater_moving_dp"], "multitile": true, "fg": 959, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": [{"weight": 1, "sprite": 958}, {"weight": 1, "sprite": 964}]}, {"id": "corner", "bg": 1312, "fg": [965, 961, 960, 966]}, {"id": "t_connection", "bg": 1312, "fg": [967, 972, 969, 971]}, {"id": "edge", "bg": 1312, "fg": [963, 962]}, {"id": "end_piece", "bg": 1312, "fg": [968, 956, 957, 970]}, {"bg": 1312, "id": "unconnected", "fg": 959}]}, {"id": ["t_water_moving_dp_season_summer", "t_swater_moving_dp_season_summer"], "multitile": true, "fg": 959, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": [{"weight": 1, "sprite": 958}, {"weight": 1, "sprite": 964}]}, {"id": "corner", "bg": 1326, "fg": [965, 961, 960, 966]}, {"id": "t_connection", "bg": 1326, "fg": [967, 972, 969, 971]}, {"id": "edge", "bg": 1326, "fg": [963, 962]}, {"id": "end_piece", "bg": 1326, "fg": [968, 956, 957, 970]}, {"bg": 1326, "id": "unconnected", "fg": 959}]}, {"id": ["t_water_moving_dp_season_autumn", "t_swater_moving_dp_season_autumn"], "multitile": true, "fg": 959, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": [{"weight": 1, "sprite": 958}, {"weight": 1, "sprite": 964}]}, {"id": "corner", "bg": 1313, "fg": [965, 961, 960, 966]}, {"id": "t_connection", "bg": 1313, "fg": [967, 972, 969, 971]}, {"id": "edge", "bg": 1313, "fg": [963, 962]}, {"id": "end_piece", "bg": 1313, "fg": [968, 956, 957, 970]}, {"bg": 1313, "id": "unconnected", "fg": 959}]}, {"id": ["t_water_moving_dp_season_winter", "t_swater_moving_dp_season_winter"], "multitile": true, "fg": 959, "bg": 1321, "additional_tiles": [{"id": "center", "bg": 1321, "fg": [{"weight": 1, "sprite": 958}, {"weight": 1, "sprite": 964}]}, {"id": "corner", "bg": 1321, "fg": [965, 961, 960, 966]}, {"id": "t_connection", "bg": 1321, "fg": [967, 972, 969, 971]}, {"id": "edge", "bg": 1321, "fg": [963, 962]}, {"id": "end_piece", "bg": 1321, "fg": [968, 956, 957, 970]}, {"bg": 1321, "id": "unconnected", "fg": 959}]}, {"id": "t_thconc_floor", "multitile": true, "fg": 982, "additional_tiles": [{"id": "center", "fg": 983}, {"id": "corner", "fg": [979, 977, 987, 978]}, {"id": "t_connection", "fg": [984, 980, 973, 981]}, {"id": "edge", "fg": [986, 988]}, {"id": "end_piece", "fg": [976, 975, 985, 974]}, {"id": "unconnected", "fg": 982}]}, {"id": "t_carpet_green", "multitile": true, "fg": 999, "additional_tiles": [{"id": "center", "fg": 994}, {"id": "corner", "fg": [990, 1000, 998, 996]}, {"id": "t_connection", "fg": [992, 993, 991, 995]}, {"id": "edge", "fg": [1004, 997]}, {"id": "end_piece", "fg": [1002, 1001, 1003, 989]}, {"id": "unconnected", "fg": 999}]}, {"id": "t_door_lab_c", "fg": 1006}, {"id": "t_door_lab_o", "fg": 1005}, {"id": "t_dirtfloor", "multitile": true, "fg": 1021, "additional_tiles": [{"id": "center", "fg": 1015}, {"id": "corner", "fg": [1016, 1020, 1013, 1019]}, {"id": "t_connection", "fg": [1018, 1010, 1022, 1009]}, {"id": "edge", "fg": [1012, 1017]}, {"id": "end_piece", "fg": [1014, 1011, 1007, 1008]}, {"id": "unconnected", "fg": 1021}]}, {"id": "t_concrete_wall", "multitile": true, "fg": 1026, "additional_tiles": [{"id": "center", "fg": 1030}, {"id": "corner", "fg": [1038, 1029, 1037, 1028]}, {"id": "t_connection", "fg": [1033, 1023, 1031, 1027]}, {"id": "edge", "fg": [1036, 1025]}, {"id": "end_piece", "fg": [1035, 1032, 1034, 1024]}, {"id": "unconnected", "fg": 1026}]}, {"id": "t_wall_w", "multitile": true, "fg": 1040, "additional_tiles": [{"id": "center", "fg": 1050}, {"id": "corner", "fg": [1054, 1046, 1049, 1042]}, {"id": "t_connection", "fg": [1041, 1053, 1043, 1039]}, {"id": "edge", "fg": [1044, 1051]}, {"id": "end_piece", "fg": [1052, 1048, 1045, 1047]}, {"id": "unconnected", "fg": 1040}]}, {"id": "t_rock_wall", "multitile": true, "fg": 1055, "additional_tiles": [{"id": "center", "fg": 1064}, {"id": "corner", "fg": [1059, 1067, 1056, 1057]}, {"id": "t_connection", "fg": [1060, 1069, 1070, 1066]}, {"id": "edge", "fg": [1058, 1065]}, {"id": "end_piece", "fg": [1061, 1062, 1063, 1068]}, {"id": "unconnected", "fg": 1055}]}, {"id": "t_rock_floor", "multitile": true, "fg": 1078, "additional_tiles": [{"id": "center", "fg": 1082}, {"id": "corner", "fg": [1080, 1086, 1085, 1084]}, {"id": "t_connection", "fg": [1071, 1076, 1079, 1074]}, {"id": "edge", "fg": [1073, 1072]}, {"id": "end_piece", "fg": [1083, 1081, 1077, 1075]}, {"id": "unconnected", "fg": 1078}]}, {"id": "t_grass_tall", "multitile": true, "fg": 1098, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 1096}, {"id": "corner", "bg": 1312, "fg": [1090, 1094, 1100, 1093]}, {"id": "t_connection", "bg": 1312, "fg": [1092, 1088, 1097, 1101]}, {"id": "edge", "bg": 1312, "fg": [1091, 1089]}, {"id": "end_piece", "bg": 1312, "fg": [1095, 1087, 1099, 1102]}, {"bg": 1312, "id": "unconnected", "fg": 1098}]}, {"id": "t_grass_tall_season_summer", "multitile": true, "fg": 1106, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 1113}, {"id": "corner", "bg": 1326, "fg": [1111, 1115, 1118, 1103]}, {"id": "t_connection", "bg": 1326, "fg": [1110, 1117, 1109, 1114]}, {"id": "edge", "bg": 1326, "fg": [1104, 1116]}, {"id": "end_piece", "bg": 1326, "fg": [1105, 1107, 1108, 1112]}, {"bg": 1326, "id": "unconnected", "fg": 1106}]}, {"id": "t_grass_tall_season_autumn", "multitile": true, "fg": 1132, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 1126}, {"id": "corner", "bg": 1313, "fg": [1119, 1134, 1122, 1124]}, {"id": "t_connection", "bg": 1313, "fg": [1130, 1125, 1127, 1129]}, {"id": "edge", "bg": 1313, "fg": [1120, 1121]}, {"id": "end_piece", "bg": 1313, "fg": [1133, 1131, 1128, 1123]}, {"bg": 1313, "id": "unconnected", "fg": 1132}]}, {"id": "t_grass_tall_season_winter", "fg": 649}, {"id": "f_grass_tall", "multitile": true, "fg": 1098, "additional_tiles": [{"id": "center", "fg": 1096}, {"id": "corner", "fg": [1090, 1094, 1100, 1093]}, {"id": "t_connection", "fg": [1092, 1088, 1097, 1101]}, {"id": "edge", "fg": [1091, 1089]}, {"id": "end_piece", "fg": [1095, 1087, 1099, 1102]}, {"id": "unconnected", "fg": 1098}]}, {"id": "f_grass_tall_summer", "multitile": true, "fg": 1106, "additional_tiles": [{"id": "center", "fg": 1113}, {"id": "corner", "fg": [1111, 1115, 1118, 1103]}, {"id": "t_connection", "fg": [1110, 1117, 1109, 1114]}, {"id": "edge", "fg": [1104, 1116]}, {"id": "end_piece", "fg": [1105, 1107, 1108, 1112]}, {"id": "unconnected", "fg": 1106}]}, {"id": "f_grass_tall_autumn", "multitile": true, "fg": 1132, "additional_tiles": [{"id": "center", "fg": 1126}, {"id": "corner", "fg": [1119, 1134, 1122, 1124]}, {"id": "t_connection", "fg": [1130, 1125, 1127, 1129]}, {"id": "edge", "fg": [1120, 1121]}, {"id": "end_piece", "fg": [1133, 1131, 1128, 1123]}, {"id": "unconnected", "fg": 1132}]}, {"id": "t_grass_long", "multitile": true, "fg": 1140, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 1146}, {"id": "corner", "bg": 1312, "fg": [1141, 1144, 1135, 1139]}, {"id": "t_connection", "bg": 1312, "fg": [1142, 1147, 1136, 1150]}, {"id": "edge", "bg": 1312, "fg": [1148, 1138]}, {"id": "end_piece", "bg": 1312, "fg": [1143, 1137, 1149, 1145]}, {"bg": 1312, "id": "unconnected", "fg": 1140}]}, {"id": "t_grass_long_season_autumn", "multitile": true, "fg": 1166, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 1159}, {"id": "corner", "bg": 1313, "fg": [1158, 1165, 1164, 1161]}, {"id": "t_connection", "bg": 1313, "fg": [1152, 1151, 1156, 1163]}, {"id": "edge", "bg": 1313, "fg": [1154, 1157]}, {"id": "end_piece", "bg": 1313, "fg": [1153, 1160, 1155, 1162]}, {"bg": 1313, "id": "unconnected", "fg": 1166}]}, {"id": "t_grass_long_season_summer", "multitile": true, "fg": 1179, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 1176}, {"id": "corner", "bg": 1326, "fg": [1180, 1173, 1169, 1174]}, {"id": "t_connection", "bg": 1326, "fg": [1172, 1177, 1178, 1171]}, {"id": "edge", "bg": 1326, "fg": [1182, 1170]}, {"id": "end_piece", "bg": 1326, "fg": [1168, 1175, 1181, 1167]}, {"bg": 1326, "id": "unconnected", "fg": 1179}]}, {"id": "t_grass_long_season_winter", "fg": 649}, {"id": "f_grass_long", "multitile": true, "fg": 1140, "additional_tiles": [{"id": "center", "fg": 1146}, {"id": "corner", "fg": [1141, 1144, 1135, 1139]}, {"id": "t_connection", "fg": [1142, 1147, 1136, 1150]}, {"id": "edge", "fg": [1148, 1138]}, {"id": "end_piece", "fg": [1143, 1137, 1149, 1145]}, {"id": "unconnected", "fg": 1140}]}, {"id": "f_grass_long_season_autumn", "multitile": true, "fg": 1166, "additional_tiles": [{"id": "center", "fg": 1159}, {"id": "corner", "fg": [1158, 1165, 1164, 1161]}, {"id": "t_connection", "fg": [1152, 1151, 1156, 1163]}, {"id": "edge", "fg": [1154, 1157]}, {"id": "end_piece", "fg": [1153, 1160, 1155, 1162]}, {"id": "unconnected", "fg": 1166}]}, {"id": "f_grass_long_season_summer", "multitile": true, "fg": 1179, "additional_tiles": [{"id": "center", "fg": 1176}, {"id": "corner", "fg": [1180, 1173, 1169, 1174]}, {"id": "t_connection", "fg": [1172, 1177, 1178, 1171]}, {"id": "edge", "fg": [1182, 1170]}, {"id": "end_piece", "fg": [1168, 1175, 1181, 1167]}, {"id": "unconnected", "fg": 1179}]}, {"id": ["t_shrub_lilac"], "fg": 1186, "bg": 1312}, {"id": ["t_shrub_lilac_harvested"], "fg": 1183, "bg": 1312}, {"id": "t_shrub_lilac_season_summer", "fg": 1185, "bg": 1326}, {"id": "t_shrub_lilac_season_autumn", "fg": 1183, "bg": 1313}, {"id": "t_shrub_lilac_season_winter", "fg": 1184, "bg": 649}, {"id": "t_elevator", "fg": [{"weight": 100, "sprite": 1187}, {"weight": 100, "sprite": 1188}]}, {"id": "t_moss", "fg": 1189}, {"id": "t_moss_season_winter", "fg": 649}, {"id": "t_scrap_floor", "multitile": true, "fg": 1199, "additional_tiles": [{"id": "center", "fg": 1196}, {"id": "corner", "fg": [1194, 1201, 1190, 1205]}, {"id": "t_connection", "fg": [1193, 1204, 1192, 1195]}, {"id": "edge", "fg": [1203, 1197]}, {"id": "end_piece", "fg": [1200, 1191, 1202, 1198]}, {"id": "unconnected", "fg": 1199}]}, {"id": "t_grass_dead", "multitile": true, "fg": 1220, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 1216}, {"id": "corner", "bg": 1312, "fg": [1221, 1212, 1213, 1208]}, {"id": "t_connection", "bg": 1312, "fg": [1215, 1210, 1218, 1209]}, {"id": "edge", "bg": 1312, "fg": [1207, 1214]}, {"id": "end_piece", "bg": 1312, "fg": [1219, 1206, 1211, 1217]}, {"bg": 1312, "id": "unconnected", "fg": 1220}]}, {"id": "t_grass_dead_season_summer", "multitile": true, "fg": 1251, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 1250}, {"id": "corner", "bg": 1326, "fg": [1238, 1239, 1243, 1241]}, {"id": "t_connection", "bg": 1326, "fg": [1249, 1253, 1247, 1252]}, {"id": "edge", "bg": 1326, "fg": [1242, 1248]}, {"id": "end_piece", "bg": 1326, "fg": [1245, 1246, 1244, 1240]}, {"bg": 1326, "id": "unconnected", "fg": 1251}]}, {"id": "t_grass_dead_season_autumn", "multitile": true, "fg": 1223, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 1237}, {"id": "corner", "bg": 1313, "fg": [1227, 1228, 1229, 1235]}, {"id": "t_connection", "bg": 1313, "fg": [1225, 1230, 1231, 1232]}, {"id": "edge", "bg": 1313, "fg": [1222, 1234]}, {"id": "end_piece", "bg": 1313, "fg": [1236, 1226, 1224, 1233]}, {"bg": 1313, "id": "unconnected", "fg": 1223}]}, {"id": "t_grass_dead_season_winter", "multitile": true, "fg": 675, "bg": 1321, "additional_tiles": [{"id": "center", "bg": 1321, "fg": [{"weight": 1, "sprite": 682}, {"weight": 1, "sprite": 674}, {"weight": 1, "sprite": 673}, {"weight": 1, "sprite": 671}]}, {"id": "corner", "bg": 1321, "fg": [678, 677, 684, 669]}, {"id": "t_connection", "bg": 1321, "fg": [668, 680, 681, 679]}, {"id": "edge", "bg": 1321, "fg": [683, 676]}, {"id": "end_piece", "bg": 1321, "fg": [667, 672, 670, 666]}, {"bg": 1321, "id": "unconnected", "fg": 675}]}, {"id": ["t_water_sh", "t_swater_sh"], "multitile": true, "fg": 1267, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": [{"weight": 1, "sprite": 1263}, {"weight": 1, "sprite": 1270}, {"weight": 1, "sprite": 1265}, {"weight": 1, "sprite": 1257}]}, {"id": "corner", "bg": 1312, "fg": [1258, 1261, 1272, 1269]}, {"id": "t_connection", "bg": 1312, "fg": [1259, 1264, 1268, 1271]}, {"id": "edge", "bg": 1312, "fg": [1256, 1260]}, {"id": "end_piece", "bg": 1312, "fg": [1255, 1262, 1254, 1266]}, {"bg": 1312, "id": "unconnected", "fg": 1267}]}, {"id": ["t_water_sh_season_summer", "t_swater_sh_season_summer"], "multitile": true, "fg": 1267, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": [{"weight": 1, "sprite": 1263}, {"weight": 1, "sprite": 1270}, {"weight": 1, "sprite": 1265}]}, {"id": "corner", "bg": 1326, "fg": [1258, 1261, 1272, 1269]}, {"id": "t_connection", "bg": 1326, "fg": [1259, 1264, 1268, 1271]}, {"id": "edge", "bg": 1326, "fg": [1256, 1260]}, {"id": "end_piece", "bg": 1326, "fg": [1255, 1262, 1254, 1266]}, {"bg": 1326, "id": "unconnected", "fg": 1267}]}, {"id": ["t_water_sh_season_autumn", "t_swater_sh_season_autumn"], "multitile": true, "fg": 1267, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": [{"weight": 1, "sprite": 1263}, {"weight": 1, "sprite": 1270}, {"weight": 1, "sprite": 1265}]}, {"id": "corner", "bg": 1313, "fg": [1258, 1261, 1272, 1269]}, {"id": "t_connection", "bg": 1313, "fg": [1259, 1264, 1268, 1271]}, {"id": "edge", "bg": 1313, "fg": [1256, 1260]}, {"id": "end_piece", "bg": 1313, "fg": [1255, 1262, 1254, 1266]}, {"bg": 1313, "id": "unconnected", "fg": 1267}]}, {"id": ["t_water_sh_season_winter", "t_swater_sh_season_winter"], "multitile": true, "fg": 1267, "bg": 682, "additional_tiles": [{"id": "center", "bg": 682, "fg": [{"weight": 1, "sprite": 1263}, {"weight": 1, "sprite": 1270}, {"weight": 1, "sprite": 1265}]}, {"id": "corner", "bg": 682, "fg": [1258, 1261, 1272, 1269]}, {"id": "t_connection", "bg": 682, "fg": [1259, 1264, 1268, 1271]}, {"id": "edge", "bg": 682, "fg": [1256, 1260]}, {"id": "end_piece", "bg": 682, "fg": [1255, 1262, 1254, 1266]}, {"bg": 682, "id": "unconnected", "fg": 1267}]}, {"id": "t_reinforced_glass", "multitile": true, "fg": 1284, "additional_tiles": [{"id": "center", "fg": 1275}, {"id": "corner", "fg": [1288, 1283, 1278, 1282]}, {"id": "t_connection", "fg": [1285, 1286, 1277, 1281]}, {"id": "edge", "fg": [1274, 1287]}, {"id": "end_piece", "fg": [1280, 1279, 1273, 1276]}, {"id": "unconnected", "fg": 1284}]}, {"id": "t_carpet_yellow", "multitile": true, "fg": 1290, "additional_tiles": [{"id": "center", "fg": 1303}, {"id": "corner", "fg": [1289, 1298, 1301, 1294]}, {"id": "t_connection", "fg": [1304, 1292, 1291, 1297]}, {"id": "edge", "fg": [1296, 1302]}, {"id": "end_piece", "fg": [1300, 1299, 1295, 1293]}, {"id": "unconnected", "fg": 1290}]}, {"id": "t_dirt", "bg": [{"weight": 100, "sprite": 1312}, {"weight": 100, "sprite": 1315}, {"weight": 100, "sprite": 1309}, {"weight": 100, "sprite": 1318}]}, {"id": "t_dirt_season_autumn", "bg": [{"weight": 100, "sprite": 1313}, {"weight": 100, "sprite": 1305}, {"weight": 100, "sprite": 1319}, {"weight": 100, "sprite": 1308}]}, {"id": "t_dirt_season_summer", "bg": [{"weight": 100, "sprite": 1326}, {"weight": 100, "sprite": 1306}, {"weight": 100, "sprite": 1314}, {"weight": 100, "sprite": 1327}]}, {"id": "t_dirt_season_winter", "bg": [{"weight": 100, "sprite": 1321}, {"weight": 100, "sprite": 1317}, {"weight": 100, "sprite": 1316}, {"weight": 100, "sprite": 1324}]}, {"id": "t_door_metal_c_peep", "fg": 1328}, {"id": "t_shrub", "fg": 1329, "bg": 1312}, {"id": "t_shrub_season_summer", "fg": 1329, "bg": 1326}, {"id": "t_shrub_season_autumn", "fg": 1329, "bg": 1313}, {"id": "t_shrub_season_winter", "fg": 1330, "bg": 649}, {"id": "t_pit", "fg": 1331, "bg": [{"weight": 100, "sprite": 1312}, {"weight": 100, "sprite": 1315}]}, {"id": "t_pit_season_summer", "fg": 1331, "bg": [{"weight": 100, "sprite": 1326}, {"weight": 100, "sprite": 1306}]}, {"id": "t_pit_season_autumn", "fg": 1331, "bg": [{"weight": 100, "sprite": 1313}, {"weight": 100, "sprite": 1305}]}, {"id": "t_door_c", "fg": 1332}, {"id": "t_door_locked", "fg": 1334}, {"id": "t_door_o", "fg": 1333}, {"id": "t_door_b", "fg": 1335}, {"id": "t_scrap_wall", "multitile": true, "fg": 1350, "additional_tiles": [{"id": "center", "fg": 1347}, {"id": "corner", "fg": [1337, 1351, 1349, 1352]}, {"id": "t_connection", "fg": [1342, 1345, 1341, 1339]}, {"id": "edge", "fg": [1340, 1344]}, {"id": "end_piece", "fg": [1346, 1338, 1336, 1343]}, {"id": "unconnected", "fg": 1350}]}, {"id": "t_clay", "multitile": true, "fg": 1357, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": 1364}, {"id": "corner", "bg": 1312, "fg": [1359, 1354, 1356, 1365]}, {"id": "t_connection", "bg": 1312, "fg": [1367, 1366, 1358, 1362]}, {"id": "edge", "bg": 1312, "fg": [1353, 1355]}, {"id": "end_piece", "bg": 1312, "fg": [1363, 1368, 1361, 1360]}, {"bg": 1312, "id": "unconnected", "fg": 1357}]}, {"id": "t_clay_season_summer", "multitile": true, "fg": 1357, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": 1364}, {"id": "corner", "bg": 1326, "fg": [1359, 1354, 1356, 1365]}, {"id": "t_connection", "bg": 1326, "fg": [1367, 1366, 1358, 1362]}, {"id": "edge", "bg": 1326, "fg": [1353, 1355]}, {"id": "end_piece", "bg": 1326, "fg": [1363, 1368, 1361, 1360]}, {"bg": 1326, "id": "unconnected", "fg": 1357}]}, {"id": "t_clay_season_autumn", "multitile": true, "fg": 1357, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": 1364}, {"id": "corner", "bg": 1313, "fg": [1359, 1354, 1356, 1365]}, {"id": "t_connection", "bg": 1313, "fg": [1367, 1366, 1358, 1362]}, {"id": "edge", "bg": 1313, "fg": [1353, 1355]}, {"id": "end_piece", "bg": 1313, "fg": [1363, 1368, 1361, 1360]}, {"bg": 1313, "id": "unconnected", "fg": 1357}]}, {"id": "t_clay_season_winter", "multitile": true, "fg": 1357, "bg": 1321, "additional_tiles": [{"id": "center", "bg": 1321, "fg": 1364}, {"id": "corner", "bg": 1321, "fg": [1359, 1354, 1356, 1365]}, {"id": "t_connection", "bg": 1321, "fg": [1367, 1366, 1358, 1362]}, {"id": "edge", "bg": 1321, "fg": [1353, 1355]}, {"id": "end_piece", "bg": 1321, "fg": [1363, 1368, 1361, 1360]}, {"bg": 1321, "id": "unconnected", "fg": 1357}]}, {"id": ["t_shrub_hydrangea"], "fg": 1371, "bg": 1312}, {"id": ["t_shrub_hydrangea_harvested"], "fg": 1372, "bg": 1312}, {"id": "t_shrub_hydrangea_season_summer", "fg": 1369, "bg": 1326}, {"id": "t_shrub_hydrangea_season_autumn", "fg": 1371, "bg": 1313}, {"id": "t_shrub_hydrangea_season_winter", "fg": 1370, "bg": 649}, {"id": "t_bars", "fg": 1373}, {"id": ["t_shrub_grape"], "fg": 1377, "bg": 1312}, {"id": ["t_shrub_grape_harvested"], "fg": 1374, "bg": 1326}, {"id": "t_shrub_grape_season_summer", "fg": 1376, "bg": 1326}, {"id": "t_shrub_grape_season_autumn", "fg": 1377, "bg": 1313}, {"id": "t_shrub_grape_season_winter", "fg": 1375, "bg": 649}, {"id": "t_door_glass_o", "fg": 1378}, {"id": ["t_shrub_rose"], "fg": 1381, "bg": 1312}, {"id": "t_shrub_rose_season_summer", "fg": 1381, "bg": 1326}, {"id": "t_shrub_rose_harvested", "fg": 1381, "bg": 1313}, {"id": "t_shrub_rose_season_autumn", "fg": 1379, "bg": 1313}, {"id": "t_shrub_rose_season_winter", "fg": 1380, "bg": 649}, {"id": "t_wall", "multitile": true, "fg": 1394, "additional_tiles": [{"id": "center", "fg": 1389}, {"id": "corner", "fg": [1395, 1387, 1384, 1393]}, {"id": "t_connection", "fg": [1391, 1386, 1397, 1382]}, {"id": "edge", "fg": [1383, 1385]}, {"id": "end_piece", "fg": [1390, 1396, 1392, 1388]}, {"id": "unconnected", "fg": 1394}]}, {"id": "t_wall_p", "multitile": true, "fg": 1407, "additional_tiles": [{"id": "center", "fg": 1412}, {"id": "corner", "fg": [1400, 1403, 1408, 1405]}, {"id": "t_connection", "fg": [1410, 1404, 1406, 1398]}, {"id": "edge", "fg": [1411, 1399]}, {"id": "end_piece", "fg": [1409, 1401, 1413, 1402]}, {"id": "unconnected", "fg": 1407}]}, {"id": "t_wall_log", "multitile": true, "fg": 1421, "bg": 1312, "additional_tiles": [{"id": "center", "fg": 1425}, {"id": "corner", "fg": [1426, 1415, 1429, 1423]}, {"id": "t_connection", "fg": [1420, 1417, 1428, 1419]}, {"id": "edge", "bg": 1312, "fg": [1416, 1418]}, {"id": "end_piece", "bg": 1312, "fg": [1427, 1422, 1424, 1414]}, {"bg": 1312, "id": "unconnected", "fg": 1421}]}, {"id": "t_wall_g", "multitile": true, "fg": 1435, "additional_tiles": [{"id": "center", "fg": 1439}, {"id": "corner", "fg": [1445, 1442, 1436, 1444]}, {"id": "t_connection", "fg": [1440, 1431, 1441, 1437]}, {"id": "edge", "fg": [1432, 1433]}, {"id": "end_piece", "fg": [1443, 1438, 1434, 1430]}, {"id": "unconnected", "fg": 1435}]}, {"id": "t_door_boarded", "fg": 1446}, {"id": "t_door_boarded_damaged", "fg": 1447}, {"id": ["t_water_pool", "t_water_pool_shallow"], "multitile": true, "fg": 1455, "additional_tiles": [{"id": "center", "fg": [{"weight": 1, "sprite": 1263}, {"weight": 1, "sprite": 1270}, {"weight": 1, "sprite": 1265}]}, {"id": "corner", "fg": [1450, 1459, 1458, 1452]}, {"id": "t_connection", "fg": [1454, 1451, 1456, 1460]}, {"id": "edge", "fg": [1457, 1449]}, {"id": "end_piece", "fg": [1461, 1462, 1448, 1453]}, {"id": "unconnected", "fg": 1455}]}, {"id": "t_pavement", "fg": 1463}, {"id": "t_pavement_season_winter", "fg": 682}, {"id": ["t_water_dp", "t_swater_dp"], "multitile": true, "fg": 1471, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": [{"weight": 1, "sprite": 1473}, {"weight": 1, "sprite": 1474}, {"weight": 1, "sprite": 1481}, {"weight": 1, "sprite": 1479}]}, {"id": "corner", "bg": 1312, "fg": [1480, 1464, 1466, 1475]}, {"id": "t_connection", "bg": 1312, "fg": [1468, 1476, 1478, 1467]}, {"id": "edge", "bg": 1312, "fg": [1470, 1482]}, {"id": "end_piece", "bg": 1312, "fg": [1477, 1472, 1469, 1465]}, {"bg": 1312, "id": "unconnected", "fg": 1471}]}, {"id": ["t_water_dp_season_summer", "t_swater_dp_season_summer"], "multitile": true, "fg": 1471, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": [{"weight": 1, "sprite": 1473}, {"weight": 1, "sprite": 1474}, {"weight": 1, "sprite": 1481}]}, {"id": "corner", "bg": 1326, "fg": [1480, 1464, 1466, 1475]}, {"id": "t_connection", "bg": 1326, "fg": [1468, 1476, 1478, 1467]}, {"id": "edge", "bg": 1326, "fg": [1470, 1482]}, {"id": "end_piece", "bg": 1326, "fg": [1477, 1472, 1469, 1465]}, {"bg": 1326, "id": "unconnected", "fg": 1471}]}, {"id": ["t_water_dp_season_autumn", "t_swater_dp_season_autumn"], "multitile": true, "fg": 1471, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": [{"weight": 1, "sprite": 1473}, {"weight": 1, "sprite": 1474}, {"weight": 1, "sprite": 1481}]}, {"id": "corner", "bg": 1313, "fg": [1480, 1464, 1466, 1475]}, {"id": "t_connection", "bg": 1313, "fg": [1468, 1476, 1478, 1467]}, {"id": "edge", "bg": 1313, "fg": [1470, 1482]}, {"id": "end_piece", "bg": 1313, "fg": [1477, 1472, 1469, 1465]}, {"bg": 1313, "id": "unconnected", "fg": 1471}]}, {"id": ["t_water_dp_season_winter", "t_swater_dp_season_winter"], "multitile": true, "fg": 1471, "bg": 682, "additional_tiles": [{"id": "center", "bg": 682, "fg": [{"weight": 1, "sprite": 1473}, {"weight": 1, "sprite": 1474}, {"weight": 1, "sprite": 1481}]}, {"id": "corner", "bg": 682, "fg": [1480, 1464, 1466, 1475]}, {"id": "t_connection", "bg": 682, "fg": [1468, 1476, 1478, 1467]}, {"id": "edge", "bg": 682, "fg": [1470, 1482]}, {"id": "end_piece", "bg": 682, "fg": [1477, 1472, 1469, 1465]}, {"bg": 682, "id": "unconnected", "fg": 1471}]}, {"id": ["t_linoleum_gray", "t_linoluem_gray_no_roof"], "multitile": true, "fg": 1486, "additional_tiles": [{"id": "center", "fg": 1485}, {"id": "corner", "fg": [1494, 1487, 1493, 1489]}, {"id": "t_connection", "fg": [1490, 1484, 1483, 1496]}, {"id": "edge", "fg": [1488, 1495]}, {"id": "end_piece", "fg": [1492, 1497, 1498, 1491]}, {"id": "unconnected", "fg": 1486}]}, {"id": "t_grass", "multitile": true, "fg": 1504, "bg": 1312, "additional_tiles": [{"id": "center", "bg": 1312, "fg": [{"weight": 1, "sprite": 1505}, {"weight": 1, "sprite": 1511}, {"weight": 1, "sprite": 1508}, {"weight": 1, "sprite": 1499}]}, {"id": "corner", "bg": 1312, "fg": [1514, 1507, 1512, 1503]}, {"id": "t_connection", "bg": 1312, "fg": [1501, 1516, 1500, 1517]}, {"id": "edge", "bg": 1312, "fg": [1513, 1502]}, {"id": "end_piece", "bg": 1312, "fg": [1510, 1515, 1506, 1509]}, {"bg": 1312, "id": "unconnected", "fg": 1504}]}, {"id": "t_grass_season_summer", "multitile": true, "fg": 1555, "bg": 1326, "additional_tiles": [{"id": "center", "bg": 1326, "fg": [{"weight": 1, "sprite": 1547}, {"weight": 1, "sprite": 1546}, {"weight": 1, "sprite": 1552}, {"weight": 1, "sprite": 1548}]}, {"id": "corner", "bg": 1326, "fg": [1554, 1538, 1540, 1539]}, {"id": "t_connection", "bg": 1326, "fg": [1541, 1543, 1553, 1551]}, {"id": "edge", "bg": 1326, "fg": [1545, 1544]}, {"id": "end_piece", "bg": 1326, "fg": [1537, 1550, 1549, 1542]}, {"bg": 1326, "id": "unconnected", "fg": 1555}]}, {"id": "t_grass_season_autumn", "multitile": true, "fg": 1519, "bg": 1313, "additional_tiles": [{"id": "center", "bg": 1313, "fg": [{"weight": 1, "sprite": 1528}, {"weight": 1, "sprite": 1532}, {"weight": 1, "sprite": 1527}, {"weight": 1, "sprite": 1535}]}, {"id": "corner", "bg": 1313, "fg": [1534, 1518, 1536, 1530]}, {"id": "t_connection", "bg": 1313, "fg": [1531, 1521, 1529, 1526]}, {"id": "edge", "bg": 1313, "fg": [1523, 1522]}, {"id": "end_piece", "bg": 1313, "fg": [1525, 1524, 1520, 1533]}, {"bg": 1313, "id": "unconnected", "fg": 1519}]}, {"id": "t_grass_season_winter", "multitile": true, "fg": 675, "bg": 1321, "additional_tiles": [{"id": "center", "bg": 1321, "fg": [{"weight": 1, "sprite": 682}, {"weight": 1, "sprite": 674}, {"weight": 1, "sprite": 673}, {"weight": 1, "sprite": 671}]}, {"id": "corner", "bg": 1321, "fg": [678, 677, 684, 669]}, {"id": "t_connection", "bg": 1321, "fg": [668, 680, 681, 679]}, {"id": "edge", "bg": 1321, "fg": [683, 676]}, {"id": "end_piece", "bg": 1321, "fg": [667, 672, 670, 666]}, {"bg": 1321, "id": "unconnected", "fg": 675}]}, {"id": "t_stairs_down", "fg": 1556}, {"id": "t_wood_stairs_down", "fg": 1557}, {"id": "t_floor_wax", "multitile": true, "fg": 1567, "additional_tiles": [{"id": "center", "fg": 1570}, {"id": "corner", "fg": [1572, 1559, 1566, 1563]}, {"id": "t_connection", "fg": [1568, 1573, 1560, 1561]}, {"id": "edge", "fg": [1564, 1569]}, {"id": "end_piece", "fg": [1558, 1571, 1562, 1565]}, {"id": "unconnected", "fg": 1567}]}, {"id": "t_wall_r", "multitile": true, "fg": 1574, "additional_tiles": [{"id": "center", "fg": 1581}, {"id": "corner", "fg": [1583, 1582, 1587, 1588]}, {"id": "t_connection", "fg": [1577, 1579, 1580, 1584]}, {"id": "edge", "fg": [1589, 1586]}, {"id": "end_piece", "fg": [1578, 1585, 1576, 1575]}, {"id": "unconnected", "fg": 1574}]}, {"id": "t_concrete", "multitile": true, "fg": 1597, "additional_tiles": [{"id": "center", "fg": 1591}, {"id": "corner", "fg": [1602, 1599, 1590, 1600]}, {"id": "t_connection", "fg": [1598, 1592, 1604, 1594]}, {"id": "edge", "fg": [1596, 1601]}, {"id": "end_piece", "fg": [1595, 1593, 1605, 1603]}, {"id": "unconnected", "fg": 1597}]}, {"id": "t_concrete_season_winter", "fg": 682}, {"id": "t_wall_resin", "multitile": true, "fg": 1614, "additional_tiles": [{"id": "center", "fg": 1621}, {"id": "corner", "fg": [1609, 1620, 1611, 1617]}, {"id": "t_connection", "fg": [1606, 1612, 1608, 1610]}, {"id": "edge", "fg": [1623, 1622]}, {"id": "end_piece", "fg": [1619, 1613, 1615, 1616]}, {"id": "unconnected", "fg": 1614}]}, {"id": "t_resin_hole_c", "fg": 1618}, {"id": "t_resin_hole_o", "fg": 1607}, {"id": "t_ladder_down", "fg": 1624}, {"id": "tr_nailboard", "fg": 1625, "bg": 485}, {"id": "animation_hit", "fg": 1626}, {"id": ["overlay_effects_bleed"], "fg": 1632}, {"id": ["overlay_effects_deaf"], "fg": 1627}, {"id": ["overlay_effects_downed"], "fg": 1634}, {"id": ["overlay_effects_grabbed"], "fg": 1633}, {"id": ["overlay_effects_winded"], "fg": 1631}, {"id": ["overlay_effects_hot"], "fg": 1628}, {"id": ["overlay_effects_cold"], "fg": 1637}, {"id": ["overlay_male_crouch", "overlay_female_crouch"], "fg": 1630}, {"id": ["overlay_male_run", "overlay_female_run"], "fg": 1635}, {"id": ["overlay_hostile_sees_player"], "fg": 1636}, {"id": ["zombie_revival_indicator"], "fg": 1629}, {"id": "cursor", "fg": 1638}, {"id": "highlight", "fg": 1641}, {"id": "highlight_item", "fg": 1642}, {"id": "line_target", "fg": 1639}, {"id": "line_trail", "fg": 1640}, {"id": "animation_line", "fg": 1643}, {"id": "mon_pig", "fg": [{"weight": 8, "sprite": 1646}, {"weight": 3, "sprite": 1645}, {"weight": 1, "sprite": 1644}], "bg": 1670}, {"id": "mon_piglet", "fg": 1647, "bg": 1671}, {"id": "mon_deer_mouse", "fg": 1648, "bg": 1671}, {"id": "mon_locust_nymph", "fg": 1649, "bg": 1671}, {"id": "mon_skittering_plague", "fg": 1650, "bg": 1670}, {"id": "mon_black_rat", "fg": 1651, "bg": 1671}, {"id": "mon_zolf", "fg": 1652, "bg": 1670}, {"id": "mon_dog", "fg": 1653, "bg": 1670}, {"id": "mon_dog_skeleton", "fg": 1657, "bg": 1670}, {"id": "mon_zombie_dog", "fg": [{"weight": 1, "sprite": 1658}, {"weight": 1, "sprite": 1659}], "bg": 1670}, {"id": "mon_dog_beagle", "fg": 1656, "bg": 1671}, {"id": "mon_dog_gshepherd", "fg": 1655, "bg": 1670}, {"id": "mon_dog_boxer", "fg": 1654, "bg": 1670}, {"id": "mon_dog_dachshund", "fg": 1660, "bg": 1670}, {"id": "mon_blob", "fg": 1661, "bg": 1670}, {"id": "mon_squirrel_red", "fg": 1662, "bg": 1671}, {"id": "mon_plague_vector", "fg": 1663, "bg": 1670}, {"id": "mon_blob_small", "fg": [{"weight": 1, "sprite": 1664}, {"weight": 1, "sprite": 1665}], "bg": 1671}, {"id": "mon_dragonfly", "fg": 1666, "bg": 1671}, {"id": "mon_zombie_child", "fg": [{"weight": 1, "sprite": 1667}, {"weight": 1, "sprite": 1668}], "bg": 1671}, {"id": "mon_plague_nymph", "fg": 1669, "bg": 1671}, {"id": "mon_squirrel", "fg": 1672, "bg": 1671}, {"id": "mon_giant_cockroach", "fg": 1673, "bg": 1670}, {"id": "mon_zombie_pig", "fg": 1674, "bg": 1670}, {"id": "mon_rabbit", "fg": 1675, "bg": 1671}, {"id": "mon_zombeaver", "fg": 1676, "bg": 1671}, {"id": "mon_ant", "fg": 1677, "bg": 1670}, {"id": "mon_ant_acid", "fg": 1682, "bg": 1670}, {"id": "corpse_mon_ant", "fg": 1684}, {"id": "corpse_mon_ant_acid", "fg": 1679}, {"id": "mon_ant_larva", "fg": 1678, "bg": 1671}, {"id": "mon_ant_acid_larva", "fg": 1680, "bg": 1671}, {"id": "corpse_mon_ant_larva", "fg": 1681}, {"id": "corpse_mon_ant_acid_larva", "fg": 1683}, {"id": "mon_centipede_giant", "fg": 1685, "bg": 1670}, {"id": "mon_cat", "fg": [{"weight": 1, "sprite": 1686}, {"weight": 1, "sprite": 1687}], "bg": 1671}, {"id": "mon_beaver", "fg": 1688, "bg": 1671}, {"id": "mon_wolf", "fg": 1689, "bg": 1670}, {"id": "mon_otter", "fg": 1690, "bg": 1671}, {"id": "mon_giant_cockroach_nymph", "fg": 1691, "bg": 1671}, {"id": "mon_duck", "fg": 1692, "bg": 1671}, {"id": "mon_mosquito", "fg": 1693, "bg": 1671}, {"id": "mon_locust", "fg": 1694, "bg": 1670}, {"id": "mon_pregnant_giant_cockroach", "fg": 1695, "bg": 1670}, {"id": "mon_dermatik_larva", "fg": 1696, "bg": 1671}, {"id": "mon_bear_cub", "fg": 1697, "bg": 1671}, {"id": "mon_wasp_small", "fg": 1698, "bg": 1671}, {"id": "fd_fire", "fg": 1699}], "//": "range 1 to 1712"}, {"file": "tall.png", "tiles": [{"id": "f_scrap_antenna", "animated": true, "fg": [{"weight": 15, "sprite": 1718}, {"weight": 15, "sprite": 1719}, {"weight": 15, "sprite": 1714}, {"weight": 15, "sprite": 1713}, {"weight": 15, "sprite": 1716}, {"weight": 15, "sprite": 1715}], "rotates": false}, {"id": "f_bookcase", "fg": 1720}, {"id": "f_arcade_machine", "fg": 1721}, {"id": "f_floor_lamp", "fg": 1722}, {"id": "f_dryer", "fg": 1723}, {"id": "f_dresser", "fg": 1724}, {"id": "f_crate_c", "fg": 1726}, {"id": "f_crate_o", "fg": 1725}, {"id": "f_alien_tendril", "fg": 1729}, {"id": "f_alien_zapper", "fg": 1730}, {"id": ["f_alien_pod", "f_alien_pod_organ"], "fg": 1727}, {"id": "f_alien_pod_resin", "fg": 1728}, {"id": "f_glass_cabinet", "fg": 1731}, {"id": "f_machinery_old", "fg": 1736}, {"id": "f_machinery_electronic", "fg": 1733}, {"id": "f_machinery_heavy", "fg": 1732}, {"id": "f_machinery_light", "fg": [{"weight": 100, "sprite": 1734}, {"weight": 100, "sprite": 1735}]}, {"id": "f_shower", "fg": 1737}, {"id": "f_console", "multitile": true, "fg": 1767, "additional_tiles": [{"id": "center", "fg": 1747}, {"id": "corner", "fg": [1763, 1764, 1756, 1741]}, {"id": "t_connection", "fg": [1743, 1761, 1766, 1765]}, {"id": "edge", "fg": [1762, 1744]}, {"id": "end_piece", "fg": [1760, 1752, 1738, 1749]}, {"id": "unconnected", "fg": 1767}]}, {"id": "f_console_broken", "multitile": true, "fg": 1758, "additional_tiles": [{"id": "center", "fg": 1754}, {"id": "corner", "fg": [1748, 1759, 1745, 1757]}, {"id": "t_connection", "fg": [1755, 1753, 1768, 1769]}, {"id": "edge", "fg": [1750, 1742]}, {"id": "end_piece", "fg": [1739, 1751, 1746, 1740]}, {"id": "unconnected", "fg": 1758}]}, {"id": "f_standing_tank", "fg": 1770}, {"id": "f_bigmirror", "fg": 1771}, {"id": "f_glass_fridge", "fg": 1772}, {"id": "f_cattails_season_spring", "fg": 1776, "rotates": false}, {"id": "f_cattails_season_summer", "fg": 1774, "rotates": false}, {"id": "f_cattails_season_autumn", "fg": 1775, "rotates": false}, {"id": "f_cattails_season_winter", "fg": 1773, "rotates": false}, {"id": "f_workbench", "fg": 1777}, {"id": "f_dumpster", "multitile": true, "fg": 1780, "additional_tiles": [{"id": "edge", "fg": [1781, 1784]}, {"id": "end_piece", "fg": [1778, 1782, 1783, 1779]}, {"id": "unconnected", "fg": 1780}]}, {"id": "f_washer", "fg": 1785}, {"id": "f_fireplace", "fg": 1786}, {"id": "f_home_furnace", "fg": 1787}, {"id": "f_locker", "fg": 1788}, {"id": "f_statue", "fg": 1789}, {"id": "f_woodstove", "fg": 1790}, {"id": "f_brazier", "fg": 1791}, {"id": "f_birdbath", "fg": 1792}, {"id": "f_rack_coat", "fg": 1793}, {"id": "f_water_heater", "fg": 1794}, {"id": "f_oven", "fg": 1795}, {"id": "player_male", "fg": 1930}, {"id": "npc_male", "fg": 1930}, {"id": "npc_female", "fg": 1931}, {"id": "player_female", "fg": 1931}, {"id": "t_gutter_downspout", "fg": 1797}, {"id": "t_utility_light", "fg": 1798}, {"id": "t_little_column", "fg": 1799, "bg": 1805}, {"id": "t_machinery_heavy", "fg": 1800, "bg": 1805}, {"id": "t_atm", "fg": 1801, "bg": 1805}, {"id": "t_column", "fg": 1802, "bg": 1805}, {"id": "t_machinery_electronic", "fg": 1809, "bg": 1805}, {"id": "t_machinery_old", "fg": 1810, "bg": 1808}, {"id": "t_stairs_up", "fg": 1811}, {"id": "t_wood_stairs_up", "fg": 1812}, {"id": "t_ladder_up", "fg": 1813}, {"id": "overlay_female_mutation_SCALES", "fg": 1814}, {"id": "overlay_male_mutation_SCALES", "fg": 1815}, {"id": "overlay_female_mutation_TAIL_THICK", "fg": 1816}, {"id": "overlay_male_mutation_TAIL_THICK", "fg": 1817}, {"id": "overlay_female_mutation_TALONS", "fg": 1819}, {"id": "overlay_male_mutation_TALONS", "fg": 1818}, {"id": "overlay_female_mutation_BEAK_PECK", "fg": 1820}, {"id": "overlay_male_mutation_BEAK_PECK", "fg": 1821}, {"id": "overlay_female_mutation_BIRD_EYE", "fg": 1822}, {"id": "overlay_male_mutation_BIRD_EYE", "fg": 1823}, {"id": "overlay_female_mutation_LIZ_EYE", "fg": 1824}, {"id": "overlay_male_mutation_LIZ_EYE", "fg": 1825}, {"id": "overlay_female_mutation_MUZZLE_LONG", "fg": 1827}, {"id": "overlay_male_mutation_MUZZLE_LONG", "fg": 1826}, {"id": "overlay_female_mutation_BEAK_HUM", "fg": 1828}, {"id": "overlay_male_mutation_BEAK_HUM", "fg": 1829}, {"id": "overlay_female_mutation_PLANTSKIN", "fg": 1830}, {"id": "overlay_male_mutation_PLANTSKIN", "fg": 1831}, {"id": "overlay_female_mutation_FANGS", "fg": 1833}, {"id": "overlay_male_mutation_FANGS", "fg": 1832}, {"id": "overlay_female_mutation_CHITIN", "fg": 1834}, {"id": "overlay_male_mutation_CHITIN", "fg": 1835}, {"id": "overlay_female_mutation_ARACHNID_ARMS", "fg": 1836}, {"id": "overlay_male_mutation_ARACHNID_ARMS", "fg": 1837}, {"id": "overlay_female_mutation_FEATHERS", "fg": 1838}, {"id": "overlay_male_mutation_FEATHERS", "fg": 1839}, {"id": "overlay_female_mutation_VINES1", "fg": 1840}, {"id": "overlay_male_mutation_VINES1", "fg": 1841}, {"id": "overlay_female_mutation_WINGS_BIRD", "fg": 1843}, {"id": "overlay_male_mutation_WINGS_BIRD", "fg": 1842}, {"id": "overlay_female_mutation_BEAK", "fg": 1845}, {"id": "overlay_male_mutation_BEAK", "fg": 1844}, {"id": "overlay_female_mutation_CHITIN2", "fg": 1846}, {"id": "overlay_male_mutation_CHITIN2", "fg": 1847}, {"id": "overlay_female_mutation_LEAVES", "fg": 1848}, {"id": "overlay_male_mutation_LEAVES", "fg": 1849}, {"id": "overlay_male_mutation_hair_brown_medium", "fg": 1850}, {"id": "overlay_female_mutation_hair_brown_medium", "fg": 1851}, {"id": "overlay_male_mutation_hair_brown_fro", "fg": 1852}, {"id": "overlay_female_mutation_hair_brown_fro", "fg": 1853}, {"id": "overlay_male_mutation_hair_red_mohawk", "fg": 1854}, {"id": "overlay_female_mutation_hair_red_mohawk", "fg": 1855}, {"id": "overlay_male_mutation_hair_brown_mohawk", "fg": 1857}, {"id": "overlay_female_mutation_hair_brown_mohawk", "fg": 1856}, {"id": "overlay_male_mutation_hair_brown_crewcut", "fg": 1859}, {"id": "overlay_female_mutation_hair_brown_crewcut", "fg": 1858}, {"id": "overlay_male_mutation_hair_black_crewcut", "fg": 1861}, {"id": "overlay_female_mutation_hair_black_crewcut", "fg": 1860}, {"id": "overlay_male_mutation_hair_gray_medium", "fg": 1863}, {"id": "overlay_female_mutation_hair_gray_medium", "fg": 1862}, {"id": "overlay_male_mutation_hair_white_crewcut", "fg": 1864}, {"id": "overlay_female_mutation_hair_white_crewcut", "fg": 1865}, {"id": "overlay_male_mutation_hair_red_medium", "fg": 1867}, {"id": "overlay_female_mutation_hair_red_medium", "fg": 1866}, {"id": "overlay_male_mutation_hair_blond_short", "fg": 1869}, {"id": "overlay_female_mutation_hair_blond_short", "fg": 1868}, {"id": "overlay_male_mutation_hair_white_mohawk", "fg": 1871}, {"id": "overlay_female_mutation_hair_white_mohawk", "fg": 1870}, {"id": "overlay_male_mutation_hair_red_crewcut", "fg": 1873}, {"id": "overlay_female_mutation_hair_red_crewcut", "fg": 1872}, {"id": "overlay_male_mutation_hair_red_fro", "fg": 1875}, {"id": "overlay_female_mutation_hair_red_fro", "fg": 1874}, {"id": "overlay_male_mutation_hair_white_medium", "fg": 1876}, {"id": "overlay_female_mutation_hair_white_medium", "fg": 1877}, {"id": "overlay_male_mutation_hair_black_medium", "fg": 1878}, {"id": "overlay_female_mutation_hair_black_medium", "fg": 1879}, {"id": "overlay_male_mutation_hair_blond_medium", "fg": 1881}, {"id": "overlay_female_mutation_hair_blond_medium", "fg": 1880}, {"id": "overlay_male_mutation_hair_black_fro", "fg": 1883}, {"id": "overlay_female_mutation_hair_black_fro", "fg": 1882}, {"id": "overlay_male_mutation_hair_black_mohawk", "fg": 1884}, {"id": "overlay_female_mutation_hair_black_mohawk", "fg": 1885}, {"id": "overlay_male_mutation_hair_gray_mohawk", "fg": 1886}, {"id": "overlay_female_mutation_hair_gray_mohawk", "fg": 1887}, {"id": "overlay_male_mutation_hair_brown_long", "fg": 1889}, {"id": "overlay_female_mutation_hair_brown_long", "fg": 1888}, {"id": "overlay_male_mutation_hair_gray_short", "fg": 1891}, {"id": "overlay_female_mutation_hair_gray_short", "fg": 1890}, {"id": "overlay_male_mutation_hair_white_short", "fg": 1892}, {"id": "overlay_female_mutation_hair_white_short", "fg": 1893}, {"id": "overlay_male_mutation_hair_white_long", "fg": 1894}, {"id": "overlay_female_mutation_hair_white_long", "fg": 1895}, {"id": "overlay_male_mutation_hair_gray_long", "fg": 1897}, {"id": "overlay_female_mutation_hair_gray_long", "fg": 1896}, {"id": "overlay_male_mutation_hair_brown_short", "fg": 1898}, {"id": "overlay_female_mutation_hair_brown_short", "fg": 1899}, {"id": "overlay_male_mutation_hair_gray_crewcut", "fg": 1901}, {"id": "overlay_female_mutation_hair_gray_crewcut", "fg": 1900}, {"id": "overlay_male_mutation_hair_blond_crewcut", "fg": 1903}, {"id": "overlay_female_mutation_hair_blond_crewcut", "fg": 1902}, {"id": "overlay_male_mutation_hair_black_short", "fg": 1904}, {"id": "overlay_female_mutation_hair_black_short", "fg": 1905}, {"id": "overlay_male_mutation_hair_blond_mohawk", "fg": 1907}, {"id": "overlay_female_mutation_hair_blond_mohawk", "fg": 1906}, {"id": "overlay_male_mutation_hair_black_long", "fg": 1909}, {"id": "overlay_female_mutation_hair_black_long", "fg": 1908}, {"id": "overlay_male_mutation_hair_blond_fro", "fg": 1910}, {"id": "overlay_female_mutation_hair_blond_fro", "fg": 1911}, {"id": "overlay_male_mutation_hair_blond_long", "fg": 1913}, {"id": "overlay_female_mutation_hair_blond_long", "fg": 1912}, {"id": "overlay_male_mutation_hair_gray_fro", "fg": 1915}, {"id": "overlay_female_mutation_hair_gray_fro", "fg": 1914}, {"id": "overlay_male_mutation_hair_red_short", "fg": 1917}, {"id": "overlay_female_mutation_hair_red_short", "fg": 1916}, {"id": "overlay_male_mutation_hair_red_long", "fg": 1919}, {"id": "overlay_female_mutation_hair_red_long", "fg": 1918}, {"id": "overlay_male_mutation_hair_white_fro", "fg": 1920}, {"id": "overlay_female_mutation_hair_white_fro", "fg": 1921}, {"id": "overlay_female_mutation_SKIN_LIGHT", "fg": 1923, "bg": 1796}, {"id": "overlay_male_mutation_SKIN_LIGHT", "fg": 1922, "bg": 1796}, {"id": "overlay_female_mutation_SKIN_DARK", "fg": 1925, "bg": 1796}, {"id": "overlay_male_mutation_SKIN_DARK", "fg": 1924, "bg": 1796}, {"id": "overlay_female_mutation_SKIN_TAN", "fg": 1927, "bg": 1796}, {"id": "overlay_male_mutation_SKIN_TAN", "fg": 1926, "bg": 1796}, {"id": "overlay_male_mutation_SKIN_PINK", "fg": 1929, "bg": 1796}, {"id": "overlay_female_mutation_SKIN_PINK", "fg": 1928, "bg": 1796}, {"id": "overlay_male_mutation_SKIN_MEDIUM", "fg": 1930, "bg": 1796}, {"id": "overlay_female_mutation_SKIN_MEDIUM", "fg": 1931, "bg": 1796}, {"id": "overlay_wielded_bag_canvas", "fg": 1932}, {"id": "overlay_female_wielded_wood_panel", "fg": 1934}, {"id": "overlay_male_wielded_wood_panel", "fg": 1933}, {"id": "overlay_wielded_jar_glass", "fg": 1935}, {"id": "overlay_female_wielded_rifle_flintlock", "fg": 1937}, {"id": "overlay_male_wielded_rifle_flintlock", "fg": 1936}, {"id": "overlay_female_wielded_bat_metal", "fg": 1939}, {"id": "overlay_male_wielded_bat_metal", "fg": 1938}, {"id": "overlay_male_wielded_pointy_stick", "fg": 1940}, {"id": "overlay_female_wielded_pointy_stick", "fg": 1945}, {"id": "overlay_male_wielded_spear_wood", "fg": 1955}, {"id": "overlay_female_wielded_spear_wood", "fg": 1954}, {"id": "overlay_male_wielded_spear_spike", "fg": 1949}, {"id": "overlay_female_wielded_spear_spike", "fg": 1956}, {"id": "overlay_male_wielded_spear_knife", "fg": 1952}, {"id": "overlay_female_wielded_spear_knife", "fg": 1953}, {"id": "overlay_male_wielded_spear_knife_superior", "fg": 1942}, {"id": "overlay_female_wielded_spear_knife_superior", "fg": 1957}, {"id": "overlay_male_wielded_spear_rebar", "fg": 1947}, {"id": "overlay_female_wielded_spear_rebar", "fg": 1951}, {"id": "overlay_male_wielded_spear_pipe", "fg": 1948}, {"id": "overlay_female_wielded_spear_pipe", "fg": 1943}, {"id": "overlay_male_wielded_spear_steel", "fg": 1944}, {"id": "overlay_female_wielded_spear_steel", "fg": 1941}, {"id": "overlay_male_wielded_spear_copper", "fg": 1946}, {"id": "overlay_female_wielded_spear_copper", "fg": 1950}, {"id": "overlay_wielded_flashlight", "fg": 1959}, {"id": "overlay_wielded_heavy_flashlight", "fg": 1958}, {"id": "overlay_wielded_jug_plastic", "fg": 1960}, {"id": "overlay_female_wielded_pot", "fg": 1962}, {"id": "overlay_male_wielded_pot", "fg": 1961}, {"id": "overlay_wielded_fire_ax", "fg": 1963}, {"id": "overlay_wielded_ax", "fg": 1964}, {"id": "overlay_wielded_hatchet", "fg": 1965}, {"id": "overlay_wielded_bottle_glass", "fg": 1966}, {"id": "overlay_female_wielded_rag", "fg": 1967}, {"id": "overlay_male_wielded_rag", "fg": 1968}, {"id": "overlay_female_wielded_corpse_generic_human", "fg": 1969}, {"id": "overlay_male_wielded_corpse_generic_human", "fg": 1970}, {"id": "overlay_male_wielded_chainsaw_off", "fg": 1971}, {"id": "overlay_female_wielded_chainsaw_off", "fg": 1972}, {"id": "overlay_female_wielded_teapot", "fg": 1974}, {"id": "overlay_male_wielded_teapot", "fg": 1973}, {"id": "overlay_male_wielded_1st_aid", "fg": 1975}, {"id": "overlay_female_wielded_1st_aid", "fg": 1976}, {"id": "overlay_female_wielded_nailbat", "fg": 1977}, {"id": "overlay_male_wielded_nailbat", "fg": 1978}, {"id": "overlay_male_wielded_primitive_hammer", "fg": 1979}, {"id": "overlay_female_wielded_primitive_hammer", "fg": 1980}, {"id": "overlay_wielded_steel_lump", "fg": 1981}, {"id": "overlay_wielded_antibiotics", "fg": 1982}, {"id": "overlay_wielded_weak_antibiotic", "fg": 1994}, {"id": "overlay_wielded_strong_antibiotic", "fg": 1989}, {"id": "overlay_wielded_calcium_tablet", "fg": 1984}, {"id": "overlay_wielded_vitamins", "fg": 1992}, {"id": "overlay_wielded_gummy_vitamins", "fg": 1983}, {"id": "overlay_wielded_antifungal", "fg": 1990}, {"id": "overlay_wielded_antiparasitic", "fg": 1987}, {"id": "overlay_wielded_iodine", "fg": 1993}, {"id": "overlay_wielded_prussian_blue", "fg": 1991}, {"id": "overlay_wielded_tramadol", "fg": 1986}, {"id": "overlay_wielded_codeine", "fg": 1985}, {"id": "overlay_wielded_oxycodone", "fg": 1988}, {"id": "overlay_wielded_rebar", "fg": 1995}, {"id": "overlay_wielded_steel_glass_shard", "fg": 1996}, {"id": "overlay_male_wielded_pot_copper", "fg": 1998}, {"id": "overlay_female_wielded_pot_copper", "fg": 1997}, {"id": "overlay_female_wielded_nailboard", "fg": 1999}, {"id": "overlay_male_wielded_nailboard", "fg": 2000}, {"id": "overlay_wielded_scissors", "fg": 2001}, {"id": "overlay_female_wielded_ak74", "fg": 2003}, {"id": "overlay_male_wielded_ak74", "fg": 2002}, {"id": "overlay_wielded_coffeemaker", "fg": 2004}, {"id": "overlay_male_wielded_thermos", "fg": 2006}, {"id": "overlay_female_wielded_thermos", "fg": 2005}, {"id": "overlay_female_wielded_stick", "fg": 2007}, {"id": "overlay_male_wielded_stick", "fg": 2008}, {"id": "overlay_wielded_steel_chunk", "fg": 2009}, {"id": "overlay_wielded_pipe", "fg": 2010}, {"id": "overlay_wielded_bottle_plastic", "fg": 2011}, {"id": "overlay_wielded_broom", "fg": 2012}, {"id": "overlay_wielded_sw_619", "fg": 2013}, {"id": "overlay_wielded_rolling_pin", "fg": 2014}, {"id": "overlay_wielded_makeshift_crowbar", "fg": 2015}, {"id": "overlay_female_wielded_bat", "fg": 2017}, {"id": "overlay_male_wielded_bat", "fg": 2016}, {"id": "overlay_male_wielded_wood_sheet", "fg": 2018}, {"id": "overlay_female_wielded_wood_sheet", "fg": 2019}, {"id": "overlay_wielded_jar_3l_glass_sealed", "fg": 2020}, {"id": "overlay_wielded_box_large", "fg": 2021}, {"id": "overlay_wielded_crowbar", "fg": 2025}, {"id": "overlay_male_wielded_screwdriver", "fg": 2026}, {"id": "overlay_female_wielded_screwdriver", "fg": 2022}, {"id": "overlay_wielded_shovel", "fg": 2027}, {"id": "overlay_wielded_wrench", "fg": 2023}, {"id": "overlay_wielded_hammer", "fg": 2024}, {"id": "overlay_wielded_arming_sword", "fg": 2028}, {"id": "overlay_wielded_brick", "fg": 2029}, {"id": "overlay_male_wielded_2x4", "fg": 2030}, {"id": "overlay_female_wielded_2x4", "fg": 2031}, {"id": "overlay_wielded_katana", "fg": 2032}, {"id": "overlay_wielded_bottle_plastic_small", "fg": 2033}, {"id": "overlay_wielded_sharp_rock", "fg": 2034}, {"id": ["overlay_wielded_glock_17", "overlay_wielded_glock_19", "overlay_wielded_glock_18c", "overlay_wielded_glock_22", "overlay_wielded_glock_31"], "fg": 2035}, {"id": "overlay_wielded_box_small", "fg": 2036}, {"id": "overlay_male_wielded_pillow", "fg": 2038}, {"id": "overlay_female_wielded_pillow", "fg": 2039}, {"id": "overlay_male_wielded_down_pillow", "fg": 2040}, {"id": "overlay_female_wielded_down_pillow", "fg": 2037}, {"id": "overlay_wielded_mop", "fg": 2041}, {"id": ["overlay_wielded_corpse_mon_ant", "overlay_wielded_corpse_mon_ant_soldier", "overlay_wielded_corpse_mon_ant_queen"], "fg": 2043}, {"id": ["overlay_wielded_corpse_mon_ant_acid", "overlay_wielded_corpse_mon_ant_acid_soldier", "overlay_wielded_corpse_mon_ant_acid_queen"], "fg": 2045}, {"id": ["overlay_male_wielded_corpse_mon_zombie", "overlay_male_wielded_corpse_mon_zombie_grappler", "overlay_male_wielded_corpse_mon_zombie_biter", "overlay_male_wielded_corpse_mon_zombie_tough", "overlay_male_wielded_corpse_mon_zombie_hunter", "overlay_male_wielded_corpse_mon_zombie_brute", "overlay_male_wielded_corpse_mon_zombie_predator", "overlay_male_wielded_corpse_mon_zombie_necro", "overlay_male_wielded_corpse_mon_zombie_thorny", "overlay_male_wielded_corpse_mon_zombie_smoker", "overlay_male_wielded_corpse_mon_zombie_shady", "overlay_male_wielded_corpse_mon_zombie_master", "overlay_male_wielded_corpse_mon_zombie_acidic", "overlay_male_wielded_corpse_mon_zombie_fat", "overlay_male_wielded_corpse_mon_zombie_corrosive", "overlay_male_wielded_corpse_mon_zombie_screecher", "overlay_male_wielded_corpse_mon_zombie_scientist", "overlay_male_wielded_corpse_mon_zombie_runner", "overlay_male_wielded_corpse_mon_zombie_spitter", "overlay_male_wielded_corpse_mon_zombie_labsecurity", "overlay_male_wielded_corpse_mon_zombie_child", "overlay_male_wielded_corpse_mon_zombie_hulk", "overlay_male_wielded_corpse_mon_zombie_brute_grappler", "overlay_male_wielded_corpse_mon_zombie_brute_ninja", "overlay_male_wielded_corpse_mon_zombie_kevlar_2", "overlay_male_wielded_corpse_mon_zombie_kevlar_1", "overlay_male_wielded_corpse_mon_zombie_hazmat", "overlay_male_wielded_corpse_mon_zombie_electric", "overlay_male_wielded_corpse_mon_zombie_technician", "overlay_male_wielded_corpse_mon_zombie_fungus", "overlay_male_wielded_corpse_mon_zombie_cop", "overlay_male_wielded_corpse_mon_zombie_child_fungus", "overlay_male_wielded_corpse_mon_zombie_swimmer", "overlay_male_wielded_corpse_mon_zombie_mancroc", "overlay_male_wielded_corpse_mon_zombie_soldier", "overlay_male_wielded_corpse_mon_zombie_skull", "overlay_male_wielded_corpse_mon_zombie_brainless", "overlay_male_wielded_corpse_mon_zombie_survivor", "overlay_male_wielded_corpse_mon_zombie_brute_shocker", "overlay_male_wielded_corpse_mon_zombie_soldier_acid_1", "overlay_male_wielded_corpse_mon_zombie_soldier_blackops_2", "overlay_male_wielded_corpse_mon_zombie_soldier_blackops_1", "overlay_male_wielded_corpse_mon_zombie_soldier_acid_2", "overlay_male_wielded_corpse_mon_zombie_shriekling", "overlay_male_wielded_corpse_mon_zombie_ears", "overlay_male_wielded_corpse_mon_zombie_nullfield", "overlay_male_wielded_corpse_mon_zombie_waif", "overlay_male_wielded_corpse_mon_zombie_sproglodyte", "overlay_male_wielded_corpse_mon_zombie_creepy", "overlay_male_wielded_corpse_mon_zombie_anklebiter", "overlay_male_wielded_corpse_mon_zombie_bio_op", "overlay_male_wielded_corpse_mon_zombie_armored", "overlay_male_wielded_corpse_mon_zombie_prisoner", "overlay_male_wielded_corpse_mon_zombie_military_pilot"], "fg": 2042}, {"id": ["overlay_female_wielded_corpse_mon_zombie", "overlay_female_wielded_corpse_mon_zombie_grappler", "overlay_female_wielded_corpse_mon_zombie_biter", "overlay_female_wielded_corpse_mon_zombie_tough", "overlay_female_wielded_corpse_mon_zombie_hunter", "overlay_female_wielded_corpse_mon_zombie_brute", "overlay_female_wielded_corpse_mon_zombie_predator", "overlay_female_wielded_corpse_mon_zombie_necro", "overlay_female_wielded_corpse_mon_zombie_thorny", "overlay_female_wielded_corpse_mon_zombie_smoker", "overlay_female_wielded_corpse_mon_zombie_shady", "overlay_female_wielded_corpse_mon_zombie_master", "overlay_female_wielded_corpse_mon_zombie_acidic", "overlay_female_wielded_corpse_mon_zombie_fat", "overlay_female_wielded_corpse_mon_zombie_corrosive", "overlay_female_wielded_corpse_mon_zombie_screecher", "overlay_female_wielded_corpse_mon_zombie_scientist", "overlay_female_wielded_corpse_mon_zombie_runner", "overlay_female_wielded_corpse_mon_zombie_spitter", "overlay_female_wielded_corpse_mon_zombie_labsecurity", "overlay_female_wielded_corpse_mon_zombie_child", "overlay_female_wielded_corpse_mon_zombie_hulk", "overlay_female_wielded_corpse_mon_zombie_brute_grappler", "overlay_female_wielded_corpse_mon_zombie_brute_ninja", "overlay_female_wielded_corpse_mon_zombie_kevlar_2", "overlay_female_wielded_corpse_mon_zombie_kevlar_1", "overlay_female_wielded_corpse_mon_zombie_hazmat", "overlay_female_wielded_corpse_mon_zombie_electric", "overlay_female_wielded_corpse_mon_zombie_technician", "overlay_female_wielded_corpse_mon_zombie_fungus", "overlay_female_wielded_corpse_mon_zombie_cop", "overlay_female_wielded_corpse_mon_zombie_child_fungus", "overlay_female_wielded_corpse_mon_zombie_swimmer", "overlay_female_wielded_corpse_mon_zombie_mancroc", "overlay_female_wielded_corpse_mon_zombie_soldier", "overlay_female_wielded_corpse_mon_zombie_skull", "overlay_female_wielded_corpse_mon_zombie_brainless", "overlay_female_wielded_corpse_mon_zombie_survivor", "overlay_female_wielded_corpse_mon_zombie_brute_shocker", "overlay_female_wielded_corpse_mon_zombie_soldier_acid_1", "overlay_female_wielded_corpse_mon_zombie_soldier_blackops_2", "overlay_female_wielded_corpse_mon_zombie_soldier_blackops_1", "overlay_female_wielded_corpse_mon_zombie_soldier_acid_2", "overlay_female_wielded_corpse_mon_zombie_shriekling", "overlay_female_wielded_corpse_mon_zombie_ears", "overlay_female_wielded_corpse_mon_zombie_nullfield", "overlay_female_wielded_corpse_mon_zombie_waif", "overlay_female_wielded_corpse_mon_zombie_sproglodyte", "overlay_female_wielded_corpse_mon_zombie_creepy", "overlay_female_wielded_corpse_mon_zombie_anklebiter", "overlay_female_wielded_corpse_mon_zombie_bio_op", "overlay_female_wielded_corpse_mon_zombie_armored", "overlay_female_wielded_corpse_mon_zombie_prisoner", "overlay_female_wielded_corpse_mon_zombie_military_pilot"], "fg": 2044}, {"id": "overlay_wielded_box_medium", "fg": 2046}, {"id": "overlay_wielded_rock", "fg": 2047}, {"id": "overlay_female_wielded_stick_long", "fg": 2048}, {"id": "overlay_male_wielded_stick_long", "fg": 2049}, {"id": "overlay_wielded_log", "fg": 2050}, {"id": "overlay_female_wielded_television", "fg": 2052}, {"id": "overlay_male_wielded_television", "fg": 2051}, {"id": "overlay_wielded_jar_glass_sealed", "fg": 2053}, {"id": "overlay_wielded_jar_3l_glass", "fg": 2054}, {"id": "overlay_female_wielded_bwirebat", "fg": 2055}, {"id": "overlay_male_wielded_bwirebat", "fg": 2056}, {"id": "overlay_wielded_bag_plastic", "fg": 2057}, {"id": "overlay_female_wielded_splinter", "fg": 2059}, {"id": "overlay_male_wielded_splinter", "fg": 2058}, {"id": "overlay_wielded_ar15", "fg": 2060}, {"id": "overlay_female_worn_pants_army", "fg": 2062}, {"id": "overlay_male_worn_pants_army", "fg": 2061}, {"id": "overlay_female_worn_hat_noise_cancelling", "fg": 2064}, {"id": "overlay_male_worn_hat_noise_cancelling", "fg": 2063}, {"id": "overlay_female_worn_striped_pants", "fg": 2065}, {"id": "overlay_male_worn_striped_pants", "fg": 2066}, {"id": "overlay_female_worn_motorbike_pants", "fg": 2068}, {"id": "overlay_male_worn_motorbike_pants", "fg": 2067}, {"id": "overlay_female_worn_beekeeping_hood", "fg": 2069}, {"id": "overlay_male_worn_beekeeping_hood", "fg": 2070}, {"id": "overlay_male_worn_ski_jacket", "fg": 2072}, {"id": "overlay_female_worn_ski_jacket", "fg": 2071}, {"id": "overlay_female_worn_boots_bunker", "fg": 2073}, {"id": "overlay_male_worn_boots_bunker", "fg": 2074}, {"id": "overlay_male_worn_leg_warmers", "fg": 2076}, {"id": "overlay_female_worn_leg_warmers", "fg": 2075}, {"id": "overlay_worn_dress_shoes", "fg": 2077}, {"id": "overlay_male_worn_glasses_bifocal", "fg": 2079}, {"id": "overlay_female_worn_glasses_bifocal", "fg": 2078}, {"id": "overlay_female_worn_glasses_safety", "fg": 2081}, {"id": "overlay_male_worn_glasses_safety", "fg": 2080}, {"id": "overlay_female_worn_ragpouch", "fg": 2082}, {"id": "overlay_male_worn_ragpouch", "fg": 2083}, {"id": "overlay_female_worn_welding_mask_crude_raised", "fg": 2084}, {"id": "overlay_male_worn_welding_mask_crude_raised", "fg": 2085}, {"id": "overlay_male_worn_gloves_leather", "fg": 2087}, {"id": "overlay_female_worn_gloves_leather", "fg": 2086}, {"id": "overlay_female_worn_helmet_army", "fg": 2088}, {"id": "overlay_male_worn_helmet_army", "fg": 2089}, {"id": "overlay_female_worn_pants_faux_fur", "fg": 2090}, {"id": "overlay_male_worn_pants_faux_fur", "fg": 2091}, {"id": "overlay_male_worn_long_glove_white", "fg": 2093}, {"id": "overlay_female_worn_long_glove_white", "fg": 2092}, {"id": "overlay_female_worn_jacket_army", "fg": 2094}, {"id": "overlay_male_worn_jacket_army", "fg": 2095}, {"id": "overlay_female_worn_pants_cargo", "fg": 2096}, {"id": "overlay_male_worn_pants_cargo", "fg": 2097}, {"id": "overlay_female_worn_gloves_work", "fg": 2098}, {"id": "overlay_male_worn_gloves_work", "fg": 2099}, {"id": "overlay_female_worn_geta", "fg": 2100}, {"id": "overlay_male_worn_geta", "fg": 2101}, {"id": "overlay_male_worn_hat_fur", "fg": 2102}, {"id": "overlay_female_worn_hat_fur", "fg": 2103}, {"id": "overlay_female_worn_gloves_wool", "fg": 2105}, {"id": "overlay_male_worn_gloves_wool", "fg": 2104}, {"id": "overlay_male_worn_arm_warmers", "fg": 2106}, {"id": "overlay_female_worn_arm_warmers", "fg": 2107}, {"id": "overlay_female_worn_beret", "fg": 2109}, {"id": "overlay_male_worn_beret", "fg": 2108}, {"id": "overlay_female_worn_boxer_briefs", "fg": 2110}, {"id": "overlay_male_worn_boxer_briefs", "fg": 2111}, {"id": "overlay_male_worn_touring_suit", "fg": 2113}, {"id": "overlay_female_worn_touring_suit", "fg": 2112}, {"id": "overlay_female_worn_pants_checkered", "fg": 2115}, {"id": "overlay_male_worn_pants_checkered", "fg": 2114}, {"id": "overlay_male_worn_turban", "fg": 2116}, {"id": "overlay_female_worn_turban", "fg": 2117}, {"id": "overlay_female_worn_pants_ski", "fg": 2119}, {"id": "overlay_male_worn_pants_ski", "fg": 2118}, {"id": "overlay_female_worn_glasses_bal", "fg": 2120}, {"id": "overlay_male_worn_glasses_bal", "fg": 2121}, {"id": "overlay_male_worn_boots", "fg": 2122}, {"id": "overlay_female_worn_boots", "fg": 2123}, {"id": "overlay_female_worn_corset", "fg": 2125}, {"id": "overlay_male_worn_corset", "fg": 2124}, {"id": "overlay_female_worn_welding_mask", "fg": 2126}, {"id": "overlay_male_worn_welding_mask", "fg": 2127}, {"id": "overlay_female_worn_jacket_flannel", "fg": 2128}, {"id": "overlay_male_worn_jacket_flannel", "fg": 2129}, {"id": "overlay_male_worn_shorts", "fg": 2131}, {"id": "overlay_female_worn_shorts", "fg": 2130}, {"id": "overlay_female_worn_dinosuit", "fg": 2133}, {"id": "overlay_male_worn_dinosuit", "fg": 2132}, {"id": "overlay_male_worn_undershirt", "fg": 2134}, {"id": "overlay_female_worn_boots_combat", "fg": 2135}, {"id": "overlay_male_worn_boots_combat", "fg": 2136}, {"id": "overlay_female_worn_stockings", "fg": 2137}, {"id": "overlay_male_worn_stockings", "fg": 2138}, {"id": "overlay_male_worn_skirt_leather", "fg": 2140}, {"id": "overlay_female_worn_skirt_leather", "fg": 2139}, {"id": "overlay_female_worn_boots_rubber", "fg": 2142}, {"id": "overlay_male_worn_boots_rubber", "fg": 2141}, {"id": "overlay_female_worn_dress_shirt", "fg": 2143}, {"id": "overlay_male_worn_dress_shirt", "fg": 2144}, {"id": "overlay_female_worn_gloves_golf", "fg": 2146}, {"id": "overlay_male_worn_gloves_golf", "fg": 2145}, {"id": "overlay_female_worn_army_top", "fg": 2147}, {"id": "overlay_male_worn_army_top", "fg": 2148}, {"id": "overlay_female_worn_boxer_shorts", "fg": 2150}, {"id": "overlay_male_worn_boxer_shorts", "fg": 2149}, {"id": "overlay_female_worn_helmet_kabuto", "fg": 2151}, {"id": "overlay_male_worn_helmet_kabuto", "fg": 2152}, {"id": "overlay_male_worn_shoes_bowling", "fg": 2153}, {"id": "overlay_female_worn_shoes_bowling", "fg": 2154}, {"id": "overlay_female_worn_gloves_medical", "fg": 2155}, {"id": "overlay_male_worn_gloves_medical", "fg": 2156}, {"id": "overlay_worn_jacket_jean", "fg": 2157}, {"id": "overlay_female_worn_boots_fur", "fg": 2158}, {"id": "overlay_male_worn_boots_fur", "fg": 2159}, {"id": "overlay_male_worn_blanket", "fg": 2162}, {"id": "overlay_female_worn_blanket", "fg": 2161}, {"id": "overlay_male_worn_down_blanket", "fg": 2160}, {"id": "overlay_female_worn_down_blanket", "fg": 2163}, {"id": "overlay_male_worn_cargo_pants", "fg": 2164}, {"id": "overlay_female_worn_panties", "fg": 2165}, {"id": "overlay_male_worn_panties", "fg": 2166}, {"id": "overlay_female_worn_hat_hard", "fg": 2167}, {"id": "overlay_male_worn_hat_hard", "fg": 2168}, {"id": "overlay_male_worn_glasses_eye", "fg": 2170}, {"id": "overlay_female_worn_glasses_eye", "fg": 2169}, {"id": "overlay_female_worn_helmet_chitin", "fg": 2172}, {"id": "overlay_male_worn_helmet_chitin", "fg": 2171}, {"id": "overlay_female_worn_boy_shorts", "fg": 2173}, {"id": "overlay_male_worn_boy_shorts", "fg": 2174}, {"id": "overlay_male_worn_sweatshirt", "fg": 2175}, {"id": "overlay_female_worn_sweatshirt", "fg": 2176}, {"id": "overlay_male_worn_rucksack", "fg": 2178}, {"id": "overlay_female_worn_rucksack", "fg": 2177}, {"id": "overlay_female_worn_sunglasses", "fg": 2180}, {"id": "overlay_male_worn_sunglasses", "fg": 2179}, {"id": "overlay_female_worn_mask_dust", "fg": 2181}, {"id": "overlay_male_worn_mask_dust", "fg": 2182}, {"id": "overlay_male_worn_helmet_motor", "fg": 2184}, {"id": "overlay_female_worn_helmet_motor", "fg": 2183}, {"id": "overlay_female_worn_sweater", "fg": 2185}, {"id": "overlay_male_worn_sweater", "fg": 2186}, {"id": "overlay_female_worn_jacket_light", "fg": 2187}, {"id": "overlay_male_worn_jacket_light", "fg": 2188}, {"id": "overlay_male_worn_skirt", "fg": 2190}, {"id": "overlay_female_worn_skirt", "fg": 2189}, {"id": "overlay_female_worn_striped_shirt", "fg": 2192}, {"id": "overlay_male_worn_striped_shirt", "fg": 2191}, {"id": "overlay_female_worn_hat_ball", "fg": 2194}, {"id": "overlay_male_worn_hat_ball", "fg": 2193}, {"id": "overlay_male_worn_bra", "fg": 2196}, {"id": "overlay_female_worn_bra", "fg": 2195}, {"id": "overlay_male_worn_glove_jackson", "fg": 2198}, {"id": "overlay_female_worn_glove_jackson", "fg": 2197}, {"id": "overlay_male_worn_boots_western", "fg": 2199}, {"id": "overlay_female_worn_boots_western", "fg": 2200}, {"id": "overlay_female_worn_hazmat_suit", "fg": 2201}, {"id": "overlay_male_worn_hazmat_suit", "fg": 2202}, {"id": "overlay_female_worn_scarf", "fg": 2204}, {"id": "overlay_male_worn_scarf", "fg": 2203}, {"id": "overlay_male_worn_kevlar", "fg": 2206}, {"id": "overlay_female_worn_kevlar", "fg": 2205}, {"id": "overlay_female_worn_backpack_leather", "fg": 2207}, {"id": "overlay_male_worn_backpack_leather", "fg": 2208}, {"id": "overlay_female_worn_armor_samurai", "fg": 2210}, {"id": "overlay_male_worn_armor_samurai", "fg": 2209}, {"id": "overlay_female_worn_jumpsuit", "fg": 2212}, {"id": "overlay_male_worn_jumpsuit", "fg": 2211}, {"id": "overlay_female_worn_jeans", "fg": 2213}, {"id": "overlay_male_worn_jeans", "fg": 2214}, {"id": "overlay_female_worn_boots_winter", "fg": 2216}, {"id": "overlay_male_worn_boots_winter", "fg": 2215}, {"id": "overlay_female_worn_shorts_denim", "fg": 2217}, {"id": "overlay_male_worn_shorts_denim", "fg": 2218}, {"id": "overlay_female_worn_gloves_rubber", "fg": 2220}, {"id": "overlay_male_worn_gloves_rubber", "fg": 2219}, {"id": "overlay_male_worn_hat_cotton", "fg": 2221}, {"id": "overlay_female_worn_hat_cotton", "fg": 2222}, {"id": "overlay_male_worn_robofac_jumpsuit", "fg": 2224}, {"id": "overlay_female_worn_robofac_jumpsuit", "fg": 2223}, {"id": "overlay_female_worn_gloves_liner", "fg": 2225}, {"id": "overlay_male_worn_gloves_liner", "fg": 2226}, {"id": "overlay_female_worn_shorts_cargo", "fg": 2228}, {"id": "overlay_male_worn_shorts_cargo", "fg": 2227}, {"id": "overlay_female_worn_coat_lab", "fg": 2230}, {"id": "overlay_male_worn_coat_lab", "fg": 2229}, {"id": "overlay_male_worn_tank_top", "fg": 2232}, {"id": "overlay_female_worn_tank_top", "fg": 2231}, {"id": "overlay_male_worn_socks", "fg": 2234}, {"id": "overlay_female_worn_socks", "fg": 2233}, {"id": "overlay_female_worn_sports_bra", "fg": 2235}, {"id": "overlay_male_worn_sports_bra", "fg": 2236}, {"id": "overlay_male_worn_bunker_coat", "fg": 2238}, {"id": "overlay_female_worn_bunker_coat", "fg": 2237}, {"id": "overlay_female_worn_gloves_winter", "fg": 2239}, {"id": "overlay_male_worn_gloves_winter", "fg": 2240}, {"id": "overlay_female_worn_mittens", "fg": 2242}, {"id": "overlay_male_worn_mittens", "fg": 2241}, {"id": "overlay_female_worn_glasses_reading", "fg": 2244}, {"id": "overlay_male_worn_glasses_reading", "fg": 2243}, {"id": "overlay_female_worn_longshirt", "fg": 2246}, {"id": "overlay_male_worn_longshirt", "fg": 2245}, {"id": "overlay_female_worn_gloves_cut_resistant", "fg": 2247}, {"id": "overlay_male_worn_gloves_cut_resistant", "fg": 2248}, {"id": "overlay_female_worn_pants", "fg": 2250}, {"id": "overlay_male_worn_pants", "fg": 2249}, {"id": "overlay_female_worn_maid_hat", "fg": 2253}, {"id": "overlay_female_worn_maid_dress", "fg": 2252}, {"id": "overlay_male_worn_maid_hat", "fg": 2251}, {"id": "overlay_male_worn_maid_dress", "fg": 2254}, {"id": "overlay_male_worn_bunker_pants", "fg": 2255}, {"id": "overlay_female_worn_bunker_pants", "fg": 2256}, {"id": "overlay_female_worn_helmet_bike", "fg": 2257}, {"id": "overlay_male_worn_helmet_bike", "fg": 2258}, {"id": "overlay_female_worn_pants_leather", "fg": 2259}, {"id": "overlay_male_worn_pants_leather", "fg": 2260}, {"id": "overlay_male_worn_boots_steel", "fg": 2262}, {"id": "overlay_female_worn_boots_steel", "fg": 2261}, {"id": "overlay_female_worn_survivor_suit", "fg": 2264}, {"id": "overlay_male_worn_survivor_suit", "fg": 2263}, {"id": "overlay_female_worn_pants_fur", "fg": 2265}, {"id": "overlay_male_worn_pants_fur", "fg": 2266}, {"id": "overlay_female_worn_gloves_fingerless", "fg": 2268}, {"id": "overlay_male_worn_gloves_fingerless", "fg": 2267}, {"id": "overlay_female_worn_union_suit", "fg": 2269}, {"id": "overlay_male_worn_union_suit", "fg": 2270}, {"id": "overlay_female_worn_sneakers", "fg": 2271}, {"id": "overlay_male_worn_sneakers", "fg": 2272}, {"id": "overlay_male_worn_flip_flops", "fg": 2274}, {"id": "overlay_female_worn_flip_flops", "fg": 2273}, {"id": "overlay_male_worn_tshirt", "fg": 2276}, {"id": "overlay_female_worn_tshirt", "fg": 2275}, {"id": "overlay_female_worn_boots_hiking", "fg": 2277}, {"id": "overlay_male_worn_boots_hiking", "fg": 2278}, {"id": "overlay_female_worn_gloves_fur", "fg": 2280}, {"id": "overlay_male_worn_gloves_fur", "fg": 2279}, {"id": "overlay_male_worn_firehelmet", "fg": 2282}, {"id": "overlay_female_worn_firehelmet", "fg": 2281}, {"id": "overlay_female_worn_welding_mask_raised", "fg": 2284}, {"id": "overlay_male_worn_welding_mask_raised", "fg": 2283}, {"id": "overlay_female_worn_bandana", "fg": 2285}, {"id": "overlay_male_worn_bandana", "fg": 2286}, {"id": "overlay_male_worn_hat_knit", "fg": 2288}, {"id": "overlay_female_worn_hat_knit", "fg": 2287}, {"id": "overlay_female_worn_hoodie", "fg": 2290}, {"id": "overlay_male_worn_hoodie", "fg": 2289}, {"id": "overlay_male_worn_coat_winter", "fg": 2291}, {"id": "overlay_female_worn_coat_winter", "fg": 2292}, {"id": "overlay_female_worn_duster", "fg": 2293}, {"id": "overlay_male_worn_duster", "fg": 2294}, {"id": "overlay_female_worn_glasses_monocle", "fg": 2295}, {"id": "overlay_male_worn_glasses_monocle", "fg": 2296}, {"id": "overlay_male_worn_welding_mask_crude", "fg": 2298}, {"id": "overlay_female_worn_welding_mask_crude", "fg": 2297}, {"id": "overlay_male_worn_balclava", "fg": 2300}, {"id": "overlay_female_worn_balclava", "fg": 2299}, {"id": "overlay_female_worn_motorbike_boots", "fg": 2302}, {"id": "overlay_male_worn_motorbike_boots", "fg": 2301}, {"id": "overlay_female_worn_helmet_barbute", "fg": 2303}, {"id": "overlay_male_worn_helmet_barbute", "fg": 2304}, {"id": "overlay_female_worn_gloves_tactical", "fg": 2306}, {"id": "overlay_male_worn_gloves_tactical", "fg": 2305}, {"id": "overlay_female_worn_jeans_red", "fg": 2308}, {"id": "overlay_male_worn_jeans_red", "fg": 2307}, {"id": "overlay_female_worn_cowboy_hat", "fg": 2309}, {"id": "overlay_male_worn_cowboy_hat", "fg": 2310}, {"id": "overlay_male_worn_sundress", "fg": 2312}, {"id": "overlay_female_worn_sundress", "fg": 2311}, {"id": "overlay_female_worn_coat_rain", "fg": 2313}, {"id": "overlay_male_worn_coat_rain", "fg": 2314}, {"id": "overlay_male_worn_gloves_light", "fg": 2316}, {"id": "overlay_female_worn_gloves_light", "fg": 2315}, {"id": "mon_skeleton", "fg": 2317, "bg": 1796}, {"id": "mon_dermatik", "fg": 2318, "bg": 1796}, {"id": "mon_exodii_worker", "fg": [{"weight": 15, "sprite": 2320}, {"weight": 15, "sprite": 2321}, {"weight": 10, "sprite": 2322}, {"weight": 10, "sprite": 2319}], "bg": 1796}, {"id": "mon_zombie_brainless", "fg": 2323, "bg": 1796}, {"id": "mon_zombie_soldier", "fg": 2324, "bg": 1796}, {"id": "mon_fungaloid", "fg": 2325, "bg": 1796}, {"id": "mon_zougar", "fg": 2326, "bg": 1796}, {"id": "mon_bee", "fg": 2327, "bg": 1796}, {"id": "mon_zombie_swimmer", "fg": 2328, "bg": 1796}, {"id": "mon_mosquito_giant", "fg": 2329, "bg": 1796}, {"id": "mon_cougar", "fg": 2330, "bg": 1796}, {"id": "mon_dragonfly_giant", "fg": 2331, "bg": 1796}, {"id": "mon_fly", "fg": 2332, "bg": 1796}], "//": "range 1713 to 2336", "sprite_width": 32, "sprite_height": 64, "sprite_offset_x": 0, "sprite_offset_y": -32}, {"file": "large.png", "tiles": [{"id": "f_rotary_clothesline", "fg": 2337}, {"id": "f_fridge", "fg": 2338}, {"id": "t_tree_young", "fg": [{"weight": 100, "sprite": 2351}, {"weight": 100, "sprite": 2349}], "bg": 2342}, {"id": "t_tree_young_season_summer", "fg": [{"weight": 100, "sprite": 2347}, {"weight": 100, "sprite": 2348}], "bg": 2345, "rotates": false}, {"id": "t_tree_young_season_autumn", "fg": [{"weight": 100, "sprite": 2353}, {"weight": 100, "sprite": 2352}], "bg": 2344, "rotates": false}, {"id": "t_tree_young_season_winter", "fg": [{"weight": 100, "sprite": 2350}, {"weight": 100, "sprite": 2346}], "bg": 2343, "rotates": false}, {"id": "mon_zoose", "fg": 2354, "bg": 2341}, {"id": "mon_zombie_acidic", "fg": 2357, "bg": 2339}, {"id": "mon_zombie_corrosive", "fg": 2355, "bg": 2339}, {"id": "mon_zombie_spitter", "fg": 2358, "bg": 2339}, {"id": "corpse_mon_zombie_spitter", "fg": 2356}, {"id": "mon_moose", "fg": [{"weight": 2, "sprite": 2360}, {"weight": 2, "sprite": 2359}], "bg": 2341}, {"id": "mon_zombear", "fg": 2361, "bg": 2340}, {"id": "mon_zombie_grappler", "fg": [{"weight": 1, "sprite": 2363}, {"weight": 1, "sprite": 2362}], "bg": 2339}, {"id": "mon_boomer", "fg": 2364, "bg": 2339}, {"id": "mon_zombie", "fg": [{"weight": 100, "sprite": 2365}, {"weight": 150, "sprite": 2368}, {"weight": 100, "sprite": 2370}, {"weight": 100, "sprite": 2366}, {"weight": 150, "sprite": 2367}], "bg": 2339}, {"id": ["corpse_mon_zombie", "corpse_mon_zombie_grappler", "corpse_mon_zombie_biter", "corpse_mon_zombie_hunter", "corpse_mon_zombie_brute", "corpse_mon_zombie_predator", "corpse_mon_zombie_necro", "corpse_mon_zombie_thorny", "corpse_mon_zombie_smoker", "corpse_mon_zombie_shady", "corpse_mon_zombie_master", "corpse_mon_zombie_acidic", "corpse_mon_zombie_fat", "corpse_mon_zombie_corrosive", "corpse_mon_zombie_screecher", "corpse_mon_zombie_scientist", "corpse_mon_zombie_runner", "corpse_mon_zombie_labsecurity", "corpse_mon_zombie_child", "corpse_mon_zombie_hulk", "corpse_mon_zombie_brute_grappler", "corpse_mon_zombie_brute_ninja", "corpse_mon_zombie_kevlar_2", "corpse_mon_zombie_kevlar_1", "corpse_mon_zombie_hazmat", "corpse_mon_zombie_electric", "corpse_mon_zombie_technician", "corpse_mon_zombie_fungus", "corpse_mon_zombie_cop", "corpse_mon_zombie_child_fungus", "corpse_mon_zombie_swimmer", "corpse_mon_zombie_mancroc", "corpse_mon_zombie_soldier", "corpse_mon_zombie_skull", "corpse_mon_zombie_brainless", "corpse_mon_zombie_survivor", "corpse_mon_zombie_brute_shocker", "corpse_mon_zombie_soldier_acid_1", "corpse_mon_zombie_soldier_blackops_2", "corpse_mon_zombie_soldier_blackops_1", "corpse_mon_zombie_soldier_acid_2", "corpse_mon_zombie_shriekling", "corpse_mon_zombie_ears", "corpse_mon_zombie_nullfield", "corpse_mon_zombie_waif", "corpse_mon_zombie_sproglodyte", "corpse_mon_zombie_creepy", "corpse_mon_zombie_anklebiter", "corpse_mon_zombie_bio_op", "corpse_mon_zombie_armored", "corpse_mon_zombie_prisoner", "corpse_mon_zombie_military_pilot"], "fg": 2369}, {"id": "mon_zombie_smoker", "fg": 2371, "bg": 2339}, {"id": "mon_zombie_necro", "fg": 2372, "bg": 2339}, {"id": "mon_zombie_biter", "fg": 2373, "bg": 2340}, {"id": "mon_exodii_quad", "fg": [{"weight": 15, "sprite": 2380}, {"weight": 10, "sprite": 2377}, {"weight": 15, "sprite": 2376}, {"weight": 15, "sprite": 2379}], "bg": 2341}, {"id": "mon_exodii_turret", "fg": [{"weight": 15, "sprite": 2378}, {"weight": 5, "sprite": 2375}, {"weight": 15, "sprite": 2374}, {"weight": 15, "sprite": 2381}], "bg": 2340}, {"id": "mon_zombie_hunter", "fg": 2382, "bg": 2340}, {"id": "mon_zombie_cop", "fg": 2384, "bg": 2339}, {"id": "mon_zombie_labsecurity", "fg": 2383, "bg": 2339}, {"id": "mon_zombie_rot", "fg": 2385, "bg": 2339}, {"id": "mon_zombie_gasbag", "fg": [{"weight": 1, "sprite": 2387}, {"weight": 1, "sprite": 2386}], "bg": 2339}, {"id": "mon_blob_large", "fg": 2388, "bg": 2341}, {"id": "mon_ant_soldier", "fg": 2393, "bg": 2341}, {"id": "mon_ant_acid_soldier", "fg": 2396, "bg": 2341}, {"id": "corpse_mon_ant_soldier", "fg": 2394}, {"id": "corpse_mon_ant_acid_soldier", "fg": 2392}, {"id": "mon_ant_queen", "fg": 2390, "bg": 2341}, {"id": "mon_ant_acid_queen", "fg": 2389, "bg": 2341}, {"id": "corpse_mon_ant_queen", "fg": 2391}, {"id": "corpse_mon_ant_acid_queen", "fg": 2395}, {"id": "mon_zombie_shady", "fg": 2397, "bg": 2339}, {"id": "mon_zombie_crawler", "fg": 2398, "bg": 2339}, {"id": "mon_zombie_fat", "fg": [{"weight": 1, "sprite": 2399}, {"weight": 1, "sprite": 2400}], "bg": 2339}, {"id": "mon_zombie_tough", "fg": 2401, "bg": 2339}, {"id": "corpse_mon_zombie_tough", "fg": 2402}, {"id": "mon_zombie_electric", "fg": [{"weight": 1, "sprite": 2405}, {"weight": 1, "sprite": 2403}], "bg": 2339}, {"id": "mon_zombie_nullfield", "fg": [{"weight": 1, "sprite": 2404}, {"weight": 1, "sprite": 2406}], "bg": 2339}, {"id": "mon_zombie_scientist", "fg": [{"weight": 1, "sprite": 2408}, {"weight": 1, "sprite": 2407}], "bg": 2339}, {"id": "mon_wasp", "fg": 2409, "bg": 2340}, {"id": "mon_zombie_runner", "fg": 2410, "bg": 2339}, {"id": "mon_mi_go", "fg": 2411, "bg": 2340}, {"id": "mon_zombie_brute", "fg": [{"weight": 100, "sprite": 2412}, {"weight": 100, "sprite": 2413}, {"weight": 50, "sprite": 2415}, {"weight": 50, "sprite": 2414}], "bg": 2340}, {"id": "mon_bear", "fg": 2416, "bg": 2340}], "//": "range 2337 to 2432", "sprite_width": 64, "sprite_height": 64, "sprite_offset_x": -16, "sprite_offset_y": -32}, {"file": "huge.png", "tiles": [{"id": "mon_zombie_hulk", "fg": 2433}], "//": "range 2433 to 2448", "sprite_width": 64, "sprite_height": 96, "sprite_offset_x": -16, "sprite_offset_y": -64}, {"file": "giant.png", "tiles": [{"id": "t_tree", "fg": [{"weight": 100, "sprite": 2457}, {"weight": 100, "sprite": 2456}, {"weight": 100, "sprite": 2458}, {"weight": 100, "sprite": 2452}], "bg": 2462}, {"id": "t_tree_season_summer", "fg": [{"weight": 100, "sprite": 2450}, {"weight": 100, "sprite": 2455}, {"weight": 100, "sprite": 2451}, {"weight": 100, "sprite": 2449}], "bg": 2463}, {"id": "t_tree_season_autumn", "fg": [{"weight": 100, "sprite": 2460}, {"weight": 100, "sprite": 2454}, {"weight": 100, "sprite": 2453}, {"weight": 100, "sprite": 2459}], "bg": 2461}, {"id": "t_tree_season_winter", "fg": [{"weight": 100, "sprite": 2466}, {"weight": 100, "sprite": 2467}, {"weight": 100, "sprite": 2465}, {"weight": 100, "sprite": 2468}], "bg": 2464}, {"id": "t_tree_dead", "fg": [{"weight": 100, "sprite": 2466}, {"weight": 100, "sprite": 2467}, {"weight": 100, "sprite": 2465}, {"weight": 100, "sprite": 2468}, {"weight": 100, "sprite": 2771}], "bg": 2462}, {"id": "t_tree_dead_season_summer", "fg": [{"weight": 100, "sprite": 2466}, {"weight": 100, "sprite": 2467}, {"weight": 100, "sprite": 2465}, {"weight": 100, "sprite": 2468}, {"weight": 100, "sprite": 2771}], "bg": 2463}, {"id": "t_tree_dead_season_autumn", "fg": [{"weight": 100, "sprite": 2466}, {"weight": 100, "sprite": 2467}, {"weight": 100, "sprite": 2465}, {"weight": 100, "sprite": 2468}, {"weight": 100, "sprite": 2771}], "bg": 2461}, {"id": "t_tree_dead_season_winter", "fg": [{"weight": 100, "sprite": 2466}, {"weight": 100, "sprite": 2467}, {"weight": 100, "sprite": 2465}, {"weight": 100, "sprite": 2468}, {"weight": 100, "sprite": 2771}], "bg": 2464}, {"id": "t_tree_birch", "fg": [{"weight": 1, "sprite": 2473}, {"weight": 1, "sprite": 2470}], "bg": 2462}, {"id": "t_tree_birch_season_summer", "fg": [{"weight": 1, "sprite": 2473}, {"weight": 1, "sprite": 2470}], "bg": 2463}, {"id": "t_tree_birch_season_winter", "fg": [{"weight": 1, "sprite": 2474}, {"weight": 1, "sprite": 2471}], "bg": 2464}, {"id": "t_tree_birch_season_autumn", "fg": [{"weight": 1, "sprite": 2472}, {"weight": 1, "sprite": 2469}], "bg": 2461}], "//": "range 2449 to 2480", "sprite_width": 96, "sprite_height": 96, "sprite_offset_x": -32, "sprite_offset_y": -64}, {"file": "incomplete.png", "tiles": [{"id": "f_sink", "multitile": true, "fg": 2491, "additional_tiles": [{"id": "center", "fg": 2496}, {"id": "corner", "fg": [2482, 2494, 2486, 2481]}, {"id": "t_connection", "fg": [2488, 2495, 2490, 2485]}, {"id": "edge", "fg": [2489, 2487]}, {"id": "end_piece", "fg": [2493, 2484, 2483, 2492]}, {"id": "unconnected", "fg": 2491}]}, {"id": "toolbox", "fg": 2497}, {"id": "acoustic_guitar", "fg": 2498}, {"id": "rope_6", "fg": 2499}, {"id": "colt_army", "fg": 2500}, {"id": "ref_lighter", "fg": 2501}, {"id": "soap", "fg": 2502}, {"id": "waffleiron", "fg": 2503}, {"id": "bubblewrap", "fg": 2504}, {"id": "soldering_iron", "fg": 2505}, {"id": "stepladder", "fg": 2506}, {"id": "mag_pistol", "fg": 2507}, {"id": "brazier", "fg": 2508}, {"id": "pliers", "fg": 2509}, {"id": "spray_can", "fg": 2510}, {"id": "condom", "fg": 2511}, {"id": "colt_navy", "fg": 2512}, {"id": "hotplate", "fg": 2513}, {"id": "charcoal", "fg": 2514}, {"id": "stanag30", "fg": 2515}, {"id": "keg", "fg": 2516}, {"id": "pitchfork", "fg": 2517}, {"id": "knife_steak", "fg": 2518}, {"id": "wood_beam", "fg": 2519}, {"id": "smart_phone", "fg": 2520}, {"id": "mosin91_30", "fg": 2521}, {"id": "extinguisher", "fg": 2522}, {"id": "hk_mp5", "fg": 2523}, {"id": "sw_610", "fg": 2524}, {"id": "colt_lightning", "fg": 2525}, {"id": "mag_smg", "fg": 2526}, {"id": "duct_tape", "fg": 2527}, {"id": "t_chainfence", "multitile": true, "rotates": false, "fg": 2528, "bg": 1463, "additional_tiles": [{"id": "edge", "bg": 1463, "fg": [2531, 2528]}, {"id": "end_piece", "bg": 1463, "fg": [2531, 2528, 2531, 2528]}, {"bg": 1463, "id": "unconnected", "fg": 2528}]}, {"id": "t_chainfence_season_winter", "multitile": true, "rotates": false, "fg": 2528, "bg": 682, "additional_tiles": [{"id": "edge", "bg": 682, "fg": [2531, 2528]}, {"id": "end_piece", "bg": 682, "fg": [2531, 2528, 2531, 2528]}, {"bg": 682, "id": "unconnected", "fg": 2528}]}, {"id": "t_chaingate_c", "fg": 2532, "bg": 1463}, {"id": "t_chaingate_l", "fg": 2533, "bg": 1463}, {"id": "t_chaingate_o", "fg": 2529, "bg": 1463}, {"id": "t_chainfence_posts", "fg": 2530, "bg": 1463}, {"id": "t_chaingate_c_season_winter", "fg": 2532, "bg": 682}, {"id": "t_chaingate_l_season_winter", "fg": 2533, "bg": 682}, {"id": "t_chaingate_o_season_winter", "fg": 2529, "bg": 682}, {"id": "t_chainfence_posts_season_winter", "fg": 2530, "bg": 682}, {"id": "t_strconc_wall", "fg": 2534}, {"id": "t_splitrail_fence_season_spring", "fg": 2535, "bg": 1312}, {"id": "t_splitrail_fence_season_summer", "fg": 2535, "bg": 1326}, {"id": "t_splitrail_fence_season_autumn", "fg": 2535, "bg": 1313}, {"id": "t_splitrail_fence_season_winter", "fg": 2535, "bg": 682}, {"id": "t_railing", "fg": 2536, "bg": 1312}, {"id": "t_console", "fg": 2537}, {"id": "t_underbrush", "fg": [{"weight": 100, "sprite": 2540}, {"weight": 100, "sprite": 2539}], "bg": 1312}, {"id": "t_underbrush_harvested", "fg": 2538, "bg": 1312}, {"id": "t_underbrush_season_summer", "fg": [{"weight": 100, "sprite": 2540}, {"weight": 100, "sprite": 2539}], "bg": 1326}, {"id": "t_underbrush_harvested_season_summer", "fg": 2538, "bg": 1326}, {"id": "t_underbrush_season_autumn", "fg": [{"weight": 100, "sprite": 2540}, {"weight": 100, "sprite": 2539}], "bg": 1313}, {"id": "t_underbrush_harvested_season_winter", "fg": 2538, "bg": 649}, {"id": "t_underbrush_season_winter", "fg": [{"weight": 100, "sprite": 2540}, {"weight": 100, "sprite": 2539}], "bg": 649}, {"id": ["t_window_boarded", "t_window_boarded_noglass"], "fg": 2541, "bg": 801}, {"id": "t_wall_metal", "fg": 2542}, {"id": ["t_window_reinforced", "t_window_reinforced_noglass"], "fg": 2543, "bg": 801}, {"id": "t_door_metal_o", "fg": 2544}, {"id": "t_window_frame", "fg": 2545}, {"id": "t_pavement_y", "fg": 2546}, {"id": "t_pavement_y_season_winter", "fg": 682}, {"id": "t_dirtmound", "fg": 2547}, {"id": "t_reinforced_glass_shutter", "fg": 2549}, {"id": "t_reinforced_glass_shutter_open", "fg": 2548}, {"id": "t_trunk", "multitile": true, "fg": [2550, 2551], "bg": [{"weight": 100, "sprite": 1312}, {"weight": 100, "sprite": 1315}]}, {"id": "t_trunk_season_summer", "multitile": true, "fg": [2550, 2551], "bg": [{"weight": 100, "sprite": 1326}, {"weight": 100, "sprite": 1306}]}, {"id": "t_trunk_season_autumn", "multitile": true, "fg": [2550, 2551], "bg": [{"weight": 100, "sprite": 1313}, {"weight": 100, "sprite": 1305}]}, {"id": "t_trunk_season_winter", "multitile": true, "fg": [2550, 2551], "bg": 682}, {"id": "t_console_broken", "fg": 2552}, {"id": ["t_junk_palisade", "t_junk_wall"], "fg": [{"weight": 100, "sprite": 2556}, {"weight": 100, "sprite": 2555}, {"weight": 100, "sprite": 2553}, {"weight": 100, "sprite": 2554}]}, {"id": "t_door_metal_c", "fg": 2557}, {"id": "fd_smoke", "fg": 2560}, {"id": "fd_fungal_haze", "fg": 2559}, {"id": "fd_nuke_gas", "fg": 2558}, {"id": "fd_acid", "fg": 2561}, {"id": "fd_blood", "fg": 2563}, {"id": ["fd_blood_insect", "fd_blood_invertebrate"], "fg": 2562}, {"id": "fd_electricity", "fg": [{"weight": 100, "sprite": 2565}, {"weight": 100, "sprite": 2564}]}, {"id": "fd_web", "fg": [{"weight": 100, "sprite": 2567}, {"weight": 100, "sprite": 2566}, {"weight": 25, "sprite": 2568}, {"weight": 25, "sprite": 2569}]}], "//": "range 2481 to 2576"}, {"file": "fillerhoder.png", "tiles": [{"id": "vp_aisle_horizontal", "fg": 2589}, {"id": "vp_aisle_vertical", "fg": 2586}, {"id": "vp_bed", "fg": 2585}, {"id": "vp_frame_cover", "fg": 2663}, {"id": "vp_frame_cross", "fg": 2662}, {"id": "vp_frame_handle", "fg": 2743}, {"id": "vp_frame_horizontal", "fg": 2680}, {"id": "vp_frame_horizontal_2", "fg": 2684}, {"id": "vp_frame_ne", "fg": 2641}, {"id": "vp_frame_nw", "fg": 2728}, {"id": "vp_frame_se", "fg": 2638}, {"id": "vp_frame_sw", "fg": 2726}, {"id": "vp_frame_vertical", "fg": 2648}, {"id": "vp_frame_vertical_2", "fg": 2711}, {"id": "vp_frame_wood_cover", "fg": 2748}, {"id": "vp_frame_wood_cross", "fg": 2693}, {"id": "vp_frame_wood_handle", "fg": 2743}, {"id": "vp_frame_wood_horizontal", "fg": 2612}, {"id": "vp_frame_wood_horizontal_2", "fg": 2588}, {"id": "vp_frame_wood_ne", "fg": 2617}, {"id": "vp_frame_wood_nw", "fg": 2671}, {"id": "vp_frame_wood_se", "fg": 2596}, {"id": "vp_frame_wood_sw", "fg": 2624}, {"id": "vp_frame_wood_vertical", "fg": 2599}, {"id": "vp_frame_wood_vertical_2", "fg": 2725}, {"id": "vp_hdboard_horizontal", "fg": 2737}, {"id": "vp_hdboard_ne", "fg": 2579}, {"id": "vp_hdboard_nw", "fg": 2659}, {"id": "vp_hdboard_se", "fg": 2602}, {"id": "vp_hdboard_sw", "fg": 2618}, {"id": "vp_hdboard_vertical", "fg": 2706}, {"id": "vp_hdframe_cover", "fg": 2732}, {"id": "vp_hdframe_cross", "fg": 2692}, {"id": "vp_hdframe_horizontal", "fg": 2687}, {"id": "vp_hdframe_horizontal_2", "fg": 2635}, {"id": "vp_hdframe_ne", "fg": 2738}, {"id": "vp_hdframe_nw", "fg": 2690}, {"id": "vp_hdframe_se", "fg": 2705}, {"id": "vp_hdframe_sw", "fg": 2644}, {"id": "vp_hdframe_vertical", "fg": 2651}, {"id": "vp_hdframe_vertical_2", "fg": 2752}, {"id": "vp_washing_machine", "fg": 2653}, {"id": "vp_woodboard_horizontal", "fg": 2708}, {"id": "vp_woodboard_ne", "fg": 2716}, {"id": "vp_woodboard_nw", "fg": 2613}, {"id": "vp_woodboard_se", "fg": 2667}, {"id": "vp_woodboard_sw", "fg": 2731}, {"id": "vp_woodboard_vertical", "fg": 2674}, {"id": "vp_woodhalfboard_horizontal", "fg": 2708}, {"id": "vp_woodhalfboard_horizontal_2", "fg": 2708}, {"id": "vp_woodhalfboard_ne", "fg": 2716}, {"id": "vp_woodhalfboard_nw", "fg": 2613}, {"id": "vp_woodhalfboard_se", "fg": 2667}, {"id": "vp_woodhalfboard_sw", "fg": 2731}, {"id": "vp_woodhalfboard_vertical", "fg": 2674}, {"id": "vp_woodhalfboard_vertical_2", "fg": 2674}, {"id": "vp_basketlg", "fg": 2622}, {"id": "vp_basketsm", "fg": 2622}, {"id": "vp_battery_motorbike", "fg": 2750}, {"id": "vp_blade_horizontal", "fg": 2749}, {"id": "vp_blade_vertical", "fg": 2593}, {"id": "vp_box", "fg": 2691}, {"id": "vp_cargo_space", "fg": 2646, "bg": 2725}, {"id": "vp_chemlab", "fg": 2591}, {"id": "vp_controls", "fg": 2665}, {"id": "vp_craft_rig", "fg": 2591}, {"id": "vp_door_internal", "fg": 2631}, {"id": "vp_door_opaque", "fg": 2661}, {"id": "vp_door_shutter", "fg": 2633}, {"id": "vp_door_sliding", "fg": 2678}, {"id": "vp_engine_1cyl", "fg": 2723}, {"id": "vp_engine_electric", "fg": 2628}, {"id": "vp_engine_electric_large", "fg": 2701}, {"id": "vp_engine_inline4", "fg": 2695}, {"id": "vp_engine_plasma", "fg": 2642}, {"id": "vp_engine_v12", "fg": 2710, "bg": 2713}, {"id": "vp_engine_v6", "fg": 2710}, {"id": "vp_engine_v8", "fg": 2713}, {"id": "vp_engine_vtwin", "fg": 2583}, {"id": "vp_external_gas_tank", "fg": 2580}, {"id": "vp_flamethrower", "fg": 2699}, {"id": "vp_floodlight", "fg": 2578, "bg": 2640}, {"id": "vp_foot_pedals", "fg": 2664}, {"id": "vp_fusion_gun", "fg": 2650}, {"id": "vp_gas_tank", "fg": 2580}, {"id": "vp_gas_tank_small", "fg": 2580}, {"id": "vp_hatch", "fg": 2717}, {"id": "vp_hatch_opaque", "fg": 2745}, {"id": "vp_hddoor", "fg": 2657}, {"id": "vp_hddoor_internal", "fg": 2679}, {"id": "vp_hddoor_opaque", "fg": 2625}, {"id": "vp_hddoor_shutter", "fg": 2608}, {"id": "vp_hddoor_sliding", "fg": 2681}, {"id": "vp_hddoor_trunk", "fg": 2660}, {"id": "vp_hdhatch", "fg": 2675}, {"id": "vp_hdhatch_opaque", "fg": 2639}, {"id": "vp_hdroof", "fg": 2719}, {"id": "vp_hydrogen_tank", "fg": 2682}, {"id": "vp_kitchen_unit", "fg": 2591}, {"id": "vp_laser_gun", "fg": 2650}, {"id": "vp_light_blue", "fg": 2670, "bg": 2733}, {"id": "vp_light_red", "fg": 2670, "bg": 2632}, {"id": "vp_lit_aisle_horizontal", "fg": 2589}, {"id": "vp_lit_aisle_vertical", "fg": 2586}, {"id": "vp_m249", "fg": 2729}, {"id": "vp_minifridge", "fg": 2689}, {"id": "vp_minireactor", "fg": 2614}, {"id": "vp_mounted_browning", "fg": 2729}, {"id": "vp_mounted_mk19", "fg": 2729}, {"id": "vp_muffler", "fg": 2714}, {"id": ["vp_omnicam", "vp_omnomnicam"], "fg": 2686, "bg": 2719}, {"id": "vp_plasma_gun", "fg": 2668}, {"id": "vp_plating_hard", "fg": 2672}, {"id": "vp_plating_military", "fg": 2590}, {"id": "vp_plating_spiked", "fg": 2707}, {"id": "vp_plating_steel", "fg": 2590}, {"id": "vp_plating_superalloy", "fg": 2620}, {"id": "vp_plating_wood", "fg": 2649}, {"id": "vp_recharge_station", "fg": 2750, "bg": 2691}, {"id": "vp_reinforced_solar_panel", "fg": 2724, "bg": 2601}, {"id": "vp_reinforced_solar_panel_v2", "fg": 2724, "bg": 2601}, {"id": "vp_reinforced_windshield", "fg": 2724, "bg": 2669}, {"id": "vp_roof", "fg": 2640}, {"id": "vp_roof_cloth", "fg": 2688}, {"id": "vp_seatbelt", "fg": 2584}, {"id": "vp_seatbelt_heavyduty", "fg": 2584}, {"id": "vp_small_storage_battery", "fg": 2750}, {"id": "vp_solar_panel", "fg": 2601}, {"id": "vp_solar_panel_v2", "fg": 2601}, {"id": "vp_solar_panel_v3", "fg": 2601}, {"id": "vp_spike", "fg": 2616}, {"id": "vp_storage_battery", "fg": 2750}, {"id": "vp_storage_car", "fg": 2750}, {"id": "vp_storage_truck", "fg": 2750}, {"id": "vp_trunk", "fg": 2691}, {"id": "vp_trunk_floor", "fg": 2594}, {"id": "vp_turret_mount", "fg": 2666, "bg": 2719}, {"id": "vp_v_curtain", "fg": 2598}, {"id": "vp_veh_forge", "fg": 2610}, {"id": "vp_veh_table", "fg": 2746}, {"id": "vp_water_tank", "fg": 2630}, {"id": "vp_welding_rig", "fg": 2734}, {"id": "vp_wheel", "fg": 2751}, {"id": "vp_wheel_armor", "fg": 2751}, {"id": "vp_wheel_armor_steerable", "fg": 2751}, {"id": "vp_wheel_bicycle", "fg": 2722}, {"id": "vp_wheel_bicycle_steerable", "fg": 2722}, {"id": "vp_wheel_caster", "fg": 2627}, {"id": "vp_wheel_motorbike", "fg": 2736}, {"id": "vp_wheel_motorbike_steerable", "fg": 2736}, {"id": "vp_wheel_small", "fg": 2581}, {"id": "vp_wheel_small_steerable", "fg": 2581}, {"id": "vp_wheel_steerable", "fg": 2751}, {"id": "vp_wheel_unicycle", "fg": 2722}, {"id": "vp_wheel_wheelchair", "fg": 2722}, {"id": "vp_wheel_wide", "fg": 2611}, {"id": "vp_wheel_wide_steerable", "fg": 2611}, {"id": "alloy_plate", "fg": 2620, "bg": 2658}, {"id": "foot_crank", "fg": 2664, "bg": 2658}, {"id": "frame", "fg": 2693, "bg": 2658}, {"id": "glass_sheet", "fg": 2669, "bg": 2658}, {"id": "hard_plate", "fg": 2672, "bg": 2658}, {"id": "kitchen_unit", "fg": 2591, "bg": 2658}, {"id": "motor", "fg": 2628, "bg": 2658}, {"id": "motor_large", "fg": 2701, "bg": 2658}, {"id": "muffler", "fg": 2714, "bg": 2658}, {"id": "plasma_engine", "fg": 2642, "bg": 2658}, {"id": "saddle", "fg": 2636, "bg": 2658}, {"id": "seat", "fg": 2615, "bg": 2658}, {"id": "solar_panel", "fg": 2601, "bg": 2658}, {"id": "spiked_plate", "fg": 2707, "bg": 2658}, {"id": "steel_plate", "fg": 2590, "bg": 2658}, {"id": "storage_battery", "fg": 2750, "bg": 2658}, {"id": "vehicle_controls", "fg": 2665, "bg": 2658}, {"id": "weldrig", "fg": 2734, "bg": 2658}, {"id": "forge", "fg": 2610, "bg": 2658}, {"id": "1cyl_combustion", "fg": 2723, "bg": 2658}, {"id": "i4_combustion", "fg": 2695, "bg": 2658}, {"id": "v2_combustion", "fg": 2583, "bg": 2658}, {"id": "v6_combustion", "fg": 2710, "bg": 2658}, {"id": "v8_combustion", "fg": 2713, "bg": 2658}, {"id": "vp_board_horizontal", "fg": 2652}, {"id": "vp_board_ne", "fg": 2621}, {"id": "vp_board_nw", "fg": 2739}, {"id": "vp_board_se", "fg": 2600}, {"id": "vp_board_sw", "fg": 2721}, {"id": "vp_board_vertical", "fg": 2709}, {"id": "vp_hdhalfboard_horizontal", "fg": 2577}, {"id": "vp_hdhalfboard_horizontal_2", "fg": 2609}, {"id": "vp_hdhalfboard_ne", "fg": 2747}, {"id": "vp_hdhalfboard_nw", "fg": 2730}, {"id": "vp_hdhalfboard_se", "fg": 2655}, {"id": "vp_hdhalfboard_sw", "fg": 2677}, {"id": "vp_hdhalfboard_vertical", "fg": 2703}, {"id": "vp_hdhalfboard_vertical_2", "fg": 2719}, {"id": "vp_hdstowboard_horizontal", "fg": 2623}, {"id": "vp_hdstowboard_ne", "fg": 2685}, {"id": "vp_hdstowboard_nw", "fg": 2697}, {"id": "vp_hdstowboard_se", "fg": 2587}, {"id": "vp_hdstowboard_sw", "fg": 2735}, {"id": "vp_hdstowboard_vertical", "fg": 2606}, {"id": "vp_stowboard_horizontal", "fg": 2742}, {"id": "vp_stowboard_ne", "fg": 2604}, {"id": "vp_stowboard_nw", "fg": 2673}, {"id": "vp_stowboard_se", "fg": 2720}, {"id": "vp_stowboard_sw", "fg": 2592}, {"id": "vp_stowboard_vertical", "fg": 2637}, {"id": "vp_wing_mirror", "fg": 2605}, {"id": "[vp_xlframe_cover],[vp_fxlframe_cover]", "fg": 2645}, {"id": "[vp_xlframe_cross],[vp_fxlframe_cross]", "fg": 2643}, {"id": "[vp_xlframe_horizontal_2],[vp_fxlframe_horizontal_2]", "fg": 2718}, {"id": "[vp_xlframe_horizontal],[vp_fxlframe_horizontal]", "fg": 2696}, {"id": "[vp_xlframe_ne],[vp_fxlframe_ne]", "fg": 2619}, {"id": "[vp_xlframe_nw],[vp_fxlframe_nw]", "fg": 2607}, {"id": "[vp_xlframe_se],[vp_fxlframe_se]", "fg": 2683}, {"id": "[vp_xlframe_sw],[vp_fxlframe_sw]", "fg": 2740}, {"id": "[vp_xlframe_vertical_2],[vp_fxlframe_vertical_2]", "fg": 2626}, {"id": "[vp_xlframe_vertical],[vp_fxlframe_vertical]", "fg": 2715}, {"id": "[vp_xlhalfboard_horizontal_2],[vp_fxlhalfboard_horizontal_2]", "fg": 2654}, {"id": "[vp_xlhalfboard_horizontal],[vp_fxlhalfboard_horizontal]", "fg": 2727}, {"id": "[vp_xlhalfboard_ne],[vp_fxlhalfboard_ne]", "fg": 2700}, {"id": "[vp_xlhalfboard_nw],[vp_fxlhalfboard_nw]", "fg": 2595}, {"id": "[vp_xlhalfboard_se],[vp_fxlhalfboard_se]", "fg": 2597}, {"id": "[vp_xlhalfboard_sw],[vp_fxlhalfboard_sw", "fg": 2634}, {"id": "[vp_xlhalfboard_vertical_2],[vp_fxlhalfboard_vertical_2]", "fg": 2647}, {"id": "[vp_xlhalfboard_vertical],[vp_fxlhalfboard_vertical]", "fg": 2603}, {"id": "wheel", "fg": 2751, "bg": 2658}, {"id": "wheel_bicycle", "fg": 2722, "bg": 2658}, {"id": "wheel_motorbike", "fg": 2736, "bg": 2658}, {"id": "wheel_small", "fg": 2581, "bg": 2658}, {"id": "wheel_wide", "fg": 2611, "bg": 2658}], "//": "range 2577 to 2768"}, {"file": "opengameartgiant.png", "tiles": [{"id": "t_tree_chestnut", "fg": 2770, "bg": 2462}, {"id": "t_tree_chestnut_season_summer", "fg": 2771, "bg": 2463}, {"id": "t_tree_chestnut_season_autumn", "fg": 2771, "bg": 2461}, {"id": "t_tree_chestnut_season_winter", "fg": 2771, "bg": 2464}, {"id": "t_tree_pine", "fg": 2774, "bg": 2462}, {"id": "t_tree_pine_season_summer", "fg": 2774, "bg": 2463}, {"id": "t_tree_pine_season_autumn", "fg": 2774, "bg": 2461}, {"id": "t_tree_pine_season_winter", "fg": 2774, "bg": 2464}, {"id": "t_tree_deadpine", "fg": 2772, "bg": 2462}, {"id": "t_tree_deadpine_season_summer", "fg": 2772, "bg": 2463}, {"id": "t_tree_deadpine_season_autumn", "fg": 2772, "bg": 2461}, {"id": "t_tree_deadpine_season_winter", "fg": 2772, "bg": 2464}, {"id": "t_tree_hickory", "fg": 2769, "bg": 2462}, {"id": "t_tree_hickory_season_summer", "fg": 2769, "bg": 2463}, {"id": "t_tree_hickory_season_autumn", "fg": 2769, "bg": 2461}, {"id": "t_tree_hickory_season_winter", "fg": 2773, "bg": 2464}, {"id": "t_tree_hickory_dead", "fg": 2773, "bg": 2462}, {"id": "t_tree_hickory_dead_season_summer", "fg": 2773, "bg": 2463}, {"id": "t_tree_hickory_dead_season_autumn", "fg": 2773, "bg": 2461}, {"id": "t_tree_hickory_dead_season_winter", "fg": 2773, "bg": 2464}], "//": "range 2769 to 2784", "sprite_width": 96, "sprite_height": 96, "sprite_offset_x": -32, "sprite_offset_y": -64}, {"file": "fallback.png", "tiles": [], "ascii": [{"offset": 0, "bold": false, "color": "BLACK"}, {"offset": 256, "bold": true, "color": "WHITE"}, {"offset": 512, "bold": false, "color": "WHITE"}, {"offset": 768, "bold": true, "color": "BLACK"}, {"offset": 1024, "bold": false, "color": "RED"}, {"offset": 1280, "bold": false, "color": "GREEN"}, {"offset": 1536, "bold": false, "color": "BLUE"}, {"offset": 1792, "bold": false, "color": "CYAN"}, {"offset": 2048, "bold": false, "color": "MAGENTA"}, {"offset": 2304, "bold": false, "color": "YELLOW"}, {"offset": 2560, "bold": true, "color": "RED"}, {"offset": 2816, "bold": true, "color": "GREEN"}, {"offset": 3072, "bold": true, "color": "BLUE"}, {"offset": 3328, "bold": true, "color": "CYAN"}, {"offset": 3584, "bold": true, "color": "MAGENTA"}, {"offset": 3840, "bold": true, "color": "YELLOW"}]}]} diff --git a/gfx/UltimateCataclysmDemo/tileset.txt b/gfx/UltimateCataclysmDemo/tileset.txt index 623cb620032d1..5058fd31a7450 100644 --- a/gfx/UltimateCataclysmDemo/tileset.txt +++ b/gfx/UltimateCataclysmDemo/tileset.txt @@ -1,4 +1,4 @@ -#Ultimate Cataclysm Demo Update 17 June 2020 +#Ultimate Cataclysm Demo Update 4 July 2020 NAME: UltimateCataclysmDemo VIEW: Ultica (Beta) JSON: tile_config.json diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index 746066e3f9ad1..9e93578fdbc4e 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -60,6 +60,11 @@ def warning_supressed(filename): "data/raw/color_templates/no_bright_background.json" }} +# ignore these directories and their subdirectories +ignore_directories = {os.path.normpath(dir) for dir in { + "data/mods/TEST_DATA", +}} + # these objects have no translatable strings ignorable = { "ascii_art", @@ -143,6 +148,7 @@ def warning_supressed(filename): "MONSTER", "morale_type", "npc", + "proficiency", "npc_class", "overmap_land_use_code", "overmap_terrain", @@ -162,7 +168,8 @@ def warning_supressed(filename): "vehicle_part", "vitamin", "WHEEL", - "help" + "help", + "weather_type" } # for these objects a plural form is needed @@ -261,7 +268,7 @@ def extract_material(item): writestr(outfile, item["dmg_adj"][3]) wrote = True if not wrote and not "copy-from" in item : - print("WARNING: {}: no mandatory field in item: {}".format("/data/json/materials.json", item)) + print("WARNING: {}: no mandatory field in item: {}".format("/data/json/materials.json", item)) def extract_martial_art(item): outfile = get_outfile("martial_art") @@ -287,7 +294,7 @@ def extract_martial_art(item): onmiss_buffs = item.get("onmiss_buffs", list()) oncrit_buffs = item.get("oncrit_buffs", list()) onkill_buffs = item.get("onkill_buffs", list()) - + buffs = onhit_buffs + static_buffs + onmove_buffs + ondodge_buffs + onattack_buffs + onpause_buffs + onblock_buffs + ongethit_buffs + onmiss_buffs + oncrit_buffs + onkill_buffs for buff in buffs: writestr(outfile, buff["name"]) @@ -584,7 +591,7 @@ def extract_dynamic_line_optional(line, member, outfile): if member in line: extract_dynamic_line(line[member], outfile) -dynamic_line_string_keys = { +dynamic_line_string_keys = [ # from `simple_string_conds` in `condition.h` "u_male", "u_female", "npc_male", "npc_female", "has_no_assigned_mission", "has_assigned_mission", "has_many_assigned_missions", @@ -598,7 +605,7 @@ def extract_dynamic_line_optional(line, member, outfile): "has_pickup_list", "is_by_radio", "has_reason", # yes/no strings for complex conditions, 'and' list "yes", "no", "and" -} +] def extract_dynamic_line(line, outfile): if type(line) == list: @@ -799,7 +806,7 @@ def extract_field_type(item): for fd in item.get("intensity_levels"): if "name" in fd: writestr(outfile,fd.get("name")) - + def extract_ter_furn_transform_messages(item): outfile = get_outfile("ter_furn_transform_messages") writestr(outfile,item.get("fail_message")) @@ -1186,6 +1193,8 @@ def extract_all_from_dir(json_dir): dirs.append(f) elif f in skiplist or full_name in ignore_files: continue + elif any(full_name.startswith(dir) for dir in ignore_directories): + continue elif f.endswith(".json"): if full_name in git_files_list: extract_all_from_file(full_name) @@ -1249,4 +1258,6 @@ def prepare_git_file_list(): if len(needs_plural - found_types) != 0: print("WARNING: type {} from needs_plural not found in any JSON objects".format(needs_plural - found_types)) +print("Output files in %s" % to_dir) + # done. diff --git a/lang/po/cataclysm-dda.pot b/lang/po/cataclysm-dda.pot index 80ecee2f3d096..5bc7f89518f01 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.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 17:48+0800\n" +"POT-Creation-Date: 2020-07-10 14:53+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -254,7 +254,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -828,6 +827,17 @@ msgstr[1] "" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "" +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -4196,6 +4206,24 @@ msgid "" "with some kind of mask or mouth protection." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" + #: lang/json/AMMO_from_json.py #: lang/json/ammunition_type_from_json.py msgid "paper cartridge" @@ -5241,7 +5269,7 @@ msgstr[1] "" msgid "A can of yellow paint." msgstr "" -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "" @@ -5317,7 +5345,6 @@ msgstr[1] "" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -5391,7 +5418,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "" @@ -6724,70 +6750,6 @@ msgstr[1] "" msgid "Seeing this is a bug." msgstr "" -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "" -msgstr[1] "" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -7046,7 +7008,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "" @@ -7302,7 +7263,7 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "" #: lang/json/ARMOR_from_json.py @@ -7398,8 +7359,8 @@ msgstr[1] "" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." msgstr "" #: lang/json/ARMOR_from_json.py @@ -7412,7 +7373,7 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." +"20 arrows or bolts. Use insert to store arrows or bolts." msgstr "" #: lang/json/ARMOR_from_json.py @@ -7425,8 +7386,9 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" #: lang/json/ARMOR_from_json.py @@ -7439,7 +7401,7 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." +"hold 60 arrows or bolts. Use insert to store arrows or bolts." msgstr "" #: lang/json/ARMOR_from_json.py @@ -8787,7 +8749,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "" @@ -10506,6 +10467,17 @@ msgid "" "heat." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -16592,7 +16564,6 @@ msgstr[1] "" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "" @@ -16912,7 +16883,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "" @@ -17019,7 +16989,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "" @@ -17335,7 +17304,7 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it " "around is not exactly comfortable." msgstr "" @@ -17906,7 +17875,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -18772,7 +18740,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "" @@ -19488,6 +19455,19 @@ msgid "" "A large sleeping bag that covers you head to toe. This one is medium weight." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -20920,61 +20900,15 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'test power armor'} +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" #: lang/json/BATTERY_from_json.py @@ -21396,8 +21330,8 @@ msgid_plural "Aero-Evaporator CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -22550,8 +22484,8 @@ msgid_plural "Internal Furnace CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel " @@ -22658,8 +22592,8 @@ msgid_plural "Wind Turbine CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -22667,20 +22601,6 @@ msgid "" "power level." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire " -"cutters. They serve no purpose on their own, but are required for crafting " -"bionics." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -22737,14 +22657,41 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire " +"cutters. They serve no purpose on their own, but are required for crafting " +"bionics." +msgstr "" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -24232,8 +24179,8 @@ msgstr[1] "" #. ~ Description for {'str': 'a smoking device and a source of flame', 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py #: lang/json/TOOL_from_json.py @@ -29472,6 +29419,18 @@ msgid "" "your pain at bay." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -30687,6 +30646,19 @@ msgid "" "away." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -30963,6 +30935,20 @@ msgid "" "on combining magic with EM radiation." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -31019,34 +31005,6 @@ msgid "" " - F. \"." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -34491,16 +34449,16 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" +msgid "black tea" +msgid_plural "black teas" msgstr[0] "" msgstr[1] "" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves " -"of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -34549,6 +34507,33 @@ msgstr[1] "" msgid "Fancy mineral water, so fancy it makes you feel fancy just holding it." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia " +"sinensis/. Green tea has a lighter, fresher taste than black and is " +"traditionally preferred in Asian cultures." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -36259,6 +36244,32 @@ msgid "" "cheese. Delicious." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -40112,7 +40123,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "" @@ -41027,25 +41037,55 @@ msgid "" msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'wet dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange, " +"but dogs seem to love it." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry dog food" +msgid_plural "dry dog food" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str_sp': 'dog food'} +#. ~ Description for {'str_sp': 'dry dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" +msgid "wet cat food" +msgid_plural "wet cat food" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str_sp': 'cat food'} +#. ~ Description for {'str_sp': 'wet cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." msgstr "" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py @@ -41084,16 +41124,42 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'green tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'fruit tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -42014,18 +42080,31 @@ msgid "" msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" +msgid "black tea leaf" +msgid_plural "black tea leaves" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "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." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -45552,7 +45631,7 @@ msgid_plural "scream mushrooms" msgstr[0] "" msgstr[1] "" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -45739,113 +45818,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when " -"eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do " -"not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -46703,19 +46675,6 @@ msgstr[1] "" msgid "An aluminum can, like what soda comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -46729,19 +46688,6 @@ msgid "" "laminate. It has a threaded cap for easy resealing." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate. " -"This one is open and its contents will spoil." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -46764,19 +46710,6 @@ msgstr[1] "" msgid "A small tin can, like what tuna comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -46788,19 +46721,6 @@ msgstr[1] "" msgid "A medium tin can, like what soup comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -46875,17 +46795,6 @@ msgstr[1] "" msgid "A small, vacuum formed cup." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -47053,7 +46962,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "" @@ -47152,7 +47060,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of " @@ -47281,19 +47188,6 @@ msgid "" "food." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -47883,6 +47777,32 @@ msgid "" "Felt patches, bundled tightly together for storage. Disassemble to unpack." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -49050,8 +48970,8 @@ msgid_plural "lotus flowers" msgstr[0] "" msgstr[1] "" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -49899,6 +49819,12 @@ msgid "" "gutted for parts." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "broken laser turret" +msgid_plural "broken laser turrets" +msgstr[0] "" +msgstr[1] "" + #: lang/json/GENERIC_from_json.py msgid "fire brick" msgid_plural "fire bricks" @@ -50487,12 +50413,6 @@ msgid "" "like it could support a reinforcing sheet, either." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "broken laser turret" -msgid_plural "broken laser turrets" -msgstr[0] "" -msgstr[1] "" - #: lang/json/GENERIC_from_json.py msgid "TX-5LR Laser Cannon" msgid_plural "TX-5LR Laser Cannons" @@ -51375,7 +51295,7 @@ msgstr[1] "" #. ~ Use action msg for {'str': 'juvenile sourdough starter'}. #: lang/json/GENERIC_from_json.py msgid "" -"After feeding it and caring for it for weeks, your sourdough starter is " +"After feeding it and caring for it for a week, your sourdough starter is " "finally ready for the big leagues." msgstr "" @@ -51413,7 +51333,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "" "This jar contains a floury paste with sourdough starter mixed in. It needs " -"a few hours to recover its strength before it can be used again." +"a day to recover its strength before it can be used again." msgstr "" #: lang/json/GENERIC_from_json.py @@ -52034,6 +51954,58 @@ msgid "" "wound." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -53821,7 +53793,7 @@ msgstr[1] "" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" #: lang/json/GENERIC_from_json.py @@ -54005,6 +53977,19 @@ msgid "" "anything on its own." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -55002,7 +54987,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "" @@ -55711,19 +55695,6 @@ msgid "" "from India designed to be concealed under and against the palm." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -55879,6 +55850,109 @@ msgid "" "somewhat warm to the touch." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments " +"are extremely durable, despite showing signs of heavy wear and repair. The " +"structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves " +"is lost on you. It's heavy and sturdy in construction." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front, " +"you deduce this is some sort of camera. None of the inner workings make any " +"sense to you nor resemble any camera you've seen before." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar " +"to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -55964,7 +56038,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -56171,7 +56244,13 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -57506,6 +57585,19 @@ msgid "" "until it floats. Then attach oars or a motor to get the boat to move." msgstr "" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -58431,7 +58523,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "" @@ -58818,8 +58909,8 @@ msgid_plural "workbenches" msgstr[0] "" msgstr[1] "" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and " @@ -59000,6 +59091,17 @@ msgstr[1] "" msgid "A metal faucet that can be attached to a water tank for easy access." msgstr "" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -59608,6 +59710,18 @@ msgstr[1] "" msgid "It has given you an answer, but you are yet to ask anything." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -59701,7 +59815,20 @@ msgstr[1] "" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." msgstr "" #: lang/json/GENERIC_from_json.py @@ -60383,6 +60510,28 @@ msgid "" "combat: Shii-Cho." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -60405,7 +60554,7 @@ msgstr[1] "" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" @@ -60527,7 +60676,7 @@ msgstr[1] "" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" #: lang/json/GENERIC_from_json.py @@ -61904,140 +62053,6 @@ msgid "" "much more expensive." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional " -"lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "" @@ -64873,6 +64888,34 @@ msgid "" "thrower." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle, " +"custom designed and manufactured by the Exodii." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -65331,28 +65374,6 @@ msgid "" "tips." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp #: src/color.cpp msgid "default" @@ -65414,8 +65435,9 @@ msgstr "" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -65618,16 +65640,6 @@ msgstr "" msgid "Allows stats to raise via skill progression." msgstr "" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "" @@ -65918,6 +65930,49 @@ msgid "" "able to give them back some humanity. If only they cared…" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait, " +"its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic " +"components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -66145,6 +66200,40 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a " +"quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the " +"air currents. It looks capable of hanging in the air for quite a long time " +"before running out of power." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "feral human" +msgid_plural "feral humans" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'feral human'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Pupils dilated and what remains to be seen of the iris and sclera are " +"bloodshot. It still breathes but the zombies treat it like one of them." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "They throw a loose brick at you!" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -67548,6 +67637,17 @@ msgid "" "about rapidly and the mouths form a chorus of groaning screams." msgstr "" +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -67969,6 +68069,21 @@ msgid "" "delivering the finishing blow with its enormous fangs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -69600,6 +69715,19 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -69725,6 +69853,20 @@ msgid "" "of infesting sewer lines." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "prototype laser turret" +msgid_plural "prototype laser turrets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'prototype laser turret'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This appears to be a very experimental automated tower. Plating-less and " +"seemingly half-built, it's little more than an oversized laser emitter and a " +"camera, both welded to a swiveling platform." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "blob" msgid_plural "blobs" @@ -70101,6 +70243,20 @@ msgstr[1] "" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -70189,6 +70345,153 @@ msgid "" "for patient to assist." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and " +"its broad back is rippling with muscles and oozing wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat " +"like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo " +"seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -70215,21 +70518,6 @@ msgid "" "outpace its two-legged friends." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -70339,6 +70627,48 @@ msgid "" "and its eyes bulge with black goo." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "zombie horse" +msgid_plural "zombie horses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'zombie horse'} +#: lang/json/MONSTER_from_json.py +msgid "" +"From the looks of this zombie horse's ghastly features, with its protruding " +"ribs, whitish skull, and empty eyes, the exposed part of the internal organs " +"shows a seemingly lifeless color, and the black body fluid drips slowly. " +"The new strength makes the horse no longer dependent on its muscles, but it " +"can still pursue the enemy quickly." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -70895,6 +71225,46 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the " +"rubble with otherworldly speed." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic " +"and desperate manner." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -71076,12 +71446,12 @@ msgid "" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral hunter" -msgid_plural "feral hunters" +msgid "zombie hunter" +msgid_plural "zombie hunters" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'feral hunter'} +#. ~ Description for {'str': 'zombie hunter'} #: lang/json/MONSTER_from_json.py msgid "" "This once-human body is barely recognizable, scrambling about on all fours, " @@ -71164,12 +71534,12 @@ msgid "" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral runner" -msgid_plural "feral runners" +msgid "zombie runner" +msgid_plural "zombie runners" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'feral runner'} +#. ~ Description for {'str': 'zombie runner'} #: lang/json/MONSTER_from_json.py msgid "" "This recently-risen body moves quickly, darting its head back and forth and " @@ -71177,12 +71547,12 @@ msgid "" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral predator" -msgid_plural "feral predators" +msgid "zombie predator" +msgid_plural "zombie predators" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'feral predator'} +#. ~ Description for {'str': 'zombie predator'} #: lang/json/MONSTER_from_json.py msgid "" "With its joints in odd places and angles, this humanoid creature prowls " @@ -73045,6 +73415,89 @@ msgid_plural "magenta and green hatchlings" msgstr[0] "" msgstr[1] "" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs, " +"broad shoulders and a pointed beak. Its tattered feathers are stained with " +"black, sticky liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Spinosaurus zombie" msgid_plural "Spinosaurus zombies" @@ -73070,16 +73523,97 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "S-Rex" -msgid_plural "S-Rexes" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} #: lang/json/MONSTER_from_json.py msgid "" -"Monstrous columns of dense bone lifting enormous sharp pointed teeth " -"dripping with black goo." +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." msgstr "" #: lang/json/MONSTER_from_json.py @@ -73096,6 +73630,403 @@ msgid "" "sickle-like claw." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms, " +"a long tail, and long sharp scythe-like claws." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent " +"bony crests on its head with ragged strips of ripped flesh hanging down like " +"a frill." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing " +"black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body " +"bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms, " +"a long tail, and long sharp scythe-like claws. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent " +"bony crests on its head with ragged strips of ripped flesh hanging down like " +"a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a " +"huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a " +"huge bipedal dinosaur with feathery edges. The head looks big, lots of big " +"teeth would fit in it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a " +"medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -73564,6 +74495,19 @@ msgid "" "off creatures that disturb it." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -73835,18 +74779,6 @@ msgid "" "traditional forces." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -74213,19 +75145,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "" @@ -74238,6 +75157,14 @@ msgstr "" msgid "a bird" msgstr "" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "" @@ -74973,6 +75900,22 @@ msgstr "" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "" @@ -75096,6 +76039,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "" @@ -75318,6 +76272,15 @@ msgstr "" msgid "Uses a little fatigue" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -75376,8 +76339,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "" @@ -75744,6 +76707,10 @@ msgstr "" msgid "Haste" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "" @@ -75865,10 +76832,10 @@ msgstr "" msgid "Jolt" msgstr "" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py #: lang/json/mutation_category_from_json.py msgid "a crackle" @@ -75910,7 +76877,7 @@ msgstr "" msgid "Lightning Blast" msgstr "" -#: lang/json/SPELL_from_json.py src/weather_data.cpp +#: lang/json/SPELL_from_json.py lang/json/weather_type_from_json.py msgid "Lightning Storm" msgstr "" @@ -75938,6 +76905,31 @@ msgstr "" msgid "Wall of Fog" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "" @@ -76083,56 +77075,6 @@ msgid "" "have this spell you probably debugged it in." msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "" - -#. ~ Description for The Floor is Lava -#: lang/json/SPELL_from_json.py -msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" -msgstr "" - -#. ~ Description for Sports Training Montage -#: lang/json/SPELL_from_json.py -msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" -msgstr "" - -#. ~ Description for Summon Mummy -#: lang/json/SPELL_from_json.py -msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." -msgstr "" - #: lang/json/TOOLMOD_from_json.py msgid "reactor core expansion device" msgid_plural "reactor core expansion devices" @@ -77852,7 +78794,7 @@ msgstr[1] "" msgid "" "Personal portable charging system consisting of an array of solar panels " "neatly folded in a form of a large backpack. It can be worn as one, and has " -"an integrated cable to plug it into a cable charger system." +"an integrated cable to plug it into a cable charger system CBM." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py @@ -77865,7 +78807,7 @@ msgstr[1] "" #: lang/json/TOOL_ARMOR_from_json.py msgid "" "Unfolded array of portable solar panels ready to push some power into an " -"active cable charger system." +"active cable charger system CBM." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py @@ -78369,26 +79311,33 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater Girdles of Pockets'} +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" msgstr[0] "" msgstr[1] "" +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" msgid_plural "Belts of Weaponry" @@ -79419,6 +80368,19 @@ msgid_plural "bionic firestarters" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -79490,7 +80452,7 @@ msgstr[1] "" #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #: lang/json/TOOL_from_json.py -#: src/veh_interact.cpp +#: src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "" @@ -82007,12 +82969,6 @@ msgid_plural "pseudo butter churns" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -82840,13 +83796,11 @@ msgstr[1] "" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "" #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "" @@ -83428,10 +84382,11 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "" "This is a grenade that generates an electromagnetic pulse with a low-" -"inductance capacitor bank discharged into a single-loop antenna. Use this " -"item to pull the pin and light the fuse, turning it into an active EMP " -"grenade. You will then have three turns before it detonates, creating an " -"EMP field that damages robots and drains bionic energy." +"inductance capacitor bank discharged into a single-loop antenna. It also " +"produces a mild electric shock cloud. Use this item to pull the pin and " +"light the fuse, turning it into an active EMP grenade. You will then have " +"three turns before it detonates, creating an EMP field that damages robots " +"and drains bionic energy." msgstr "" #: lang/json/TOOL_from_json.py @@ -83444,8 +84399,8 @@ msgstr[1] "" #: lang/json/TOOL_from_json.py msgid "" "This EMP grenade is active, and will shortly detonate, creating a large EMP " -"field that damages robots and drains bionic energy. You may not want to be " -"holding it much longer." +"field that damages robots and drains bionic energy as well as a mild " +"electric shock cloud. You may not want to be holding it much longer." msgstr "" #: lang/json/TOOL_from_json.py @@ -84202,7 +85157,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -84216,7 +85170,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -84244,12 +85197,36 @@ msgid_plural "throwable fire extinguishers" msgstr[0] "" msgstr[1] "" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic " +"plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" msgstr "" #: lang/json/TOOL_from_json.py @@ -84452,6 +85429,30 @@ msgid "" "shovel but really can't compare to a real shovel." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than " +"raking leaves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -84477,6 +85478,28 @@ msgstr[1] "" msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -85183,6 +86206,12 @@ msgid "" "the right tools, you could use this for metalworking." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -85317,6 +86346,18 @@ msgid "" "metalworking fabrication recipes." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -85475,6 +86516,19 @@ msgid "" "and place on the ground." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -87287,7 +88341,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -87578,8 +88631,8 @@ msgstr "" #. ~ Description for {'str': 'shotgun trap'} #: lang/json/TOOL_from_json.py msgid "" -"This is a simple tripwire is attached to the trigger of a loaded double-" -"barreled shotgun. When pulled, the shotgun fires. Two shells are loaded; " +"This is a simple tripwire is attached to the trigger of a loaded double " +"slamfire shotgun. When pulled, the shotgun fires. Two shells are loaded; " "the first time the trigger is pulled, one or both shells may be discharged." msgstr "" @@ -87850,6 +88903,12 @@ msgid "" "but you could use it to fire anything made of clay." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -88009,7 +89068,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "" @@ -88236,7 +89294,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -88277,7 +89334,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -88674,14 +89730,14 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" +msgid "pseudo atomic butter churn" +msgid_plural "pseudo atomic butter churns" msgstr[0] "" msgstr[1] "" #: lang/json/TOOL_from_json.py -msgid "pseudo atomic butter churn" -msgid_plural "pseudo atomic butter churns" +msgid "precision solderers" +msgid_plural "precision solderers" msgstr[0] "" msgstr[1] "" @@ -88875,6 +89931,21 @@ msgid "" "specialized tools." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -90098,75 +91169,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -90512,7 +91514,7 @@ msgid "Pheidippides was a hack" msgstr "" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "" #: lang/json/achievement_from_json.py @@ -90579,6 +91581,592 @@ msgstr "" msgid "Return to the location you started the game" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… " +"both. The things I will do, what they are, yet I know not. But they will " +"be the terrors of the earth." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become " +"part of each other." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "" @@ -91036,6 +92624,11 @@ msgstr "" msgid "canceling activity serialized with legacy code" msgstr "" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "" @@ -91338,6 +92931,10 @@ msgstr "" msgid "compressed air" msgstr "" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "" @@ -91390,10 +92987,6 @@ msgstr "" msgid "mana energy" msgstr "" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "" @@ -92783,19 +94376,6 @@ msgstr "" msgid "Wind Turbines" msgstr "" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "" @@ -92842,6 +94422,19 @@ msgid "" "and fast." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -93194,8 +94787,65 @@ msgstr "" msgid "Merciful" msgstr "" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp +#: src/scenario.cpp msgid "All" msgstr "" @@ -93819,10 +95469,6 @@ msgstr "" msgid "Take Paint Off Wall" msgstr "" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "" @@ -93863,6 +95509,30 @@ msgstr "" msgid "Mine Upstair" msgstr "" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "" @@ -95666,7 +97336,7 @@ msgstr "" msgid "You mount your steed." msgstr "" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "" @@ -96825,7 +98495,7 @@ msgstr "" msgid "You smoked too much." msgstr "" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "" @@ -98098,66 +99768,6 @@ msgstr "" msgid "The gum webs constrict your movement." msgstr "" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "" @@ -98863,6 +100473,18 @@ msgstr "" msgid "raging fire" msgstr "" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "" @@ -99897,7 +101519,6 @@ msgstr "" #: lang/json/furniture_from_json.py #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp #: src/map.cpp msgid "crash!" msgstr "" @@ -100068,7 +101689,7 @@ msgstr "" #: lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "" @@ -100706,9 +102327,8 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of " -"heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +"heavy weights affixed to opposite ends of a sturdy pipe. You can adjust the " +"set by hand-picking the weights you wish to use." msgstr "" #: lang/json/furniture_from_json.py @@ -100797,6 +102417,18 @@ msgid "" "to be scavanged." msgstr "" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing " +"a boat. This an older model with mechanical resistance adjustments, but it " +"works without power." +msgstr "" + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "" @@ -100809,6 +102441,18 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "" @@ -102075,10 +103719,6 @@ msgstr "" msgid "filled arc furnace" msgstr "" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -102821,6 +104461,7 @@ msgid "auto" msgstr "" #: lang/json/gun_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" @@ -102846,7 +104487,6 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" @@ -103005,7 +104645,7 @@ msgstr "" #: lang/json/gun_from_json.py #: lang/json/gunmod_from_json.py -#: src/item.cpp +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "" @@ -103069,7 +104709,7 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -#: src/item_factory.cpp +#: lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "" @@ -103523,8 +105163,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" msgstr[0] "" msgstr[1] "" @@ -105815,15 +107455,15 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" msgstr[0] "" msgstr[1] "" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one " -"of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed " "around the world, with Česká zbrojovka only joining in the 90's. This " @@ -105936,6 +107576,39 @@ msgid "" "their egomaniac descendants in New England." msgstr "" +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good " +"infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -106047,6 +107720,21 @@ msgstr[1] "" msgid "Electricity unnaturally arcs from the tips of this alien frond." msgstr "" +#: lang/json/gun_from_json.py +msgid "hurled rubble" +msgid_plural "hurled rubbles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "Stone at the ready to crush that which isn't part of the blob." +msgstr "" + +#: lang/json/gun_from_json.py +msgctxt "gun_type_type" +msgid "throw" +msgstr "" + #: lang/json/gun_from_json.py msgid "nail gun" msgid_plural "nail guns" @@ -106105,7 +107793,7 @@ msgstr[1] "" msgid "" "A short homemade lever-action shotgun with a small internal tube magazine. " "While still a primitive pipe and 2x4 design, it is a formiddable shotgun in " -"it's own right with room for improvement." +"its own right with room for improvement." msgstr "" #: lang/json/gun_from_json.py @@ -106442,6 +108130,30 @@ msgid "" "have to suffice." msgstr "" +#: lang/json/gun_from_json.py +msgid "slam-fire pipe shotgun" +msgid_plural "slam-fire pipe shotguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "double slam-fire pipe shotgun" +msgid_plural "double slam-fire pipe shotguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of four thick steel pipes, two end caps and two " +"nails. The lack of sights make this weapon only useful at point-blank range." +msgstr "" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -106876,11 +108588,6 @@ msgid "" "by hand." msgstr "" -#: lang/json/gun_from_json.py -msgctxt "gun_type_type" -msgid "throw" -msgstr "" - #: lang/json/gun_from_json.py msgid "slingshot" msgid_plural "slingshots" @@ -107113,6 +108820,36 @@ msgstr "" msgid "trilaser" msgstr "" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -107977,22 +109714,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -109870,16 +111591,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "" @@ -109894,6 +111605,12 @@ msgid "" "experiment" msgstr "" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -111949,10 +113666,6 @@ msgstr "" msgid "Teleport yourself" msgstr "" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "" @@ -112568,6 +114281,11 @@ msgid "" "access the controls, or use the vehicle control key (default '^')." msgstr "" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "When active, turns engines on and off automatically." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "Illuminated items in this space will not illuminate nearby squares." @@ -113189,6 +114907,14 @@ msgstr "" msgid "Toggle sorting order" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "" @@ -113589,6 +115315,10 @@ msgstr "" msgid "Sleep" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "" @@ -114064,14 +115794,14 @@ msgstr "" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py #: src/editmap.cpp -#: src/editmap.cpp src/veh_interact.cpp +#: src/editmap.cpp src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "" #: lang/json/keybinding_from_json.py #: src/editmap.cpp #: src/editmap.cpp src/options.cpp -#: src/options.cpp src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "" @@ -114262,6 +115992,10 @@ msgstr "" msgid "Toggle tracking" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Toggle smart engine controller" +msgstr "" + #: lang/json/keybinding_from_json.py src/turret.cpp #: src/vehicle_use.cpp msgid "Set turret firing modes" @@ -114647,6 +116381,15 @@ msgstr "" msgid "Zombie trap." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -116216,6 +117959,21 @@ msgid "" "Lasts 3 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to " +"start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "" @@ -116370,6 +118128,22 @@ msgid "" "+2 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity " +"presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "" @@ -116407,6 +118181,33 @@ msgid "" "Blocked damage reduced by 50% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -116455,6 +118256,32 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "" @@ -116694,6 +118521,30 @@ msgid "" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "" @@ -116732,6 +118583,22 @@ msgid "" "Blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win " +"this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% " +"of Strength.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "" @@ -116798,6 +118665,34 @@ msgid "" "Last 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack " +"again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "" @@ -116869,6 +118764,37 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi-Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi-Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "" @@ -117017,6 +118943,21 @@ msgid "" "25% of Perception but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents " +"approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "" @@ -117170,6 +119111,22 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body " +"fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "" @@ -117223,6 +119180,21 @@ msgid "" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your " +"opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "" @@ -117278,6 +119250,22 @@ msgid "" "50% of Perception." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can " +"strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch " +"(Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "" @@ -117391,6 +119379,32 @@ msgid "" "armor, +Perception fire armor." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2 " +"times." +msgstr "" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "" @@ -117429,6 +119443,21 @@ msgid "" "+2 Blocks attempts, +1 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "" @@ -117466,6 +119495,19 @@ msgid "" "Lasts 3 turns. Stacks 4 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "" @@ -117583,6 +119625,20 @@ msgid "" "Stacks 2 times. Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at " +"bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "" @@ -117632,6 +119688,33 @@ msgid "" "Lasts 6 turns. Stacks 6 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron " +"skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "" @@ -117969,6 +120052,35 @@ msgid "" "Lasts 1 turn. Stacks 2 times" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and " +"boundless confidence combine to allow you to make a fast, bold move that " +"catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome " +"physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "" @@ -118061,6 +120173,20 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Iron Heart" msgstr "" @@ -118161,6 +120287,48 @@ msgstr "" msgid "%s is about to challenge someone to a battle." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Setting Sun" msgstr "" @@ -118185,6 +120353,36 @@ msgstr "" msgid "%s shifts their weight and assumes a new stance." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw " +"off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and " +"\"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend " +"and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Shii-Cho" msgstr "" @@ -118212,10 +120410,6 @@ msgstr "" msgid "%s places one foot back and hold their weapon vertically." msgstr "" -#: lang/json/martial_art_from_json.py -msgid "Determination" -msgstr "" - #. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' #: lang/json/martial_art_from_json.py #, no-python-format @@ -118264,6 +120458,197 @@ msgid "" "+1 block attempts, +1 block effectiveness." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your " +"weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of " +"the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to " +"avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a " +"short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves " +"you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to " +"die.\n" +"\n" +"+5% critical hit chance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike " +"first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no " +"different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a " +"herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "" @@ -118749,7 +121134,7 @@ msgid "Emulsified Hydrogel" msgstr "" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "" #: lang/json/material_from_json.py @@ -118780,7 +121165,7 @@ msgstr "" msgid "There is always work to be done, song to be woven." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -118788,16 +121173,16 @@ msgid "" "you." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -119991,7 +122376,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "" #: lang/json/mission_def_from_json.py @@ -120000,7 +122385,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." +msgid "Well, you're not dead… yet." msgstr "" #: lang/json/mission_def_from_json.py @@ -120720,7 +123105,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20 " +"We could use some 3 liter jars to preserve our produce. Can you bring me 10 " "large three liter jars? I'll give you some preserves in exchange." msgstr "" @@ -122446,6 +124831,87 @@ msgstr "" msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check " +"it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "" @@ -126076,6 +128542,7 @@ msgid "Reflex Photophore" msgstr "" #. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} #: lang/json/mutation_from_json.py msgid "" "A photophore has grown from your head. You can't consciously control it, " @@ -126083,6 +128550,10 @@ msgid "" "physiological state." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -126095,13 +128566,31 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." msgstr "" #: lang/json/mutation_from_json.py @@ -126215,9 +128704,11 @@ msgstr "" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" #: lang/json/mutation_from_json.py @@ -126840,7 +129331,10 @@ msgstr "" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." msgstr "" #: lang/json/mutation_from_json.py @@ -126849,9 +129343,10 @@ msgstr "" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to " -"recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as " +"your broken limbs heal at 33% the regular rate." msgstr "" #: lang/json/mutation_from_json.py @@ -126860,9 +129355,10 @@ msgstr "" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth " -"of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP " +"whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" #: lang/json/mutation_from_json.py @@ -127567,8 +130063,10 @@ msgstr "" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" #: lang/json/mutation_from_json.py @@ -127577,7 +130075,11 @@ msgstr "" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster " +"whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16 " +"times faster than usual." msgstr "" #: lang/json/mutation_from_json.py @@ -127586,7 +130088,9 @@ msgstr "" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." msgstr "" #: lang/json/mutation_from_json.py @@ -130963,7 +133467,7 @@ msgid "Well, maybe you'll just have to make your own world wide web." msgstr "" #: lang/json/mutation_from_json.py -#: lang/json/mutation_from_json.py lang/json/npc_from_json.py +#: lang/json/npc_from_json.py msgid "Survivor" msgstr "" @@ -131268,10 +133772,6 @@ msgid "" "are real and the only thing standing between this world and oblivion is you." msgstr "" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -131643,15 +134143,34 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py -msgid "Survivor Story" +msgid "Survivor: Confused 1" msgstr "" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -131659,6 +134178,86 @@ msgstr "" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "" @@ -132894,7 +135493,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -133399,11 +135999,6 @@ msgstr "" msgid "I'm tracking game." msgstr "" -#: lang/json/npc_class_from_json.py -#: lang/json/npc_from_json.py -msgid "Soldier" -msgstr "" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "" @@ -134155,10 +136750,6 @@ msgstr "" msgid "Laborer" msgstr "" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "" @@ -136669,6 +139260,18 @@ msgstr "" msgid "bridge" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "" @@ -141533,6 +144136,116 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -141701,8 +144414,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -141715,8 +144429,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -142959,6 +145674,226 @@ msgid "" "find some other use." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse " +"won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse " +"won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for " +"acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for " +"acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -144625,7 +147560,7 @@ msgid "build a metalworking forge" msgstr "" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" #: lang/json/recipe_from_json.py @@ -151237,96 +154172,6 @@ msgstr "" msgid "I'd kill for a sip of water right now." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you " -"like! Only joking, what's up ?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't " -"ending, just for a while?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "" @@ -153789,6 +156634,18 @@ msgstr "" msgid "Was it rough surviving thus far?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -154504,6 +157361,302 @@ msgstr "" msgid " will follow normal engagement rules." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you " +"like! Only joking, heh." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't " +"ending." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "" + +#: lang/json/snippet_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the " +"damn point?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -155643,6 +158796,14 @@ msgid "" "comes close.\"" msgstr "" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -155652,6 +158813,21 @@ msgid "" "reads: \"WE ARE HERE TO PROTECT YOU.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -166767,6 +169943,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "" @@ -166912,11 +170092,11 @@ msgid "Acolyte." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -166951,8 +170131,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -166965,11 +170145,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by " -"taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" @@ -166987,11 +170167,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes " "this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" #: lang/json/talk_topic_from_json.py @@ -167000,7 +170180,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" @@ -167014,10 +170194,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " +"The song can be weaved in many forms. Carved bone charms, weapons and armor " "all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it, " -"or end it. Makes no difference." +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" #: lang/json/talk_topic_from_json.py @@ -167027,7 +170207,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" @@ -167043,8 +170223,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" @@ -167054,9 +170234,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the " -"inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" #: lang/json/talk_topic_from_json.py @@ -167114,14 +170294,6 @@ msgstr "" msgid "Perhaps another time, Seer." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "" @@ -167130,10 +170302,6 @@ msgstr "" msgid "Not interested." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "" @@ -167150,20 +170318,13 @@ msgstr "" msgid "I'm off then." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an " -"unspoiled living creature." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" @@ -167174,7 +170335,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -167189,10 +170350,6 @@ msgstr "" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I understand your reluctancy. Feel free to return when you see the way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "" @@ -167204,14 +170361,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " +"see it in others, but it happens to us, even you and I. How many times have " +"you fallen? Your flesh rent from your body, devoured. Or perhaps it was " +"the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the " +"bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" #: lang/json/talk_topic_from_json.py @@ -167244,6 +170401,14 @@ msgstr "" msgid "Skip it, let's get going." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "" @@ -167481,11 +170646,11 @@ msgstr "" msgid "" "I can help with some tasks if you show me where to work.\n" " Use the zone manager (keybind 'Y') to set up sorting zones for your loot, " -"or to draw blueprints for a building, or to define where you want to plant " +"or to draw blueprints for a building, or to define where you want to plant " "some crops, or where you'd like some trees cut down, or where you want a " "vehicle dismantled or repaired, or a good fishing spot. Then talk to me " "about my current activity and tell me to sort stuff, or build stuff, or cut " -"down trees, or repair or dismantle a vehicle, or do farmwork, or catch some " +"down trees, or repair or dismantle a vehicle, or do farmwork, or catch some " "fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want " "me to work - axes for logging, shovels and seeds and fertilizer for farming, " @@ -167742,8 +170907,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law " +"anymore…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -167765,7 +170930,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -167816,7 +170981,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." +msgid "No, just no…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -167828,7 +170993,7 @@ msgid "Make it quick, I want to go back to sleep." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." +msgid "Just few minutes more…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -167875,75 +171040,117 @@ msgid "I want to set some miscellaneous rules." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Can you teach me anything?" +msgid "I'd like to know a bit more about your abilities." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's trade items" +msgid "There's something I want you to do." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I want you to use this item." +msgid "I just wanted to talk for a bit." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hold on to this item." +msgid "Can you help me understand something? (HELP/TUTORIAL)" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Guard this position." +msgid "I'm going to go my own way for a while." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I want to assign you to work at this camp." +msgid "Let's go." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." +msgid "Sure, what did you want to say?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Find a horse and mount up!" +msgid "Mind if we just chat for a bit about your history?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Get off your mount, please." +msgid "Let's just chitchat for a while, I could use some relaxation." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please go to this location." +msgid "I changed my mind, wanted to ask you something else." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." +msgid "I'm all ears, my friend." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" +msgid "You gonna give me orders?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" +msgid "What would you like?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." +msgid "Just say the word." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." +msgid "Can you teach me anything?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." +msgid "Let's trade items" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's go." +msgid "I want you to use this item." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hold on to this item." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Guard this position." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I want to assign you to work at this camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Find a horse and mount up!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Get off your mount, please." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please go to this location." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I want you to build a camp here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "We need to abandon this camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Show me what needs to be done at the camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about your current activity." msgstr "" #: lang/json/talk_topic_from_json.py @@ -168103,11 +171310,11 @@ msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "" #: lang/json/talk_topic_from_json.py -#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp +#: lang/json/talk_topic_from_json.py src/action.cpp +#: src/activity_handlers.cpp src/avatar.cpp #: src/avatar.cpp src/avatar_action.cpp -#: src/avatar_action.cpp #: src/avatar_action.cpp src/crafting.cpp -#: src/game.cpp +#: src/crafting.cpp src/game.cpp #: src/handle_action.cpp #: src/handle_action.cpp src/handle_liquid.cpp #: src/handle_liquid.cpp src/iexamine.cpp @@ -168495,10 +171702,6 @@ msgstr "" msgid "Stay at your current position." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "" @@ -168571,59 +171774,6 @@ msgstr "" msgid "Sure thing, I'll make my way there." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -168679,7 +171829,7 @@ msgid "Hello there." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." +msgid "Okay, no sudden movements…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169032,7 +172182,7 @@ msgid "Ah, okay." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." +msgid "Not until I get some antibiotics…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169140,7 +172290,7 @@ msgid "I can't train you properly while I'm operating a vehicle!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." +msgid "Give it some time, I'll show you something new later…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169168,7 +172318,7 @@ msgid "See you around." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." +msgid "I really don't feel comfortable doing so…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169240,7 +172390,7 @@ msgid "Thanks, see you later!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." +msgid "You picked up something that does not belong to you…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169334,13 +172484,13 @@ msgid "You might be seeing more of me…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" #: lang/json/talk_topic_from_json.py @@ -169362,7 +172512,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169375,7 +172525,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" @@ -169397,7 +172547,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169413,7 +172563,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169448,14 +172598,6 @@ msgstr "" msgid "Tell me how faction camps have changed." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "" @@ -169802,7 +172944,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -169825,6 +172967,50 @@ msgstr "" msgid "Actually, never mind." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "" @@ -169846,7 +173032,7 @@ msgid "May the earth flourish beneath our paths." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -170030,7 +173216,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " "spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" @@ -170456,6 +173642,18 @@ msgstr "" msgid "This is a npc_has_var, npc_remove_var test response." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is a u_add_var time test response." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_add_var time test response." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var time test response for > 3_days." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "This is a u_adjust_var test response that increments by 1." msgstr "" @@ -170605,7 +173803,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -171050,6 +174248,38 @@ msgstr "" msgid "Huh." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time. " +"OK, well, I guess this all started with the riots, didn't it? We were just " +"leading our lives, doing our jobs, and then people started rioting. Not the " +"usual protests that turned violent or anything, either, people just left " +"their houses and started breaking shit. The news tried to downplay it but " +"they couldn't keep it off the internet. I don't know what caused it, they " +"said it was some kind of drug or toxin in the water? Still, I didn't really " +"realize how bad it was getting at first. Somewhere along the way the " +"\"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing " @@ -171102,8 +174332,8 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" #: lang/json/talk_topic_from_json.py @@ -171369,6 +174599,30 @@ msgstr "" msgid "Thanks for telling me that stuff. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is, " +"nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -171418,6 +174672,24 @@ msgid "" "in the crash, but I am not going back to find out." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't " +"have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone " +"else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -171451,6 +174723,21 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -171507,6 +174794,40 @@ msgid "" "pretty good life compared to those first few months." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but " +"like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy " +"in those days. It was a lot like the pandemic a few years back, except the " +"police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -171515,6 +174836,50 @@ msgid "" "out of there." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on " +"some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was " +"dragging a few human bodies behind it, I couldn't tell if they were dead or " +"unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see " +"a ways off. It was falling in but it kept the rain and wind off and gave me " +"a place out of sight. I stayed there until I ran out of those ass-tasting " +"ration bars I'd filled my backpack with. Then I took on the wanderin' life " +"until we met." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start " +"with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind " +"of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -171556,6 +174921,27 @@ msgstr "" msgid "Right. Sorry." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went " +"into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to " @@ -171568,6 +174954,19 @@ msgid "" "what happened to all those people." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course " +"to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a " @@ -171639,6 +175038,42 @@ msgstr "" msgid "Sorry for asking. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to " +"us. Intentionally, or at least sort-of intentionally." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -172227,6 +175662,48 @@ msgid "" "woods. I wasn't doing a great job of it, so I'm kinda glad you showed up." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be " +"a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -172272,6 +175749,128 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly " +"though it sounds, is aliens." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and " +"monsters and mutations." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them " +"before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about, " +"headed through a broken window, and holed up in there for a few days. I had " +"a fair bit of stolen food and I just kept to myself. When things started to " +"quiet down, I headed out, and here I am." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -172537,13 +176136,48 @@ msgstr "" msgid "I can respect that." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how " +"things were with China, they blamed it on them mostly. Made people violent " +"and ugly. There were riots. People I cared about joined them, and I guess " +"I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real " +"Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life " +"before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby. " +"I feel like I'd rather not remember." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life " "before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -172629,6 +176263,43 @@ msgid "" "don't ask again." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus " +"again. The military and the cops did their damndest to put it down but it " +"got out of hand. Then the virus mutated and started bringing the dead back " +"to life like in some kinda B-movie, and shit got really real. They let the " +"big things loose, or they set them on us, I dunno. Huge unspeakable " +"monsters… still makes me shudder to think of them. They obviously weren't " +"built for combat though, and the military took 'em down fast." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -172921,7 +176592,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot " -"of money in some very clever ways. Not clever enough, it turns out..." +"of money in some very clever ways. Not clever enough, it turns out…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -173094,6 +176765,32 @@ msgid "" "we're the meek that shall inherit the Earth. Although I don't love our odds." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a " +"plague of fire, I remember that one for sure, that was when there were bombs " +"and things going off everywhere to try to contain the riots. And then " +"demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -173101,6 +176798,23 @@ msgid "" "Hell on Earth. I wish I'd paid more attention in Sunday School." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*, " +"everyone's gone. Instead it was messy and dirty. Riots in the streets, the " +"military and police serving the Antichrist to gun down the people like - " +"what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd " +"ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -173314,10 +177028,6 @@ msgstr "" msgid "What was working for the Old Guard like?" msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "" @@ -173529,6 +177239,22 @@ msgstr "" msgid "What were you saying before that?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on, " +"but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming, " +"though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole, " +"like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "" @@ -174050,7 +177776,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -174442,10 +178168,6 @@ msgid "" "catastrophe." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "" @@ -175865,7 +179587,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" @@ -176589,7 +180311,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between " -"guitars right now, you know? Temporarily guitar-light, if you get my " +"guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -177682,12 +181404,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a " -"concentration center, and then we got on a bus to come here. The bus though, " -"it was rolled over by a giant monster, and many died. We made it out along " -"with a few others, and we kept going until we made it here. It wasn't much " -"farther, and for some reason the monster didn't chase us, just kept tearing " -"at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" #: lang/json/talk_topic_from_json.py @@ -177815,7 +181537,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " +"out in Western Canada. I'd always wanted to see New England, and I was down " "here on vacation when, well, you know. I got evacuated, but because I'm not " "a US citizen they weren't willing to take me downstairs. I can understand " "that, even if I don't like it much. To tell you the truth I'm still coming " @@ -177884,7 +181606,7 @@ msgid "Hm? Oh, hi." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "" #: lang/json/talk_topic_from_json.py @@ -178248,8 +181970,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what " -"we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" #: lang/json/talk_topic_from_json.py @@ -178266,9 +181988,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here, " @@ -178592,7 +182314,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." +msgid "I'm not in charge here, you're looking for someone else…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -178640,11 +182362,11 @@ msgid "Well, I'd better be going. Bye." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." +msgid "Welcome marshal…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." +msgid "Welcome…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -178872,11 +182594,11 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." +msgid "Marshal…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." +msgid "Citizen…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179474,7 +183196,7 @@ msgid "" "protective gear: gas mask, suit and gear, at a considerable discount. We " "will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179522,6 +183244,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "" @@ -179535,11 +183269,11 @@ msgid "Hey." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Yes?" +msgid "Good to see you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Good to see you." +msgid "About those jobs…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179551,7 +183285,7 @@ msgid "Want help with something else?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." +msgid "Lets set a combat strategy" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179605,6 +183339,10 @@ msgstr "" msgid "Anything on your mind?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "" @@ -179646,15 +183384,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179694,7 +183432,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179763,7 +183501,7 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." +msgid "Stand still while I get my clippers…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180134,7 +183872,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." +msgid "Please leave me alone…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180153,13 +183891,13 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me time..." +"I don't know what you could do. I've tried everything. Just give me time…" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180281,8 +184019,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but " -"you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180626,7 +184364,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"You look hungry friend. So much hunger in this world. This is the time of " +"You look hungry friend. So much hunger in this world. This is the time of " "the eaters." msgstr "" @@ -180794,7 +184532,7 @@ msgid "Happy to be of service to the great eaters. I'm in." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Excellent. Make it happen." +msgid "Excellent. Make it happen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -180954,7 +184692,7 @@ msgid "Oh, you again." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180962,7 +184700,7 @@ msgid "I'm busy, what is it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "" #: lang/json/talk_topic_from_json.py @@ -181391,10 +185129,6 @@ msgstr "" msgid " blocks %s" msgstr "" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -184126,6 +187860,62 @@ msgstr "" msgid " quickly sweeps through %s and those nearby" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -185125,183 +188915,14 @@ msgid "" msgstr "" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted " -"properly." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." +msgid "overgrown floor" msgstr "" -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it " -"out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of " -"maintenance." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "" - -#. ~ Description for yellow pavement +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -185309,38 +188930,13 @@ msgid "SMASH!" msgstr "" #: lang/json/terrain_from_json.py -msgid "metal floor" +msgid "overgrown wall" msgstr "" -#. ~ Description for metal floor +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -185424,6 +189020,21 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -185431,6 +189042,10 @@ msgid "" "with a matching roof." msgstr "" +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "" @@ -185473,6 +189088,10 @@ msgid "" "resistance and sliding, commonly for recreational sports." msgstr "" +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -185555,45 +189174,150 @@ msgid "A blue section of flooring." msgstr "" #: lang/json/terrain_from_json.py -msgid "industrial carpet" +msgid "carpet" msgstr "" -#. ~ Description for industrial carpet +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base carpet!" +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Soft red carpet." +msgstr "" + +#. ~ Description for yellow carpet +#: lang/json/terrain_from_json.py +msgid "Soft yellow carpet." +msgstr "" + +#. ~ Description for green carpet +#: lang/json/terrain_from_json.py +msgid "Soft green carpet." +msgstr "" + +#. ~ Description for purple carpet +#: lang/json/terrain_from_json.py +msgid "Soft purple carpet." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "" + +#. ~ Description for industrial red carpet #: lang/json/terrain_from_json.py msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." msgstr "" #: lang/json/terrain_from_json.py -msgid "bunker carpet" +msgid "industrial yellow carpet" msgstr "" -#. ~ Description for bunker carpet +#. ~ Description for industrial yellow carpet #: lang/json/terrain_from_json.py msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on " +"bare concrete." msgstr "" -#. ~ Description for red carpet #: lang/json/terrain_from_json.py -msgid "Soft red carpet." +msgid "industrial green carpet" msgstr "" -#. ~ Description for yellow carpet +#. ~ Description for industrial green carpet #: lang/json/terrain_from_json.py -msgid "Soft yellow carpet." +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." msgstr "" -#. ~ Description for green carpet #: lang/json/terrain_from_json.py -msgid "Soft green carpet." +msgid "industrial purple carpet" msgstr "" -#. ~ Description for purple carpet +#. ~ Description for industrial purple carpet #: lang/json/terrain_from_json.py -msgid "Soft purple carpet." +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on " +"bare concrete." +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." msgstr "" #: lang/json/terrain_from_json.py @@ -185630,6 +189354,33 @@ msgid "" "you like the sound of rain on corrugated metal." msgstr "" +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "" @@ -185639,6 +189390,30 @@ msgstr "" msgid "Moist spongy moss." msgstr "" +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted " +"properly." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "" @@ -185648,6 +189423,131 @@ msgstr "" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it " +"out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of " +"maintenance." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "" + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "" @@ -189391,6 +193291,78 @@ msgstr "" msgid "A ladder leading down." msgstr "" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "" @@ -189883,7 +193855,7 @@ msgstr "" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py #: lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "" @@ -190074,6 +194046,10 @@ msgstr "" msgid "Car Chassis" msgstr "" +#: lang/json/vehicle_from_json.py +msgid "Hybrid Car" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "City Car" msgstr "" @@ -191673,6 +195649,11 @@ msgstr "" msgid "A wooden board that keeps the water out of your boat." msgstr "" +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -191762,6 +195743,21 @@ msgid "" "disabled." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "smart engine controller" +msgstr "" + +#. ~ Description for {'str': 'smart engine controller'} +#: lang/json/vehicle_part_from_json.py +#, no-python-format +msgid "" +"Electronic module that automatically switches combustion and electric " +"engines on and off minimizing fuel consumption and optimizing power output " +"and battery charge rate. Must be turned on to work. Simplified ruleset: 1. " +"When throttling, maximize acceleration. 2. Keep battery at 90%. 3. " +"Minimize fuel consumption." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "5-point harness" msgstr "" @@ -192105,14 +196101,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" +msgid "flimsy wooden seat" msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "" @@ -192312,6 +196313,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "" @@ -192903,6 +196913,58 @@ msgstr "" msgid "Disgusting Diet" msgstr "" +#: lang/json/weather_type_from_json.py +msgid "NULL Weather - BUG" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Clear" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Sunny" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Cloudy" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Light Drizzle" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Drizzle" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Rain" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Thunder Storm" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Acidic Drizzle" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Acid Rain" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Flurries" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Snowing" +msgstr "" + +#: lang/json/weather_type_from_json.py +msgid "Snowstorm" +msgstr "" + #: src/achievement.cpp msgid "time of cataclysm" msgstr "" @@ -193150,7 +197212,7 @@ msgid "The lock stumps your efforts to pick it." msgstr "" #: src/activity_actor.cpp src/game.cpp -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iexamine.cpp src/iuse.cpp #: src/iuse.cpp #: src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp @@ -193213,6 +197275,120 @@ msgstr "" msgid "Continue trying to fall asleep and don't ask again." msgstr "" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -194868,7 +199044,7 @@ msgstr "" msgid "< [%s] Sort: %s >" msgstr "" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "" @@ -197746,6 +201922,29 @@ msgstr "" msgid "Increased storage capacity by %i." msgstr "" +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "" @@ -197908,7 +202107,8 @@ msgid "(incapacitated)" msgstr "" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" +#, c-format +msgid "(fuel saving ON > %d %%)" msgstr "" #: src/bionics_ui.cpp @@ -197975,6 +202175,10 @@ msgstr "" msgid "Accuracy" msgstr "" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "" @@ -198586,6 +202790,23 @@ msgstr "" msgid "You try to free yourself from the webs, but can't get loose!" msgstr "" +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + #: src/character.cpp msgid "You try to escape the pit, but slip back in." msgstr "" @@ -199437,6 +203658,10 @@ msgstr "" msgid "Your body strains under the weight!" msgstr "" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -202390,6 +206615,14 @@ msgstr "" msgid "Game…" msgstr "" +#: src/debug_menu.cpp +msgid "Change [b]attery charge" +msgstr "" + +#: src/debug_menu.cpp +msgid "Vehicle…" +msgstr "" + #: src/debug_menu.cpp msgid "Teleport - short range" msgstr "" @@ -203020,9 +207253,7 @@ msgstr "" #: src/debug_menu.cpp #, c-format -msgid "" -"Current turn: %d.\n" -"%s\n" +msgid "Current turn: %d.\n" msgstr "" #: src/debug_menu.cpp @@ -203032,14 +207263,6 @@ msgid_plural "%d creatures exist.\n" msgstr[0] "" msgstr[1] "" -#: src/debug_menu.cpp -msgid "NPCs are going to spawn." -msgstr "" - -#: src/debug_menu.cpp -msgid "NPCs are NOT going to spawn." -msgstr "" - #: src/debug_menu.cpp #, c-format msgid "%s: map ( %d:%d ) pos ( %d:%d )" @@ -203094,6 +207317,22 @@ msgstr "" msgid "%1$s (%2$s)" msgstr "" +#: src/debug_menu.cpp +msgid "Vehicle condition" +msgstr "" + +#: src/debug_menu.cpp +msgid "Light damage" +msgstr "" + +#: src/debug_menu.cpp +msgid "Undamaged" +msgstr "" + +#: src/debug_menu.cpp +msgid "Disabled (tires or engine)" +msgstr "" + #: src/debug_menu.cpp msgid "Martial arts debug." msgstr "" @@ -203288,6 +207527,15 @@ msgstr "" msgid "%s is now level %d!" msgstr "" +#: src/debug_menu.cpp src/iuse.cpp +#: src/iuse.cpp +msgid "There's no vehicle there." +msgstr "" + +#: src/debug_menu.cpp +msgid "By how much? (in kJ, negative to discharge)" +msgstr "" + #: src/descriptions.cpp #, c-format msgid "" @@ -203511,15 +207759,6 @@ msgid "" "Roof: %s" msgstr "" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -204218,138 +208457,182 @@ msgid "Liked" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "" @@ -206303,6 +210586,11 @@ msgctxt "action" msgid "open" msgstr "" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -206442,6 +210730,11 @@ msgstr "" msgid "Your local position: %d, %d, %d" msgstr "" +#: src/game.cpp +#, c-format +msgid "Total NPCs within %d OMTs: %d. %d are static NPCs." +msgstr "" + #: src/game.cpp msgid "East:" msgstr "" @@ -207383,6 +211676,10 @@ msgstr "" msgid "You aren't holding something you can reload." msgstr "" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -207812,11 +212109,24 @@ msgstr "" msgid "You cannot haul items here." msgstr "" +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -209188,11 +213498,6 @@ msgstr "" msgid "The %s is in the way!" msgstr "" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -209923,6 +214228,10 @@ msgstr "" msgid "Creature whitelisted: %s" msgstr "" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "" @@ -211268,11 +215577,28 @@ msgstr "" msgid "There is a %s there. Take down?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -211646,6 +215972,10 @@ msgstr "" msgid "Splint broken limbs" msgstr "" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "" @@ -211672,6 +216002,76 @@ msgstr "" msgid " doesn't have limbs that require splinting." msgstr "" +#: src/iexamine.cpp +msgid "You don't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "This mill contains %s, which can't be milled!" @@ -212068,6 +216468,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "" @@ -212076,6 +216481,10 @@ msgstr "" msgid "Body parts" msgstr "" +#: src/init.cpp +msgid "Weather types" +msgstr "" + #: src/init.cpp msgid "Field types" msgstr "" @@ -212643,7 +217052,7 @@ msgstr "" msgid "There are no available choices" msgstr "" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "" @@ -213066,7 +217475,7 @@ msgid "" "very bad idea." msgstr "" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -213510,10 +217919,6 @@ msgstr "" msgid "Weight capacity bonus: " msgstr "" -#: src/item.cpp -msgid "Storage: " -msgstr "" - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "" @@ -213779,6 +218184,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -213802,9 +218235,19 @@ msgstr "" msgid "* This item is not repairable." msgstr "" +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a list of items. +#. ~ Bold text in the middle makes it easier to see where the second list starts. +#: src/item.cpp +#, c-format +msgid "" +"Disassembly takes %1$s, requires %2$s and might yield: %3$s." msgstr "" #: src/item.cpp @@ -214512,8 +218955,9 @@ msgstr "" msgid "That %s doesn't have room to expand." msgstr "" -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "" @@ -214637,10 +219081,67 @@ msgstr "" msgid "Execute which action?" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" +msgstr[1] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "" @@ -214677,6 +219178,11 @@ msgstr "" msgid "Result of 100 spawns:" msgstr "" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "" + #: src/item_location.cpp msgid "inventory" msgstr "" @@ -214699,6 +219205,10 @@ msgstr "" msgid "Pocket %d:" msgstr "" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "" @@ -214858,6 +219368,34 @@ msgstr "" msgid "not enough space" msgstr "" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "" @@ -214925,14 +219463,6 @@ msgstr "" msgid " takes some antibiotics." msgstr "" -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "" - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "" - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -215825,10 +220355,6 @@ msgstr "" msgid "There is nothing to siphon nearby." msgstr "" -#: src/iuse.cpp -msgid "There's no vehicle there." -msgstr "" - #: src/iuse.cpp msgid "With a snarl, the combat chainsaw screams to life!" msgstr "" @@ -216449,10 +220975,6 @@ msgstr "" msgid "Sokoban" msgstr "" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "" @@ -219331,7 +223853,7 @@ msgstr "" msgid "You can't place a %s there. It contains a trap already." msgstr "" -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "" @@ -220501,6 +225023,10 @@ msgstr "" msgid "Intermediate" msgstr "" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "" @@ -221064,6 +225590,15 @@ msgstr "" msgid "Summon" msgstr "" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "" @@ -221084,6 +225619,10 @@ msgstr "" msgid "Spawned" msgstr "" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "" @@ -221136,6 +225675,15 @@ msgstr "" msgid "%s wounds are closing up!" msgstr "" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "" @@ -221593,29 +226141,22 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "" - -#: src/map.cpp -msgid "You fail to disarm the trap." +msgid "Something has crawled out of the %s plants!" msgstr "" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" +#, c-format +msgid "Something has crawled out of the %s!" msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" +msgid "You've spotted a %1$ss!" msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" +msgid " triggers a %s!" msgstr "" #: src/map_extras.cpp @@ -223161,6 +227702,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -226908,6 +231462,11 @@ msgstr "" msgid "zombie slave" msgstr "" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "" + #: src/monexamine.cpp msgid "Rename" msgstr "" @@ -227866,12 +232425,6 @@ msgstr "" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "" -msgstr[1] "" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -230585,6 +235138,14 @@ msgstr "" msgid "Pulp Adjacent" msgstr "" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "" @@ -231924,11 +236485,14 @@ msgid "A scaling factor that determines density of item spawns." msgstr "" #: src/options.cpp -msgid "NPC spawn rate scaling factor" +msgid "Random NPC spawn time" msgstr "" #: src/options.cpp -msgid "A scaling factor that determines density of dynamic NPC spawns." +msgid "" +"Baseline average number of days between random NPC spawns. Average duration " +"goes up with the number of NPCs already spawned. Set to 0 days to disable " +"random NPCs." msgstr "" #: src/options.cpp @@ -232050,37 +236614,6 @@ msgid "" "If true, spawn zombies at shelters. Makes the starting game a lot harder." msgstr "" -#: src/options.cpp -msgid "Static NPCs" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, static NPCs will spawn at pre-defined locations. Requires world " -"reset." -msgstr "" - -#: src/options.cpp -msgid "Starting NPCs spawn" -msgstr "" - -#: src/options.cpp -msgid "" -"Determines whether starting NPCs should spawn, and if they do, how exactly." -msgstr "" - -#: src/options.cpp -msgid "Scenario-based" -msgstr "" - -#: src/options.cpp -msgid "Random NPCs" -msgstr "" - -#: src/options.cpp -msgid "If true, the game will randomly spawn NPCs during gameplay." -msgstr "" - #: src/options.cpp msgid "Mutations by radiation" msgstr "" @@ -232089,17 +236622,6 @@ msgstr "" msgid "If true, radiation causes the player to mutate." msgstr "" -#: src/options.cpp -msgid "Z-levels" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" - #: src/options.cpp msgid "Character point pools" msgstr "" @@ -233217,6 +237739,10 @@ msgstr "" msgid "Very hot!" msgstr "" +#: src/panels.cpp +msgid "Comfortable" +msgstr "" + #: src/panels.cpp msgid "Very cold!" msgstr "" @@ -234658,6 +239184,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "" +#: src/player_display.cpp +msgid "Starving" +msgstr "" + #: src/player_display.cpp msgid "Underfed" msgstr "" @@ -234751,6 +239281,10 @@ msgid "" "\n" msgstr "" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help " @@ -235866,6 +240400,14 @@ msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "" msgstr[1] "" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" +msgstr[1] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -236737,6 +241279,15 @@ msgctxt "grammatical gender list" msgid "n" msgstr "" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "" @@ -238404,6 +242955,34 @@ msgstr "" msgid "pile-up" msgstr "" +#: src/vehicle_move.cpp +msgid "Smart controller does not support flying vehicles." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller detects only a single controllable engine." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller is designed to control more than one engine." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller does not support more than five engines." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller is shutting down." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller failed to start an engine." +msgstr "" + +#: src/vehicle_move.cpp +msgid "Smart controller optimizes engine state." +msgstr "" + #: src/vehicle_move.cpp #, c-format msgid "The %s is too leaky!" @@ -238776,6 +243355,11 @@ msgctxt "electronics menu option" msgid "water purifier" msgstr "" +#: src/vehicle_use.cpp +msgctxt "electronics menu option" +msgid "smart controller" +msgstr "" + #: src/vehicle_use.cpp msgid "Turn off camera system" msgstr "" @@ -239615,54 +244199,6 @@ msgstr "" msgid "The weather changed to %s!" msgstr "" -#: src/weather_data.cpp -msgid "Clear" -msgstr "" - -#: src/weather_data.cpp -msgid "Sunny" -msgstr "" - -#: src/weather_data.cpp -msgid "Cloudy" -msgstr "" - -#: src/weather_data.cpp -msgid "Light Drizzle" -msgstr "" - -#: src/weather_data.cpp -msgid "Drizzle" -msgstr "" - -#: src/weather_data.cpp -msgid "Rain" -msgstr "" - -#: src/weather_data.cpp -msgid "Thunder Storm" -msgstr "" - -#: src/weather_data.cpp -msgid "Acidic Drizzle" -msgstr "" - -#: src/weather_data.cpp -msgid "Acid Rain" -msgstr "" - -#: src/weather_data.cpp -msgid "Flurries" -msgstr "" - -#: src/weather_data.cpp -msgid "Snowing" -msgstr "" - -#: src/weather_data.cpp -msgid "Snowstorm" -msgstr "" - #: src/wish.cpp msgid "Nonvalid" msgstr "" @@ -239885,6 +244421,10 @@ msgstr "" msgid "--NO AVAILABLE MODS--" msgstr "" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "" diff --git a/lang/po/de.po b/lang/po/de.po index c6cd91e0ff9af..fa42264846d0d 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -19,18 +19,18 @@ # kurtice087 , 2020 # Chris , 2020 # Ziv Edo, 2020 -# Brett Dong , 2020 # Björn Hartmann , 2020 # Pupsi , 2020 # Matyas Taller , 2020 # Vlasov Vitaly , 2020 +# Brett Dong , 2020 # Wuzzy , 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Wuzzy , 2020\n" "Language-Team: German (https://www.transifex.com/cataclysm-dda-translators/teams/2217/de/)\n" @@ -313,7 +313,6 @@ msgstr[0] "Stein" msgstr[1] "Steine" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -959,6 +958,17 @@ msgstr "" "Ein Gemisch aus Sauerstoff und Stickstoff im tauchfähigen " "Mischungsverhältnis." +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -4983,6 +4993,24 @@ msgstr "" "verwendet werden kann. Am besten man benutzt eine Art Gasmaske oder anderen " "Atemschutz." +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -6198,7 +6226,7 @@ msgstr[1] "gelbe Farbe" msgid "A can of yellow paint." msgstr "Ein Farbeimer mit gelber Farbe." -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "" @@ -6278,7 +6306,6 @@ msgstr[1] "Gold" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -6366,7 +6393,6 @@ msgstr[0] "kleines Metallblech" msgstr[1] "kleine Metallbleche" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "Ein kleines Metallblech." @@ -7900,70 +7926,6 @@ msgstr[1] "" msgid "Seeing this is a bug." msgstr "Das ist ein Bug, der an sich nicht zu sehen sein sollte." -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "" -msgstr[1] "" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -8288,8 +8250,6 @@ msgstr[1] "Paar Ohrstöpsel" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "Ohrstöpsel in Industriestärke. Sie passen ins Ohr." @@ -8586,7 +8546,7 @@ msgstr[1] "Munitionstaschen" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "" #: lang/json/ARMOR_from_json.py @@ -8694,11 +8654,9 @@ msgstr[1] "Köcher" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." msgstr "" -"Ein Lederköcher, der an der Taille getragen wird und 20 Pfeile enthalten " -"kann. Aktiviere ihn, um Pfeile einzulagern." #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -8710,10 +8668,8 @@ msgstr[1] "Birkenrindenköcher" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." +"20 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Ein Köcher aus Birkenrindenstreifen, der an der Taille getragen wird und 20 " -"Pfeile aufnehmen kann. Aktiviere ihn, um Pfeile darin zu lagern." #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -8725,13 +8681,10 @@ msgstr[1] "große Köcher" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" -"Ein großer, mit Metall getrimmer Lederköcher, der auf dem Rücken getragen " -"wird und 80 Pfeile beinhalten kann. Historisch benutzt von Bogenschützen zu " -"Pferd, statt von Bogenschützen zu Fuß, aber keiner von IHNEN musste gegen " -"Zombies kämpfen. Aktiviere ihn, um Pfeile einzulagern." #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -8743,11 +8696,8 @@ msgstr[1] "große Birkenrindenköcher" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." +"hold 60 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Ein großer aus Birkenrindenstreifen gewobener Köcher, der 60 Pfeile " -"enthalten kann. Er wird am Rücken getragen. Aktiviere ihn, um Pfeile " -"einzulagern." #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -10281,8 +10231,6 @@ msgstr[0] "Paar Socken" msgstr[1] "Paar Socken" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "Socken. Sie gehören auf die Füße." @@ -12275,6 +12223,18 @@ msgid "" "heat." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -18764,7 +18724,6 @@ msgstr[1] "" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "Deine Energierüstung aktiviert sich." @@ -19133,7 +19092,6 @@ msgstr[0] "Rucksack" msgstr[1] "Rucksäcke" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "" @@ -19244,7 +19202,6 @@ msgstr[0] "Aktentasche" msgstr[1] "Aktentaschen" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "Nützlich zum Transport von Geld, Dokumenten oder Schmuggelwaren." @@ -19601,14 +19558,10 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." msgstr "" -"Eine mittelgroßer Rollenkoffer, der hauptsächlich zum Transport von Kleidung" -" und anderen Besitztümern auf Reisen verwendet wird. Er bietet einen einen " -"angemessenen Lagerplatz, aber es ist nicht sonderlich bequem, ihn " -"herumzuschleppen." #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -20246,7 +20199,6 @@ msgstr[0] "Schutzanzug" msgstr[1] "Schutzanzüge" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -21229,7 +21181,6 @@ msgstr[0] "langärmeliges Hemd" msgstr[1] "langärmelige Hemden" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "Ein langärmeliges Hemd." @@ -22021,6 +21972,19 @@ msgid "" "weight." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "Cestus" +msgstr[1] "Cestusse" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -23502,61 +23466,15 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" msgstr[0] "" msgstr[1] "" +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test power armor'} -#: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" #: lang/json/BATTERY_from_json.py @@ -23983,8 +23901,8 @@ msgid_plural "Aero-Evaporator CBMs" msgstr[0] "Luftverdampfungs-KBM" msgstr[1] "Luftverdampfungs-KBMs" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -25145,8 +25063,8 @@ msgid_plural "Internal Furnace CBMs" msgstr[0] "Interner-Ofen-KBM" msgstr[1] "Interner-Ofen-KBMs" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -25261,8 +25179,8 @@ msgid_plural "Wind Turbine CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -25270,19 +25188,6 @@ msgid "" "power level." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -25339,14 +25244,40 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "Ionenüberlastungserzeuger-KBM" msgstr[1] "Ionenüberlastungserzeuger-KBMs" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -25518,6 +25449,35 @@ msgstr[1] "" msgid "template for a paperback nonfiction book" msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -26997,8 +26957,8 @@ msgstr[1] "" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -28189,10 +28149,8 @@ msgstr[1] "Abenteuerromane" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." +"in the heart of the African continent." msgstr "" -"Die bewegende Erzählung vom Wettlauf gegen die Zeit nach der Suche nach " -"einer verlorenen Stadt im dunklen Herzen des afrikanischen Kontinents." #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -28209,32 +28167,6 @@ msgstr "" "Eine packende Erzählung über zwei Freunde, die mit dem Überleben in den " "Staßen von New York City kämpfen." -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "Bildungsroman" -msgstr[1] "Bildungsromane" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "" -"Eine klassische Erzählung über das Erwachsenwerden. Sie zeigt die lustigen " -"und schmerzhaften Erfahrungen eines jungen Mannes mit dem Leben, der Liebe " -"und dem Sex." - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "" -"Ein Bilderroman über ein junges Mädchen, das im Iran während der 1980er lebt" -" und sieht, wie sich die Welt um sie herum verändert, während Irak ihr Land " -"erobert." - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -28367,77 +28299,6 @@ msgid "A detective investigates an unusual murder in a secluded location." msgstr "" "Ein Detektiv geht einem ungewöhnlichen Mord in einer abgelegenen Villa nach." -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "Groschenroman" -msgstr[1] "Groschenromane" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "" -"Eine Erzählung über einen hartgesottenen Inspektor mit knallharter Action " -"und Intrige." - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -28610,11 +28471,8 @@ msgstr[1] "Samurai-Romane" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." +"marauding outlaws. This hardback is quite hefty." msgstr "" -"Die klassische Erzählung eines wandernden Schwertkämpfers, der in eine " -"kleine Siedlung kommt und dafür angeheuert wird, den Bürgern dabei zu " -"helfen, sich vor einer Bande plündernder Banditen zu verteidigen." #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -28661,16 +28519,18 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "" msgstr[1] "" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" #: lang/json/BOOK_from_json.py @@ -28699,327 +28559,6 @@ msgid "" "nuclear destruction isn't much of an influence on human nature." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "Science-Fiction-Roman" -msgstr[1] "Science-Fiction-Romane" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "Aliens, Strahlenkanonen und Raumschiffe." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -30234,6 +29773,584 @@ msgid "" " key work in the existentialist tradition." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "Groschenroman" +msgstr[1] "Groschenromane" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "" +"Eine Erzählung über einen hartgesottenen Inspektor mit knallharter Action " +"und Intrige." + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "Science-Fiction-Roman" +msgstr[1] "Science-Fiction-Romane" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "Aliens, Strahlenkanonen und Raumschiffe." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -30557,8 +30674,9 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" #: lang/json/BOOK_from_json.py @@ -32005,11 +32123,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "" msgstr[1] "" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -32019,24 +32138,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "" msgstr[1] "" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "" msgstr[1] "" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -32045,11 +32166,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "" msgstr[1] "" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -32060,11 +32182,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "" msgstr[1] "" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -32073,11 +32196,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "" msgstr[1] "" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -32087,11 +32211,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "" msgstr[1] "" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -32101,11 +32226,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "" msgstr[1] "" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -32115,11 +32241,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "" msgstr[1] "" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -32127,6 +32254,65 @@ msgid "" " unsavory elements." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "Bildungsroman" +msgstr[1] "Bildungsromane" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "" +"Eine klassische Erzählung über das Erwachsenwerden. Sie zeigt die lustigen " +"und schmerzhaften Erfahrungen eines jungen Mannes mit dem Leben, der Liebe " +"und dem Sex." + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -32534,6 +32720,19 @@ msgid "" "your pain at bay." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -33808,6 +34007,47 @@ msgid "" "harmless." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -34107,6 +34347,20 @@ msgid "" "on combining magic with EM radiation." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -34159,36 +34413,6 @@ msgid "" " - F. \"." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -35951,12 +36175,7 @@ msgstr[1] "" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." +msgid "Meat from a heavily mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -35969,10 +36188,8 @@ msgstr[1] "" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -36052,15 +36269,8 @@ msgstr[1] "" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" +msgid "This is a cooked chunk of meat from a mutated animal." msgstr "" -"Dies ist ein gekochtes Fleischstück von einem mutierten Tier. Es hat eine " -"beunruhigende, schwammige Struktur, aber ansonsten schmeckt es… im " -"Wesentlichen normal. Hoffentlich hast du all die Haare und Knochenstückchen " -"herausbekommen…" #: lang/json/COMESTIBLE_from_json.py msgid "cooked scrap of mutant meat" @@ -36068,6 +36278,14 @@ msgid_plural "cooked scraps of mutant meat" msgstr[0] "gekochter Mutantenfleischfetzen" msgstr[1] "gekochte Mutantenfleischfetzen" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -36102,6 +36320,17 @@ msgstr "" "lebenswichtiger Vitamine, aber für die meisten Menschen jedoch eher etwas " "Ekliges, zumindest dann, wenn es nicht sehr sorgfältig zubereitet wurde." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -36306,6 +36535,17 @@ msgstr "" "rohen Gestalt, aber zumindest wurden alle Parasiten durch das Kochen " "abgetötet." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -36492,12 +36732,10 @@ msgstr[1] "Mutantenfettklumpen" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" -"Frisch geschlachtetes Fett von einem stark mutierten Tier. Du könntest es " -"roh essen, aber es ist besser als Zutat in anderen Nahrungsmitteln oder " -"Projekten geeignet." #: lang/json/COMESTIBLE_from_json.py msgid "mutant tallow" @@ -37967,19 +38205,17 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "Wasser mit Zucker- oder Honigzugabe. Schmeckt okay." #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" +msgid "black tea" +msgid_plural "black teas" msgstr[0] "" msgstr[1] "" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" -"Das Getränk der Gentlemen überall, es wird gemacht, indem man heißes Wasser " -"auf die Blätter der Teepflanze /Camellia sinensis/ gießt." #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -38034,6 +38270,33 @@ msgstr "" "Schrilles Mineralwasser, so schrill, dass es dich nur beim Festhalten der " "Flasche schrill fühlen lässt." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -39956,6 +40219,32 @@ msgstr "" "Gesalzene Chips aus Mais-Tortillas. Mit Hackfleisch und bedeckt in Käse. " "Lecker." +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -44191,7 +44480,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "" @@ -45162,30 +45450,56 @@ msgstr "" "Hülsenfrüchten. Das ist perfekt für kleine Vögel." #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "Hundefutter" -msgstr[1] "Hundefutter" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'wet dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str_sp': 'dog food'} +#. ~ Description for {'str_sp': 'dry dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." msgstr "" -"Dies ist Futter für Hunde. Es riecht seltsam, aber Hunde scheinen es zu " -"mögen." #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "Katzenfutter" -msgstr[1] "Katzenfutter" +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str_sp': 'cat food'} +#. ~ Description for {'str_sp': 'wet cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." msgstr "" -"Dies ist Futter für Katzen. Es riecht seltsam, aber Katzen scheinen es zu " -"mögen." #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -45224,16 +45538,42 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -45332,14 +45672,11 @@ msgstr[1] "Proteinrationen" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -46214,12 +46551,12 @@ msgstr "" "etwas Weiterverarbeitung, um ihn zu extrahieren." #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "Teeblatt" -msgstr[1] "Teeblätter" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "Dried leaves of a tropical plant. You can boil them into tea, or you can " @@ -46228,6 +46565,19 @@ msgstr "" "Getrocknete Blätter einer Tropenpflanze. Du kannst sie zu Tee kochen oder du" " kannst sie einfach roh essen. Sie sind allerdings nicht sehr sättigend." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -49115,6 +49465,72 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -49504,6 +49920,12 @@ msgid_plural "ankylosaurus eggs" msgstr[0] "" msgstr[1] "" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "" +msgstr[1] "" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -49838,7 +50260,7 @@ msgid_plural "scream mushrooms" msgstr[0] "" msgstr[1] "" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -50028,113 +50450,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -51081,21 +51396,6 @@ msgstr[1] "Aluminiumdosen" msgid "An aluminum can, like what soda comes in." msgstr "Eine Aluminiumdose, wo Sachen wie Limo reinkommen." -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "geöffnete Aluminiumdose" -msgstr[1] "geöffnete Aluminiumdosen" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Eine Aluminiumdose, wo Sachen wie Limo reinkommen. Diese hier ist geöffnet " -"und kann nicht so einfach dicht verschlossen werden." - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -51105,23 +51405,10 @@ msgstr[1] "Pappkartons" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "geöffneter Pappkarton" -msgstr[1] "geöffnete Pappkartons" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -51144,19 +51431,6 @@ msgstr[1] "Kleine Konservendosen" msgid "A small tin can, like what tuna comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "Kleine Konservendose (offen)" -msgstr[1] "Kleine Konservendosen (offen)" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -51168,19 +51442,6 @@ msgstr[1] "Mittlere Konservendosen" msgid "A medium tin can, like what soup comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "Mittlere Konservendose (offen)" -msgstr[1] "Mittlere Konservendosen (offen)" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -51264,17 +51525,6 @@ msgstr[1] "Plastikbecher" msgid "A small, vacuum formed cup." msgstr "Ein kleiner vakuumgeformter Becher." -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "geöffneter Plastikbecher" -msgstr[1] "geöffnete Plastikbecher" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "Ein kleiner vakuumgeformter Becher. Praktisch Müll." - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -51463,7 +51713,6 @@ msgstr[0] "Plastikkrug" msgstr[1] "Plastikkrüge" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "" @@ -51580,7 +51829,6 @@ msgstr[0] "kleiner Wasserbeutel" msgstr[1] "kleine Wasserbeutel" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -51720,19 +51968,6 @@ msgid "" "food." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "Große Konservendose (offen)" -msgstr[1] "Große Konservendosen (offen)" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -52284,6 +52519,34 @@ msgstr "" "Ein Stück eines Exoskeletts eines Insekten. Es ist leicht und sehr " "langlebig." +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -52358,6 +52621,34 @@ msgstr "" "Filzfetzen, die für die Lagerung eng zusammengebunden wurden. Demontiere " "dies, um es auszupacken." +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -53658,8 +53949,8 @@ msgid_plural "lotus flowers" msgstr[0] "" msgstr[1] "" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -55230,6 +55521,17 @@ msgstr "" "entfernt wurde. Sie ist für sich alleine und ohne die notwendigen Teile als " "Waffe unbrauchbar." +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "Knochenrüstungssatz" +msgstr[1] "Knochenrüstungssätze" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "Leichte Knochenrüstungsplattierung für Fahrzeuge." + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -56927,6 +57229,58 @@ msgid "" "wound." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -58761,7 +59115,7 @@ msgstr[1] "" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" #: lang/json/GENERIC_from_json.py @@ -58962,6 +59316,20 @@ msgid "" "anything on its own." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -59690,7 +60058,7 @@ msgstr[1] "" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" #. ~ Description for {'str': 'lucerne hammer'} @@ -60128,7 +60496,6 @@ msgstr[0] "spitzer Stock" msgstr[1] "spitze Stöcke" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "Ein einfacher Holzstock, vom dem sein Ende geschärft wurde." @@ -60236,20 +60603,15 @@ msgstr[1] "Hellebarden" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." +" attached to a long sturdy stick." msgstr "" -"Dies ist eine vielseitige Stangenwaffe mit einer Axtklinge, einem Stachel " -"und anderen lustigen Dingen, die an einem langen Stock befestigt wurden." #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." +"spike, and other fun things attached to a thick pole." msgstr "" -"Dies ist ein stumpfes, billig angefertigtes Replikat einer Stangenwaffe mit " -"einer Axtklinge, einem Stachel und anderen lustigen Dingen, die an einem " -"langen Stock befestigt wurden." #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -60937,19 +61299,6 @@ msgstr "" "gestaltet wurde, dass sie unter und gegen die Handinnenseite verborgen " "werden kann. Auch »Baghnakh« genannt." -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "Cestus" -msgstr[1] "Cestusse" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -61129,6 +61478,110 @@ msgid "" "somewhat warm to the touch." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -61223,7 +61676,6 @@ msgstr[0] "Rohr" msgstr[1] "Rohre" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -61455,7 +61907,13 @@ msgstr "" "kommerziellen Verpacken oder zum Schutz eines Hauses vor schweren " "Wettereinflüssen benutzt wird. " -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -62433,11 +62891,9 @@ msgstr[1] "selbstgebaute Glefen" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." msgstr "" -"Dies ist eine große Klinge, die an einem langen Stock angebracht wurde. Sie " -"könnte einen bemerkenswerten Schaden verursachen." #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -62616,6 +63072,21 @@ msgstr[1] "" msgid "A stapler for fastening sheets of paper together." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -62910,6 +63381,19 @@ msgstr "" "Fahrzeug solange mit Bootsrümpfe, bis es schwimmt. Befestige dann Ruder oder" " einen Motor, um das Boot in Fahrt zu bringen." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -63954,7 +64438,6 @@ msgstr[0] "Metallblech" msgstr[1] "Metallbleche" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "Ein dünnes Blech." @@ -64083,17 +64566,6 @@ msgstr "" "Widerstandsfähige siliziumdioxidbeschichtete Chitinplattierung für " "Fahrzeuge." -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "Knochenrüstungssatz" -msgstr[1] "Knochenrüstungssätze" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "Leichte Knochenrüstungsplattierung für Fahrzeuge." - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -64416,8 +64888,8 @@ msgid_plural "workbenches" msgstr[0] "Arbeitstisch" msgstr[1] "Arbeitstische" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -64612,6 +65084,17 @@ msgstr "" "Ein Metallwasserhahn, der an einem Wassertank für die einfache Entnahme " "angebracht werden kann." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -65237,6 +65720,18 @@ msgstr[1] "" msgid "It has given you an answer, but you are yet to ask anything." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -65331,7 +65826,20 @@ msgstr[1] "" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." msgstr "" #: lang/json/GENERIC_from_json.py @@ -65954,6 +66462,17 @@ msgid "" "battles is bookmarked." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -65967,6 +66486,66 @@ msgid "" "art." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -65989,7 +66568,7 @@ msgstr[1] "" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" @@ -66114,7 +66693,7 @@ msgstr[1] "" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" #: lang/json/GENERIC_from_json.py @@ -67501,140 +68080,6 @@ msgid "" "much more expensive." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "FEUERWAFFEN" @@ -70614,6 +71059,34 @@ msgid "" "thrower." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -71098,30 +71571,6 @@ msgid "" "tips." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "Standard" @@ -71137,8 +71586,11 @@ msgstr "" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." -msgstr "Verschiebt das Spiel vom Realismus mehr hin zu Sci-Fi." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." +msgstr "" #: lang/json/MOD_INFO_from_json.py msgid "Blaze Industries" @@ -71179,8 +71631,9 @@ msgstr "" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -71390,16 +71843,6 @@ msgstr "" msgid "Allows stats to raise via skill progression." msgstr "" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "Städtebildung" @@ -71721,6 +72164,49 @@ msgid "" "able to give them back some humanity. If only they cared…" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -71974,6 +72460,23 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -73534,6 +74037,17 @@ msgstr "" "Augen all der Köpfe huschen schnell umher und die Münder bilden einen Chor " "aus ächzenden Schreien." +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "Mensch" +msgstr[1] "Menschen" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -73987,6 +74501,21 @@ msgstr "" "mit seinen tödlichen Klauen, bevor er ihr mit seinen enormen Reißzähnen den " "Todesstoß versetzt." +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -75881,6 +76410,19 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -76448,6 +76990,20 @@ msgstr[1] "" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -76540,6 +77096,158 @@ msgid "" "looking for patient to assist." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "Skeletthund" +msgstr[1] "Skeletthunde" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"Dieser ehemals Hundeartige hat all seine Haut verloren, was eine Kruste aus " +"verschmolzenen Knochen und Rippen offenbart. Ihm fehlt jegliches Fleisch. " +"Dieser gehende Anzug aus Knochen scheint von einem Netz aus Venen und Sehnen" +" gesteuert zu werden, durch denen ein glitzernder schwarzer Glibber " +"pulsiert." + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -76571,26 +77279,6 @@ msgstr "" "Die deformierte, wiederbelebte Leiche eines Hundeartigen und ein sehniges " "Biest, das leicht seine zweibeinigen Freunde abhängen kann." -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "Skeletthund" -msgstr[1] "Skeletthunde" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"Dieser ehemals Hundeartige hat all seine Haut verloren, was eine Kruste aus " -"verschmolzenen Knochen und Rippen offenbart. Ihm fehlt jegliches Fleisch. " -"Dieser gehende Anzug aus Knochen scheint von einem Netz aus Venen und Sehnen" -" gesteuert zu werden, durch denen ein glitzernder schwarzer Glibber " -"pulsiert." - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -76721,6 +77409,32 @@ msgstr "" "Ein ansonsten normalaussehender Puma, außer, dass seine Hinterläufe " "angeschwollen und seine Augen mit einem schwarzen Glibber unterlaufen sind." +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -77355,6 +78069,46 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -79361,6 +80115,19 @@ msgstr "" "Ein gewaltiger nashornähnlicher Dinosaurier mit einer knochigen Mähne, aus " "der drei große Hörner heraustreten." +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -79388,6 +80155,19 @@ msgstr "" "Dieser Dinosaurier sieht wie ein gigantisches prähistorisches Gürteltier " "aus. Sein Schwanz endet mit einem gewaltigen stacheligem Knochenknüppel." +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -79620,6 +80400,102 @@ msgid_plural "magenta and green hatchlings" msgstr[0] "" msgstr[1] "" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -79632,12 +80508,106 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -79645,6 +80615,403 @@ msgid "" "sickle-like claw." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -80114,6 +81481,19 @@ msgid "" "off creatures that disturb it." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -80400,19 +81780,6 @@ msgstr "" "Hilfstruppen für den Einzelkampf. Entworfen, um sich nahtlos mit " "traditionelleren Truppen zu integrieren." -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -80787,19 +82154,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "" @@ -80812,6 +82166,14 @@ msgstr "" msgid "a bird" msgstr "" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "" @@ -81546,6 +82908,22 @@ msgstr "" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "" @@ -81669,6 +83047,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "" @@ -81891,6 +83280,15 @@ msgstr "" msgid "Uses a little fatigue" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -81949,8 +83347,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "" @@ -82317,6 +83715,10 @@ msgstr "" msgid "Haste" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "" @@ -82438,10 +83840,10 @@ msgstr "" msgid "Jolt" msgstr "" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "" @@ -82510,6 +83912,31 @@ msgstr "" msgid "Wall of Fog" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "" @@ -82622,65 +84049,37 @@ msgstr "" msgid "X-ray Vision" msgstr "" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "" - -#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." +msgid "Knock" msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "" - -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." msgstr "" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" +msgid "Improved Knock" msgstr "" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" msgstr "" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" #: lang/json/TOOLMOD_from_json.py @@ -85326,28 +86725,33 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" msgstr[0] "" msgstr[1] "" +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" msgid_plural "Belts of Weaponry" @@ -86452,6 +87856,19 @@ msgid_plural "bionic firestarters" msgstr[0] "Bionikanzünder" msgstr[1] "Bionikanzünder" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -86525,7 +87942,7 @@ msgstr[1] "" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "Licht" @@ -89439,12 +90856,6 @@ msgid_plural "pseudo butter churns" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -90410,13 +91821,11 @@ msgstr[1] "Smartphones" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "Du aktivierst das Taschenlampen-Programm." #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "Das Smartphone ist nicht ausreichend geladen." @@ -91929,7 +93338,6 @@ msgstr[0] "Feuerwehraxt" msgstr[1] "Feuerwehräxte" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -91946,7 +93354,6 @@ msgstr[0] "Halligan-Tool" msgstr[1] "Halligan-Tools" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -91981,17 +93388,37 @@ msgid_plural "throwable fire extinguishers" msgstr[0] "Wurf-Feuerlöscher" msgstr[1] "Wurf-Feuerlöscher" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" msgstr "" -"Dies ist ein Feuerlöscher im Formfaktor einer Granate. Er ist nicht so " -"effektiv wie ein regulärer Feuerlöscher, aber du kannst ihn aus der Ferne " -"anwenden. Er wird durch Hitze aktiviert, also wirf ihn einfach in die " -"Flammen." #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -92237,6 +93664,30 @@ msgstr "" "funktioniert schon ganz gut als Schaufel, aber ist wahrhaft kein Vergleich " "zu einer richtigen Schaufel." +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -92267,6 +93718,28 @@ msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "" "Dies ist ein Grabewerkzeug. Benutze es, um Gruben neben dir zu graben." +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -93110,6 +94583,12 @@ msgstr "" "richtigen Werkzeugen kombiniert wird, kannst du sie für die Metallarbeit " "benutzen." +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -93267,6 +94746,18 @@ msgstr "" "Dies ist eine lange Metallzange. Sie wird überlicherweise zum Kochen oder in" " Metallverarbeitungsrezepten benutzt." +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -93441,6 +94932,19 @@ msgstr "" " dich vorm Boden, was das Schlafen erleichtert. Aktiviere die Matte, um sie " "aufzurollen oder auf den Boden zu platzieren." +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -95459,7 +96963,6 @@ msgstr[0] "Lumpen" msgstr[1] "Lumpen" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -95957,12 +97460,12 @@ msgstr "" "auszuschalten." #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "Steinerne Handaxt" -msgstr[1] "Steinerne Handäxte" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -95970,12 +97473,12 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "Metallene Handaxt" -msgstr[1] "Metallene Handäxte" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -96102,6 +97605,12 @@ msgstr "" " Ziegel zu brennen, aber du könntest ihn dazu verwenden, alles Mögliche aus " "Ton zu machen." +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -96280,7 +97789,6 @@ msgstr[0] "Scherenwagenheber" msgstr[1] "Scherenwagenheber" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "" @@ -96543,7 +98051,6 @@ msgstr[0] "Schraubenzieher" msgstr[1] "Schraubenzieher" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -96594,7 +98101,6 @@ msgstr[0] "Lötkolben" msgstr[1] "Lötkolben" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -97039,14 +98545,14 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" +msgid "pseudo atomic butter churn" +msgid_plural "pseudo atomic butter churns" msgstr[0] "" msgstr[1] "" #: lang/json/TOOL_from_json.py -msgid "pseudo atomic butter churn" -msgid_plural "pseudo atomic butter churns" +msgid "precision solderers" +msgid_plural "precision solderers" msgstr[0] "" msgstr[1] "" @@ -97246,6 +98752,21 @@ msgid "" "specialized tools." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -98100,6 +99621,66 @@ msgid_plural "greater wands of cone of cold" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -98280,6 +99861,66 @@ msgid_plural "disposable greater wands of cone of cold" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -98416,75 +100057,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -98851,7 +100423,7 @@ msgid "Pheidippides was a hack" msgstr "" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "" #: lang/json/achievement_from_json.py @@ -98882,14 +100454,628 @@ msgstr "" msgid "Freeman's favorite" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "Holzfäller" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "Dr. med." + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "Fallensteller" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "Minesweeper" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "Schneider" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "Überlebenskünstler" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "Soldat" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "Einbrecherin" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "" @@ -99342,6 +101528,11 @@ msgstr "" msgid "canceling activity serialized with legacy code" msgstr "" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "Fusionszelle" @@ -99644,6 +101835,10 @@ msgstr "sprühbare Chemikalie" msgid "compressed air" msgstr "" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "" @@ -99696,10 +101891,6 @@ msgstr "" msgid "mana energy" msgstr "" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "Adrenalinpumpe" @@ -101329,23 +103520,6 @@ msgstr "" msgid "Wind Turbines" msgstr "" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" -"Ihre Hände wurden mit präzisen Lötwerkzeugen, Drahtschneidern und " -"Kabelspulen ausgestattet. Sie sind zu klein, um in den meisten Handwerken " -"verwendet zu werden, aber da keine geeigneten Maschinen vorhanden sind, sind" -" sie für die Erstellung von Bioniken ohne bessere Werkzeuge unerlässlich." - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "" @@ -101392,6 +103566,23 @@ msgid "" "and fast." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"Ihre Hände wurden mit präzisen Lötwerkzeugen, Drahtschneidern und " +"Kabelspulen ausgestattet. Sie sind zu klein, um in den meisten Handwerken " +"verwendet zu werden, aber da keine geeigneten Maschinen vorhanden sind, sind" +" sie für die Erstellung von Bioniken ohne bessere Werkzeuge unerlässlich." + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -101739,8 +103930,64 @@ msgstr "" msgid "Merciful" msgstr "" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "Alle" @@ -102369,10 +104616,6 @@ msgstr "Wand gelb anmalen" msgid "Take Paint Off Wall" msgstr "Farbe von Wand entfernen" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "Teppich entfernen" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "Boden mit roten Teppich belegen" @@ -102413,6 +104656,30 @@ msgstr "" msgid "Mine Upstair" msgstr "Nach oben abbauen" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "Fahrzeugbau beginnen" @@ -104439,7 +106706,7 @@ msgstr "" msgid "You mount your steed." msgstr "" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "In Flammen" @@ -105645,7 +107912,7 @@ msgstr "Du nimmst einen Zug oder zwei." msgid "You smoked too much." msgstr "Du hast zu viel geraucht." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "Zugedröhnt" @@ -106975,66 +109242,6 @@ msgstr "" msgid "The gum webs constrict your movement." msgstr "" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "Deine Gefährten" @@ -107233,6 +109440,17 @@ msgid "" " the kind words used about them." msgstr "" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "" @@ -107772,6 +109990,18 @@ msgstr "Feuer" msgid "raging fire" msgstr "wütendes Feuer" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "Altschotter" @@ -108795,8 +111025,7 @@ msgid "" msgstr "" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "»Krach!«." @@ -108964,7 +111193,7 @@ msgid "" msgstr "" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "»Knirsch!«." @@ -109606,9 +111835,8 @@ msgstr "Fitness-Gerät" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." msgstr "" #: lang/json/furniture_from_json.py @@ -109697,6 +111925,18 @@ msgid "" " to be scavanged." msgstr "" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "" + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "Laufband" @@ -109709,6 +111949,18 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "schwerer Sandsack" @@ -110993,10 +113245,6 @@ msgstr "" msgid "filled arc furnace" msgstr "" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "Räuchergestell" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -111337,6 +113585,77 @@ msgid "" "temperature. You'll need to take it down first." msgstr "" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -111681,7 +114000,8 @@ msgstr "Fake-Gewehr, welches Säureklumpen feuert." msgid "auto" msgstr "automatisch" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "Gewehr" @@ -111708,8 +114028,7 @@ msgstr "" " anderen für Schrotmunition. Sie wurde aus Rohren und Teilen, die aus einer " "doppelläufigen Flinte ausgeschlachtet wurden, gebaut." -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "Schrotflinte" @@ -111887,7 +114206,8 @@ msgstr "" "Isolierband und Elektronik besteht, wird sie von einer Standard-Esz. " "betrieben." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "Pistole" @@ -111962,7 +114282,7 @@ msgstr "" "Ein mehrschüssiges pneumatisches Gewehr, welches aus Schrott selbst " "zusammengebaut wurde. Es ist sehr leise und tödlich." -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "halbautomatisch" @@ -112483,8 +114803,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" msgstr[0] "" msgstr[1] "" @@ -115092,15 +117412,15 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" msgstr[0] "" msgstr[1] "" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " @@ -115230,6 +117550,39 @@ msgstr "" " Kaliber 12 besteht. Historisch von egomanischen Jägern in Afrika benutzt, " "nun von ihren egomanischen Nachkommen in Neuengland benutzt." +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -115775,6 +118128,18 @@ msgid "" "will have to suffice." msgstr "" +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -116565,6 +118930,36 @@ msgstr "" msgid "trilaser" msgstr "" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -117436,22 +119831,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -119540,16 +121919,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "Du nimmst den Fisch aus und entgrätest ihn" @@ -119568,6 +121937,12 @@ msgstr "" "Du suchst nach rettenswerter Bionik-Hardware in dem, was von diesem " "fehlgeschlagenem Experiment noch übrig geblieben ist." +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -119583,8 +121958,32 @@ msgstr "" "Fleisch und hältst Ausschau nach allem, was hervorsticht." #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "Mühselig sezierst du das riesige Insekt." +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -121581,10 +123980,6 @@ msgstr "Etwas schreiben" msgid "Teleport yourself" msgstr "Dich selbst teleportieren" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "Ein Feuer löschen" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "Dich trocknen/reinigen" @@ -122041,6 +124436,13 @@ msgstr "" msgid "This item can be used to communicate with radio waves." msgstr "" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -122950,6 +125352,14 @@ msgstr "Protagonistenerstellungsbildschirm verlassen" msgid "Toggle sorting order" msgstr "Sortierreihenfolge umschalten" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "Beschreibung hochscrollen" @@ -123350,6 +125760,10 @@ msgstr "Gegenstände demontieren" msgid "Sleep" msgstr "Schlafen" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "Fahrzeug steuern" @@ -123823,12 +126237,12 @@ msgstr "Farbvorlage laden" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "Ja" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "Nein" @@ -124399,6 +126813,15 @@ msgstr "" msgid "Zombie trap." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "Reed" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -125718,6 +128141,11 @@ msgid "" "years.'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "Kein Stil" @@ -125975,6 +128403,21 @@ msgid "" "Lasts 3 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "Capoeira-Tempo" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "Kranich-Kung-Fu" @@ -126133,6 +128576,22 @@ msgid "" "+2 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "Eskrima-Kombi" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "Fechten" @@ -126170,6 +128629,33 @@ msgid "" "Blocked damage reduced by 50% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "Parieren" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -126218,6 +128704,34 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "Judo" @@ -126466,6 +128980,32 @@ msgid "" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "Muay Thai" @@ -126504,6 +129044,21 @@ msgid "" "Blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "Ninjutsu" @@ -126569,6 +129124,34 @@ msgid "" "Last 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "Niten Ichiryū" @@ -126642,6 +129225,39 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "Pankration" @@ -126794,6 +129410,21 @@ msgid "" "Perception increases Accuracy instead of Dexterity. Accuracy increased by 25% of Perception but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "Sōjutsu" @@ -126948,6 +129579,21 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "Tiger-Kung-Fu" @@ -127005,6 +129651,21 @@ msgid "" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "" @@ -127058,6 +129719,20 @@ msgid "" " Dodging Skill increased by 15% of Perception. Blocked damage reduced by 50% of Perception." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "Zui Quan" @@ -127175,6 +129850,34 @@ msgstr "" "+Stärke Schlagpanzerung, +Geschick Säurepanzerung, +Intelligenz " "Elektropanzerung, +Wahrnehmung Feuerpanzerung." +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "Bionik-Kampfgeist" @@ -127214,6 +129917,22 @@ msgid "" "+2 Blocks attempts, +1 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "Tausendfüßler-Kung-Fu" @@ -127251,6 +129970,20 @@ msgid "" "Lasts 3 turns. Stacks 4 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "Echsen-Kung-Fu" @@ -127370,6 +130103,20 @@ msgid "" "Stacks 2 times. Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "Kröten-Kung-Fu" @@ -127421,6 +130168,34 @@ msgid "" "Lasts 6 turns. Stacks 6 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "Viper-Kung-Fu" @@ -127762,6 +130537,34 @@ msgid "" "Lasts 1 turn. Stacks 2 times" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "" @@ -127855,6 +130658,46 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "" @@ -127906,6 +130749,393 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "Alkohol" @@ -128389,7 +131619,7 @@ msgid "Emulsified Hydrogel" msgstr "" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "" #: lang/json/material_from_json.py @@ -128420,7 +131650,7 @@ msgstr "" msgid "There is always work to be done, song to be woven." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -128428,16 +131658,16 @@ msgid "" " you." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -129815,10 +133045,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "" -"Ich werde dich dann sehen… oder auch nicht, und dann werde ich wissen, dass " -"ich die richtige Entscheidung getroffen habe. " #: lang/json/mission_def_from_json.py msgid "" @@ -129828,8 +133056,8 @@ msgstr "" " dich erahnen. " #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." -msgstr "Nun, du bist nicht tot… noch nicht. " +msgid "Well, you're not dead… yet." +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -130311,7 +133539,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "Danke." @@ -130604,7 +133832,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" @@ -132498,6 +135726,87 @@ msgstr "Ja, sicher." msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "2 Destillationsapparate herstellen" @@ -133982,6 +137291,54 @@ msgstr "" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "" @@ -136320,6 +139677,23 @@ msgstr "" "Du kannst dich schneller bewegen als die Meisten, was dir bei sicherem Halt " "einen Geschwindigkeitsbonus von 15% gibt." +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -136332,13 +139706,50 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." msgstr "" #: lang/json/mutation_from_json.py @@ -136449,12 +139860,12 @@ msgstr "Schneller Heiler" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" -"Du heilst dich im Schlaf schneller und wirst sogar einige wenige TP " -"regenerieren, wenn du nicht schläfst." #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -137178,10 +140589,11 @@ msgstr "Langsamer Heiler" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." msgstr "" -"Du heilst ein bisschen langsamer als die meisten; der Schlaf wird weniger " -"verlorene Trefferpunkte wiederherstellen." #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -137189,12 +140601,11 @@ msgstr "Dürftiger Heiler" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." msgstr "" -"Deine Gesundheitsregeneration im Schlaf ist stark beeinträchtigt. Du wirst " -"nur ein Drittel der gewöhnlichen TP zurückerlangen." #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -137202,12 +140613,11 @@ msgstr "Unmerklicher Heiler" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" -"Im Schlaf erlangst du kaum Gesundheit zurück – nur ein Zehntel der " -"gewöhnlichen TP werden geheilt." #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -138038,12 +141448,11 @@ msgstr "Sehr schneller Heiler" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" -"Dein Fleisch regeneriert sich langsam und du wirst Trefferpunkte " -"wiedererhalten, sogar, wenn du nicht schläft." #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -138051,8 +141460,12 @@ msgstr "Regeneration" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "Dein Fleisch reneriert sich von Wunden unglaublich schnell." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -138060,9 +141473,10 @@ msgstr "Reptilienheilung" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." msgstr "" -"Deine gebrochenen Gelenke heilen sich ohne große Schwierigkeiten von selbst." #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -142063,8 +145477,7 @@ msgid "Well, maybe you'll just have to make your own world wide web." msgstr "" "Tja, vielleicht musst du einfach nur dein eigenes World Wide Web spinnen." -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "Überlebender" @@ -142442,10 +145855,6 @@ msgid "" "you." msgstr "" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "Dr. med." - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -142850,15 +146259,34 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "Überlebendengeschichte" +msgid "Survivor: Confused 1" +msgstr "" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -142866,6 +146294,86 @@ msgstr "Überlebendengeschichte" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "Überlebendengeschichte" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "" @@ -144168,6 +147676,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "" @@ -144176,7 +147706,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -144681,10 +148212,6 @@ msgstr "Ich versuche lediglich, zu überleben." msgid "I'm tracking game." msgstr "Ich verfolge Wild." -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "Soldat" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "Barkeeper" @@ -145157,6 +148684,14 @@ msgstr "" msgid "Humans created me. Let's see what I can be on my own." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "" @@ -145426,10 +148961,6 @@ msgstr "Schläger" msgid "Laborer" msgstr "Arbeiter" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "Holzfäller" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "Holzarbeiter" @@ -145442,6 +148973,14 @@ msgstr "" msgid "Millyficen Whately" msgstr "" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "" + #: lang/json/npc_from_json.py msgid "magus" msgstr "" @@ -147935,6 +151474,18 @@ msgstr "Straße mit Gullyloch" msgid "bridge" msgstr "Brücke" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "Straßensperre" @@ -152887,6 +156438,118 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "Sanitäter" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "Sanitäter" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -153055,8 +156718,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -153069,8 +156733,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -154323,6 +157988,226 @@ msgid "" "find some other use." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -155989,7 +159874,7 @@ msgid "build a metalworking forge" msgstr "" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" #: lang/json/recipe_from_json.py @@ -160351,6 +164236,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -163123,103 +167042,6 @@ msgstr "" msgid "I'd kill for a sip of water right now." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" -"Sicher, ich hab gemerkt, dass du ein Bier dabei hast! Lasst uns einen heben " -"und quatschen, , wie geht’s?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" -"Absolut, wie wäre es mit einem der Biere, die du dabei hast? Wie geht’s, wie" -" steht’s?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "" -"Also wenn du diese Biere, die ich bei dir sehe, teilst, dann können wir die " -"ganze Zeit quatschen! Nur Spaß! Was geht, ?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "Kein Problem, , ich brauch sowieso eine Pause, wie geht’s?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "Ja, OK, , wie geht’s?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "Sicher, lasst uns rumquatschen! In Ordnung?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "Warum nicht? Wie geht es dir?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "Okay. Was gibt’s?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "Ich habe ein paar Minuten Zeit, wie stehen die Dinge?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "Sicher, , alles klar?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "In Ordnung, willst du etwas loswerden?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "Immer bereit für einen guten Plausch! Aber wieso, bist du OK?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "" -"OK , wir sollten uns besser kennen lernen. Wie kommst du zurecht?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "Definitiv, ich mach mit. Wie geht es so?" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "verdammt" @@ -165685,6 +169507,18 @@ msgstr "" msgid "Was it rough surviving thus far?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -166400,6 +170234,301 @@ msgstr "" msgid " will follow normal engagement rules." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "Okay. Was gibt’s?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "Sicher, , alles klar?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "In Ordnung, willst du etwas loswerden?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "Immer bereit für einen guten Plausch! Aber wieso, bist du OK?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -167757,6 +171886,14 @@ msgstr "" "hülsenloser Munition. Die Beschriftung lautet: »Rivtechs hülsenlose 8×40mm-" "Munition: Nichts anderes kommt ihr nahe.«" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -167766,6 +171903,21 @@ msgid "" " reads: \"WE ARE HERE TO PROTECT YOU.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -170884,6 +175036,330 @@ msgstr "Style" msgid "-chant" msgstr "Chant" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" +"Dies ist ein gekochtes Fleischstück von einem mutierten Tier. Es hat eine " +"beunruhigende, schwammige Struktur, aber ansonsten schmeckt es… im " +"Wesentlichen normal. Hoffentlich hast du all die Haare und Knochenstückchen " +"herausbekommen…" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -179316,6 +183792,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "Mitten im Nirgendwo" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "Experiment Zelle" @@ -179461,11 +183941,11 @@ msgid "Acolyte." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179500,8 +183980,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179514,11 +183994,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" @@ -179536,11 +184016,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179549,7 +184029,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" @@ -179563,10 +184043,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179576,7 +184056,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" @@ -179592,8 +184072,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" @@ -179603,15 +184083,21 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" #: lang/json/talk_topic_from_json.py msgid "Yeah, alright." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "" @@ -179621,9 +184107,7 @@ msgid "That is all for now." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." +msgid "There are bones to etch, songs to sing. Wish to join me?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -179635,7 +184119,7 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" +msgid "A song may yet be sung by you, should you wish to." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179647,10 +184131,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "Ich verstehe." @@ -179663,14 +184143,6 @@ msgstr "" msgid "Perhaps another time, Seer." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "" @@ -179679,10 +184151,6 @@ msgstr "" msgid "Not interested." msgstr "Bin nicht interessiert." -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "" @@ -179699,20 +184167,13 @@ msgstr "" msgid "I'm off then." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" @@ -179723,7 +184184,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179738,11 +184199,6 @@ msgstr "" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "" @@ -179754,14 +184210,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" #: lang/json/talk_topic_from_json.py @@ -179788,6 +184244,14 @@ msgstr "" msgid "Skip it, let's get going." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "Lass uns über Fraktionslager sprechen." + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "" @@ -179966,7 +184430,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -180127,8 +184591,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180150,7 +184614,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180202,8 +184666,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." -msgstr "Nein, einfach nein, …" +msgid "No, just no…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Just let me sleep, !" @@ -180214,8 +184678,8 @@ msgid "Make it quick, I want to go back to sleep." msgstr "Mach schnell, ich will mich wieder schlafen legen." #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." -msgstr "Nur noch ein paar Minuten …" +msgid "Just few minutes more…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Anything to do before I go to sleep?" @@ -180245,11 +184709,11 @@ msgid "no, go back to sleep." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180261,76 +184725,118 @@ msgid "I want to set some miscellaneous rules." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Can you teach me anything?" -msgstr "Kannst du mir irgendetwas beibringen?" +msgid "I'd like to know a bit more about your abilities." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's trade items" -msgstr "Lass uns handeln." +msgid "There's something I want you to do." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I want you to use this item." +msgid "I just wanted to talk for a bit." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hold on to this item." +msgid "Can you help me understand something? (HELP/TUTORIAL)" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Guard this position." -msgstr "Bewach diese Position." +msgid "I'm going to go my own way for a while." +msgstr "Für eine Weile werde ich meinen eigenen Weg gehen." #: lang/json/talk_topic_from_json.py -msgid "I want to assign you to work at this camp." +msgid "Let's go." +msgstr "Los geht’s!" + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." +msgid "Sure, what did you want to say?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "Lass uns über Fraktionslager sprechen." +msgid "Mind if we just chat for a bit about your history?" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Find a horse and mount up!" +msgid "Let's just chitchat for a while, I could use some relaxation." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Get off your mount, please." +msgid "I changed my mind, wanted to ask you something else." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please go to this location." +msgid "I'm all ears, my friend." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." +msgid "You gonna give me orders?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" +msgid "What would you like?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" +msgid "Just say the word." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." +msgid "Can you teach me anything?" +msgstr "Kannst du mir irgendetwas beibringen?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's trade items" +msgstr "Lass uns handeln." + +#: lang/json/talk_topic_from_json.py +msgid "I want you to use this item." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." +msgid "Hold on to this item." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "Für eine Weile werde ich meinen eigenen Weg gehen." +msgid "Guard this position." +msgstr "Bewach diese Position." #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "Los geht’s!" +msgid "I want to assign you to work at this camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Find a horse and mount up!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Get off your mount, please." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please go to this location." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I want you to build a camp here." +msgstr "Ich will, dass du hier ein Lager errichtest." + +#: lang/json/talk_topic_from_json.py +msgid "We need to abandon this camp." +msgstr "Wir müssen dieses Lager aufgeben. " + +#: lang/json/talk_topic_from_json.py +msgid "Show me what needs to be done at the camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about your current activity." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -180488,15 +184994,15 @@ msgstr "" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "Ach, schon gut." @@ -180702,11 +185208,11 @@ msgid "OVERRIDE: " msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py @@ -180873,10 +185379,6 @@ msgstr "" msgid "Stay at your current position." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "" @@ -180949,64 +185451,6 @@ msgstr "" msgid "Sure thing, I'll make my way there." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "" -"Ja, die Sommerhitze trifft mich hart. Lass uns eine kurze Pause machen. Wie " -"geht es ?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "" -"Okay, vielleicht wird es mir helfen, in diesem Wetter nicht zu erfrieren. " -"Was ist los?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -181061,21 +185505,21 @@ msgid "Hello there." msgstr "Hallo." #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." -msgstr "Okay, keine plötzlichen Bewegungen!" +msgid "Okay, no sudden movements…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "Bleib fern!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "Das ist mein Gebiet, ." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "Das ist mein Gebiet, ." + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Ruhig Blut. Ich habe nicht vor, dich zu verletzen." @@ -181128,30 +185572,30 @@ msgstr "Worum geht’s?" msgid "I don't care." msgstr "Ist mir egal." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "Ich hab nichts weiteres für dich zu tun." - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "Ich hab nichts für dich zu tun." #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "" +msgid "I don't have any more jobs for you." +msgstr "Ich hab nichts weiteres für dich zu tun." #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Ich hab nur eine Aufgabe für dich. Willst du sie hören?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Ich habe noch eine Aufgabe für dich. Willst du sie hören?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Ich hab nur eine Aufgabe für dich. Willst du sie hören?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -181161,6 +185605,10 @@ msgstr "Oh, okay." msgid "Never mind, I'm not interested." msgstr "Vergiss es, ich bin nicht interessiert." +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Welche Aufgabe?" @@ -181169,10 +185617,6 @@ msgstr "Welche Aufgabe?" msgid "What about it?" msgstr "Wie wär’s?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "Ich mach’s!" @@ -181391,6 +185835,10 @@ msgstr "Hmm, okay." msgid "Thanks!" msgstr "Danke!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "" @@ -181415,17 +185863,13 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "Ah, okay." #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." -msgstr "Nicht, bevor ich ein paar Antibiotika kriege." +msgid "Not until I get some antibiotics…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "You asked me recently; ask again later." @@ -181523,22 +185967,22 @@ msgstr "Nein, wir sind hier okay." msgid "On second thought, never mind." msgstr "Wenn ich darüber nachdenke, vergiss es." +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "Ich kann dich nicht trainieren, solange du ein Fahrzeug benutzt!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." -msgstr "Nur Geduld, ich werd dir später etwas neues zeigen …" +msgid "Give it some time, I'll show you something new later…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "Ich habe Gründe, um dir die Ausbildung zu verweigern." -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "Ich kann dich nicht trainieren, solange du ein Fahrzeug benutzt!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "Auf keinen Fall! Ich würde alleine zurückgelassen werden." @@ -181560,8 +186004,8 @@ msgid "See you around." msgstr "Wir sehen uns." #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." -msgstr "Damit fühl ich mich nicht so ganz wohl …" +msgid "I really don't feel comfortable doing so…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll give you some space." @@ -181632,7 +186076,7 @@ msgid "Thanks, see you later!" msgstr "Danke, bis später!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." +msgid "You picked up something that does not belong to you…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -181728,13 +186172,13 @@ msgid "You might be seeing more of me…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" #: lang/json/talk_topic_from_json.py @@ -181756,7 +186200,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -181769,7 +186213,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" @@ -181791,7 +186235,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -181807,7 +186251,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -181842,14 +186286,6 @@ msgstr "Sag mir, wie Fraktionslager funktionieren." msgid "Tell me how faction camps have changed." msgstr "Sag mir, wie sich Fraktionslager verändert haben." -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "Ich will, dass du hier ein Lager errichtest." - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "Wir müssen dieses Lager aufgeben. " - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "Nichts. Lass uns über etwas anderes reden." @@ -182101,10 +186537,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "" -"Bist du sicher? Das scheint kein besonders sicherer Ort für Smalltalk zu " -"sein ..." #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." @@ -182126,6 +186560,50 @@ msgstr "Worüber wolltest du reden?" msgid "Actually, never mind." msgstr "Ähm, vergiss es." +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "Ja, Freund?" @@ -182147,7 +186625,7 @@ msgid "May the earth flourish beneath our paths." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -182331,8 +186809,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" @@ -182941,7 +187419,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -183426,6 +187904,38 @@ msgstr "" msgid "Huh." msgstr "Huh." +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -183478,21 +187988,9 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" -"Irgendwann, ja. Es war stundenlang ruhig. Ich war ausgetrocknet, verletzt " -"und voller Furcht. Meine Ausbildung war vielleicht das Einzige, was mich " -"davon abhielt, durchzudrehen. Ich beschloss, mich hinauszuziehen und zu " -"sehen, wie schlimm meine Verletzungen waren. Es war leicht. Die Seite" -" des Transporters war aufgerissen und es zeigte sich, dass ich einfach nur " -"unter ein paar Trümmern begraben war, mit den Ruinen des Wagen um mich " -"herum, wie bei einem Zelt. Ich war noch nichtmal sonderlich schwer verletzt." -" Ich schnappte mir soviel Zeug, wie ich konnte, und zog mich hinaus. Es war " -"Nacht. Von weiter weg in der Stadt konnte ich Kämpfe hören, also ging ich in" -" die andere Richtung. Ich habe ein paar Häuserblocks geschafft, bevor ich " -" begegnet bin … Ich rannte von ihnen fort. Ich rannte und rannte, " -"und dann rannte ich noch mehr. Und hier bin ich." #: lang/json/talk_topic_from_json.py msgid "" @@ -183846,6 +188344,30 @@ msgstr "Armer Schmutziger Dan. " msgid "Thanks for telling me that stuff. " msgstr "Danke, dass du mir das Zeug erzählt hast. " +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -183908,6 +188430,24 @@ msgid "" "died in the crash, but I am not going back to find out." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -183947,6 +188487,21 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "Was glaubst du, was passiert ist? Siehst du sie hier irgendwo?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -184016,6 +188571,40 @@ msgid "" "pretty good life compared to those first few months." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -184028,6 +188617,50 @@ msgstr "" "Er war mit den anderen Passagieren beschäftigt, also tat ich, was jeder tun " "würde und verpisste mich auf der Stelle." +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -184081,6 +188714,27 @@ msgstr "Entschuldigung! Könntest du mir mehr über sie erzählen?" msgid "Right. Sorry." msgstr "Richtig. Es tut uns leid." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -184103,6 +188757,19 @@ msgstr "" "der Ort war völlig verlassen. Ich habe keine Ahnung, was mit all diesen " "Leuten passiert ist." +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -184207,6 +188874,42 @@ msgstr "Tut mir leid, dass ich gefragt habe.. " msgid "Sorry for asking. " msgstr "Tut mir leid, dass ich gefragt habe.. " +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -184938,6 +189641,48 @@ msgstr "" "in die Wälder, um mich alleine durchzuschlagen. Ich hab mich nicht gerade " "gut angestellt, also bin ich ziemlich froh, dass du aufgetaucht bist." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -185004,6 +189749,128 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "Danke, dass du mir das alles erzählt hast. " +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -185336,13 +190203,48 @@ msgstr "" msgid "I can respect that." msgstr "Das kann ich respektieren." +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "Danke dafür." + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -185447,6 +190349,43 @@ msgstr "" " ich wütend. Wer ich war, ist fort. Tot. Dein Gelaber über »gesund sein« ist" " mir scheißegal, frag nicht noch mal. Himmel, Arsch und Zwirn!" +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -185825,11 +190764,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "" -"Steuerhinterziehung. Ich war Buchhalter und habe meinem Boss geholfen auf " -"einigen sehr cleveren Wegen verdammt viel Geld zu bewegen. Nicht clever " -"genug, wie sich herausgestellt hat ..." #: lang/json/talk_topic_from_json.py msgid "" @@ -186055,6 +190991,32 @@ msgstr "" "können, oder? Ich vermute, vielleicht sind wir die, die da reinen Herzens " "sind, welche die Erde erben sollen. Wobei ich unsere Chancen nicht mag." +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -186066,6 +191028,23 @@ msgstr "" " denke ich, wandere ich auf Höllen auf Erden. Ich wünschte, ich hätte mehr " "in der Sonntagsschule aufgepasst." +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -186342,10 +191321,6 @@ msgstr "Wie war es für die Freien Händler zu arbeiten?" msgid "What was working for the Old Guard like?" msgstr "Wie war es für die Alte Garde zu arbeiten?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "Danke dafür." - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "Danke dafür. Lass uns anfangen." @@ -186640,6 +191615,22 @@ msgstr "" msgid "What were you saying before that?" msgstr "Was hast du davor gesagt?" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "Hallöchen!" @@ -187163,7 +192154,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -187556,10 +192547,6 @@ msgid "" " catastrophe." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "" @@ -188253,12 +193240,12 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"How's things with you? My cardboard collection is getting quite impressive." +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "" +"How's things with you? My cardboard collection is getting quite impressive." msgstr "" #: lang/json/talk_topic_from_json.py @@ -189057,7 +194044,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" @@ -189798,7 +194785,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -190939,12 +195926,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191072,12 +196059,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191141,7 +196128,7 @@ msgid "Hm? Oh, hi." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191511,8 +196498,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191529,9 +196516,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -191895,9 +196882,8 @@ msgstr "" "und verschwinde verdammtnochmal von hier." #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." +msgid "I'm not in charge here, you're looking for someone else…" msgstr "" -"Ich bin nicht der Verantwortliche hier, du suchst nach jemand anderem …" #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -191944,12 +196930,12 @@ msgid "Well, I'd better be going. Bye." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." -msgstr "Willkommen, Marshal…" +msgid "Welcome marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." -msgstr "Willkommen…" +msgid "Welcome…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -192198,12 +197184,12 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." -msgstr "Marshal…" +msgid "Marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." -msgstr "Bürger…" +msgid "Citizen…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Can I trade for supplies?" @@ -192877,7 +197863,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -192924,6 +197910,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "" @@ -192937,11 +197935,11 @@ msgid "Hey." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Yes?" +msgid "Good to see you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Good to see you." +msgid "About those jobs…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -192953,7 +197951,7 @@ msgid "Want help with something else?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." +msgid "Lets set a combat strategy" msgstr "" #: lang/json/talk_topic_from_json.py @@ -193007,6 +198005,10 @@ msgstr "" msgid "Anything on your mind?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "" @@ -193046,15 +198048,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "" #: lang/json/talk_topic_from_json.py @@ -193094,7 +198096,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -193164,8 +198166,8 @@ msgstr "" "Ich kann mir nicht vorstellen, wofür ich deine Hilfe benötigen könnte." #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." -msgstr "Rühr dich nicht vom Fleck, während ich meine Schere hole …" +msgid "Stand still while I get my clippers…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Thanks…" @@ -193607,8 +198609,8 @@ msgstr "" "Außenpostens aufhalten." #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "Bitte lass mich in Ruhe …" +msgid "Please leave me alone…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -193629,20 +198631,14 @@ msgstr "Das ist traurig." #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." +"I don't know what you could do. I've tried everything. Just give me time…" msgstr "" -"Ich weiß nicht, was du tun könntest. Ich hab alles versucht. Gib mir nur " -"etwas Zeit …" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "" -"Ich werde ständig krank! Zuerst dachte ich, dass es etwas war, das ich " -"gegessen habe, aber jetzt sieht es so aus, als ob ich nichts im Magen " -"behalten könnte." #: lang/json/talk_topic_from_json.py msgid "Uhm." @@ -193774,8 +198770,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194096,6 +199092,263 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "Hey, Sammler." @@ -194200,7 +199453,7 @@ msgid "Oh, you again." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194208,7 +199461,7 @@ msgid "I'm busy, what is it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "" #: lang/json/talk_topic_from_json.py @@ -194635,10 +199888,6 @@ msgstr "Du blockierst %s" msgid " blocks %s" msgstr " blockt %s" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "Parieren" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -197080,6 +202329,90 @@ msgstr "" msgid " unleashes a spin attack against %s and those nearby" msgstr "" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "" @@ -197136,6 +202469,216 @@ msgstr "" msgid " launches a supersonic punch at %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -197181,6 +202724,10 @@ msgstr "" msgid "Life springs anew from the dead grass." msgstr "" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "verbrannte Erde" @@ -198293,208 +203840,14 @@ msgid "" msgstr "" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "Erde" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" -"Es ist Erde. Sieht wie ein guter Boden zum Beackern aus. Könnte auch für " -"Bauprojekte ausgegraben werden." - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "»Bums«" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "" -"Ein großes Feld mit feinem Sand, der auf viele Weisen nützlich sein könnte, " -"wenn er ordnungsgemäßig entnommen würde." - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "Ton" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "" -"Ein Feld voll mit formbaren Ton, gut geeignet, um in einen Brennofen zu " -"benutzen, wenn man den Ton vorher ordentlich entnimmt." - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "Tonhügel" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "»Platsch!«" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "Sandhügel" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "Erdhügel" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" -"Ein Feld mit gehäufter Erde, nicht leicht zu überqueren. Wenn man sich dies " -"genauer ansieht, ist das recht gut geeignet zum Pflanzen von Samen und " -"ähnlichen Dingen." - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "" -"Ein riesiger Erdhügel, der so aussieht, als könntest du zum Schutz in ihm " -"hereinkrabbeln." - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "seltsamer Bruch" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" -"Ein unnatürlich menschenförmiges Loch, es scheint seltsam vertraut zu sein. " -"Du hast ein komisches Gefühl, als du es näher untersuchst, als ob es " -"irgendwie zu dir gehören würde." - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "Steinboden" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" -"Ein relativ flaches Feld aus Gestein. Sieht stabil genug aus, um mit den " -"richtigen Bergarbeiterwerkzeugen ausgegraben zu werden." - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "Straßenbelag" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "" -"Ein Stück Asphalt, langsam zerfällt er von Rissen, Frosthüben und fehlenden " -"Instandsarbeiten." - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "gelber Straßenbelag" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" -"Streifen mit sorgfältig ausgerichteter gelber Farbe markieren die Straße, um" -" Fahrern mitzuteilen, sie nicht zu überqueren. Jetzt erzwingt niemand " -"erzwingt diese Reglen mehr." - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "Bügersteig" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" -"Ein Feld mit herkömmlichen gegossenem Beton, beschädigt von Frosthüben und " -"großen Rissen aufgrund fehlender Instandsetzungsarbeiten." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." +msgid "overgrown floor" msgstr "" -"Ein neueres Feld mit gegossenem Beton mit Oberflächenbehandungen für die " -"Ästhetik und Widerstand gegenüber Frost-Tau-Zyklen." -#. ~ Description for concrete +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "Holzfußboden" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -198502,41 +203855,14 @@ msgid "SMASH!" msgstr "»SCHEPPER!«." #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "Metallboden" - -#. ~ Description for metal floor -#: lang/json/terrain_from_json.py -msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgid "overgrown wall" msgstr "" -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "Linoleum-Kachel" - -#. ~ Description for linoleum tile +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "Erdboden" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." msgstr "" -"Ein Boden, der aus einer sorgfältig gemischten Erde besteht, die " -"zusammengestampft wurde." #: lang/json/terrain_from_json.py msgid "concrete floor" @@ -198635,6 +203961,23 @@ msgstr "" "Boden ist noch nicht geebnet und die Decke ist noch nicht vollständig " "gefüllt." +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "Steinboden" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" +"Ein relativ flaches Feld aus Gestein. Sieht stabil genug aus, um mit den " +"richtigen Bergarbeiterwerkzeugen ausgegraben zu werden." + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "Metallboden" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -198644,6 +203987,10 @@ msgstr "" "Ein hochwertiger und harter karierter Boden, um das Risiko von Stolpern und " "Stürzen zu verringern, mit einer passenden Decke." +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "»Bums«" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "Boden" @@ -198692,6 +204039,10 @@ msgstr "" "Hartholzfußboden, der mit Chemikalien behandelt wurde, um den " "Rutschwiderstand zu verbessern, üblich für Freizeitsport." +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "Erdboden" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -198779,28 +204130,15 @@ msgid "A blue section of flooring." msgstr "" #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "" - -#. ~ Description for industrial carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." +msgid "carpet" msgstr "" +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "bunker carpet" +msgid "Base carpet!" msgstr "" -#. ~ Description for bunker carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "" - -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "Weicher roter Teppich." @@ -198820,6 +204158,124 @@ msgstr "Weicher grüner Teppich." msgid "Soft purple carpet." msgstr "Weicher violetter Teppich." +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "Linoleum-Kachel" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "farbiger Wachsboden" @@ -198858,6 +204314,37 @@ msgstr "" "postapokalyptischen Barackenstädten. Ich hoffe, du magst das Geräusch von " "Regen auf Wellblech." +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "Erde" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" +"Es ist Erde. Sieht wie ein guter Boden zum Beackern aus. Könnte auch für " +"Bauprojekte ausgegraben werden." + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" +"Ein großes Feld mit feinem Sand, der auf viele Weisen nützlich sein könnte, " +"wenn er ordnungsgemäßig entnommen würde." + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "Moos" @@ -198867,6 +204354,32 @@ msgstr "Moos" msgid "Moist spongy moss." msgstr "Feuchtes, schwammiges Moos." +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "Ton" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "" +"Ein Feld voll mit formbaren Ton, gut geeignet, um in einen Brennofen zu " +"benutzen, wenn man den Ton vorher ordentlich entnimmt." + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "Tonhügel" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "»Platsch!«" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "" @@ -198876,6 +204389,150 @@ msgstr "" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "Sandhügel" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "Erdhügel" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" +"Ein Feld mit gehäufter Erde, nicht leicht zu überqueren. Wenn man sich dies " +"genauer ansieht, ist das recht gut geeignet zum Pflanzen von Samen und " +"ähnlichen Dingen." + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "" +"Ein riesiger Erdhügel, der so aussieht, als könntest du zum Schutz in ihm " +"hereinkrabbeln." + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "seltsamer Bruch" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" +"Ein unnatürlich menschenförmiges Loch, es scheint seltsam vertraut zu sein. " +"Du hast ein komisches Gefühl, als du es näher untersuchst, als ob es " +"irgendwie zu dir gehören würde." + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "Straßenbelag" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "" +"Ein Stück Asphalt, langsam zerfällt er von Rissen, Frosthüben und fehlenden " +"Instandsarbeiten." + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "gelber Straßenbelag" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" +"Streifen mit sorgfältig ausgerichteter gelber Farbe markieren die Straße, um" +" Fahrern mitzuteilen, sie nicht zu überqueren. Jetzt erzwingt niemand " +"erzwingt diese Reglen mehr." + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "Bügersteig" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" +"Ein Feld mit herkömmlichen gegossenem Beton, beschädigt von Frosthüben und " +"großen Rissen aufgrund fehlender Instandsetzungsarbeiten." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" +"Ein neueres Feld mit gegossenem Beton mit Oberflächenbehandungen für die " +"Ästhetik und Widerstand gegenüber Frost-Tau-Zyklen." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "Holzfußboden" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "" +"Ein Boden, der aus einer sorgfältig gemischten Erde besteht, die " +"zusammengestampft wurde." + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "Walnussbaum" @@ -202986,6 +208643,78 @@ msgstr "" msgid "A ladder leading down." msgstr "" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "Gefälle" @@ -203477,7 +209206,7 @@ msgstr "Klänk!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "»Knall!«." @@ -205458,6 +211187,11 @@ msgstr "Holz-Bootsrumpf" msgid "A wooden board that keeps the water out of your boat." msgstr "Eine hölzerne Schiffswand, die das Wasser aus deinem Boot heraushält." +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -205984,14 +211718,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "Holzsitz" +msgid "flimsy wooden seat" +msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "Eine Sitzgelegenheit." +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "Holzsitz" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "Holzstachel" @@ -206232,6 +211971,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "" @@ -206846,6 +212594,11 @@ msgstr "" msgid "At least %s from %s (%s remaining)" msgstr "" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -206862,12 +212615,13 @@ msgid "Within %s of %s (passed)" msgstr "" #: src/achievement.cpp -msgid "Triggered by " +#, c-format +msgid "Triggered by %s" msgstr "" #: src/achievement.cpp #, c-format -msgid "%s/%s " +msgid "%s/%s %s" msgstr "" #: src/achievement.cpp @@ -207075,8 +212829,9 @@ msgstr "" msgid "The lock stumps your efforts to pick it." msgstr "Der Dietrich stumpft bei deinem Einbruchsversuch ab." -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "" @@ -207137,6 +212892,120 @@ msgstr "" msgid "Continue trying to fall asleep and don't ask again." msgstr "" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -208868,7 +214737,7 @@ msgstr "" msgid "< [%s] Sort: %s >" msgstr "" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "" @@ -211789,6 +217658,29 @@ msgstr "%s (%i Plätze);" msgid "Increased storage capacity by %i." msgstr "Bionik-Stromkapazität um %i erhöht." +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "" @@ -211959,7 +217851,8 @@ msgid "(incapacitated)" msgstr "" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" +#, c-format +msgid "(fuel saving ON > %d %%)" msgstr "" #: src/bionics_ui.cpp @@ -212026,10 +217919,18 @@ msgstr "" msgid "Accuracy" msgstr "Treffgenauigkeit" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "Ausweichen" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "Geschwindigkeit" @@ -212522,22 +218423,27 @@ msgstr " steht auf." #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%s bricht aus den Netzen aus!" +msgid "The %s escapes the bear trap!" +msgstr "%s entkommt aus der Bärenfalle!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "Du befreist dich aus den Spinnennetzen!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "" +"Dein %s versucht sich aus der Bärenfalle zu befreien, aber kommt nicht los." #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr " befreit sich aus den Spinnennetzen!" +msgid "You free yourself from the bear trap!" +msgstr "Du befreist dich aus der Bärenfalle!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" +msgid " frees themselves from the bear trap!" +msgstr " befreit sich aus der Bärenfalle!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" msgstr "" -"Du versuchst, dich aus den Spinnennetzen zu befreien, doch du kommst nicht " -"los!" +"Du versuchst, dich aus der Bärenfalle zu befreien, aber du kommst nicht los!" #: src/character.cpp src/monster.cpp #, c-format @@ -212577,30 +218483,6 @@ msgstr "" "Du versuchst, dich aus dem schweren Fallstrick zu befreien, aber du kommst " "nicht los!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%s entkommt aus der Bärenfalle!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "" -"Dein %s versucht sich aus der Bärenfalle zu befreien, aber kommt nicht los." - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "Du befreist dich aus der Bärenfalle!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr " befreit sich aus der Bärenfalle!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "" -"Du versuchst, dich aus der Bärenfalle zu befreien, aber du kommst nicht los!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "Du befreist dich aus dem Schutt!" @@ -212614,18 +218496,6 @@ msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "" "Du versucht, dich aus dem Schutt zu befreien, aber zu kommst nicht los!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "Du versucht, dem Abgrund zu entkommen, aber rutschst wieder herein." - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "Du entkommst der Grube!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr " entkommt der Grube!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -212665,6 +218535,54 @@ msgstr "Du brichst aus dem Griff frei!" msgid " breaks out of the grab!" msgstr " bricht aus dem Griff frei!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%s bricht aus den Netzen aus!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "Du befreist dich aus den Spinnennetzen!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr " befreit sich aus den Spinnennetzen!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "" +"Du versuchst, dich aus den Spinnennetzen zu befreien, doch du kommst nicht " +"los!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "Du versucht, dem Abgrund zu entkommen, aber rutschst wieder herein." + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "Du entkommst der Grube!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr " entkommt der Grube!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -213515,6 +219433,10 @@ msgstr "" msgid "Your body strains under the weight!" msgstr "Dein Körper verrenkt sich unter der Last!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -216477,14 +222399,6 @@ msgstr "Benchmark zeichnen (X Sekunden)" msgid "Test trait group" msgstr "Wesenszuggruppe testen" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "Debug-Nachricht anzeigen" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "Spiel-Absturz (Test-Absturz-Handhabung)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "" @@ -216513,6 +222427,18 @@ msgstr "" msgid "Enable achievements" msgstr "" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "Debug-Nachricht anzeigen" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "Spiel-Absturz (Test-Absturz-Handhabung)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "" + #: src/debug_menu.cpp msgid "Game…" msgstr "" @@ -216609,10 +222535,6 @@ msgstr "" msgid "Map…" msgstr "" -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -217130,6 +223052,10 @@ msgstr "Als abgeschlossen markieren" msgid "Remove mission without proper cleanup" msgstr "Mission ohne anständiges Aufräumen löschen" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -217644,15 +223570,6 @@ msgid "" "Roof: %s" msgstr "" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -218371,138 +224288,182 @@ msgid "Liked" msgstr "Gemocht" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "Legendär" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "Unangefochten" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "Mächtig" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "Ruhms" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "Recht bekannt" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "Gesprächsthema" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "Wertloser Abschaum" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "Gesindel" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "Verachtenswert" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "Parasit" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "Blutsauger" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "Lachnummer" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "Neutral" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "Stinkreich" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "Reich" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "Begütert" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "Gut situiert" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "Bequem" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "Gering" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "Versagend" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "Bedürftig" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "Bettelarm" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "Überlaufend" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "Gut gefüllt" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "Mittelmaß" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "Unterernährt" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "Verhungernd" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "Legendär" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "Experte" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "Veteran" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "Erfahren" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "Kompetent" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "Ungeübt" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "Verkrüppelt" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "Zerbrechlich" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "Wertlos" @@ -219096,12 +225057,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -220125,7 +226086,7 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" +msgid "No suitable items are located at the drop points…" msgstr "" #: src/faction_camp.cpp @@ -220346,6 +226307,13 @@ msgstr "%s ist gefährlich nah!" msgid "Wait till you wake up…" msgstr "Warte bis du aufgewacht bist..." +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -220456,6 +226424,11 @@ msgctxt "action" msgid "open" msgstr "" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -221586,6 +227559,10 @@ msgstr "Du hast nichts zum Nachladen." msgid "You aren't holding something you can reload." msgstr "Du hältst nichts, was du nachladen kannst." +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -222019,11 +227996,25 @@ msgstr "" msgid "You cannot haul items here." msgstr "Du kannst hier keine Gegenstände mitschleifen." +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "%s ist im Weg!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "Dort ist 1 %s im Weg!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -223424,11 +229415,6 @@ msgstr "Da ist irgendsoein Witzbold im Weg!" msgid "The %s is in the way!" msgstr "%s ist im Weg!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "%s ist im Weg!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -224170,6 +230156,10 @@ msgstr "Laseranvisierung wird ignoriert!" msgid "Creature whitelisted: %s" msgstr "Kreatur auf die Weißliste gesetzt: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "Selbstmord begehen?" @@ -224703,6 +230693,11 @@ msgstr "Du fängst an, den Tresor zu knacken." msgid "Attempt to hack this safe?" msgstr "Versuchen, den Tresor zu hacken?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -225554,11 +231549,28 @@ msgstr "" msgid "There is a %s there. Take down?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "Dort ist 1 %s. Entschärfen?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "Du entschärfst die Falle!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "Dir misslingt das Entschärfen der Falle." + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "Du versagst beim Entschärfen der Falle und löst sie aus!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -225939,6 +231951,10 @@ msgstr "" msgid "Splint broken limbs" msgstr "" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "Du hast keine Bioniken installiert." @@ -225966,16 +231982,78 @@ msgid " doesn't have limbs that require splinting." msgstr "" #: src/iexamine.cpp -msgid "This mill already contains flour." +msgid "You don't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "Die Muskelkrämpe gehen allmählich weg." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "Die Medizin hat keine Wirkung auf die Krämpfe." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." msgstr "" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." msgstr "" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "This mill contains %s, which can't be milled!" msgstr "" #: src/iexamine.cpp @@ -226162,7 +232240,8 @@ msgid "Remove brake and start milling" msgstr "" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." +#, c-format +msgid "Remove brake and start milling, milling will take about %s." msgstr "" #: src/iexamine.cpp @@ -226196,18 +232275,7 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "" -msgstr[1] "" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." +msgid "It should take about %s to finish milling." msgstr "" #: src/iexamine.cpp @@ -226398,6 +232466,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "Fertigstellung" @@ -226979,7 +233052,7 @@ msgstr "Volumen (%s):" msgid "There are no available choices" msgstr "Keine Auswahlmöglichkeiten vorhanden" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "" @@ -227446,7 +233519,7 @@ msgstr "" "Dieses Lebensmittel hat angefangen zu faulen. Es zu " "essen wäre eine sehr schlechte Idee. " -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -227896,10 +233969,6 @@ msgstr "" msgid "Weight capacity bonus: " msgstr "" -#: src/item.cpp -msgid "Storage: " -msgstr "Lagerplatz: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "" @@ -228207,6 +234276,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* Dieses Werkzeug arbeitet mit bionischem Strom. " +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -228230,10 +234327,22 @@ msgstr "* Dieser Gegenstand kann verstärkt werden." msgid "* This item is not repairable." msgstr "* Dieser Gegenstand ist nicht reparierbar." +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." -msgstr "Zerlegen dauert %s und könnte %s ergeben. " +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. +#: src/item.cpp +#, c-format +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." +msgstr "" #: src/item.cpp #, c-format @@ -228351,31 +234460,28 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "Kritischer Treffer Chance %d%% - %d%% " #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" +msgid "Bashing: " msgstr "" -"%d Schlag (%d bei Kritischer Treffer) " #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" +msgid "Critical bash: " msgstr "" -"%d Schnitt (%d bei Kritischer Treffer)" -" " #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" +msgid "Cutting: " msgstr "" -"%d Stich (%d Kritischer Treffer) " #: src/item.cpp -#, c-format -msgid "%d moves per attack" -msgstr "%d Züge pro Angriff" +msgid "Critical cut: " +msgstr "" + +#: src/item.cpp +msgid "Piercing: " +msgstr "" + +#: src/item.cpp +msgid "Critical pierce: " +msgstr "" #: src/item.cpp msgid "Integrated mod: " @@ -228978,8 +235084,9 @@ msgstr "%1$s kann nicht mehr von %2$s enthalten." msgid "That %s doesn't have room to expand." msgstr "%s hat keinen Platz, um sich auszubreiten." -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d × %s" @@ -229105,10 +235212,67 @@ msgstr "Du hast keinerlei Gegenstände mit registrierten Verwendungszwecken" msgid "Execute which action?" msgstr "Welche Aktion ausführen?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" +msgstr[1] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "" @@ -229148,6 +235312,11 @@ msgstr "Welche Gruppe testen?" msgid "Result of 100 spawns:" msgstr "Ergebnis von 100 Spawns:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d × %s" + #: src/item_location.cpp msgid "inventory" msgstr "Inventar" @@ -229170,6 +235339,10 @@ msgstr "" msgid "Pocket %d:" msgstr "" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "" @@ -229330,6 +235503,34 @@ msgstr "" msgid "not enough space" msgstr "" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "»Klick«." @@ -229399,14 +235600,6 @@ msgstr "Du nimmst ein paar Antibiotika ein." msgid " takes some antibiotics." msgstr " nimmt ein paar Antibiotika ein." -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "Die Muskelkrämpe gehen allmählich weg." - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "Die Medizin hat keine Wirkung auf die Krämpfe." - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -230993,10 +237186,6 @@ msgstr "Snake" msgid "Sokoban" msgstr "Sokoban" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "Minesweeper" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "Licht an!" @@ -233945,7 +240134,7 @@ msgstr "%s benötigt %s daneben." msgid "You can't place a %s there. It contains a trap already." msgstr "Du kannst hier keinen %s platzieren. Dort ist bereits eine Falle." -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "Du löst 1 %s aus!" @@ -235153,6 +241342,10 @@ msgstr "Anfänger" msgid "Intermediate" msgstr "Mittelschwer" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "Experte" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "Levelbreite:" @@ -235716,6 +241909,15 @@ msgstr "" msgid "Summon" msgstr "" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "Reichweite" @@ -235736,6 +241938,10 @@ msgstr "" msgid "Spawned" msgstr "" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "" @@ -235788,6 +241994,15 @@ msgstr "" msgid "%s wounds are closing up!" msgstr "" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "" @@ -236245,30 +242460,23 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "Du entschärfst die Falle!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "Dir misslingt das Entschärfen der Falle." +msgid "Something has crawled out of the %s plants!" +msgstr "Etwas krabbelte aus der Hose von %s!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "Du versagst beim Entschärfen der Falle und löst sie aus!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "Etwas krabbelte aus %s!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "Etwas krabbelte aus der Hose von %s!" +msgid "You've spotted a %1$ss!" +msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "Etwas krabbelte aus %s!" +msgid " triggers a %s!" +msgstr "" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -237838,6 +244046,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "Ist von der Polizei gesucht geworden!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -238809,6 +245030,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "Löste einen Alarm aus." +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -241658,6 +247891,11 @@ msgstr "" msgid "zombie slave" msgstr "Zombiesklave" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "%s schieben" + #: src/monexamine.cpp msgid "Rename" msgstr "Umbenennen" @@ -242623,12 +248861,6 @@ msgstr "" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "Mensch" -msgstr[1] "Menschen" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -243617,17 +249849,6 @@ msgstr "Alter:" msgid "Blood type:" msgstr "" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "" - #: src/newcharacter.cpp msgid "Name:" msgstr "Name:" @@ -243640,6 +249861,22 @@ msgstr "Geschlecht:" msgid "Select a starting location." msgstr "Wähle einen Startort." +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" +msgstr[1] "" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Stats:" msgstr "Werte:" @@ -243709,6 +249946,13 @@ msgstr "Drücke %s um Umgebung zu wählen" msgid "Starting location:" msgstr "Startort:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "Start Auto:" @@ -245416,6 +251660,14 @@ msgstr "Zermalmen" msgid "Pulp Adjacent" msgstr "Nachbarn zerm." +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "Automatisches Graben" @@ -247043,17 +253295,6 @@ msgstr "Mutationen durch Strahlung" msgid "If true, radiation causes the player to mutate." msgstr "Falls wahr, wird Strahlung den Spieler zum Mutieren bringen." -#: src/options.cpp -msgid "Z-levels" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" - #: src/options.cpp msgid "Character point pools" msgstr "Punktevorratsmodi" @@ -247976,6 +254217,16 @@ msgstr "Zone:" msgid "# Unexplored" msgstr "# Unerforscht" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "" @@ -248303,6 +254554,10 @@ msgstr "Verbrennend!" msgid "Very hot!" msgstr "Sehr heiß!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "Bequem" + #: src/panels.cpp msgid "Very cold!" msgstr "Sehr kalt!" @@ -249776,6 +256031,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "Durst -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "Verhungernd" + #: src/player_display.cpp msgid "Underfed" msgstr "Unterernährt" @@ -249868,6 +256127,10 @@ msgid "" "\n" msgstr "" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "Unterernährt" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -251012,6 +257275,15 @@ msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] " %1$d Werkzeug mit %2$squalität %3$d" msgstr[1] "%1$d Werkzeuge mit %2$squalität %3$d" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" +msgstr[1] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -251899,6 +258171,15 @@ msgctxt "grammatical gender list" msgid "n" msgstr "" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "Du trittst auf eine Luftpolsterfolie!" @@ -255112,6 +261393,10 @@ msgstr "" msgid "--NO AVAILABLE MODS--" msgstr "--KEINE MODS VERFÜGBAR--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "Aktuelle Liste aktiver Mods als Standard gespeichert" diff --git a/lang/po/es_AR.po b/lang/po/es_AR.po index 9558f52271ee0..9681701566443 100644 --- a/lang/po/es_AR.po +++ b/lang/po/es_AR.po @@ -1,14 +1,15 @@ # # Translators: -# Brett Dong , 2020 # Vlasov Vitaly , 2020 +# Brett Dong , 2020 +# Diego Gonzalo Ballesteros Palomo , 2020 # Noctivagante , 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Noctivagante , 2020\n" "Language-Team: Spanish (Argentina) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_AR/)\n" @@ -291,7 +292,6 @@ msgstr[0] "piedra" msgstr[1] "piedras" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -685,8 +685,8 @@ msgid "" "A powdered mixture of coke and lime ready to be smelted into usable calcium " "carbide in an arc furnace." msgstr "" -"Es una mezcla en polvo de carbón y cal, lista para ser fundida en un horno " -"de arco para convertirla en carburo de calcio." +"Es una mezcla en polvo de coque y cal, lista para ser fundida en un horno de" +" arco para convertirla en carburo de calcio." #: lang/json/AMMO_from_json.py msgid "coal" @@ -935,6 +935,17 @@ msgstr "" "Es una mezcla respirable de oxígeno y nitrógeno en proporciones adecuadas " "para utilizar en buceo." +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "agente extintor" +msgstr[1] "agente extintor" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "Es una solución química seca efectiva para extinguir fuegos." + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -1561,7 +1572,7 @@ msgid "" "produced when it burns will quickly clog any firearm, but it could be used " "to make some vicious bombs." msgstr "" -"Un puñado de pólvora negra, hecha mezclando carbón y azufre con nitro. " +"Es un puñado de pólvora negra, hecha mezclando carbón y azufre con nitro. " "Bastante inservible para hacer cartuchos modernos, ya que el hollín " "producido cuando se quema obstruirá el arma, pero puede usarse para hacer " "algunas bombas." @@ -4914,6 +4925,31 @@ msgstr "" "química. Es mejor utilizarlo con alguna clase de máscara o protección para " "la boca." +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "bala 12.3ln" +msgstr[1] "balas 12.3ln" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" +"El cartucho 12.3ln fue presentado en Rumania al inicio del segundo conflicto" +" de los Cárpatos. El rifle PA md. 71 usaba esta munición y ganó popularidad " +"rápidamente en la Unión Europea, y desde allí, en el mundo. Debido a esto, " +"el 12.3ln se convirtió rápidamente en la bala estándar de combate en " +"Eurasia. Pudo ser fácilmente recolectada y almacenada por los Exodii. Se ve " +"y se siente parecido al cartucho .30-06 Springfield pero con un pulido " +"ligeramente más puntiagudo." + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -5258,7 +5294,7 @@ msgid "" "A heavy metal slug used with shotguns to give them the range capabilities of" " a rifle. Extremely damaging but rather inaccurate." msgstr "" -"Una posta pesada utilizada en escopetas para que tengan el alcance de un " +"Es una posta pesada utilizada en escopetas para que tengan el alcance de un " "rifle. Causan muchísimo daño pero son poco precisas." #: lang/json/AMMO_from_json.py @@ -6110,7 +6146,7 @@ msgstr[1] "pintura amarilla" msgid "A can of yellow paint." msgstr "Una lata de pintura amarilla." -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "alfombra roja" @@ -6190,7 +6226,6 @@ msgstr[1] "oro" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -6276,7 +6311,6 @@ msgstr[0] "lámina pequeña de metal" msgstr[1] "láminas pequeñas de metal" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "Es una pequeña lámina de metal." @@ -6959,7 +6993,7 @@ msgstr "" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "lead pellets" msgid_plural "lead pelletss" -msgstr[0] "perdigón de plomo" +msgstr[0] "perdigones de plomo" msgstr[1] "perdigones de plomo" #. ~ Description for lead pellets @@ -7836,70 +7870,6 @@ msgstr[1] "núcleos de energía de maná" msgid "Seeing this is a bug." msgstr "Si ves esto es un bug." -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "TEST piedra" -msgstr[1] "TEST piedras" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "TEST lámina pequeña de metal" -msgstr[1] "TEST láminas pequeñas de metal" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "TEST pedazo de platino" -msgstr[1] "TEST pedazos de platino" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -8226,8 +8196,6 @@ msgstr[1] "pares de tapones para los oídos" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "Tapones industriales para los oídos. Se ponen adentro de la oreja." @@ -8548,11 +8516,11 @@ msgstr[1] "bolsas de munición" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "" "Es una pequeña bolsa que puede usarse para almacenar la mayoría de las " -"municiones pequeñas, los misiles no entran. Hay que activarla para almacenar" -" la munición." +"municiones pequeñas, los misiles no entran. Usá insertar para guardar la " +"munición." #: lang/json/ARMOR_from_json.py msgid "ammo satchel" @@ -8663,11 +8631,11 @@ msgstr[1] "aljabas" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." msgstr "" "Es una aljaba de cuero que se usa en la cintura y puede almacenar hasta 20 " -"flechas. Hay que usarla para guardar flechas." +"flechas o pernos. Usá insertar para guardar las flechas o los pernos." #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -8679,11 +8647,11 @@ msgstr[1] "aljabas de abedul" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." +"20 arrows or bolts. Use insert to store arrows or bolts." msgstr "" "Es una aljaba tejida de pedazos de corteza de abedul, que se usa en la " -"cintura y puede almacenar hasta 20 flechas. Hay que usarla para guardar " -"flechas." +"cintura y puede almacenar hasta 20 flechas o pernos. Usá insertar para " +"guardar las flechas o los pernos." #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -8695,13 +8663,15 @@ msgstr[1] "aljabas grandes" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" "Es una aljaba grande de cuero adornada con metal, se usa en la espalda y " -"puede almacenar hasta 60 flechas. Históricamente fue utilizada por los " -"arqueros a caballo, más que por los que iban a pie, pero ninguno de ELLOS " -"tuvo que pelearse contra zombis. Hay que usarla para guardar flechas." +"puede almacenar hasta 60 flechas o pernos. Históricamente fue utilizada por " +"los arqueros a caballo, más que por los que iban a pie, pero ninguno de " +"ELLOS tuvo que pelearse contra zombis. Usá insertar para guardar las flechas" +" o los pernos." #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -8713,11 +8683,11 @@ msgstr[1] "aljabas grandes de abedul" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." +"hold 60 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Es una aljaba grande tejida de pedazos de corteza de abedul, se usa en la " -"espalda y puede almacenar hasta 60 flechas. Hay que usarla para guardar " -"flechas." +"Es una aljaba grande tejida de pedazos de corteza de abedul, que se usa en " +"la espalda y puede almacenar hasta 60 flechas o pernos. Usá insertar para " +"guardar las flechas o los pernos." #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -9193,9 +9163,9 @@ msgid "" " doubles as an equipment belt with a reinforced loop for holding a large " "tool." msgstr "" -"Un cinturón resistente de bombero. Además de mantener tu ropa en su lugar, " -"también sirve llevar herramientas con una presilla reforzada para poner una " -"herramienta grande." +"Es un cinturón resistente de bombero. Además de mantener tu ropa en su " +"lugar, también sirve llevar herramientas con una presilla reforzada para " +"poner una herramienta grande." #: lang/json/ARMOR_from_json.py msgid "judo belt template" @@ -10326,8 +10296,6 @@ msgstr[0] "par de medias" msgstr[1] "pares de medias" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "Son medias. Se ponen en los pies." @@ -12351,6 +12319,18 @@ msgstr "" "traje antiexplosivos. Están diseñados para proteger contra la fragmentación " "y el calor." +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "par de guantes tachonados" +msgstr[1] "pares de guantes tachonados" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "Es un par de guantes con nudillos metálicos tachonados." + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -14714,7 +14694,7 @@ msgid "" "A platinum ring, engraved with all manner of swirls and spirals. You can " "wear it if you like, but it won't provide any effects." msgstr "" -"Es un anillo de platino, gravado con varios espirales y remolinos. Te lo " +"Es un anillo de platino, grabado con varios espirales y remolinos. Te lo " "podés poner si querés, pero no causa ningún efecto." #: lang/json/ARMOR_from_json.py @@ -19314,7 +19294,6 @@ msgstr[1] "exoesqueletos de combate" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "Tu armadura de poder se activa." @@ -19733,7 +19712,6 @@ msgstr[0] "mochila" msgstr[1] "mochilas" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "Es una mochila pequeña. Buena capacidad y poca incomodidad." @@ -19853,7 +19831,6 @@ msgstr[0] "maletín" msgstr[1] "maletines" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "Útil para llevar plata, documentos, o contrabando." @@ -20216,13 +20193,13 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." msgstr "" -"Una valija mediana usada generalmente para transportar ropa y otras " -"posesiones durante los viajes. Tiene buena capacidad de almacenamiento pero " -"ir arrastrándola por ahí no es ni rápido ni cómodo." +"Es una valija mediana con ruedas usada generalmente para transportar ropa y " +"otras posesiones durante los viajes. Tiene buena capacidad de almacenamiento" +" pero ir arrastrándola por ahí no es ni rápido ni cómodo." #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -20324,13 +20301,14 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "debug pocket universe" msgid_plural "debug pocket universes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "universo de bolsillo para debug" +msgstr[1] "universos de bolsillo para debug" #. ~ Description for {'str': 'debug pocket universe'} #: lang/json/ARMOR_from_json.py msgid "A pocket universe. Can store approximately 384 * 10^6 bugs." msgstr "" +"Es universo de bolsillo. Puede almacenar aproximadamente 384 * 10^6 bugs." #: lang/json/ARMOR_from_json.py msgid "bondage suit" @@ -20886,7 +20864,6 @@ msgstr[0] "traje NBQ" msgstr[1] "trajes NBQ" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -21914,7 +21891,6 @@ msgstr[0] "remera de mangas largas" msgstr[1] "remeras de mangas largas" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "Es una remera de algodón de mangas largas." @@ -22735,6 +22711,21 @@ msgstr "" "Es una bolsa de dormir grande que te cubre desde la cabeza hasta los pies. " "Esta es de peso medio." +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "cestus" +msgstr[1] "cesti" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" +"Es un brazo y mano envueltos en cuero que incorporan placas metálicas sobre " +"los nudillos para mejorar la potencia del golpe y la defensa." + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -22851,8 +22842,8 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "sentinel-lx cloak" msgid_plural "sentinel-lx cloaks" -msgstr[0] "capa sentinel-lx" -msgstr[1] "capas sentinel-lx" +msgstr[0] "capa centinela-lx" +msgstr[1] "capas centinela-lx" #. ~ Description for {'str': 'sentinel-lx cloak'} #: lang/json/ARMOR_from_json.py @@ -22861,8 +22852,8 @@ msgid "" "unnatural shadow. Made from woven graphene, its lightweight and resistant, " "but cannot be repaired" msgstr "" -"Esta capa sentinel-lx hecha de vantablack, cuelga sobre los hombros como una" -" sombra sólida y antinatural. Hecha de grafeno tejido, es liviano y " +"Esta capa centinela-lx hecha de vantablack, cuelga sobre los hombros como " +"una sombra sólida y antinatural. Hecha de grafeno tejido, es liviano y " "resistente, pero no puede ser reparado." #: lang/json/ARMOR_from_json.py @@ -23865,7 +23856,7 @@ msgid "" "This bracelet has runes engraved on it. You sense a faint air of mysticism " "when you look at it. It would be useful for imbuing mana into material." msgstr "" -"Esta pulsera tiene runas gravadas. Sentís un cierto aire místico cuando la " +"Esta pulsera tiene runas grabadas. Sentís un cierto aire místico cuando la " "mirás. Podría ser útil para imbuir maná en un material." #: lang/json/ARMOR_from_json.py @@ -24480,62 +24471,18 @@ msgstr "" "ambiente." #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "TEST par de medias" -msgstr[1] "TEST pares de medias" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "TEST remera de mangas largas" -msgstr[1] "TEST remeras de mangas largas" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "TEST par de tapones para los oídos" -msgstr[1] "TEST pares de tapones para los oídos" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "TEST traje NBQ" -msgstr[1] "TEST trajes NBQ" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "TEST mochila" -msgstr[1] "TEST mochilas" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" +msgstr[0] "aura de arco repelente" +msgstr[1] "auras de arco repelente" +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "TEST maletín" -msgstr[1] "TEST maletines" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test power armor'} -#: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" +"Es un aura invisible que golpea a los atacantes de cuerpo a cuerpo con un " +"arco voltaico." #: lang/json/BATTERY_from_json.py msgid "test battery" @@ -25041,8 +24988,8 @@ msgid_plural "Aero-Evaporator CBMs" msgstr[0] "MCB Aero-vaporador" msgstr[1] "MCB Aero-vaporador" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -26254,7 +26201,7 @@ msgid "" "A mess of pierced pipes and broken seals, something unpleasant is leaking " "from it." msgstr "" -"Es un lío de caños agujereados y sellos rotos, y está perdiendo algo " +"Es una mezcla de caños agujereados y sellos rotos, y está chorreando algo " "desagradable." #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py @@ -26430,8 +26377,8 @@ msgid_plural "Internal Furnace CBMs" msgstr[0] "MCB Horno interno" msgstr[1] "MCB Horno interno" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -26560,8 +26507,8 @@ msgid_plural "Wind Turbine CBMs" msgstr[0] "MCB Turbina de Viento" msgstr[1] "MCB Turbina de Viento" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -26572,22 +26519,6 @@ msgstr "" "Cuando están activadas, se desplegarán y lentamente usarán el viento para " "recargar tu energía." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "MCB Soldadora de Precisión" -msgstr[1] "MCB Soldadora de Precisión" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "" -"Es un conjunto de herramientas electrónicas que incluye soldadora de mano y " -"pinza cortaalambre. Así por sí mismo, no sirve de nada, pero son necesarios " -"para crear biónicos." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -26625,8 +26556,8 @@ msgstr "" #: lang/json/BIONIC_ITEM_from_json.py msgid "Dopamine Stimulators CBM" msgid_plural "Dopamine Stimulators CBMs" -msgstr[0] "MCB Simulador de Dopamina" -msgstr[1] "MCB Simulador de Dopamina" +msgstr[0] "MCB Estimulador de Dopamina" +msgstr[1] "MCB Estimulador de Dopamina" #. ~ Description for {'str': 'Dopamine Stimulators CBM'} #: lang/json/BIONIC_ITEM_from_json.py @@ -26657,14 +26588,45 @@ msgstr "" "cerebral. Tiene un temporizador desde su instalación y no tenés los códigos " "para resetearlo." +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "MCB Arma Craneal" +msgstr[1] "MCB Arma Craneal" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" +"Tenés una pistola de un disparo calibre .40 escondida en la cabeza. Activá " +"el biónico para disparar y recargar la escopeta." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "MCB Soldadora de Precisión" +msgstr[1] "MCB Soldadora de Precisión" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "" +"Es un conjunto de herramientas electrónicas que incluye soldadora de mano y " +"alicate. Así por sí mismo, no sirve de nada, pero son necesarios para crear " +"biónicos." + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "MCB Generador de Sobrecarga Iónica" msgstr[1] "MCB Generador de Sobrecarga Iónica" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -26792,41 +26754,43 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Generic Nonfiction Book" msgid_plural "Generic Nonfiction Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de No Ficción Genérico" +msgstr[1] "Libros de No Ficción Genéricos" #. ~ Description for Generic Nonfiction Book #: lang/json/BOOK_from_json.py msgid "template for a manuscript purporting to be factual" msgstr "" +"Es una plantilla para un manuscrito que pretende ser basado en hechos " +"reales." #: lang/json/BOOK_from_json.py msgid "Generic Fiction Book" msgid_plural "Generic Fiction Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Ficción Genérico" +msgstr[1] "Libros de Ficción Genéricos" #. ~ Description for Generic Fiction Book #: lang/json/BOOK_from_json.py msgid "template for a work of fiction" -msgstr "" +msgstr "Es una plantilla para una obra de ficción." #: lang/json/BOOK_from_json.py msgid "Generic Hard Bound Fiction Book" msgid_plural "Generic Hard Bound Fiction Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Tapa Dura de Ficción Genérico" +msgstr[1] "Libros de Tapa Dura de Ficción Genéricos" #. ~ Description for Generic Hard Bound Fiction Book #: lang/json/BOOK_from_json.py msgid "Template for hard bound book of fiction" -msgstr "" +msgstr "Es la plantilla para libros en tapa dura de ficción." #: lang/json/BOOK_from_json.py msgid "paperback novel" msgid_plural "paperbacks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "novela en rústica" +msgstr[1] "novelas en rústica" #. ~ Description for {'str': 'paperback novel', 'str_pl': 'paperbacks'} #: lang/json/BOOK_from_json.py @@ -26836,30 +26800,61 @@ msgstr "Es un libro común con tapa blanda. ¿O no? Sí." #: lang/json/BOOK_from_json.py msgid "Nonfiction Book" msgid_plural "Nonfiction Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de No Ficción" +msgstr[1] "Libros de No Ficción" #. ~ Description for Nonfiction Book #: lang/json/BOOK_from_json.py msgid "template for hard bound nonfiction book" -msgstr "" +msgstr "Es la plantilla para libros en tapa dura de no ficción." #: lang/json/BOOK_from_json.py msgid "Nonfiction Paperback" msgid_plural "Nonfiction Paperbacks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "libro en rústica de no ficción" +msgstr[1] "libros en rústica de no ficción" #. ~ Description for Nonfiction Paperback #: lang/json/BOOK_from_json.py msgid "template for a paperback nonfiction book" +msgstr "Es una plantilla para libros en rústica de no ficción." + +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "Novela Sensacionalista Genérica" +msgstr[1] "Novelas Sensacionalistas Genéricas" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" msgstr "" +"Es una plantilla para novelas sensacionalistas. Que deben ser todas con tapa" +" blanda, ¿no?" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "Libro de Ciencia Ficción Genérico" +msgstr[1] "Libros de Ciencia Ficción Genéricos" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "Es una plantilla para libros en rústica de ciencia ficción." + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "Es una plantilla para libros de tapa dura de ciencia ficción." #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Amo de Casa" +msgstr[1] "Libros de Amo de Casa" #. ~ Description for Homemaking Book #: lang/json/BOOK_from_json.py @@ -26867,30 +26862,32 @@ msgid "" "This is a template for books about homemaking, style, home decor, and home " "economics." msgstr "" +"Es una plantilla para libros acerca de reparaciones hogareñas, estilos, " +"decoración y economía del hogar." #: lang/json/BOOK_from_json.py msgid "Hardcover Cookbook" msgid_plural "Hardcover Cookbooks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Tapa Dura de Recetas" +msgstr[1] "Libros de Tapa Dura de Recetas" #. ~ Description for Hardcover Cookbook #. ~ Description for Softcover Cookbook #: lang/json/BOOK_from_json.py msgid "This is a template for books about cooking." -msgstr "" +msgstr "Es una plantilla para libros de recetas." #: lang/json/BOOK_from_json.py msgid "Softcover Cookbook" msgid_plural "Softcover Cookbooks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro en Rústica de Recetas" +msgstr[1] "Libros en Rústica de Recetas" #: lang/json/BOOK_from_json.py msgid "dodge skillbook abstract" msgid_plural "dodge skillbook abstracts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "nota sobre habilidad esquivar" +msgstr[1] "notas sobre habilidad esquivar" #. ~ Description for dodge skillbook abstract #: lang/json/BOOK_from_json.py @@ -26900,30 +26897,30 @@ msgstr "Es un libro común. ¿O no? Sí, lo es." #: lang/json/BOOK_from_json.py msgid "Hardcover Philosophy" msgid_plural "Hardcover Philosophys" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Tapa Dura de Filosofía" +msgstr[1] "Libros de Tapa Dura de Filosofía" #. ~ Description for Hardcover Philosophy #: lang/json/BOOK_from_json.py msgid "This is a template for books about philosophy." -msgstr "" +msgstr "Es una plantilla para libros de filosofía." #: lang/json/BOOK_from_json.py msgid "Softcover Philosophy." msgid_plural "Softcover Philosophy.s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro en Rústica de Filosofía" +msgstr[1] "Libros en Rústica de Filosofía" #. ~ Description for Softcover Philosophy. #: lang/json/BOOK_from_json.py msgid "This is a template for paperbacks about philosophy." -msgstr "" +msgstr "Es una plantilla para libros en rústica de filosofía." #: lang/json/BOOK_from_json.py msgid "Hardcover Nonfiction Sports Book" msgid_plural "Hardcover Nonfiction Sports Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Tapa Dura No Ficticio sobre Deportes" +msgstr[1] "Libros de Tapa Dura No Ficticios sobre Deportes" #. ~ Description for Hardcover Nonfiction Sports Book #. ~ Description for Softcover Nonfiction Sports Book. @@ -26931,31 +26928,31 @@ msgstr[1] "" #. ~ Description for Softcover Fictional Sports Book. #: lang/json/BOOK_from_json.py msgid "This is a template." -msgstr "" +msgstr "Esto es una plantilla." #: lang/json/BOOK_from_json.py msgid "Softcover Nonfiction Sports Book." msgid_plural "Softcover Nonfiction Sports Book.s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro en Rústica No Ficticio de Deportes" +msgstr[1] "Libros en Rústica No Ficticios de Deportes" #: lang/json/BOOK_from_json.py msgid "Hardcover Fictional Sports Book" msgid_plural "Hardcover Fictional Sports Books" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro de Tapa Dura Ficticio sobre Deportes" +msgstr[1] "Libros de Tapa Dura Ficticios sobre Deportes" #: lang/json/BOOK_from_json.py msgid "Softcover Fictional Sports Book." msgid_plural "Softcover Fictional Sports Book.s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Libro en Rústica Ficticio sobre Deportes" +msgstr[1] "Libros en Rústica Ficticios sobre Deportes" #: lang/json/BOOK_from_json.py msgid "template for mass produced books on esoteric subjects" msgid_plural "template for mass produced books on esoteric subjectss" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "plantilla para libros de producción masiva sobre esoterismo" +msgstr[1] "plantillas para libros de producción masiva sobre esoterismo" #. ~ Description for template for mass produced books on esoteric subjects #: lang/json/BOOK_from_json.py @@ -27073,35 +27070,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Satire Template" msgid_plural "Satire Templates" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Plantilla para Sátira" +msgstr[1] "Plantillas para Sátira" #. ~ Description for Satire Template #: lang/json/BOOK_from_json.py msgid "template for mass produced satirical fiction" msgstr "" +"Es una plantilla para un libro de producción masiva satírico y de ficción." #: lang/json/BOOK_from_json.py msgid "Magazine Template" msgid_plural "Magazine Templates" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Plantilla para Revista" +msgstr[1] "Plantillas para Revista" #. ~ Description for Magazine Template #: lang/json/BOOK_from_json.py msgid "template for magazine" -msgstr "" +msgstr "Es una plantilla para revista." #: lang/json/BOOK_from_json.py msgid "News Magazine Template" msgid_plural "News Magazine Templates" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Plantilla para Revista de Noticias" +msgstr[1] "Plantillas para Revista de Noticias" #. ~ Description for News Magazine Template #: lang/json/BOOK_from_json.py msgid "template for news magazine" -msgstr "" +msgstr "Es una plantilla para una revista de noticias." #: lang/json/BOOK_from_json.py msgid "readable magazine" @@ -27112,13 +27110,14 @@ msgstr[1] "revistas legibles" #: lang/json/BOOK_from_json.py msgid "archery skill training abstract" msgid_plural "archery skill training abstracts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "nota sobre habilidad esquivar" +msgstr[1] "notas sobre habilidad esquivar" #. ~ Description for archery skill training abstract #: lang/json/BOOK_from_json.py msgid "template for heavy books that confer archery skill training" msgstr "" +"Es una plantilla para libros grandes que otorgan entrenamiento en arquería." #: lang/json/BOOK_from_json.py msgid "Lessons for the Novice Bowhunter" @@ -27730,10 +27729,10 @@ msgid "" "You could probably learn a lot about cooking from studying this domestic " "artifact." msgstr "" -"Una gran carpeta llena de recetas de alguna familia. Las elegantes páginas y" -" esquinas arrugadas nos da una idea de la cantidad de conocimiento culinario" -" que contiene. Probablemente, puedas aprender mucho sobre cocina estudiando " -"este libro casero." +"Es una gran carpeta llena de recetas de alguna familia. Las elegantes " +"páginas y esquinas arrugadas nos da una idea de la cantidad de conocimiento " +"culinario que contiene. Probablemente, puedas aprender mucho sobre cocina " +"estudiando este libro casero." #: lang/json/BOOK_from_json.py msgid "Bon Appetit" @@ -28229,7 +28228,7 @@ msgid "" "A thick textbook for beginning drivers. It contains chapters on laws, safe " "vehicle operation, and defensive driving concepts." msgstr "" -"Un libro grueso para conductores principiantes. Contiene capítulos sobre " +"Es un libro grueso para conductores principiantes. Contiene capítulos sobre " "leyes, operación segura del vehículo y conceptos de conducción defensiva." #. ~ Description for {'str': 'AAA Guide', 'str_pl': 'copies of AAA Guide'} @@ -28439,8 +28438,8 @@ msgstr[1] "esquemas" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -29706,10 +29705,10 @@ msgstr[1] "novelas de aventura" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." +"in the heart of the African continent." msgstr "" -"Una excitante historia sobre una carrera contra el tiempo, en busca de una " -"ciudad perdida localizada en el corazón oscuro del continente africano." +"Es una excitante historia sobre una carrera contra el tiempo, en busca de " +"una ciudad perdida localizada en el corazón del continente africano." #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -29726,30 +29725,6 @@ msgstr "" "Es una atrapante historia de dos amigos luchando por sobrevivir en las " "calles de la ciudad de Nueva York." -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "novela de iniciación" -msgstr[1] "novelas de iniciación" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "" -"Una clásica historia sobre madurar, narra las emotivas y divertidas " -"experiencias de un joven sobre la vida, el amor y el sexo." - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "" -"Es una novela gráfica acerca de una joven mujer viviendo en Irán durante los" -" 80, viendo cómo el mundo cambia a su alrededor cuando Irak invade su país." - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -29892,88 +29867,6 @@ msgstr[1] "novelas de misterio" msgid "A detective investigates an unusual murder in a secluded location." msgstr "Un detective investiga un inusual asesinato en un lugar aislado." -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "novela pulp" -msgstr[1] "novelas pulp" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "" -"Un historia dura de detectives, llena de acción contundente e intriga." - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "¡Planeta de Calamares Asesinos que el Tiempo Olvidó!" -msgstr[1] "¡Planeta de Calamares Asesinos que el Tiempo Olvidó!" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" -"En esta psicodélica novela de aventura y exploración cósmica, una asesina " -"anciana descubre un planeta demasiado bueno para ser cierto. Una vez que es " -"demasiado tarde, ella descubre la horrorosa verdad en el medio de \"¡El " -"Planeta de Calamares Asesinos que el Tiempo Olvidó!\"" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "Las Grandes Capas de Metrópolis" -msgstr[1] "Las Grandes Capas de Metrópolis" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" -"En esta clásica novela sensacionalista en rústica de abusos de superhéroes, " -"un grupo de vigilantes enmascarados con diversos poderes aprenden a trabajar" -" en equipo para vencer al principal villano." - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "Asesinatos de Ayer" -msgstr[1] "Asesinatos de Ayer" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" -"En esta novela noir sensacionalista y rápida, un detective de buen tomar con" -" los nervios de acero tiene una última oportunidad para vengarse." - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "Flashgun Condor y los Criminales Carmesí" -msgstr[1] "Flashgun Condor y los Criminales Carmesí" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" -"Una fotógrafa de sangre caliente que lucha contra el crimen con película, " -"grabaciones y puños, Condor es más que una mera fotógrafa de policiales. " -"Pero ¿podrá descubrir el retorcido engaño de los \"Criminales Carmesí\"?" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -30175,11 +30068,11 @@ msgstr[1] "novelas de samurai" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." +"marauding outlaws. This hardback is quite hefty." msgstr "" "La clásica historia de un espadachín errante que llega a un pequeño poblado " "y es contratado para ayudar a sus habitantes a defenderse de una banda de " -"forajidos saqueadores." +"forajidos saqueadores. Esta versión de tapa dura es bastante pesada." #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -30231,20 +30124,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "Margarita y el Maestro" -msgstr[1] "Margarita y el Maestro" +msgstr[1] "copias de Margarita y el Maestro" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" "Con personajes que incluyen a Satán, Poncio Pilatos, Jesucristo, vampiros, " -"un gato parlante y la elite literaria de Moscú, esto es una sátira de la " -"tiranía estalinista escrita por Mikhail Bulgakov." +"un gato parlante y la elite literaria de Moscú, esta novela de Mikhail " +"Bulgakov explora los problemas filosóficos de la naturaleza del bien y del " +"mal." #: lang/json/BOOK_from_json.py msgid "A Handful of Dust" @@ -30278,399 +30174,6 @@ msgstr "" " amenaza de una destrucción nuclear no es mucha influencia en la naturaleza " "humana." -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "novela de ciencia ficción" -msgstr[1] "novelas de ciencia ficción" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "Extraterrestres, pistolas de rayos y naves espaciales." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" -"Es una copia de \"Neuromante\" de Gibson. Escrito en los ochenta, fue " -"sorprendentemente preciso al predecir la sociedad moderna... Hasta hace " -"poco." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" -"Esto es una copia de \"Las estrellas mi destino\" de Alfred Bester.\n" -"\n" -" ¡Tigre! ¡Tigre! Ardiendo brillante,\n" -"en los bosques de la noche:\n" -"¿qué inmortal mano u ojo\n" -"podrá reflejar tu terrible simetría?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" -"Es una copia de \"La rueda celeste\" de Ursula Le Guin. Tiene manchas de " -"dedos sucios en algunas palabras." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "Es una copia de \"Los desposeídos\" de Ursula Le Guin." - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "Es una copia de \"Fahrenheit 451\" de Ray Bradbury." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "Es una copia de \"Hyperion\" de Dan Simmons." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" -"Es una copia de \"Endymion\" de Dan Simmons. Comienza con un poema de D.H. Lawrence:\n" -"\n" -"Danos dioses, ¡oh dánoslos!\n" -"Danos dioses.\n" -"Estamos cansados del hombre\n" -"y el poder del motor." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "" -"Es una copia de \"¿Sueñan los androides con ovejas eléctricas?\" de Phillip " -"K. Dick." - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "" -"Es una copia con las puntas dobladas de \"Nova Express\" de William " -"Burroughs." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "" -"Es una copia de \"Fundación\" de Isaac Asimov. La contratapa fue arrancada." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" -"Es una copia con las puntas dobladas de \"Dune\" de Frank Herbert. Tiene " -"arena entre algunas de sus páginas. Raro." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "" -"Es una copia de \"El juicio\" de Franz Kafka. El libro está bastante " -"gastado." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "Es una copia de \"El cuento de la criada\" de Margaret Atwood." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" -"Es una copia de \"La chica mecánica\" de Paolo Bacigalupi. La nota en la " -"solapa te hace preguntarte cómo le fue a Tailandia en el fin del mundo. " - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "Es una copia de \"Islas en la red\" de Bruce Sterling." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" -"Es una copia de \"Fundación e imperio\" de Isaac Asimov. La última página " -"tiene una lista de compra del supermercado." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" -"Esto es una copia casi nueva de \"Una mirada en la oscuridad\" de Phillip K." -" Dick. Todavía conserva el olor de los libros nuevos." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" -"Es una copia de \"Mirrorshades: Un antología ciberpunk\", compilado por " -"Bruce Sterling. La tapa tiene machas de café." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" -"Es una copia de \"El mundo de los No-A\" de A. E. van Vogt. Esta copia " -"parece que ha sido usada para secar flores." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "Es una copia de \"Carbono modificado\" de Richard Morgan." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "" -"Es una copia de \"Frankenstein\" de Mary Shelly. ¿Ese no era el nombre del " -"monstruo?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" -"Es una copa de \"Avispa\" de Eric Frank Russel. La guía del terrorista " -"futurista." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" -"Es una copia de \"Soy leyenda\" de Richard Matheson. La portada está " -"cubierta de sangre seca." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "Es una copia de \"Picnic junto al camino\" de Arkady y Boris Strugatsky." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" -"Es una copia de \"La guerra interminable\" de Joe Haldeman. Esta copia " -"parece como si hubiera sido masticada un poco por un perro o algún otro " -"animal grande." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "Es una copia de \"La luna es una cruel amante\" de Robert A. Heinlein." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" -"Es una copia de \"Cuna de gato\" de Kurt Vonnegut. Te llama la atención que " -"hay un error de tipografía en el nombre del autor en el lomo del libro." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" -"Es una copia de \"Nova\" de Samuel R. Delany. La tapa dice \"Copia de " -"reseña. Prohibida su reventa\"." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "Es una copia de \"Las sirenas de Titán\" de Vonnegut." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" -"Es una copia de \"Hierba\" de Sheri S. Tepper. Tiene garabatos de algún " -"chico hechos con crayón en las primeras páginas." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" -"Es una copia de \"Conde Cero\" de William Gibson. El lomo tiene un sello que" -" dice \"Copia de biblioteca\". Y un sticker que dice \"Ciencia ficción\"." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "" -"Es una copia de \"La quinta estación\" de N.K. Jemsin. Tiene un poco de olor" -" a tierra." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "Es una copia de \"Los fabricantes de armas\" de A. E. van Vogt." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" -"Es una copia de \"Record of a Spaceborn Few\" de Becky Chambers. Parece casi" -" como nuevo." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" -"Es una copia de \"El uso de las armas\" de Ian M. Banks. El lomo está rajado" -" y desgastado, y algunas páginas parecen estar sueltas." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "" -"Es una copia de \"El último hombre\" de Jean-Baptiste Cousin de Grainville." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" -"Es una copia de \"1984\" de Orwell. Las páginas son finitas y están un poco " -"sueltas. Vas a tener que ser cuidadoso con este libro." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "" -"Es una copia de \"Forastero en tierra extraña\" de Heinlein. La tapa tiene " -"la punta doblada y está desgastada." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "Es una copia de \"El juego de Ender\" de Orson Scott Card." - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "" -"Es una copia desgastada por el clima de \"Un mundo feliz\" de Aldous Huxley." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "Es una copia de \"El mundo perdido\" de Arthur Conan Doyle." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "Es una copia de \"Islas en el cielo\" de Arthur C. Clarke." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "Es una copia de \"La isla del Doctor Moreau\" de H. G. Wells." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "Es una copia de \"La voz de su amo\" de Stanislaw Lem." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "Es una copia de \"La nube negra\" de Fred Hoyle." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "Es una copia de \"La última y la primera humanidad\" de Olaf Stapledon." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "Es una copia de \"Solaris\" de Stanislaw Lem." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "Es una copia de \"Más que humano\" de Theodore Sturgeon." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "Es una copia de \"Vurt\" de Jeff Noon." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "Es una copia de \"Cántico por Leibowitz\" de Walter M. Miller Jr." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "Es una copia de \"La guerra de los mundos\" de H.G. Wells." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "Es una copia de \"Amanecer de hierro\" de Charles Stross." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" -"Es una copia de \"Los juegos del hambre\" de Suzanne Collins. La nota de la " -"tapa te hace acordar de una película japonesa que una vez viste en " -"televisión a la noche." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "Es una copia de \"El día de los trífidos\" de John Wyndham." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "Es una copia de \"La naranja mecánica\" de Anthony Burges." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "Es una copia de \"El hombre que cayó en la Tierra\" de Walter Tevis." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "Es una copia de \"Simulacron-3\" de Daniel F. Galouye." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "Es una copia de \"Abejas de cristal\" de Ernst Jünger." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "Es una copia de \"VIaje al centro de la Tierra\" de Jules Verne." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" -"Es una copia de \"Mundo Anillo\" de Larry Niven. Le faltan un par de páginas" -" al final del libro. Por suerte, solo eran publicidades." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "" -"Es una copia bastante gastada de \"Guía del autoestopista galáctico\" de " -"Douglas Adams." - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -32112,6 +31615,705 @@ msgstr "" "Es una copia de tapa blanda de \"El ser y la nada\" de Jean-Paul Sartre. En " "trabajo esencial de la tradición existencialista." +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "novela pulp" +msgstr[1] "novelas pulp" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "" +"Un historia dura de detectives, llena de acción contundente e intriga." + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "Valquirias Negras de Venus" +msgstr[1] "copias de Valquirias Negras" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" +"Tenés en tus manos una novela desgastada por el tiempo, escrita por alguien " +"llamado \"Lee Racket\"." + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "El Mañana Equivocado" +msgstr[1] "copias de Mañana Equivocado" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" +"Tenés en tus manos una versión barata en rústica de un libro escrito por " +"alguien llamado \"Lee Racket\"." + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "Sin Dios de un Cadáver" +msgstr[1] "copias de Sin Dios" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" +"Es un libro en rústica gastado por el tiempo, escrito por alguien llamado " +"\"Lee Racket\". Cuenta cómo la ira y los celos pueden convertir a un hombre," +" o a una mujer, en un monstruo. Esta historia es tan dura que podría romper " +"una cuchara." + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "El Buceo Profundo" +msgstr[1] "copias de Buceo Profundo" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" +"Esta historia corta vendida en locales de todo por dos pesos, habla del " +"viaje por el espacio. Está escrita por \"Lee Racket\"." + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "¡Planeta de Calamares Asesinos que el Tiempo Olvidó!" +msgstr[1] "¡Planeta de Calamares Asesinos que el Tiempo Olvidó!" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" +"En esta psicodélica novela de aventura y exploración cósmica, una asesina " +"anciana descubre un planeta demasiado bueno para ser cierto. Una vez que es " +"demasiado tarde, ella descubre la horrorosa verdad en el medio de \"¡El " +"Planeta de Calamares Asesinos que el Tiempo Olvidó!\"" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "Las Grandes Capas de Metrópolis" +msgstr[1] "Las Grandes Capas de Metrópolis" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" +"En esta clásica novela sensacionalista en rústica de abusos de superhéroes, " +"un grupo de vigilantes enmascarados con diversos poderes aprenden a trabajar" +" en equipo para vencer al principal villano." + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "Asesinatos de Ayer" +msgstr[1] "Asesinatos de Ayer" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" +"En esta novela noir sensacionalista y rápida, un detective de buen tomar con" +" los nervios de acero tiene una última oportunidad para vengarse." + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "Flashgun Condor y los Criminales Carmesí" +msgstr[1] "Flashgun Condor y los Criminales Carmesí" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" +"Una fotógrafa de sangre caliente que lucha contra el crimen con película, " +"grabaciones y puños, Condor es más que una mera fotógrafa de policiales. " +"Pero ¿podrá descubrir el retorcido engaño de los \"Criminales Carmesí\"?" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "novela de ciencia ficción" +msgstr[1] "novelas de ciencia ficción" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "Extraterrestres, pistolas de rayos y naves espaciales." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" +"Es una copia de \"Neuromante\" de Gibson. Escrito en los ochenta, fue " +"sorprendentemente preciso al predecir la sociedad moderna... Hasta hace " +"poco." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" +"Esto es una copia de \"Las estrellas mi destino\" de Alfred Bester.\n" +"\n" +" ¡Tigre! ¡Tigre! Ardiendo brillante,\n" +"en los bosques de la noche:\n" +"¿qué inmortal mano u ojo\n" +"podrá reflejar tu terrible simetría?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" +"Es una copia de \"La rueda celeste\" de Ursula Le Guin. Tiene manchas de " +"dedos sucios en algunas palabras." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "Es una copia de \"Los desposeídos\" de Ursula Le Guin." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "Es una copia de \"Hyperion\" de Dan Simmons." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" +"Es una copia de \"Endymion\" de Dan Simmons. Comienza con un poema de D.H. Lawrence:\n" +"\n" +"Danos dioses, ¡oh dánoslos!\n" +"Danos dioses.\n" +"Estamos cansados del hombre\n" +"y el poder del motor." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" +"Es una copia de \"¿Sueñan los androides con ovejas eléctricas?\" de Phillip " +"K. Dick." + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" +"Es una copia con las puntas dobladas de \"Nova Express\" de William " +"Burroughs." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" +"Es una copia de \"Fundación\" de Isaac Asimov. La contratapa fue arrancada." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" +"Es una copia de \"El juicio\" de Franz Kafka. El libro está bastante " +"gastado." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "Es una copia de \"El cuento de la criada\" de Margaret Atwood." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" +"Es una copia de \"La chica mecánica\" de Paolo Bacigalupi. La nota en la " +"solapa te hace preguntarte cómo le fue a Tailandia en el fin del mundo. " + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "Es una copia de \"Islas en la red\" de Bruce Sterling." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" +"Es una copia de \"Fundación e imperio\" de Isaac Asimov. La última página " +"tiene una lista de compra del supermercado." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" +"Esto es una copia casi nueva de \"Una mirada en la oscuridad\" de Phillip K." +" Dick. Todavía conserva el olor de los libros nuevos." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" +"Es una copia de \"Mirrorshades: Un antología ciberpunk\", compilado por " +"Bruce Sterling. La tapa tiene machas de café." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" +"Es una copia de \"El mundo de los No-A\" de A. E. van Vogt. Esta copia " +"parece que ha sido usada para secar flores." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "Es una copia de \"Carbono modificado\" de Richard Morgan." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" +"Es una copia de \"Frankenstein\" de Mary Shelly. ¿Ese no era el nombre del " +"monstruo?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" +"Es una copa de \"Avispa\" de Eric Frank Russel. La guía del terrorista " +"futurista." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" +"Es una copia de \"Soy leyenda\" de Richard Matheson. La portada está " +"cubierta de sangre seca." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" +"Es una copia de \"La guerra interminable\" de Joe Haldeman. Esta copia " +"parece como si hubiera sido masticada un poco por un perro o algún otro " +"animal grande." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "Es una copia de \"La luna es una cruel amante\" de Robert A. Heinlein." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" +"Es una copia de \"Nova\" de Samuel R. Delany. La tapa dice \"Copia de " +"reseña. Prohibida su reventa\"." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "Es una copia de \"Las sirenas de Titán\" de Vonnegut." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" +"Es una copia de \"Hierba\" de Sheri S. Tepper. Tiene garabatos de algún " +"chico hechos con crayón en las primeras páginas." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" +"Es una copia de \"Conde Cero\" de William Gibson. El lomo tiene un sello que" +" dice \"Copia de biblioteca\". Y un sticker que dice \"Ciencia ficción\"." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "Es una copia de \"Los fabricantes de armas\" de A. E. van Vogt." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" +"Es una copia de \"Record of a Spaceborn Few\" de Becky Chambers. Parece casi" +" como nuevo." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" +"Es una copia de \"El uso de las armas\" de Ian M. Banks. El lomo está rajado" +" y desgastado, y algunas páginas parecen estar sueltas." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" +"Es una copia de \"El último hombre\" de Jean-Baptiste Cousin de Grainville." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" +"Es una copia de \"1984\" de Orwell. Las páginas son finitas y están un poco " +"sueltas. Vas a tener que ser cuidadoso con este libro." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" +"Es una copia de \"Forastero en tierra extraña\" de Heinlein. La tapa tiene " +"la punta doblada y está desgastada." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "Es una copia de \"El juego de Ender\" de Orson Scott Card." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "Es una copia de \"El mundo perdido\" de Arthur Conan Doyle." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "Es una copia de \"Islas en el cielo\" de Arthur C. Clarke." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "Es una copia de \"La isla del Doctor Moreau\" de H. G. Wells." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "Es una copia de \"La voz de su amo\" de Stanislaw Lem." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "Es una copia de \"La nube negra\" de Fred Hoyle." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "Es una copia de \"La última y la primera humanidad\" de Olaf Stapledon." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "Es una copia de \"Solaris\" de Stanislaw Lem." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "Es una copia de \"Más que humano\" de Theodore Sturgeon." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "Es una copia de \"Vurt\" de Jeff Noon." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "Es una copia de \"Cántico por Leibowitz\" de Walter M. Miller Jr." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "Es una copia de \"La guerra de los mundos\" de H.G. Wells." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "Es una copia de \"Amanecer de hierro\" de Charles Stross." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" +"Es una copia de \"Los juegos del hambre\" de Suzanne Collins. La nota de la " +"tapa te hace acordar de una película japonesa que una vez viste en " +"televisión a la noche." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "Es una copia de \"El día de los trífidos\" de John Wyndham." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "Es una copia de \"La naranja mecánica\" de Anthony Burges." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "Es una copia de \"El hombre que cayó en la Tierra\" de Walter Tevis." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "Es una copia de \"Simulacron-3\" de Daniel F. Galouye." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "Es una copia de \"Abejas de cristal\" de Ernst Jünger." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "Es una copia de \"VIaje al centro de la Tierra\" de Jules Verne." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" +"Es una copia de \"Mundo Anillo\" de Larry Niven. Le faltan un par de páginas" +" al final del libro. Por suerte, solo eran publicidades." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" +"Es una copia bastante gastada de \"Guía del autoestopista galáctico\" de " +"Douglas Adams." + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "Dune" +msgstr[1] "copias de Dune" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" +"Es una copia con las puntas dobladas de \"Dune\" de Frank Herbert. Tiene " +"arena entre algunas de sus páginas. Raro." + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" +"Es una copia robusta de \"Dune\" de Frank Herbert. Es una reedición bastante" +" nueva que tiene escrito \"PRONTA A SER UNA IMPORTANTE PELÍCULA\" en la " +"funda." + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "Parábola de los Talentos" +msgstr[1] "copias de Parábola de los Talentos" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" +"Es una copia robusta de \"Parábola de los Talentos\". Es la secuela de " +"Octavia Butler a su libro \"Parabóla del Sembrador\"." + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "La Quinta Estación" +msgstr[1] "copias autografiadas de Quinta Estación" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" +"Es una copia autografiada de tapa dura de \"La Quinta Estación\" de N.K. " +"Jemisin, ganadora del premio Hugo. Tiene un olor usave a tierra." + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "Nosotros" +msgstr[1] "copias de Nosotros" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" +"Este libro de tapa dura se llama \"Nostros Anotado: Una Nueva Traducción de la Novela de Yevgueni Zamiatin.\"\n" +"\n" +"Es la traducción de 2015 de Vladimir Wozniuk de \"Nosotros\" originalmente publicada en 1924 y generalmente vista como la primera novela distópica moderna. Las notas examinan las profusas alusiones y partes más importantes en la naturaleza poética del lengua de Zamiatin." + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" +"Es un trabajo fundamental de la ficción distópica, \"Nosotros\" de Yevgueni Zamiatin fue publicada en 1924 pero oculta por la Unión Soviética hasta 1988.\n" +"\n" +"Esta edición masiva de 1993 que encontraste ha sido traducida del ruso por Clarence Brown e incluye una breve introducción. La tapa levemente gastada tiene una imagen surrealista de una persona mirando hacia atrás sospechosamente." + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "La Ciberíada" +msgstr[1] "copias de La Ciberíada" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" +"Este libro en rústica de 350 páginas presenta los abusos y rivalidades " +"robóticas de Trurl y Klapaucius. Originalmente escrito en polaco por " +"Stanislaw Lem, ha sido traducida al inglés por Michael Kandel." + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "Un Mundo Feliz" +msgstr[1] "copias de Un Mundo Feliz" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" +"Es una copia desgastade de \"Un Mundo Feliz\" de Aldous Huxley, que parece " +"haber agarrada por la lluvia. La novela comienza en un lúgubre edificio " +"donde se crian fetos en botellas en una línea de montaje." + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "Picnic al Borde del Camino" +msgstr[1] "copias de Picnic al Borde del Camino" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" +"Es una copia en rústica de \"Picnic al Borde del Camino\" de Arkady y Boris " +"Strugatsky. Ha sido traducido a más de 20 idiomas, a veces con el nombre " +"\"Stalker\". Esta versión, por suerte, está en tu idioma." + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "Fahrenheit 451" +msgstr[1] "copias de Fahrenheit 451" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "Es una copia de \"Fahrenheit 451\" de Ray Bradbury." + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" +"Algún chistoso le quemó levemente el borde a esta versión en rústica de esta" +" distopía. Igual, es perfectamente legible." + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" +"\"Fue un placer quemarlos. Fue especialmente un placer ver cosas devoradas, " +"ver cosas ennegrecidas y cambiadas.\"" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" +"Esta versión de tapa blanda de 1979 de \"Fahrenheit 451\" de Ray Bradbury " +"pertenecía a una biblioteca. Todavía tiene la tarjetita celeste de los " +"préstamos en la tapa de atrás. Una tal Suzanne Collins lo sacó en 1981." + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" +"La novela roja y negra en rústica que tenés en las manos, es una reimpresión" +" moderna de \"Fahrenheit 451\" de Ray Bradbury." + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" +"Esta novela de ciencia ficción está dividida en tres partes: \"Era Estupendo" +" Quemar\", \"La Criba y la Arena\" y \"Fuego Vivo\"." + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -32496,12 +32698,14 @@ msgstr[1] "10 Cosas Copadas de los Portadores de Anillo" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" "Este libro es para los encantadores y pequeños portadores de anillos en tu " "casamiento. El autor describe la responsabilidad y el honor de ser un " -"portador de anillo que tu pequeño ángel valorará." +"portador de anillo. Tu pequeño ángel valorará este libro y él o ella " +"aprenderá cómo comportarse en tu día perfecto." #: lang/json/BOOK_from_json.py msgid "How to Raise a Gentleman: A Civilized Guide to Parenting" @@ -34073,11 +34277,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" -msgstr[0] "La Chica Tontadorable" -msgstr[1] "La Chica Tontadorable" +msgid_plural "copies of Adorkable" +msgstr[0] "La Chica Adorkable" +msgstr[1] "copias de Adorkable" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -34090,26 +34295,28 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "Volviéndose Jackson" -msgstr[1] "Volviéndose Jackson" +msgstr[1] "copias de Volviéndose Jackson" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" "Cuando Jackson obtiene el talento místico de alterar su apariencia cuando " -"quiere, ¿podrá continuar reconociéndose a sí mismo en el espejo?" +"quiere, ¿podrá reconocerse a sí mismo en el espejo?" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "Nada Quemado" -msgstr[1] "Nada Quemado" +msgstr[1] "copias de Nada Quemado" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -34120,11 +34327,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "Alto y Bajo" -msgstr[1] "Alto y Bajo" +msgstr[1] "copias de Alto y Bajo" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -34139,11 +34347,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" -msgstr[0] "Fuego Cuando Miras Mis Ojos" -msgstr[1] "Fuego Cuando Miras Mis Ojos" +msgid_plural "copies of Fire When" +msgstr[0] "Dispara Cuando Veas Mis Ojos" +msgstr[1] "copias de Dispara Cuando" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -34154,11 +34363,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" -msgstr[0] "Moretones de Mantequilla de Maní" -msgstr[1] "Moretones de Mantequilla de Maní" +msgid_plural "copies of Peanut Butter Bruised" +msgstr[0] "Moretón de Crema de Maní" +msgstr[1] "copias de Moretón de Crema de Maní" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -34171,11 +34381,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" -msgstr[0] "Listo Cuando Vos Lo Estés" -msgstr[1] "Listo Cuando Vos Lo Estés" +msgid_plural "copies of Ready When" +msgstr[0] "Listo Cuando Estés Listo" +msgstr[1] "copias de Listo Cuando" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -34189,11 +34400,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "Estudio de un Chico" -msgstr[1] "Estudio de un Chico" +msgstr[1] "copias de \"Estudio de un Chico\"" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -34206,11 +34418,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" -msgstr[0] "Variables de Verano" -msgstr[1] "Variables de Verano" +msgid_plural "copies of Summer Variables" +msgstr[0] "Variaciones de Verano" +msgstr[1] "copias de Variaciones de Verano" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -34221,6 +34434,73 @@ msgstr "" "pasantía de verano de una mujer se convierte en un increíble descubrimiento " "que atrae la atención de elementos desagradables." +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "En un Lugar Oscuro" +msgstr[1] "copias de Lugar Oscuro" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" +"Markia sueña con el futuro. Theo añora el pasado. ¿Podrán encontrar juntos " +"una manera de vivir en el presente?" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "Se Necesitan Dos Para Traicionar" +msgstr[1] "copias de Se Necesitan Dos Para Traicionar" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" +"Es una copia de tapa dura para adolescentes tardíos. Los dos personajes " +"principales le hacen una broma a sus compañeros de clase, y estrechan su " +"relación tanto por sus esfuerzos frenéticos para evitar ser atrapados y su " +"sentimiento compartido de culpabilidad." + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "novela de iniciación" +msgstr[1] "novelas de iniciación" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "" +"Una clásica historia sobre madurar, narra las emotivas y divertidas " +"experiencias de un joven sobre la vida, el amor y el sexo." + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "Panteón: La Historia de la Juventud Iraní" +msgstr[1] "copias de Panteón" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" +"Es una novela gráfica con tapa dura acerca de una joven mujer viviendo en " +"Irán durante los 80, viendo cómo el mundo cambia a su alrededor cuando Irak " +"invade su país." + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -34690,6 +34970,19 @@ msgstr "" "Con un intenso ritual que recuerda al crossfit, lográs poner a raya un poco " "de tu dolor." +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "Pergamino de Polimorfia Siniestra" +msgstr[1] "Pergaminos de Polimorfia Siniestra" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "Transforma a tus enemigos en sapos." + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -36040,8 +36333,8 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Scroll of Coagulant Weave" msgid_plural "Scrolls of Coagulant Weave" -msgstr[0] "Pergamino de Ola Coagulante" -msgstr[1] "Pergaminos de Ola Coagulante" +msgstr[0] "Pergamino de Tejido Coagulante" +msgstr[1] "Pergaminos de Tejido Coagulante" #. ~ Description for {'str': 'Scroll of Coagulant Weave', 'str_pl': 'Scrolls #. of Coagulant Weave'} @@ -36116,6 +36409,53 @@ msgstr "" "presión del aire hará caer a los enemigos al suelo, el conjuro es " "inofensivo." +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "Pergamino de Abrir" +msgstr[1] "Pergaminos de Abrir" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" +"Podés canalizar la energía mágica para abrir puertas de madera cerradas " +"desde una corta distancia." + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "Pergamino de Abrir Mejorado" +msgstr[1] "Pergaminos de Abrir Mejorado" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" +"Podés canalizar la energía mágica para abrir cualquier puerta cerrada desde " +"una corta distancia." + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "Pergamino de Arco Repelente" +msgstr[1] "Pergaminos de Arco Repelente" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" +"Manifestás un aura de electricidad chisporroteante alrededor tuyo para " +"golpear a los atacantes con rayos malignos." + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -36454,6 +36794,23 @@ msgstr "" "Este libro de referencia de laboratorio es grueso y desborda información " "sobre combinar magia con radiación electromagnética." +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "pedazo de Tableta Rúnica" +msgstr[1] "pedazos de Tableta Rúnica" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" +"Es una pequeña tableta de piedra negra, aparentemente cortada de un pedazo " +"mucho más grande. Tiene unas runas doradas brillando en su superficie y va " +"cambiando para formar oraciones inteligibles cuando las mirás." + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -36523,43 +36880,6 @@ msgstr "" " Te quiero,\n" " - F. \"." -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "En el Principio... Fue la Línea de Comando" -msgstr[1] "copias de En el Principio... Fue la Línea de Comando" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" -"Es un ensayo humorístico de 1999 escrito por Neal Stephenson, comparando a " -"los vendedores de sistemas operativos con los vendedores de autos." - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "Principios de Diseño del Compilador" -msgstr[1] "copias de Principios de Diseño del Compilador" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" -"Es el libro de texto clásico de informática de 1977 escrito por Alfred Aho y" -" Jeffrey Ullman. También conocido como El libro del dragón verde porque en " -"la tapa tiene el dibujo de un caballero empuñando un parser LALR y la " -"traducción dirigida a sintaxis contra un dragón verde metafórico, La " -"Complejidad del Diseño del Compilador." - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -38382,18 +38702,8 @@ msgstr[1] "pedazos de carne mutante" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." -msgstr "" -"Es la carne de un animal muy mutado. Tiene una textura perturbadoramente " -"floja y esponjosa, pero el olor... es casi normal. Tiene extraños nudos y " -"formaciones que no parece nada naturales: pedazos de hueso y pelo " -"incrustados en el músculo, como si intentaran formar otro organismo. De " -"todas maneras, para digerible, si lo cocinás y le sacás las peores partes." +msgid "Meat from a heavily mutated animal." +msgstr "Es carne de un animal muy mutado." #: lang/json/COMESTIBLE_from_json.py msgid "scrap of mutant meat" @@ -38405,15 +38715,11 @@ msgstr[1] "pedazos de carne mutante" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" -"Es un pedacito de carne de un animal muy mutado. Tiene un olor raro, y " -"pedazos de pelo y hueso mezclados que parecen haber crecido dentro de los " -"mismos músculos. Igual, parece ser digerible, por lo menos, si lo cocinás y " -"le sacás las peores partes." +"Es un pequeño pedazo de carne de un animal muy mutado. Tiene un olor poco " +"atractivo, por decir lo menos." #: lang/json/COMESTIBLE_from_json.py msgid "mutant humanoid meat" @@ -38497,14 +38803,8 @@ msgstr[1] "carnes mutantes cocinadas" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" -msgstr "" -"Es un pedazo cocinado de carne de un animal mutante. Tiene una textura " -"perturbadoramente esponjosa, pero el gusto... es bastante normal. Con " -"suerte, ya le pudiste sacar todos los pedazos de pelo y hueso..." +msgid "This is a cooked chunk of meat from a mutated animal." +msgstr "Esto es un pedazo de carne cocinada de un animal mutado." #: lang/json/COMESTIBLE_from_json.py msgid "cooked scrap of mutant meat" @@ -38512,6 +38812,16 @@ msgid_plural "cooked scraps of mutant meat" msgstr[0] "pedazo de carne mutante cocinada" msgstr[1] "pedazos de carne mutante cocinada" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" +"Esto es un pedacito de carne mutante cocinada. Es lo suficientemente pequeña" +" para que no te des cuenta de lo desagradable que es." + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -38546,6 +38856,17 @@ msgstr "" " esenciales, pero mucha gente lo considera desagradable salvo que sea " "cuidadosamente preparado." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "órganos mutantes" +msgstr[1] "órganos mutantes" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "Estos órganos pertenecieron a un insecto gigante mutado." + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -38748,6 +39069,17 @@ msgstr "" " sabor. No parece más sabroso que cuando estaba crudo, pero al menos los " "parásitos han sido eliminados." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "pulmones mutantes" +msgstr[1] "pulmones mutantes" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "Estás bastante seguro que esto es tejido de pulmón." + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -38934,11 +39266,13 @@ msgstr[1] "pedazos de grasa mutante" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" -"Es grasa recién carneada de un animal muy mutado. La podés comer cruda, pero" -" es mejor usarla como ingrediente para otras comidas o proyectos." +"Es grasa recién carneada de un animal muy mutado. Tiene un olor, si es " +"posible, más desagradable que el resto del mutante. Hay algunos charquitos " +"de un aceite desconocido que gotean de la carne." #: lang/json/COMESTIBLE_from_json.py msgid "mutant tallow" @@ -40501,19 +40835,19 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "Es agua con azúcar o miel agregada. El gusto está bien." #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" -msgstr[0] "té" -msgstr[1] "té" +msgid "black tea" +msgid_plural "black teas" +msgstr[0] "té negro" +msgstr[1] "tés negros" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" -"La bebida del caballero, hecha aplicando agua caliente a hojas de la planta " -"del té, Camellia sinensis." +"La bebida del caballero, hecha poniendo agua caliente a hojas oxidadas de la" +" planta del té, /Camellia sinensis/." #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -40566,6 +40900,39 @@ msgstr "" "Agua mineral extravagante, tan extravagante que tenerla en la mano te hace " "sentir extravagante." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "té verde" +msgstr[1] "tés verdes" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" +"Se hace poniendo agua caliente a hojas de la planta del té /Camellia " +"sinensis/. El té verde es más de sabor más fresco y liviano que el negro, y " +"es tradicionalmente preferido en las culturas asiáticas." + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "té frutal" +msgstr[1] "tés frutales" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" +"Es una sabrosa bebida que se hace con hierbas y fruta disecada de otras " +"plantas que no sean la del té. Aunque coloquialmente se lo llama 'té', " +"técnicamente es una infusión." + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -40597,7 +40964,7 @@ msgid "" "The beverage of gentlemen everywhere, made from applying hot water to leaves" " of the tea plant /Camellia sinensis/. Added sweetener for a better taste." msgstr "" -"Es la bebida del caballero, hecha aplicando agua caliente a hojas de la " +"Es la bebida del caballero, hecha poniendo agua caliente a hojas de la " "planta del té, Camellia sinensis. Con edulcorante agregado para mejorar su " "sabor." @@ -42147,14 +42514,14 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "peanut butter candy" msgid_plural "peanut butter candies" -msgstr[0] "golosina de mantequilla de maní" -msgstr[1] "golosinas de mantequilla de maní" +msgstr[0] "golosina de crema de maní" +msgstr[1] "golosinas de crema de maní" #. ~ Description for {'str': 'peanut butter candy', 'str_pl': 'peanut butter #. candies'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of peanut butter cups… your favorite!" -msgstr "Es un puñado de bocaditos de mantequilla de maní... ¡tus favoritos!" +msgstr "Es un puñado de bocaditos de crema de maní… ¡tus favoritos!" #: lang/json/COMESTIBLE_from_json.py msgid "chocolate candy" @@ -42496,6 +42863,36 @@ msgid "" msgstr "" "Son nachos de maíz salados con carne picada y queso cremoso. Delicioso." +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "nacho de verdura" +msgstr[1] "nachos de verdura" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" +"Son nachos de maíz salados, ahora con porotos. Le vendría bien un poco de " +"queso." + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "nachos de verdura con queso" +msgstr[1] "nachos de verdura con queso" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" +"Son nachos de maíz salados con porotos y queso cremoso. Delicioso, incluso " +"si no sos vegetariano." + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -46880,7 +47277,6 @@ msgstr[0] "piñones" msgstr[1] "piñones" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "Es un puñado de frutos secos sabrosos y crujientes de una piña." @@ -47155,8 +47551,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "peanut butter" msgid_plural "peanut butters" -msgstr[0] "mantequilla de maní" -msgstr[1] "mantequilla de maní" +msgstr[0] "crema de maní" +msgstr[1] "crema de maní" #. ~ Description for peanut butter #: lang/json/COMESTIBLE_from_json.py @@ -47170,8 +47566,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "imitation peanutbutter" msgid_plural "imitation peanutbutters" -msgstr[0] "imitación de mantequilla de maní" -msgstr[1] "imitación de mantequilla de maní" +msgstr[0] "imitación de crema de maní" +msgstr[1] "imitación de crema de maní" #. ~ Description for imitation peanutbutter #: lang/json/COMESTIBLE_from_json.py @@ -47181,13 +47577,13 @@ msgstr "Es una pasta espesa y marrón, con gusto a nuez." #: lang/json/COMESTIBLE_from_json.py msgid "peanut butter spread" msgid_plural "peanut butter spreads" -msgstr[0] "mantequilla de maní untable" -msgstr[1] "mantequilla de maní untable" +msgstr[0] "crema de maní untable" +msgstr[1] "crema de maní untable" #. ~ Description for peanut butter spread #: lang/json/COMESTIBLE_from_json.py msgid "Processed peanut butter spread.." -msgstr "Es mantequilla de maní procesada para untar." +msgstr "Es crema de maní procesada para untar." #: lang/json/COMESTIBLE_from_json.py msgid "acorns" @@ -47878,30 +48274,65 @@ msgstr "" " perfecto para pájaros chiquitos." #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "comida para perros" -msgstr[1] "comida para perros" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "comida húmeda para perros" +msgstr[1] "comida húmeda para perros" -#. ~ Description for {'str_sp': 'dog food'} +#. ~ Description for {'str_sp': 'wet dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." msgstr "" -"Es comida para perros. Tiene un olor extraño, pero a los perros parece que " -"les gusta." +"Es comida húmeda para perros, hecha con carne fresca enlatada. Tiene un olor" +" extraño, pero a los perros parece que les gusta." #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "comida para gatos" -msgstr[1] "comida para gatos" +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "comida seca para perros" +msgstr[1] "comida seca para perros" -#. ~ Description for {'str_sp': 'cat food'} +#. ~ Description for {'str_sp': 'dry dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." msgstr "" -"Es comida para gatos. Tiene un olor extraño, pero a los gatos parece que les" -" gusta." +"Son trozos de comida para perros con una caducidad extensa. Hecha con carnes" +" y granos secos procesados, y enriquecida con vitaminas y minerales." + +#: lang/json/COMESTIBLE_from_json.py +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "comida húmeda para gatos" +msgstr[1] "comida húmeda para gatos" + +#. ~ Description for {'str_sp': 'wet cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" +"Es comida húmeda para gatos, hecha con carne fresca enlatada. Tiene un aroma" +" intenso que a los gatos parece encantarles." + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "comida seca para gatos" +msgstr[1] "comida seca para gatos" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" +"Son trozos de alimento balanceado para gatos con una caducidad extensa. " +"Hecho con carnes y granos secos procesados, y enriquecido con vitaminas y " +"minerales." #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -47943,19 +48374,49 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "Es néctar. Si ves esto es un bug." #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" -msgstr[0] "saquito de té" -msgstr[1] "saquitos de té" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "saquito de té negro" +msgstr[1] "saquitos de té negro" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" +"Es un saquito de papel con hojas de té adentro. Ponelo en agua hirviendo " +"para hacer una taza de té negro." + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "saquito de té verde" +msgstr[1] "saquitos de té verde" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." msgstr "" "Es un saquito de papel con hojas de té adentro. Ponelo en agua hirviendo " -"para hacer una taza de té." +"para hacer una taza de té verde." + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "saquito de té frutal" +msgstr[1] "saquitos de té frutal" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." +msgstr "" +"Es un saquito de papel con hojas de té y pedazos de frutas adentro. Ponelo " +"en agua hirviendo para hacer una taza de té frutal." #: lang/json/COMESTIBLE_from_json.py msgid "herbal tea bag" @@ -48055,25 +48516,17 @@ msgstr[1] "raciones de proteína" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" -"SoyPelusa hizo una campaña muy exitosa para juntar fondos para su clásica " -"barra de proteínas, apodada \"DaiZoom\". Una persona puede vivir con una de " -"estas barras, tres veces por día, presumiblemente para siempre. Luego de que" -" los patrocinadores recibieron el producto, solo se encontró una falla: la " -"mayoría de los consumidores decidieron que era mejor la hambruna que el " -"sabor que tenía. Quedaron sin vender depósitos enteros del producto cuando " -"la compañía quedó en bancarrota, lo que le dio la oportunidad perfecta a " -"FEMA para agarrarlas y guardarlas en los refugios de evacuación. Ahora, " -"tenés un pedazo de la historia de las campañas de recolección de dinero en " -"tus manos. Qué excitante." +"SoyPelusa hizo una campaña muy exitosa para juntar fondos para su clásica barra de proteínas, apodada \"DaiZoom\".\n" +"\n" +"Una persona puede vivir con una de estas barras, tres veces por día, presumiblemente para siempre. Luego de que los patrocinadores recibieron el producto, solo se encontró una falla: la mayoría de los consumidores decidieron que era mejor la hambruna que el sabor que tenía. Quedaron sin vender depósitos enteros del producto cuando la compañía quedó en bancarrota, lo que le dio la oportunidad perfecta a FEMA para agarrarlas y guardarlas en los refugios de evacuación.\n" +"\n" +"Ahora, tenés un pedazo de la historia de las campañas de recolección de dinero en tus manos. Qué excitante." #: lang/json/COMESTIBLE_from_json.py msgid "protein shake" @@ -48966,12 +49419,12 @@ msgstr "" " para extraer la azúcar." #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "hoja de té" -msgstr[1] "hojas de té" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "hoja de té negro" +msgstr[1] "hojas de té negro" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "Dried leaves of a tropical plant. You can boil them into tea, or you can " @@ -48980,6 +49433,21 @@ msgstr "" "Hojas secas de una planta tropical. La podés hervir para hacer té, o las " "podés comer crudas. No te van a llenar mucho, igual." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "hoja de té verde" +msgstr[1] "hojas de té verde" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" +"Son hojas secas de una planta tropical. La podés hervir para hacer té verde," +" o te las podés comer crudas. No te van a llenar mucho, igual." + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -49284,8 +49752,8 @@ msgstr "Pan y carne, eso." #: lang/json/COMESTIBLE_from_json.py msgid "peanut butter sandwich" msgid_plural "peanut butter sandwiches" -msgstr[0] "sánguche de mantequilla de maní" -msgstr[1] "sánguches de mantequilla de maní" +msgstr[0] "sánguche de crema de maní" +msgstr[1] "sánguches de crema de maní" #. ~ Description for {'str': 'peanut butter sandwich', 'str_pl': 'peanut #. butter sandwiches'} @@ -49294,8 +49762,8 @@ msgid "" "Some peanut butter smothered between two pieces of bread. Not very filling " "and will stick to the roof of your mouth like glue." msgstr "" -"Es un poco de mantequilla de maní entre dos pedazos de pan. No te llena " -"mucho y se te pega al paladar como pegamento." +"Es un poco de crema de maní entre dos pedazos de pan. No te llena mucho y se" +" te pega al paladar como pegamento." #: lang/json/COMESTIBLE_from_json.py msgid "PB&J sandwich" @@ -49309,8 +49777,8 @@ msgid "" "A delicious peanut butter and jelly sandwich. It reminds you of the times " "your mother would make you lunch." msgstr "" -"Es un delicioso sánguche de mantequilla de maní y mermelada. Te hace acordar" -" a cuando tu vieja te preparaba el almuerzo (si hubieras vivido en EE.UU.)" +"Es un delicioso sánguche de crema de maní y mermelada. Te hace acordar a " +"cuando tu vieja te preparaba el almuerzo (si hubieras vivido en EE.UU.)" #: lang/json/COMESTIBLE_from_json.py msgid "PB&H sandwich" @@ -49324,8 +49792,8 @@ msgid "" "Some damned fool put honey on this peanut butter sandwich, who in their " "right mind- oh wait this is pretty good." msgstr "" -"Algún estúpido puso miel en su sánguche de mantequilla de maní, que en su " -"sano juicio- ah, pará, está bastante bueno." +"Algún estúpido puso miel en su sánguche de crema de maní, que en su sano " +"juicio- ah, pará, está bastante bueno." #: lang/json/COMESTIBLE_from_json.py msgid "PB&M sandwich" @@ -49339,8 +49807,8 @@ msgid "" "Who knew you could mix maple syrup and peanut butter to create yet another " "different sandwich?" msgstr "" -"¿Quién hubiera dicho que se podía mezclar jarabe de arce y mantequilla de " -"maní para crear otro sánguche más?" +"¿Quién hubiera dicho que se podía mezclar jarabe de arce y crema de maní " +"para crear otro sánguche más?" #: lang/json/COMESTIBLE_from_json.py msgid "fish sandwich" @@ -49409,7 +49877,7 @@ msgstr[1] "rizomas de lúpulo" #. ~ Description for {'str_sp': 'hop rhizomes'} #: lang/json/COMESTIBLE_from_json.py msgid "Roots of a hop plant, for growing your own." -msgstr "Raíces de una planta de lúpulo, para poder hacer crecer más." +msgstr "Son raíces de una planta de lúpulo, para poder cultivar más." #: lang/json/COMESTIBLE_from_json.py msgid "hops" @@ -51941,6 +52409,74 @@ msgstr "" " puede ser usada para hornear pan, de manera más efectiva que si fuera solo " "harina." +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "tallo de ananá" +msgstr[1] "tallo de ananá" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "Son raíces de una planta de ananá, para poder cultivar más." + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "semillas de melón" +msgstr[1] "semillas de melón" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "Son unas semillas de melón." + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "brotes de banano" +msgstr[1] "brotes de banano" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "Son unos brotes de banano." + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "liana de naranja" +msgstr[1] "liana de naranja" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "Son unas lianas de naranja. Definitivamente, transgénicas." + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "liana de limón" +msgstr[1] "liana de limón" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "Son unas lianas de limón. Definitivamente, transgénicas." + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "coco subterráneo" +msgstr[1] "coco subterráneo" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" +"Es una prueba de que el hombre había ido demasiado lejos antes del " +"Cataclismo." + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -52407,6 +52943,12 @@ msgid_plural "ankylosaurus eggs" msgstr[0] "huevo de ankylosaurus" msgstr[1] "huevos de ankylosaurus" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "huevo de apatosaurus" +msgstr[1] "huevos de apatosaurus" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -52785,7 +53327,7 @@ msgid_plural "scream mushrooms" msgstr[0] "grithongo" msgstr[1] "grithongos" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -53012,115 +53554,6 @@ msgstr "" "No existimos en este momento. Pequeño humano inteligente, ¿así que debugging" " para ver esto? No te vamos a permitir unirte mientras estamos modeando." -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "TEST piñones" -msgstr[1] "TEST piñones" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "mosto de vino de pelota de tenis" -msgstr[1] "mostos de vino de pelota de tenis" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" -"Es vino sin fermentar de pelota de tenis. Un jugo gomoso y hervido hecho con" -" pelotas de tenis aplastadas." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -54100,21 +54533,6 @@ msgstr[1] "latas de aluminio" msgid "An aluminum can, like what soda comes in." msgstr "Es una lata de aluminio, como la de las gaseosas." -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "lata abierta de aluminio" -msgstr[1] "latas abiertas de aluminio" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Es una lata de aluminio, como las de las gaseosas. Esta ha sido abierto y no" -" puede ser sellada fácilmente." - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -54124,27 +54542,12 @@ msgstr[1] "tetras" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" "Es un tetra de dos litros de cartón fino, laminado de aluminio y plástico. " "Tiene una tapa a rosca para resellarla fácilmente." -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "tetra abierto" -msgstr[1] "tetras abiertos" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" -"Es un tetra de dos litros de cartón fino, laminado de aluminio y plástico. " -"Está abierto y su contenido se va a pudrir." - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -54167,21 +54570,6 @@ msgstr[1] "latas pequeñas de estaño" msgid "A small tin can, like what tuna comes in." msgstr "Es una lata chica de estaño, como las del atún." -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "lata pequeña de estaño abierta" -msgstr[1] "latas pequeñas de estaño abiertas" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Es una lata chica de estaño, como las de atún. Está abierta y no puede ser " -"sellada fácilmente." - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -54193,21 +54581,6 @@ msgstr[1] "latas medianas de estaño" msgid "A medium tin can, like what soup comes in." msgstr "Es una lata mediana de estaño, como las de tomate." -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "lata mediana de estaño abierta" -msgstr[1] "latas medianas de estaño abiertas" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Es una lata mediana de estaño, como las de tomate. Está abierta y no puede " -"ser sellada fácilmente." - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -54293,30 +54666,17 @@ msgstr[1] "vasos de plástico" msgid "A small, vacuum formed cup." msgstr "Es un vaso pequeño que en algún momento estuvo sellado al vacío." -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "vaso abierto de plástico" -msgstr[1] "vasos abiertos de plástico" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "" -"Es un vaso pequeño que en algún momento estuvo sellado al vacío. Ahora es " -"esencialmente basura." - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" -msgstr[0] "frasco de vidrio" -msgstr[1] "frascos de vidrio" +msgstr[0] "jarra de vidrio" +msgstr[1] "jarras de vidrio" #. ~ Description for {'str': 'glass flask'} #: lang/json/GENERIC_from_json.py msgid "A 250 ml laboratory conical flask, with a rubber bung." msgstr "" -"Es un frasco cónico de laboratorio con una capacidad de 250 ml y un tapón de" +"Es una jarra cónica de laboratorio con una capacidad de 250 ml y un tapón de" " goma." #: lang/json/GENERIC_from_json.py @@ -54399,8 +54759,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "3L glass jar" msgid_plural "3L glass jars" -msgstr[0] "jarra de vidrio de 3L" -msgstr[1] "jarras de vidrio de 3L" +msgstr[0] "frasco de vidrio de 3L" +msgstr[1] "frascos de vidrio de 3L" #. ~ Description for {'str': '3L glass jar'} #: lang/json/GENERIC_from_json.py @@ -54412,8 +54772,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "sealed 3L glass jar" msgid_plural "sealed 3L glass jars" -msgstr[0] "jarra sellada de vidrio de 3L" -msgstr[1] "jarras selladas de vidrio de 3L" +msgstr[0] "frasco sellado de vidrio de 3L" +msgstr[1] "frascos sellados de vidrio de 3L" #. ~ Description for {'str': 'sealed 3L glass jar'} #: lang/json/GENERIC_from_json.py @@ -54428,8 +54788,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "glass jar" msgid_plural "glass jars" -msgstr[0] "jarra de vidrio" -msgstr[1] "jarras de vidrio" +msgstr[0] "frasco de vidrio" +msgstr[1] "frascos de vidrio" #. ~ Description for {'str': 'glass jar'} #: lang/json/GENERIC_from_json.py @@ -54505,7 +54865,6 @@ msgstr[0] "jarro de galón" msgstr[1] "jarros de galón" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "" @@ -54622,7 +54981,6 @@ msgstr[0] "odre pequeño" msgstr[1] "odres pequeños" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -54771,21 +55129,6 @@ msgstr "" "Es una lata grande de estaño, como las del ananá. Contiene una buena " "cantidad de comida." -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "lata grande de estaño abierta" -msgstr[1] "latas grandes de estaño abiertas" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Es una lata grande de estaño, como las del ananá. Esta ha sido abierta y no " -"puede ser sellada fácilmente." - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -55354,6 +55697,38 @@ msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "" "Es un pedazo del exoesqueleto de un insecto. Es liviano y muy resistente." +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "hebra de endoquitina" +msgstr[1] "hebras de endoquitina" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "Es un pedazo del endoesqueleto de un insecto." + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "racimo de sacos de gas" +msgstr[1] "racimos de sacos de gas" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" +"Es un racimo de burbujas membranosas, cada una del tamaño de una uva, y que " +"está sacado del interior de un insecto mutante. Flotan como pequeños globos " +"de helio y deben estar llenos de un gas más liviano que el aire que les " +"permite volar al insectos." + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -55430,6 +55805,38 @@ msgstr "" "Son pedazos de fieltro, atados para que ocupen menos espacio. Lo tenés que " "desarmar para abrirlo." +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "paquete de tablas" +msgstr[1] "paquetes de tablas" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" +"Son diez tablas atadas juntas con una soga. Hay que desarmarlo para " +"desatarlas." + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "paquete de ramas fuertes" +msgstr[1] "paquetes de ramas fuertes" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" +"Son diez ramas fuertes atadas juntas con una soga. Hay que desarmarlo para " +"desatarlas." + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -56774,8 +57181,8 @@ msgid_plural "lotus flowers" msgstr[0] "flor de loto" msgstr[1] "flores de loto" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -58243,8 +58650,8 @@ msgid "" "parts." msgstr "" "Es una mecha-gallina rota. A pesar de estar totalmente fuera de servicio " -"sigue siendo intimidatorio, posiblemente debido a su tamaño y masa. Puede " -"ser desarmado para recuperar las partes." +"sigue siendo intimidatoria, posiblemente debido a su tamaño y masa. Puede " +"ser desarmada para recuperar las partes." #: lang/json/GENERIC_from_json.py msgid "broken tribot" @@ -58404,6 +58811,17 @@ msgstr "" "Es un cañón láser que pertenecía a una torreta láser TX-5LR Cerberus. No se " "puede usar como arma así solo sin las partes necesarias." +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "conjunto de corazas de hueso" +msgstr[1] "conjuntos de corazas de hueso" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "Son placas de hueso para ser usadas como armadura en un vehículo." + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -60162,6 +60580,68 @@ msgstr "" "Es un cadáver a medio decapitar. No está claro qué le puede haber causado " "esa herida." +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "trabajador exodii roto" +msgstr[1] "trabajadores exodii rotos" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" +"Es un trabajador exodii roto. Es posible que pueda ser desarmado para " +"recuperar las partes." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "cuadrúpedo exodii roto" +msgstr[1] "cuadrúpedos exodii rotos" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" +"Es un mecha-exodii roto. A pesar de estar totalmente fuera de servicio sigue" +" siendo intimidatorio, posiblemente debido a su tamaño y masa. Puede ser " +"desarmado para recuperar las partes." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "torreta exodii rota" +msgstr[1] "torretas exodii rotas" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" +"Es una torreta exodii rota. A pesar de estar totalmente fuera de servicio " +"sigue siendo intimidatoria, posiblemente debido a su tamaño y masa. Puede " +"ser desarmada para recuperar las partes." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "dron-globo exodii roto" +msgstr[1] "drones-globo exodii rotos" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" +"Es un dron-globo roto. El globo está destrozado pero la mayor parte del " +"chasis está intacta. Puede ser desarmado para recuperar partes." + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -62155,7 +62635,7 @@ msgstr[1] "micrófonos XLR" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" "Es el típico micrófono utilizado para grabar o amplificar voces. Viene con " "un clip prendedor. Tiene un conector XLR de 3 pines en la parte de abajo " @@ -62372,6 +62852,22 @@ msgstr "" "Es un simple impulsor mecánico de hierro de una bomba. Así solo no sirve " "para mucho que digamos." +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "equipo de cañería" +msgstr[1] "equipos de cañería" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" +"Son unos accesorios de caños de metal - tapones, empalmes y similares. " +"Pueden ser usados en una variedad de trabajos." + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -63122,10 +63618,10 @@ msgstr[1] "martillos Lucernas" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" "Es un arma de asta versátil con una cabeza de martillo con púas, una punta y" -" un gancho unidos a un palo largo." +" un gancho unidos a una robusta vara de madera." #. ~ Description for {'str': 'lucerne hammer'} #: lang/json/GENERIC_from_json.py @@ -63557,7 +64053,6 @@ msgstr[0] "palo con punta" msgstr[1] "palos con punta" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "Es un simple palo de madera con una punta afilada." @@ -63662,19 +64157,19 @@ msgstr[1] "alabardas" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." +" attached to a long sturdy stick." msgstr "" "Es un arma de asta versátil con una cuchilla de hacha, una púa, y otras " -"cosas divertidas unidas a un palo largo." +"cosas divertidas agregadas a un palo robusto y largo." #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." +"spike, and other fun things attached to a thick pole." msgstr "" "Es una réplica berreta sin filo de una arma de asta con una cuchilla de " -"hacha, una púa, y otras cosas divertidas unidas a un palo largo." +"hacha, una púa, y otras cosas divertidas agregadas a una vara gruesa." #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -64390,21 +64885,6 @@ msgstr "" "cuchilla similar a una garra, proveniente de India y diseñada para estar " "oculta en la palma de la mano." -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "caestus" -msgstr[1] "caestus" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" -"Es un brazo y mano envueltos en cuero que incorporan placas metálicas sobre " -"los nudillos para mejorar la potencia del golpe y la defensa." - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -64587,6 +65067,136 @@ msgstr "" "de vidrio marino, congelado y arenoso, con las puntas redondeadas. Es, por " "alguna razón, tibio al tacto." +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "chasis de Exodii" +msgstr[1] "chasis de Exodii" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" +"Son una armazón y carrocería bastante hexagonales que parecen haber sido " +"fabricadas como una sola pieza monolítica. Los agujeros y uniones son " +"extremadamente resistentes a pesar de tener signos de gran desgaste y de " +"reparaciones. La estructura es versátil y probablemente podría ser diseñada " +"para servir un número de diferentes roles de combate." + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "chasis de dron Exodii" +msgstr[1] "chasis de dron Exodii" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" +"Son unas pequeñas armazón y carrocería bastante hexagonales que parecen " +"haber sido fabricadas como una sola pieza monolítica. Los agujeros y uniones" +" son extremadamente resistentes a pesar de tener signos de gran desgaste y " +"de reparaciones. La estructura es versátil y probablemente podría ser " +"diseñada para servir un número de diferentes roles de combate." + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "matriz neural cibernética" +msgstr[1] "matrices neurales cibernéticas" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" +"Es una serie de tanques y tubos con conexiones y fluidos, electricidad y " +"entradas y salidas. Esta compleja disposición está hecha para recibir un " +"cerebro y una columna vertebral y los órganos más difíciles de reemplazar " +"para mantenerlos vivos." + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "coso electrónico raro" +msgstr[1] "cosos electrónicos raros" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" +"Los cables y su forma general te sugieren que esto es una computadora o, por" +" lo menos, alguna clase de dispositivo electrónico, pero no tenés idea qué " +"es y qué función tiene. Tiene una construcción pesada y robusta." + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "placa inscripta de metal" +msgstr[1] "placas inscriptas de metal" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" +"Este dispositivo parece electrónico pero no sabés qué es. Es una serie " +"apretada de anillos que parecen de cobre, puestos de manera concéntrica. Hay" +" cables que salen de cada anillo y van hacia el eje en el medio." + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "sensor cibernético" +msgstr[1] "sensores cibernéticos" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" +"Por el gran ojo cristalino en el frente - del tamaño de un plato - deducís " +"que es alguna especie de cámara. El funcionamiento interno no tiene ningún " +"sentido para vos ni parece alguna cámara que hayas visto antes." + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "dispositivo rotatorio" +msgstr[1] "dispositivos rotatorios" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" +"Por las bobinas de alambre de cobre y el pistón sobresaliente, asumís que es" +" alguna especie de motor o generador, pero el diseño no se parece a nada que" +" hayas visto antes, y no te das cuenta cómo hacerlo funcionar." + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -64688,7 +65298,6 @@ msgstr[0] "caño" msgstr[1] "caños" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -64931,7 +65540,13 @@ msgstr "" "Es una lámina grande de plástico pesado y flexible, del tipo que usan para " "hacer envolturas o para hacer burletes." -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "lámina de plástico rígido" +msgstr[1] "láminas de plástico rígido" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -66001,11 +66616,11 @@ msgstr[1] "gujas improvisadas" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." msgstr "" -"Es una gran cuchilla unida a un palo largo. Puede causar un daño " -"considerable." +"Es una gran cuchilla unida a un robusto pedazo de rama. Puede causar un daño" +" considerable." #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -66199,6 +66814,25 @@ msgstr[1] "abrochadoras" msgid "A stapler for fastening sheets of paper together." msgstr "Es una abrochadora para enganchar hojas juntas." +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "perforadora" +msgstr[1] "perforadoras" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" +"Esta herramienta de metal puede ayudarte a hacer un agujero en un pedazo de " +"papel. Digo, hacer más de un agujero si querés, pero vas a tener que " +"hacerlos de a uno. O, si tanto querés hacer más de un agujero a la vez, " +"supongo que podrías plegar el papel… Es una perforadora cilíndrica." + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -66502,6 +67136,22 @@ msgstr "" " al vehículo hasta que flote. Después ponele los remos o el motor para que " "se pueda mover." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "casco de balsa" +msgstr[1] "cascos de balsa" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" +"Son troncos atados para hacer que flote un vehículo. Agregale cascos de bote" +" a un vehículo hasta que flote. Después ponele los remos o el motor para que" +" se pueda mover." + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -67558,7 +68208,6 @@ msgstr[0] "lámina de metal" msgstr[1] "lámina de metal" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "Es una lámina fina de metal." @@ -67688,17 +68337,6 @@ msgstr "" "Son unas placas durables de quitina recubierta en silicio, hechas para " "cubrir un vehículo." -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "conjunto de corazas de hueso" -msgstr[1] "conjuntos de corazas de hueso" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "Son placas de hueso para ser usadas como armadura en un vehículo." - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -68017,8 +68655,8 @@ msgid_plural "workbenches" msgstr[0] "mesa de trabajo" msgstr[1] "mesas de trabajo" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -68129,8 +68767,8 @@ msgstr "Es un lavarropas chico, diseñado para ser usado en vehículos." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "programmable autopilot" msgid_plural "programmable autopilots" -msgstr[0] "autopiloto programable" -msgstr[1] "autopilotos programables" +msgstr[0] "piloto automático programable" +msgstr[1] "pilotos automáticos programables" #. ~ Description for {'str': 'programmable autopilot'} #: lang/json/GENERIC_from_json.py @@ -68224,6 +68862,18 @@ msgstr "" "Una canilla de metal que puede ser puesta en un tanque de agua para " "facilitar el uso." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "soporte de madera para ruedas" +msgstr[1] "soportes de madera para ruedas" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" +"Es un pedazo de madera con agujeros adecuados para una rueda de bicicleta." + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -68473,8 +69123,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "broken sentinel-lx" msgid_plural "broken sentinels-lx" -msgstr[0] "sentinel-lx roto" -msgstr[1] "sentineles-lx rotos" +msgstr[0] "centinela-lx roto" +msgstr[1] "centinelas-lx rotos" #. ~ Description for {'str': 'broken sentinel-lx', 'str_pl': 'broken #. sentinels-lx'} @@ -68483,7 +69133,7 @@ msgid "" "The irreparably broken remains of a Sentinel-lx. Could be gutted for " "valuable parts." msgstr "" -"Son los restos rotos e irreparables de un Sentinel-lx. Puede ser desarmada " +"Son los restos rotos e irreparables de un Centinela-lx. Puede ser desarmada " "para recuperar partes." #: lang/json/GENERIC_from_json.py @@ -68942,6 +69592,20 @@ msgid "It has given you an answer, but you are yet to ask anything." msgstr "" "Te ha dado una respuesta y sin embargo, todavía estás por preguntar algo." +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "lámina de metamaterial tejido" +msgstr[1] "láminas de metamaterial tejido" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" +"Es una lámina intrincadamente tejida y cuidadosamente diseñada de fibras " +"iridiscentes." + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -69047,11 +69711,26 @@ msgstr[1] "electroimanes superconductores" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." msgstr "" "Es un poderoso electroimán hecho con un superconductor de temperatura " "ambiente." +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "dínamo de ferrofluido" +msgstr[1] "dínamos de ferrofluido" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." +msgstr "" +"Es un fluido metálico negro, que fluye armónicamente de una figura fractal " +"hacia otra." + #: lang/json/GENERIC_from_json.py msgid "composite alloy" msgid_plural "composite alloys" @@ -69775,6 +70454,18 @@ msgstr "" "Es una colección de antiguas historias y conocimiento hyliano. Tiene marcada" " una sección sobre batallas históricas." +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "Guerrero de Tormenta" +msgstr[1] "Guerrero de Tormenta" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "" +"Este libro contiene las enseñanzas de la disciplina del Corazón de Hierro." + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -69790,6 +70481,72 @@ msgstr "" "Es una biografía de un agente ciborg de combate, que detalla su filosofía y " "su arte marcial." +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "Enciclopedia de Bolsillo de Monstruos" +msgstr[1] "Enciclopedia de Bolsillo de Monstruos" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" +"Esta enciclopedia contiene un listado detallado de las fortalezas y técnicas" +" de varios monstruos ficticios, y cómo aplicarlo en las peleas reales." + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "Horizonte Distante" +msgstr[1] "Horizonte Distante" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "Este libro contiene las enseñanzas de la disciplina del Sol Poniente." + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "Holocrones Jedi: Forma I" +msgstr[1] "Holocrones Jedi: Forma I" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" +"Este dispositivo contiene las enseñanzas de la primera forma del sable de " +"luz de combate Jedi: Shii-Cho." + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "Esquirlas de Granito" +msgstr[1] "Esquirlas de Granito" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" +"Este libro contiene las enseñanzas de la disciplina del Dragón de Piedra." + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "Zarpas Segadoras" +msgstr[1] "Zarpas Segadoras" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" +"Este libro contiene las enseñanzas de la disciplina de la Garra de Tigre." + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -69815,10 +70572,10 @@ msgstr[1] "polvos brillantes" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" -"Es los restos en polvo de la forma física de una luz mala. Parece que " +"Son los restos en polvo de la forma física de una luz mala. Parece que " "todavía conserva un brillo sobrenatural." #: lang/json/GENERIC_from_json.py @@ -69964,9 +70721,9 @@ msgstr[1] "polvos de maná" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" -"Es maná cristalizado forma de polvo. Parece latir levemente con energía " +"Es maná cristalizado en forma de polvo. Parece latir levemente con energía " "arcana." #: lang/json/GENERIC_from_json.py @@ -71518,140 +72275,6 @@ msgstr "" "Es una armazón hecha de oricalco. Bastante más resistente que el acero, pero" " también mucho más caro." -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "TEST jarro de galón" -msgstr[1] "TEST jarros de galón" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "TEST odre pequeño" -msgstr[1] "TEST odres pequeños" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "ARMAS" @@ -74838,6 +75461,40 @@ msgstr "" "Es un recipiente improvisado de 2lts, diseñado para alimentar un lanzador " "químico." +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "cargador PA Md. 71 Exodii 12.3ln" +msgstr[1] "cargadores PA Md. 71 Exodii 12.3ln" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" +"Es un pequeño cargador elegante basado en el clásico peine PA Md. 71, " +"rediseñado por los Exodii para ser usado en sus livianos drones. Su pequeño " +"tamaño no es apropiado para luchar en tierra contra hordas de zombis, porque" +" es un poco incómodo para recargar." + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "cargador PA Md. 68 Exodii 12.3ln" +msgstr[1] "cargadores PA Md. 68 Exodii 12.3ln" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "" +"Es un ilógicamente cargador grande para el ya de por sí gran rifle de " +"combate PA Md. 68, personalizado y fabricado por los Exodii." + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -75382,30 +76039,6 @@ msgstr "" "Es un pequeño cristal de maná, específicamente diseñado para ser puesto en " "puntas de varitas." -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "predeterminado" @@ -75421,8 +76054,14 @@ msgstr "Aftershock" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." -msgstr "Aleja el juego del realismo y lo lleva más a la ciencia ficción." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." +msgstr "" +"Acerca el juego más a la ciencia ficción, alejándolo del realismo. El " +"objetivo buscado hace tiempo es ser una experiencia significativamente " +"diferente que igual sea compatible con otros mods." #: lang/json/MOD_INFO_from_json.py msgid "Blaze Industries" @@ -75468,11 +76107,13 @@ msgstr "Dark Skies Above" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" -"Es una conversión total que lleva Cataclysm hacia un estilo XCOM 2 de " -"ocupación alienígena. ¡Usalo con otros mods a tu propio riesgo!" +"Es una conversión completa que lleva el Cataclysm hacia un escenario de " +"ocupación alienígena. ESTE MOD ROMPERÁ LA FUNCIONALIDAD DE OTROS MODS! USALO" +" CON OTROS MODS A TU PROPIO RIESGO." #: lang/json/MOD_INFO_from_json.py msgid "DinoMod" @@ -75700,18 +76341,6 @@ msgstr "" "Permite que las características del personaje mejoren con la progresión de " "las habilidades." -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "TESTING DATA" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" -"Agrega bosquejos de objetos, recetas y otro contenido que utilizan los tests" -" automatizados." - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "Desarrollo Urbano" @@ -76058,6 +76687,61 @@ msgstr "" "suficiente, se podría devolverle algo de humanidad. Lástima que no les " "importa..." +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "trabajador Exodii" +msgstr[1] "trabajadores Exodii" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "" +"Es un robot bastante humanoide equipado con varias herramientas de " +"construcción." + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "cuadrúpedo Exodii" +msgstr[1] "cuadrúpedos Exodii" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" +"Este enorme robot cuadrúpedo parece estar armado con diversas partes, la " +"mayoría de ellas desconocidas para vos. Se mueve con una marcha pesada y " +"extrañamente grácil, sus pasos van dejando pequeños cráteres. Está lleno de " +"un arsenal pero no parece estar en apuro de atacarte." + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "zomborg" +msgstr[1] "zomborgs" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" +"Es una mezcla de humano muerto con tecnología más muerta, esta cosa " +"retorcida de acero y carne se mueve como una marioneta en las manos de un " +"pibe enojado. Sus componentes robóticos parecen haberse apagado y nuevos " +"pedazos de carne se han enroscado sobre ellos, tironeándolos en direcciones " +"incómodas. Pedazos de esqueleto metálico y placas de blindaje sobresalen de " +"su carne pútrida." + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -76336,6 +77020,29 @@ msgstr "" "cuadrirrotor parece tener una minibomba nuclear adentro. Si te tiene como " "objetivo... corré." +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "dron-globo francotirador" +msgstr[1] "globo drone francotirador" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" +"Este inusual aparato parece una combinación de un globo meteorológico y un " +"cuadrirrotor. Debajo de esa rudimentaria caja con componentes cuelga un " +"pequeño brazo articulado con un rifle integrado. Sus propulsores se " +"encienden brevemente y se vuelven a apagar, manteniéndolo estático a pesar " +"de las corrientes de aire. Parece capaz de suspenderse en el aire por un " +"largo tiempo antes de quedarse sin energía." + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -77247,9 +77954,9 @@ msgid "" "Once human, fungal tendrils now sprout from its mouth, eyes, and other " "orifices, holding together a shambling mass of mold-covered flesh." msgstr "" -"Una vez fue un humano, ahora brotan tallos de hongos de su boca, ojos y " -"otros orificios, manteniendo unido la masa desordenada de carne cubierta con" -" moho." +"Lo que alguna vez fue humano, ahora tiene tallos fúngicos brotando de su " +"boca, ojos y otros orificios. Esos tallos mantienen unido esta masa " +"desordenada de carne cubierta con moho." #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" @@ -77961,6 +78668,17 @@ msgstr "" "todas las cabezas se mueven rápidamente y las bocas arman un coro de gritos " "y quejidos." +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "humano" +msgstr[1] "humanos" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "Esto es para poner cadáveres humanos. Si te aparece, es un bug." + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -78460,6 +79178,25 @@ msgstr "" "largas distancias con fuertes saltos, cazando su presa con sus mortales " "garras antes de dar el golpe final con sus enormes colmillos." +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "tigre" +msgstr[1] "tigres" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" +"Es el majestuoso tigre, un gran felino depredador. Nativo de Asia, ahora son" +" populosos en reservas privadas de los Estados Unidos. Rápido y poderoso, " +"este depredador es uno de los animales más reconocibles y amados del mundo. " +"También es uno de los más letales." + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -78993,7 +79730,7 @@ msgid "" "A hooved grazing mammal with a mane of hair, a sweeping tail, and powerful-" "looking muscles." msgstr "" -"Un mamífero de pastoreo con pezuñas con una melena, una cola grande y " +"Es un mamífero de pastoreo con pezuñas con una melena, una cola grande y " "músculos que parecen poderosos." #: lang/json/MONSTER_from_json.py @@ -80465,6 +81202,22 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "¡Se ven rayos que salen del tallo chupasangre!" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "árbol señal" +msgstr[1] "árboles señal" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" +"Es un tronco que se eleva alto hacia el cielo, con sus ramas más altas " +"brillando con una luz amarilla. Un tamborileo suave hace temblar " +"periódicamente sus alrededores." + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -80719,8 +81472,8 @@ msgid "" "black body glistens as it oozes its way along the ground. Eye stalks " "occasionally push their way out of the oily mass and look around." msgstr "" -"Una criatura similar a una babosa, de dos metros y medio de largo y ancha " -"como una heladera. Su cuerpo negro brilla mientras va rezumando por el " +"Es una criatura similar a una babosa, de dos metros y medio de largo y ancha" +" como una heladera. Su cuerpo negro brilla mientras va rezumando por el " "suelo. Sus ojos pedunculados salen ocasionalmente de la masa aceitosa y " "miran a su alrededor." @@ -80736,7 +81489,7 @@ msgid "" "A mutated leopard slug, as wide as a golf cart. Venom dripping from its " "fanged maw, it slithers ahead slowly, leaving a trail of glistening slime." msgstr "" -"Una babosa leopardo mutada, tan ancha como un carrito de golf. Le gotea " +"Es una babosa leopardo mutada, tan ancha como un carrito de golf. Le gotea " "veneno de sus fauces con colmillos, repta lentamente hacia adelante, dejando" " un rastro de baba brillante." @@ -80887,9 +81640,9 @@ msgid "" " speed. The tangle is thick enough that the center from which they grow is " "concealed." msgstr "" -"Una masa animada de enredaderas y raíces, que se arrastra por el suelo con " -"una velocidad alarmante. La maraña es tan gruesa que el centro del cual está" -" creciendo, queda oculto." +"Es una masa animada de enredaderas y raíces que se arrastra por el suelo con" +" una velocidad alarmante. La maraña es tan gruesa que el centro del cual " +"está creciendo, queda oculto." #: lang/json/MONSTER_from_json.py msgid "fungal fighter" @@ -80935,8 +81688,9 @@ msgid "" "A knot of tubular roots, flowing with sap and beating like a heart. Strands" " of vascular tissue reach out to the surrounding root walls." msgstr "" -"Un nudo de raíces tubulares, con savia fluyendo y latiendo como un corazón. " -"Las hebras de tejido vascular se estiran hacia las raíces de alrededor." +"Es un nudo de raíces tubulares con savia fluyendo y latiendo como un " +"corazón. Las hebras de tejido vascular se estiran hacia las raíces de " +"alrededor." #: lang/json/MONSTER_from_json.py msgid "improvised MP5 turret" @@ -81072,6 +81826,23 @@ msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "" "Es un parlante de gran potencia, que repite mensajes fuertes una y otra vez." +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "torreta supraciclada" +msgstr[1] "torretas supracicladas" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" +"Esta pesada torreta parece estas compuestas de varios pedazos de tecnología," +" muchos de los cuales se ven extraños. Está equipado con una pesada " +"ametralladora." + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -81183,6 +81954,184 @@ msgstr "" "sentir muy incómodo. El fin del mundo no evitó que todavía esté esperando un" " paciente para asistir." +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "perro esquelético" +msgstr[1] "perros esqueléticos" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"Esto que alguna vez fue canino ha perdido toda su piel, revelando un " +"caparazón de costillas y huesos fusionados. Desprovisto completamente de " +"carne, este paquete de huesos ambulante parece estar controlado por una red " +"de venas y tendones relucientes de una viscosidad negra." + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "barghest" +msgstr[1] "barghests" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" +"Es un enorme perro zombi hinchado, manchado de negro y baboso. Sus dientes " +"son largos y su ancha espalda está llena de músculos y heridas supurantes." + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "horror descomunal" +msgstr[1] "horrores descomunales" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" +"Es un cuerpo canino de cuatro patas, ahora grotescamente hinchado, con los " +"brazos anchos como tachos de basura y gigantescos dientes." + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "lobo óseo" +msgstr[1] "lobos óseos" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" +"Es una criatura de cuatro patas cubierta de placas óseas fusionadas, con " +"forma de perro o lobo. Las articulaciones y fisuras de su cuerpo chorrean " +"una viscosidad negra." + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "lobo esquelético" +msgstr[1] "lobos esqueléticos" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "cazador gatolanza" +msgstr[1] "cazadores gatolanza" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" +"Los ojos de este puma rezuman un fluido espeso, negro y aceitoso, y su piel " +"está desgarrada dejando ver heridas infectadas. Sus garras y dientes son de " +"un largo y filo sobrenatural, similares a peligrosas púas filosas." + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "ozombi esquelético" +msgstr[1] "ozombis esqueléticos" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" +"La piel podrida de este ozombi ha sido reemplazada por una monstruosa " +"exuberancia de tejido osificado, creando una armadura densa de hueso. " +"Grandes pedazos de viscosidad negra se filtran por las articulaciones " +"mientras camina, haciendo enfermizos ruidos de quebraduras que llenan el " +"aire." + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "gatosombra" +msgstr[1] "gatosombras" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" +"Una extraña sombra envuelve a esta criatura, como si la misma luz evitara " +"tocarla. Lo único que ves es una silueta felina grande y tambaleante." + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "ozombi ácido" +msgstr[1] "ozombis ácidos" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" +"Es un oso negro muerto de apariencia enfermiza y la piel despedazada. Su " +"piel parece especialmente delgada, con un fluido pegajoso y amarillo " +"corriéndole por sus venas claramente visibles." + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "martillo cornudo" +msgstr[1] "martillos cornudos" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Lo que fue alguna vez un gran alce ahora tiene los ojos rezumantes de un " +"fluido negro y aceitoso, con su carne destrozada y con cicatrices. Su cuerpo" +" entero está repleto de músculos dilatadas y heridas hinchadas e infectadas." + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "desorden osuno espinoso" +msgstr[1] "desórdenes osunos espinosos" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" +"Lo que fue alguna vez un gran alce ahora está cubierto de pelo largo " +"apelmazado mezclado con lianas espinosas que se juntan en la parte posterior" +" del cuerpo. Unas espinas largas entrelazadas cubren los cuernos, chorreando" +" una misterioso líquido plateado." + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -81213,25 +82162,6 @@ msgstr "" "El cadáver deformado y reanimado de un canino, una bestia vigorosa que " "fácilmente puede dejar rezagados a sus amigos de dos patas." -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "perro esquelético" -msgstr[1] "perros esqueléticos" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"Esto que alguna vez fue canino ha perdido toda su piel, revelando un " -"caparazón de costillas y huesos fusionados. Desprovisto completamente de " -"carne, este paquete de huesos ambulante parece estar controlado por una red " -"de venas y tendones relucientes de una viscosidad negra." - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -81275,14 +82205,14 @@ msgid "" "A zombified wolf. Its mouth oozes with a black substance, coating the " "vicious-looking white fangs." msgstr "" -"Un lobo zombificado. De su boca chorrea una sustancia negra, cubriendo sus " -"feroces colmillos blancos." +"Es un lobo zombificado. De su boca chorrea una sustancia negra, cubriendo " +"sus feroces colmillos blancos." #: lang/json/MONSTER_from_json.py msgid "zombear" msgid_plural "zombears" -msgstr[0] "osombi" -msgstr[1] "osombis" +msgstr[0] "ozombi" +msgstr[1] "ozombis" #. ~ Description for {'str': 'zombear'} #: lang/json/MONSTER_from_json.py @@ -81333,8 +82263,8 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "antlered horror" msgid_plural "antlered horrors" -msgstr[0] "horror con cuernos" -msgstr[1] "horrores con cuernos" +msgstr[0] "horror cornudo" +msgstr[1] "horrores cornudos" #. ~ Description for {'str': 'antlered horror'} #: lang/json/MONSTER_from_json.py @@ -81364,6 +82294,36 @@ msgstr "" "Podría parecer un puma normal si no fuera que sus patas traseras están " "agrandadas, y sus ojos resaltan con una viscosidad negra." +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "tigrombi" +msgstr[1] "tigrombis" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" +"Esto que podría parecer un tigre normal se va tambaleando y tropezando, con " +"su mandíbula floja y sus ojos bien abiertos de un negro brillante." + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "masa de arañas zombi" +msgstr[1] "masa de arañas zombi" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" +"Miles, tal vez millones, de arañas amontonándose, cada una chorreando una " +"pus verde, luchando por mantener esta masa unida y moviéndose." + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -82031,6 +82991,54 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "¡El impalador lanza una púa!" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "miembrostijeras" +msgstr[1] "miembrostijeras" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" +"Es una araña pesadillesca de vísceras que sobresale entre las ruinas, y " +"mantiene una vigilancia silenciosa del paisaje arruinado. Sus miembros " +"larguiruchos de hueso se escurren entre los escombros con una velocidad " +"sobrenatural." + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "tripas colgantes" +msgstr[1] "tripas colgantes" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" +"Son grandes serpientes de carne colgando del techo, azotándose y " +"estirándose." + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "bulto espasmódico" +msgstr[1] "bultos espasmódicos" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" +"Es una gran pila de cuerpos y carne mutada fundida. Tiene espasmos de una " +"manera arrítmica y desesperada." + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -82634,8 +83642,8 @@ msgid "" "skin. Joints and cracks around its body ooze with black goo." msgstr "" "La piel podrida de este zombi está cubierta de placas de hueso calcificadas," -" distorsionadas y sobrecrecidas. Las articulaciones y fisuras de este cuerpo" -" chorrean una viscosidad negra." +" distorsionadas y sobrecrecidas. Las articulaciones y fisuras de su cuerpo " +"chorrean una viscosidad negra." #: lang/json/MONSTER_from_json.py msgid "skeletal shocker" @@ -82984,8 +83992,8 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "Wraitheon Sentinel-lx" msgid_plural "Wraitheon Sentinel-lxs" -msgstr[0] "sentinel-lxs Wraitheon" -msgstr[1] "sentineles-lxs Wraitheon" +msgstr[0] "Centinela-lx Wraitheon" +msgstr[1] "Centinelas-lxs Wraitheon" #. ~ Description for {'str': 'Wraitheon Sentinel-lx'} #: lang/json/MONSTER_from_json.py @@ -84398,6 +85406,21 @@ msgstr "" "Es un dinosaurio enorme con similitudes al rinoceronte, con una cresta de " "huesos de la que le salen tres cuernos grandes." +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "Triceratops bio-operador" +msgstr[1] "Triceratops bio-operador" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" +"Es un enorme dinosaurio de tres cuernos y cuatro patas, con manchas y " +"biónicos chisporroteantes. Los cuernos brillan amenazantes." + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -84427,6 +85450,22 @@ msgstr "" "Este dinosaurio parece como un quirquincho prehistórico gigante. Su cola " "termina en lo que parece un garrote enorme de hueso con púas." +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "Apatosaurus" +msgstr[1] "Apatosaurus" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" +"Es un gigantesco dinosaurio de cuello largo y cuatro patas, con una cola " +"larga y similar a un látigo. Tiene la cabeza erguida y el cuello podría " +"funcionar como un fuerte garrote." + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -84672,6 +85711,122 @@ msgid_plural "magenta and green hatchlings" msgstr[0] "cría magenta y verde" msgstr[1] "crías magenta y verde" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "Spinosaurus zombi fúngico" +msgstr[1] "Spinosaurus zombis fúngicos" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" +"Lo que alguna vez fue un enorme dinosaurio carnívoro con cabeza de cocodrilo" +" con una vela en su espalda, ahora tiene tallos fúngicos brotando de su " +"boca, ojos y otros orificios, que logran mantener unido esta enorme masa " +"temblorosa de carne cubierta de moho." + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "Z-Rex fúngico" +msgstr[1] "Z-Rexes fúngicos" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" +"Alguna vez fue el monarca de los dinosaurios, tiene tallos fúngicos brotando" +" de su boca, ojos y otros orificios. Esos tallos mantienen unido esta enorme" +" masa desordenada de carne cubierta con moho." + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "zombi Deinonychus fúngico" +msgstr[1] "zombis Deinonychus fúngicos" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" +"Lo que alguna vez fue un dinosaurio carnívoro mediano con plumas, ahora " +"tiene tallos fúngicos brotando de su boca, ojos y otros orificios, que " +"logran mantener unido esta enorme masa temblorosa de carne cubierta de moho." + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "zombi Gallimimus" +msgstr[1] "zombis Gallimimus" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro." + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "zombi Pachy" +msgstr[1] "zombis Pachy" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro. Se parece a una " +"avestruz reptiliana con la cabeza redondeada." + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "zombi Campto" +msgstr[1] "zombis Campto" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo grande, con " +"plumas, piernas robustas, hombros anchos y un pico puntiagudo. Sus plumas " +"rotas están manchadas con un líquido pegajoso y negro." + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "Spinosaurus zombi" +msgstr[1] "Spinosaurus zombis" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" +"Es un enorme cadáver pútrido de dinosaurio con una feroz cabeza similar a un" +" cocodrilo, ojos negros purulentos y una vela medio rota en la espalda." + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -84685,21 +85840,617 @@ msgstr "" "Enormes pilas de carne irregular y maloliente sostienen dientes enormes." #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" -msgstr[0] "Z-Deinonychus" -msgstr[1] "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "zombi Albertosaurus" +msgstr[1] "zombis Albertosaurus" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" +"Es un cuerpo gigante de dinosaurio con mandíbulas enormes que babean un " +"líquido negro y unas garras preocupantes." + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "Triceraterror" +msgstr[1] "Triceraterrores" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" +"Es un enorme dinosaurio tambaleante similar al rinoceronte, con una cresta " +"ósea desde la que le salen tres cuernos malvados. Desde sus ojos negros " +"gotea algo similar a lágrimas." + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "zombi Stegosaurus" +msgstr[1] "zombis Stegosaurus" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" +"Es un gran dinosaurio cuadrúpedo tambaleante que se arrastra por el peso de " +"las placas en su espalda, y va ondeando una cola con púas que parece mucho " +"más vivaz." + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "zombi Ankylosaurus" +msgstr[1] "zombis Ankylosaurus" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" +"Es el cuerpo que va arrastrándose de lo que parece un armadillo gigantesco, " +"con placas despellejadas de armadura y brillantes ojos negros. Su cola " +"termina en un enorme garrote de hueso con puntas." + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "zombi Apatosaurus" +msgstr[1] "zombis Apatosaurus" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" +"Es el gigantesco cuerpo de un dinosaurio de cuello largo y cuatro patas, con" +" una cola larga y similar a un látigo. Tiene la cabeza erguida y el cuello " +"podría funcionar como un fuerte garrote." + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "dragón zombi" +msgstr[1] "dragones zombi" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" +"Este zombi es enorme, escamoso, con muchas púas óseas, y se mueve a una " +"velocidad enorme. Sus coloridos cuernos están desgastados y mojados de " +"desechos, y sus escamas brillantes y púas óseas están golpeadas." + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "zombi Allosaurus" +msgstr[1] "zombis Allosaurus" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo depredador, con " +"rayas como las de un tigre en su ancha espalda escamada." + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "zombi Deinonychus" +msgstr[1] "zombis Deinonychus" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " "tattered feathers and black putrid liquid. Both feet brandish a large " "sickle-like claw." msgstr "" -"Es un cuerpo reorganizado de tamaño medio de un dinosaurio bípedo cubierto " -"con plumas rotas y un líquido pútrido negro. Los dos pies lucen un garra " -"grande similar a un hoz." +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro. Los dos pies lucen un " +"garra grande similar a un hoz." + +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "zombi Utahraptor" +msgstr[1] "zombis Utahraptor" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" +"Es el cuerpo bamboleante de un gran dinosaurio bípedo con plumas en los " +"brazos, una cola larga, y garras largas como hoces." + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "zombi Parasaurolophus" +msgstr[1] "zombis Parasaurolophus" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" +"Es un dinosaurio enorme con manchas y una cresta en la cabeza, caminando " +"como muerto, con los ojos vacíos e hinchados." + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "zombi Dimorphodon" +msgstr[1] "zombis Dimorphodon" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" +"Es el cuerpo harapiento de un reptil volador con plumas de más de un metro " +"de largo, con alas cortas y un pico grande y colorido." + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "zombi Dilophosaurus" +msgstr[1] "zombis Dilophosaurus" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio de tamaño medio con " +"dientes filosos y dos crestas óseas prominentes en la cabeza, con tiras de " +"carne arrancada colgando como un volado." + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "Gallimimus repugnante" +msgstr[1] "Gallimimus repugnantes" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro. Su cuerpo entero tiene" +" músculos dilatados sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "RompeCráneos" +msgstr[1] "RompeCráneos" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro. Su cabeza redonda como" +" un domo está sobre un cuerpo con músculos dilatados sobresaliendo, con " +"heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "Camptosaurus Triturador" +msgstr[1] "Camptosaurus Trituradores" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo grande, con " +"plumas, piernas sumamente hinchadas, hombros enormes y un feroz pico " +"puntiagudo. Sus plumas rotas están manchadas con un líquido pegajoso y " +"negro." + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "Spinosaurus Rompedor" +msgstr[1] "Spinosaurus Rompedores" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" +"Es un enorme cadáver pútrido de dinosaurio con una feroz cabeza similar a un" +" cocodrilo, ojos negros purulentos y una vela medio rota en la espalda. Su " +"cuerpo es más grande de lo normal, inflamado con músculos dilatados " +"sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "Rex Iracundo" +msgstr[1] "Rexs Iracundos" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" +"Pilas gigantescas de carne destrozada y apestosa sostienen unos dientes " +"enormes. Su cuerpo entero está abultado con músculos dilatados y heridas " +"infectadas e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "Albertosaurus Yunque" +msgstr[1] "Albertosaurus Yunques" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Mandíbulas gigantescas y garras atrapantes se elevan junto a un cuerpo " +"abultado con músculos dilatados y heridas infectadas e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "Triceramión" +msgstr[1] "Triceramiones" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" +"Es un enorme dinosaurio tambaleante similar al rinoceronte, con una cresta " +"ósea desde la que le salen tres cuernos malvados. Desde sus ojos negros " +"gotea algo similar a lágrimas. Su cuerpo entero tiene músculos dilatados " +"sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "Stegosaurus Rompedor" +msgstr[1] "Stegosaurus Rompedores" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" +"Es un gran dinosaurio cuadrúpedo tambaleante con placas en su espalda, y una" +" cola con púas. Su cuerpo entero tiene músculos dilatados sobresaliendo, con" +" heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "Dino Tanque" +msgstr[1] "Dino Tanques" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Es un dinosaurio zombi muy blindado. Su cuerpo entero está abultado con " +"músculos dilatados y heridas infectadas e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "Acorazado Zombi" +msgstr[1] "Acorazados Zombis" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" +"Es un enorme dinosaurio de cuatro patas y cuello largo, con una cola larga y" +" similar a un látigo. Su cuerpo entero tiene músculos dilatados " +"sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "Draco Titán" +msgstr[1] "Draco Titanes" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" +"Este zombi es enorme, escamoso, con muchas púas óseas, y se mueve a una " +"velocidad enorme. Sus cuernos coloridos y púas óseas salen de un cuerpo " +"abultado con músculos dilatados y heridas infectadas e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "Allosaurus Avalancha" +msgstr[1] "Allosaurus Avalanchas" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" +"El cuerpo tambaleante de un gran dinosaurio depredador bípedo. Su cuerpo " +"entero está abultado con músculos dilatados y heridas infectadas e " +"hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "Deinonychus Destructor" +msgstr[1] "Deinonychus Destructores" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio bípedo de tamaño medio " +"cubierto con plumas rotas y un líquido pútrido negro. Sus dos pies tienen " +"unas grandes garras como hoces. Su cuerpo entero tiene músculos dilatados " +"sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "Utahraptor Agorero" +msgstr[1] "Utahraptor Agoreros" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" +"Es el cuerpo bamboleante de un gran dinosaurio bípedo con plumas en los " +"brazos, una cola larga, y garras largas como hoces. Su cuerpo entero tiene " +"músculos dilatados sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "Parasaurolophus Pegador" +msgstr[1] "Parasaurolophus Pegadores" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Es un dinosaurio enorme con manchas y una cresta en la cabeza, con ojos " +"vacíos, muertos e hinchados. Su cuerpo entero tiene músculos dilatados " +"sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "Horror Alado" +msgstr[1] "Horrores Alados" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Es el cuerpo volador de un reptil con plumas de casi un metro de largo, con " +"alas cortas y un gran pico colorido. Su cuerpo entero está abultado con " +"músculos dilatados y heridas infectadas e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "Triturador con Cresta" +msgstr[1] "Trituradores con Cresta" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" +"Es el cuerpo que va arrastrándose de un dinosaurio de tamaño medio con " +"dientes filosos y dos crestas óseas prominentes en la cabeza, con tiras de " +"carne arrancada colgando como un volado. Su cuerpo entero tiene músculos " +"dilatados sobresaliendo, con heridas supurantes e hinchadas." + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "zombi Spinosaurus sombrío" +msgstr[1] "zombis Spinosaurus sombríos" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" +"Una extraña sombra envuelve a este dinosaurio. Podés distinguir la forma de " +"un enorme dinosaurio bípedo con una vela rota. La cabeza es larga y fina con" +" una trompa en forma de V." + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "Z-Rex sombrío" +msgstr[1] "Z-Rexes sombríos" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" +"Una extraña sombra envuelve a este dinosaurio. Podés distinguir la forma de " +"un enorme dinosaurio bípedo con bordes con plumas. La cabeza parece grande, " +"donde muchos dientes grandes podrían entrar bien." + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "zombi Deinonychus sombrío" +msgstr[1] "zombis Deinonychus sombríos" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" +"Una extraña sombra envuelve a este dinosaurio. Podés distinguir la forma de " +"un dinosaurio bípedo de tamaño mediano con bordes con plumas. Los dos pies " +"lucen grandes garras como hoces." + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "S-Rex" +msgstr[1] "S-Rexes" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" +"Es una monstruosa columna de hueso denso sosteniendo enormes dientes filosos" +" que chorrean una viscosidad negra." + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "Albertosaurus Esquelético" +msgstr[1] "Albertosaurus Esqueléticos" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" +"Son unas monstruosas columnas de hueso denso que soportan unos dientes " +"puntiagudos y filoso que chorrean una viscosidad negra. Tiene unas garras " +"esqueléticas." + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "Dragón Óseo" +msgstr[1] "Dragones Óseos" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" +"Son unas monstruosas columnas de hueso denso que soportan unos dientes " +"puntiagudos y filoso que chorrean una viscosidad negra. Tiene púas y unos " +"cuernos coloridos sobresaliendo para completar el efecto visual." + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "allosaurus esquelético" +msgstr[1] "allosaurus esqueléticos" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" +"Es una monstruosa columna de hueso denso sosteniendo dientes filosos que " +"chorrean una viscosidad negra." + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "Utahraptor de Hueso" +msgstr[1] "Utahraptor de Hueso" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" +"Son unas monstruosas columnas de hueso denso que soportan unos dientes " +"puntiagudos y filoso que chorrean una viscosidad negra. Tiene una larga cola" +" y filosas garras como hoces." #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" @@ -85277,6 +87028,21 @@ msgstr "" "El aullador es un hongo del tamaño de un humano que emite unos gritos " "penetrantes para desorientar a las criaturas que lo molestan." +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "rana" +msgstr[1] "ranas" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" +"Es la obviamente normal rana americana. Te conviene mantener al príncipe " +"azul alejado de ella." + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -85599,21 +87365,6 @@ msgstr "" "Wraitheon de auxiliares uno a uno diseñados para integrarse con fuerzas más " "tradicionales." -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "momia de papel higiénico" -msgstr[1] "momias de papel higiénico" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" -"Tiene una forma vagamente humanoide, cubierta de capas de algo que parece " -"papel higiénico." - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -86073,22 +87824,6 @@ msgstr "" "Es un conjunto de cuello, pechera y grupera hechos de quitina demoníaca con " "una malla fina. Podés ponerle esto a un caballo amaestrado." -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "armadura para meower" -msgstr[1] "armaduras para meower" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" -"Es un arnés de kevlar elegante y liviano para gato, con una capucha y " -"pechera de protección. Incluye un bolsillo muy pequeño de velcro en la parte" -" de atrás." - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "un mamífero" @@ -86101,6 +87836,14 @@ msgstr "un anfibio" msgid "a bird" msgstr "un pájaro" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "un ciborg alienígena" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "ruidos sordos." + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "un reptil" @@ -86840,6 +88583,24 @@ msgstr "" "Este falso hechizo ocurre con la activación de la bomba craneal. " "Probablemente, fatal." +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "Retroceso de Arma Craneal" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" +"Este hechizo falso ocurre con la activación del arma craneal. Puede ser " +"fatal si sucede en una situación crítica." + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "Tu cuello da un golpe brusco hacia atrás por la fuerza del disparo." + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "aturdimiento psíquico" @@ -86974,6 +88735,19 @@ msgstr "" "Este ritual crea una pequeña piedra adaptado a los Animistas. Podés usar la " "runa como catalizador en recetas." +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "Desgarralmas" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" +"Arranca violentamente el espíritu del cuerpo, y une esa sombra a tu " +"voluntad." + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "Ignus Fatuus" @@ -87047,7 +88821,7 @@ msgstr "También causa efectos secundarios." #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Coagulant Weave" -msgstr "Ola Coagulante" +msgstr "Tejido Coagulante" #: lang/json/SPELL_from_json.py msgid "Crystallize Mana" @@ -87202,6 +88976,15 @@ msgstr "" msgid "Uses a little fatigue" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -87209,7 +88992,7 @@ msgstr "" #. ~ Description for Debug HP Spell #: lang/json/SPELL_from_json.py msgid "Uses a little HP" -msgstr "" +msgstr "Usa un poco de HP" #: lang/json/SPELL_from_json.py msgid "Debug Bionic Spell" @@ -87218,7 +89001,7 @@ msgstr "" #. ~ Description for Debug Bionic Spell #: lang/json/SPELL_from_json.py msgid "Uses a little Bionic Power" -msgstr "" +msgstr "Usa un poco de Poder Biónico" #: lang/json/SPELL_from_json.py msgid "Debug effect spell" @@ -87260,8 +89043,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "" @@ -87273,17 +89056,17 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Debug Feather Falling" -msgstr "" +msgstr "Debug Caída de Pluma" #. ~ Description for Debug Feather Falling #: lang/json/SPELL_from_json.py msgid "You are light as a feather and fall like." -msgstr "" +msgstr "Sos liviano como una pluma y caerás así de suave." #. ~ Message for SPELL 'Debug Feather Falling' #: lang/json/SPELL_from_json.py msgid "You eat a feather!" -msgstr "" +msgstr "¡Te comés una pluma!" #: lang/json/SPELL_from_json.py msgid "Black Dragons' Breath" @@ -87437,7 +89220,7 @@ msgstr "Esquirla de Bomba de Lava" #. ~ Description for Lava Bomb Terrain #: lang/json/SPELL_from_json.py msgid "This is a sub spell for the Lava Bomb spell." -msgstr "Es un sub hechizo del hechizo Bomba de Lava. " +msgstr "Es un sub hechizo del hechizo Bomba de Lava." #: lang/json/SPELL_from_json.py msgid "Lava Bomb Heat" @@ -87653,6 +89436,10 @@ msgstr "Flecha de Maná" msgid "Haste" msgstr "Apuro" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "Polimorfia Siniestra" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "Rayo de Maná" @@ -87780,10 +89567,10 @@ msgstr "Conjura 4 arañitas demoníacas permanentes." msgid "Jolt" msgstr "Descarga" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "un chisporroteo" @@ -87856,6 +89643,33 @@ msgstr "Agrega el efecto de destello." msgid "Wall of Fog" msgstr "Pared de Niebla" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "Aura de Arco Repelente" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "Es un sub hechizo del hechizo Arco Repelente." + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "arco eléctrico!" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "Arco Repelente" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" +"Se manifiesta un aura de electricidad chisporroteante alrededor tuyo para " +"golpear a los atacantes con rayos malignos." + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "Bendición" @@ -87978,77 +89792,44 @@ msgstr "" msgid "X-ray Vision" msgstr "Visión de Rayos-X" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "Succión de Maná" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "" -"Este es el hechizo de la serie de mutaciones de succión de maná. Si tenés " -"este hechizo debe ser por que lo hiciste por debug." - #: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "Piú, Piú" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "" -"Apuntás tu dedo hacia tu oponente y hacés el siguiente sonido 'Piú, piú'." - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "El Suelo es Lava" +msgid "Knock" +msgstr "Abrir" -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." msgstr "" -"Es mejor que encuentres una silla o una mesada para subirte, porque ¡el " -"suelo es lava!" +"Canalizás tu magia en una fuerza capaz de abrir puertas. Esta variante del " +"hechizo solo puede abrir puertas de madera." #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" -msgstr "Montaje de Entrenamiento" +msgid "Improved Knock" +msgstr "Abrir Mejorado" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -"Cuando algo dura mucho tiempo y querés saltearlo hasta llegar al final, vas " -"a necesitar un montaje." +"Canalizás tu magia en una fuerza capaz de abrir puertas. Esta variante del " +"hechizo puede abrir cualquier puerta." -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "Sana Sana Colita de Rana" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "" -"Es una caricia que hará que el dolor se vaya, como las que te hacía tu " -"madre." - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" -msgstr "Conjurar Momia" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" +msgstr "Succión de Maná" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" -"Conjura una criatura endeble de tejido, desde el placard de las escobas de " -"tu alma." +"Este es el hechizo de la serie de mutaciones de succión de maná. Si tenés " +"este hechizo debe ser por que lo hiciste por debug." #: lang/json/TOOLMOD_from_json.py msgid "reactor core expansion device" @@ -90608,8 +92389,8 @@ msgstr "" #: lang/json/TOOL_ARMOR_from_json.py msgid "CRIT S-I G.E.A.R" msgid_plural "CRIT S-I G.E.A.Rs" -msgstr[0] "CRIT S-I G.E.A.R" -msgstr[1] "CRIT S-I G.E.A.R" +msgstr[0] "S-I G.E.A.R CRIT" +msgstr[1] "S-I G.E.A.R CRIT" #. ~ Description for CRIT S-I G.E.A.R #: lang/json/TOOL_ARMOR_from_json.py @@ -90827,30 +92608,40 @@ msgstr "" "parece. Duplica la fuerza del usuario." #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" -msgstr[0] "Faja Menor con Bolsillos" -msgstr[1] "Fajas Menores con Bolsillos" - -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" +msgstr[0] "cinturón dimensional menor" +msgstr[1] "cinturones dimensionales menores" + +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" -"Es una faja ancha que se ajusta alrededor de tu cintura, cubierta con varios" -" pequeñas bolsas que pueden contener más de lo que deberían, y además " -"reducen el peso de su contenido." +"Es un cinturón resistente de trabajo que va alrededor de tu cintura, " +"cubierto de bolsas de fácil acceso. Como todos los espacios dimensionales, " +"pueden contener más de lo que deberían con una reducción considerable del " +"peso del contenido." + +#: lang/json/TOOL_ARMOR_from_json.py +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" +msgstr[0] "cinturón dimensional mayor" +msgstr[1] "cinturones dimensionales mayores" +#. ~ Description for {'str': 'greater dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" -msgstr[0] "Faja Mayor con Bolsillos" -msgstr[1] "Fajas Mayores con Bolsillos" +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" +"Es un cinturón muy resistente de trabajo que va alrededor de tu cintura, " +"cubierto de bolsas de fácil acceso. Como todos los espacios dimensionales, " +"pueden contener más de lo que deberían con una reducción sustancial del peso" +" del contenido." #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" @@ -90947,7 +92738,7 @@ msgid "" "with a light aura to reduce damage you take." msgstr "" "Es un brazal de acero liviano pero extremadamente resistente, adornado con " -"un escudo gravado en la parte superior, y plata acentuando el intrincado " +"un escudo grabado en la parte superior, y plata acentuando el intrincado " "diseño. Protege tu cuerpo con un aura leve que reduce el daño que recibís." #: lang/json/TOOL_ARMOR_from_json.py @@ -90965,7 +92756,7 @@ msgid "" "a strong aura to reduce damage you take." msgstr "" "Es un brazal de acero liviano pero extremadamente resistente, adornado con " -"un escudo gravado en la parte superior, y oro acentuando el intrincado " +"un escudo grabado en la parte superior, y oro acentuando el intrincado " "diseño. Protege tu cuerpo con un aura fuerte que reduce el daño que recibís." #: lang/json/TOOL_ARMOR_from_json.py @@ -90984,7 +92775,7 @@ msgid "" "as well as being able to release a Jolt spell 3 times a day." msgstr "" "Es un brazal de acero liviano pero extremadamente resistente, adornado con " -"rayos gravados en la parte superior, y plata acentuando el intrincado " +"rayos grabados en la parte superior, y plata acentuando el intrincado " "diseño. Protege tu cuerpo con un aura leve que reduce el daño eléctrico que " "recibís, y también te permite usar el hechizo Descarga, 3 veces por día." @@ -91004,7 +92795,7 @@ msgid "" "as well as being able to release a Lightning Bolt spell 3 times a day." msgstr "" "Es un brazal de acero liviano pero extremadamente resistente, adornado con " -"rayos gravados en la parte superior, y oro acentuando el intrincado diseño. " +"rayos grabados en la parte superior, y oro acentuando el intrincado diseño. " "Protege tu cuerpo con un aura fuerte que reduce el daño eléctrico que " "recibís, y también te permite usar el hechizo Rayo Eléctrico, 3 veces por " "día." @@ -91098,7 +92889,7 @@ msgid "" "An ornate silver ring engraved with daggers that conjures a near perfect " "throwing knife into your hand on activation." msgstr "" -"Es un decorado anillo de plata gravado con dagas que conjura un cuchillo " +"Es un decorado anillo de plata grabado con dagas que conjura un cuchillo " "arrojadizo casi perfecto en tu mano al activarlo." #: lang/json/TOOL_ARMOR_from_json.py @@ -92056,6 +93847,19 @@ msgid_plural "bionic firestarters" msgstr[0] "magiclick biónico" msgstr[1] "magiclicks biónicos" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "soporte para ahumar" +msgstr[1] "soportes para ahumar" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -92132,7 +93936,7 @@ msgstr[1] "lámparas de calabaza" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "Luz" @@ -92481,7 +94285,7 @@ msgid "" " can be made scorching hot to singe enemies and light your way. Use to " "ignite." msgstr "" -"Es un cuchillo largo con un caño de combustible al costado, y un pequeño " +"Es un cuchillo largo con un caño para combustible al costado, y un pequeño " "tanque y un encendedor integrado en la empuñadura aislada. Cuando se le pone" " nafta, la cuchilla puede volverse abrasadora para chamuscar enemigos e " "iluminar tu camino. Usala para encenderla." @@ -92529,7 +94333,7 @@ msgid "" "igniter built into the insulated hilt. The blade is glowing brightly. Use " "to shut off the gas." msgstr "" -"Es un cuchillo largo con un caño de combustible al costado, y un pequeño " +"Es un cuchillo largo con un caño para combustible al costado, y un pequeño " "tanque y un encendedor integrado en la empuñadura aislada. La cuchilla está " "brillando. Usala para cerrar el gas." @@ -95232,12 +97036,6 @@ msgid_plural "pseudo butter churns" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -96233,13 +98031,11 @@ msgstr[1] "smartphones" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "Activás la aplicación de linterna." #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "La batería del smartphone tiene muy poca carga." @@ -97873,7 +99669,6 @@ msgstr[0] "hacha de bombero" msgstr[1] "hachas de bombero" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -97890,7 +99685,6 @@ msgstr[0] "barra halligan" msgstr[1] "barras halligan" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -97925,16 +99719,43 @@ msgid_plural "throwable fire extinguishers" msgstr[0] "extintor arrojable" msgstr[1] "extintores arrojables" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "Quitar tapón" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "Le sacás el tapón al extintor arrojable." + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" +"Es un extintor con la forma de una granada. Aunque no es tan eficaz como una" +" extintor normal, lo podés usar a distancia. Tiene un tapón plástico que " +"puede ser quitado, pero se activa primordialmente debido al calor, así que " +"solo hay que tirarlo en las llamas." + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "extintor arrojable activo" +msgstr[1] "extintores arrojables activos" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" msgstr "" -"Es un extintor del tamaño de una granada. Aunque no es tan eficaz como una " -"extintor normal, lo podés usar a distancia. Se activa debido al calor, así " -"que solo hay que tirarlo en las llamas." +"Es un extintor arrojable activado, y va a explotar en cualquier momento. " +"¡Tiralo ya!" #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -98177,6 +99998,32 @@ msgstr "" "Es una piedra aplanada sujetada a un palo. Funciona bastante bien como pala," " pero la verdad es que no se puede comparar con una pala seria." +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "rastrillo de metal" +msgstr[1] "rastrillos de metal" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "Es un resistente rastrillo de metal, esencial para el otoño." + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "rastrillo de plástico" +msgstr[1] "rastrillos de plástico" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" +"Es un rastrillo barato de plástico. Se va a romper bastante rápido si lo " +"usás para otra cosa que no sea arrastrar hojas." + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -98207,6 +100054,28 @@ msgstr "" "Es una herramienta para cavar. Usala para cavar pozos en los espacios " "adyacentes al lugar donde estés parado." +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "pala para nieve" +msgstr[1] "palas para nieve" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "Es una herramienta resistente utilizada para palear nieve." + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "pala de plástico para nieve" +msgstr[1] "palas de plástico para nieve" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "Es una pala barata de plástico que se usa para palear nieve." + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -99044,6 +100913,12 @@ msgstr "" "Es una forja portátil para metalurgia, alimentada a carbón. Si se combina " "con las herramientas adecuadas, se puede usar para trabajar el metal." +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "Forja de Piedra" +msgstr[1] "Forjas de Piedra" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -99198,6 +101073,20 @@ msgstr "" "Son unas largas pinzas de metal. Son comúnmente usadas para cocinar o para " "trabajar el metal." +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "papel de lija" +msgstr[1] "papeles de lija" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" +"Es una lámina de papel áspero. Es comúnmente utilizado en trabajos de " +"herrería y carpintería." + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -99378,6 +101267,21 @@ msgstr "" "fácil de transportar. Te aísla del suelo, lo que facilita dormir. Usala para" " desenrollarla y ponerla en el suelo." +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "manguera de patio" +msgstr[1] "mangueras de patio" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" +"Es una manguera flexible de patio. Si la cortás en pedazos más chicos " +"podrías usarlo para alguna fabricación, o para chupar nafta de un vehículo." + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -101521,7 +103425,6 @@ msgstr[0] "trapo" msgstr[1] "trapos" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -102016,12 +103919,12 @@ msgstr "" "apagarla." #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "hacha de piedra de mano" -msgstr[1] "hachas de piedra de mano" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "cabeza de hacha de piedra" +msgstr[1] "cabezas de hacha de piedra" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -102031,12 +103934,12 @@ msgstr "" "cortar madera con algo de dificultad." #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "hacha de metal de mano" -msgstr[1] "hachas de metal de mano" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "cabeza de hacha de metal" +msgstr[1] "cabezas de hacha de metal" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -102178,6 +104081,12 @@ msgstr "" " para cocinar ladrillos, pero la podés usar para cocinar cualquier cosa " "hecha de arcilla." +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "Kiln" +msgstr[1] "Kilns" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -102362,7 +104271,6 @@ msgstr[0] "gato hidráulico de tipo tijera" msgstr[1] "gatos hidráulicos de tipo tijera" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "" @@ -102636,7 +104544,6 @@ msgstr[0] "destornillador" msgstr[1] "destornilladores" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -102686,7 +104593,6 @@ msgstr[0] "soldadora de mano" msgstr[1] "soldadoras de mano" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -103128,8 +105034,8 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive sentinel-lx" msgid_plural "inactive sentinel-lxs" -msgstr[0] "sentinel-lx inactivo" -msgstr[1] "sentineles-lx inactivos" +msgstr[0] "centinela-lx inactivo" +msgstr[1] "centinelas-lx inactivos" #. ~ Description for {'str': 'inactive sentinel-lx'} #: lang/json/TOOL_from_json.py @@ -103170,18 +105076,18 @@ msgstr "" "Es un dron sabueso inactivo. Si es desplegado exitosamente, volará hacia el " "enemigo y los iluminará con un poderoso reflector." -#: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" -msgstr[0] "soldadora de precisión" -msgstr[1] "soldadoras de precisión" - #: lang/json/TOOL_from_json.py msgid "pseudo atomic butter churn" msgid_plural "pseudo atomic butter churns" msgstr[0] "pseudo mantequera atómica" msgstr[1] "pseudo mantequeras atómicas" +#: lang/json/TOOL_from_json.py +msgid "precision solderers" +msgid_plural "precision solderers" +msgstr[0] "soldadora de precisión" +msgstr[1] "soldadoras de precisión" + #: lang/json/TOOL_from_json.py msgid "atomic smartphone" msgid_plural "atomic smartphones" @@ -103417,6 +105323,25 @@ msgstr "" "en condiciones clínicas. Te permiten desarmar biónicos simples, pero algo " "más complejo requerirá herramientas especiales." +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "equipo de herramientas completo de biónicos" +msgstr[1] "equipos de herramientas completos de biónicos" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" +"Es un grupo de herramientas robóticas muy chiquitas y de llaves digitales " +"encriptadas, diseñadas originalmente para desarmar y probar la calidad de " +"los biónicos producidos industrialmente. Un ingeniero habilidoso y paciente " +"podría usarlas para armar manualmente nuevos cibernéticos." + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -103549,8 +105474,8 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "CRIT Reso-blade" msgid_plural "CRIT Reso-blades" -msgstr[0] "CRIT Reso-cuchilla" -msgstr[1] "CRIT Reso-cuchillas" +msgstr[0] "Reso-cuchilla CRIT" +msgstr[1] "Reso-cuchillas CRIT" #. ~ Description for CRIT Reso-blade #: lang/json/TOOL_from_json.py @@ -103948,7 +105873,7 @@ msgid "" "This is a short stone chisel. It can be used to engrave on stone, wood, or " "soft metals." msgstr "" -"Es un cincel corto de piedra. Se puede usar para gravar en piedra, madera o " +"Es un cincel corto de piedra. Se puede usar para grabar en piedra, madera o " "metales suaves." #: lang/json/TOOL_from_json.py @@ -104197,7 +106122,7 @@ msgid "" "This is a high quality engraved wooden torch. On command, the tip bursts " "into flame and produces a fair amount of light. It will burn forever." msgstr "" -"Es una antorcha de madera gravada de alta calidad. Cuando quieras, la punta " +"Es una antorcha de madera grabada de alta calidad. Cuando quieras, la punta " "arderá y producirá una cantidad considerable de luz. Y arderá por siempre." #: lang/json/TOOL_from_json.py @@ -104215,7 +106140,7 @@ msgid "" "clothing and armor. This uses your tailoring skill. It also contains one " "of those magic spiders that constantly, if slowly, makes new thread." msgstr "" -"Es un equipo de muy buena calidad de acera gravado, con una variedad de " +"Es un equipo de muy buena calidad de acera grabado, con una variedad de " "agujas, algunos carreteles de hilo, pequeñas tijeras de plástico, incluso " "una resistencia térmica chica para fundir plástico. Podés usar el equipo de " "sastre para personalizar tu ropa y armadura. Con esto estás usando tu " @@ -104449,6 +106374,72 @@ msgid_plural "greater wands of cone of cold" msgstr[0] "vara mayor de cono de frío" msgstr[1] "varas mayores de cono de frío" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "vara menor de abrir" +msgstr[1] "varas menores de abrir" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" +"Es una vara fina de madera con un cristal de maná en la base que puede " +"conjurar un hechizo cuando se lo activa. Esta vara puede lanzar el hechizo " +"abrir." + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "vara inferior de abrir" +msgstr[1] "varas inferiores de abrir" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "vara mayor de abrir" +msgstr[1] "varas mayores de abrir" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "vara menor de abrir mejorado" +msgstr[1] "varas menores de abrir mejorado" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" +"Es una vara fina de madera con un cristal de maná en la base que puede " +"conjurar un hechizo cuando se lo activa. Esta vara puede lanzar el hechizo " +"abrir mejorado." + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "vara inferior de abrir mejorado" +msgstr[1] "varas inferiores de abrir mejorado" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "vara mayor de abrir mejorado" +msgstr[1] "varas mayores de abrir mejorado" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -104647,6 +106638,72 @@ msgid_plural "disposable greater wands of cone of cold" msgstr[0] "vara mayor descartable de cono de frío" msgstr[1] "varas mayores descartables de cono de frío" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "vara menor descartable de abrir" +msgstr[1] "varas menores descartables de abrir" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" +"Es una vara fina de madera con un cristal imbuido de maná en la base que " +"puede conjurar un hechizo cuando se lo activa. Esta vara puede lanzar el " +"hechizo abrir." + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "vara inferior descartable de abrir" +msgstr[1] "varas inferiores descartables de abrir" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "vara mayor descartable de abrir" +msgstr[1] "varas mayores descartables de abrir" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "vara menor descartable de abrir mejorado" +msgstr[1] "varas menores descartables de abrir mejorado" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" +"Es una vara fina de madera con un cristal imbuido de maná en la base que " +"puede conjurar un hechizo cuando se lo activa. Esta vara puede lanzar el " +"hechizo abrir mejorado." + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "vara inferior descartable de abrir mejorado" +msgstr[1] "varas inferiores descartables de abrir mejorado" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "vara mayor descartable de abrir mejorado" +msgstr[1] "varas mayores descartables de abrir mejorado" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -104803,77 +106860,8 @@ msgid "" "magical metals into their workable ingot form." msgstr "" "Es una versión portátil de la forja de carbón, mejorada mágicamente y " -"fortificada con quitina de araña demoníaca para hacerla capaz de derretir " -"metales mágicos para darles forma de lingote." - -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" +"fortificada con quitina de araña demoníaca para hacerla capaz de fundir " +"metales mágicos para darles forma de lingote para trabajarlos." #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" @@ -105253,7 +107241,7 @@ msgid "Pheidippides was a hack" msgstr "Filípides era un noob" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "Correr una maratón… y un poquito más." #: lang/json/achievement_from_json.py @@ -105284,14 +107272,657 @@ msgstr "No hay valle lo suficientemente bajo" msgid "Freeman's favorite" msgstr "Favorito del hombre libre" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "Empuñar barreta" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "Impenetrable" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "Ponerse traje tanque" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "¿Qué están escondiendo?" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "Entrar a la habitación final de laboratorio" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "La Última Casa Familiar" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "Llegar al centro de refugiados" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "Volver a tus raíces" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "Volver al lugar de donde empezaste" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "Guarda con el árbol" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "" +"Si un árbol se cae en el bosque y no hay nadie cerca para escucharlo, ¿hace " +"ruido?" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "Leñador" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "¿Qué es un bosque para un hombre con un acha?" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "Deforestación" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "Si talás los árboles vas a encontrar al lobo." + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "Cavador de Tumbas" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "Eso es exactamente lo que necesitamos: más cadáveres." + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "Ladrón de Tumbas" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "Hey, ¿y si se convirtieron ahí abajo? Hay que revisar." + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "Funeral" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" +"Es un privilegio ser enterrado entre los miles de millones que no lo serán." + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "Enterrador" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "No dejes que nadie se pudra entre los muertos vivientes." + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "Funeraria" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "No podés enterrar a todo el mundo, ¿no?" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "Ciberpunk" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "Spiritus quidem promptus; caro vero infirma." + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "Hombre Mecánico" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "" +"Por la más mecánica y sucia mano. Tomaré tal venganza contra ustedes... dos." +" Las cosas que haré, sean las que sean, aún no las conozco. Pero serán los " +"terrores de la tierra." + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "Homo Evolutis" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "" +"El mundo del humano ha terminado. Larga vida al mundo del transhumanismo." + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "Roto Pero no Derrotado" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "¿La obra social te cubre eso?" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "Mercado Libre" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "¡Extraordinarios artilugios a precios obscenamente bajos!" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "Cortarme Mi Propio Cuello" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" +"Mi amigo eskimal, te estoy vendiendo este hielo a tan bajo precio que me " +"está cortando mi propio cuello." + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "Elocuente" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "Somos amgos, ¿o no?" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "Lengua de Plata" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "" +"Cuenta la leyenda que vos convenciste a un gigantón zombi de que se vaya." + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "El Hacker" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "" +"Este sistema operativo tiene una puerta trasera. Siempre hay una puerta " +"trasera." + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "Todavía ni parecido a Kevin" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "No estoy haciendo trampa. Es debugging." + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "Doctor en Medicina" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "¿Hay algún médico acá?" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "Dr House" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "Es lupus." + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "Ingeniero" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "Pasame mi pinza." + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "MacGyver" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "Todo esto se mantiene por la fe, escupida y cinta adhesiva." + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "Trampero" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "Una buena trampa no discrimina entre castores y castorombis." + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "Buscaminas" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "Todo lo que se necesita es no cometer errores." + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "As del Volante" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "Ninguna curva es demasiado cerrada." + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "El Stig" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "La Fórmula Uno es para los conductores domingueros." + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "Nadador" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "Como pez en el agua." + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "Michael Phelps" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "Más rápido que Tiburón." + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "Hacedor-Vos-Mismo" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "Agarrá eso, ponelo adentro de aquello y voilà." + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "El que Mucho Abarca" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "Con la cantidad justa de pegamento, no hay nada que no pueda hacer." + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "Master Chef" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "El lomito glaseado es pan comido." + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "Cocina Infernal" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "Menú del día: Soupe à l'oignon, Boeuf Bourguignon y Crème brûlée." + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "Sastre" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "Una aguja, un hilo y un sueño." + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "Diseñador de Moda" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "Hombre, mujer, mutante por igual." + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "Survivalista" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "La supervivencia es lo mío." + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "Bear Grylls" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "¿Así que podés sobrevivir con tu propia orina?" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "Ley de Ohm" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "" +"Trueno Ohm. Entran dos voltios, sale un voltio. La resistencia es inútil." + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "Nicola Tesla" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "Uno no prueba simplemente una batería de 9V." + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "Dar en el Blanco" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "Mejor que Legolas." + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "Robin Hood" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "¿Guillermo Tell? Nunca escuché ese nombre." + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "Ojo de Águila" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "Solo yo y mi objetivo." + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "Tiro de Gracia" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "No corras. Vas a morir cansado." + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "Pistolero" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "El calibre sí importa." + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "Hombre Cohete" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "Te voy a mandar a la luna. En pedacitos." + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "Chiquito Pero Mortal" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "El calibre no importa cuando estás del lado equivocado del cañón." + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "Harry el Sucio" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" +"Pero al ser una Magnum .44, el arma más potente del mundo y que te puede " +"arrancar la cabeza, te tenés que hacer una pregunta: ¿Me siento con suerte? " +"Bueno, ¿sentís suerte?" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "Hombre del Rifle" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" +"Este es mi rifle. Hay muchos como él pero este es mío. Mi rifle es mi mejor " +"amigo. Es mi vida. Tengo que dominarlo como debo dominar mi vida." + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "Soldado" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" +"Sin mí, mi rifle es inútil. Sin mi rifle, yo soy inútil. Voy a mantener mi " +"rifle limpio y listo, incluso aunque yo esté limpio y listo. Nos volveremos " +"parte el uno del otro." + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "Doble Cañón, Doble Diversión" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "Cuando querés pegarle nueve veces a tu enemigo con un solo disparo." + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "Elmer Gruñón" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "¿Qué hay de nuevo, viejo? ¿Cazando conejitozz?" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "Chorro y Rezo" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "Alguna le pegará. Es cuestión de estadística." + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "¡El Subfsuil Hace BRRRT!" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "Definitivamente, vamos a necesitar más munición." + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "¡Sacudir!" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "Y no vuelvas más." + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "Kobe Bryant" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "¡Cuidado que explota!" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "Matón" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "Una botella en la mano izquierda, una pata de silla en la derecha." + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "Luchador Callejero" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "Lo que importa es ganar, no el estilo." + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "Bateador" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "Cada golpe me acerca a un home run." + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "Edad de Piedra" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" +"El garrote fue la primera herramienta de la humanidad. Y puede ser la " +"última, así que ¿por qué no dominarla?" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "Camino de la Espada" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" +"Cuando la espada fue desenfundada, las pasiones del hombre dejaron de " +"prestar atención a la moderación." + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "Miyamoto Musashi" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" +"La espada debe ser más que una simple arma; tiene que ser la respuesta a las" +" preguntas de la vida." + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "Elusivo" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "El golpe más poderoso es nada si no golpea." + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "Neo" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "¿Pero podés esquivar una bala?" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "Acero Frío" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "Mientras estabas de joda, yo estudiaba la espada." + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "Jack el Destripador" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "" +"¿Es esto una daga que tengo adelante, con el mango hacia mi mano? Vamos, " +"dejame agarrarte." + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "Camino a Shaolin" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "Siento un ejército en mi puño." + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "Sr Miyagi" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "Ser tu propia arma." + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "Chorra" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "¿Barreta? Qué barbaridad." + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "Cerrajero" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "Si hay una cerradura, hay una llave." + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "Tabla Periódica" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "Es más o menos como cocinar. Pero no chupes la cuchara." + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "Heisenberg" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "Ya saben quién soy. Soy el cocinero. Digan mi nombre." + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "Aspirante a Mago" @@ -105755,6 +108386,11 @@ msgstr "hackear" msgid "canceling activity serialized with legacy code" msgstr "cancelar actividad serializada con código legado" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "ejercitando" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "celda de fusión" @@ -106057,6 +108693,10 @@ msgstr "químico para aerosol" msgid "compressed air" msgstr "aire comprimido" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "cartucho 12.3ln" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "bote de metralla" @@ -106109,10 +108749,6 @@ msgstr "mercurio" msgid "mana energy" msgstr "energía maná" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "vapores tóxicos" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "Bomba de Adrenalina" @@ -106285,8 +108921,8 @@ msgid "" "Concealed in your left arm is a single shot 12 gauge shotgun. Activate the " "bionic to fire and reload the shotgun." msgstr "" -"Escondida en tu brazo izquierdo hay una escopeta de un disparo calibre 12 " -"gauge. Activá el biónico para disparar y recargar la escopeta." +"Tenés una escopeta de un disparo calibre 12 gauge escondida en el brazo " +"izquierdo. Activá el biónico para disparar y recargar la escopeta." #: lang/json/bionic_from_json.py msgid "Optical Dampers" @@ -107161,6 +109797,8 @@ msgstr "Almacenamiento de Energía Mk. II" #: lang/json/bionic_from_json.py msgid "A Compact Bionics Module that increases your power capacity by 250 kJ." msgstr "" +"Es un Módulo Compacto de Bónicos que incremente tu almacenamiento de energía" +" en 250 kJ." #. ~ Description for {'str': 'Power Overload'} #: lang/json/bionic_from_json.py @@ -107201,6 +109839,9 @@ msgid "" "toxins, or airborne diseases find their way into your windpipe, the filter " "will attempt to remove them." msgstr "" +"Se ha instalado quirúrgicamente en tu tráquea un sistema avanzado de " +"filtración. Si alguna toxina o enfermedad transmitida por aire se mete por " +"ella, el filtro intentará eliminarla." #: lang/json/bionic_from_json.py msgid "Radiation Scrubber System" @@ -107243,6 +109884,8 @@ msgid "" "You possess razor-sharp claws underneath your fingernails that do a small " "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" +"Tenés garras afiladas como navajas debajo de tus uñas que hacen un poco de " +"daño de corte cuando tus dedos están descubiertos." #: lang/json/bionic_from_json.py msgid "Recycler Unit" @@ -107283,6 +109926,9 @@ msgid "" "shockwave. While it will not do much damage to creatures, solid objects " "such as walls and doors will be damaged." msgstr "" +"Tu cuerpo entero puede resonar con mucha fuerza, creando una onda sísmica de" +" corto alcance. Aunque no hará mucho daño a las criaturas, los objetos " +"sólidos como las paredes y puertas serán dañados." #: lang/json/bionic_from_json.py msgid "Olfactory Mask" @@ -107430,6 +110076,9 @@ msgid "" "allow you to make automated precise cuts and can also be used as a high-" "quality butchering tool." msgstr "" +"Es un sistema de escalpelos quirúrgicos implantados en tus dedos. Te " +"permiten realizar cortes precisos automatizados y también pueden ser usados " +"como una herramienta de carneo de alta calidad." #: lang/json/bionic_from_json.py msgid "Anti-Glare Compensators" @@ -107484,6 +110133,10 @@ msgid "" " don't let go (even when you'd rather they did). Increases hand encumbrance" " by ten, while failing to improve your ability to hold objects whatsoever." msgstr "" +"Los pulgares auto-trabables se traban firmemente (incluso cuando vos no " +"querés que suceda) y no se sueltan (incluso cuando vos preferirías que se " +"suelten). Incrementa la incomodidad de las manos en diez puntos, y no mejora" +" tu habilidad para agarrar objetos." #: lang/json/bionic_from_json.py msgid "Time Dilation" @@ -107512,10 +110165,14 @@ msgid "" "screwdriver, hammer, wrench, hacksaw, drill, welder, and heating elements. " "You can use this in place of many tools when crafting." msgstr "" +"En tus manos y dedos tenés implantados quirúrgicamente un juego de " +"herramientas -destornillador, martillo, llave inglesa, taladro, soldadora y " +"resistencias térmicas. Podés usar esto para reemplazar muchas herramientas " +"cuando fabricás cosas." #: lang/json/bionic_from_json.py msgid "Extended Toolset" -msgstr "" +msgstr "Caja de Herramientas Extendida" #. ~ Description for {'str': 'Extended Toolset'} #: lang/json/bionic_from_json.py @@ -107523,6 +110180,8 @@ msgid "" "Extend or withdraw your integrated toolset to cut metal, pry things, or " "other stuff. This takes up your hands." msgstr "" +"Extendé o replegá tu caja de herramientas integrada para cortar metal, " +"barretear algo, y otras cosas más. Esto ocupa tus manos." #: lang/json/bionic_from_json.py msgid "Joint Torsion Ratchet" @@ -107535,10 +110194,14 @@ msgid "" "generate power when you move. Whilst this is toggled, moving will require " "more effort, though more power will be generated." msgstr "" +"Tus articulaciones han sido quirúrgicamente equipadas con un sistema " +"cinético, lo que te permite generar energía lentamente mientras te movés. " +"Cuando está activado, vas a necesitar un esfuerzo mayor para moverte, pero " +"vas a generar más energía." #: lang/json/bionic_from_json.py msgid "Joint Servo" -msgstr "" +msgstr "Articulaciones Servo" #. ~ Description for {'str': 'Joint Servo'} #: lang/json/bionic_from_json.py @@ -107587,6 +110250,9 @@ msgid "" "You have a Unified Power System wired into your power banks. Objects that " "run on a UPS can now draw directly from your bionic power supply." msgstr "" +"Tenés un sistema de alimentación ininterrumpida (UPS) conectada a tus bancos" +" de energía. Los objetos que funcionan con un UPS ahora pueden usar " +"directamente tu suministro de energía biónica." #. ~ Description for {'str': 'Voice Remodulator'} #: lang/json/bionic_from_json.py @@ -107640,6 +110306,11 @@ msgid "" " your back. A diffuse network of bio-plastic bladders has been meshed with " "your circulatory system and serves as a fuel tank." msgstr "" +"Es una pequeña celda de nafta unida a tu omóplato. A pesar de su limitada " +"producción de energía comparada a otras celdas, este dispositivo produce una" +" cantidad significativa de calor disipado a través de un tubo de escape de " +"calor que sale de tu espalda. Una red de vejigas bioplásticas dispersas por " +"tu sistema circulatorio funcionan como tanques de combustible." #: lang/json/bionic_from_json.py msgid "Intravenous Needletip" @@ -107694,7 +110365,7 @@ msgstr "" #: lang/json/bionic_from_json.py msgid "Taste Modifier" -msgstr "" +msgstr "Modificador de Gusto" #. ~ Description for {'str': 'Taste Modifier'} #: lang/json/bionic_from_json.py @@ -107704,10 +110375,14 @@ msgid "" "active bionic will nullify the taste of all comestibles with negative " "enjoyment value at the cost of draining bionic power." msgstr "" +"Un grupo de sensores ha sido instalados en tu boca y un analizador " +"sofisticado y más pequeño aún, en la cavidad de tu cráneo. El biónico activo" +" anulará los valores negativos de disfrute en los comestibles a cambio de " +"energía biónica." #: lang/json/bionic_from_json.py msgid "Soporific Induction" -msgstr "" +msgstr "Inducción Soporífera" #. ~ Description for {'str': 'Soporific Induction'} #: lang/json/bionic_from_json.py @@ -107716,6 +110391,9 @@ msgid "" "nucleus. It turns on whenever you're trying to fall asleep, creating an " "artificial but effective sensation of fatigue." msgstr "" +"Se ha implantado un electrodo en el núcleo ventrolateral preóptico de tu " +"cerebro. Se enciende cuando intentás quedarte dormido, creando un sensación " +"de fatiga artificial pero efectiva." #: lang/json/bionic_from_json.py msgid "Advanced Microreactor System" @@ -107728,6 +110406,10 @@ msgid "" "model due to integrated radiation cleansers. There is no way to shut it " "down once active, but you can toggle additional fuel intake." msgstr "" +"Este mini-reactor con solo lo esencial es más eficiente y seguro que el " +"modelo base debido a sus limpiadores integrados de radiación. No hay manera " +"de apagarlo cuando está activo, pero podés activar o desactivar el consumo " +"adicional de combustible." #: lang/json/bionic_from_json.py msgid "Plutonium Filter" @@ -107739,6 +110421,8 @@ msgid "" "This set of tanks and filters allows you to extract plutonium from " "radioactive slurry." msgstr "" +"Este equipo de tanques y filtros te permite extraer plutonio de la lechada " +"radioactiva." #: lang/json/bionic_from_json.py msgid "Plutonium Purger" @@ -107750,6 +110434,8 @@ msgid "" "Triggers an emergency reactor fuel purge that ejects all fuel from your " "reactor." msgstr "" +"Se activa una purga de emergencia del reactor, lo que expulsa todo el " +"combustible del reactor." #: lang/json/bionic_from_json.py msgid "Microreactor System" @@ -107762,6 +110448,10 @@ msgid "" "power. There is no way to shut it down, but you can toggle additional fuel " "intake. Irradiates your body when active." msgstr "" +"Este mini-reactor reducido al máximo genera cantidades impresionantes de " +"energía biónica. No hay manera de apagarlo pero podés activar o desactivar " +"el consumo adicional de combustible. Irradiará tu cuerpo cuando está " +"activado." #: lang/json/bionic_from_json.py msgid "Internal Furnace" @@ -107809,6 +110499,8 @@ msgid "" "making it possible for you to recognize your surroundings even in complete " "darkness." msgstr "" +"Mientras este sistema está encendido, podrás ver tu propio olor, haciendo " +"que puedas reconocer los lugares aunque estés en completa oscuridad." #: lang/json/bionic_from_json.py msgid "Solar Panels" @@ -107821,27 +110513,17 @@ msgid "" "resembling angular butterfly wings. When in direct sunlight, they will " "automatically deploy and slowly recharge your power level." msgstr "" +"Tenés instalados en tu espalda, una serie de paneles solares reforzados " +"retráctiles, que parecen alas de una mariposa. Cuando la luz solar les llega" +" directa, se desplegarán automáticamente y cargarán tu energía lentamente." #: lang/json/bionic_from_json.py msgid "Wind Turbines" -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" +msgstr "Turbinas de Viento" #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" -msgstr "" +msgstr "Lanzagranadas Desplegable" #. ~ Description for {'str': 'Deployable Grenade Launcher'} #: lang/json/bionic_from_json.py @@ -107849,10 +110531,12 @@ msgid "" "Your right hand can fold inward to reveal a mechanism capable of igniting " "and firing 40mm grenades across medium distances." msgstr "" +"Tu mano derecha puede doblarse hacia adentro para revelar un mecanismo capaz" +" de disparar granadas 40mm a una distancia media." #: lang/json/bionic_from_json.py msgid "Linguistic Coprocessor" -msgstr "" +msgstr "Coprocesador Lingüístico" #. ~ Description for {'str': 'Linguistic Coprocessor'} #: lang/json/bionic_from_json.py @@ -107862,10 +110546,14 @@ msgid "" "that moderately increases the speed that language and written words are " "processed, granting a 15% increase to reading speed." msgstr "" +"El hemisferio izquierdo de tu cerebro ha sido mejorado con una " +"microcomputadora que incrementa moderadamente la velocidad en que el " +"lenguaje y las palabras escritas son procesadas, lo que te otorga un 15% de " +"incremento en la velocidad de lectura." #: lang/json/bionic_from_json.py msgid "Dopamine Stimulators" -msgstr "" +msgstr "Estimuladores de Dopamina" #. ~ Description for {'str': 'Dopamine Stimulators'} #: lang/json/bionic_from_json.py @@ -107875,6 +110563,11 @@ msgid "" "slowly releases a stream of reward chemicals and hormones into your brain, " "inducing a state of euphoria that notably elevates mood." msgstr "" +"Se han instalado pequeños estimuladores cibernéticos por toda tu área " +"tegmental ventral, y se activarán a intervalos establecidos utilizando " +"energía biónica. Esto enviará lentamente una corriente de químicos y " +"hormonas de recompensa a tu cerebro, induciendo un estado de euforia que " +"mejora notablemente tu humor." #. ~ Description for {'str': 'Cranium Bomb'} #: lang/json/bionic_from_json.py @@ -107884,6 +110577,27 @@ msgid "" " switch if you don't check in roughly every thirty days. You need this out " "and fast." msgstr "" +"Trabajaste para algunas personas bastante complicadas. Personas que " +"instalaron una bomba en la parte superior de tu columna. Ahora ya están " +"todos muertos pero tiene una activación por muerte si no probas que estás " +"vivo cada treinta días. Necesitás sacarte esto y rápido." + +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "Soldadoras de Precisión" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"Tus manos han sido equipadas con herramientas precisas de soldadura, alicate" +" y carretes para cable. Son demasiado pequeñas para usar en la mayoría de " +"las fabricaciones pero en ausencia de la maquinaria adecuada, son esenciales" +" para crear biónicos sin mejores herramientas." #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" @@ -107898,6 +110612,10 @@ msgid "" "powerfull spell focus able to consume blood from dead creatures to produce " "bionic power. It can store up to 100 mL of blood." msgstr "" +"Metido en tu espalda y conectado a tu fuente de energía biónica hay un " +"poderoso hechizo de enfoque capas de consumir sangre de las criaturas " +"muertas para producir energía biónica. Puede almacenar hasta 100 mL de " +"sangre." #: lang/json/bodypart_from_json.py msgid "torso" @@ -107981,7 +110699,7 @@ msgstr "brazo izquierdo" #: lang/json/bodypart_from_json.py msgid "arms" -msgstr "" +msgstr "brazos" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -107991,7 +110709,7 @@ msgstr "brazo izquierdo" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" msgid "arms" -msgstr "" +msgstr "brazos" #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." @@ -108032,7 +110750,7 @@ msgstr "mano izquierda" #: lang/json/bodypart_from_json.py msgid "hands" -msgstr "" +msgstr "manos" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -108042,7 +110760,7 @@ msgstr "mano izquierda" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" msgid "hands" -msgstr "" +msgstr "manos" #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." @@ -108075,7 +110793,7 @@ msgstr "pierna izquierda" #: lang/json/bodypart_from_json.py msgid "legs" -msgstr "" +msgstr "piernas" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -108085,7 +110803,7 @@ msgstr "pierna izquierda" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" msgid "legs" -msgstr "" +msgstr "piernas" #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." @@ -108126,7 +110844,7 @@ msgstr "pie izquierdo" #: lang/json/bodypart_from_json.py msgid "feet" -msgstr "" +msgstr "pies" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -108136,7 +110854,7 @@ msgstr "pie izquierdo" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" msgid "feet" -msgstr "" +msgstr "pies" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" @@ -108186,11 +110904,11 @@ msgstr "Destruir relleno de cuero" #: lang/json/clothing_mod_from_json.py msgid "Pad with steel" -msgstr "" +msgstr "Rellenar con acer" #: lang/json/clothing_mod_from_json.py msgid "Destroy steel padding" -msgstr "" +msgstr "Destruir relleno de acero" #: lang/json/clothing_mod_from_json.py msgid "Pad with Kevlar" @@ -108222,18 +110940,74 @@ msgstr "Pacifista" #: lang/json/conduct_from_json.py msgid "Kill no monsters" -msgstr "" +msgstr "No matar monstruos" #: lang/json/conduct_from_json.py msgid "Kill no characters" -msgstr "" +msgstr "No matar personajes" #: lang/json/conduct_from_json.py msgid "Merciful" -msgstr "" +msgstr "Compasivo" + +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "El Undécimo Camino" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "No talar árboles" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "Homo Sapiens" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "Sin instalar implantes biónicos" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "Sin instalar biónicos no defectuosos" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "Sin mutaciones" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "Rayos-X limpios" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "Sangre Pura" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "Integridad Estructural" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "No romper huesos" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "Profesor, Deje a Los Pibes Tranquilos" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "Sin ganar niveles en habilidades" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "Analfabetismo Autoimpuesto" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "Sin leer libros" #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "Todo/as" @@ -108267,7 +111041,7 @@ msgstr "Granja y Leña" #: lang/json/construction_category_from_json.py msgid "Windows" -msgstr "" +msgstr "Ventanas" #: lang/json/construction_category_from_json.py msgid "Others" @@ -108292,7 +111066,7 @@ msgstr "Algunos muebles y terreno puede ser desarmado sin herramientas." #: lang/json/construction_from_json.py msgid "Make crafting spot" -msgstr "" +msgstr "Hacer lugar de fabricación" #: lang/json/construction_from_json.py msgid "" @@ -108302,6 +111076,11 @@ msgid "" "Does not prevent using a proper workbench, if available. Deconstruct or " "smash to remove." msgstr "" +"Marca un lugar para fabricar. Las tareas de fabricación junto a este espacio" +" usarán automáticamente este lugar en lugar de intentar la fabricación en " +"tus manos, con la penalidad normal a la velocidad por trabajar en el suelo. " +"No evita que uses una mesa de trabajo adecuada, si hay. Deconstruila o " +"rompela para quitarla." #: lang/json/construction_from_json.py msgid "Spike Pit" @@ -108329,7 +111108,7 @@ msgstr "Puede ser desarmado sin herramientas." #: lang/json/construction_from_json.py msgid "Build Beaded Curtain" -msgstr "" +msgstr "Construir Cortina de Cuentas" #: lang/json/construction_from_json.py msgid "Build Makeshift Door" @@ -108341,11 +111120,11 @@ msgstr "Construir Puerta" #: lang/json/construction_from_json.py msgid "Fill Shallow Water With Dirt" -msgstr "" +msgstr "Rellenar Agua Poco Profunda Con Tierra" #: lang/json/construction_from_json.py msgid "Fill Salt Water With Dirt" -msgstr "" +msgstr "Rellenar Agua Salada Con Tierra" #: lang/json/construction_from_json.py msgid "Repair Wood Door" @@ -108425,7 +111204,7 @@ msgstr "Construir Pared de Bolsas de Arena" #: lang/json/construction_from_json.py msgid "Build Earthbag Wall" -msgstr "" +msgstr "Construir Pared de Bolsas de Tierra" #: lang/json/construction_from_json.py msgid "Build Metal Wall" @@ -108437,31 +111216,31 @@ msgstr "Construir Pared de Ladrillos" #: lang/json/construction_from_json.py msgid "Build Concrete Floor" -msgstr "" +msgstr "Construir Suelo de Concreto" #: lang/json/construction_from_json.py msgid "Fill Pit With Dirt" -msgstr "" +msgstr "Rellenar Pozo Con Tierra" #: lang/json/construction_from_json.py msgid "Make Woodchip Floor" -msgstr "" +msgstr "Hacer Piso Aglomerado" #: lang/json/construction_from_json.py msgid "Make Gravel Floor" -msgstr "" +msgstr "Hacer Piso de Gravilla" #: lang/json/construction_from_json.py msgid "Build Straight Small Railroad Track" -msgstr "" +msgstr "Construir Pequeña Vía Derecha" #: lang/json/construction_from_json.py msgid "Build Diagonal Small Railroad Track" -msgstr "" +msgstr "Construir Pequeña Vía Diagonal" #: lang/json/construction_from_json.py msgid "Build Wooden Floor" -msgstr "" +msgstr "Construir Piso de Madera" #: lang/json/construction_from_json.py msgid "Build Simple Concrete Wall" @@ -108473,7 +111252,7 @@ msgstr "Construir Pared de Concreto Reforzado" #: lang/json/construction_from_json.py msgid "Build Concrete Column" -msgstr "" +msgstr "Construir Columna de Concreto" #: lang/json/construction_from_json.py msgid "Build Metal Roof" @@ -108501,11 +111280,11 @@ msgstr "Construir Pared de Piedra" #: lang/json/construction_from_json.py msgid "Build Dry Stone Wall" -msgstr "" +msgstr "Construir Pared de Piedra Seca" #: lang/json/construction_from_json.py msgid "Build Pony Wall" -msgstr "" +msgstr "Construir Pared Petisa" #: lang/json/construction_from_json.py msgid "Build Roof" @@ -108521,7 +111300,7 @@ msgstr "Construir Techo de Tronco y Césped" #: lang/json/construction_from_json.py msgid "Build Roof Over Dirt Floor" -msgstr "" +msgstr "Construir Techo Sobre Piso de Tierra" #: lang/json/construction_from_json.py msgid "Build Rope & Pulley System" @@ -108585,19 +111364,19 @@ msgstr "Debe ser apoyado de los dos lados por una reja, pared, etcétera." #: lang/json/construction_from_json.py msgid "Build Screen Door" -msgstr "" +msgstr "Construir Puerta Mosquitera" #: lang/json/construction_from_json.py msgid "Build Screen Mesh Wall" -msgstr "" +msgstr "Construir Pared de Malla" #: lang/json/construction_from_json.py msgid "Build Chickenwire Fence" -msgstr "" +msgstr "Construir Valla de Alambre Tejido" #: lang/json/construction_from_json.py msgid "Build Chickenwire Gate" -msgstr "" +msgstr "Construir Puerta de Alambre Tejido" #: lang/json/construction_from_json.py msgid "Seal Crate" @@ -108617,7 +111396,7 @@ msgstr "Sellar Ataúd" #: lang/json/construction_from_json.py msgid "Dig Grave and Bury Sealed Coffin" -msgstr "" +msgstr "Cavar Tumba y Enterrar Ataúd Sellado" #: lang/json/construction_from_json.py msgid "Build Bulletin Board" @@ -108633,7 +111412,7 @@ msgstr "Construir Biblioteca" #: lang/json/construction_from_json.py msgid "Build Entertainment Center" -msgstr "" +msgstr "Construir Centro de Entretenimiento" #: lang/json/construction_from_json.py msgid "Build Locker" @@ -108641,7 +111420,7 @@ msgstr "Construir Casillero" #: lang/json/construction_from_json.py msgid "Build Wooden Rack" -msgstr "" +msgstr "Construir Estante de Madera" #: lang/json/construction_from_json.py msgid "Build Metal Rack" @@ -108649,7 +111428,7 @@ msgstr "Construir Estante de Metal" #: lang/json/construction_from_json.py msgid "Build Warehouse Shelf" -msgstr "" +msgstr "Construir Estantes Metálicos" #: lang/json/construction_from_json.py msgid "Build Coat Rack" @@ -108669,11 +111448,11 @@ msgstr "Construir Mesa" #: lang/json/construction_from_json.py msgid "Place Table" -msgstr "" +msgstr "Poner Mesa" #: lang/json/construction_from_json.py msgid "Build Coffee Table" -msgstr "" +msgstr "Construir Mesita Ratona" #: lang/json/construction_from_json.py msgid "Build Workbench" @@ -108705,23 +111484,23 @@ msgstr "Construir Cama de Paja" #: lang/json/construction_from_json.py msgid "Build Pile of Leaves" -msgstr "" +msgstr "Construir Pila de Hojas" #: lang/json/construction_from_json.py msgid "Build Bed from Scratch" -msgstr "" +msgstr "Construir Cama desde Cero" #: lang/json/construction_from_json.py msgid "Build Bunk Bed" -msgstr "" +msgstr "Construir Cucheta" #: lang/json/construction_from_json.py msgid "Build Bed Frame" -msgstr "" +msgstr "Construir Marco de Cama" #: lang/json/construction_from_json.py msgid "Add Mattress to Bed Frame" -msgstr "" +msgstr "Poner Colchón a Marco de Cama" #: lang/json/construction_from_json.py msgid "Build Armchair" @@ -108769,67 +111548,67 @@ msgstr "Construir Pozo de Agua" #: lang/json/construction_from_json.py msgid "Place Hay Bale" -msgstr "" +msgstr "Ubicar Atado de Heno" #: lang/json/construction_from_json.py msgid "Build Desk" -msgstr "" +msgstr "Construir Escritorio" #: lang/json/construction_from_json.py msgid "Build Wardrobe" -msgstr "" +msgstr "Construir Ropero" #: lang/json/construction_from_json.py msgid "Build Safe" -msgstr "" +msgstr "Construir Caja Fuerte" #: lang/json/construction_from_json.py msgid "Build Dumpster" -msgstr "" +msgstr "Construir Contenedor" #: lang/json/construction_from_json.py msgid "Build Mailbox" -msgstr "" +msgstr "Construir Buzón" #: lang/json/construction_from_json.py msgid "Build Bar Door" -msgstr "" +msgstr "Construir Puerta de Bar" #: lang/json/construction_from_json.py msgid "Install Bars Onto Window" -msgstr "" +msgstr "Instalar Barras a Ventana" #: lang/json/construction_from_json.py msgid "Build Large Metal Support" -msgstr "" +msgstr "Construir Soporte Grande de Metal" #: lang/json/construction_from_json.py msgid "Build Small Metal Support" -msgstr "" +msgstr "Construir Soporte Chico de Metal" #: lang/json/construction_from_json.py msgid "Paint Grass White" -msgstr "" +msgstr "Pintar Pasto de Blanco" #: lang/json/construction_from_json.py msgid "Paint Pavement Yellow" -msgstr "" +msgstr "Pintar Pavimento de Amarillo" #: lang/json/construction_from_json.py msgid "Take Paint Off Pavement" -msgstr "" +msgstr "Quitar Pintura de Pavimento" #: lang/json/construction_from_json.py msgid "Build Wooden Railing" -msgstr "" +msgstr "Construir Baranda de Madera" #: lang/json/construction_from_json.py msgid "Cover Manhole" -msgstr "" +msgstr "Cubrir Cámara de Inspección" #: lang/json/construction_from_json.py msgid "Remove Wax From Floor" -msgstr "" +msgstr "Quitar Cera del Piso" #: lang/json/construction_from_json.py msgid "Paint Wall Red" @@ -108841,7 +111620,7 @@ msgstr "Pintar Pared de Azul" #: lang/json/construction_from_json.py msgid "Paint Wall White" -msgstr "" +msgstr "Pintar Pared de Blanco" #: lang/json/construction_from_json.py msgid "Paint Wall Green" @@ -108859,10 +111638,6 @@ msgstr "Pintar Pared de Amarillo" msgid "Take Paint Off Wall" msgstr "Quitar Pintura de la Pared" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "Quitar Alfombra" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "Alfombrar con Rojo" @@ -108881,7 +111656,7 @@ msgstr "Alfombrar con Verde" #: lang/json/construction_from_json.py msgid "Wax Floor" -msgstr "" +msgstr "Encerar Piso" #: lang/json/construction_from_json.py msgid "Dig Downstair" @@ -108893,16 +111668,48 @@ msgstr "Hacer Mina hacia Abajo" #: lang/json/construction_from_json.py msgid "Repair Wooden Staircase" -msgstr "" +msgstr "Arreglar Escalera de Madera" #: lang/json/construction_from_json.py msgid "Build Wooden Staircase" -msgstr "" +msgstr "Construir Escalera de Madera" #: lang/json/construction_from_json.py msgid "Mine Upstair" msgstr "Hacer Mina hacia Arriba" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "Construir Parte Baja de Rampa de Concreto" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" +"Construir una rampa de concreto que lleva al siguiente nivel superior, y la " +"correspondiente rampa que baja. La parte alta de la rampa debe ser " +"construida al lado para permitir el movimiento entre niveles en las dos " +"direcciones." + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "Construir Parte Alta de Rampa de Concreto" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" +"Construir una rampa de concreto que lleva al siguiente nivel superior, y la " +"correspondiente rampa que baja. Debe ser construida al lado de la parte baja" +" de la rampa para permitir el movimiento entre niveles en las dos " +"direcciones." + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "Empezar a Construir Vehículo" @@ -108917,31 +111724,31 @@ msgstr "Construir Puente Flotante" #: lang/json/construction_from_json.py msgid "Build River Bridge" -msgstr "" +msgstr "Construir Puente sobre Río" #: lang/json/construction_from_json.py msgid "Build River Dock/Shallow Bridge" -msgstr "" +msgstr "Construir Muelle de Río/Puente Pequeño" #: lang/json/construction_from_json.py msgid "Build Deep River Dock" -msgstr "" +msgstr "Construir Muelle de Río Profundo" #: lang/json/construction_from_json.py msgid "Place Water Mill" -msgstr "" +msgstr "Ubicar Molino de Agua" #: lang/json/construction_from_json.py msgid "Place Wind Mill" -msgstr "" +msgstr "Ubicar Molino de Viento" #: lang/json/construction_from_json.py msgid "Build Shallow Temporary Bridge" -msgstr "" +msgstr "Construir Puente Pequeño Temporal" #: lang/json/construction_from_json.py msgid "Build Planter" -msgstr "" +msgstr "Construir Macetero" #: lang/json/construction_from_json.py msgid "Cut Grass" @@ -109046,11 +111853,11 @@ msgstr "Construir Fuerte de Almohadas" #: lang/json/construction_from_json.py msgid "Build Cardboard Fort" -msgstr "" +msgstr "Construir Fuerte de Cartón" #: lang/json/construction_from_json.py msgid "Build Sand Castle" -msgstr "" +msgstr "Construir Castillo de Arena" #: lang/json/construction_from_json.py msgid "Build Fire Ring" @@ -109058,51 +111865,51 @@ msgstr "Construir Anillo de Fuego" #: lang/json/construction_from_json.py msgid "Build Rammed Earth Wall" -msgstr "" +msgstr "Construir Tapial" #: lang/json/construction_from_json.py msgid "Hang Hanging Meathook" -msgstr "" +msgstr "Colgar Gancho para Carne" #: lang/json/construction_from_json.py msgid "Build Counter Gate" -msgstr "" +msgstr "Construir Puerta Mostrador" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence Gate" -msgstr "" +msgstr "Construir Puerta de Valla de Madera" #: lang/json/construction_from_json.py msgid "Build Privacy Fence Gate" -msgstr "" +msgstr "Construir Puerta de Valla Ciega" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence" -msgstr "" +msgstr "Construir Valla de Madera" #: lang/json/construction_from_json.py msgid "Build Privacy Fence" -msgstr "" +msgstr "Construir Valla Ciega" #: lang/json/construction_from_json.py msgid "Build Brick Wall from Adobe" -msgstr "" +msgstr "Construir Pared de Ladrillos de Adobe" #: lang/json/construction_from_json.py msgid "Extrude Resin Lattice" -msgstr "" +msgstr "Extrudir Enrejado de Resina" #: lang/json/construction_from_json.py msgid "Extrude Resin Wall" -msgstr "" +msgstr "Extrudir Pared de Resina" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor and Roof" -msgstr "" +msgstr "Extrudir Piso y Techo de Resina" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor (no roof)" -msgstr "" +msgstr "Extrudir Piso de Resina (no el techo)" #: lang/json/construction_from_json.py msgid "Build Pine Lean-To" @@ -109114,119 +111921,123 @@ msgstr "Construir Cobertizo de Lona" #: lang/json/construction_from_json.py msgid "Dig a Shallow Pit" -msgstr "" +msgstr "Cavar Pozo Poco Profundo" #: lang/json/construction_from_json.py msgid "Dig a Deep Pit" -msgstr "" +msgstr "Cavar Pozo Profundo" #: lang/json/construction_from_json.py msgid "Build Arc Furnace" -msgstr "" +msgstr "Construir Horno de Arco Eléctrico" #: lang/json/construction_from_json.py msgid "Build a bellow." -msgstr "" +msgstr "Construir Fuelle" #: lang/json/construction_from_json.py msgid "Build a drop hammer." -msgstr "" +msgstr "Construir Martillo Pilón" #: lang/json/construction_from_json.py msgid "Build a radio tower." -msgstr "" +msgstr "Construir Torre de Radio" #: lang/json/construction_from_json.py msgid "Build a radio tower console." -msgstr "" +msgstr "Construir Consola de Torre de Radio" #: lang/json/construction_from_json.py msgid "Build Log Stool" -msgstr "" +msgstr "Construir Banquito de Troncos" #: lang/json/construction_from_json.py msgid "Build Decorative Tree" -msgstr "" +msgstr "Construir Árbol Decorativo" #: lang/json/construction_from_json.py msgid "Build Metal Grate Over a Window" -msgstr "" +msgstr "Construir Rejilla de Metal Sobre Ventana" #: lang/json/construction_from_json.py msgid "Build Metal Grate Over a Window Without Glass" -msgstr "" +msgstr "Construir Rejilla de Metal Sobre Ventana sin Vidrio" #: lang/json/construction_from_json.py msgid "Build Single Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Sencillo" #: lang/json/construction_from_json.py msgid "Build Reinforced Single Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Sencillo Reforzado" #: lang/json/construction_from_json.py msgid "Build Double Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Doble" #: lang/json/construction_from_json.py msgid "Build Reinforced Double Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Doble Reforzado" #: lang/json/construction_from_json.py msgid "Build Triple Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Triple" #: lang/json/construction_from_json.py msgid "Build Reinforced Triple Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Triple Reforzado" #: lang/json/construction_from_json.py msgid "Build Quadruple Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Cuádruple" #: lang/json/construction_from_json.py msgid "Build Reinforced Quadruple Glazed Glass Window" -msgstr "" +msgstr "Construir Ventana de Vidrio Cuádruple Reforzado" #: lang/json/construction_from_json.py msgid "Build Plastic Window" -msgstr "" +msgstr "Construir Ventana Plástica" #: lang/json/construction_from_json.py msgid "Build Reinforced Plastic Window" -msgstr "" +msgstr "Construir Ventana de Plástico Reforzado" #: lang/json/construction_from_json.py msgid "Build Window from Tempered Glass" -msgstr "" +msgstr "Construir Ventana de Vidrio Templado" #: lang/json/construction_from_json.py msgid "Build Sky Light Frame" -msgstr "" +msgstr "Construir Estructura de Claraboya" #: lang/json/construction_from_json.py msgid "Build Sky Light" -msgstr "" +msgstr "Construir Claraboya" #: lang/json/construction_from_json.py msgid "Convert Fridge Power Supply" -msgstr "" +msgstr "Convertir Alimentación de Heladera" #: lang/json/construction_from_json.py msgid "" "Converts a fridge to run off of vehicle power. You can 'e'xamine it " "afterwards to take it down for mounting." msgstr "" +"Hace que una heladera pueda funcionar con la energía de un vehículo. Podés " +"apretar 'e' para examinarla después para montarla." #: lang/json/construction_from_json.py msgid "Convert Vehicle Fridge to Freezer" -msgstr "" +msgstr "Convertir Heladera de Vehículo a Freezer" #: lang/json/construction_from_json.py msgid "" "Further modifies a converted fridge to function as a freezer. You can " "'e'xamine it afterwards to take it down for mounting." msgstr "" +"Modifica una heladera reconvertido para funcionar como freezer. Podés " +"apretar 'e' para examinarla después para montarla." #: lang/json/construction_from_json.py msgid "Chop Tree Trunk Into Logs" @@ -109234,11 +112045,11 @@ msgstr "Cortar Árbol en Troncos" #: lang/json/construction_from_json.py msgid "Makeshift Wall" -msgstr "" +msgstr "Pared Improvisada" #: lang/json/construction_from_json.py msgid "Build Translocator Gate" -msgstr "" +msgstr "Construir Puerta de Translocador" #: lang/json/dream_from_json.py msgid "You have a strange dream about lizards." @@ -109344,7 +112155,7 @@ msgstr "Tenés un extraño sueño acerca de vivir en una cueva." #: lang/json/dream_from_json.py msgid "Your dreams give you a strange reclusive feeling." -msgstr "" +msgstr "Tus sueños te hacen sentir una extraña sensación solitaria." #: lang/json/dream_from_json.py msgid "You have a strange dream about sea creatures." @@ -109376,7 +112187,7 @@ msgstr "Tenés un extraño sueño." #: lang/json/dream_from_json.py msgid "You feel… OK." -msgstr "" +msgstr "Te sentís… bien." #: lang/json/dream_from_json.py msgid "You feel a yearning..." @@ -109388,7 +112199,7 @@ msgstr "Soñás con el zoológico, por alguna razón." #: lang/json/dream_from_json.py msgid "Your dreams… are complex and multifaceted." -msgstr "" +msgstr "Tus sueños son… complejos y multifacéticos." #: lang/json/dream_from_json.py msgid "You dream of the tropics." @@ -109478,7 +112289,7 @@ msgstr "" #: lang/json/dream_from_json.py msgid "You dream of foraging in the woods… mouth-first?" -msgstr "" +msgstr "Tenés un sueño en el que buscás comida en el bosque… ¿con la boca?" #: lang/json/dream_from_json.py msgid "Your dream-reflection is rather bearish." @@ -109500,7 +112311,7 @@ msgstr "" #: lang/json/dream_from_json.py msgid "Your dream-self's muzzle looks… wait, muzzle?" -msgstr "" +msgstr "En tu sueño, tu hocico parece que se… momento, ¿hocico?" #: lang/json/dream_from_json.py msgid "You dream of grazing in an open field." @@ -109599,6 +112410,8 @@ msgstr "Te sentís hermoso, pero también desgarrado por la preocupación..." msgid "" "You can't quite work out what the dream is about… it just keeps changing." msgstr "" +"No llegás a darte cuenta qué es lo que estás soñando… porque cambia " +"constantemente." #: lang/json/dream_from_json.py msgid "Your dream is filled with creatures, and yet all seem like you." @@ -109608,6 +112421,8 @@ msgstr "Tu sueño está repleto de criaturas, y todas se parecen a vos." msgid "" "You dream of stalking some sort of lizard… no, that can't be right, can it?" msgstr "" +"Soñás que estás acechando a alguna clase de lagarto… no, no creo que sea " +"eso, ¿o sí?" #: lang/json/dream_from_json.py msgid "" @@ -109619,7 +112434,7 @@ msgstr "" #: lang/json/dream_from_json.py msgid "You dream of… sneaking." -msgstr "" +msgstr "Soñás con… moverte de manera furtiva." #: lang/json/dream_from_json.py msgid "You dream of a cold winter night. Your jacket is too big to put on." @@ -109693,6 +112508,8 @@ msgid "" "Your dream of raiding a giant beehive has you licking your… muzzle in " "anticipation." msgstr "" +"El sueño que tuviste acerca de asaltar una colmena gigante, te hace " +"relamerte el… hocico de ansiedad." #: lang/json/dream_from_json.py msgid "" @@ -109975,36 +112792,46 @@ msgid "" "How grand it would be to sink your roots deep into the soil as the seasons " "pass you by." msgstr "" +"Qué bueno sería poder hundir tus raíces profundo en el suelo, mientras las " +"estaciones pasan." #: lang/json/dream_from_json.py msgid "You dream of a gigantic knot of roots, beating like a heart." -msgstr "" +msgstr "Soñás con un gigantesco nudo de raíces, latiendo como un corazón." #: lang/json/dream_from_json.py msgid "You have a disturbing dream of termites chewing all over your body." msgstr "" +"Tenés un sueño perturbador acerca de termitas masticándote todo el cuerpo." #: lang/json/dream_from_json.py msgid "" "You dream of sharing your roots with a vast forest, all plants provided for " "as the canopy grows ever upwards." msgstr "" +"Soñás con compartir tus raíces en un vasto bosque, todas las plantas " +"participando mientras el dosel crece siempre arriba." #: lang/json/dream_from_json.py msgid "A family of caterpillars munches away at your leaves." -msgstr "" +msgstr "Una familia de orugas masticándote las hojas." #: lang/json/dream_from_json.py msgid "" "Fire rages around you, licking at your bark and engulfing the saplings and " "bushes near your roots. The once chatty forest is quiet in its wake." msgstr "" +"El fuego ruge a tu alrededor, lamiéndote la corteza y rodeando los brotes y " +"arbustos cerca de tus raíces. Lo que era un bosque hablador ahora es " +"silencioso." #: lang/json/dream_from_json.py msgid "" "You dream of communing with an ancient pine. Trees are the true survivors " "of this world, it tells you." msgstr "" +"Soñás con comunicarte con un pino antiguo. Te dice que los árboles son los " +"verdaderos sobrevivientes en este mundo." #: lang/json/dream_from_json.py msgid "" @@ -110055,6 +112882,8 @@ msgstr "" #: lang/json/dream_from_json.py msgid "You excitedly web up an interloper and prepare to feast… nope, dream." msgstr "" +"Con mucha excitación, enredás con tu telaraña al intruso y te preparás para " +"el festín… ah, no, era un sueño." #: lang/json/dream_from_json.py msgid "Your dreams of having to live without a web frighten you." @@ -110095,6 +112924,8 @@ msgstr "Te gustaría que otros pudieran entender, y unirse a tu lucha..." #: lang/json/dream_from_json.py msgid "Your body flows slightly faster than you expected… oh, just a dream." msgstr "" +"Tu cuerpo fluye un poco más rápido de lo que esperabas… ah, era solo un " +"sueño." #: lang/json/dream_from_json.py msgid "FIGHT. FEED. FORWARD." @@ -110167,55 +112998,67 @@ msgstr "" #: lang/json/dream_from_json.py msgid "You dream of warm, alien winds." -msgstr "" +msgstr "Soñás con vientos tibios alienígenas." #: lang/json/dream_from_json.py msgid "You dream of landscapes lit by the light of alien moons." -msgstr "" +msgstr "Soñás con paisajes encendidos por la luz de lunas alienígenas." #: lang/json/dream_from_json.py msgid "" "You stand at the edge of a fissure into strange earth. Mustard brown gasses" " caress and lift your fronds" msgstr "" +"Te parás en el borde de una fisura en una tierra desconocida. Pastos de " +"amarillo oscuro acarician y levantan tus hojas." #: lang/json/dream_from_json.py msgid "" "You dream of being vivsected by humans. One asks if the other thinks you " "can feel pain." msgstr "" +"Soñás con humanos practicándote una vivisección. Uno pregunta a otro si cree" +" que podrás sentir dolor." #: lang/json/dream_from_json.py msgid "" "Trapped in a cage, you mimic the sounds of your guard's spawn. He threatens" " you and enters the cage. He screams, you recall." msgstr "" +"Atrapado en una jaula, imitás el sonido de la cría de tu guardia. Te amenaza" +" y entra en la jaula. Recordás que él grita." #: lang/json/dream_from_json.py msgid "" "It's your birthday. But everyone has given you these hideous metal and " "plastic objects." msgstr "" +"Es tu cumpleaños. Pero todos te dieron estos espantosos objetos metálicos y " +"plásticos." #: lang/json/dream_from_json.py msgid "" "The stars await you, your chariot of fire is ready. The holds are full of " "slaves." msgstr "" +"La estrella te espera, tu carroza de fuego está preparada. Las bodegas están" +" llenas de esclavos." #: lang/json/dream_from_json.py msgid "You have transitioned from a dying race to a glorious future." -msgstr "" +msgstr "Has transitado de una raza agonizante a un futuro glorioso." #: lang/json/dream_from_json.py msgid "" "You have a strange dream about thundering ponderously through ancient, " "brittle tundras that crackle under your thick round feet." msgstr "" +"Tenés un extraño sueño donde atravesás lentamente tundras antiguas y " +"frágiles que se rajan bajo tus gruesos pies redondos." #: lang/json/dream_from_json.py msgid "Your dreams give you a strange, langourous, heavy feeling." -msgstr "" +msgstr "Tus sueños te hacen sentir una extraña sensación pesada y lánguida." #: lang/json/dream_from_json.py msgid "" @@ -110225,6 +113068,10 @@ msgid "" " by snow and bitter pelting winds, you feel confident and toasty-warm " "beneath your shaggy coat." msgstr "" +"Soñás con mover tu pesada cabeza para sacarte la nieve y el hielo de tus " +"grandes ojos límpidos y marrones. El peso está raro, como si tuvieras algo… " +"extra en alguno de los lados de tu boca, y aunque estás rodeado de nieve y " +"vientos crudos, te sentís confiado y calentito bajo tu abrigo peludo." #: lang/json/dream_from_json.py msgid "" @@ -110233,6 +113080,10 @@ msgid "" "you see elephantine faces looking back from all angles and you know they " "mirror your own. You just… know." msgstr "" +"Soñás con una corriente de piel peluda marrón arrastrándose por un océano de" +" un severo hielo blanco. Juntos, son fuertes. Cuando mirás alrededor, ves " +"rostros elefantinos en todos los ángulos y sabés que son un espejo del tuyo." +" Solamente… lo sabés." #: lang/json/dream_from_json.py msgid "" @@ -110244,6 +113095,12 @@ msgid "" "red into the icy white and causing it to steam Just like that, your calm is" " restored." msgstr "" +"Soñás con tu paciente languidez usual siendo interrumpida por un destello de" +" dientes blancos contra un hocico carmín. En un instante, una furia " +"estruendosa te domina y barritás tu ira… justo antes de tu barrito, bajás " +"tus pesadas lanzas de marfil de cada lado de tu hocico, hacia tu atancante. " +"Quedan tirados, huesos rotos, sangrando su rojo en el hielo blanco y creando" +" vapor. Y así, vuelve tu calma." #: lang/json/dream_from_json.py msgid "" @@ -110254,6 +113111,12 @@ msgid "" "fear and dysphoria, for your body feels so weak and fragile and incorrect " "compared to the powerful thing you know you are." msgstr "" +"Soñás con tu avanzar lento, paciente y laborioso por el mundo para ir de un " +"objetivo a otro, sin apuro, sin preocupaciones, porque sos tan grande y " +"resistente para matar a cualquiera o cualquier cosa que intente atacarte. Y " +"si lo hacen… será el último error de su vida. Al despertar sentís una breve " +"sacudida de miedo y disforia, tu cuerpo se siente débil y frágil e " +"incorrecto comparado con la poderosa cosa que sabés que sos." #: lang/json/dream_from_json.py msgid "" @@ -110264,6 +113127,12 @@ msgid "" "superior. You are huge and powerful and all that work against you shall " "fall. You… you have all the time in the world, now." msgstr "" +"Tus pensamientos dentro del sueño pueden ser lentos, y podés tardar un " +"tiempo en llegar a una conclusión, pero ¿qué apuro hay? ¿Cuál es la prisa? " +"Sos una cosa enorme y antigua con un pedigrí que se hunde en el pasado, " +"antes incluso que la vida sapiente tuviera el descaro de levantar un palo " +"filoso y creerse superior. Sos enorme y poderoso y todo ese trabajo en tu " +"contra fracasará. Tenés… tenés todo el tiempo del mundo, ahora." #: lang/json/dream_from_json.py msgid "" @@ -110271,70 +113140,86 @@ msgid "" " through this desolate world in search of the hidden places. Perhaps… " "perhaps you should start your family." msgstr "" +"La vida es solitaria sin una familia de Colmilludos a tu lado, rugiendo como" +" uno solo a través de este desolado mundo, buscando lugares ocultos. Tal " +"vez… tal vez deberías empezar tu familia." #: lang/json/dream_from_json.py msgid "You have a strange dream about the shadows." -msgstr "" +msgstr "Tenés un extraño sueño con sombras." #: lang/json/dream_from_json.py msgid "Your dreams give you a peculiar feeling of sinking into the dark." msgstr "" +"Tus sueños te hacen sentir una peculiar sensación de hundirte en la " +"oscuridad." #: lang/json/dream_from_json.py msgid "You have a vivid dream of talking a midnight stroll." -msgstr "" +msgstr "Tenés un sueño vívido de estar haciendo un paseo de medianoche." #: lang/json/dream_from_json.py msgid "You dream of drinking copious amounts of warm water." -msgstr "" +msgstr "Soñás con estar tomando copiosas cantidades de agua tibia." #: lang/json/dream_from_json.py msgid "" "You have a dream of being chased by dogs as something warm drips from your " "mouth." msgstr "" +"Soñás con ser perseguido por perros mientras algo tibio cae de tu boca." #: lang/json/dream_from_json.py msgid "Snippets of stalking something in the star-lit night shakes you awake." msgstr "" +"Pedazos de estar acechando algo en la noche iluminada por las estrellas, te " +"hace temblar y despertarte." #: lang/json/dream_from_json.py msgid "You dream of sinking your fangs into more and more enemies." -msgstr "" +msgstr "Soñás con hundir tus colmillos en más y más enemigos." #: lang/json/dream_from_json.py msgid "" "You have a lucid dream where streams of blood are slowly pooling around your" " feet." msgstr "" +"Tenés un sueño vívido donde arroyos de sangre van lentamente armando charcos" +" alrededor de tus pies." #: lang/json/dream_from_json.py msgid "You have a strange dream about the mountain forests." -msgstr "" +msgstr "Tenés un extraño sueño acerca de los bosques de las montañas." #: lang/json/dream_from_json.py msgid "Your dreams give you a peculiar feeling of sinking into the treelines." msgstr "" +"Tus sueños te dan la peculiar sensación de hundirte entre los árboles." #: lang/json/dream_from_json.py msgid "You have a vivid dream of strolling through the woods." -msgstr "" +msgstr "Tenés un sueño vívido de pasear por el bosque." #: lang/json/dream_from_json.py msgid "You have a dream of chasing something as a raw hunger sears your mind." msgstr "" +"Tenés un sueño de estar persiguiendo algo mientras el hambre hace arder tu " +"mente." #: lang/json/dream_from_json.py msgid "Recollections of stalking a human shakes you awake." msgstr "" +"Recuerdos de estar persiguiendo un humano te hacen temblar y despertarte." #: lang/json/dream_from_json.py msgid "You dream of tearing into more and more enemies." -msgstr "" +msgstr "Soñás en destrozar más y más enemigos." #: lang/json/dream_from_json.py msgid "You have a lucid dream where nature carefully welcomes your body." msgstr "" +"Tenés un sueño vívido donde la naturaleza le da la bienvenida cuidadosamente" +" a tu cuerpo." #: lang/json/effects_from_json.py msgid "Hit By Player" @@ -110775,25 +113660,25 @@ msgstr "¡Te caés al suelo!" #: lang/json/effects_from_json.py msgid "Assisted" -msgstr "" +msgstr "Asistido" #. ~ Description of effect 'Assisted'. #: lang/json/effects_from_json.py msgid "You're receiving assistance to practice a surgery." -msgstr "" +msgstr "Estás recibiendo asistencia para hacer una cirugía." #: lang/json/effects_from_json.py msgid "Masked scent" -msgstr "" +msgstr "Olor oculto" #. ~ Description of effect 'Masked scent'. #: lang/json/effects_from_json.py msgid "Your scent is masked by another one." -msgstr "" +msgstr "Tu olor está tapado por otro olor" #: lang/json/effects_from_json.py msgid "Got a check-up" -msgstr "" +msgstr "Te hicieron un chequeo" #. ~ Description of effect 'Got a check-up'. #: lang/json/effects_from_json.py @@ -110801,15 +113686,16 @@ msgid "" "Your received a complete check-up and are now aware of the state of your " "health." msgstr "" +"Recibiste un examen completo y ahora estás consciente de tu estado de salud." #: lang/json/effects_from_json.py msgid "Heated" -msgstr "" +msgstr "Calentado" #. ~ Description of effect 'Heated'. #: lang/json/effects_from_json.py msgid "At least one of your bionics is producing heat and warming you." -msgstr "" +msgstr "Por lo menos uno de tus biónicos está produciendo calor y te abriga." #: lang/json/effects_from_json.py msgid "Winded" @@ -110876,19 +113762,19 @@ msgstr "¡El grito te deja aturdido!" #: lang/json/effects_from_json.py msgid "Riding" -msgstr "" +msgstr "Montando" #. ~ Description of effect 'Riding'. #: lang/json/effects_from_json.py msgid "You are riding an animal." -msgstr "" +msgstr "Estás montando un animal." #. ~ Apply message for effect(s) 'Riding'. #: lang/json/effects_from_json.py msgid "You mount your steed." -msgstr "" +msgstr "Montás tu corcel." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "En LLamas" @@ -111020,7 +113906,7 @@ msgstr "¡Podés escuchar otra vez!" #: lang/json/effects_from_json.py msgid "A bionic LED is glowing softly beneath your skin." -msgstr "" +msgstr "El LED de un biónico está brillando suavemente bajo tu piel." #: lang/json/effects_from_json.py src/bionics.cpp msgid "Stung" @@ -111122,6 +114008,8 @@ msgid "" "Your sleep debt has been steadily increasing for a while. You should get " "some rest." msgstr "" +"La falta de sueño se te ha ido incrementando por un rato ya. Deberías " +"descansar." #. ~ Apply message for effect(s) 'Sleep Deprived'. #: lang/json/effects_from_json.py @@ -111141,7 +114029,7 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Melatonin Supplements" -msgstr "" +msgstr "Suplementos de Melatonina" #. ~ Description of effect 'Melatonin Supplements'. #: lang/json/effects_from_json.py @@ -111149,6 +114037,8 @@ msgid "" "You took some melatonin supplements. These will help with sleep " "deprivation." msgstr "" +"Te tomás unos suplementos de melatonina. Esto te va a ayudar con los " +"síntomas de la privación de sueño." #: lang/json/effects_from_json.py msgid "Stuck in beartrap" @@ -111270,12 +114160,12 @@ msgstr "¡Estás recubierto por una viscosidad brillante!" #: lang/json/effects_from_json.py msgid "Invisible" -msgstr "" +msgstr "Invisible" #. ~ Description of effect 'Invisible'. #: lang/json/effects_from_json.py msgid "You are invisible." -msgstr "" +msgstr "Sos invisible." #: lang/json/effects_from_json.py msgid "Took Xanax" @@ -111325,17 +114215,17 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Poor sight" -msgstr "" +msgstr "Mala vista" #. ~ Description of effect 'Poor sight'. #: lang/json/effects_from_json.py msgid "You can't see very far from this spot." -msgstr "" +msgstr "No podés ver muy lejos desde este punto." #. ~ Apply message for effect(s) 'Poor sight'. #: lang/json/effects_from_json.py msgid "Your sight distance is impaired." -msgstr "" +msgstr "La distancia de tu vista está disminuida." #: lang/json/effects_from_json.py msgid "Webbed" @@ -111437,14 +114327,14 @@ msgstr "Contrajiste una infección." #: lang/json/effects_from_json.py msgctxt "memorial_male" msgid "Recovered from an infection… this time." -msgstr "" +msgstr "Recuperado de la infección… por esta vez." #. ~ Female memorial remove log for effect(s) 'Infected, Badly Infected, Pus #. Filled'. #: lang/json/effects_from_json.py msgctxt "memorial_female" msgid "Recovered from an infection… this time." -msgstr "" +msgstr "Recuperada de la infección… por esta vez." #: lang/json/effects_from_json.py msgid "Recovering From Infection" @@ -111521,12 +114411,12 @@ msgstr "Curada de la infección fúngica." #: lang/json/effects_from_json.py msgid "Touched mind" -msgstr "" +msgstr "Mente tocada" #. ~ Description of effect 'Touched mind'. #: lang/json/effects_from_json.py msgid "You are disoriented as strange visions flash through your mind." -msgstr "" +msgstr "Estás desorientado por las extrañas visiones que pasan por tu mente." #. ~ Description of effect 'Touched mind'. #: lang/json/effects_from_json.py @@ -111534,36 +114424,38 @@ msgid "" "You are overwhelmed by the disturbing imagery and concepts you're flooded " "with." msgstr "" +"Estás sobrecargado por las perturbadoras imágenes y conceptos que te " +"invaden." #: lang/json/effects_from_json.py msgid "Tainted mind" -msgstr "" +msgstr "Mente contaminada" #. ~ Description of effect 'Tainted mind'. #: lang/json/effects_from_json.py msgid "You can't comprehend the things around you…" -msgstr "" +msgstr "No podés comprender las cosas que te rodean…" #: lang/json/effects_from_json.py msgid "Badly tainted mind" -msgstr "" +msgstr "Mente muy contaminada" #. ~ Description of effect 'Badly tainted mind'. #: lang/json/effects_from_json.py msgid "You don't know what is and isn't real anymore…" -msgstr "" +msgstr "Ya no sabés lo que es real y lo que no…" #. ~ Miss message for effect(s) 'Touched mind, Touched mind, Tainted mind, #. Badly tainted mind'. #: lang/json/effects_from_json.py msgid "Your sense of reality warps!" -msgstr "" +msgstr "¡Tu sentido de la realidad se deforma!" #. ~ Speed name of effect(s) 'Touched mind, Touched mind, Tainted mind, Badly #. tainted mind'. #: lang/json/effects_from_json.py msgid "Tainted" -msgstr "" +msgstr "Contaminado" #: lang/json/effects_from_json.py msgid "Hallucinating" @@ -111599,22 +114491,22 @@ msgstr "Temblás." #: lang/json/effects_from_json.py msgid "Seizure" -msgstr "" +msgstr "Convulsión" #. ~ Description of effect 'Seizure'. #: lang/json/effects_from_json.py msgid "Your muscles have seized up, and you can't control them!" -msgstr "" +msgstr "¡Tus músculos convulsionan y no los podés controlar!" #. ~ Remove message for effect(s) 'Seizure'. #: lang/json/effects_from_json.py msgid "You regain control of your muscles!" -msgstr "" +msgstr "¡Recuperás el control de tus músculos!" #. ~ Miss message for effect(s) 'Seizure'. #: lang/json/effects_from_json.py msgid "Your muscles won't cooperate!" -msgstr "" +msgstr "¡Tus músculos no estarían cooperando!" #: lang/json/effects_from_json.py msgid "Bleeding" @@ -111726,12 +114618,12 @@ msgstr "¡Tu %s te está transpirando mucho!" #: lang/json/effects_from_json.py msgid "Slowdown" -msgstr "" +msgstr "Ralentización" #. ~ Description of effect 'Slowdown'. #: lang/json/effects_from_json.py msgid "The heat slows you down." -msgstr "" +msgstr "El calor te hace ir más despacio." #: lang/json/effects_from_json.py msgid "Hampered" @@ -111740,21 +114632,21 @@ msgstr "Obstaculizado" #. ~ Description of effect 'Hampered'. #: lang/json/effects_from_json.py msgid "You struggle to move in this heat." -msgstr "" +msgstr "Te cuesta moverte con estos calores." #: lang/json/effects_from_json.py msgid "Crushed" -msgstr "" +msgstr "Aplastado" #. ~ Description of effect 'Crushed'. #: lang/json/effects_from_json.py msgid "The heat is crushing you." -msgstr "" +msgstr "Te sentís aplastado por el calor." #. ~ Speed name of effect(s) 'Slowdown, Hampered, Crushed'. #: lang/json/effects_from_json.py msgid "Heat slowdown" -msgstr "" +msgstr "Ralentización por calor" #: lang/json/effects_from_json.py msgid "Frostnip" @@ -111932,21 +114824,21 @@ msgstr "Ya se te pasó la gripe." #: lang/json/effects_from_json.py msgid "Vaccinated" -msgstr "" +msgstr "Vacunado" #. ~ Description of effect 'Vaccinated'. #: lang/json/effects_from_json.py msgid "You have been vaccinated for the flu recently." -msgstr "" +msgstr "Has sido vacunado contra la gripe recientemente." #: lang/json/effects_from_json.py msgid "Took antiasthmatic drugs" -msgstr "" +msgstr "Tomaste drogas antiasmáticas" #. ~ Description of effect 'Took antiasthmatic drugs'. #: lang/json/effects_from_json.py msgid "You have taken an antiasthmatic drug recently." -msgstr "" +msgstr "Te tomaste una droga contra el asma recientemente." #: lang/json/effects_from_json.py msgid "RX12 Healing Comedown" @@ -112092,7 +114984,7 @@ msgstr "Le pegás una pitada o dos." msgid "You smoked too much." msgstr "Fumaste demasiado." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "Drogado" @@ -112175,7 +115067,7 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Dead Drunk" -msgstr "" +msgstr "Borrachazo" #. ~ Description of effect 'Dead Drunk'. #: lang/json/effects_from_json.py @@ -112183,6 +115075,8 @@ msgid "" "You embalmed yourself alive with so much alcohol, that even zombies will " "leave your dead body alone." msgstr "" +"Te metiste tanto alcohol adentro que ni siquiera los zombis se atreverían a " +"tocar tu cadáver." #. ~ Miss message for effect(s) 'Tipsy, Drunk, Trashed, Wasted, Dead Drunk'. #. ~ Miss message for effect(s) 'Depressants'. @@ -112223,7 +115117,7 @@ msgstr "" #. Asthma, Heavy Asthma'. #: lang/json/effects_from_json.py msgid "You can't breathe… asthma attack!" -msgstr "" +msgstr "No podés respirar… ¡un ataque de asma!" #. ~ Miss message for effect(s) 'Asthma, Asthma, Asthma, Asthma, Heavy Asthma, #. Heavy Asthma'. @@ -112290,15 +115184,17 @@ msgid "" "You have been grabbed by an attack.\n" "You are being held in place, and dodging and blocking are very difficult." msgstr "" +"Fuiste agarrado en la pelea.\n" +"Estás retenido en el lugar, esquivar y bloquear ataques es muy difícil." #: lang/json/effects_from_json.py msgid "Grabbing" -msgstr "" +msgstr "Agarrando" #. ~ Description of effect 'Grabbing'. #: lang/json/effects_from_json.py msgid "Grabbing another creature and holding them in place." -msgstr "" +msgstr "Agarrando a otra criatura y manteniéndola en su lugar." #: lang/json/effects_from_json.py msgid "Lacking Sleep" @@ -112333,12 +115229,12 @@ msgstr "Te despertás." #: lang/json/effects_from_json.py msgid "Under operation" -msgstr "" +msgstr "En operación" #. ~ Description of effect 'Under operation'. #: lang/json/effects_from_json.py msgid "You are being operated on. Try to stay still." -msgstr "" +msgstr "Estás siendo operado. Quedate quieto." #: lang/json/effects_from_json.py msgid "Playing an instrument" @@ -112600,16 +115496,16 @@ msgstr "Tu metabolismo se vuelve más estable." #: lang/json/effects_from_json.py msgid "Concerning symptoms" -msgstr "" +msgstr "Síntomas preocupantes" #. ~ Description of effect 'Concerning symptoms'. #: lang/json/effects_from_json.py msgid "Your muscles keep twitching strangely." -msgstr "" +msgstr "Tus músculos siguen sacudiéndose de manera extraña." #: lang/json/effects_from_json.py msgid "Unnerving symptoms" -msgstr "" +msgstr "Síntomas inquietantes" #. ~ Description of effect 'Unnerving symptoms'. #: lang/json/effects_from_json.py @@ -112617,28 +115513,30 @@ msgid "" "Your nervous system is malfunctioning, almost like it's being torn apart " "from the inside." msgstr "" +"Tu sistema nervioso está funcionando mal, casi como si te lo estuvieran " +"arrancando." #: lang/json/effects_from_json.py msgid "Gross food" -msgstr "" +msgstr "Comida desagradable" #. ~ Description of effect 'Gross food'. #: lang/json/effects_from_json.py msgid "The food you eat is disgusting." -msgstr "" +msgstr "Lo que te comiste fue desagradable." #: lang/json/effects_from_json.py msgid "Demoralizing food" -msgstr "" +msgstr "Comida desmoralizante" #. ~ Description of effect 'Demoralizing food'. #: lang/json/effects_from_json.py msgid "Eating nothing but disgusting rations is starting to get you down." -msgstr "" +msgstr "Comer solamente raciones desagradables está empezando a deprimirte." #: lang/json/effects_from_json.py msgid "Depressing food" -msgstr "" +msgstr "Comida deprimente" #. ~ Description of effect 'Depressing food'. #: lang/json/effects_from_json.py @@ -112646,6 +115544,8 @@ msgid "" "Sure, you survived, but what kind of survival is this, eating these " "disgusting rations day in and day out?" msgstr "" +"Sí, sobreviviste, pero ¿qué clase de supervivencia es esta, comiendo estas " +"raciones desagradables día por medio?" #: lang/json/effects_from_json.py msgid "Lit up" @@ -112705,12 +115605,12 @@ msgstr "Esta criatura ha sido ordeñada completa o parcialmente." #: lang/json/effects_from_json.py msgid "Sheared" -msgstr "" +msgstr "Esquilada" #. ~ Description of effect 'Sheared'. #: lang/json/effects_from_json.py msgid "The creature has been fully sheared." -msgstr "" +msgstr "La criatura ha sido completamente esquilada." #: lang/json/effects_from_json.py msgid "Painkillers" @@ -112895,7 +115795,7 @@ msgstr "Supercarga" #. ~ Description of effect 'Supercharged'. #: lang/json/effects_from_json.py msgid "You've been struck by lightning, and feel… different." -msgstr "" +msgstr "Has sido golpeado por un rayo, y te sentís… diferente." #: lang/json/effects_from_json.py msgid "Grown of Fusion" @@ -112910,16 +115810,16 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Stinking air" -msgstr "" +msgstr "Aire apestoso" #. ~ Description of effect 'Stinking air'. #: lang/json/effects_from_json.py msgid "The air in here smells like vinegar and mold." -msgstr "" +msgstr "Acá el aire huele a vinagre y moho." #: lang/json/effects_from_json.py msgid "Disorienting air" -msgstr "" +msgstr "Aire desorientador" #. ~ Description of effect 'Disorienting air'. #: lang/json/effects_from_json.py @@ -112927,10 +115827,11 @@ msgid "" "The air in here smells like vinegar and mold. It makes you feel soft-headed" " and confused." msgstr "" +"Acá el aire huele a vinagre y moho. Te hace sentir mareado y confundido." #: lang/json/effects_from_json.py msgid "Smothering air" -msgstr "" +msgstr "Aire asfixiante" #. ~ Description of effect 'Smothering air'. #: lang/json/effects_from_json.py @@ -112938,23 +115839,25 @@ msgid "" "The air in here smells like vinegar and mold. It is closing in and " "smothering you, making it impossible to think clearly." msgstr "" +"Acá el aire huele a vinagre y moho. Pareciera cerrarse y empezar a " +"asfixiarte, haciéndote imposible pensar con claridad." #. ~ Apply message for effect(s) 'Stinking air, Disorienting air, Disorienting #. air, Smothering air, Smothering air'. #: lang/json/effects_from_json.py msgid "" "The air in here smells like vinegar and mold, and hurts your lungs a bit." -msgstr "" +msgstr "Acá el aire huele a vinagre y moho y te duelen un poco los pulmones." #. ~ Miss message for effect(s) 'Stinking air, Disorienting air, Disorienting #. air, Smothering air, Smothering air'. #: lang/json/effects_from_json.py msgid "You feel groggy in this sweltering, foul air." -msgstr "" +msgstr "Te sentís atontado en este aire sofocante y nauseabundo." #: lang/json/effects_from_json.py msgid "Covered in fetid goop" -msgstr "" +msgstr "Cubierto por un pegote fétido" #. ~ Description of effect 'Covered in fetid goop'. #: lang/json/effects_from_json.py @@ -112962,11 +115865,13 @@ msgid "" "The feeling of the goop slowly sliding on your skin revulses you and the " "smell makes you gag." msgstr "" +"La sensación del pegote chorreando lentamente por tu piel te repugna y el " +"olor te da arcadas." #. ~ Apply message for effect(s) 'Covered in fetid goop'. #: lang/json/effects_from_json.py msgid "You're disgusted by the goop." -msgstr "" +msgstr "Estás asqueado por el pegote." #: lang/json/effects_from_json.py src/character.cpp msgid "Full" @@ -112976,7 +115881,7 @@ msgstr "Lleno" #. ~ Apply message for effect(s) 'Full'. #: lang/json/effects_from_json.py msgid "You feel quite full, and a bit sluggish." -msgstr "" +msgstr "Te sentís bastante lleno y un poco perezoso." #: lang/json/effects_from_json.py src/character.cpp msgid "Engorged" @@ -112986,7 +115891,7 @@ msgstr "Panza llena" #. ~ Apply message for effect(s) 'Engorged'. #: lang/json/effects_from_json.py msgid "Your stomach is full to bursting. This was a mistake." -msgstr "" +msgstr "Tu estómago casi no da más de lleno. Esto fue un error." #: lang/json/effects_from_json.py msgid "Magnesium Supplements" @@ -113018,24 +115923,25 @@ msgstr "" #: lang/json/effects_from_json.py msgid "This beggar in the refugee center has had something to eat recently." msgstr "" +"Este mendigo en el centro de refugiados tuvo algo para comer recientemente." #: lang/json/effects_from_json.py msgid "Insulted" -msgstr "" +msgstr "Insultado" #. ~ Description of effect 'Insulted'. #: lang/json/effects_from_json.py msgid "Oh, you went there." -msgstr "" +msgstr "Oh, con que esas tenemos." #: lang/json/effects_from_json.py msgid "Panicking" -msgstr "" +msgstr "En pánico" #. ~ Description of effect 'Panicking'. #: lang/json/effects_from_json.py msgid "You just can't stop shaking and are overwhelmed by fear." -msgstr "" +msgstr "No podés dejar de temblar y estás agobiado por el miedo." #. ~ Apply message for effect(s) 'Panicking'. #: lang/json/effects_from_json.py @@ -113043,114 +115949,116 @@ msgid "" "An all consuming dread overwhelms your mind and you begin to shake " "uncontrollably!" msgstr "" +"Te consume un pavor que agobia tu mente ¡y comenzás a temblar " +"descontroladamente!" #. ~ Remove message for effect(s) 'Panicking'. #: lang/json/effects_from_json.py msgid "Your heartrate slows back to normal!" -msgstr "" +msgstr "¡Tu ritmo cardíaco se desacelera y vuelve a ser normal!" #. ~ Miss message for effect(s) 'Panicking'. #: lang/json/effects_from_json.py msgid "You shake uncontrollably" -msgstr "" +msgstr "Temblás descontroladamente" #. ~ Description of effect 'Mana Fatigue'. #: lang/json/effects_from_json.py msgid "You are exhausted from channeling a lot of mana." -msgstr "" +msgstr "Estás exhausto por haber canalizado mucho maná." #. ~ Apply message for effect(s) 'Mana Fatigue'. #: lang/json/effects_from_json.py msgid "Channeling so much mana is making you tired" -msgstr "" +msgstr "Canalizar tanto maná te está cansando" #. ~ Remove message for effect(s) 'Mana Fatigue'. #: lang/json/effects_from_json.py msgid "The burden of mana fatigue has faded" -msgstr "" +msgstr "El agobio de la fatiga de maná ya terminó" #. ~ Description of effect 'Windrunning'. #: lang/json/effects_from_json.py msgid "You are bolstered and pushed along by the power of the wind." -msgstr "" +msgstr "Sos sostenido y empujado por el poder del viento." #. ~ Apply message for effect(s) 'Windrunning'. #: lang/json/effects_from_json.py msgid "You are bolstered and pushed along by the power of the wind" -msgstr "" +msgstr "Sos sostenido y empujado por el poder del viento" #. ~ Remove message for effect(s) 'Windrunning'. #: lang/json/effects_from_json.py msgid "The wind at your back dies down." -msgstr "" +msgstr "El viento de tu espalda frena." #. ~ Description of effect 'Dark Sight'. #: lang/json/effects_from_json.py msgid "You can see in the dark." -msgstr "" +msgstr "Podés ver en la oscuridad." #. ~ Apply message for effect(s) 'Dark Sight'. #: lang/json/effects_from_json.py msgid "Your sight adjusts to the darkness." -msgstr "" +msgstr "Tu vista se ajusta a la oscuridad." #. ~ Remove message for effect(s) 'Dark Sight'. #: lang/json/effects_from_json.py msgid "The darkness loses its shape." -msgstr "" +msgstr "La oscuridad pierde su forma." #: lang/json/effects_from_json.py msgid "Ethereal Hold" -msgstr "" +msgstr "Abrazo Etéreo" #. ~ Description of effect 'Ethereal Hold'. #: lang/json/effects_from_json.py msgid "Ghostly arms are trying to hold you in place!" -msgstr "" +msgstr "¡Unos brazos fantasmales intentan sostenerte en el lugar!" #. ~ Apply message for effect(s) 'Ethereal Hold'. #: lang/json/effects_from_json.py msgid "Ethereal arms shoot out of the ground and grab onto you!" -msgstr "" +msgstr "¡Unos brazos etéreos salen del suelo y te agarran!" #. ~ Remove message for effect(s) 'Ethereal Hold'. #: lang/json/effects_from_json.py msgid "The ghostly arms fade away." -msgstr "" +msgstr "Los brazos fantasmales desaparecen." #. ~ Description of effect 'Invisibility'. #: lang/json/effects_from_json.py msgid "Nothing can see you." -msgstr "" +msgstr "Nada te puede ver." #. ~ Apply message for effect(s) 'Invisibility'. #: lang/json/effects_from_json.py msgid "You fade away." -msgstr "" +msgstr "Desaparecés." #. ~ Remove message for effect(s) 'Invisibility'. #: lang/json/effects_from_json.py msgid "You can see your hands again." -msgstr "" +msgstr "Podés volver a verte las manos." #: lang/json/effects_from_json.py msgid "Blessed" -msgstr "" +msgstr "Bendecido" #. ~ Description of effect 'Blessed'. #: lang/json/effects_from_json.py msgid "You are filled with energy that improves everything you do." -msgstr "" +msgstr "Estás lleno de energía que mejora todo lo que hacés." #. ~ Apply message for effect(s) 'Blessed'. #: lang/json/effects_from_json.py msgid "You are filled with energy that improves everything you do!" -msgstr "" +msgstr "¡Estás lleno de energía que mejora todo lo que hacés!" #. ~ Remove message for effect(s) 'Blessed'. #: lang/json/effects_from_json.py msgid "Your energy fades." -msgstr "" +msgstr "Tu energía desaparece." #. ~ Description of effect 'Grotesque Enhancement'. #. ~ Apply message for effect(s) 'Grotesque Enhancement'. @@ -113159,181 +116067,184 @@ msgid "" "Your body ripples with writhing alien muscles, your limbs lengthen, and your" " eyes glow with a faint green." msgstr "" +"Tu cuerpo ondea con músculos alienígenas que se retuercen, tus miembros se " +"alargan y tus ojos brillan de un verde suave." #. ~ Remove message for effect(s) 'Grotesque Enhancement'. #: lang/json/effects_from_json.py msgid "Your body rapidly returns to normal." -msgstr "" +msgstr "Tu cuerpo vuelve rápidamente a su normalidad." #. ~ Description of effect 'Vegetative Grasp'. #. ~ Description of effect 'Root Impale'. #: lang/json/effects_from_json.py msgid "Roots and vines entangle your foes." -msgstr "" +msgstr "Raíces y lianas atrapan a tus enemigos." #. ~ Apply message for effect(s) 'Vegetative Grasp'. #: lang/json/effects_from_json.py msgid "Roots and vines entangle your foes to slow them!" -msgstr "" +msgstr "¡Raíces y lianas atrapan a tus enemigos y los ralentizan!" #. ~ Remove message for effect(s) 'Vegetative Grasp'. #: lang/json/effects_from_json.py msgid "The roots and vines wither up and die." -msgstr "" +msgstr "Las raíces y lianas se marchitan y mueren." #: lang/json/effects_from_json.py msgid "Root Impale" -msgstr "" +msgstr "Empalamiento de Raíz" #. ~ Apply message for effect(s) 'Root Impale'. #: lang/json/effects_from_json.py msgid "Roots rip out from the ground and impale your enemies!" -msgstr "" +msgstr "¡Salen raíces del suelo e empalan a tus enemigos!" #. ~ Remove message for effect(s) 'Root Impale'. #: lang/json/effects_from_json.py msgid "The roots wither up and die." -msgstr "" +msgstr "Las raíces se marchitan y mueren." #: lang/json/effects_from_json.py msgid "Acidic burn" -msgstr "" +msgstr "Quemadura ácida" #. ~ Description of effect 'Acidic burn'. #: lang/json/effects_from_json.py msgid "Burned with acid" -msgstr "" +msgstr "Quemado por ácido" #: lang/json/effects_from_json.py msgid "Hasted" -msgstr "" +msgstr "Apurado" #. ~ Description of effect 'Hasted'. #: lang/json/effects_from_json.py msgid "Your speed is boosted enormously." -msgstr "" +msgstr "Tu velocidad está muy incrementada." #. ~ Apply message for effect(s) 'Hasted'. #: lang/json/effects_from_json.py msgid "Your speed is boosted to superhuman levels!" -msgstr "" +msgstr "¡Tu velocidad es incrementada a niveles superhumanos!" #. ~ Remove message for effect(s) 'Hasted'. #: lang/json/effects_from_json.py msgid "You return to your normal speed." -msgstr "" +msgstr "Volvés a tener tu velocidad normal." #. ~ Description of effect 'Synaptic Stimulation'. #: lang/json/effects_from_json.py msgid "Your mental processing is increased." -msgstr "" +msgstr "Tu procesamiento mental está incrementado." #. ~ Apply message for effect(s) 'Synaptic Stimulation'. #: lang/json/effects_from_json.py msgid "Your mind accelerates." -msgstr "" +msgstr "Tu mente se acelera." #. ~ Remove message for effect(s) 'Synaptic Stimulation'. #: lang/json/effects_from_json.py msgid "Your mind returns to normal speed." -msgstr "" +msgstr "Tu mente vuelve a tener su velocidad normal." #. ~ Description of effect 'Ogre's Strength'. #: lang/json/effects_from_json.py msgid "You have the strength of an Ogre!" -msgstr "" +msgstr "¡Tenés la fuerza de un Ogro!" #. ~ Apply message for effect(s) 'Ogre's Strength'. #: lang/json/effects_from_json.py msgid "You feel strong!" -msgstr "" +msgstr "¡Te sentís fuerte!" #. ~ Remove message for effect(s) 'Ogre's Strength'. #: lang/json/effects_from_json.py msgid "Your strength deflates." -msgstr "" +msgstr "Tu fuerza se reduce." #. ~ Description of effect 'Eagle's Sight'. #: lang/json/effects_from_json.py msgid "You have the perception of an Eagle!" -msgstr "" +msgstr "¡Tenés la percepción de un Águila!" #. ~ Apply message for effect(s) 'Eagle's Sight'. #: lang/json/effects_from_json.py msgid "You notice small details!" -msgstr "" +msgstr "¡Podés notar los detalles pequeños!" #. ~ Remove message for effect(s) 'Eagle's Sight'. #: lang/json/effects_from_json.py msgid "Your vision returns to normal." -msgstr "" +msgstr "Tu visión vuelve a ser normal." #. ~ Description of effect 'Cat's Grace'. #: lang/json/effects_from_json.py msgid "You have the dexterity of a cat!" -msgstr "" +msgstr "¡Tenés la destreza de un gato!" #. ~ Apply message for effect(s) 'Cat's Grace'. #: lang/json/effects_from_json.py msgid "Your reflexes are heightened!" -msgstr "" +msgstr "¡Tus reflejos están intensificados!" #. ~ Remove message for effect(s) 'Cat's Grace'. #: lang/json/effects_from_json.py msgid "Your reflexes return to normal." -msgstr "" +msgstr "Tus reflejos vuelven a la normalidad." #. ~ Description of effect 'Fox's Cunning'. #: lang/json/effects_from_json.py msgid "You have the cunning of a Fox!" -msgstr "" +msgstr "¡Tenés la astucia de un Zorro!" #. ~ Apply message for effect(s) 'Fox's Cunning'. #: lang/json/effects_from_json.py msgid "Your intelligence is heightened!" -msgstr "" +msgstr "¡Tu inteligencia se agudiza!" #. ~ Remove message for effect(s) 'Fox's Cunning'. #: lang/json/effects_from_json.py msgid "Your intelligence returns to normal." -msgstr "" +msgstr "Tu inteligencia vuelve a la normalidad." #. ~ Apply message for effect(s) 'Debug Full Protection'. #: lang/json/effects_from_json.py msgid "Your skin tingle with the power of the Devs!" -msgstr "" +msgstr "¡Tu piel se estremece con el poder de los Desarrolladores!" #. ~ Remove message for effect(s) 'Debug Full Protection'. #: lang/json/effects_from_json.py msgid "Your skin stops tingling, your life is empty and meaningless again." msgstr "" +"Tu piel deja de estremecerse, tu vida es vacío y sin sentido otra vez." #: lang/json/effects_from_json.py msgid "Debug Feather Fall" -msgstr "" +msgstr "Debug Caída de Pluma" #. ~ Description of effect 'Debug Feather Fall'. #: lang/json/effects_from_json.py msgid "You are light as a feather and fall like one." -msgstr "" +msgstr "Sos liviano como una pluma y caerás igual de suave." #. ~ Apply message for effect(s) 'Debug Feather Fall'. #: lang/json/effects_from_json.py msgid "Your body feels light as a feather." -msgstr "" +msgstr "Tu cuerpo se siente liviano como una pluma." #. ~ Remove message for effect(s) 'Debug Feather Fall'. #: lang/json/effects_from_json.py msgid "The earth pulls you down hard." -msgstr "" +msgstr "La tierra te atrae fuertemente." #: lang/json/effects_from_json.py msgid "Scared" -msgstr "" +msgstr "Asustado" #: lang/json/effects_from_json.py msgid "Frightened" -msgstr "" +msgstr "Aterrado" #: lang/json/effects_from_json.py src/npc.cpp msgid "Terrified" @@ -113343,20 +116254,22 @@ msgstr "Aterrado" msgid "" "Your knees are shaking, your heart beats fast, and your stomach rebels." msgstr "" +"Te tiemblan las rodillas, tu corazón late rápidamente y tu estómago se " +"rebela." #. ~ Apply message for effect(s) 'Scared, Frightened, Terrified'. #: lang/json/effects_from_json.py msgid "You are afraid!" -msgstr "" +msgstr "¡Estás asustado!" #. ~ Remove message for effect(s) 'Scared, Frightened, Terrified'. #: lang/json/effects_from_json.py msgid "Your fear dissipates." -msgstr "" +msgstr "Desaparece tu miedo." #: lang/json/effects_from_json.py msgid "Visceral Overexertion" -msgstr "" +msgstr "Esfuerzo Visceral" #. ~ Description of effect 'Visceral Overexertion'. #: lang/json/effects_from_json.py @@ -113364,6 +116277,8 @@ msgid "" "You feel sickened from overtaxing your body, having extended your influence " "over such a wide area." msgstr "" +"Te sentís enfermo por exigir demasiado a tu cuerpo, habiendo extendido tu " +"influencia sobre un área tan grande." #. ~ Description of effect 'Coagulant Weave'. #: lang/json/effects_from_json.py @@ -113371,106 +116286,48 @@ msgid "" "Immunity to bleeding and bites, increased stamina regeneration, increased " "hunger and thirst gain." msgstr "" +"Inmunidad contra sangrado y mordeduras, regeneración mejorada de " +"resistencia, hambre incrementada y aumento de sed." #. ~ Remove message for effect(s) 'Coagulant Weave'. #: lang/json/effects_from_json.py msgid "The tension running through your flesh fades." -msgstr "" +msgstr "Desaparece la tensión que corría por tu carne." #: lang/json/effects_from_json.py msgid "Biomantic Venom" -msgstr "" +msgstr "Veneno Biomántico" #. ~ Description of effect 'Biomantic Venom'. #: lang/json/effects_from_json.py msgid "You feel sluggish and weak, from magically-induced poisoning." -msgstr "" +msgstr "Te sentís débil y perezoso, por el veneno inducido mágicamente." #: lang/json/effects_from_json.py msgid "Gummed" -msgstr "" +msgstr "Engomado" #: lang/json/effects_from_json.py msgid "You have some gum on you." -msgstr "" +msgstr "Tenés algo de goma encima." #: lang/json/effects_from_json.py msgid "You are covered in gum!" -msgstr "" +msgstr "¡Estás cubierto de goma!" #: lang/json/effects_from_json.py msgid "You're trapped in gum!" -msgstr "" +msgstr "¡Estás atrapado en goma!" #. ~ Apply message for effect(s) 'Gummed'. #: lang/json/effects_from_json.py msgid "You're covered in gum!" -msgstr "" +msgstr "¡Estás recubierto de goma!" #. ~ Miss message for effect(s) 'Gummed'. #: lang/json/effects_from_json.py msgid "The gum webs constrict your movement." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" +msgstr "La red de goma restringe tus movimientos." #: lang/json/faction_from_json.py msgid "Your Followers" @@ -113487,7 +116344,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "AMF" -msgstr "" +msgstr "AMF" #. ~ Description for AMF #: lang/json/faction_from_json.py @@ -113496,10 +116353,12 @@ msgid "" " mutinied because of your abuse and incompetence. They will kill you if " "they can." msgstr "" +"Los sobrevivientes que antes te confiaban su bienestar, ahora se han " +"amotinado a causa de tus abusos e incompetencia. Te van a matar si pueden." #: lang/json/faction_from_json.py msgid "Hub 01" -msgstr "" +msgstr "Hub 01" #. ~ Description for Hub 01 #: lang/json/faction_from_json.py @@ -113508,10 +116367,13 @@ msgid "" "leave their lab, if at all, and rely on their robots and advanced technology" " to survive." msgstr "" +"El plantel superviviente del Hub 01, un laboratorio de investigación de " +"antes del Cataclismo. Muy raramente salen del laboratorio, si es que salen, " +"y dependen de sus robots y tecnología de avanzada para sobrevivir." #: lang/json/faction_from_json.py msgid "Hub 01 Ancillia" -msgstr "" +msgstr "Hub 01 Ancillia" #. ~ Description for Hub 01 Ancillia #: lang/json/faction_from_json.py @@ -113519,6 +116381,8 @@ msgid "" "A loose association of skilled wastelanders, traders, mercenaries and " "scouts. All working on behalf of Hub 01, for their own reasons." msgstr "" +"Es una asociación libre de piratas, comerciantes, mercenarios y " +"exploradores. Todos trabajando de parte de Hub 01, por sus propias razones." #: lang/json/faction_from_json.py msgid "The Old Guard" @@ -113548,7 +116412,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "The Beggars in the Lobby" -msgstr "" +msgstr "Los Mendigos en el Hall" #. ~ Description for The Beggars in the Lobby #: lang/json/faction_from_json.py @@ -113556,6 +116420,8 @@ msgid "" "A collection of mentally and physically disadvantaged survivors who beg for " "food in the Evac Center lobby." msgstr "" +"Es una colección de sobrevivientes desvalidos mental y físicamente, que " +"piden comida en el hall del Centro de Evacuados." #: lang/json/faction_from_json.py msgid "The Tacoma Commune" @@ -113572,7 +116438,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "Marloss Evangelists" -msgstr "" +msgstr "Evangelistas Marloss" #. ~ Description for Marloss Evangelists #: lang/json/faction_from_json.py @@ -113580,15 +116446,18 @@ msgid "" "Diverse bands, congregations and organizations with the common goal of " "preaching human survival through symbiosis with fungaloids." msgstr "" +"Diversas bandas, congregaciones y organizaciones con el objetivo común de " +"predicar la supervivencia humana a través de la simbiosis con los " +"fungaloides." #: lang/json/faction_from_json.py msgid "No Faction" -msgstr "" +msgstr "Sin Bando" #. ~ Description for No Faction #: lang/json/faction_from_json.py msgid "A lone wolf, not aligned with any faction." -msgstr "" +msgstr "Un lobo solitario, sin alineación con ningún bando." #: lang/json/faction_from_json.py msgid "The Wasteland Scavengers" @@ -113619,25 +116488,25 @@ msgstr "" #: lang/json/faction_from_json.py msgid "Mutants Bees" -msgstr "" +msgstr "Abejas Mutantes" #. ~ Description for Mutants Bees #: lang/json/faction_from_json.py msgid "Mutant bees who hate everyone." -msgstr "" +msgstr "Son abejas mutantes que odian a todos." #: lang/json/faction_from_json.py msgid "Isherwood family" -msgstr "" +msgstr "Familia Isherwood" #. ~ Description for Isherwood family #: lang/json/faction_from_json.py msgid "A small family surviving on their generational land." -msgstr "" +msgstr "Es una pequeña familia sobreviviendo en su tierra generacional." #: lang/json/faction_from_json.py msgid "New England Church Community" -msgstr "" +msgstr "Comunidad de la Iglesia de New England" #. ~ Description for New England Church Community #: lang/json/faction_from_json.py @@ -113645,10 +116514,12 @@ msgid "" "A small group of churchgoers that formed a community in the woods. They " "welcome anyone in their faction, but hate the unnatural." msgstr "" +"Es un pequeño grupo de feligreses que formaron una comunidad en los bosques." +" Aceptan la llegada de cualquier a su bando pero odian lo sobrenatural." #: lang/json/faction_from_json.py msgid "PrepNet Phyle" -msgstr "" +msgstr "PrepNet Phyle" #. ~ Description for PrepNet Phyle #: lang/json/faction_from_json.py @@ -113657,10 +116528,13 @@ msgid "" "global chaos, instead they were slightly more ready than others for the " "Cataclysm." msgstr "" +"Es un grupo de survivalistas biónicos que esperaban el colapso de la " +"economía y el caos global, pero por lo menos estuvieron un poco más " +"preparados que los otros para el Cataclismo." #: lang/json/faction_from_json.py msgid "Whately Family" -msgstr "" +msgstr "Familia Whately" #. ~ Description for Whately Family #: lang/json/faction_from_json.py @@ -113668,10 +116542,26 @@ msgid "" "The Whately's are an old New England family of eccentrics. Eccentrics being" " the kind words used about them." msgstr "" +"Los Whately son una vieja familia de excéntricos de New England. Excéntricos" +" es la palabra buena que se puede usar acerca de ellos." #: lang/json/faction_from_json.py -msgid "The Ancient Ones" +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "Comunidad de Pantaneros Religiosos y Hoteles y Casinos" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." msgstr "" +"Es un grupo próspero pero reservado de feligreses y magnates del " +"entretenimiento con afección por los dinosaurios. Aceptan a todos los " +"humanos incontaminados." + +#: lang/json/faction_from_json.py +msgid "The Ancient Ones" +msgstr "Los Antiguos" #. ~ Description for The Ancient Ones #: lang/json/faction_from_json.py @@ -113679,10 +116569,12 @@ msgid "" "The spellcrafters of old. Hidden from the world until the cataclysm, they " "have their own agenda and care little for you or yours." msgstr "" +"Son los antiguos hechiceros. Ocultos del mundo hasta el Cataclismo, tienen " +"sus propios planes y les importan muy poco los tuyos." #: lang/json/faction_from_json.py msgid "The Grey Flame" -msgstr "" +msgstr "La Llama Gris" #. ~ Description for The Grey Flame #: lang/json/faction_from_json.py @@ -113690,6 +116582,9 @@ msgid "" "A collection of those cursed by the cataclysm. They have sworn to rid this " "world of its curse and will stop at nothing to accomplish their task." msgstr "" +"Es una colección de aquellos que han sido maldecidos por el Cataclismo. Han " +"jurado liberar al mundo de su maldición y no pararán ante nada para cumplir " +"con su tarea." #: lang/json/faction_from_json.py msgid "Captives" @@ -113719,52 +116614,58 @@ msgid "" " more. It's only a matter of time before they too become the prey of " "otherwordly creatures, or of all-too-human monsters." msgstr "" +"Remanentes desperdigados de la civilización, estos pocos afortunados " +"lograron permanecer encerrados durante las primeras etapas del Cataclismo. " +"Aunque por un tiempo estuvieron seguros, se están quedando sin suministros y" +" no tienen la capacidad de conseguir más. Es cuestión de tiempo que también " +"se conviertan en las presas de criaturas de otros mundos, o de otros " +"monstruos humanos." #: lang/json/fault_from_json.py msgid "Dusty" -msgstr "" +msgstr "Polvoriento" #. ~ description for fault '{'str': 'Dusty'}' #: lang/json/fault_from_json.py msgid "It's dusty. Has no effect - obsolete fault." -msgstr "" +msgstr "Está con polvo. No tiene efecto - falla obsoleta." #. ~ name of mending method for fault '{'str': 'Dusty'}' #: lang/json/fault_from_json.py msgid "Wipe clean" -msgstr "" +msgstr "Pasar un trapo" #. ~ success message for mending method 'Wipe clean' of fault '{'str': #. 'Dusty'}' #: lang/json/fault_from_json.py #, python-format msgid "You clean you %s." -msgstr "" +msgstr "Limpiás tu %s." #: lang/json/fault_from_json.py msgid "Already deployed" -msgstr "" +msgstr "Ya desplegado" #. ~ description for fault '{'str': 'Already deployed'}' #: lang/json/fault_from_json.py msgid "This bionic needs to be reset to its factory state." -msgstr "" +msgstr "Este biónico necesita ser reseteado a su estado de fábrica." #. ~ name of mending method for fault '{'str': 'Already deployed'}' #: lang/json/fault_from_json.py msgid "Reset to factory state" -msgstr "" +msgstr "Resetear a estado de fábrica" #. ~ success message for mending method 'Reset to factory state' of fault #. '{'str': 'Already deployed'}' #: lang/json/fault_from_json.py #, python-format msgid "You successfully reset the %s to its factory state" -msgstr "" +msgstr "Lográs resetear el %s a su estado de fábrica" #: lang/json/fault_from_json.py msgid "Blackpowder fouling" -msgstr "" +msgstr "Suciedad de pólvora" #. ~ description for fault '{'str': 'Blackpowder fouling'}' #: lang/json/fault_from_json.py @@ -113775,11 +116676,16 @@ msgid "" "impact on reliability at high levels, but black powder fouling accumulates " "quickly." msgstr "" +"Disparar cargas de pólvora de un arma la ensucia, lo que reduce la " +"fiabilidad y, si se deja sucia, se oxidará. Ensucia el arma mucho más rápido" +" que el uso de cartuchos modernos sin humo. Esta suciedad solo impacta en la" +" fiabilidad en grandes niveles, pero la suciedad de la pólvora se acumula " +"rápidamente." #. ~ name of mending method for fault '{'str': 'Blackpowder fouling'}' #: lang/json/fault_from_json.py msgid "Clean blackpowder fouling" -msgstr "" +msgstr "Limpiar suciedad de pólvora" #. ~ success message for mending method 'Clean blackpowder fouling' of fault #. '{'str': 'Blackpowder fouling'}' @@ -113788,12 +116694,12 @@ msgstr "" #: lang/json/fault_from_json.py #, python-format msgid "You clean your %s." -msgstr "" +msgstr "Limpiás tu %s." #. ~ name of mending method for fault '{'str': 'Blackpowder fouling'}' #: lang/json/fault_from_json.py msgid "Clean blackpowder fouling and lubricate" -msgstr "" +msgstr "Limpiar suciedad de pólvora y lubricar" #. ~ success message for mending method 'Clean blackpowder fouling and #. lubricate' of fault '{'str': 'Blackpowder fouling'}' @@ -113802,11 +116708,11 @@ msgstr "" #: lang/json/fault_from_json.py #, python-format msgid "You clean and lubricate your %s." -msgstr "" +msgstr "Limpiás y lubricás tu %s." #: lang/json/fault_from_json.py msgid "Spent casing in chamber" -msgstr "" +msgstr "Vaina servida en cámara" #. ~ description for fault '{'str': 'Spent casing in chamber'}' #: lang/json/fault_from_json.py @@ -113814,22 +116720,24 @@ msgid "" "This gun currently has an empty casing chambered. It will have to be " "removed before firing." msgstr "" +"Este arma tiene actualmente una vaina servida en la cámara. Tiene que ser " +"quitada antes de disparar." #. ~ name of mending method for fault '{'str': 'Spent casing in chamber'}' #: lang/json/fault_from_json.py msgid "Eject spent casing" -msgstr "" +msgstr "Expulsar vaina servida" #. ~ success message for mending method 'Eject spent casing' of fault '{'str': #. 'Spent casing in chamber'}' #: lang/json/fault_from_json.py #, python-format msgid "You eject the spent casing from the %s." -msgstr "" +msgstr "Expulsás la vaina servida del %s." #: lang/json/fault_from_json.py msgid "Unlubricated" -msgstr "" +msgstr "Sin lubricar" #. ~ description for fault '{'str': 'Unlubricated'}' #: lang/json/fault_from_json.py @@ -113838,22 +116746,25 @@ msgid "" " cleaned with a solvent without oiling afterwards. Either way, it's not " "lubricated and will not cycle properly, and can even be damaged." msgstr "" +"O esta arma es nueva y vino sin lubricación o fue limpiada recientemente con" +" un solvente sin aceitarla luego. De cualquier manera, no está lubricada y " +"no funcionará apropiadamente, e incluso puede dañarse." #. ~ name of mending method for fault '{'str': 'Unlubricated'}' #: lang/json/fault_from_json.py msgid "Lubricate" -msgstr "" +msgstr "Lubricar" #. ~ success message for mending method 'Lubricate' of fault '{'str': #. 'Unlubricated'}' #: lang/json/fault_from_json.py #, python-format msgid "You lubricate the %s." -msgstr "" +msgstr "Lubricás el %s." #: lang/json/fault_from_json.py msgid "Fouling" -msgstr "" +msgstr "Suciedad" #. ~ description for fault '{'str': 'Fouling'}' #: lang/json/fault_from_json.py @@ -113865,20 +116776,26 @@ msgid "" "significant problem until high levels of fouling are reached due to firing " "thousands of rounds without cleaning your firearm." msgstr "" +"La suciedad se produce al disparar cargas de pólvora de manera repetida, lo " +"que reduce la fiabilidad y eventualmente puede dañar el arma. La suciedad se" +" acumula lentamente (salvo que se use pólvora) debido al diseño de la " +"pólvora moderna sin humo, usada en la vasta mayoría de los cartuchos y no es" +" un problema significativo salvo a grandes niveles de suciedad que se " +"alcanzan al disparar miles de balas sin limpiar el arma." #. ~ name of mending method for fault '{'str': 'Fouling'}' #: lang/json/fault_from_json.py msgid "Clean gun" -msgstr "" +msgstr "Limpiar arma" #. ~ name of mending method for fault '{'str': 'Fouling'}' #: lang/json/fault_from_json.py msgid "Clean gun and lubricate" -msgstr "" +msgstr "Limpiar arma y lubricar" #: lang/json/fault_from_json.py msgid "Worn drive belt" -msgstr "" +msgstr "Correa de transmisión gastada" #. ~ description for fault '{'str': 'Worn drive belt'}' #: lang/json/fault_from_json.py @@ -113888,18 +116805,18 @@ msgstr "Se necesita para operar un alternador unido." #. ~ name of mending method for fault '{'str': 'Worn drive belt'}' #: lang/json/fault_from_json.py msgid "Replace worn drive belt" -msgstr "" +msgstr "Reemplazar correa de transmisión" #. ~ success message for mending method 'Replace worn drive belt' of fault #. '{'str': 'Worn drive belt'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the worn drive belt of the %s." -msgstr "" +msgstr "Reemplazás la correa de transmisión del %s." #: lang/json/fault_from_json.py msgid "Faulty glow plugs" -msgstr "" +msgstr "Bujías defectuosas" #. ~ description for fault '{'str': 'Faulty glow plugs'}' #: lang/json/fault_from_json.py @@ -113909,18 +116826,18 @@ msgstr "Ayuda a arrancar un motor con bajas temperaturas ambientales." #. ~ name of mending method for fault '{'str': 'Faulty glow plugs'}' #: lang/json/fault_from_json.py msgid "Replace faulty glow plugs" -msgstr "" +msgstr "Reemplazar las bujías defectuosas" #. ~ success message for mending method 'Replace faulty glow plugs' of fault #. '{'str': 'Faulty glow plugs'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the faulty glow plugs of the %s." -msgstr "" +msgstr "Reemplazás las bujías defectuosas del %s." #: lang/json/fault_from_json.py msgid "Active immobiliser" -msgstr "" +msgstr "Activar inmovilizador" #. ~ description for fault '{'str': 'Active immobiliser'}' #: lang/json/fault_from_json.py @@ -113930,7 +116847,7 @@ msgstr "Evita arrancar un vehículo sin la llave apropiada." #. ~ name of mending method for fault '{'str': 'Active immobiliser'}' #: lang/json/fault_from_json.py msgid "Deactivate immobiliser" -msgstr "" +msgstr "Desactivar inmovilizador" #. ~ description for mending method 'Deactivate immobiliser' of fault '{'str': #. 'Active immobiliser'}' @@ -113938,17 +116855,18 @@ msgstr "" msgid "" "Deactivate the immobiliser that is preventing the vehicle from starting." msgstr "" +"Desactivar el inmovilizador que está evitando que el vehículo arranque." #. ~ success message for mending method 'Deactivate immobiliser' of fault #. '{'str': 'Active immobiliser'}' #: lang/json/fault_from_json.py #, python-format msgid "You successfully deactivate the immobiliser of the %s." -msgstr "" +msgstr "Desactivaste exitosamente el inmovilizador del %s." #: lang/json/fault_from_json.py msgid "Faulty diesel pump" -msgstr "" +msgstr "Bomba de gasoil defectuosa" #. ~ description for fault '{'str': 'Faulty diesel pump'}' #: lang/json/fault_from_json.py @@ -113960,18 +116878,18 @@ msgstr "" #. ~ name of mending method for fault '{'str': 'Faulty diesel pump'}' #: lang/json/fault_from_json.py msgid "Replace faulty diesel pump" -msgstr "" +msgstr "Reemplazar bomba de gasoil defectuosa" #. ~ success message for mending method 'Replace faulty diesel pump' of fault #. '{'str': 'Faulty diesel pump'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the faulty diesel pump of the %s" -msgstr "" +msgstr "Reemplazás la bomba de gasoil defectuosa del %s" #: lang/json/fault_from_json.py msgid "Expired air filter" -msgstr "" +msgstr "Filtro de aire vencido" #. ~ description for fault '{'str': 'Expired air filter'}' #: lang/json/fault_from_json.py @@ -113984,18 +116902,18 @@ msgstr "" #. ~ name of mending method for fault '{'str': 'Expired air filter'}' #: lang/json/fault_from_json.py msgid "Replace expired air filter" -msgstr "" +msgstr "Reemplazar filtro de aire vencido" #. ~ success message for mending method 'Replace expired air filter' of fault #. '{'str': 'Expired air filter'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the expired air filter of the %s." -msgstr "" +msgstr "Reemplazás el filtro de aire vencido del %s." #: lang/json/fault_from_json.py msgid "Expired fuel filter" -msgstr "" +msgstr "Filtro de nafta vencido" #. ~ description for fault '{'str': 'Expired fuel filter'}' #: lang/json/fault_from_json.py @@ -114008,18 +116926,18 @@ msgstr "" #. ~ name of mending method for fault '{'str': 'Expired fuel filter'}' #: lang/json/fault_from_json.py msgid "Replace expired fuel filter" -msgstr "" +msgstr "Reemplazar filtro de nafta vencido" #. ~ success message for mending method 'Replace expired fuel filter' of fault #. '{'str': 'Expired fuel filter'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the expired fuel filter of the %s." -msgstr "" +msgstr "Reemplazás el filtro de nafta vencido del %s." #: lang/json/fault_from_json.py msgid "Faulty fuel pump" -msgstr "" +msgstr "Bomba de nafta defectuosa" #. ~ description for fault '{'str': 'Faulty fuel pump'}' #: lang/json/fault_from_json.py @@ -114029,18 +116947,18 @@ msgstr "Se necesita para bombear nafta desde el tanque del vehículo." #. ~ name of mending method for fault '{'str': 'Faulty fuel pump'}' #: lang/json/fault_from_json.py msgid "Replace faulty fuel pump" -msgstr "" +msgstr "Reemplazar bomba de nafta defectuosa" #. ~ success message for mending method 'Replace faulty fuel pump' of fault #. '{'str': 'Faulty fuel pump'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the faulty fuel pump of the %s." -msgstr "" +msgstr "Reemplazás la bomba de nafta defectuosa del %s." #: lang/json/fault_from_json.py msgid "Faulty water pump" -msgstr "" +msgstr "Bomba de agua defectuosa" #. ~ description for fault '{'str': 'Faulty water pump'}' #: lang/json/fault_from_json.py @@ -114050,18 +116968,18 @@ msgstr "Se necesita para bombear agua hacia un radiador externo o disipador." #. ~ name of mending method for fault '{'str': 'Faulty water pump'}' #: lang/json/fault_from_json.py msgid "Replace faulty water pump" -msgstr "" +msgstr "Reemplazar bomba de agua defectuosa" #. ~ success message for mending method 'Replace faulty water pump' of fault #. '{'str': 'Faulty water pump'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the faulty water pump of the %s." -msgstr "" +msgstr "Reemplazás la bomba de agua defectuosa del %s." #: lang/json/fault_from_json.py msgid "Faulty starter motor" -msgstr "" +msgstr "Burro de arranque defectuoso" #. ~ description for fault '{'str': 'Faulty starter motor'}' #: lang/json/fault_from_json.py @@ -114071,14 +116989,14 @@ msgstr "Se necesita para iniciar el motor." #. ~ name of mending method for fault '{'str': 'Faulty starter motor'}' #: lang/json/fault_from_json.py msgid "Replace faulty starter motor" -msgstr "" +msgstr "Reemplazar burro de arranque defectuoso" #. ~ success message for mending method 'Replace faulty starter motor' of #. fault '{'str': 'Faulty starter motor'}' #: lang/json/fault_from_json.py #, python-format msgid "You replace the faulty starter motor of %s." -msgstr "" +msgstr "Reemplazás el burro de arranque defectuoso del %s." #: lang/json/field_type_from_json.py lang/json/overmap_terrain_from_json.py #: lang/json/overmap_terrain_from_json.py src/mapdata.cpp src/mapdata.cpp @@ -114207,6 +117125,18 @@ msgstr "fuego" msgid "raging fire" msgstr "fuego intenso" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "neblina de extintor" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "nube de extintor" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "nube espesa de extintor" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "escombro antiguo" @@ -114253,23 +117183,23 @@ msgstr "gas radiactivo denso" #: lang/json/field_type_from_json.py msgid "gas vent" -msgstr "conducto de gas" +msgstr "ventilación de gas" #: lang/json/field_type_from_json.py msgid "angular ripple" -msgstr "" +msgstr "ola angular" #: lang/json/field_type_from_json.py msgid "angular rift" -msgstr "" +msgstr "grieta angular" #: lang/json/field_type_from_json.py msgid "fractal fissure" -msgstr "" +msgstr "fisura fractal" #: lang/json/field_type_from_json.py msgid "fire vent" -msgstr "" +msgstr "ventilación de fuego" #: lang/json/field_type_from_json.py msgid "sparks" @@ -114297,15 +117227,15 @@ msgstr "tajo en la realidad" #: lang/json/field_type_from_json.py msgid "push items" -msgstr "" +msgstr "empujar objetos" #: lang/json/field_type_from_json.py msgid "shock vent" -msgstr "" +msgstr "ventilación eléctrica" #: lang/json/field_type_from_json.py msgid "acid vent" -msgstr "" +msgstr "ventilación ácida" #: lang/json/field_type_from_json.py msgid "faint plasma" @@ -114445,19 +117375,19 @@ msgstr "humo de metanfetaminas" #: lang/json/field_type_from_json.py msgid "thick meth smoke" -msgstr "" +msgstr "humo denso de metanfetaminas" #: lang/json/field_type_from_json.py msgid "swirl of fog" -msgstr "" +msgstr "espiral de niebla" #: lang/json/field_type_from_json.py msgid "foul fog" -msgstr "" +msgstr "niebla nauseabunda" #: lang/json/field_type_from_json.py msgid "thick foul fog" -msgstr "" +msgstr "niebla espesa nauseabunda" #: lang/json/field_type_from_json.py msgid "some bees" @@ -114485,19 +117415,19 @@ msgstr "gas relajante" #: lang/json/field_type_from_json.py lang/json/furniture_from_json.py msgid "swamp gas" -msgstr "" +msgstr "gas de pantano" #: lang/json/field_type_from_json.py msgid "mist" -msgstr "" +msgstr "neblina" #: lang/json/field_type_from_json.py lang/json/furniture_from_json.py msgid "fog" -msgstr "" +msgstr "niebla" #: lang/json/field_type_from_json.py msgid "dense fog" -msgstr "" +msgstr "niebla densa" #: lang/json/field_type_from_json.py msgid "fungal haze" @@ -114509,67 +117439,67 @@ msgstr "neblina densa fúngica" #: lang/json/field_type_from_json.py msgid "cold air 1" -msgstr "" +msgstr "aire frío 1" #: lang/json/field_type_from_json.py msgid "cold air 2" -msgstr "" +msgstr "aire frío 2" #: lang/json/field_type_from_json.py msgid "cold air 3" -msgstr "" +msgstr "aire frío 3" #: lang/json/field_type_from_json.py msgid "cold air 4" -msgstr "" +msgstr "aire frío 4" #: lang/json/field_type_from_json.py msgid "hot air 1" -msgstr "" +msgstr "aire caliente 1" #: lang/json/field_type_from_json.py msgid "hot air 2" -msgstr "" +msgstr "aire caliente 2" #: lang/json/field_type_from_json.py msgid "hot air 3" -msgstr "" +msgstr "aire caliente 3" #: lang/json/field_type_from_json.py msgid "hot air 4" -msgstr "" +msgstr "aire caliente 4" #: lang/json/field_type_from_json.py msgid "hot air sauna" -msgstr "" +msgstr "aire caliente de sauna" #: lang/json/field_type_from_json.py msgid "foul-smelling air" -msgstr "" +msgstr "aire con olor nauseabundo" #: lang/json/field_type_from_json.py msgid "fungicidal mist" -msgstr "" +msgstr "neblina fungicida" #: lang/json/field_type_from_json.py msgid "fungicidal haze" -msgstr "" +msgstr "bruma fungicida" #: lang/json/field_type_from_json.py msgid "thick fungicidal haze" -msgstr "" +msgstr "bruma espesa fungicida" #: lang/json/field_type_from_json.py msgid "insecticidal mist" -msgstr "" +msgstr "neblina insecticida" #: lang/json/field_type_from_json.py msgid "insecticidal haze" -msgstr "" +msgstr "bruma insecticida" #: lang/json/field_type_from_json.py msgid "thick insecticidal haze" -msgstr "" +msgstr "bruma espesa insecticida" #: lang/json/field_type_from_json.py msgid "smoke vent" @@ -114577,31 +117507,31 @@ msgstr "salida de humo" #: lang/json/field_type_from_json.py msgid "clairvoyance" -msgstr "" +msgstr "clarividencia" #: lang/json/field_type_from_json.py msgid "dreadful presense" -msgstr "" +msgstr "presencia espantosa" #: lang/json/field_type_from_json.py msgid "frightful presense" -msgstr "" +msgstr "presencia aterradora" #: lang/json/field_type_from_json.py msgid "terrifying presense" -msgstr "" +msgstr "presencia terrorífica" #: lang/json/field_type_from_json.py msgid "flimsy gum webs" -msgstr "" +msgstr "red endeble de goma" #: lang/json/field_type_from_json.py msgid " gum webs" -msgstr "" +msgstr "red de goma" #: lang/json/field_type_from_json.py msgid "thick gum webs" -msgstr "" +msgstr "red dura de goma" #: lang/json/furniture_from_json.py msgid "mutated cactus" @@ -114609,7 +117539,7 @@ msgstr "cactus mutado" #: lang/json/furniture_from_json.py msgid "cooling unit" -msgstr "" +msgstr "aire acondicionado" #. ~ Description for cooling unit #: lang/json/furniture_from_json.py @@ -114617,6 +117547,8 @@ msgid "" "A large, blocky appliance encased in sheet metal. This commonplace fixture " "is used for cooling large indoor areas." msgstr "" +"Es un electrodoméstico grande y cuadrado cubierto por una caja de metal. " +"Este mueble amurado es usado para refrescar grandes áreas internas." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -114629,7 +117561,7 @@ msgstr "¡clang!" #: lang/json/furniture_from_json.py msgid "central air filter" -msgstr "" +msgstr "filtro de aire central" #. ~ Description for central air filter #: lang/json/furniture_from_json.py @@ -114637,6 +117569,8 @@ msgid "" "A large synthetic membrane used to filter out dust, smoke, mites, and other " "contaminants from air that passes through it." msgstr "" +"Es una membrana grande sintética que filtra polvo, humo, ácaros y otros " +"contaminantes del aire al pasar." #. ~ Description for dishwasher #: lang/json/furniture_from_json.py @@ -114645,6 +117579,9 @@ msgid "" "batches of dishes. Now that it's sat powerless for a while, a putrid scent " "of rot is leaking from inside." msgstr "" +"Es una máquina grande y cuadrada que utiliza agua caliente y jabón para " +"lavar de manera eficiente, varios platos a la vez. Ahora que está ahí sin " +"alimentación eléctrica, un pútrido aroma a podrido le sale del interior." #: lang/json/furniture_from_json.py msgid "dryer" @@ -114656,6 +117593,8 @@ msgid "" "A common household appliance used to quickly dry large batches of clothing " "after they have been washed." msgstr "" +"Es un electrodoméstico de uso común, que sirve para secar grandes cantidades" +" de ropa luego de que han sido lavadas." #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "refrigerator" @@ -114667,6 +117606,8 @@ msgid "" "A tall metal storage container that, if powered, will freeze food and other " "perishables for preservation." msgstr "" +"Es un recipiente alto de metal que, si tiene alimentación eléctrica, " +"congelará la comida y otros elementos perecederos." #: lang/json/furniture_from_json.py msgid "glass door fridge" @@ -114680,6 +117621,10 @@ msgid "" " letting out the cold air, which used to be a minor convenience, and now " "saves precious minutes until spoilage." msgstr "" +"Es una heladera moderna con una gruesa lámina de vidrio en la puerta, " +"tratado especialmente para ser más aislante. Permite ver su contenido sin " +"dejar que se escape el aire frío, que era un inconveniente, y ahorra " +"valiosos minutos de refrigeración." #: lang/json/furniture_from_json.py msgid "furnace" @@ -114691,6 +117636,9 @@ msgid "" "A gas-powered forced-air central heating unit, with an internal fan to push " "the air through a building's ventilation system to keep it warm." msgstr "" +"Es una unidad central de calentamiento alimentada por gas, con un ventilador" +" interior que empuja el aire a través del sistema de ventilación del " +"edificio, manteniéndolo caliente." #. ~ Description for washing machine #: lang/json/furniture_from_json.py @@ -114698,6 +117646,8 @@ msgid "" "A large, chunky machine that uses soap and large amounts of water to wash " "batches of clothes with minimal effort." msgstr "" +"Es una máquina robusta que utiliza jabón y grandes cantidades de agua para " +"lavar grupos de ropa con el mínimo esfuerzo." #: lang/json/furniture_from_json.py msgid "oven" @@ -114709,10 +117659,13 @@ msgid "" "A standard convection-based oven, commonly used for heating and cooking " "food. Despite it no longer working, you could safely light a fire inside." msgstr "" +"Es un horno estándar por convección usado comúnmente para calentar y cocinar" +" comida. A pesar de que ya no funciona, podrías encender un fuego en su " +"interior de manera segura." #: lang/json/furniture_from_json.py msgid "blacksmith bellows" -msgstr "" +msgstr "fuelles de herrero" #. ~ Description for blacksmith bellows #: lang/json/furniture_from_json.py @@ -114721,10 +117674,13 @@ msgid "" "fire and maintain a high temperature. Useless in its current state, but " "good for parts." msgstr "" +"Es un antiguo dispositivo para empujar aire hacia la forja de un herrero, " +"para fortalecer el fuego y mantenerlo a altas temperaturas. En este estado " +"es totalmente inútil, pero se le pueden sacar algunas partes." #: lang/json/furniture_from_json.py msgid "blacksmith drop hammer" -msgstr "" +msgstr "martillón pilón de herrero" #. ~ Description for blacksmith drop hammer #: lang/json/furniture_from_json.py @@ -114733,10 +117689,14 @@ msgid "" " If it were working, it would be useful for shaping softened metal plates, " "though now it is only useful for parts." msgstr "" +"Es un yunque con un gran martillo de metal suspendido encima en una " +"estructura metálica. Si estuviera funcionando, podría ser usado para darle " +"forma a placas metálicas blandas, aunque ahora es solamente útil por sus " +"partes." #: lang/json/furniture_from_json.py msgid "document shredder" -msgstr "" +msgstr "trituradora de papel" #. ~ Description for document shredder #: lang/json/furniture_from_json.py @@ -114746,10 +117706,14 @@ msgid "" "parts, as identity theft and corporate espionage probably aren't big " "concerns anymore." msgstr "" +"Es un simple dispositivo electrónico montado sobre una cesto grande. Está " +"diseñado para destrozar documentos de papel con información importante de " +"manera eficiente. Se le pueden sacar las partes, ya que el robo de identidad" +" y el espionaje corporativo probablemente ya no sean tan importantes." #: lang/json/furniture_from_json.py msgid "server stack" -msgstr "" +msgstr "servidor" #. ~ Description for server stack #: lang/json/furniture_from_json.py @@ -114758,10 +117722,14 @@ msgid "" "information. Powerless and largely useless for its intended purpose, the " "laptops mounted inside can still be used if removed." msgstr "" +"Es un estante grande para computadoras que se usan para almacenar y " +"transmitir información. Sin alimentación eléctrica y así de inútil para su " +"propósito inicial, las notebooks que tiene adentro pueden ser útiles si se " +"sacan." #: lang/json/furniture_from_json.py msgid "large satellite dish" -msgstr "" +msgstr "antena satelital grande" #. ~ Description for large satellite dish #: lang/json/furniture_from_json.py @@ -114771,10 +117739,14 @@ msgid "" "planet will likely continue to function indefinately, their various purposes" " have all been lost." msgstr "" +"Es un panel metálico grande y cóncavo con electrónicos simples usado para " +"recibir señales de los satélites. Aunque las miles de máquinas caras " +"orbitando el planeta deben continuar con su función indefinidamente, sus " +"variados propósitos se han perdido para siempre." #: lang/json/furniture_from_json.py msgid "mounted solar panel" -msgstr "" +msgstr "panel solar montado" #. ~ Description for mounted solar panel #: lang/json/furniture_from_json.py @@ -114783,6 +117755,10 @@ msgid "" "useable electricity. While useful before the cataclysm, they have become " "priceless tools, invaluable to any survivor." msgstr "" +"Es un conjunto de generadores fotovoltaicos que convierten la radiación " +"solar en electricidad utilizable. Aunque ya eran útiles antes del " +"Cataclismo, ahora se han convertido en herramientas invalorables para " +"cualquier sobreviviente." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -114800,6 +117776,10 @@ msgid "" "with reflective tape to increase visibility. Despite the name, it does " "little to stop a moving car." msgstr "" +"Es un gran obstáculo de madera que se usa para bloquear el tránsito de una " +"calle. Está bordeado con cinta adhesiva reflectante para incrementar su " +"visibilidad. A pesar de su nombre, no logra mucho para detener a un vehículo" +" en movimiento." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp @@ -114813,7 +117793,7 @@ msgstr "whump." #: lang/json/furniture_from_json.py msgid "earthbag barricade" -msgstr "" +msgstr "barricada de bolsas de tierra" #. ~ Description for earthbag barricade #: lang/json/furniture_from_json.py @@ -114821,6 +117801,8 @@ msgid "" "A low wall made of stacked earthbags, commonly used to catch bullets and " "block flooding." msgstr "" +"Es una pared petisa hecha de bolsas de tierra apiladas, comúnmente utilizada" +" para frenar balas e inundaciones." #: lang/json/furniture_from_json.py msgid "rrrip!" @@ -114828,21 +117810,25 @@ msgstr "¡rrrip!" #: lang/json/furniture_from_json.py msgid "earthbag wall" -msgstr "" +msgstr "pared de bolsas de tierra" #. ~ Description for earthbag wall #: lang/json/furniture_from_json.py msgid "A wall of stacked earthbags, a bit taller than an average adult." msgstr "" +"Es una pared de bolsas de tierra apiladas, un poquito más alta que un adulto" +" normal." #: lang/json/furniture_from_json.py msgid "lane guard" -msgstr "guardarraíl" +msgstr "separador vial" #. ~ Description for lane guard #: lang/json/furniture_from_json.py msgid "A simple wooden post to mark the separation between street lanes." msgstr "" +"Es un simple poste de madera que marca la separación entre los carriles de " +"la calle." #: lang/json/furniture_from_json.py msgid "sandbag barricade" @@ -114854,6 +117840,8 @@ msgid "" "A low wall made of canvas sacks filled with sand, commonly used to catch " "bullets and prevent flooding." msgstr "" +"Es una pared petisa hecha de bolsas de tela llenas de arena, comúnmente " +"utilizada para frenar balas y prevenir inundaciones." #: lang/json/furniture_from_json.py msgid "sandbag wall" @@ -114863,6 +117851,8 @@ msgstr "pared de bolsas de arena" #: lang/json/furniture_from_json.py msgid "A wall of stacked sandbags, a bit taller than an average adult." msgstr "" +"Es una pared de bolsas de arena apiladas, un poquito más alta que un adulto " +"normal." #: lang/json/furniture_from_json.py msgid "standing mirror" @@ -114874,6 +117864,9 @@ msgid "" "A full-length mirror mounted in a sleek metal frame. You can easily see all" " of the dirt and blood on your clothes, and the weariness in your eyes." msgstr "" +"Es un espejo de cuerpo entero montado en un elegante marco metálico. Podés " +"fácilmente ver toda la tierra y sangre de tu ropa, y el cansancio en tus " +"ojos." #: lang/json/furniture_from_json.py msgid "glass breaking" @@ -114890,10 +117883,13 @@ msgid "" "What remains in the frame are large dangerous-looking shards of fractured " "glass." msgstr "" +"Es un marco metálico con un espejo de cuerpo entero montado, aunque la mayor" +" parte del espejo no está. Lo que queda en el marco son grandes pedazos " +"peligrosos de vidrio roto." #: lang/json/furniture_from_json.py msgid "bitts" -msgstr "" +msgstr "norayes dobles" #. ~ Description for bitts #: lang/json/furniture_from_json.py @@ -114901,6 +117897,8 @@ msgid "" "A pair of vertical iron posts mounted on a wharf, pier, or other form of " "dock. They are used to secure mooring lines, ropes, and similar." msgstr "" +"Es un par de postes de hierro montados en un muelle, embarcadero y otra " +"forma de dársena. Son usados para anclar las líneas, sogas o similares." #: lang/json/furniture_from_json.py msgid "manacles" @@ -114910,6 +117908,8 @@ msgstr "esposas" #: lang/json/furniture_from_json.py msgid "A pair of metal shackles with heavy chains mounted to a wall or floor." msgstr "" +"Es un par de grilletes metálicos con cadenas pesadas montadas a una pared o " +"al suelo." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py @@ -114926,6 +117926,8 @@ msgid "" "A massive block of stone that has been carefully carved into a work of " "timeless art." msgstr "" +"Es un enorme pedazo de piedra que ha sido tallada cuidadosamente en una " +"forma de arte atemporal." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "thump." @@ -114942,10 +117944,13 @@ msgid "" "clothing in stores, or for tailors to design outfits on. Considering all " "that's happened, something about it is somewhat unnerving." msgstr "" +"Es una figura en madera de una persona en tamaño real, más comúnmente usada " +"para mostrara ropa en los comercios, o para que los sastres diseñen prendas." +" Considerando todo lo que pasó, algo acerca de esto es perturbador." #: lang/json/furniture_from_json.py msgid "birdbath" -msgstr "" +msgstr "bebedero para aves" #. ~ Description for birdbath #: lang/json/furniture_from_json.py @@ -114953,10 +117958,12 @@ msgid "" "A wide stone bowl mounted to a pedestal, usually filled with rainwater, " "meant for birds to play or bathe in." msgstr "" +"Es un recipiente ancho de piedra montado en un pedestal, usualmente lleno de" +" agua de lluvia, pensado para que los pájaros jueguen o se bañen." #: lang/json/furniture_from_json.py msgid "rotary clothes dryer line" -msgstr "" +msgstr "tender giratorio" #. ~ Description for rotary clothes dryer line #: lang/json/furniture_from_json.py @@ -114964,10 +117971,12 @@ msgid "" "A central metal pole holding up a wide rotating frame, this would be used to" " hang up clothes to dry in the sunlight." msgstr "" +"Es una vara metálica central que sostiene una estructura ancha que gira. Es " +"utilizada para colgar la ropa y que se seque al sol." #: lang/json/furniture_from_json.py msgid "floor lamp" -msgstr "" +msgstr "lámpara de pie" #. ~ Description for floor lamp #: lang/json/furniture_from_json.py @@ -114975,23 +117984,25 @@ msgid "" "A light mounted on the top of a metal pole, this would be plugged into a " "wall socket to illuminate a room." msgstr "" +"Es una luz montada en la punta de una vara metálica. Va enchufada y puede " +"iluminar una habitación." #: lang/json/furniture_from_json.py msgid "bonk!" -msgstr "" +msgstr "bonk!" #: lang/json/furniture_from_json.py msgid "pine wreath" -msgstr "" +msgstr "corona de pino" #. ~ Description for pine wreath #: lang/json/furniture_from_json.py msgid "A decorative wreath for the winter holidays." -msgstr "" +msgstr "Es una corona decorativa para las festividades invernales." #: lang/json/furniture_from_json.py msgid "sand castle" -msgstr "" +msgstr "castillo de arena" #. ~ Description for sand castle #: lang/json/furniture_from_json.py @@ -114999,6 +118010,9 @@ msgid "" "A glorious castle made of sand. This mighty fortress will stand tall for " "the ages to come, a true testimony of the skills of its builder." msgstr "" +"Es un glorioso castillo hecho de arena. Esta poderosa fortaleza se mantendrá" +" erguida por años, un verdadero testimonio de la habilidad de su " +"constructor." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "crunch." @@ -115006,13 +118020,13 @@ msgstr "crunch." #: lang/json/furniture_from_json.py msgid "decorative tree" -msgstr "" +msgstr "árbol decorativo" #. ~ Description for decorative tree #: lang/json/furniture_from_json.py msgid "" "A decorative pine tree littered with ornaments for the winter holidays." -msgstr "" +msgstr "Es un pino decorativo cubierto de adornos de festividades invernales." #: lang/json/furniture_from_json.py msgid "indoor plant" @@ -115024,6 +118038,8 @@ msgid "" "A small potted plant, used for decoration indoors. It appears to have dried" " up and died a while ago." msgstr "" +"Es una pequeña maceta con una planta, usada como decoración de interiores. " +"Parece haberse secado y muerto hace rato." #: lang/json/furniture_from_json.py msgid "yellow indoor plant" @@ -115035,6 +118051,8 @@ msgid "" "A decorative potted plant with a yellow flower, it looks to have wilted and " "died some time ago." msgstr "" +"Es una maceta decorativa con una planta con una flor amarilla, parece " +"haberse marchitado y muerto hace algún tiempo." #: lang/json/furniture_from_json.py msgid "harvestable plant" @@ -115046,6 +118064,8 @@ msgid "" "This plant is fully grown and ready to be harvested. Identifying how to " "harvest it requires closer examination." msgstr "" +"Esta planta está totalmente crecida y lista para cosechar. Identificar cómo " +"se debe cosechar, requiere un examen más cercano." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -115059,7 +118079,7 @@ msgstr "planta madura" #. ~ Description for mature plant #: lang/json/furniture_from_json.py msgid "This plant has matured, and will be ready to harvest before long." -msgstr "" +msgstr "Está planta está madura y lista para cosechar en breve." #: lang/json/furniture_from_json.py msgid "seed" @@ -115071,6 +118091,8 @@ msgid "" "A freshly planted seed. If properly tended to, it could grow into a healthy" " plant." msgstr "" +"Es un semilla recién plantada. Si se la atiende de manera apropiada, podría " +"crecer y convertirse en una saludable planta." #: lang/json/furniture_from_json.py msgid "seedling" @@ -115079,7 +118101,7 @@ msgstr "brote" #. ~ Description for seedling #: lang/json/furniture_from_json.py msgid "A seed that has just begun to sprout its first roots." -msgstr "" +msgstr "Es una semilla que ha comenzado a brotar sus primeras raíces." #: lang/json/furniture_from_json.py msgid "planter" @@ -115091,10 +118113,12 @@ msgid "" "A garden planter full of soil and slatted to allow adequate drainage. Can " "be used for planting crops." msgstr "" +"Es un cantero lleno de tierra y preparada con un sistema de drenaje " +"adecuado. Puede usarse para cultivar plantas." #: lang/json/furniture_from_json.py msgid "planter with harvestable plant" -msgstr "" +msgstr "maceta con planta cosechable" #. ~ Description for planter with harvestable plant #: lang/json/furniture_from_json.py @@ -115102,10 +118126,13 @@ msgid "" "A garden planter full of soil and slatted to allow adequate drainage. This " "one has a fully grown plant, and will need closer examination to harvest." msgstr "" +"Es un cantero lleno de tierra y preparada con un sistema de drenaje " +"adecuado. Este tiene una planta completamente madura y con un examen más " +"cercano podrías ver cómo cosecharla." #: lang/json/furniture_from_json.py msgid "planter with mature plant" -msgstr "" +msgstr "maceta con planta madura" #. ~ Description for planter with mature plant #: lang/json/furniture_from_json.py @@ -115113,10 +118140,13 @@ msgid "" "A garden planter full of soil and slatted to allow adequate drainage. This " "one has a matured plant that should be ready for harvest before long." msgstr "" +"Es un cantero lleno de tierra y preparada con un sistema de drenaje " +"adecuado. Este tiene una planta completamente madura que debería estar " +"preparada para cosechar en breve." #: lang/json/furniture_from_json.py msgid "planter with seed" -msgstr "" +msgstr "maceta con semilla" #. ~ Description for planter with seed #: lang/json/furniture_from_json.py @@ -115124,10 +118154,13 @@ msgid "" "A garden planter full of soil and slatted to allow adequate drainage. This " "one contains a planted seed, and will need attention to grow fully." msgstr "" +"Es un cantero lleno de tierra y preparada con un sistema de drenaje " +"adecuado. Este tiene una semilla plantada y necesitará de tu atención para " +"crecer completamente." #: lang/json/furniture_from_json.py msgid "planter with seedling" -msgstr "" +msgstr "maceta con plantín" #. ~ Description for planter with seedling #: lang/json/furniture_from_json.py @@ -115135,6 +118168,9 @@ msgid "" "A garden planter full of soil and slatted to allow adequate drainage. This " "one has a seed that has just begun to sprout its first roots." msgstr "" +"Es un cantero lleno de tierra y preparada con un sistema de drenaje " +"adecuado. Este tiene una semilla que ya ha comenzado a brotar sus primeras " +"raíces." #: lang/json/furniture_from_json.py msgid "spider egg sack" @@ -115146,6 +118182,8 @@ msgid "" "A sizable, off-white sac of large eggs. Upon watching closer, you can see " "them moving slightly. Gross." msgstr "" +"Es un saco de huevos grandes blanquecinos. Al examinarlos podés ver cómo se " +"mueven levemente. Un asco." #: lang/json/furniture_from_json.py msgid "splat!" @@ -115157,6 +118195,8 @@ msgid "" "A bulbous mass of off-white spider eggs. Upon watching closer, you can see " "them moving a bit. Really gross." msgstr "" +"Es una protuberante masa de huevos blanquecinos de araña. Al examinarlos " +"podés ver como se están moviendo un poco. Un verdadero asco." #. ~ Description for spider egg sack #: lang/json/furniture_from_json.py @@ -115165,6 +118205,9 @@ msgid "" "definitely moving around. Really gross, just seeing it makes your skin " "crawl." msgstr "" +"Es un gigantesco saco de huevos de araña, cada uno más grande que tu mano. " +"Definitivamente, se están moviendo. Un verdadero asco, de solo mirarlos ya " +"te da escolfríos." #: lang/json/furniture_from_json.py msgid "ruptured egg sack" @@ -115176,6 +118219,9 @@ msgid "" "A disgusting ruptured sac of giant spider eggs. The thought of all those " "massive baby spiders pouring out of it is almost terrifying on its own." msgstr "" +"Es un desagradable saco roto de huevos de araña gigante. El pensamiento de " +"todos esos bebés enormes de araña saliendo de ahí es casi tan terrorífico " +"como ellas mismas." #. ~ Description for swamp gas #: lang/json/furniture_from_json.py @@ -115183,6 +118229,8 @@ msgid "" "This is a pool of murky water, it occasionally bubbles, releasing a mildly " "toxic gas." msgstr "" +"Es un charco de agua sucia que ocasionalmente burbujea, liberando un gas " +"moderadamente tóxico." #: lang/json/furniture_from_json.py src/ballistics.cpp src/map.cpp msgid "splash!" @@ -115191,20 +118239,22 @@ msgstr "splash!" #. ~ Description for fog #: lang/json/furniture_from_json.py msgid "This is a misty cloud of fog." -msgstr "" +msgstr "Es una nube de niebla." #: lang/json/furniture_from_json.py msgid "fake workbench hands" -msgstr "" +msgstr "manos de mesa de trabajo falsa" #. ~ Description for fake workbench hands #: lang/json/furniture_from_json.py msgid "This fake workbench holds the stats for working on a wielded item." msgstr "" +"Esta mesa de trabajo falsa tiene las características para trabajar sobre un " +"objeto empuñado." #: lang/json/furniture_from_json.py msgid "ground crafting spot" -msgstr "" +msgstr "lugar de fabricación en el piso" #. ~ Description for ground crafting spot #: lang/json/furniture_from_json.py @@ -115212,11 +118262,14 @@ msgid "" "A cleared spot on the ground for crafting. Slower than using a workbench or" " holding a project in your hands, but readily available." msgstr "" +"Es un espacio limpio en el piso para fabricar. Es más lento que hacerlo en " +"una mesa de trabajo o que tener el proyecto en tus manos, pero " +"inmediatamente disponible." #. ~ Description for seeing this is a bug #: lang/json/furniture_from_json.py msgid "Seeing this is a bug. If seen, please report and destroy." -msgstr "" +msgstr "Ver esto es un bug. Si te pasó, reportalo y destruilo." #: lang/json/furniture_from_json.py msgid "fireplace" @@ -115228,10 +118281,12 @@ msgid "" "A common fixture for safely hosting a fire indoors, with a chimney to vent " "the smoke to the outside. Dangerous to leave unattended while lit." msgstr "" +"Es un mueble empotrado común, usado para encender fuegos en interiores de " +"manera segura, con una chimenea para ventilar el humo. Igual, es peligroso " +"dejar un fuego sin atender." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "¡crash!" @@ -115250,11 +118305,15 @@ msgid "" "A simple metal stove for hosting wood-fueled fires. Good for cooking or " "heating food, and safe to have indoors." msgstr "" +"Es una simple cocina de metal para contener fuegos prendidos con madera. " +"Buena para cocinar o calentar comida, y segura para usar en interiores." #. ~ Description for brazier #: lang/json/furniture_from_json.py msgid "A raised metal dish in which to safely burn things." msgstr "" +"Es un disco de metal levantado en el cual se pueden quemar cosas de manera " +"segura." #. ~ Description for fire barrel (200L) #: lang/json/furniture_from_json.py @@ -115262,6 +118321,9 @@ msgid "" "A huge metal barrel used to safely contain a fire. It has multiple holes " "punched in the walls for air supply." msgstr "" +"Es un tambor enorme de metal que puede ser usado para contener un fuego de " +"manera segura. Tiene varios agujeros hechos en los costados para que ingrese" +" el aire." #. ~ Description for fire barrel (100L) #: lang/json/furniture_from_json.py @@ -115269,6 +118331,9 @@ msgid "" "A large metal barrel used to safely contain a fire. It has multiple holes " "punched in the walls for air supply." msgstr "" +"Es un tambor grande de metal que puede ser usado para contener un fuego de " +"manera segura. Tiene varios agujeros hechos en los costados para que ingrese" +" el aire." #: lang/json/furniture_from_json.py msgid "fire ring" @@ -115278,6 +118343,8 @@ msgstr "anillo de fuego" #: lang/json/furniture_from_json.py msgid "A ring of stones to safely contain a fire." msgstr "" +"Es un anillo de piedras en el cual se puede encender un fuego de manera " +"segura." #: lang/json/furniture_from_json.py msgid "mutated poppy flower" @@ -115292,6 +118359,11 @@ msgid "" "writhe beneath the soil, and it's surrounded by an overwhelming floral smell" " that makes you feel sleepy." msgstr "" +"Estas extrañas flores han aparecido en los inicios del Cataclismo, y sus " +"capullos pueden usarse con fines medicinales, como las semillas de la " +"amapola común de la cual recibe el nombre. La tierra a su alrededor se agita" +" levemente mientras sus raíces se retuercen debajo, y está rodeada de un " +"aroma floral abrumador que te hace sentir somnoliento." #. ~ Description for dandelion #: lang/json/furniture_from_json.py @@ -115299,6 +118371,8 @@ msgid "" "A common weed with a yellow flower. Produces seeds that get carried on the " "wind by thin, gray filaments." msgstr "" +"Es un yuyo común con flor amarilla. Produce semillas que son llevadas por el" +" viento por los llamativos panaderos." #. ~ Description for burdock #: lang/json/furniture_from_json.py @@ -115306,16 +118380,19 @@ msgid "" "A common weed with a purple thistle-like flower. Its seeds tend to stick to" " clothing and fur." msgstr "" +"Es un yuyo común con flor púrpura similar al cardo. Sus semillas tienden a " +"pegarse a la ropa y al pelo." #. ~ Description for chamomile #: lang/json/furniture_from_json.py msgid "Ahh, soothing chamomile tea." -msgstr "" +msgstr "Ahh, reconfortante té de manzanliia." #. ~ Description for tulip #: lang/json/furniture_from_json.py msgid "A bright, colorful flower with petals forming a small cup at its top." msgstr "" +"Es un flor colorida y brillante con sus pétalos formando una pequeña copa." #: lang/json/furniture_from_json.py msgid "spurge flower" @@ -115324,7 +118401,7 @@ msgstr "flor de euforbio" #. ~ Description for spurge flower #: lang/json/furniture_from_json.py msgid "A yellow-green flower that grows in densely packed bushes." -msgstr "" +msgstr "Es un flor amarilla y verde que crece densamente en los arbustos." #: lang/json/furniture_from_json.py msgid "cattails" @@ -115336,6 +118413,8 @@ msgid "" "This useful plant is available all year round. Many parts of the plant are " "edible." msgstr "" +"Esta útil planta está disponible durante todo el año. Muchas partes de esta " +"planta son comestibles." #. ~ Description for black eyed susan #: lang/json/furniture_from_json.py @@ -115343,11 +118422,13 @@ msgid "" "A yellow flower that has a dark ball in the middle. Sometimes known as an " "ox-eye daisy." msgstr "" +"Es una flor amarilla que tiene una pelotita oscura en el medio. A veces es " +"conocida como crisantemo." #. ~ Description for lily #: lang/json/furniture_from_json.py msgid "A pretty flower that comes in a variety of colors." -msgstr "" +msgstr "Es una linda flor que aparece en varios colores." #. ~ Description for sunflower #: lang/json/furniture_from_json.py @@ -115355,6 +118436,8 @@ msgid "" "A tall, wide-headed flower with a large dark center. Produces many " "nutritious seeds." msgstr "" +"Es una flor alta de cabeza ancha con una centro grande y oscuro. Produce " +"muchas semillas nutritivas." #: lang/json/furniture_from_json.py msgid "lilypad" @@ -115366,30 +118449,33 @@ msgid "" "These lilypads don't look they'd support the weight of the things you've " "heard croaking in the swamp." msgstr "" +"Estos nenúfares no parece que vayan a poder soportar el peso de las cosas " +"que escuchaste croando en el pantano." #. ~ Description for bluebell #: lang/json/furniture_from_json.py msgid "A common bluebell flower. Pretty." -msgstr "" +msgstr "Es un jacinto común. Lindo." #. ~ Description for dahlia #: lang/json/furniture_from_json.py msgid "A puffy flower with many tightly layered petals." -msgstr "" +msgstr "Es una flor hinchada con muchas capas de pétalos apretados." #. ~ Description for chicory #: lang/json/furniture_from_json.py msgid "A blue flower imported from Europe, also known as a Cornflower." msgstr "" +"Es una flor azul importada de Europa, también conocida como radicheta." #. ~ Description for datura #: lang/json/furniture_from_json.py msgid "A pretty moonflower." -msgstr "" +msgstr "Es una linda flor de luna." #: lang/json/furniture_from_json.py msgid "pile of leaves" -msgstr "" +msgstr "pila de hojas" #. ~ Description for pile of leaves #: lang/json/furniture_from_json.py @@ -115397,9 +118483,11 @@ msgid "" "A sizable pile of leaves. You could sleep on it if you don't care about " "comfort or warmth." msgstr "" +"Es una gran pila de hojas. Podrías dormir ahí encima si no te preocupa el " +"confort o el frío." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "¡crunch!" @@ -115409,6 +118497,8 @@ msgid "" "Yellow flower known as Brassica Nigra. Known for its seeds that can be used" " for making table mustard." msgstr "" +"Es una flor amarilla conocida como Brassica Nigra. Es reconocida por sus " +"semillas que pueden usarse para hacer mostaza de mesa." #: lang/json/furniture_from_json.py msgid "marloss flower" @@ -115421,6 +118511,9 @@ msgid "" "is colored a brilliant cyan color. It emits an aroma both overwhelming and " "strangely alluring." msgstr "" +"Esta flor es como las otras flores invadidas por los hongos, pero su bulbo " +"es de un color cian brillante. Emite un aroma abrumador y extrañamente " +"atractivo." #: lang/json/furniture_from_json.py msgid "poof." @@ -115433,6 +118526,9 @@ msgid "" "color has been leached from its petals and stem. It gently sways of its own" " volition, maintaining an unsettling rhythm." msgstr "" +"Esta flor ha sido invadida por grises zarcillos fibrosos de hongos, y el " +"color ha sido quitado de sus pétalos y su tallo. Se mece suavemente por su " +"propia voluntad, manteniendo un ritmo perturbador." #: lang/json/furniture_from_json.py msgid "fungal mass" @@ -115444,6 +118540,8 @@ msgid "" "Thick ropes of mycal matter have covered the ground here completely. It's " "soft to the touch, but not firm enough to hold any weight." msgstr "" +"Unas sogas de materia mycus han cubierto el suelo acá completamente. Es " +"suave al tacto pero no lo suficientemente firme para aguantar algún peso." #: lang/json/furniture_from_json.py msgid "fungal clump" @@ -115455,10 +118553,12 @@ msgid "" "Alien mold and stems mingle tightly here, swaying around and weaving " "together, creating a sort of fungal bush." msgstr "" +"Tallos y moho alienígenas se mezclan apretados acá, meciéndose y ondeando " +"juntos, creando una especie de arbusto fúngico." #: lang/json/furniture_from_json.py msgid "fungal tangle" -msgstr "" +msgstr "enredo fúngico" #. ~ Description for fungal tangle #: lang/json/furniture_from_json.py @@ -115466,10 +118566,12 @@ msgid "" "Thick, ropy tendrils of fungus have risen from the ground and gathered into " "an impenetrable clump." msgstr "" +"Son zarcillos gruesos y fibrosos de hongos que se levantan del suelo y se " +"juntan armando una mata impenetrable." #: lang/json/furniture_from_json.py msgid "squelch." -msgstr "" +msgstr "chapoteo." #: lang/json/furniture_from_json.py msgid "stone slab" @@ -115478,7 +118580,7 @@ msgstr "escalón de piedra" #. ~ Description for stone slab #: lang/json/furniture_from_json.py msgid "A slab of heavy stone, with a reasonably flat surface." -msgstr "" +msgstr "Es un escalón pesado de piedra, con una superficie bastante plana." #: lang/json/furniture_from_json.py msgid "headstone" @@ -115491,6 +118593,10 @@ msgid "" "buried beneath. While only a solemn reminder of the uncountable losses of " "the Cataclysm, a proper final resting place grants an odd sense of peace." msgstr "" +"Es un escalón grande de piedra, grabado con información del difunto " +"enterrado debajo. Aunque sea solo un recuerdo solemne de las incontables " +"pérdidas del Cataclismo, un apropiado lugar de descanso final garantiza una " +"extraña sensación de paz." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -115509,6 +118615,10 @@ msgid "" " lies beneath. While only a solemn reminder of the countless casualties of " "the Cataclysm, a proper final resting place grants an odd sense of peace." msgstr "" +"Es un escalón vertical de piedra, grabado con información del difunto " +"enterrado debajo. Aunque sea solo un recuerdo solemne de las innumerables " +"víctimas del Cataclismo, un apropiado lugar de descanso final garantiza una " +"extraña sensación de paz." #: lang/json/furniture_from_json.py msgid "worn gravestone" @@ -115521,6 +118631,9 @@ msgid "" "inscription illegible. Whoever's buried here was probably lucky enough to " "pass before all this chaos began." msgstr "" +"Es una lápida vieja y desgastada, tan dañada que la inscripción ya es " +"ilegible. Sea quien sea quien esté enterrado aquí, probablemente haya tenido" +" la suerte de irse antes de que comience todo este caos." #: lang/json/furniture_from_json.py msgid "obelisk" @@ -115533,6 +118646,9 @@ msgid "" "serves to honor the passing of somebody significant, something one wishes " "was still a practical goal." msgstr "" +"Es una magnífica estatua tallada con una placa grabada puesta en la base. " +"Está para hacer honor al fallecimiento de alguien querido, algo que uno " +"desea que todavía sea un objetivo." #: lang/json/furniture_from_json.py msgid "thunk!" @@ -115549,6 +118665,10 @@ msgid "" "working on an assembly line. Despite its specialized purpose being all but " "lost now, it could provide a plethora of useful parts if disassembled." msgstr "" +"Es un brazo robótico resistente y versátil con una herramienta en la punta, " +"diseñado para trabajar en una línea de montaje. A pesar de que su propósito " +"especializado ya se ha perdido, ahora puede proveer de una cantidad de " +"partes útiles si se lo desarma." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "chemical mixer" @@ -115560,6 +118680,8 @@ msgid "" "A large vat with a motorized mixing device for combining large quantities of" " chemicals." msgstr "" +"Es un gran tanque con un dispositivo motorizado de mezclado para combinar " +"grandes cantidades de químicos." #: lang/json/furniture_from_json.py msgid "robotic arm" @@ -115572,6 +118694,9 @@ msgid "" "general-purpose than specially designed assemblers. Despite being " "functionless now, the parts could be useful." msgstr "" +"Es un brazo robótico automatizado utilizado en líneas de montaje, que parece" +" haber tenido un propósito más general que los diseñados especialmente. A " +"pesar de que ahora no tiene función, sus partes pueden ser útiles." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py @@ -115590,6 +118715,10 @@ msgid "" "programmed beforehand, something that a plethora of labels warn against " "doing without expertise." msgstr "" +"Es un aparato quirúrgico usado para la instalación y extracción de biónicos." +" El nombre 'Autodoc' no es muy apropiado, ya que solo puede ser operado si " +"se lo programa previamente, algo que una cantidad enorme de etiquetas " +"advierten de no hacer si no se es un experto en el tema." #: lang/json/furniture_from_json.py msgid "Autodoc operation couch" @@ -115612,14 +118741,17 @@ msgid "" "A device that can steam its contents at high enough tempuratures to " "completely sterilize them, killing any possible contaminants." msgstr "" +"Es un dispositivo que puede cocinar al vapor su contenido a temperaturas lo " +"suficientemente altas como para esterilizarlo, matando todos los posibles " +"contaminantes." #: lang/json/furniture_from_json.py msgid "filled autoclave" -msgstr "" +msgstr "autoclave lleno" #: lang/json/furniture_from_json.py msgid "sample freezer" -msgstr "" +msgstr "freezer de muestras" #. ~ Description for sample freezer #: lang/json/furniture_from_json.py @@ -115627,10 +118759,12 @@ msgid "" "A specialized freezer capable of maintaining tempuratures of -80 Celsieus, " "and is often used only for the preservation of delicate scientific samples." msgstr "" +"Es un freezer especial capaz de mantener temperaturas de -80°C, y a menudo " +"es usado solo para preservar muestras científicas delicadas." #: lang/json/furniture_from_json.py msgid "lab workbench" -msgstr "" +msgstr "mesa de trabajo de laboratorio" #. ~ Description for lab workbench #: lang/json/furniture_from_json.py @@ -115639,10 +118773,13 @@ msgid "" "most chemical spills and burns. It has wired in electrical and gas " "fittings." msgstr "" +"Es una mesada de resina que puede resistir la mayoría de salpicaduras y " +"quemaduras químicas, sobre un armario de metal. Tiene conectado equipamiento" +" eléctrico y de gas." #: lang/json/furniture_from_json.py msgid "fume hood" -msgstr "" +msgstr "campana de gases" #. ~ Description for fume hood #: lang/json/furniture_from_json.py @@ -115651,10 +118788,14 @@ msgid "" " in the hood draws fumes and smoke from dangerous chemicals up into a " "ventilation duct." msgstr "" +"Es una campana para gases sobre un espacio de trabajo de laboratorio, con " +"persianas de vidrio resistente. Un ventilador en la campana extrae los gases" +" y humos de químicos peligrosos y los expulsa por el conducto de " +"ventilación." #: lang/json/furniture_from_json.py msgid "shaker incubator" -msgstr "" +msgstr "incubadora con agitador" #. ~ Description for shaker incubator #: lang/json/furniture_from_json.py @@ -115663,10 +118804,13 @@ msgid "" "temperature to grow bacteria. Although, more bacteria is probably the last " "thing you need, considering the circumstances." msgstr "" +"Es una herramienta para contener mezclas químicas a la temperatura justa " +"para cultivar bacterias. Aunque más bacterias sea probablemente lo último " +"que necesitás, considerando las circunstancias." #: lang/json/furniture_from_json.py msgid "emergency wash station" -msgstr "" +msgstr "estación de lavado de emergencia" #. ~ Description for emergency wash station #: lang/json/furniture_from_json.py @@ -115676,10 +118820,14 @@ msgid "" "from the eyes, and is easily usable without being able to see very well. A " "sizable notice warns against drinking the water it uses." msgstr "" +"Es un lavamanos con pie con un par de mangueritas, y una manija grande y de " +"color brillante. Está especialmente diseñada para quitar rápidamente los " +"contaminantes de los ojos, y es fácilmente utilizable sin necesidad de ver " +"muy bien. Una nota grande desaconseja beber el agua que utiliza." #: lang/json/furniture_from_json.py msgid "IV pole" -msgstr "" +msgstr "palo IV" #. ~ Description for IV pole #: lang/json/furniture_from_json.py @@ -115687,10 +118835,12 @@ msgid "" "A tall wire frame on a set of small wheels used for holding an IV bag, " "useful for unattended administration." msgstr "" +"Es un fierro alto con un grupo de rueditas debajo que se usa para sostener " +"bolsas de IV, útil para la administración sin supervisión." #: lang/json/furniture_from_json.py msgid "high performance liquid chromatographer" -msgstr "" +msgstr "cromatógrafo de líquido de alta resolución" #. ~ Description for high performance liquid chromatographer #: lang/json/furniture_from_json.py @@ -115700,10 +118850,14 @@ msgid "" " their affinity, to the stationary phase in a tube. At least, that's what " "the label says." msgstr "" +"Es un herramienta de tecnología avanzada que, con electricidad y un operario" +" experimentado, es muy útil para separar químicos en fase líquida o acuosa, " +"basado en su afinidad, hacia la fase estacionaria en un tubo. Por lo menos, " +"eso es lo que dice la etiqueta." #: lang/json/furniture_from_json.py msgid "gas chromatographer" -msgstr "" +msgstr "cromatógrafo de gases" #. ~ Description for gas chromatographer #: lang/json/furniture_from_json.py @@ -115713,10 +118867,14 @@ msgid "" "affinity, to a stationary phase in a tube. At least, that's what the label " "says." msgstr "" +"Es un herramienta de tecnología avanzada que, con electricidad y un operario" +" experimentado, es muy útil para separar químicos en fase gaseosa, basado en" +" su afinidad, hacia una fase estacionaria en un tubo. Por lo menos, eso es " +"lo que dice la etiqueta." #: lang/json/furniture_from_json.py msgid "mass spectrometer" -msgstr "" +msgstr "espectómetro de masa" #. ~ Description for mass spectrometer #: lang/json/furniture_from_json.py @@ -115727,10 +118885,15 @@ msgid "" "mass of the particle hitting it. Invaluable for chemical analysis and other" " advanced sciences, it's not as useful anymore." msgstr "" +"Adentro de esta gran caja blanca hay un grupo cuidadosamente balanceado de " +"generadores de campo eléctrico que pueden separar precisamente partículas " +"ionizadas basado en su relación de carga a masa, tirándolos dentro de un " +"detector que mide la masa exacta de la partícula. Es invaluable para los " +"análisis químicos y otras ciencias avanzadas, ya no es tan útil." #: lang/json/furniture_from_json.py msgid "nuclear magnetic resonance spectrometer" -msgstr "" +msgstr "espectómetro de resonancia magnética nuclear" #. ~ Description for nuclear magnetic resonance spectrometer #: lang/json/furniture_from_json.py @@ -115739,10 +118902,14 @@ msgid "" "used to observe how magnetic fields affect nuclear spins. It is a common " "workhorse for the discovery and study of chemical structures." msgstr "" +"Es un electroimán gigante con equipo de medición cuidadosamente calibrado " +"que se usa para observar cómo afectan los campos magnéticos a los espines " +"nucleares. Es una herramienta confiable común para descubrir y estudiar las " +"estructuras químicas." #: lang/json/furniture_from_json.py msgid "electron microscope" -msgstr "" +msgstr "microscopio de electrones" #. ~ Description for electron microscope #: lang/json/furniture_from_json.py @@ -115750,10 +118917,12 @@ msgid "" "An enormous observational tool for studying the details of samples on an " "immensely small scale." msgstr "" +"Es una enorme herramienta de observación para estudiar los detalles de las " +"muestras a una inmensamente pequeña escala." #: lang/json/furniture_from_json.py msgid "CT scanner" -msgstr "" +msgstr "tomógrafo" #. ~ Description for CT scanner #: lang/json/furniture_from_json.py @@ -115761,10 +118930,12 @@ msgid "" "A massive piece of machinery used to take hundreds of X-ray images from 360 " "degrees, often used for medical examinations of patients." msgstr "" +"Es una máquina enorme que se utiliza para tomar cientos de imágenes rayos X " +"de 360 grados, se usa comúnmente para exámenes médicos de pacientes." #: lang/json/furniture_from_json.py msgid "MRI machine" -msgstr "" +msgstr "máquina de resonancia magnética" #. ~ Description for MRI machine #: lang/json/furniture_from_json.py @@ -115772,10 +118943,13 @@ msgid "" "A massive tool used to take NMR images of a patient placed inside, providing" " invaluable medical insight." msgstr "" +"Es una enorme herramienta que se usa para tomar imágenes de resonancia " +"magnética nuclear del paciente que se mete adentro, lo que brinda " +"información médica invaluable." #: lang/json/furniture_from_json.py msgid "scanner bed" -msgstr "" +msgstr "camilla para escaneo" #. ~ Description for scanner bed #: lang/json/furniture_from_json.py @@ -115783,10 +118957,12 @@ msgid "" "This is a narrow, flat, and frankly uncomfortable bed for putting someone " "into an imaging machine for medical observations." msgstr "" +"Es una cama plana, fina y francamente incómoda que se utiliza para meter a " +"una persona en una máquina de escaneo para observaciones médicas." #: lang/json/furniture_from_json.py msgid "anesthetic machine" -msgstr "" +msgstr "máquina de anestesia" #. ~ Description for anesthetic machine #: lang/json/furniture_from_json.py @@ -115795,10 +118971,14 @@ msgid "" "maintain precise levels of anesthesia in a patient to ensure they, at least " "ideally, remain asleep, unfeeling, but alive." msgstr "" +"Es una máquina grande con varios tanques, tubos y aparatos de monitoreo que " +"se usan para mantener niveles precisos de anestesia en un paciente para " +"asegurar que, en el mejor de los casos, se mantenga dormido, sin sentir, " +"pero vivo." #: lang/json/furniture_from_json.py msgid "dialysis machine" -msgstr "" +msgstr "máquina de diálisis" #. ~ Description for dialysis machine #: lang/json/furniture_from_json.py @@ -115807,10 +118987,13 @@ msgid "" "function of their kidneys. Largely obsolete for those with access to " "bionics, but a lifeline to those that need it." msgstr "" +"Es una máquina grande para bombear y filtrar sangre a una persona sin la " +"función de sus riñones. Muy obsoleta para aquellos que tengan acceso a los " +"biónicos, pero un salvavidas para aquél que lo necesita." #: lang/json/furniture_from_json.py msgid "medical ventilator" -msgstr "" +msgstr "respirador médico" #. ~ Description for medical ventilator #: lang/json/furniture_from_json.py @@ -115819,36 +119002,39 @@ msgid "" "patient's lungs when they are incapable of breathing, though often only " "needed temporarily." msgstr "" +"Es una caja grande con un grupo de ruedas que bombea aire a los pulmones de " +"un paciente cuando es incapaz de respirar, aunque a menudo solo se necesita " +"temporariamente." #: lang/json/furniture_from_json.py msgid "privacy curtain" -msgstr "" +msgstr "cortina de privacidad" #. ~ Description for privacy curtain #: lang/json/furniture_from_json.py msgid "No peeking!" -msgstr "" +msgstr "¡Sin espiar!" #: lang/json/furniture_from_json.py msgid "swish!" -msgstr "" +msgstr "suishh!" #: lang/json/furniture_from_json.py msgid "clattering metal!" -msgstr "" +msgstr "golpes metálicos!" #: lang/json/furniture_from_json.py msgid "open privacy curtain" -msgstr "" +msgstr "abrir cortina de privacidad" #. ~ Description for open privacy curtain #: lang/json/furniture_from_json.py msgid "Stop peeking!" -msgstr "" +msgstr "¡Dejá de espiar!" #: lang/json/furniture_from_json.py msgid "glowing tendril" -msgstr "" +msgstr "zarcillo brillante" #. ~ Description for glowing tendril #: lang/json/furniture_from_json.py @@ -115856,14 +119042,16 @@ msgid "" "A willowy tendril growing from the floor, gently waving back and forth. A " "faint light spills from it." msgstr "" +"Es un zarcillo esbelto que crece desde el suelo, meciéndose gentilmente " +"hacia atrás y adelante. Una suave luz se desprende de él." #: lang/json/furniture_from_json.py msgid "splorch!" -msgstr "" +msgstr "splorch!" #: lang/json/furniture_from_json.py msgid "wafting anemone" -msgstr "" +msgstr "anémona flotante" #. ~ Description for wafting anemone #: lang/json/furniture_from_json.py @@ -115872,10 +119060,13 @@ msgid "" "tendrils pouring out of it. It looks almost exactly like a sea anemone, " "even waving gently as though underwater." msgstr "" +"Es una protuberancia carnosa blanca que crece del suelo, con un grupo de " +"zarcillos saliendo de ella. Es casi igual a una anémona de mar, incluso se " +"mece suavemente como si estuviera bajo el agua." #: lang/json/furniture_from_json.py msgid "gasping tube" -msgstr "" +msgstr "tubo de respiración" #. ~ Description for gasping tube #: lang/json/furniture_from_json.py @@ -115885,10 +119076,14 @@ msgid "" "series of ports somewhat like mouths, from which pour bursts of a vile-" "smelling gas." msgstr "" +"Es una estalactita carnosa verde con una piel gruesa como el de una estrella" +" de mar, que se extiende desde el suelo hasta el techo. En el medio hay una " +"serie de puertos que parecen bocas, desde las cuales expulsa unas nubes de " +"gas de olor repugnante." #: lang/json/furniture_from_json.py msgid "twitching frond" -msgstr "" +msgstr "fronda moviente" #. ~ Description for twitching frond #: lang/json/furniture_from_json.py @@ -115897,10 +119092,13 @@ msgid "" " air. Every so often, a cascade of energy arcs along it and discharges into" " the ceiling." msgstr "" +"Es una espina que se parece a las antenas de las polillas, que sobresale del" +" suelo, meciéndose suavemente en el aire. Cada tanto, una cascada de energía" +" pasa por ella y se descarga en el techo." #: lang/json/furniture_from_json.py msgid "scarred lump" -msgstr "" +msgstr "bulto cicatrizado" #. ~ Description for scarred lump #: lang/json/furniture_from_json.py @@ -115908,10 +119106,12 @@ msgid "" "This is a pile of nondescript alien flesh, twitching and belching strange " "gases out of injured orifices." msgstr "" +"Es una pila de carne alienígena indescriptible, que se retuerce y escupe " +"unos gases extraños desde sus orificios." #: lang/json/furniture_from_json.py msgid "slimy pod" -msgstr "" +msgstr "vaina babosa" #. ~ Description for slimy pod #: lang/json/furniture_from_json.py @@ -115920,10 +119120,13 @@ msgid "" "in a thick mucus, obscuring whatever is floating in the gel-like substance " "inside." msgstr "" +"Es una vaina translúcida y escurridiza suspendido en un tallo fino. Está " +"cubierta de una mucosidad espesa, oscureciendo lo que sea que está flotando " +"en la sustancia parecida al gel de su interior." #: lang/json/furniture_from_json.py msgid "organ pod" -msgstr "" +msgstr "vaina orgánica" #. ~ Description for organ pod #: lang/json/furniture_from_json.py @@ -115932,10 +119135,13 @@ msgid "" " dimly outlined shape of human organs, floating in some kind of preservative" " goo." msgstr "" +"Es una vaina translúcida suspendido en un tallo fino. Adentro podés ver " +"apenas la forma de órganos humanos, flotando en una especie de viscosidad " +"que los preserva." #: lang/json/furniture_from_json.py msgid "resin pod" -msgstr "" +msgstr "vaina de resina" #. ~ Description for resin pod #: lang/json/furniture_from_json.py @@ -115944,10 +119150,13 @@ msgid "" "clear resinous-looking fluid. You could fairly easily tear it from the " "stalk and take it with you." msgstr "" +"Es una vaina translúcida suspendido en un tallo fino. Adentro tiene un " +"fluido limpio y claro similar a una resina. Podés arrancarlo con facilidad y" +" llevártelo." #: lang/json/furniture_from_json.py msgid "fleshy altar" -msgstr "" +msgstr "altar cárnico" #. ~ Description for fleshy altar #: lang/json/furniture_from_json.py @@ -115957,6 +119166,10 @@ msgid "" "unidentifiable appendages reach from the sides, suggesting a sort of " "nightmarish living autodoc." msgstr "" +"Esta protuberancia palpitante sale del suelo, sus costados están cubiertos " +"por una piel escamada y purulenta. Su superficie es plana pero suavemente " +"ondulada. Un puñado de apéndices inidentificables salen de los costados, " +"asemejando una especie de autodoc viviente y pesadillesco." #: lang/json/furniture_from_json.py msgid "bathtub" @@ -115969,6 +119182,9 @@ msgid "" "fixed over the drain. Watertight and relatively clean, it would make for a " "good water trough." msgstr "" +"Es una bañadera común de cerámica con canillas de acero ahora inútiles, y un" +" tapón atado sobre el desagüe. Hermética y relativamente limpia, puede " +"funcionar para almacenar agua." #: lang/json/furniture_from_json.py msgid "porcelain breaking!" @@ -115989,6 +119205,9 @@ msgid "" "cleaning oneself. Before it was a commonplace amenity, but now it's hard to" " imagine wasting that much water." msgstr "" +"Es un pequeño espacio cerrado con puerta de vidrio y elementos de plomería " +"para bañarse. Antes era una instalación común pero ahora es difícil " +"imaginarse gastando tanta agua." #: lang/json/furniture_from_json.py msgid "sink" @@ -116000,6 +119219,8 @@ msgid "" "A porcelain water basin with a water tap and drain, designed to be fitted " "into an opening on a countertop." msgstr "" +"Es una pileta de porcelana con canilla de agua y desagüe, diseñada para ser " +"puesta sobre una mesada." #: lang/json/furniture_from_json.py msgid "toilet" @@ -116013,6 +119234,10 @@ msgid "" "better than anything that would be in the bowl, it would not be the " "cleanest." msgstr "" +"Es una instalación invaluable en todo hogar y sería un milagro encontrar uno" +" que funcione. El tanque vertical puede contener una cantidad moderada de " +"agua, pero aunque sea mejor que la que está en el inodoro, tampoco es la más" +" limpia del mundo." #: lang/json/furniture_from_json.py msgid "water heater" @@ -116025,6 +119250,9 @@ msgid "" "temperatures. Now that there's no way to power it, the large tank could " "still be used to store large amounts of clean water." msgstr "" +"Es un tanque de metal aislado con un pequeño fuego que se usa para mantener " +"temperaturas cercanas al hervor. Ahora que no hay manera de usarlo, el " +"tanque puede ser usado para almacenar grandes cantidades de agua potable." #. ~ Description for water purifier #: lang/json/furniture_from_json.py @@ -116032,6 +119260,8 @@ msgid "" "This devices effectively sterilizes water, though without a lot of power and" " proper plumbing, it's only good for parts now." msgstr "" +"Este dispositivo esteriliza agua de manera efectiva, aunque sin energía y " +"cañerías adecuadas, solo sirven sus partes." #: lang/json/furniture_from_json.py msgid "exercise machine" @@ -116041,10 +119271,12 @@ msgstr "máquina de ejercicio" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." msgstr "" +"Es un equipo de pesas para entrenar la fuerza, con un par de pesos fijos en " +"las puntas de un caño resistente. Podés ajustar el equipo eligiendo las " +"pesas que querés usar." #: lang/json/furniture_from_json.py msgid "ball machine" @@ -116057,6 +119289,10 @@ msgid "" " motorized wheels that, if spun up, would fling the ball at moderate speeds." " Probably not the most effective ranged weapon against the undead." msgstr "" +"Es una máquina simple que lanza pelotas deportivas de diferentes tipos, con " +"un par de ruedas motorizadas que, cuando giran, lanzarán la pelota a una " +"velocidad moderada. Probablemente no sea el arma de distancia más efectiva " +"contra los muertos vivientes." #: lang/json/furniture_from_json.py msgid "pool table" @@ -116070,6 +119306,10 @@ msgid "" "While not the most useful as a normal table, there is a substantial amount " "of wood." msgstr "" +"Es una mesa grande de madera con fieltro verde cubriendo la parte superior y" +" unos agujeros simétricos que llevan las bolas de billar hacia un lado de la" +" mesa con una abertura. Aunque no es tan útil como una mesa normal, tiene " +"una cantidad considerable de madera." #: lang/json/furniture_from_json.py msgid "diving block" @@ -116081,6 +119321,8 @@ msgid "" "A chunky plastic stool bolted onto the ground, intended as a safe way of " "diving forward into a body of water." msgstr "" +"Es una banqueta robusta de plástico atornillada al suelo, diseñada como una " +"forma segura de usar para tirarse un clavado al agua." #: lang/json/furniture_from_json.py msgid "target" @@ -116095,6 +119337,11 @@ msgid "" "small dents and holes, and a large amount of the paint has flaked or chipped" " off." msgstr "" +"Es una lámina grande de metal puesta verticalmente en una estructura de " +"caños. La lámina está cortada en forma de silueta humana. Tiene dos blancos " +"dibujados, uno grande en el torso y otro más chico en la cabeza. Está " +"acribillada de agujeritos y abolladuras y una gran cantidad de pintura se le" +" ha salido." #: lang/json/furniture_from_json.py msgid "arcade machine" @@ -116106,6 +119353,9 @@ msgid "" "A bulky upright arcade cabinet, brightly painted and slightyly worn with " "age. Useless for its intended purpose, it's bound to have valuable parts." msgstr "" +"Es un mueble voluminoso vertical, pintado de colores brillantes y un poco " +"desgastado por el paso del tiempo. Ya no sirve para su propósito original, " +"pero tiene partes valiosas." #: lang/json/furniture_from_json.py msgid "pinball machine" @@ -116119,6 +119369,10 @@ msgid "" " inoperable without power, it's still impressive to look at, though probably" " more useful if disassembled." msgstr "" +"Es un juego icónico, esta máquina es una intrincada trayectoria con " +"obstáculos con un fondo decorado con colores brillantes, cubierta con un " +"vidrio grande. Aunque no funciona sin alimentación eléctrica, todavía es " +"impresionante a la vista, aunque va a ser más útil desarmada." #: lang/json/furniture_from_json.py msgid "ergometer" @@ -116131,6 +119385,24 @@ msgid "" " a boat. Without power it can't be operated, but it might have useful parts" " to be scavanged." msgstr "" +"Es una máquina de ejercicios con un grupo de manijas y platos diseñados para" +" emular la acción de remar en un bote. Sin alimentación eléctrica no puede " +"ser utilizada, pero tiene algunas partes útiles que se pueden recuperar." + +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "ergómetro mecánico" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "" +"Es una máquina de ejercicios con un grupo de manijas y platos diseñados para" +" emular la acción de remar en un bote. Es un modelo más viejo con ajustes de" +" resistencia mecánica, pero funciona sin energía eléctrica." #: lang/json/furniture_from_json.py msgid "treadmill" @@ -116143,6 +119415,24 @@ msgid "" "Without power, it's an immense challenge to move the belt. Regardless, " "you're probably getting enough cardio on your own." msgstr "" +"Es una cinta transportadora motorizada con un panel de control para poder " +"correr en el lugar. Sin alimentación eléctrica, es un desafío inmenso mover " +"la cinta. Sin embargo, ya debés estar ejercitándote lo suficiente." + +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "cinta para correr inclinada" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" +"Es una cinta transportadora con un panel de control mecánico para correr en " +"un lugar. La cinta transportadora está posicionada con un escalón, pero con " +"la inclinación ajustable, así que se vuelve a bajar con tu peso." #: lang/json/furniture_from_json.py msgid "heavy punching bag" @@ -116155,6 +119445,9 @@ msgid "" "a steel chain. It can be used for exercise and combat training, with the " "notable advantage that it doesn't fight back." msgstr "" +"Es una bolsa de cuero pesada de forma rectangular colgada del techo con una " +"cadena de acero. Puede ser usada para ejercitarse y para entrenamiento de " +"combate, con la notable ventaja de que no te devuelve las piñas." #: lang/json/furniture_from_json.py msgid "whud." @@ -116171,6 +119464,9 @@ msgid "" "player. A set of off-white and black keys all linked to a set of hammers, " "which strike their corresponding tightly-coiled wire to produce sound." msgstr "" +"Es un piano elegante capaz de producir una música hermosa si lo utiliza un " +"pianista cualificado. Es un conjunto de teclas blancas y negras unidas a " +"martillos que golpean sus correspondientes cuerdas para producir el sonido." #: lang/json/furniture_from_json.py msgid "a suffering piano!" @@ -116182,7 +119478,7 @@ msgstr "kerchang." #: lang/json/furniture_from_json.py msgid "speaker cabinet" -msgstr "" +msgstr "gabinete de parlante" #. ~ Description for speaker cabinet #: lang/json/furniture_from_json.py @@ -116191,10 +119487,13 @@ msgid "" " deafening volume level. While this is a terrible idea to use now, it could" " hold useful parts." msgstr "" +"Es como un gabinete vertical de madera para parlantes grandes, construido " +"para producir un volumen potencialmente ensordecedor. Aunque ahora sería una" +" espantosa idea usarlo, puede contener algunas partes útiles." #: lang/json/furniture_from_json.py msgid "dancing pole" -msgstr "" +msgstr "caño de baile" #. ~ Description for dancing pole #: lang/json/furniture_from_json.py @@ -116203,10 +119502,13 @@ msgid "" "floor. Usually used for various forms of dancing, often in adult-oriented " "venues." msgstr "" +"Es un caño de acero largo puesto verticalmente, amurado al techo y al piso. " +"Comúnmente se utiliza para varios estilos de danza, a menudo orientados a " +"adultos." #: lang/json/furniture_from_json.py msgid "roulette table" -msgstr "" +msgstr "mesa de ruleta" #. ~ Description for roulette table #: lang/json/furniture_from_json.py @@ -116215,6 +119517,10 @@ msgid "" "painted onto the felt top, and a concave spinning wheel intended to give a " "random selection of the inscribed possibilities." msgstr "" +"Es una mesa enorme especialmente pensada para una forma específica de " +"apuestas, con una cuadrícula pintada sobre el fieltro superior, y una rueda " +"giratoria cóncava diseñada para seleccionar aleatoriamente las posibilidades" +" escritas." #: lang/json/furniture_from_json.py msgid "this should never actually show up, it's a pseudo furniture" @@ -116230,7 +119536,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "cell phone signal booster" -msgstr "" +msgstr "aumentador de señal celular" #. ~ Description for cell phone signal booster #: lang/json/furniture_from_json.py @@ -116239,14 +119545,17 @@ msgid "" "them to reach further destinations with more clarity. Now that there's no " "longer signals for them to boost, they're only good for parts." msgstr "" +"Es un pedazo de equipamiento especializado para recibir señales telefónicas " +"y amplificarlas para alcanzar destinos más alejados con mayor claridad. " +"Ahora que no hay señales que amplificar, solo es útil por sus partes." #: lang/json/furniture_from_json.py msgid "womp!" -msgstr "" +msgstr "womp!" #: lang/json/furniture_from_json.py msgid "satellite dish" -msgstr "" +msgstr "antena satelital" #. ~ Description for satellite dish #: lang/json/furniture_from_json.py @@ -116255,10 +119564,13 @@ msgid "" "satellites. Satellites that will assuredly continue to orbit, with nothing " "to broadcast." msgstr "" +"Es un pequeño disco de metal diseñado para recibir ondas de radios de los " +"satélites orbitales. Esos satélites seguramente continúan orbitando sin " +"ninguna señal que transmitir." #: lang/json/furniture_from_json.py msgid "chimney crown" -msgstr "" +msgstr "chimenea exterior" #. ~ Description for chimney crown #: lang/json/furniture_from_json.py @@ -116266,10 +119578,13 @@ msgid "" "The top of a brick chimney, the opening is stained black with soot. " "Definitely too narrow to fit in." msgstr "" +"Es la parte superior externa de ladrillos de la chimenea, la abertura está " +"manchada de negro con hollín. Definitivamente, muy fina como para entrar por" +" ahí." #: lang/json/furniture_from_json.py msgid "TV antenna" -msgstr "" +msgstr "antena de televisión" #. ~ Description for TV antenna #: lang/json/furniture_from_json.py @@ -116278,10 +119593,13 @@ msgid "" "broadcasts. Almost wholly obsolete for years, only being good for parts " "isn't new for this item." msgstr "" +"Es una simple antena de metal que incrementa la recepción de las transmisión" +" de televisión de aire. Casi completamente obsoleta desde hace años, solo " +"sirve por sus componentes." #: lang/json/furniture_from_json.py msgid "vent pipe" -msgstr "" +msgstr "caño de ventilación" #. ~ Description for vent pipe #: lang/json/furniture_from_json.py @@ -116289,10 +119607,13 @@ msgid "" "A sort of chimney spout for a building's internal ventilation system, this " "can be used for circulation, venting fumes, and other such functions." msgstr "" +"Es una especie de boca de chimenea del sistema de ventilación interno de un " +"edificio. Puede usarse para circulación, ventilar gases y otras funciones " +"similares." #: lang/json/furniture_from_json.py msgid "roof turbine vent" -msgstr "" +msgstr "ventilación de turbina de techo" #. ~ Description for roof turbine vent #: lang/json/furniture_from_json.py @@ -116301,10 +119622,13 @@ msgid "" " It is most commonly used for improving air cicrulation, particularly in " "poorly-ventilated areas like attics." msgstr "" +"Es una turbina de viento giratoria que utiliza el viento para extraer el " +"aire de adentro. Es comúnmente usado para mejorar la circulación de aire, " +"particularmente en áreas mal ventiladas como los altillos." #: lang/json/furniture_from_json.py msgid "bale of hay" -msgstr "" +msgstr "atado de heno" #. ~ Description for bale of hay #: lang/json/furniture_from_json.py @@ -116313,6 +119637,8 @@ msgid "" "for livestock. If your only other option is the floor, it makes a tolerable" " bed." msgstr "" +"Es un enorme bloque de heno que lo hace fácil para almacenar para el ganado." +" Si tu otra opción es el suelo, se puede usar como una aceptable cama." #: lang/json/furniture_from_json.py msgid "whish!" @@ -116329,6 +119655,9 @@ msgid "" "through, and a large fire hazard, it's probably best to shovel it out of the" " way." msgstr "" +"Es una gran cantidad de astillas de madera. Muy desagradable para acostarse " +"encima, difícil para caminar y un gran peligro de incendio, es probablemente" +" mejor agarrar la pala y sacarlas." #: lang/json/furniture_from_json.py msgid "bench" @@ -116340,6 +119669,9 @@ msgid "" "A simple bench with wood slats nailed to a frame. While uncomfortably flat " "and just as cold as the ground, it could serve as a bed if needed." msgstr "" +"Es un banco simple con tablas de madera clavadas a la estructura. Aunque es " +"incómodamente plano y tan frío como el piso, puede funcionar como cama si es" +" necesario." #: lang/json/furniture_from_json.py msgid "arm chair" @@ -116351,10 +119683,12 @@ msgid "" "A simple upholstered chair with armrests. Soft and fairly warm, it " "definitely beats the ground for sleeping on, though not by much." msgstr "" +"Es una simple silla tapizada con apoyabrazos. Suave y bastante calentita, es" +" definitivamente mejor que dormir en el suelo, aunque por poco." #: lang/json/furniture_from_json.py msgid "airplane seat" -msgstr "" +msgstr "asiento de avión" #. ~ Description for airplane seat #: lang/json/furniture_from_json.py @@ -116362,6 +119696,9 @@ msgid "" "A cheaply upholstered folding airplane seat, it has a simple across-the-lap " "seatbelt. You likely wouldn't be the first to sleep in this." msgstr "" +"Es un asiento plegable barato y tapizado de avión, con un cinturón de " +"seguridad simple que cruza la cintura. Seguramente no seas el primero en " +"dormir en uno de estos." #: lang/json/furniture_from_json.py msgid "chair" @@ -116374,6 +119711,10 @@ msgid "" "rest your feet for once, and if coupled with a suitable table, you could eat" " a meal properly and almost pretend that things were normal again." msgstr "" +"Es una simple silla de madera con cuatro patas, asiento y respaldo. Está " +"buena para descansar las aptas y si se la usa con una mesa adecuada, podrías" +" comer de manera apropiada y casi pretender que las cosas son normales otra " +"vez." #: lang/json/furniture_from_json.py msgid "sofa" @@ -116386,6 +119727,9 @@ msgid "" "alongside one another, or one person to lay back on. It's not quite a bed, " "but it's a hell of a lot more comfortable than the floor." msgstr "" +"Es un banco ancho tapizado, lo suficientemente grande para que dos personas " +"se sienten cómodamente uno al lado del otro, o para que una persona se " +"recueste. No es una cama pero es mucho más cómodo que el piso." #: lang/json/furniture_from_json.py msgid "stool" @@ -116398,6 +119742,9 @@ msgid "" "maneuverable to sit on, the lack of back support means it's significantly " "less comfortable than a normal chair." msgstr "" +"Es una banqueta simple con cuatro patas y asiento. Aunque es un toque más " +"fácil para sentarse, la ausencia de apoyo para la espalda significa que es " +"menos cómoda que una silla normal." #. ~ Description for camp chair #: lang/json/furniture_from_json.py @@ -116405,10 +119752,12 @@ msgid "" "A somewhat uncomfortable folding chair, with fabric strung across a metal " "frame. Not the best, but better than nothing, and a lot easier to pack up." msgstr "" +"Es una silla plegable un poco incómoda, con tela encordada en la estructura " +"de metal. No es la mejor pero es mejor que nada, y muy fácil de guardar." #: lang/json/furniture_from_json.py msgid "log stool" -msgstr "" +msgstr "banco de tronco" #. ~ Description for log stool #: lang/json/furniture_from_json.py @@ -116416,10 +119765,12 @@ msgid "" "A short section from a tree trunk with one of the flat ends smoothed down. " "Makes for a decent place to sit, but not quite a real chair." msgstr "" +"Es un pedazo corto de tronco con una de las puntas alisada. Es un lugar para" +" sentarse decente pero no es una silla de en serio." #: lang/json/furniture_from_json.py msgid "deck chair" -msgstr "" +msgstr "reposera" #. ~ Description for deck chair #: lang/json/furniture_from_json.py @@ -116428,6 +119779,9 @@ msgid "" "it's built to take outdoor conditions and is an improvement over the ground," " it's not particularly comfortable." msgstr "" +"Es una reposera plegable con pedazos de tela puestas en una estructura de " +"madera. Aunque está fabricada para soportar las condiciones del exterior y " +"es una mejora con respecto al suelo, no es particularmente cómoda." #: lang/json/furniture_from_json.py msgid "bulletin board" @@ -116439,6 +119793,8 @@ msgid "" "A wide wooden frame with a sheet of corkboard inside. Good for pinning " "various notices for other survivors to read." msgstr "" +"Es una estructura ancha de madera con una plancha de corcho en su interior. " +"Sirve para pinchar noticias y que otros supervivientes las puedan ver." #: lang/json/furniture_from_json.py msgid "sign" @@ -116450,10 +119806,12 @@ msgid "" "A simple signpost made of wood. Basically two planks alongside each other " "nailed to another plank that holds them up." msgstr "" +"Es un simple cartel hecho de madera. Básicamente, son dos tablas juntas " +"clavadas a otra tabla que las sostiene." #: lang/json/furniture_from_json.py msgid "warning sign" -msgstr "" +msgstr "cartel de advertencia" #. ~ Description for warning sign #: lang/json/furniture_from_json.py @@ -116461,6 +119819,9 @@ msgid "" "A triangular signpost painted white with a red border. Designed to easily " "catch the eye, signs of this nature seldom display anything but bad news." msgstr "" +"Es un cartel triangular pintado de amarillo con el borde rojo. Diseñado para" +" atraer la vista fácilmente, los carteles de este tipo raramente muestran " +"otra cosa que malas noticias." #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "bed" @@ -116473,10 +119834,13 @@ msgid "" "pillows, and despite being a completely ordinary mattress, it's a sight for " "sore, tired eyes." msgstr "" +"Es un colchón estándar en una estructura resistente de madera. Incluso sin " +"sábanas ni almohadas, y a pesar de ser un colchón completamente ordinario, " +"es un espectáculo para ojos cansados y doloridos." #: lang/json/furniture_from_json.py msgid "bunk bed" -msgstr "" +msgstr "cucheta" #. ~ Description for bunk bed #: lang/json/furniture_from_json.py @@ -116486,10 +119850,14 @@ msgid "" " you'd like to somebody you wouldn't normally want to share a mattress with," " a bed's a bed." msgstr "" +"Es una cama cucheta en una estructura resistente de madera construida para " +"dos colchones simples. Aunque esto significa dormir más cerca de lo que te " +"gustaría de alguien con el que nunca compartirías el colchón, una cama es " +"una cama." #: lang/json/furniture_from_json.py msgid "bed frame" -msgstr "" +msgstr "marco de cama" #. ~ Description for bed frame #: lang/json/furniture_from_json.py @@ -116497,10 +119865,13 @@ msgid "" "A sturdy wooden bed frame built to hold most standard mattresses. Despite " "being one half of a bed, it's just about impossible to lay on by itself." msgstr "" +"Es un marco de cama resistente de madera, construido para sostener un " +"colchón común. A pesar de ser la mitad de una cama, es casi imposible " +"acostarse ahí." #: lang/json/furniture_from_json.py msgid "whack." -msgstr "" +msgstr "whack." #. ~ Description for mattress #: lang/json/furniture_from_json.py @@ -116509,6 +119880,9 @@ msgid "" " entire bed without the mattress, it's pretty close. If it's someplace " "actually safe to sleep, it's practically a luxury in of itself." msgstr "" +"Es un colchón comunacho tirado en el piso. Aunque no es tan cómodo como una " +"cama entera, se asemeja bastante. Es un lugar bastante seguro para dormir, y" +" es casi un lujo por sí mismo." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py src/map.cpp @@ -116523,6 +119897,9 @@ msgid "" "it's someplace actually safe to sleep, it's practically a luxury in of " "itself." msgstr "" +"Es un colchón blando relleno de plumas tirado en el suelo. Aunque no es tan " +"cómodo como una cama completa, se asemeja bastante. Es un lugar bastante " +"seguro para dormir, y es casi un lujo por sí mismo." #: lang/json/furniture_from_json.py msgid "makeshift bed" @@ -116535,6 +119912,9 @@ msgid "" " bed, albeit with a slightly lumpy mattress. Considering the circumstances," " it's not too bad at all." msgstr "" +"Es un colchón improvisado en un marco endeble de madera. Casi tan bueno como" +" una cama, aunque tenga un colchón un poco aplastado. Considerando las " +"circunstancias, no está tan mal." #: lang/json/furniture_from_json.py msgid "straw bed" @@ -116546,10 +119926,12 @@ msgid "" "An improvised bedding pile made of hay. Better than nothing, but not " "particularly comfortable, and quite itchy." msgstr "" +"Es una pila improvisada para dormir hecha de heno. Mejor que nada pero no es" +" particularmente cómoda, y pica un poco." #: lang/json/furniture_from_json.py msgid "bookcase" -msgstr "" +msgstr "biblioteca" #. ~ Description for bookcase #: lang/json/furniture_from_json.py @@ -116557,10 +119939,13 @@ msgid "" "A simple wooden shelf for storing dozens of books. While designed for " "books, it does a decent job of storing anything else that'll fit." msgstr "" +"Es un estante simple de madera para poner docenas de libros. Aunque fue " +"diseñada para poner libros, puede funcionar bien poniendo cualquier cosa que" +" entre." #: lang/json/furniture_from_json.py msgid "entertainment center" -msgstr "" +msgstr "centro de entretenimiento" #. ~ Description for entertainment center #: lang/json/furniture_from_json.py @@ -116569,6 +119954,9 @@ msgid "" " cabinet can store a variety of things, like a TV and media systems, with " "shelving space and cupboards for anything that'll fit." msgstr "" +"Aunque por sí solo no es tan copado como supone su nombre, este armario " +"grande de madera puede almacenar una variedad de cosas, como un televisor y " +"sistemas de audio, con estantes y alacenas para poner lo que pueda entrar." #: lang/json/furniture_from_json.py msgid "coffin" @@ -116582,6 +119970,10 @@ msgid "" "to be given a proper final resting place. An honor that countless many will" " likely never receive." msgstr "" +"Es un humilde féretro de madera para el velorio respetuoso de los muertos. " +"Aunque era una práctica normal antes de todo esto, ahora es un honor raro " +"que alguien pueda tener un lugar de descanso final apropiado. Un honor que " +"muchísimos jamás recibirán." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "wham!" @@ -116599,6 +119991,10 @@ msgid "" "to be given a proper final resting place. This one is open and unoccupied, " "and gazing inside fills you with a sense of melancholic weariness." msgstr "" +"Es un humilde féretro de madera para el velorio respetuoso de los muertos. " +"Aunque era una práctica normal antes de todo esto, ahora es un honor raro " +"que alguien pueda tener un lugar de descanso final apropiado. Este está " +"abierto y vacío, y al mirar adentro te hace sentir una fatiga melancólica." #: lang/json/furniture_from_json.py msgid "crate" @@ -116611,6 +120007,9 @@ msgid "" "about anything inside. If you don't have a proper tool to pry it open, " "smashing it is an option, albeit one that risks destroying the contents." msgstr "" +"Es un recipiente sellado de madera. No tiene ninguna etiqueta, podría tener " +"cualquier cosa adentro. Si no tenés la herramienta adecuada para abrirla, " +"romperla es una opción, aunque corrés el riesgo de romper el contenido." #: lang/json/furniture_from_json.py msgid "open crate" @@ -116623,6 +120022,9 @@ msgid "" "lid has been pried off and is leaned adjacent to it, and with a fresh set of" " nails, could be sealed back shut." msgstr "" +"Es una caja abierta de madera, capaz de almacenar una cantidad de cosas. La " +"tapa ha sido abierta y está apoyada en un costado, y con unos clavos nuevos " +"se podría volver a cerrar." #. ~ Description for large cardboard box #: lang/json/furniture_from_json.py @@ -116632,10 +120034,14 @@ msgid "" "for carrying, it's very hard to see out of, and won't do anything to protect" " you if you're found." msgstr "" +"Es una caja grande hecha de un material marrón basado en papel. Puede " +"contener una cantidad de cosas o incluso te podés esconder adentro. " +"Considerando que solo tiene dos agujeros para trasladarla, si te metés es " +"muy difícil mirar para afuera y no te va a proteger nada si te encuentran." #: lang/json/furniture_from_json.py msgid "crumple!" -msgstr "" +msgstr "arrugado!" #: lang/json/furniture_from_json.py src/ballistics.cpp msgid "thud." @@ -116651,10 +120057,13 @@ msgid "" "A simple wooden cabinet with a column of short drawers. While intended for " "storing clothes, there's nothing stopping you from storing whatever fits." msgstr "" +"Es un simple armario de madera con una columna de cajones cortos. Aunque su " +"intención era contener ropa, no hay nada que evite que pongas cualquier cosa" +" que entre adentro." #: lang/json/furniture_from_json.py msgid "glass front cabinet" -msgstr "" +msgstr "armario con vidrio" #. ~ Description for glass front cabinet #: lang/json/furniture_from_json.py @@ -116663,6 +120072,9 @@ msgid "" "contents. Often used for displaying rare, visually pleasing, or otherwise " "valuable goods, it's odd that it doesn't have a lock." msgstr "" +"Es un armario alto de metal con una lámina de vidrio en la parte frontal " +"para poder ver su contenido. A menudo se usa para mostrar cosas raras, " +"visualmente agradables o de valor, y es raro que no tenga cerradura." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -116682,6 +120094,10 @@ msgid "" "ammunition. If you had something to listen close with and a hell of a lot " "of time, you could probably crack it." msgstr "" +"Es un armario grande y pesado con paredes gruesas de metal y una cerradura " +"de combinación rotativa, diseñado para guardar de manera segura cosas como " +"armas y sus modificaciones, y munición. Si tenés algo para poder escuchar de" +" cerca y un montón de tiempo, podrías intentar abrirla." #: lang/json/furniture_from_json.py msgid "screeching metal!" @@ -116698,6 +120114,9 @@ msgid "" "Unfortunately, the lock is completely broken, and short of some pretty " "serious machinery, you have no possible way of opening it." msgstr "" +"Es una caja fuerte pesada y resistente de metal para guardar armas y " +"municiones. Lamentablemente, la cerradura está totalmente rota y si no tenés" +" maquinaria serie, no vas a tener manera de abrirla." #: lang/json/furniture_from_json.py msgid "electronic gun safe" @@ -116711,6 +120130,10 @@ msgid "" "ammunition. If you had some way of hacking into it, you could probably " "crack it open." msgstr "" +"Es un armario grande y pesado con paredes gruesas de metal y un sistema de " +"cerradura electrónica, diseñado para guardar de manera segura cosas como " +"armas y sus modificaciones, y munición. Si tenés alguna manera de hackear el" +" sistema, podés intentar abrirla." #: lang/json/furniture_from_json.py msgid "locker" @@ -116722,6 +120145,7 @@ msgid "" "A tall sheet metal cabinet, useful for storing just about anything that'll " "fit." msgstr "" +"Es un armario alto de metal, útil para guardar cualquier cosa que entre." #: lang/json/furniture_from_json.py msgid "mailbox" @@ -116734,10 +120158,13 @@ msgid "" "deliveries. Although considering the circumstances, it will likely never " "see proper use again." msgstr "" +"Es una pequeña caja de metal sobre un poste de madera, diseñada para recibir" +" correo. Aunque considerando las circunstancias, nunca más va a servir para " +"esa función." #: lang/json/furniture_from_json.py msgid "clothing rail" -msgstr "" +msgstr "perchero burro" #. ~ Description for clothing rail #: lang/json/furniture_from_json.py @@ -116746,6 +120173,9 @@ msgid "" " Usually used in theater or retail environments, it's easy to use and quick" " to access." msgstr "" +"Es una estructura de metal con un grupo de ruedas usado para colgar grandes " +"cantidades de ropa. Comúnmente usado en teatros o locales de ropa, es fácil " +"de usar y de rápido acceso." #: lang/json/furniture_from_json.py msgid "display rack" @@ -116757,10 +120187,12 @@ msgid "" "A sheet metal shelving unit, with the storage surfaces angled in such a way " "as to show off the items stored." msgstr "" +"Son unos estantes de metal con las superficies en ángulo para poder ver lo " +"que contiene." #: lang/json/furniture_from_json.py msgid "wooden rack" -msgstr "" +msgstr "estante de madera" #. ~ Description for wooden rack #: lang/json/furniture_from_json.py @@ -116768,6 +120200,8 @@ msgid "" "A wooden shelving unit with angled storage surfaces designed to show off " "whatever is stored on it." msgstr "" +"Son unos estantes de madera con las superficies en ángulo, diseñada para " +"poder ver lo que contiene." #: lang/json/furniture_from_json.py msgid "coat rack" @@ -116779,6 +120213,8 @@ msgid "" "A tall wooden pole with a set of hooks used to store outdoor jackets and " "hats to allow easy access." msgstr "" +"Es un palo largo de madera con un grupo de ganchos usado para colgar " +"camperas y sombreros, y tenerlas de fácil acceso." #: lang/json/furniture_from_json.py msgid "recycle bin" @@ -116792,6 +120228,10 @@ msgid "" "factory, the drastic change in priorities as of late means that these may " "hold valuable materials." msgstr "" +"Es una papelera grande de plástico pintada de verde con el símbolo de " +"'reciclar' pintado. Aunque su intención era almacenar cosas desechadas para " +"ser procesadas nuevamente en una fábrica, el drástico cambio de prioridades " +"reciente significa que puede contener materiales valiosos." #: lang/json/furniture_from_json.py msgid "safe" @@ -116803,6 +120243,8 @@ msgid "" "A small, heavy, and near-unbreachable metal box with a rotary combination " "lock. Although, this isn't actually locked, just closed." msgstr "" +"Es una caja de metal chica, pesada y casi indestructible con una cerradura " +"de combinación rotativa. Aunque esta no está cerrada con la combinación." #. ~ Description for safe #: lang/json/furniture_from_json.py @@ -116811,6 +120253,9 @@ msgid "" "lock. With something to listen really closely and a hell of a lot of time, " "you might be able to crack it." msgstr "" +"Es una caja de metal chica, pesada y casi indestructible con una cerradura " +"de combinación rotativa. Con algo para escuchar de cerca y mucho tiempo, " +"podrías intentar abrirla." #: lang/json/furniture_from_json.py msgid "open safe" @@ -116822,6 +120267,9 @@ msgid "" "A small, heavy, and near-unbreachable metal box with a rotary combination " "lock, albeit significantly less secure with the door open." msgstr "" +"Es una caja de metal chica, pesada y casi indestructible con una cerradura " +"de combinación rotativa, aunque así con la puerta abierta no es muy segura " +"que digamos." #: lang/json/furniture_from_json.py msgid "trash can" @@ -116834,6 +120282,9 @@ msgid "" "Although, considering the circumstances, it might be worth seeing what's " "inside." msgstr "" +"Es una papelera de plástico para almacenar desechos para ser tiradas luego. " +"Aunque considerando las circunstancias, puede ser buena idea ver lo que " +"tiene adentro." #: lang/json/furniture_from_json.py msgid "wardrobe" @@ -116846,6 +120297,8 @@ msgid "" "closet. Could technically be used to store anything else that would fit, " "though." msgstr "" +"Es un armario muy grande de madera para guardar ropa, un ropero vertical. " +"Aunque, técnicamente, puede ser usado para guardar cualquier cosa que entre." #: lang/json/furniture_from_json.py msgid "filing cabinet" @@ -116857,10 +120310,12 @@ msgid "" "A rack of metal drawers designed to hold various files and paperwork. " "Paperwork that has more than likely lost all worth or value by now." msgstr "" +"Son estantes de cajones de metal diseñados para contener varios archivos y " +"papeles. Papeles que es bastante seguro que ya han perdido todo su valor." #: lang/json/furniture_from_json.py msgid "utility shelf" -msgstr "" +msgstr "estantería de metal" #. ~ Description for utility shelf #: lang/json/furniture_from_json.py @@ -116868,16 +120323,21 @@ msgid "" "A simple heavy-duty plastic and metal shelving unit, intended to store tools" " and materials for easy access to workers." msgstr "" +"Son unos simples estantes de plástico resistente y metal, con la intención " +"de almacenar herramientas y materiales que queden de fácil acceso para los " +"trabajadores." #: lang/json/furniture_from_json.py msgid "warehouse shelf" -msgstr "" +msgstr "estantería de depósito" #. ~ Description for warehouse shelf #: lang/json/furniture_from_json.py msgid "" "A huge, sturdy steel shelf for storing pallets of crates in warehouses." msgstr "" +"Son unos enormes estantes resistentes de metal para almacenar palés de cajas" +" en los depósitos." #: lang/json/furniture_from_json.py msgid "wooden keg" @@ -116889,6 +120349,8 @@ msgid "" "A large standing wooden barrel, completely watertight. Good for storing " "liquids of all kinds or fermenting alcohol." msgstr "" +"Es un tambor grande de madera completamente hermético. Es útil para " +"almacenar líquidos de toda clase o para fermentar alcohol." #: lang/json/furniture_from_json.py msgid "display case" @@ -116901,6 +120363,9 @@ msgid "" " Useful for storing valuable things while still showing them off. Not " "actually as secure as it looks, as the display windows are easily broken." msgstr "" +"Es una vitrina de madera que te llega a la cintura, con paneles de vidrio en" +" la parte superior. Es útil para guardar cosas de valor y poder mostrarlas. " +"No es muy segura como parece, porque el vidrio se puede romper fácilmente." #: lang/json/furniture_from_json.py msgid "broken display case" @@ -116914,6 +120379,9 @@ msgid "" "if the glass hadn't been shattered. Careful not to cut yourself when " "looting." msgstr "" +"Es una vitrina de madera que te llega a la cintura, con paneles de vidrio en" +" la parte superior. Podría ser útil para guardar cosas de valor y poder " +"mostrarlas, si el vidrio no estuviera roto. Tené cuidado de no cortarte." #: lang/json/furniture_from_json.py msgid "standing tank" @@ -116924,6 +120392,8 @@ msgstr "Tanque vertical" msgid "" "A huge metal tank that can be used to safely store large amounts of liquid." msgstr "" +"Es un tanque enorme de metal que puede contener de manera segura una gran " +"cantidad de líquido." #: lang/json/furniture_from_json.py msgid "dumpster" @@ -116936,10 +120406,13 @@ msgid "" "city's waste management any time soon. Despite the unpleasant nature of " "climbing inside, it could make for a viable hiding spot." msgstr "" +"Es un contenedor grande de metal que ya no creo que pase el basurero " +"vaciarlos. A pesar de la desagradable naturaleza de meterse adentro, puede " +"ser un escondite útil." #: lang/json/furniture_from_json.py msgid "butter churn" -msgstr "" +msgstr "mantequera" #. ~ Description for butter churn #: lang/json/furniture_from_json.py @@ -116947,6 +120420,9 @@ msgid "" "A metal tube with a built-in mixer for making butter. Rather than needing " "electricity, it is pedal-driven, allowing use without power." msgstr "" +"Es un tubo de metal con una mezcladora incluida para hacer manteca. En lugar" +" de necesitar alimentación eléctrica, tiene un pedal que te permite " +"utilizarla sin electricidad." #: lang/json/furniture_from_json.py msgid "counter" @@ -116970,7 +120446,7 @@ msgstr "Para guardar tus vasos." #: lang/json/furniture_from_json.py msgid "closed counter gate" -msgstr "" +msgstr "puerta mostrador cerrada" #. ~ Description for closed counter gate #. ~ Description for open counter gate @@ -116979,10 +120455,12 @@ msgid "" "A commercial quality swinging door made of wood that allows passage behind " "counters." msgstr "" +"Es una puerta vaivén comercial hecha de madera que permite pasar detrás de " +"los mostradores." #: lang/json/furniture_from_json.py msgid "open counter gate" -msgstr "" +msgstr "puerta mostrador abierta" #: lang/json/furniture_from_json.py msgid "desk" @@ -116991,7 +120469,7 @@ msgstr "escritorio" #. ~ Description for desk #: lang/json/furniture_from_json.py msgid "Sit down at it or work on it." -msgstr "" +msgstr "Sentate en él o trabajá en él." #. ~ Description for leather tarp #: lang/json/furniture_from_json.py @@ -117005,7 +120483,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "plastic groundsheet" -msgstr "" +msgstr "lona plástica" #. ~ Description for plastic groundsheet #: lang/json/furniture_from_json.py @@ -117013,14 +120491,16 @@ msgid "" "A large sheet of thick plastic has been tossed on the ground here. It would" " be a useful place to do some butchery, perhaps." msgstr "" +"Es una gran lámina de plástico grueso que ha sido tirada en el suelo. Podría" +" ser útil para carnear algo, tal vez." #: lang/json/furniture_from_json.py msgid "whuff!" -msgstr "" +msgstr "whuff!" #: lang/json/furniture_from_json.py msgid "crinkle." -msgstr "" +msgstr "ondulado." #. ~ Description for fiber mat #: lang/json/furniture_from_json.py @@ -117039,6 +120519,8 @@ msgid "" "Small metal folding table, ideal for off-road trips into the wild. Can be " "used as a workbench in a pinch." msgstr "" +"Es una pequeña mesa metálica plegable, ideal para viajes por la naturaleza. " +"Puede ser usada como mesa de trabajo, si es necesario." #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "table" @@ -117052,7 +120534,7 @@ msgstr "¡Sentate cuando comés!" #. ~ Description for table #: lang/json/furniture_from_json.py msgid "a low table for livingrooms." -msgstr "" +msgstr "es una mesa para livings." #: lang/json/furniture_from_json.py msgid "tatami mat" @@ -117064,6 +120546,8 @@ msgid "" "A tatami is a type of mat used as a flooring material in traditional " "Japanese-style rooms." msgstr "" +"El tatami es un tipo de alfombra que se usa como piso en las habitaciones de" +" estilo tradicional japonés." #: lang/json/furniture_from_json.py msgid "pillow fort" @@ -117073,6 +120557,8 @@ msgstr "fuerte de almohadas" #: lang/json/furniture_from_json.py msgid "A comfy place to hide from the world. Not very defensible, though." msgstr "" +"Es un lugar cómodo para esconderse del mundo. No muy defensivo que digamos, " +"eso sí." #: lang/json/furniture_from_json.py msgid "paf!" @@ -117080,7 +120566,7 @@ msgstr "paf!" #: lang/json/furniture_from_json.py msgid "cardboard fort" -msgstr "" +msgstr "fuerte de cartón" #. ~ Description for cardboard fort #: lang/json/furniture_from_json.py @@ -117088,10 +120574,12 @@ msgid "" "A fort built by tipping a cardboard box on its side, lining it with " "blankets, and partly weather sealing it with a plastic sheet." msgstr "" +"Es un fuerte construido apilando cajas de cartón, cubriéndolas con sábanas y" +" haciéndolas un poco herméticas con una lámina de plástico." #: lang/json/furniture_from_json.py msgid "cardboard wall" -msgstr "" +msgstr "pared de cartón" #. ~ Description for cardboard wall #: lang/json/furniture_from_json.py @@ -117099,36 +120587,38 @@ msgid "" "This is a pile of cardboard boxes that have been filled with rags and junk " "and stacked together like bricks to form a wall." msgstr "" +"Es una pila de cajas de cartón que han sido llenadas con trapos y basura " +"apiladas como ladrillos para armar una pared." #: lang/json/furniture_from_json.py msgid "beaded curtain" -msgstr "" +msgstr "cortina de cuentas" #. ~ Description for beaded curtain #: lang/json/furniture_from_json.py msgid "This beaded curtain could be pulled aside." -msgstr "" +msgstr "Esta cortina de cuentas puede ser corrida." #: lang/json/furniture_from_json.py msgid "clickity clack… clack… clack" -msgstr "" +msgstr "clickity clack… clack… clack" #: lang/json/furniture_from_json.py msgid "clickity clack… clack" -msgstr "" +msgstr "clickity clack… clack" #: lang/json/furniture_from_json.py msgid "open beaded curtain" -msgstr "" +msgstr "cortina de cuentas abierta" #. ~ Description for open beaded curtain #: lang/json/furniture_from_json.py msgid "This beaded curtain has been pulled aside." -msgstr "" +msgstr "Esta cortina de cuentas ha sido corrida y está abierta." #: lang/json/furniture_from_json.py msgid "clickity clack… clack… clack!" -msgstr "" +msgstr "clickity clack… clack… clack!" #: lang/json/furniture_from_json.py msgid "canvas floor" @@ -117140,6 +120630,8 @@ msgid "" "Flooring made out of stretched, waterproof cloth. Helps keep the dirt out " "of the tent." msgstr "" +"Es un piso hecho con lona hermética estirada. Ayuda a mantener la mugre " +"afuera de la carpa." #: lang/json/furniture_from_json.py msgid "canvas wall" @@ -117148,7 +120640,7 @@ msgstr "pared de tela" #. ~ Description for canvas wall #: lang/json/furniture_from_json.py msgid "A wall made of stretched, waterproof cloth." -msgstr "" +msgstr "Es una pared hecha de lona hermética estirada." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "slap!" @@ -117157,7 +120649,7 @@ msgstr "¡slap!" #. ~ Description for canvas wall #: lang/json/furniture_from_json.py msgid "A wall made of stretched, heavy-duty, waterproof cloth." -msgstr "" +msgstr "Es una pared hecha de lona resistente hermética estirada." #: lang/json/furniture_from_json.py msgid "canvas flap" @@ -117166,7 +120658,7 @@ msgstr "solapa de tela" #. ~ Description for canvas flap #: lang/json/furniture_from_json.py msgid "This canvas flap door could be pulled aside." -msgstr "" +msgstr "Esta puerta de lona puede ser corrida." #: lang/json/furniture_from_json.py msgid "open canvas flap" @@ -117175,17 +120667,17 @@ msgstr "solapa abierta de tela" #. ~ Description for open canvas flap #: lang/json/furniture_from_json.py msgid "This canvas flap door has been pulled aside." -msgstr "" +msgstr "Esta puerta de lona ha sido corrida y está abierta." #. ~ Description for canvas flap #: lang/json/furniture_from_json.py msgid "This heavy canvas flap door could be pulled aside." -msgstr "" +msgstr "Esta puerta de lona resistente puede ser corrida." #. ~ Description for open canvas flap #: lang/json/furniture_from_json.py msgid "This heavy canvas flap door has been pulled aside." -msgstr "" +msgstr "Esta puerta de lona resistente ha sido corrida y está abierta." #: lang/json/furniture_from_json.py msgid "groundsheet" @@ -117194,12 +120686,12 @@ msgstr "lona impermeable" #. ~ Description for groundsheet #: lang/json/furniture_from_json.py msgid "This plastic groundsheet could keep you dry." -msgstr "" +msgstr "Esta lona plástica puede mantenerte seco." #. ~ Description for groundsheet #: lang/json/furniture_from_json.py msgid "This large plastic groundsheet could keep you dry." -msgstr "" +msgstr "Esta lona plástica grande puede mantenerte seco." #. ~ Description for groundsheet #: lang/json/furniture_from_json.py @@ -117207,6 +120699,8 @@ msgid "" "This plastic government-issue groundsheet could keep you dry, but was made " "by the lowest bidder." msgstr "" +"Esta lona plástica brindada por el estado puede mantenerte seco, pero fue " +"hecha por el licitador más barato." #: lang/json/furniture_from_json.py msgid "animalskin wall" @@ -117225,7 +120719,7 @@ msgstr "solapa de piel de animal" #. ~ Description for animalskin flap #: lang/json/furniture_from_json.py msgid "This animal skin flap could be pulled aside." -msgstr "" +msgstr "Esta solapa de piel de animal puede ser corrida." #: lang/json/furniture_from_json.py msgid "open animalskin flap" @@ -117234,7 +120728,7 @@ msgstr "solapa abierta de piel de animal" #. ~ Description for open animalskin flap #: lang/json/furniture_from_json.py msgid "This animal skin flap has been pulled aside." -msgstr "" +msgstr "Esta solapa de piel de animal ha sido corrida y está abierta." #: lang/json/furniture_from_json.py msgid "animalskin floor" @@ -117243,7 +120737,7 @@ msgstr "piso de piel de animal" #. ~ Description for animalskin floor #: lang/json/furniture_from_json.py msgid "This animal skin groundsheet could keep you dry." -msgstr "" +msgstr "Esta lona de piel de animal puede mantenerte seco." #: lang/json/furniture_from_json.py msgid "pile of rubble" @@ -117265,7 +120759,7 @@ msgstr "pila de escombros de piedra" #. ~ Description for pile of rocky rubble #: lang/json/furniture_from_json.py msgid "Pile of rocks. Useless?" -msgstr "" +msgstr "Es una pila de piedras. ¿Sirve para algo?" #: lang/json/furniture_from_json.py msgid "pile of trashy rubble" @@ -117276,6 +120770,8 @@ msgstr "pila de escombros de basura" msgid "" "Trash topped with dirt and grass, it smells gross, but another man's trash…" msgstr "" +"Es basura con tierra y pasto arriba con olor desagradable, pero lo que para " +"un hombre es basura…" #: lang/json/furniture_from_json.py msgid "metal wreckage" @@ -117332,7 +120828,7 @@ msgstr "¿Cómo vas a hacer para mover esto?" #: lang/json/furniture_from_json.py msgid "street light" -msgstr "" +msgstr "farol de calle" #. ~ Description for street light #: lang/json/furniture_from_json.py @@ -117340,10 +120836,12 @@ msgid "" "Raised source of light which used to illuminate streets and their " "surrounding area, but it's useless without electricity." msgstr "" +"Es una fuente de luz elevada que antes iluminaba las calles y sus " +"alrededores, pero ahora sin electricidad no sirve para nada." #: lang/json/furniture_from_json.py msgid "traffic light" -msgstr "" +msgstr "semáforo" #. ~ Description for traffic light #: lang/json/furniture_from_json.py @@ -117351,10 +120849,13 @@ msgid "" "Signaling device positioned at road intersections and pedestrian crossings " "to control flows of traffic, but it's useless without electricity." msgstr "" +"Es un dispositivo de señalización puesto en las intersecciones de las calles" +" y pasos peatonales para controlar el flujo de tránsito, pero sin " +"electricidad no sirve para nada." #: lang/json/furniture_from_json.py msgid "utility pole" -msgstr "" +msgstr "poste de luz" #. ~ Description for utility pole #: lang/json/furniture_from_json.py @@ -117362,6 +120863,8 @@ msgid "" "A long wooden post which used to support overhead power lines and other " "public utilities, but it doesn't work anymore." msgstr "" +"Es un poste largo de madera que se usaba para sostener los cables de " +"electricidad y otros servicios, pero ahora no sirve de mucho." #: lang/json/furniture_from_json.py msgid "forge" @@ -117423,14 +120926,12 @@ msgid "" "An arc furnace designed to burn a powdery mix of coke and limestone to " "create calcium carbide." msgstr "" +"Es un horno de arco diseñado para quemar un polvo mezcla de coque y cal para" +" crear carburo de calcio." #: lang/json/furniture_from_json.py msgid "filled arc furnace" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "soporte para ahumar" +msgstr "horno de arco lleno" #. ~ Description for smoking rack #. ~ Description for metal smoking rack @@ -117439,6 +120940,9 @@ msgid "" "A special rack designed to smoke food for better preservation and taste. " "Works as a charcoal smoker in crafting recipes." msgstr "" +"Es un soporte especial diseñado para ahumar comida para que se conserve más " +"y tenga mejor sabor. Funciona como un ahumador de carbón en las " +"fabricaciones." #: lang/json/furniture_from_json.py msgid "active smoking rack" @@ -117455,7 +120959,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "active metal smoking rack" -msgstr "" +msgstr "soporte metálico para ahumar activo" #. ~ Description for active metal smoking rack #: lang/json/furniture_from_json.py @@ -117475,6 +120979,9 @@ msgid "" "Metalworking station made of rock, typically used in combination with an " "anvil. Works as a charcoal forge in crafting recipes." msgstr "" +"Es una estación hecha de piedra para trabajar los metales, comúnmente " +"utilizada en combinación con un yunque. Funciona como una forja de carbón en" +" las fabricaciones." #: lang/json/furniture_from_json.py msgid "clay kiln" @@ -117492,10 +120999,12 @@ msgid "" "A short, foldable ladder. Can help you climb to a rooftop, or maybe slow " "something down." msgstr "" +"Es una silla corta y plegable. Te puede ayudar a subirte a un techo, o para " +"frenar algo." #: lang/json/furniture_from_json.py msgid "electric arc furnace" -msgstr "" +msgstr "horno de arco eléctrico" #. ~ Description for electric arc furnace #: lang/json/furniture_from_json.py @@ -117504,10 +121013,13 @@ msgid "" "heating things to extreme temperatures as part of industrial fabrication " "processes." msgstr "" +"No es la clase de horno con el que calentás tu casa, es un dispositivo para " +"calentar cosas a temperaturas extremas como parte de procesos de fabricación" +" industriales." #: lang/json/furniture_from_json.py msgid "drill press" -msgstr "" +msgstr "taladro de banco" #. ~ Description for drill press #: lang/json/furniture_from_json.py @@ -117516,10 +121028,13 @@ msgid "" "Useful in all kinds of projects from industrial fabrication to home " "woodworking." msgstr "" +"Es un taladro potente montado en un soporte que te permite bajarlo de manera" +" precisa. Útil para toda clase de proyectos, desde fabricaciones " +"industriales hasta trabajos hogareños en madera." #: lang/json/furniture_from_json.py msgid "tablesaw" -msgstr "" +msgstr "sierra circular de banco" #. ~ Description for tablesaw #: lang/json/furniture_from_json.py @@ -117527,10 +121042,12 @@ msgid "" "A rotating saw blade set into a large flat table, for making straight " "measured cuts. One of the key tools in a carpenter's arsenal." msgstr "" +"Es una cuchilla rotativa puesta en una mesa grande para hacer cortes rectos." +" Una herramienta clave en el arsenal del carpintero." #: lang/json/furniture_from_json.py msgid "mitre saw" -msgstr "" +msgstr "sierra ingletadora" #. ~ Description for mitre saw #: lang/json/furniture_from_json.py @@ -117538,10 +121055,13 @@ msgid "" "A circular saw blade on an arm that can slide and rotate in several " "directions, this is a staple tool for nearly any carpentry." msgstr "" +"Es una sierra circular puesta en un brazo que se puede deslizar y rotar en " +"varias direcciones. Es una herramienta esencial para casi todo trabajo de " +"carpintería." #: lang/json/furniture_from_json.py msgid "bandsaw" -msgstr "" +msgstr "sierra de cinta" #. ~ Description for bandsaw #: lang/json/furniture_from_json.py @@ -117549,10 +121069,12 @@ msgid "" "A ribbonlike sawblade runs in a single direction in this tool, allowing " "precise cuts at almost any angle." msgstr "" +"Es una sierra en forma de cinta que funciona en una sola dirección, lo que " +"permite realizar cortes precisos en casi cualquier ángulo." #: lang/json/furniture_from_json.py msgid "router table" -msgstr "" +msgstr "mesa de fresadora" #. ~ Description for router table #: lang/json/furniture_from_json.py @@ -117560,10 +121082,12 @@ msgid "" "This table has an inset router, a rotating motor with an exchangeable blade " "head for cutting specific profiles and grooves and stuff." msgstr "" +"Esta mesa tiene un router añadido, un motor rotativo con una cuchilla " +"intercambiable para cortar perfiles específicos y hacer ranuras." #: lang/json/furniture_from_json.py msgid "planer" -msgstr "" +msgstr "garlopa" #. ~ Description for planer #: lang/json/furniture_from_json.py @@ -117572,10 +121096,13 @@ msgid "" "specific width. Particularly great if working with raw lumber stock, but " "also good just for shaving wood down to size." msgstr "" +"Es una herramienta pesada que cortará y alisará una tabla a un ancho " +"específico. Particularmente útil cuando se trabaja con troncos pero también " +"sirve para recortar madera hasta lograr el tamaño necesario." #: lang/json/furniture_from_json.py msgid "jointer" -msgstr "" +msgstr "garlopa mecánica" #. ~ Description for jointer #: lang/json/furniture_from_json.py @@ -117583,6 +121110,8 @@ msgid "" "A table-shaped tool with a rotating blade that will cut down, smooth out, " "and square off a board to make it very smooth and nice indeed." msgstr "" +"Es una herramienta con forma de mesa y una sierra rotativa que cortará, " +"alisará o cuadrará una tabla para hacerla bien lisa y agradable." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "hydraulic press" @@ -117594,10 +121123,13 @@ msgid "" "If you really want to squash something a lot, this would be exactly the " "right industrial tool for you. If, you know, it had power." msgstr "" +"Si te gusta mucho apretar cosas, esto sería la herramienta industrial " +"perfecta para vos. Eso si, ya sabés, tuvieras acceso a alimentación " +"eléctrica." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "power lathe" -msgstr "torno eléctrico" +msgstr "torno" #. ~ Description for power lathe #: lang/json/furniture_from_json.py @@ -117605,10 +121137,12 @@ msgid "" "An industrial-grade lathe, for turning chunks of metal and other hard things" " into round chunks of metal and other hard things." msgstr "" +"Es un torno industrial para convertir pedazos de metal y cosas rígidas en " +"otros pedazos de metal o cosas rígidas." #: lang/json/furniture_from_json.py msgid "air compressor" -msgstr "" +msgstr "compresor" #. ~ Description for air compressor #: lang/json/furniture_from_json.py @@ -117616,6 +121150,8 @@ msgid "" "This durable tank is topped with a motor that will cram as much air into the" " tank as possible." msgstr "" +"Es un tanque resistente con un motor que meterá en el tanque tanto aire como" +" pueda." #: lang/json/furniture_from_json.py msgid "fermenting vat" @@ -117654,22 +121190,26 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "hanging meathook" -msgstr "" +msgstr "gancho para carne" #. ~ Description for hanging meathook #: lang/json/furniture_from_json.py msgid "A hefty hook suspended from a chain for stringing up corpses." msgstr "" +"Es un gancho pesado colgado de una cadena que se usa para destripar " +"cadáveres." #. ~ Description for wind mill #: lang/json/furniture_from_json.py msgid "" "A small wind-powered mill that can convert starchy products into flour." msgstr "" +"Es un molino pequeño que funciona con viento y puede convertir productos " +"almidonados en harina." #: lang/json/furniture_from_json.py msgid "active wind mill" -msgstr "" +msgstr "molino de viento activo" #. ~ Description for active wind mill #: lang/json/furniture_from_json.py @@ -117677,16 +121217,20 @@ msgid "" "A small wind-powered mill that can convert starchy products into flour. Its" " brake has been removed and it is turning." msgstr "" +"Es un molino pequeño que funciona con viento y puede convertir productos " +"almidonados en harina. Se le ha levantado el freno y está girando." #. ~ Description for water mill #: lang/json/furniture_from_json.py msgid "" "A small water-powered mill that can convert starchy products into flour." msgstr "" +"Es un molino pequeño que funciona con agua y puede convertir productos " +"almidonados en harina." #: lang/json/furniture_from_json.py msgid "active water mill" -msgstr "" +msgstr "molino de agua activo" #. ~ Description for active water mill #: lang/json/furniture_from_json.py @@ -117694,25 +121238,27 @@ msgid "" "A small water-powered mill that can convert starchy products into flour. " "Its brake has been removed and it is turning." msgstr "" +"Es un molino pequeño que funciona con agua y puede convertir productos " +"almidonados en harina. Se le ha levantado el freno y está girando." #: lang/json/furniture_from_json.py msgid "automated gas console" -msgstr "consola automática de gases" +msgstr "consola automática de gas" #. ~ Description for automated gas console #: lang/json/furniture_from_json.py msgid "Automated gas flow control console." -msgstr "" +msgstr "Es una consola automática de control de gas." #: lang/json/furniture_from_json.py msgid "broken automated gas console" -msgstr "consola automática de gases rota" +msgstr "consola automática de gas rota" #. ~ Description for broken automated gas console #: lang/json/furniture_from_json.py msgid "" "Automated gas flow control console. Broken. This is not a good thing." -msgstr "" +msgstr "Es una consola automática de control de gas. Rota. No es algo bueno." #: lang/json/furniture_from_json.py msgid "reinforced vending machine" @@ -117724,6 +121270,8 @@ msgid "" "A bit tougher to crack open than regular vending machines. That just makes " "it all the sweeter a target, doesn't it?" msgstr "" +"Es un poco más duro de abrir que las máquinas expendedoras comunes. Eso lo " +"hace un objetivo más apetecible, ¿no?" #: lang/json/furniture_from_json.py msgid "vending machine" @@ -117744,10 +121292,12 @@ msgid "" "Ponder if you could buy stuff, as it's broken. Maybe if you broke it more, " "you wouldn't need to pay at all!" msgstr "" +"Considerás si podrás comprar algo acá, porque está rota. Por ahí si la " +"rompés un poco más, ¡no vas a necesitar pagar nada!" #: lang/json/furniture_from_json.py msgid "atomic butter churn on a stand" -msgstr "" +msgstr "mantequeras atómicas con pie" #. ~ Description for atomic butter churn on a stand #: lang/json/furniture_from_json.py @@ -117755,6 +121305,9 @@ msgid "" "The Rivtech Atomic Butter Churn in deployed state. It hums menacingly. " "Ready to add raw milk and salt. It will churn till the earth is a cinder." msgstr "" +"Es la Mantequera Atómica Rivtech desplegada. Vibra de manera amenazante. " +"Está lista para ponerle leche cruda y sal. La revolverá hasta que la tierra " +"sea ceniza." #. ~ Description for vehicle refrigerator #: lang/json/furniture_from_json.py @@ -117762,6 +121315,8 @@ msgid "" "This fridge has been converted to run off of a vehicle's power supply. " "You'll need to take it down first." msgstr "" +"Esta heladera ha sido convertida para funcionar con la energía de un " +"vehículo. Primero vas a necesitar desmontarla." #. ~ Description for vehicle freezer #: lang/json/furniture_from_json.py @@ -117769,15 +121324,106 @@ msgid "" "This fridge has been further refurbished, and runs at a much lower " "temperature. You'll need to take it down first." msgstr "" +"Esta heladera ha sido renovada para funcionar a una temperatura mucho menor." +" Primero vas a necesitar desmontarla." + +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "cápsula de descanso" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" +"Es una cápsula para dormir controlada por el clima. Una manera fácil de " +"reducir los costos de energía en los ambientes urbanos densos." + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "cápsula de criogenia" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" +"Es una cápsula para dormir por períodos largos. Las cápsulas de criogenia " +"son usadas mayormente por personas esperando órganos o criminales evitando " +"el revuelo generado por su crimen." + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "Biolaboratorio CRISPR" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" +"Es un dispositivo cuadrado de palancas, goteros y pipetas. Era utilizado " +"antes del Cataclismo para hacer experimentos en edición de genoma." + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "impresora 3D" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" +"Esta caja era utilizada para hacer prototipos rápidos de productos y para " +"propósitos generales de entretenimiento en masa." + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "colocador de red neural" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" +"Este dispositivo parece una mezcla entre una especie de equipo pesadillesco " +"de dentista y una llave crique montada en un deslizador que la permite caer " +"de manera precisa. Es útil para esos proyectos que requieren poner objetos " +"delicados en lugares difíciles de alcanzar." + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "sierra monomolecular" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" +"Un alambre del tamaño de un cortaqueso que funciona en una sola dirección en" +" esta herramienta, le permite realizar cortes atómicamente precisos en casi " +"cualquier ángulo. Incluso sin energía eléctrica da una distorsión visual de " +"unos milímetros evitando que pierdas una mano. Este dispositivo es imposible" +" de desarmar sin que el alambre se destroce." #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" -msgstr "" +msgstr "¡Vestite!" #: lang/json/furniture_from_json.py msgid "poppy bush" -msgstr "" +msgstr "arbusto de amapola" #. ~ Description for poppy bush #: lang/json/furniture_from_json.py @@ -117788,10 +121434,15 @@ msgid "" " due to its similar medicinal properties. It exudes a potent, sleep " "inducing aroma." msgstr "" +"Es una especie invasiva traída a la Tierra por los invasores y que se " +"encuentra bastante a su gusto. Sus hojas espinosas se retuercen haciéndola " +"parecer más a un arbusto de selva que a una amapola convencional, excepto " +"por sus pétalos rojos, pero se llama así debido a sus similares propiedades " +"medicinales. Expulsa un aroma potente que induce al sueño." #: lang/json/furniture_from_json.py msgid "Translocator Gate" -msgstr "" +msgstr "Puerta de Translocador" #. ~ Description for Translocator Gate #: lang/json/furniture_from_json.py @@ -117799,10 +121450,12 @@ msgid "" "A gate for translocation. Cast the translocation spell or use a " "translocator to choose this gate as a destination." msgstr "" +"Es una puerta para translocación. Lanzá un hechizo de translocación o usá un" +" translocador para elegir esta puerta como destino." #: lang/json/furniture_from_json.py msgid "Magic Circle" -msgstr "" +msgstr "Círculo Mágico" #. ~ Description for Magic Circle #: lang/json/furniture_from_json.py @@ -117810,19 +121463,21 @@ msgid "" "This is a rough magic circle, carved into the ground and decorated with " "blood, candles, and other small knick-knacks." msgstr "" +"Es un círculo mágico irregular, tallado en el suelo y decorado con sangre, " +"velas y otras pequeñas chucherías." #: lang/json/furniture_from_json.py msgid "large glowing boulder" -msgstr "" +msgstr "roca brillante grande" #. ~ Description for large glowing boulder #: lang/json/furniture_from_json.py msgid "Something about this doesn't look right." -msgstr "" +msgstr "Hay algo con esto que no parece adecuado." #: lang/json/furniture_from_json.py msgid "enchanter's workbench" -msgstr "" +msgstr "mesa de trabajo de hechicero" #. ~ Description for enchanter's workbench #: lang/json/furniture_from_json.py @@ -117831,10 +121486,14 @@ msgid "" " alchemical spills and burns. It has wired in electrical and gas fittings, " "and has been decorated with several protection runes - mostly ornamental." msgstr "" +"Es una mesada de resina que puede resistir la mayoría de salpicaduras y " +"quemaduras alquímicas, sobre un armario de roble decorado. Tiene conectado " +"equipamiento eléctrico y de gas y ha sido decorada con runas de protección -" +" la mayoría solo decorativas." #: lang/json/furniture_from_json.py msgid "standing alembic" -msgstr "" +msgstr "alambique de pie" #. ~ Description for standing alembic #: lang/json/furniture_from_json.py @@ -117843,10 +121502,13 @@ msgid "" "consists of a copper pot with rising spires of twisted glass draining into " "various removable bottles." msgstr "" +"Es un alambique grande de vidrio y cobre usado para destilar brebajes " +"alquímicos. Consiste en una olla de cobre con espirales de vidrio curvado " +"que se conectan a varias botellas extraíbles." #: lang/json/furniture_from_json.py msgid "orrery" -msgstr "" +msgstr "planetario" #. ~ Description for orrery #: lang/json/furniture_from_json.py @@ -117856,10 +121518,15 @@ msgid "" "turn of a crank. This more modern version also has bluetooth and could have" " been controlled with an app, if there was any power anymore." msgstr "" +"Es un hermoso modelo del sistema solar, que no está hecho en escala. Es un " +"grupo complejo de engranajes que permite movimientos relativos a los " +"planetas para ser estudiados al mover una palanca. Esta versión más moderna " +"también tiene bluetooth y puede ser controlado por una aplicación, si es que" +" tuviera alimentación eléctrica." #: lang/json/furniture_from_json.py msgid "huge mana crystal" -msgstr "" +msgstr "cristal enorme de maná" #. ~ Description for huge mana crystal #: lang/json/furniture_from_json.py @@ -117868,18 +121535,21 @@ msgid "" "like a weed. It pulses with a delicate yellow energy, occasionally bursting" " with flashes of pent-up light." msgstr "" +"Es un cristal de maná que sale del suelo como si hubiera brotado como " +"hierba. Late con una energía de un amarillo suave y ocasionalmente libera " +"destellos de luz reprimidos." #: lang/json/furniture_from_json.py msgid "glass shattering!" -msgstr "" +msgstr "vidrio rompiéndose!" #: lang/json/furniture_from_json.py msgid "mana crackling!" -msgstr "" +msgstr "maná chisporroteando!" #: lang/json/furniture_from_json.py msgid "stone altar" -msgstr "" +msgstr "altar de piedra" #. ~ Description for stone altar #: lang/json/furniture_from_json.py @@ -117887,6 +121557,8 @@ msgid "" "This is big stone altar. Most commonly used in morally questionable " "rituals." msgstr "" +"Es un altar grande de piedra. Más comúnmente utilizado en rituales de moral " +"cuestionable." #. ~ Description for demon forge #: lang/json/furniture_from_json.py @@ -117895,6 +121567,10 @@ msgid "" " for flames. Custom made to withstand the heat from alumentum, this forge " "can resmelt the magical metals into their workable, ingot form." msgstr "" +"Es una forja hecha con la quitina de una enorme araña roja que tiene un " +"penacho de llamas. Está hecho para soportar el calor del alumentum, esta " +"forja puede volver a fundir metales mágicos y darle forma de lingote para " +"trabajarlos." #: lang/json/furniture_from_json.py msgid "tank trap" @@ -117906,12 +121582,16 @@ msgid "" "Thick ropes of mycal matter have covered the ground here completely. It's " "soft to the touch, but you sink into it, making moving across it difficult." msgstr "" +"Unas sogas de materia mycus han cubierto el suelo completamente acá. Es " +"suave al tacto pero te hundís, haciendo difícil pasar por ahí." #. ~ Description for fungal clump #: lang/json/furniture_from_json.py msgid "" "Alien mold and stems mingle tightly here, creating a sort of fungal bush." msgstr "" +"Tallos y moho alienígenas se mezclan apretados acá, creando una especie de " +"arbusto fúngico." #. ~ 'close' action message of some gate object. #: lang/json/gates_from_json.py @@ -117931,7 +121611,7 @@ msgstr "¡La verja está abierta!" #. ~ 'pull' action message of some gate object. #: lang/json/gates_from_json.py msgid "You turn the handle…" -msgstr "" +msgstr "Girás la manija…" #. ~ 'close' action message of some gate object. #: lang/json/gates_from_json.py @@ -117951,7 +121631,7 @@ msgstr "¡Las puertas del granero se abren!" #. ~ 'pull' action message of some gate object. #: lang/json/gates_from_json.py msgid "You pull the rope…" -msgstr "" +msgstr "Tirás de la soga…" #. ~ 'close' action message of some gate object. #: lang/json/gates_from_json.py @@ -117986,7 +121666,7 @@ msgstr "¡La puerta se levanta!" #. ~ 'pull' action message of some gate object. #: lang/json/gates_from_json.py msgid "You throw the lever…" -msgstr "" +msgstr "Tirás de la palanca…" #. ~ 'close' action message of some gate object. #: lang/json/gates_from_json.py @@ -118101,8 +121781,8 @@ msgstr "Tirás de la palanca..." #: lang/json/gun_from_json.py msgid "acid dart volley" msgid_plural "acid dart volleys" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "descarga de dardo ácido" +msgstr[1] "descargas de dardo ácido" #: lang/json/gun_from_json.py msgid "Fake gun that fires acid globs." @@ -118114,7 +121794,8 @@ msgstr "Es una pistola falsa que dispara un globo ácido." msgid "auto" msgstr "auto" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "rifle" @@ -118122,8 +121803,8 @@ msgstr "rifle" #: lang/json/gun_from_json.py msgid "acid dart gun" msgid_plural "acid dart guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arma de dardo ácido" +msgstr[1] "armas de dardo ácido" #: lang/json/gun_from_json.py msgid "pipe combination gun" @@ -118141,8 +121822,7 @@ msgstr "" ".30-06 y los otros dos son para cartuchos de escopeta. Está hecho de caños y" " partes extraídas de una escopeta de doble caño." -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "escopeta" @@ -118158,12 +121838,14 @@ msgid "" "A homemade rifle. It is simply a pipe attached to a stock, with a hammer to" " strike the single round it holds." msgstr "" +"Es un rifle hecho en casa. Es simplemente un caño con una culata y un " +"percutor para golpear la bala que contiene." #: lang/json/gun_from_json.py msgid "handmade heavy carbine" msgid_plural "handmade heavy carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina pesada casera" +msgstr[1] "carabinas pesadas caseras" #: lang/json/gun_from_json.py msgid "" @@ -118172,6 +121854,10 @@ msgid "" "as being able to accept G3 compatible magazines, and chambering the more " "powerful .308 rounds." msgstr "" +"Es un rifle casero de ánima lisa de acción de palanca con cargador. Aunque " +"sigue siendo un primitivo caño con una tabla, se le han hecho algunas " +"pequeñas mejoras como ser capaz de utilizar cargadores compatibles con G3 y " +"usar balas del potente calibre .308." #: lang/json/gun_from_json.py msgid "handmade carbine" @@ -118185,6 +121871,9 @@ msgid "" "Accepting crude detachable magazines or STANAG magazines, this is one of the" " better homemade weapons." msgstr "" +"Es una carabina improvisada de acción de palanca pero bien diseñada, con el " +"cañón corto. Esta es una de las mejores armas caseras ya que acepta " +"cargadores simples extraíbles STANAG." #: lang/json/gun_from_json.py msgid "pipe rifle: .223" @@ -118200,11 +121889,11 @@ msgstr[1] "pistolas de fusión" #: lang/json/gun_from_json.py msgid "single shot" -msgstr "" +msgstr "disparo simple" #: lang/json/gun_from_json.py msgid "triple shot" -msgstr "" +msgstr "disparo triple" #: lang/json/gun_from_json.py msgid "fusion blaster rifle" @@ -118257,14 +121946,16 @@ msgstr "" #: lang/json/gun_from_json.py msgid "mi-go bio-gun" msgid_plural "mi-go bio-guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "bio-arma mi-go" +msgstr[1] "bio-armas mi-go" #: lang/json/gun_from_json.py msgid "" "Fake gun that fires some sort of solidified organic matter at very high " "speed by unknown means of propulsion." msgstr "" +"Es un arma falsa que dispara algún tipo de materia orgánica solidificada a " +"muy alta velocidad por algún medio de propulsión desconocido." #: lang/json/gun_from_json.py msgid "spraycan flamethrower" @@ -118315,7 +122006,8 @@ msgstr "" "siglo XXI. Con poco de cinta adhesiva y partes electrónicas, funciona con un" " UPS normal." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistola" @@ -118390,7 +122082,7 @@ msgstr "" "Un rifle neumático de múltiples impactos, hecho a mano con chatarra. Es muy " "silencioso y letal." -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "semi-auto" @@ -118411,8 +122103,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "pneumatic shotgun" msgid_plural "pneumatic shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta neumática" +msgstr[1] "escopetas neumáticas" #: lang/json/gun_from_json.py msgid "" @@ -118421,6 +122113,10 @@ msgid "" " still pack quite a punch. That is, if your target is directly in front of " "you." msgstr "" +"Es una escopeta neumática de doble caño hecha a mano desde chatarra. Aunque " +"su poder de disparo es menor comparada con las escopetas convencionales, " +"esta cosa puede causar daño. Eso si tu objetivo está directamente enfrente " +"tuyo." #: lang/json/gun_from_json.py msgid "single" @@ -118585,8 +122281,8 @@ msgstr[1] "pistolas básicas" #: lang/json/gun_from_json.py msgid "backup pistol" msgid_plural "backup pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola de respaldo" +msgstr[1] "pistolas de respaldo" #: lang/json/gun_from_json.py src/item_factory.cpp msgid "revolver" @@ -118597,8 +122293,8 @@ msgstr[1] "revólveres" #: lang/json/gun_from_json.py msgid "cap & ball revolver" msgid_plural "cap & ball revolvers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "revólver de percusión" +msgstr[1] "revólveres de percusión" #: lang/json/gun_from_json.py msgid "base rifle" @@ -118615,8 +122311,8 @@ msgstr[1] "rifles de acción manual" #: lang/json/gun_from_json.py msgid "semi-automatic rifle" msgid_plural "semi-automatic rifles" -msgstr[0] "rifle semi-automático" -msgstr[1] "rifles semi-automáticos" +msgstr[0] "rifle semiautomático" +msgstr[1] "rifles semiautomáticos" #: lang/json/gun_from_json.py msgid "fully automatic rifle" @@ -118643,8 +122339,8 @@ msgstr "chak chak." #: lang/json/gun_from_json.py msgid "base race shotgun, pump" msgid_plural "base race shotguns, pump" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta básica, bomba" +msgstr[1] "escopetas básicas, bomba" #: lang/json/gun_from_json.py msgid "base SMG" @@ -118660,14 +122356,17 @@ msgstr "subfusil" #: lang/json/gun_from_json.py msgid "H&K G80 railgun" msgid_plural "H&K G80 railguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cañón de riel H&K G80" +msgstr[1] "cañones de riel H&K G80" #: lang/json/gun_from_json.py msgid "" "Developed by Heckler & Koch, this railgun magnetically propels a " "ferromagnetic projectile using an alternating current. Powered by UPS." msgstr "" +"Desarrollado por Heckler & Koch, este cañón de riel impulsa magnéticamente " +"un proyectil ferromagnético usando corriente alterna. Se alimenta con un " +"UPS." #: lang/json/gun_from_json.py msgid "RM120c shotgun" @@ -118780,8 +122479,8 @@ msgid "" "A home-made rifle. It is simply a pipe attached to a stock, with a hammer " "to strike the single round it holds." msgstr "" -"Un rifle hecho en casa. Es simplemente un caño con una culata y un percutor " -"para golpear la bala que contiene." +"Es un rifle hecho en casa. Es simplemente un caño con una culata y un " +"percutor para golpear la bala que contiene." #: lang/json/gun_from_json.py msgid "Ruger 10/22" @@ -118836,8 +122535,8 @@ msgstr "Es una popular pistola calibre .22." #: lang/json/gun_from_json.py msgid "Jennings J-22" msgid_plural "Jennings J-22s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Jennings J-22" +msgstr[1] "Jennings J-22" #: lang/json/gun_from_json.py msgid "" @@ -118847,12 +122546,17 @@ msgid "" "import, these were more commonly used by criminals unfazed by their glaring " "safety issues." msgstr "" +"Uno de los 'especiales de sábado a la noche' por antonomasia, el Jennings " +"J-22 tenía un precio muy accesible por su estructura de inyección moldeada " +"en zinc. Diseñada para llenar el vacío que dejaron las pistolas de bolsillo " +"cuando se prohibió su importación, eran comúnmente utilizadas por los " +"criminales que no se preocupaban con sus problemas de seguridad." #: lang/json/gun_from_json.py msgid "Walther P22" msgid_plural "Walther P22s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther P22" +msgstr[1] "Walther P22" #: lang/json/gun_from_json.py msgid "" @@ -118860,6 +122564,10 @@ msgid "" "half the size of most Walthers. It is made mostly with plastic, with the " "slide and key components being made of die-cast zinc alloy" msgstr "" +"La Walther P22 es una pistola semiautomática con retroceso simple. Es más o " +"menos de la mitad de tamaño que las otras Walthers. Está hecho mayormente en" +" plástico, con la corredora y los componentes claves hechos de una aleación " +"de zinc moldeada a presión." #: lang/json/gun_from_json.py msgid "Remington ACR" @@ -118889,24 +122597,29 @@ msgid "" "lightweight and accurate, but will malfunction if not properly maintained. " "This one is a semi-automatic civilian version." msgstr "" +"Este ubicuo rifle es el antepasado de la serie de rifles M16. Es liviano y " +"preciso, pero puede fallar si no es mantenido en buenas condiciones. Este es" +" la versión civil semiautomática." #: lang/json/gun_from_json.py msgid "AR pistol" msgid_plural "AR pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola AR" +msgstr[1] "pistolas AR" #: lang/json/gun_from_json.py msgid "" "A compact, 7.5 inch barrel version of the classic AR-15 design, commercially" " marketed as a home defense weapon." msgstr "" +"Es una versión compacta con cañón de casi 20 centímetros del diseño clásico " +"AR-15, comercialmente dirigida como arma de defensa hogareña." #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" -msgstr[0] "" -msgstr[1] "" +msgid "MAS .223" +msgid_plural "MAS .223" +msgstr[0] "MAS .223" +msgstr[1] "MAS .223" #: lang/json/gun_from_json.py msgid "" @@ -118915,12 +122628,16 @@ msgid "" "is a semi-auto only variation imported to the US in the late eighties. It " "retains the integral bipod, though." msgstr "" +"Es un rifle de asalto bullpup que era usado por las fuerzas armadas " +"francesas hasta hace poco. Aunque el FAMAS era famoso por su alta velocidad " +"de disparo, el MAS .223 es una variación semiautomática importado a los " +"Estados Unidos a finales de los ochenta. Mantiene el bípode integrado." #: lang/json/gun_from_json.py msgid "FS2000" msgid_plural "FS2000s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "FS2000" +msgstr[1] "FS2000" #: lang/json/gun_from_json.py msgid "" @@ -118930,12 +122647,17 @@ msgid "" " rifle is well sealed from mud and dust for reliability, but this makes it " "incompatible with many aftermarket magazines." msgstr "" +"Es una elegante carabina bullpup diseñada por FN Herstal, completa con mira " +"integrada. La acción de eyección hacia adelante y controles ambidiestros la " +"hacen cómoda tanto para derechos como para zurdos. Todo el rifle está " +"sellado para evitar barro y tierra, haciéndola más fiable pero incompatible " +"con muchos cargadores secundarios." #: lang/json/gun_from_json.py msgid "HK416 A5" msgid_plural "HK416 A5s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "HK416 A5" +msgstr[1] "HK416 A5" #: lang/json/gun_from_json.py msgid "" @@ -118980,13 +122702,13 @@ msgstr "" #: lang/json/gun_from_json.py msgid "burst" -msgstr "" +msgstr "ráfaga" #: lang/json/gun_from_json.py msgid "M249S" msgid_plural "M249Ss" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M249S" +msgstr[1] "M249S" #: lang/json/gun_from_json.py msgid "" @@ -118994,6 +122716,9 @@ msgid "" "manufactured for sport shooting and collectors market. Notably, it retains " "the ability to be belt fed, an uncommon feature in civilian firearms." msgstr "" +"Es una variante civil semiautomática del subfusil M249, fabricado para tiro " +"deportivo y el mercado de coleccionistas. Notablemente, retiene la habilidad" +" de usar cargadores cintos, una característica inusual en las armas civiles." #: lang/json/gun_from_json.py msgid "M27 IAR" @@ -119029,8 +122754,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M16A4" msgid_plural "M16A4s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M16A4" +msgstr[1] "M16A4s" #: lang/json/gun_from_json.py msgid "" @@ -119038,6 +122763,9 @@ msgid "" "militaries across the world for over 50 years. It is a gas operated, " "rotating bolt rifle known for its accuracy and controllable recoil." msgstr "" +"El M16 es un rifle de asalto muy común que desciende del AR-15, usado por " +"militares en todo el mundo por más de 50 años. Es accionado por gas de " +"cerrojo rotativo y es conocido por su precisión y retroceso controlable." #: lang/json/gun_from_json.py msgid "3 rd." @@ -119046,8 +122774,8 @@ msgstr "3 bl." #: lang/json/gun_from_json.py msgid "OA-93" msgid_plural "OA-93s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "OA-93" +msgstr[1] "OA-93" #: lang/json/gun_from_json.py msgid "" @@ -119056,6 +122784,10 @@ msgid "" " moved to the top of the gun, circumventing the necessity for a solid " "buttstock." msgstr "" +"Es una pistola derivada del AR-15 fabricada por Olympic Arms en los noventa." +" La diferencia principal con la AR-15 es que el resorte de retroceso ha sido" +" movido a la parte superior del arma, evitando la necesidad de una culata " +"sólida." #: lang/json/gun_from_json.py msgid "Ruger Mini-14" @@ -119122,8 +122854,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Remington 700 .270 Win" msgid_plural "Remington 700 .270 Win" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 700 .270 Win" +msgstr[1] "Remington 700 .270 Win" #: lang/json/gun_from_json.py msgid "" @@ -119132,6 +122864,10 @@ msgid "" "steel barrel threaded into the receiver and a recessed bolt face. It has " "checkered walnut furniture and a recoil pad to reduce perceived recoil." msgstr "" +"Es el clásico rifle de acción de cerrojo con calibre .270 WInchester, muy " +"popular entre los cazadores. Este modelo CDL SF tiene cañón acanalado de " +"acero inoxidable 416 enlazado con el receptor y el cerrojo. Tiene accesorios" +" de madera de nogal y una almohadilla para reducir el retroceso." #: lang/json/gun_from_json.py msgid "M2010 ESR" @@ -119195,7 +122931,7 @@ msgid "" ".30-06 round. Notable for using a detachable magazine instead of a " "traditional tube." msgstr "" -"Un rifle de caza de acción de palanca, con muy buena precisión y calibre " +"Es un rifle de caza de acción de palanca, con muy buena precisión y calibre " "para la poderosa .30-06. Conocido por utilizar un cargador extraíble en " "lugar de la tradicional cámara." @@ -119257,8 +122993,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Remington 700 .30-06" msgid_plural "Remington 700 .30-06" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 700 .30-06" +msgstr[1] "Remington 700 .30-06" #: lang/json/gun_from_json.py msgid "" @@ -119273,8 +123009,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Remington ACR .300BLK" msgid_plural "Remington ACR .300BLKs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington ACR .300BLK" +msgstr[1] "Remington ACR .300BLK" #: lang/json/gun_from_json.py msgid "" @@ -119283,12 +123019,16 @@ msgid "" "competing carbines. This version is chambered for the .300 AAC Blackout " "round." msgstr "" +"Esta carabina fue desarrollada para el uso militar a principios del siglo " +"XXI. Es precisa y causa mucho daño, aunque su velocidad de disparo es un " +"poco lenta comparándola con otras carabinas. Esta versión usa balas calibre " +".300 AAC Blackout." #: lang/json/gun_from_json.py msgid "IWI Tavor X95 .300BLK" msgid_plural "IWI Tavor X95 .300BLKs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "IWI Tavor X95 .300BLK" +msgstr[1] "IWI Tavor X95 .300BLK" #: lang/json/gun_from_json.py msgid "" @@ -119296,6 +123036,9 @@ msgid "" "assault rifle designed and produced by Israel Weapon Industries. This is " "the civilian version chambered for .300 AAC Blackout." msgstr "" +"El IWI Tavor X95 (también llamado Micro-Tavor o MTAR) es un rifle de asalto " +"bullpup israelí diseñado y producido por Israel Weapon Industries. Esta la " +"versión civil con calibre .300 AAC Blackout." #: lang/json/gun_from_json.py msgid "FN FAL" @@ -119422,14 +123165,16 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M60 Semi Auto" msgid_plural "M60 Semi Autos" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M60 Semi Auto" +msgstr[1] "M60 Semi Auto" #: lang/json/gun_from_json.py msgid "" "This is a semi-automatic civilian variant of the M60 machine gun, retaining " "the ability to be belt fed, an uncommon feature in civilian firearms." msgstr "" +"Es una variante civil semiautomática del subfusil M60, retiene la habilidad " +"de usar cargadores cintos, una característica inusual en las armas civiles." #: lang/json/gun_from_json.py msgid "Savage 111F" @@ -119476,12 +123221,17 @@ msgid "" "a 'weapon system' because it consists of not only a rifle, but also a " "detachable telescopic sight and other accessories." msgstr "" +"El M24 francotirador es una versión militar y policíaca del rifle Remington " +"modelo 700. M24 es el nombre asignado por el Ejército de Estados Unidos " +"luego de adoptarlo como su rifle de francotirador estándar en 1988. El M24 " +"es llamado 'sistema de armas' porque además del rifle tiene una mira " +"telescópica removible y otros accesorios." #: lang/json/gun_from_json.py msgid "HK417 A2" msgid_plural "HK417 A2s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "HK417 A2" +msgstr[1] "HK417 A2" #: lang/json/gun_from_json.py msgid "" @@ -119489,12 +123239,15 @@ msgid "" "operated, rotating bolt rifle with a short-stroke piston design similar to " "that of the G36." msgstr "" +"Es un rifle de combate alemán con un cañón de 13\" y culata telescópica. Es " +"accionado por gas de cerrojo rotativo con un pistón corto de diseño similar " +"al del G36." #: lang/json/gun_from_json.py msgid "M110A1" msgid_plural "M110A1s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M110A1" +msgstr[1] "M110A1" #: lang/json/gun_from_json.py msgid "" @@ -119502,18 +123255,24 @@ msgid "" "weight requirements. It is a gas operated, rotating bolt rifle accurate to " "1.5 MOA with standard ammunition." msgstr "" +"Es un derivado del G28 de H&K con un receptor superior de aluminio que " +"cumple con los requisitos de peso del ejército de Estados Unidos. Es " +"accionado por gas de cerrojo rotativo, apropiado para 1.5 MOA con munición " +"estándar." #: lang/json/gun_from_json.py msgid "AR-10" msgid_plural "AR-10s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "AR-10" +msgstr[1] "AR-10" #: lang/json/gun_from_json.py msgid "" "Somewhat similar to the later AR-15, the AR-10 is a gas operated, rotating " "bolt rifle chambered for 7.62x51mm rounds." msgstr "" +"Es similar a su posterior AR-15, el AR-10 es accionado por gas de cerrojo " +"rotativo con calibre para balas 7.62x51mm." #: lang/json/gun_from_json.py msgid "SIG Sauer P230" @@ -119526,8 +123285,8 @@ msgid "" "The SIG Sauer P230 is a small, semi-automatic handgun chambered in .32 ACP." " Due to its small dimensions, it was often carried as a backup weapon." msgstr "" -"La SIG Sauer P320 es una pistola pequeña semi-automática con calibre .32 " -"ACP. Debido a su pequeño tamaño, a menudo se la lleva como arma de apoyo." +"La SIG Sauer P320 es una pistola pequeña semiautomática con calibre .32 ACP." +" Debido a su pequeño tamaño, a menudo se la lleva como arma de apoyo." #: lang/json/gun_from_json.py msgid "Skorpion Vz. 61" @@ -119560,8 +123319,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Kel-Tec P32" msgid_plural "Kel-Tec P32s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Kel-Tec P32" +msgstr[1] "Kel-Tec P32" #: lang/json/gun_from_json.py msgid "" @@ -119569,6 +123328,10 @@ msgid "" "concealment and backup usage. Despite its extreme light weight and small " "size, its .32 ACP chambering makes for good handling and recoil control." msgstr "" +"Uno de los diseños más antiguos de Kel-tec, el P32 es una opción popular " +"como arma oculta y uso de apoyo. A pesar de ser extremadamente liviano y " +"pequeño, tiene calibre .32 ACP que lo hace fácil de manejar y de controlar " +"su retroceso." #: lang/json/gun_from_json.py msgid "SIG P226" @@ -119587,26 +123350,31 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Glock 31" msgid_plural "Glock 31s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Glock 31" +msgstr[1] "Glock 31" #: lang/json/gun_from_json.py msgid "" "A full size .357 SIG Glock pistol. It is extremely similar to the Glock 22," " and could be converted to fire .40 S&W by switching the barrel." msgstr "" +"Es una pistola Glock .357 SIG de tamaño completo. Es extremadamente similar " +"a la Glock 22 y puede ser convertida para disparar .40 S&W cambiándole el " +"cañón." #: lang/json/gun_from_json.py msgid "SIG P320 Compact" msgid_plural "SIG P320 Compacts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "SIG P320 Compacta" +msgstr[1] "SIG P320 Compactas" #: lang/json/gun_from_json.py msgid "" "The P320 Compact is a semi-automatic, short recoil operated pistol. This " "one is chambered for .357 SIG." msgstr "" +"La P320 Compacta es una pistola semiautomática de retroceso corto. Esta " +"tiene calibre .357 SIG." #: lang/json/gun_from_json.py msgid "Colt M1861 Navy" @@ -119643,8 +123411,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "COP .357 Derringer" msgid_plural "COP .357 Derringers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "COP .357 Derringer" +msgstr[1] "COP .357 Derringers" #: lang/json/gun_from_json.py msgid "" @@ -119652,12 +123420,15 @@ msgid "" "Mossberg Brownie. It uses a rotating firing pin to fire the individual " "hammers of the four barrels arranged in a square formation." msgstr "" +"Es una pistola pequeña y regordeta con un ligero parecido a la Mossberg " +"Brownie. Utiliza un percutor rotativo para disparar martillos individuales " +"para cada uno de los cuatro cañones puestos en cuadrado." #: lang/json/gun_from_json.py msgid "S&W Model 10" msgid_plural "S&W Model 10" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "S&W Model 10" +msgstr[1] "S&W Model 10" #: lang/json/gun_from_json.py msgid "" @@ -119665,12 +123436,15 @@ msgid "" "handgun of the 20th century. It has a swing-out cylinder for ease of " "reloading." msgstr "" +"Es un revolver de seis disparos producido desde 1899 y conocido por ser el " +"arma de mano más popular del siglo XX. Tiene un cilindro que se abre hacia " +"afuera para poder cargarlo más fácilmente." #: lang/json/gun_from_json.py msgid "pipe rifle: .38 Special" msgid_plural "pipe rifles: .38 Special" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle de caño: .38 Special" +msgstr[1] "rifles de caño: .38 Special" #: lang/json/gun_from_json.py msgid "Ruger LCR .38" @@ -119703,8 +123477,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "MAC-11" msgid_plural "MAC-11s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "MAC-11" +msgstr[1] "MAC-11" #: lang/json/gun_from_json.py msgid "" @@ -119714,12 +123488,17 @@ msgid "" "declared 'fit only for combat in a phone booth' due to its low weight and " "absurd fire rate ranging from 1200 to 1400 rounds per minute." msgstr "" +"Esta pistola ametralladora es una versión menos conocida de la MAC-10, con " +"calibre .380 ACP para tener un menor tamaño y seguir siendo subsónica. Más " +"pequeña en casi todas dimensiones, esta arma automática fue declarada " +"'adecuada solo para combate en una cabina de teléfono' debido a su poco peso" +" y la absurda velocidad de dispara que va de 1200 a 1400 balas por minuto." #: lang/json/gun_from_json.py msgid "Kel-Tec P3AT" msgid_plural "Kel-Tec P3ATs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Kel-Tec P3AT" +msgstr[1] "Kel-Tec P3AT" #: lang/json/gun_from_json.py msgid "" @@ -119728,12 +123507,16 @@ msgid "" "Handling leaves something to be desired due to snappier recoil and " "diminuitive controls." msgstr "" +"Es esencialmente una Kel-Tec P32 más grande con calibre .380 ACP. La siempre" +" popular P3AT ofrece mejor balística en un paquete chico, ocultable y " +"liviano. La maniobrabilidad deja un poco que desear debido a un retroceso " +"rápido y controles diminutos." #: lang/json/gun_from_json.py msgid "FN 1910 .380" msgid_plural "FN 1910 .380s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "FN 1910 .380" +msgstr[1] "FN 1910 .380" #: lang/json/gun_from_json.py msgid "" @@ -119742,12 +123525,16 @@ msgid "" "more modern terminal performance. If such a humble firearm could start a " "world war, could it perhaps protect you from the undead?" msgstr "" +"Se hizo notoria en Sarajevo en 1914, la FN1910 fue una popular pistola de " +"bolsillo, pero con .32 ACP. Los coleccionistas valoran el modelo .380 por su" +" notoriedad y desempeño más moderno. Si un arma tan humilde pudo empezar una" +" guerra mundial, ¿podrá tal vez protegerte de los muertos vivientes?" #: lang/json/gun_from_json.py msgid "Ruger LCP" msgid_plural "Ruger LCPs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Ruger LCP" +msgstr[1] "Ruger LCP" #: lang/json/gun_from_json.py msgid "" @@ -119756,12 +123543,16 @@ msgid "" "round's relatively low power, the pistol's low weight and short sight radius" " make for a moderately poor handling pistol." msgstr "" +"Euna de las 'pistolas de bolsillo' más vendidas de la modernidad, la LCP es " +"económica, con estructura de polímero y calibre .380 ACP. A pesar de la " +"relativa baja velocidad de la bala, el poco peso de la pistola y su corto " +"radio de mira la hacen de poca maniobrabilidad." #: lang/json/gun_from_json.py msgid "Hi-Point CF-380" msgid_plural "Hi-Point CF-380s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Hi-Point CF-380" +msgstr[1] "Hi-Point CF-380" #: lang/json/gun_from_json.py msgid "" @@ -119770,48 +123561,58 @@ msgid "" "making said firearms bulky and uncomfortable. Hi-Points have slides made " "with a zinc pot-metal which is relatively fragile compared to steel slides." msgstr "" +"La Hi-Point CF-380 es una pistola semiautomática con retroceso simple " +"diseñada por Hi-Point Firearms, que es conocida por hacer armas de fuego " +"baratas y por hacerlas incómodas y voluminosas. Las Hi-Point tiene corredora" +" de zinc que es relativamente frágil comparada con las corredoras de acero." #: lang/json/gun_from_json.py msgid "Taurus Spectrum" msgid_plural "Taurus Spectrum" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Taurus Spectrum" +msgstr[1] "Taurus Spectrum" #: lang/json/gun_from_json.py msgid "" "A .380 subcompact pistol. Designed for concealed carry and built from high-" "quality, durable materials." msgstr "" +"Es una pistola subcompacta calibre .380. Diseñada para poder ocultarse y " +"construida con materiales resistentes de gran calidad." #: lang/json/gun_from_json.py msgid "AF2011A1 .38 Super" msgid_plural "AF2011A1 .38 Super" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "AF2011A1 .38 Super" +msgstr[1] "AF2011A1 .38 Super" #: lang/json/gun_from_json.py msgid "" "A double-barrel semi-automatic pistol of Italian origin, firing two bullets " "per shot, a derivative of the M1911 pistol." msgstr "" +"Es una pistola semiautomática de doble cañón de origen italiano, que dispara" +" dos balas por tiro, y deriva de la pistola M1911." #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M1911A1" +msgstr[1] "M1911A1" #: lang/json/gun_from_json.py msgid "" "The M1911A1 is an extremely popular pistol known for its reliability. This " "one is chambered for .38 Super." msgstr "" +"La M1911A1 es una pistola extremadamente popular conocida por su fiabilidad." +" Esta tiene calibre .38 Super." #: lang/json/gun_from_json.py msgid "Beretta 90-two .40 S&W" msgid_plural "Beretta 90-two .40 S&Ws" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Beretta 90-two .40 S&W" +msgstr[1] "Beretta 90-two .40 S&W" #: lang/json/gun_from_json.py msgid "" @@ -119820,6 +123621,10 @@ msgid "" "futuristic-looking design owed in large parts to the polymer underbarrel " "rail cover. This one is chambered in .40 S&W." msgstr "" +"Es una versión más moderna de la popular serie 92 de Beretta, la 90-two " +"tiene un desempeña casi igual. La mayor diferencia es su diseño más elegante" +" y casi futurista debido a su cobertura de polímero bajo el cañón. Esta " +"tiene calibre .40 S&W." #: lang/json/gun_from_json.py msgid "Glock 22" @@ -119839,8 +123644,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Beretta Px4 Storm .40 S&W" msgid_plural "Beretta Px4 Storm .40 S&Ws" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Beretta Px4 Storm .40 S&W" +msgstr[1] "Beretta Px4 Storm .40 S&W" #: lang/json/gun_from_json.py msgid "" @@ -119848,12 +123653,15 @@ msgid "" "utilizing light-weight polymer construction with steel inserts. Its shape " "was also optimized for concealed carry. This one is chambered in .40 S&W." msgstr "" +"Más liviana que la icónica serie 92 de Beretta, la Px4 Storm fue construida " +"utilizando polímero liviano con inserciones de acero. Su forma fue " +"optimizada para poder llevar oculta. Esta tiene calibre .40 S&W." #: lang/json/gun_from_json.py msgid "pipe rifle: .40 S&W" msgid_plural "pipe rifles: .40 S&W" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle de caño: .40 S&W" +msgstr[1] "rifles de caño: .40 S&W" #: lang/json/gun_from_json.py msgid "SIG Pro .40" @@ -119873,8 +123681,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Luty SMG: .40 S&W" msgid_plural "Luty SMGs: .40 S&W" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Luty SMG: .40 S&W" +msgstr[1] "Luty SMG: .40 S&W" #: lang/json/gun_from_json.py msgid "" @@ -119884,6 +123692,11 @@ msgid "" "shop, but still very unreliable. This one is chambered for .40 S&W " "cartridges and accepts custom-made makeshift magazines." msgstr "" +"Es un subfusil de patrón Luty de ánima lisa, construida simplemente de " +"varias partes de acero, usando algunas de las armas de mano más avanzadas. " +"Probablemente sea una de las armas más complejas que se pueden hacer fuera " +"de una fábrica, pero igual es poco fiable. Esta tiene calibre .40 S&W y " +"acepta cargadores hechos a medida." #: lang/json/gun_from_json.py msgid "handmade six-shooter" @@ -119917,8 +123730,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Browning Hi-Power .40 S&W" msgid_plural "Browning Hi-Power .40 S&Ws" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Browning Hi-Power .40 S&W" +msgstr[1] "Browning Hi-Power .40 S&W" #: lang/json/gun_from_json.py msgid "" @@ -119927,12 +123740,16 @@ msgid "" " Canada and Australia. This is a commercial variant produced by Browning " "Arms in .40 S&W." msgstr "" +"La Browning Hi-Power es una arma de mano semiautomática desarrollada poco " +"antes de la segunda guerra mundial. Muy usada desde entonces, sigue en uso " +"en India, Canadá y Australia. Esta es la versión comercial producida por " +"Browning Arms con calibre .40 S&W." #: lang/json/gun_from_json.py msgid "Walther PPQ .40 S&W" msgid_plural "Walther PPQ .40 S&Ws" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther PPQ .40 S&W" +msgstr[1] "Walther PPQ .40 S&W" #: lang/json/gun_from_json.py msgid "" @@ -119940,12 +123757,15 @@ msgid "" "P99QA, and maintains compatibility with some of its predecessor's " "accessories. This model is chambered in .40 S&W." msgstr "" +"La Walther PPQ es una pistola semiautomática desarrollada a partir de la " +"Walther P99QA y que mantiene compatibilidad con algunos accesorios de sus " +"predecesoras. Este modelo tiene calibre .40 S&W." #: lang/json/gun_from_json.py msgid "Hi-Point Model JCP" msgid_plural "Hi-Point Model JCPs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Hi-Point Model JCP" +msgstr[1] "Hi-Point Model JCP" #: lang/json/gun_from_json.py msgid "" @@ -119955,6 +123775,10 @@ msgid "" "made with a zinc pot-metal which is relatively fragile compared to steel " "slides." msgstr "" +"La Hi-Point Model JCP es una pistola semiautomática con retroceso simple " +"diseñada por Hi-Point Firearms, que es conocida por hacer armas de fuego " +"baratas y por hacerlas incómodas y voluminosas. Las Hi-Point tiene corredora" +" de zinc que es relativamente frágil comparada con las corredoras de acero." #: lang/json/gun_from_json.py msgid "tube 40mm launcher" @@ -119967,14 +123791,14 @@ msgid "" "A simple, home-made grenade launcher. Basically a tube with a pin firing " "mechanism to activate the grenade." msgstr "" -"Un lanzagranadas simple, hecho en casa. Básicamente, es un caño con un " +"Es un lanzagranadas simple, hecho en casa. Básicamente, es un caño con un " "mecanismo para activar las granadas." #: lang/json/gun_from_json.py msgid "M320 standalone launcher" msgid_plural "M320 standalone launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzador independiente M320" +msgstr[1] "lanzadores independientes M320" #: lang/json/gun_from_json.py msgid "" @@ -119982,6 +123806,9 @@ msgid "" "launchers in a very small package at the cost of decreased accuracy. This " "one is combined with a buttstock for standalone operation." msgstr "" +"El lanzagranadas M320 de Heckler & Koch ofrece la funcionalidad de los " +"lanzadores más grandes en un tamaño muy chico, aunque con menor precisión. " +"Este tiene una culata para poder ser utilizado así solo." #: lang/json/gun_from_json.py msgid "M79 launcher" @@ -119995,6 +123822,9 @@ msgid "" "Vietnam War. Though mostly replaced by more modern launchers, the M79 still" " sees use with many units worldwide." msgstr "" +"Un lanzagranadas muy utilizado que empezó a usar las fuerzas estadounidenses" +" en la guerra de Vietnam. Aunque ya ha sido reemplazado por lanzadores " +"modernos, el M79 todavía se usa en todo el mundo." #: lang/json/gun_from_json.py msgid "Milkor MGL" @@ -120053,13 +123883,14 @@ msgstr "multi" #: lang/json/gun_from_json.py msgid "M203 array" msgid_plural "M203 arrays" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "grupo de M203" +msgstr[1] "grupos de M203" #: lang/json/gun_from_json.py msgid "" "An array of six M203 grenade launchers for use on the TALON UGV platform." msgstr "" +"Es un grupo de seis lanzagranadas M203 para usar en la plataforma TALON UGV." #: lang/json/gun_from_json.py msgid "Mark 19 grenade launcher" @@ -120073,12 +123904,16 @@ msgid "" "since the start of the Cold War all the way to the cataclysm, and if you can" " find some 40mm grenades, maybe even beyond." msgstr "" +"Es un lanzagranadas pesado, montado en un trípode y alimentado con cinta de " +"munición, utilizado por el Ejército de EE.UU. desde comienzos de la Guerra " +"Fría hasta el cataclismo, y si podés encontrar algunas granadas 40mm, se " +"puede seguir usando." #: lang/json/gun_from_json.py msgid "Saiga-410" msgid_plural "Saiga-410s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Saiga-410" +msgstr[1] "Saiga-410" #: lang/json/gun_from_json.py msgid "" @@ -120086,12 +123921,15 @@ msgid "" "pattern as the AK47 rifle. It reloads with a magazine, rather than one " "shell at a time like most shotguns." msgstr "" +"La Saiga-410 es una escopeta semiautomática diseñada con el mismo modelo de " +"Kalashnikov de los rifles AK47. Utiliza un cargador en lugar de tener que " +"poner cada cartucho de a uno como en la mayoría de las escopetas." #: lang/json/gun_from_json.py msgid "Winchester M37 .410" msgid_plural "Winchester M37 .410s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Winchester M37 .410" +msgstr[1] "Winchester M37 .410" #: lang/json/gun_from_json.py msgid "" @@ -120099,6 +123937,9 @@ msgid "" "lower-recoil alternative to 12 gauge shotguns, it is light and easy to " "manufacture." msgstr "" +"Es una escopeta de cañón basculante de un disparo con calibre .410. Diseñada" +" como una alternativa de bajo retroceso a las escopetas 12 gauge, es liviana" +" y simple de fabricar." #: lang/json/gun_from_json.py msgid "Desert Eagle .44" @@ -120137,8 +123978,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "pipe rifle: .44 Magnum" msgid_plural "pipe rifles: .44 Magnum" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle de caño: .44 Magnum" +msgstr[1] "rifles de caño: .44 Magnum" #: lang/json/gun_from_json.py msgid "Ruger Redhawk" @@ -120202,6 +124043,12 @@ msgid "" " is offered in more prevalent .44 caliber. Despite modern quality " "materials, the design is still rather delicate." msgstr "" +"Es una reproducción de Pietta del revólver LeMat de la época de la guerra " +"civil, un extraño e inusual revólver de llave de percusión calibre .44. " +"Aunque su calibre original .42 o .35 fue usado por el ejército de los " +"Estados Confederados, esta reproducción es ofrecida en un calibre .44 más " +"preponderante. A pesar de los materiales más modernos, el diseño lo sigue " +"haciendo bastante delicado." #: lang/json/gun_from_json.py msgid "TDI Vector" @@ -120250,8 +124097,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M45A1" msgid_plural "M45A1s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M45A1" +msgstr[1] "M45A1" #: lang/json/gun_from_json.py msgid "" @@ -120262,6 +124109,12 @@ msgid "" "recoil springs. Most were replaced in 2016 with Glock 19's due to logistics" " issues." msgstr "" +"La M45A1 suplantó las pistolas M45 MEUSOC en uso de reconocimiento de las " +"unidades expedicionarias de la marina. Aunque las pistolas M45 originales " +"fueron destrozadas por las M1911A1 por armeros del Cuerpo de Marines, la " +"actualizada M45A1 son casi iguales al diseña de cualquier 1911 comercial. La" +" mayoría fue reemplaza en 2016 con la Glock 19 debido a problemas de " +"logística." #: lang/json/gun_from_json.py msgid "MAC-10" @@ -120290,8 +124143,8 @@ msgstr[1] "rifles de caño: .45" #: lang/json/gun_from_json.py msgid "Luty SMG: .45" msgid_plural "Luty SMGs: .45" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Luty SMG: .45" +msgstr[1] "Luty SMG: .45" #: lang/json/gun_from_json.py msgid "" @@ -120301,6 +124154,11 @@ msgid "" "shop, but still very unreliable. This one is chambered for .45 ACP " "cartridges and accepts MAC-10 compatible magazines." msgstr "" +"Es un subfusil de patrón Luty de ánima lisa, construida simplemente de " +"varias partes de acero, usando algunas de las armas de mano más avanzadas. " +"Probablemente sea una de las armas más complejas que se pueden hacer fuera " +"de una fábrica, pero igual es poco fiable. Esta tiene calibre .45 ACP y " +"acepta cargadores compatibles MAC-10." #: lang/json/gun_from_json.py msgid "homemade hand cannon" @@ -120321,8 +124179,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Thompson M1928A1" msgid_plural "Thompson M1928A1s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Thompson M1928A1" +msgstr[1] "Thompson M1928A1" #: lang/json/gun_from_json.py msgid "" @@ -120346,8 +124204,8 @@ msgstr[1] "USP .45" #: lang/json/gun_from_json.py msgid "MK 23 MOD 0" msgid_plural "MK 23 MOD 0s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "MK 23 MOD 0" +msgstr[1] "MK 23 MOD 0" #: lang/json/gun_from_json.py msgid "" @@ -120359,12 +124217,19 @@ msgid "" "remarkably reliable gun; someone could probably take out a nuclear equipped " "walking tank with this in their holster." msgstr "" +"Humorísticamente, se la conoce como \"La única pistola del mundo de manejo " +"en equipo\", esta enorme pistola fue diseñada como arma primaria para " +"\"operarios especiales\". Su incomodidad, la introducción de la serie HK USP" +" y la logística de tener munición .45 ACP, condenó a este mastodonte a las " +"armerías del Mando de Operaciones Especiales de los Estados Unidos. Como la " +"USP, la Mk 23 es notablemente fiable; alguien podría derrotar a un tanque " +"ambulante con equipo nuclear con esto en su cintura." #: lang/json/gun_from_json.py msgid "Walther PPQ 45" msgid_plural "Walther PPQ 45s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther PPQ 45" +msgstr[1] "Walther PPQ 45" #: lang/json/gun_from_json.py msgid "" @@ -120372,12 +124237,15 @@ msgid "" "P99QA, and maintains compatibility with some of its predecessor's " "accessories. This model is chambered in .45 ACP." msgstr "" +"La Walther PPQ es una pistola semiautomática desarrollada a partir de la " +"Walther P99QA y que mantiene compatibilidad con algunos accesorios de sus " +"predecesoras. Este modelo tiene calibre .45 ACP." #: lang/json/gun_from_json.py msgid "Hi-Point Model JHP" msgid_plural "Hi-Point Model JHPs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Hi-Point Model JHP" +msgstr[1] "Hi-Point Model JHP" #: lang/json/gun_from_json.py msgid "" @@ -120387,6 +124255,10 @@ msgid "" "made with a zinc pot-metal which is relatively fragile compared to steel " "slides." msgstr "" +"La Hi-Point Model JHP es una pistola semiautomática con retroceso simple " +"diseñada por Hi-Point Firearms, que es conocida por hacer armas de fuego " +"baratas y por hacerlas incómodas y voluminosas. Las Hi-Point tiene corredora" +" de zinc que es relativamente frágil comparada con las corredoras de acero." #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" @@ -120413,12 +124285,14 @@ msgid "" "The Taurus Raging Judge Magnum is a 6-shot revolver chambered in .454 " "Casull. It can fire .410 shotshells and .45 Colt cartridges as well." msgstr "" +"El Taurus Raging Judge Magnum es un revólver de 6 disparos para la .454 " +"Casull. Puede disparar cartuchos .410 y también .45 Colt." #: lang/json/gun_from_json.py msgid "Marlin 1895 SBL" msgid_plural "Marlin 1895 SBLs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Marlin 1895 SBL" +msgstr[1] "Marlin 1895 SBL" #: lang/json/gun_from_json.py msgid "" @@ -120426,12 +124300,15 @@ msgid "" "Designed for wilderness guides for defense against large predators such as " "grizzly bears, moose, and dinosaurs." msgstr "" +"Es un rifle práctico y potente de acción de palanca con calibre .45-70 " +"Government. Diseñado para guías de reservas naturales para defensa contra " +"grandes depredadores como los osos gris, alces y dinosaurios." #: lang/json/gun_from_json.py msgid "Magnum Research BFR" msgid_plural "Magnum Research BFRs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Magnum Research BFR" +msgstr[1] "Magnum Research BFR" #: lang/json/gun_from_json.py msgid "" @@ -120439,12 +124316,15 @@ msgid "" "significant velocity in its short pistol barrel, it still competes with " "other large magnum handguns in terms of power." msgstr "" +"Es un enorme revólver de acción simple. Mientras la bala de rifle .45-70 " +"pierde significativamente velocidad en este cañón corto de pistola, igual " +"compite con otras armas de mano magnum en términos de potencia." #: lang/json/gun_from_json.py msgid "1874 Sharps" msgid_plural "1874 Sharps" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1874 Sharps" +msgstr[1] "1874 Sharps" #: lang/json/gun_from_json.py msgid "" @@ -120453,6 +124333,10 @@ msgid "" "powerful for the time, this one is made to handle modern smokeless " "ammunition." msgstr "" +"Es una reproducción del antiguo rifle .45-70 de disparo simple, usado para " +"cazar búfalos y otros animales grandes a finales del siglo XIX. Muy preciso " +"y poderoso para su época, este está hecho para usar munición moderna sin " +"humo." #: lang/json/gun_from_json.py msgid "Bond Arms Derringer" @@ -120466,12 +124350,15 @@ msgid "" "commonly chambered for .45 Colt, with chambers long enough to accept .410 " "shotgun shells." msgstr "" +"El Revólver Bond Arms es de una serie de pistolas compactas de multicañón. " +"Comúnmente, con calibre .45 Colt, con la posibilidad de aceptar cartuchos de" +" escopeta .410." #: lang/json/gun_from_json.py msgid "Colt Lightning .45 Carbine" msgid_plural "Colt Lightning .45 Carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Carabina Colt Lightning .45" +msgstr[1] "Carabinas Colt Lightning .45" #: lang/json/gun_from_json.py msgid "" @@ -120479,16 +124366,20 @@ msgid "" ".44-40, modern versions most commonly use .45 Colt, complementing the Single" " Action Army as a Cowboy Action Shooting firearm." msgstr "" +"Es una reproducción moderna del rifle Colt de acción de bombeo. " +"Originalmente hecha con calibre .44-40, las versiones modernas utilizan más " +"comúnmente el .45 Colt, complementando el Single Action Army con un arma " +"para los Cowboy Action Shooting." #: lang/json/gun_from_json.py msgid "chik chik." -msgstr "" +msgstr "chik chik." #: lang/json/gun_from_json.py msgid "Uberti Cattleman" msgid_plural "Uberti Cattleman" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Uberti Cattleman" +msgstr[1] "Uberti Cattleman" #: lang/json/gun_from_json.py msgid "" @@ -120499,12 +124390,19 @@ msgid "" "collectors. Unlike modern revolvers, the cylinder cannot swing out for " "loading, and spent brass must be ejected one at a time." msgstr "" +"Este Uberti Cattleman con cañón de 7.5\" es una reproducción moderna del " +"legendario Colt Single Action Army o Colt Peacemaker, uno de los primeros " +"revólveres en usar un cartucho moderno incorporado. Hecho famoso por los " +"westerns, todavía hoy es demandado en la disciplina Cowboy Action Shooting, " +"las representaciones y los coleccionistas. A diferencia de los revólveres " +"modernos, el cilindro no sale para cargarlo y las vainas deben ser eyectadas" +" de a una." #: lang/json/gun_from_json.py msgid "H&K MP7A2" msgid_plural "H&K MP7A2s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "H&K MP7A2" +msgstr[1] "H&K MP7A2" #: lang/json/gun_from_json.py msgid "" @@ -120512,12 +124410,14 @@ msgid "" "4.6x30mm round while being lightweight, compact in size, and practically " "recoil free." msgstr "" +"Diseñada como un arma de defensa personal, el MP7 dispara el poderoso " +"calibre 4.6x30mm, y es liviana, pequeña y prácticamente no posee retroceso." #: lang/json/gun_from_json.py msgid "1911-460" msgid_plural "1911-460s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1911-460" +msgstr[1] "1911-460" #: lang/json/gun_from_json.py msgid "" @@ -120526,6 +124426,10 @@ msgid "" "reducing slide velocity. Notably, normal .45ACP can also be fired through " "the weapon." msgstr "" +"Esta 1911 ha sido modificada para usar el potente calibre .460 Rowland. " +"Posee ahora un gran compensador integrado para ayudar a controlar el " +"retroceso y reducir la velocidad de la corredora. Notablemente, con esta " +"arma también se puede disparar .45 ACP." #: lang/json/gun_from_json.py msgid "Barrett M107A1" @@ -120544,8 +124448,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M2HB Browning HMG" msgid_plural "M2HB Browning HMG" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M2HB Browning HMG" +msgstr[1] "M2HB Browning HMG" #: lang/json/gun_from_json.py msgid "" @@ -120553,6 +124457,10 @@ msgid "" "Cataclysm, and even rarely by Cataclysm survivors. Its massive size and " "design make it impossible to use unless deployed or mounted to a vehicle." msgstr "" +"Es una ametralladora pesada usada por el Ejército de Estados Unidos desde su" +" creación hasta el Cataclismo, e incluso también por algunos sobrevivientes " +"del Cataclismo. Su enorme tamaño y su diseño la hacen imposible de usar " +"salvo que esté desplegada o montada en un vehículo." #: lang/json/gun_from_json.py msgid ".50 caliber rifle" @@ -120579,8 +124487,8 @@ msgstr "manual" #: lang/json/gun_from_json.py msgid "AI AS50" msgid_plural "AI AS50s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "AI AS50" +msgstr[1] "AI AS50" #: lang/json/gun_from_json.py msgid "" @@ -120588,12 +124496,15 @@ msgid "" "accuracy for long range target and high fire rate, this weapon is still " "being used by Greek national guard." msgstr "" +"Es un rifle antimaterial de calibre .50 hecho por Accuracy International. " +"Con alta precisión para objetivos a largo alcance y una velocidad alta de " +"disparo, esta arma todavía es usada por la guardia nacional griega." #: lang/json/gun_from_json.py msgid "McMillan TAC-50" msgid_plural "McMillan TAC-50s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "McMillan TAC-50" +msgstr[1] "McMillan TAC-50" #: lang/json/gun_from_json.py msgid "" @@ -120604,18 +124515,28 @@ msgid "" "extreme distances. It notably holds the longest range confirmed sniper " "kill, as well as the 4th and 5th longest." msgstr "" +"Es un rifle antimaterial de francotirador de largo alcance hecho por " +"McMillan Firearms, usado en el Ejército Canadiense desde 2000 en su versión " +"C15, y a los Seal de la Armada de Estados Unidos en su versión Mk 15 Mod 0. " +"Este rifle calibre .50 de acción de cerrojo es capaz de vencer vehículos " +"ligeros, instalaciones de radar y armas grandes a distancias extremas. " +"Notablemente, tiene la muerte confirmada a mayor rango, así como también la " +"cuarta y la quinta." #: lang/json/gun_from_json.py msgid "Serbu BFG-50" msgid_plural "Serbu BFG-50s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Serbu BFG-50" +msgstr[1] "Serbu BFG-50" #: lang/json/gun_from_json.py msgid "" "A single-shot, bolt-action rifle made by Serbu Firearms, the BFG-50 is a " "very affordable firearm for those wishing to shoot .50 BMG." msgstr "" +"Es un rifle de un disparo y acción de cerrojo hecho por Serbu Firearms. El " +"BFG-50 es un arma muy económica para aquellos que quieran disparar munición " +".50 BMG." #: lang/json/gun_from_json.py msgid "Big Horn Model 89" @@ -120738,8 +124659,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M202A1 FLASH" msgid_plural "M202A1 FLASH" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M202A1 FLASH" +msgstr[1] "M202A1 FLASH" #: lang/json/gun_from_json.py msgid "" @@ -120747,16 +124668,20 @@ msgid "" "flamethrowers still in use in Vietnam. It has four barrels sharing the 66mm" " caliber of the M72 LAW." msgstr "" +"Es un lanzacohetes estadounidense diseñado en la década del 70 para " +"reemplazar los lanzallamas de la Segunda Guerra Mundial que se usaron hasta " +"la guerra de Vietnam. Tiene cuatro cañones que comparten el calibre 66mm del" +" M72 LAW." #: lang/json/gun_from_json.py msgid "all barrels" -msgstr "" +msgstr "todos los cañones" #: lang/json/gun_from_json.py msgid "Elephant gun" msgid_plural "Elephant guns" -msgstr[0] "rifle de caza mayor" -msgstr[1] "rifles de caza mayor" +msgstr[0] "arma de caza mayor" +msgstr[1] "armas de caza mayor" #: lang/json/gun_from_json.py msgid "" @@ -120820,8 +124745,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "AK-47" msgid_plural "AK-47s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "AK-47" +msgstr[1] "AK-47" #: lang/json/gun_from_json.py msgid "" @@ -120830,12 +124755,16 @@ msgid "" "function, their solid firepower and reliability in harsh conditions make " "them valuable weapons in this new world." msgstr "" +"Las copias civiles de la icónica Kalashnikov, como esta, fueron fabricadas e" +" importadas por muchas compañías diferentes. Incluso sin la función " +"automática, su sólida potencia de disparo y fiabilidad en condiciones " +"difíciles la hacen armas valoradas en este mundo nuevo." #: lang/json/gun_from_json.py msgid "Mini Draco" msgid_plural "Mini Dracos" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mini Draco" +msgstr[1] "Mini Dracos" #: lang/json/gun_from_json.py msgid "" @@ -120843,6 +124772,9 @@ msgid "" "\"pistol\" has seen some popularity with civilian shooters and gangbangers " "alike." msgstr "" +"Es, esencialmente, una AK semiautomática con el cañón corto y sin culata. " +"Esta incómoda \"pistola\" ha sido popular entre los tiradores civiles y " +"bandas por igual" #: lang/json/gun_from_json.py msgid "Mosin-Nagant M44" @@ -120956,14 +124888,17 @@ msgstr "" #: lang/json/gun_from_json.py msgid "AT4" msgid_plural "AT4s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "AT4" +msgstr[1] "AT4" #: lang/json/gun_from_json.py msgid "" "Mil-Spec rocket launcher. An 84-mm unguided, portable, single-shot " "recoilless smoothbore weapon used primarily by the US military." msgstr "" +"Es un lanzacohetes Mil-Spec. Un arma de 84mm sin guía, portátil, de un " +"disparo solo, sin retroceso y de ánima lisa, usada primariamente por el " +"ejército de los Estados Unidos." #: lang/json/gun_from_json.py msgid "RM103A automagnum" @@ -121091,14 +125026,14 @@ msgid "" msgstr "" "Originalmente producido para uso militar, el rifle de combate Rivtech RM88 " "fue diseñado para ser duradero y tener mucho poder de fuego bajo condiciones" -" poco ideales, con un caño pesada para tener máxima controlabilidad. Acepta " -"cargadores de caja y cargadores de tambor RMGD250." +" poco ideales, con un cañón pesado para tener máxima controlabilidad. Acepta" +" cargadores de caja y cargadores de tambor RMGD250." #: lang/json/gun_from_json.py msgid "Beretta 90-two" msgid_plural "Beretta 90-twos" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Beretta 90-two" +msgstr[1] "Beretta 90-two" #: lang/json/gun_from_json.py msgid "" @@ -121107,6 +125042,9 @@ msgid "" "futuristic-looking design owed in large parts to the polymer underbarrel " "rail cover." msgstr "" +"Es una versión más moderna de la popular serie 92 de Beretta, la 90-two " +"tiene un desempeña casi igual. La mayor diferencia es su diseño más elegante" +" y casi futurista debido a su cobertura de polímero bajo el cañón." #: lang/json/gun_from_json.py msgid "Calico M960" @@ -121155,8 +125093,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "H&K MP5A2" msgid_plural "H&K MP5A2s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "H&K MP5A2" +msgstr[1] "H&K MP5A2" #: lang/json/gun_from_json.py msgid "" @@ -121184,12 +125122,19 @@ msgid "" "waned in popularity among special forces due to its decreased terminal " "performance." msgstr "" +"El H&K MP5SD ofrece desempeño subsónico con casi el mismo impacto que el H&K" +" MP5, manteniendo su estabilidad. El silenciador grande reduce mucho el " +"destello de la bocacha, un beneficio para operaciones nocturnas. Ha tenido " +"popularidad con los equipos SWAT, ya que disminuye el riesgo de fuegos y " +"explosiones en laboratorios ilegales. Con el uso más común de armaduras " +"blindadas, el MP5SD ha perdido popularidad entre las fuerzas especiales " +"debido a su potencia terminal menor." #: lang/json/gun_from_json.py msgid "H&K MP5K-PDW" msgid_plural "H&K MP5K-PDWs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "H&K MP5K-PDW" +msgstr[1] "H&K MP5K-PDW" #: lang/json/gun_from_json.py msgid "" @@ -121199,12 +125144,17 @@ msgid "" "MP5K-PDW model features a shorter barrel, a built-in foregrip, and a side " "folding stock for vehicle or aircraft crew use." msgstr "" +"El Heckler & Koch MP5 es uno de los subfusiles más utilizados en el mundo, y" +" ha sido adoptado por las fuerzas policiales y militares especiales. Su alto" +" grado de precisión y su poco retroceso son elogiados universalmente. El " +"modelo MP5K-PDW tiene un cañón más corto, empuñadura delantera incorporada y" +" culata que se pliega hacia el costado para uso en vehículo." #: lang/json/gun_from_json.py msgid "PTR 603" msgid_plural "PTR 603s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "PTR 603" +msgstr[1] "PTR 603" #: lang/json/gun_from_json.py msgid "" @@ -121217,12 +125167,20 @@ msgid "" "offers convenient mounting for aftermarket optics, but precludes the use of " "claw mounts." msgstr "" +"El PTR 603 es una copia semiautomática de la famosa serie MP5, producida " +"para el mercado de Estados Unidos por PTR Industries con instrumental " +"Heckler and Koch. Como el MP5, su acción de rodillo de retraso de retroceso " +"ofrece una precisión y disparo más suaves, diferenciándolo de otros " +"subfusiles y pistolas con calibre de carabina. Este modelo está configurado " +"como pistola para evitar las regulaciones costosas e inconvenientes de NFA. " +"Una sección de riel M1913 soldado ofrece una montura conveniente para " +"ópticas de mercados secundarios, pero impide el uso de monturas de garra." #: lang/json/gun_from_json.py msgid "H&K operational briefcase" msgid_plural "H&K operational briefcases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "maletín operativo H&K" +msgstr[1] "maletines operativos H&K" #: lang/json/gun_from_json.py msgid "" @@ -121234,6 +125192,13 @@ msgid "" "while bodyguarding, this is your gun. When the briefcase is open the MP5 " "may be reloaded or dismounted." msgstr "" +"Es un maletín rígido con un gatillo en la manija y un agujero oculto en el " +"costado. Para disparar la MP5K-PDW interna, hay que apoyar el maletín a la " +"cintura, asegurarse de estar apuntándolo hacia el enemigo y apretar el " +"gatillo. La precisión y la maniobrabilidad están severamente dificultadas, " +"pero si necesitás 'entregar la mercancía' o tener un perfil bajo mientras " +"estás cuidando a alguien, esta es tu arma. Cuando el maletín está abierto, " +"el MP5 puede ser recargado o quitado." #: lang/json/gun_from_json.py msgid "Kel-Tec SUB-2000" @@ -121252,8 +125217,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Beretta M9A1" msgid_plural "Beretta M9A1" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Beretta M9A1" +msgstr[1] "Beretta M9A1" #: lang/json/gun_from_json.py msgid "" @@ -121262,12 +125227,17 @@ msgid "" "enforcement before the advent of commercially available polymer-framed " "handguns and the FBI's adoption of .40S&W." msgstr "" +"Es la icónica pistola 9x19mm. La M9 fue el arma de apoyo estándar de las " +"fuerzas armadas de Estados Unidos desde 1985 hasta recientemente. Fue " +"popular entre las fuerzas de la ley antes de la llegada de las armas de mano" +" de polímero y disponibles comercialmente, y la adopción del .40 S&W por " +"parte del FBI." #: lang/json/gun_from_json.py msgid "Beretta Px4 Storm" msgid_plural "Beretta Px4 Storms" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Beretta Px4 Storm" +msgstr[1] "Beretta Px4 Storm" #: lang/json/gun_from_json.py msgid "" @@ -121276,6 +125246,10 @@ msgid "" "was also optimized for concealed carry, while maintaining the reliability " "the 92 series is known for." msgstr "" +"Más liviana que la icónica serie 92 de Beretta, la Px4 Storm fue construida " +"utilizando polímero liviano con inserciones de acero. Su forma fue " +"optimizada para poder llevar oculta pero manteniendo la fiabilidad por la " +"cual es famosa la serie 92." #: lang/json/gun_from_json.py msgid "pipe rifle: 9x19mm" @@ -121286,8 +125260,8 @@ msgstr[1] "rifles de caño: 9x19mm" #: lang/json/gun_from_json.py msgid "Luty SMG: 9x19mm" msgid_plural "Luty SMGs: 9x19mm" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Luty SMG: 9x19mm" +msgstr[1] "Luty SMG: 9x19mm" #: lang/json/gun_from_json.py msgid "" @@ -121297,6 +125271,11 @@ msgid "" "shop, but still very unreliable. This one is chambered for 9x19mm " "cartridges and accepts STEN compatible magazines." msgstr "" +"Es un subfusil de patrón Luty de ánima lisa, construida simplemente de " +"varias partes de acero, usando algunas de las armas de mano más avanzadas. " +"Probablemente sea una de las armas más complejas que se pueden hacer fuera " +"de una fábrica, pero igual es poco fiable. Esta tiene calibre 9x19mm y " +"acepta cargadores compatibles STEN." #: lang/json/gun_from_json.py msgid "STEN" @@ -121381,8 +125360,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Glock 18C" msgid_plural "Glock 18Cs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Glock 18C" +msgstr[1] "Glock 18C" #: lang/json/gun_from_json.py msgid "" @@ -121390,12 +125369,15 @@ msgid "" "Austria's EKO Cobra unit. It has compensator cuts along its barrel to make " "recoil more manageable." msgstr "" +"Es una variante de disparo selectivo de la Glock 17, originalmente diseñada " +"para la unidad EKO Cobra de Austria. Tiene cortes de compensación en el " +"cañón para hacer más manejable el retroceso." #: lang/json/gun_from_json.py msgid "Kel-Tec PF-9" msgid_plural "Kel-Tec PF-9s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Kel-Tec PF-9" +msgstr[1] "Kel-Tec PF-9" #: lang/json/gun_from_json.py msgid "" @@ -121404,24 +125386,30 @@ msgid "" "9x19mm, recoil is best described as unpleasant, and follow-up shots are " "difficult to place quickly." msgstr "" +"La Kel-Tec PF-9 sigue siendo una de las pistolas de apoyo más populares " +"debido a su histórica fiabilidad, bajo costo y ocultabilidad. Con calibre " +"9x19mm, su retroceso se puede describir como desagradable y los disparos " +"posteriores son difíciles de ubicar rápidamente." #: lang/json/gun_from_json.py msgid "M17" msgid_plural "M17s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M17" +msgstr[1] "M17" #: lang/json/gun_from_json.py msgid "" "The M17 is a semi-automatic, short recoil operated pistol derived from the " "SIG Sauer P320." msgstr "" +"La M17 es una pistola semiautomática de retroceso corto derivada de la SIG " +"Sauer P320." #: lang/json/gun_from_json.py msgid "Browning Hi-Power 9x19mm" msgid_plural "Browning Hi-Power 9x19mms" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Browning Hi-Power 9x19mm" +msgstr[1] "Browning Hi-Power 9x19mm" #: lang/json/gun_from_json.py msgid "" @@ -121430,12 +125418,16 @@ msgid "" " Canada and Australia. This is a commercial variant produced by Browning " "Arms in 9x19mm Parabellum." msgstr "" +"La Browning Hi-Power es una arma de mano semiautomática desarrollada poco " +"antes de la segunda guerra mundial. Muy usada desde entonces, sigue en uso " +"en India, Canadá y Australia. Esta es la versión comercial producida por " +"Browning Arms con calibre 9x19mm Parabellum." #: lang/json/gun_from_json.py msgid "Walther P38" msgid_plural "Walther P38s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther P38" +msgstr[1] "Walther P38" #: lang/json/gun_from_json.py msgid "" @@ -121446,12 +125438,18 @@ msgid "" " more modern firearms such as the Beretta 92 series, and served Germany " "until 2004." msgstr "" +"La Walther P38 es un arma de mano semiautomática adoptada poco antes de la " +"segunda guerra mundial. Desarrollada debido al alto costo de producción de " +"su predecesora, la Luger P08, la P38 también tiene calibre 9mm Parabellum. " +"Este temprano diseño DA/SA de cierre bloqueado introduce características " +"vistas luego en armas más modernas como la serie Beretta 92, y fue usada por" +" Alemania hasta 2004." #: lang/json/gun_from_json.py msgid "Walther PPQ 9mm" msgid_plural "Walther PPQ 9mms" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther PPQ 9mm" +msgstr[1] "Walther PPQ 9mm" #: lang/json/gun_from_json.py msgid "" @@ -121459,12 +125457,15 @@ msgid "" "P99QA, and maintains compatibility with some of its predecessor's " "accessories. This model is chambered in 9x19mm Parabellum." msgstr "" +"La Walther PPQ es una pistola semiautomática desarrollada a partir de la " +"Walther P99QA y que mantiene compatibilidad con algunos accesorios de sus " +"predecesoras. Este modelo tiene calibre 9x19mm Parabellum." #: lang/json/gun_from_json.py msgid "Hi-Point C-9" msgid_plural "Hi-Point C-9s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Hi-Point C-9" +msgstr[1] "Hi-Point C-9" #: lang/json/gun_from_json.py msgid "" @@ -121473,28 +125474,39 @@ msgid "" "making said firearms bulky and uncomfortable. Hi-Points have slides made " "with a zinc pot-metal which is relatively fragile compared to steel slides." msgstr "" +"La Hi-Point C-9 es una pistola semiautomática con retroceso simple diseñada " +"por Hi-Point Firearms, que es conocida por hacer armas de fuego baratas y " +"por hacerlas incómodas y voluminosas. Las Hi-Point tiene corredora de zinc " +"que es relativamente frágil comparada con las corredoras de acero." #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" -msgstr[0] "" -msgstr[1] "" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" +msgstr[0] "CZ 75 B" +msgstr[1] "CZ 75 B" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " "pistol remains wildly popular among competition shooters." msgstr "" +"La CZ-75 B es una pistola semiautomática desarrollada en Checoslovaquia y es" +" una de las nueve maravillas originales. Aunque fue diseñada para exportar a" +" países del occidente, fue declarada como secreto de estado. La falta de " +"protección internacional de su patente hizo que muchas copias y variantes " +"fueran producidas y distribuidas por el mundo, con la Česká zbrojovka " +"llegando en la década del 90. Esta pistola sigue siendo popular entre los " +"tiradores de competición." #: lang/json/gun_from_json.py msgid "Walther CCP" msgid_plural "Walther CCPs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Walther CCP" +msgstr[1] "Walther CCP" #: lang/json/gun_from_json.py msgid "" @@ -121504,6 +125516,11 @@ msgid "" " accurate than many other pistols, though this may difficult to realize with" " its average trigger and short sight radius." msgstr "" +"La Walther CCP es una pistola semiautomática con retroceso simple de retardo" +" por gas, pensada para llevar oculta. Internamente, es casi idéntica a la " +"clásica de culto H&K P7. Su diseño de cañón fijo la hace potencialmente más " +"precisa que muchas otras pistolas, aunque sea difícil darse cuenta con su " +"gatillo común y su corto radio de mira." #: lang/json/gun_from_json.py msgid "Makarov PM" @@ -121538,8 +125555,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "BGM-71F TOW" msgid_plural "BGM-71F TOW" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "BGM-71F TOW" +msgstr[1] "BGM-71F TOW" #: lang/json/gun_from_json.py msgid "" @@ -121554,12 +125571,13 @@ msgstr "" #: lang/json/gun_from_json.py msgid "bionic shotgun" msgid_plural "bionic shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta biónica" +msgstr[1] "escopetas biónicas" #: lang/json/gun_from_json.py msgid "Bionic one-shot retracting shotgun integrated with your arm." msgstr "" +"Es una escopeta biónica retráctil de un disparo integrada en tu brazo." #: lang/json/gun_from_json.py msgid "laser finger" @@ -121570,8 +125588,8 @@ msgstr[1] "dedos láser" #: lang/json/gun_from_json.py lang/json/mutation_from_json.py msgid "Assault barbs" msgid_plural "Assault barbs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Púas de asalto" +msgstr[1] "Púas de asalto" #: lang/json/gun_from_json.py msgid "" @@ -121579,13 +125597,14 @@ msgid "" "about anything you put down the barrel, but it will degrade pretty quick." msgstr "" "Es una versión casera del precursor de la escopeta. Es capaz de disparar " -"casi cualquier cosa que le pongas por el caño, pero se estropea rápidamente." +"casi cualquier cosa que le pongas por el cañón, pero se estropea " +"rápidamente." #: lang/json/gun_from_json.py msgid "makeshift chemical thrower" msgid_plural "makeshift chemical throwers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzador químico improvisado" +msgstr[1] "lanzadores químicos improvisados" #: lang/json/gun_from_json.py msgid "" @@ -121607,11 +125626,58 @@ msgid "" " bore barrels. Historically used by egomaniac hunters in Africa, now used " "by their egomaniac descendants in New England." msgstr "" -"Es un arma de cañón de quiebre compuesta por un cañón .30-06 sobre dos " +"Es un arma de cañón basculante compuesta por un cañón .30-06 sobre dos " "cañones calibre 12 gauge suave. Históricamente usada por los cazadores " "egocéntricos en África, ahora es usado por los descendientes egocéntricos en" " New England." +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "rifle de combate PA Md. 68" +msgstr[1] "rifles de combate PA Md. 68" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" +"El arma más popular que usa el cartucho 12.3In es, obviamente, el PA Md. 71." +" Su predecesor, el Md., fue vista por muchos como un fracaso: aunque era " +"fiable y potente, era demasiado pesado para ser usado como arma para " +"infantería, y no lo suficientemente grande como para arma de apoyo. Igual " +"fueron fabricadas suficientes así que durante el apocalipsis zombi ganó " +"popularidad como arma ligera que usa munición ya disponible. Sirvió " +"perfectamente para los propósitos de los Exodii, que tenían mucho menos " +"problemas con su dificultad de manejo." + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "rifle cazazombis PA Md. 71" +msgstr[1] "rifles cazazombis PA Md. 71" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" +"Este rifle de asalto rumano extremadamente popular, que llegó a la fama en " +"la tercera Guerra de los Cárpatos, fue rediseñada levemente por los Exodii " +"para funcionar como arma de francotirador. Es adecuada para tiros precisos " +"contra objetivos prioritarios. Este diseño modificado utiliza una ráfaga " +"extremadamente rápida de 5 tiros, con la intención de destrozar el objetivo " +"y evitar la resucitación." + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -121690,12 +125756,14 @@ msgid "" "A beautifully decorated flintlock pistol. If using this doesn't make you " "feel a pirate, nothing will." msgstr "" +"Es una pistola de chispa hermosamente decorada. Si cuando usás esto no te " +"sentís como un pirata, ninguna otra cosa te lo hará sentir." #: lang/json/gun_from_json.py msgid "flintlock musket" msgid_plural "flintlock muskets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mosquete de chispa" +msgstr[1] "mosquetes de chispa" #: lang/json/gun_from_json.py msgid "" @@ -121720,26 +125788,30 @@ msgid "" "has signficantly increased accuracy at the cost of taking even longer to " "reload." msgstr "" +"También conocido como rifle Pennsylvania, esta arma de chispa de cañón largo" +" tiene una precisión muy mejorada aunque tarda bastante en ser recargada." #: lang/json/gun_from_json.py msgid "barb launching organ" msgid_plural "barb launching organs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "órgano lanzapúas" +msgstr[1] "órganos lanzapúas" #: lang/json/gun_from_json.py msgid "A mutated organ capable of launching bony barbs at great speed." -msgstr "" +msgstr "Es un órgano mutado capaz de lanzar púas óseas a gran velocidad." #: lang/json/gun_from_json.py msgid "electric alien frond" msgid_plural "electric alien fronds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "fronda alienígena eléctrica" +msgstr[1] "frondas alienígenas eléctricas" #: lang/json/gun_from_json.py msgid "Electricity unnaturally arcs from the tips of this alien frond." msgstr "" +"La electricidad salta sobrenaturalmente entre las puntas de esta fronda " +"alienígena." #: lang/json/gun_from_json.py msgid "nail gun" @@ -121752,6 +125824,8 @@ msgid "" "A tool used to drive nails into wood or other material. It could also be " "used as an ad-hoc weapon." msgstr "" +"Es una herramienta usada para meter clavos en la madera u otros materiales. " +"También puede usarse como arma." #: lang/json/gun_from_json.py msgid "Paintball gun" @@ -121781,8 +125855,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "12-gauge gatling gun" msgid_plural "12-gauge gatling guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ametralladora gatling 12-gauge" +msgstr[1] "ametralladoras gatling 12-gauge" #: lang/json/gun_from_json.py msgid "" @@ -121791,12 +125865,16 @@ msgid "" "six separate barrels make for difficult zeroing. The externally driven " "action means this is much less likely to jam." msgstr "" +"Es una escopeta eléctrica gatling de seis cañones, alimentada con cintas " +"hechas de tela. Incluso estando montada apropiadamente, es una bestia " +"incómoda y los seis cañones separados dificultan la puesta a cero. La acción" +" externa hace que sea mucho menos probable que se trabe." #: lang/json/gun_from_json.py msgid "handmade lever shotgun" msgid_plural "handmade lever shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta de palanca casera" +msgstr[1] "escopetas de palanca caseras" #: lang/json/gun_from_json.py msgid "" @@ -121804,12 +125882,15 @@ msgid "" "While still a primitive pipe and 2x4 design, it is a formiddable shotgun in " "it's own right with room for improvement." msgstr "" +"Es una escopeta de acción de palanca corta, hecha en casa, con un pequeño " +"tubo cargador interno. Aunque sigue siendo un primitivo diseño de caño y " +"tabla, es una formidable escopeta con algunos puntos para mejorar." #: lang/json/gun_from_json.py msgid "Browning Auto 5" msgid_plural "Browning Auto 5s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Browning Auto 5" +msgstr[1] "Browning Auto 5" #: lang/json/gun_from_json.py msgid "" @@ -121818,6 +125899,11 @@ msgid "" "million made between 1902 and 1998. The recoil tuning mechanism under the " "handguard and long dwell time of the action make for pleasant shooting." msgstr "" +"Esta escopeta de aspecto humilde fue la primera escopeta semiautomática " +"exitosa, y la segunda más exitosa en la historia de Estados Unidos, con más " +"de 2.7 millones fabricados entre 1902 y 1998. El mecanismo de ajuste de " +"retroceso bajo la empuñadura y el tiempo largo de la acción la hacen " +"placentera de disparar." #: lang/json/gun_from_json.py msgid "Kel-Tec KSG" @@ -121839,8 +125925,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Kel-Tec KSG-25" msgid_plural "Kel-Tec KSG-25" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Kel-Tec KSG-25" +msgstr[1] "Kel-Tec KSG-25" #: lang/json/gun_from_json.py msgid "" @@ -121850,6 +125936,11 @@ msgid "" "situations. The big brother of the KSG, it has a longer barrel and longer " "magazine tubes." msgstr "" +"Es una escopeta bullpup de acción de bombeo, la Kel-Tec KSG utiliza un par " +"de tubos cargadores para aumentar su capacidad. Cada tubo debe ser cargado " +"por separado, pero esto brinda la posibilidad de cargar diferente munición " +"para diferentes situaciones. La hermana mayor de la KSG, tiene un cañón más " +"largo y tubos cargadores más grandes." #: lang/json/gun_from_json.py msgid "M1014 shotgun" @@ -121865,12 +125956,16 @@ msgid "" "Combat Shotgun, the Benelli M4 is one of the finest combat shotguns " "available." msgstr "" +"Es la primera escopeta operada por gas de Benelli, con dos pistones para " +"mejorar la fiabilidad con varias cargas y culata colapsable que reduce el " +"largo en casi 20 centímetros. Adoptada en 1999 como la Escopeta de Combate " +"M1014, la Benelli M4 es una de las mejores escopetas de combate disponibles." #: lang/json/gun_from_json.py msgid "Mossberg 500 Field" msgid_plural "Mossberg 500 Field" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mossberg 500 Field" +msgstr[1] "Mossberg 500 Field" #: lang/json/gun_from_json.py msgid "" @@ -121878,12 +125973,15 @@ msgid "" " for military use. It is noted for its high durability and low recoil. " "This one is fitted with a 28 inch barrel with sight rib." msgstr "" +"La Mossberg 500 es una serie popular de escopetas de acción de bombeo, " +"comúnmente utilizada por los militares. Es notable por su gran durabilidad y" +" su poco retroceso. Esta tiene un cañón de 70 centímetros con sight rib." #: lang/json/gun_from_json.py msgid "Mossberg 500 Security" msgid_plural "Mossberg 500 Security" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mossberg 500 Security" +msgstr[1] "Mossberg 500 Security" #: lang/json/gun_from_json.py msgid "" @@ -121891,12 +125989,15 @@ msgid "" " for military use. It is noted for its high durability and low recoil. " "This one is fitted with an 18.5 inch barrel." msgstr "" +"La Mossberg 500 es una serie popular de escopetas de acción de bombeo, " +"comúnmente utilizada por los militares. Es notable por su gran durabilidad y" +" su poco retroceso. Esta tiene un cañón de 46 centímetros." #: lang/json/gun_from_json.py msgid "Mossberg 590A1" msgid_plural "Mossberg 590A1" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mossberg 590A1" +msgstr[1] "Mossberg 590A1" #: lang/json/gun_from_json.py msgid "" @@ -121904,12 +126005,15 @@ msgid "" " 500. It features a heavier barrel, a bayonet lug, and a different magazine" " tube for easier cleaning and maintenance." msgstr "" +"La Mossberg 590A1 es una versión de la Mossberg 500 orientada para militares" +" y policías. Tiene un cañón más pesado, agarradera para bayoneta y un " +"cargador diferente para facilitar la limpieza y mantenimiento." #: lang/json/gun_from_json.py msgid "Mossberg 930 SPX" msgid_plural "Mossberg 930 SPXs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mossberg 930 SPX" +msgstr[1] "Mossberg 930 SPX" #: lang/json/gun_from_json.py msgid "" @@ -121918,6 +126022,10 @@ msgid "" "Affordable pricing and decent ergonomics make this a popular entry-level " "3-gun shotgun." msgstr "" +"Esta versión semiautomática de Mossberg posee un sistema de gas de reducción" +" de retroceso, miras de rifle y un riel picatinny incorporado de fábrica. Su" +" precio accesible y ergonomía decente la hace una escopeta popular de nivel " +"3." #: lang/json/gun_from_json.py msgid "double-barrel pipe shotgun" @@ -121930,8 +126038,8 @@ msgid "" "A home-made double-barreled shotgun. It is simply two pipes attached to a " "stock, with a pair of hammers to strike the two rounds it holds." msgstr "" -"Una escopeta de doble cañón hecha en casa. Son simplemente dos caños con una" -" culata y un par de percutores para golpear las dos balas que contiene." +"Es una escopeta de doble cañón hecha en casa. Son simplemente dos caños con " +"una culata y un par de percutores para golpear las dos balas que contiene." #: lang/json/gun_from_json.py msgid "pipe shotgun" @@ -121944,14 +126052,14 @@ msgid "" "A home-made shotgun. It is simply a pipe attached to a stock, with a hammer" " to strike the single round it holds." msgstr "" -"Una escopeta hecha en casa. Es simplemente un caño con una culata y un " +"Es una escopeta hecha en casa. Es simplemente un caño con una culata y un " "percutor para golpear la bala que contiene." #: lang/json/gun_from_json.py msgid "Remington 870 Wingmaster" msgid_plural "Remington 870 Wingmaster" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 870 Wingmaster" +msgstr[1] "Remington 870 Wingmaster" #: lang/json/gun_from_json.py msgid "" @@ -121960,12 +126068,16 @@ msgid "" "agencies alike thanks to its high accuracy and muzzle velocity. This one is" " a 28 inch barreled model for hunting fowl and game." msgstr "" +"Con más de 10 millones fabricadas, la Remington 870 es una de las escopetas " +"más populares del mercado, usada tanto por cazadores como por agencias de " +"fuerzas de la ley gracias a su alta precisión y velocidad de bocacha. Esta " +"tiene un cañón de 70 centímetros para caza mayor y de aves." #: lang/json/gun_from_json.py msgid "Remington 870 MCS" msgid_plural "Remington 870 MCSs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 870 MCS" +msgstr[1] "Remington 870 MCS" #: lang/json/gun_from_json.py msgid "" @@ -121975,12 +126087,18 @@ msgid "" "doors you might come across. The grip's design makes for controllable yet " "unpleasant recoil, and the barrel lacks any sights." msgstr "" +"Esta escopeta Remigton 870 con sistema de combate modular es actualmente " +"configurada para operaciones de rompimiento, con un cañón de 25 centímetros " +"y sin culata. Es lo suficientemente chica como para llevar como arma " +"secundaria, específicamente para abrir puertas molestas que te puedas " +"cruzar. El diseño de la empuñadura le da un retroceso desagradable pero " +"controlable, y el cañón no posee miras." #: lang/json/gun_from_json.py msgid "Remington 870 express" msgid_plural "Remington 870 expresses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 870 express" +msgstr[1] "Remington 870 express" #: lang/json/gun_from_json.py msgid "" @@ -121989,12 +126107,16 @@ msgid "" "agencies alike thanks to its high accuracy and muzzle velocity. This one is" " an 18.5 inch barreled defensive model." msgstr "" +"Con más de 10 millones fabricadas, la Remington 870 es una de las escopetas " +"más populares del mercado, usada tanto por cazadores como por agencias de " +"fuerzas de la ley gracias a su alta precisión y velocidad de bocacha. Este " +"modelo defensivo tiene un cañón de 46 centímetros." #: lang/json/gun_from_json.py msgid "Remington 1100 competiton" msgid_plural "Remington 1100 competitons" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Remington 1100 competiton" +msgstr[1] "Remington 1100 competiton" #: lang/json/gun_from_json.py msgid "" @@ -122005,6 +126127,13 @@ msgid "" "the nickel finished, teflon coated competition model, with a full length " "magazine tube and 30 inch barrel." msgstr "" +"Esta escopeta semiautomática posee un sistema de gas compensatorio que puede" +" alimentar una gran variedad de cartuchos y disminuir su retroceso. " +"Introducida en 1963, es la favorita de las fuerzas de la ley, cazadores y " +"tiradores de competencia, y ha sido la escopeta más vendida de autocarga en " +"la historia de Estados Unidos. Este modelo de competición tiene terminación " +"en níquel y cobertura de teflón, con tubo cargador de tamaño completo y " +"cañón de 76 centímetros." #: lang/json/gun_from_json.py msgid "shotgun revolver" @@ -122034,6 +126163,11 @@ msgid "" "Mikhail Kalashnikov, and was popular in open division shotgun competitions " "prior to its ban from import via executive order." msgstr "" +"La Saiga-12 es una escopeta semiautomática diseñada con el mismo modelo de " +"Kalashnikov de los rifles AK47. Utiliza un cargador, en lugar de tener que " +"poner cada cartucho de a uno como en la mayoría de las escopetas. Es uno de " +"los últimos diseños de Mikhail Kalashnikov y fue popular en competiciones de" +" escopetas antes de prohibirse su importación por una orden ejecutiva." #: lang/json/gun_from_json.py msgid "double barrel shotgun" @@ -122046,8 +126180,8 @@ msgid "" "An old shotgun, possibly antique. It is little more than a pair of barrels," " a wood stock, and a hammer to strike the cartridges." msgstr "" -"Una vieja escopeta, posiblemente una antigüedad. Es prácticamente un par de " -"cañones, una culata de madera y un percutor para pegarle a los cartuchos." +"Es una vieja escopeta, posiblemente una antigüedad. Es prácticamente un par " +"de cañones, una culata de madera y un percutor para pegarle a los cartuchos." #: lang/json/gun_from_json.py msgid "single barrel shotgun" @@ -122068,8 +126202,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Cobray Streetsweeper" msgid_plural "Cobray Streetsweepers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Cobray Streetsweeper" +msgstr[1] "Cobray Streetsweeper" #: lang/json/gun_from_json.py msgid "" @@ -122079,12 +126213,18 @@ msgid "" " an ejector rod. Its unique design allows for all 12 shells to be fired in " "under 3 seconds, as demonstrated by the ATF technical branch." msgstr "" +"Es menos una escopeta que un revólver graciosamente grande, el Cobray " +"Streetsweeper se vendió poco antes de ser considerada un dispositivo de " +"destrucción. El cilindro está guiado por un contractor giratorio, no puede " +"ser preparado a mano y debe ser eyectado con un palo eyector. Su diseño " +"único le permite disparar los 12 cartuchos en menos de 3 segundos, como fue " +"demostrado por los técnicos de ATF." #: lang/json/gun_from_json.py msgid "Franchi SPAS-12" msgid_plural "Franchi SPAS-12s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Franchi SPAS-12" +msgstr[1] "Franchi SPAS-12" #: lang/json/gun_from_json.py msgid "" @@ -122094,12 +126234,16 @@ msgid "" "semi-automatic firearm, with an arm stabilizing hook for one handed " "shooting." msgstr "" +"De apariencia intimidatoria, la SPAS 12 tiene el dudoso honor de ser " +"declarada dispositivo de destrucción y ser prohibida su importación, además " +"de su considerable atractivo. Es una combinación de acción de bombeo y " +"semiautomática, con un brazo de estabilización para disparar con una mano." #: lang/json/gun_from_json.py msgid "Tavor TS12" msgid_plural "Tavor TS12s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tavor TS12" +msgstr[1] "Tavor TS12" #: lang/json/gun_from_json.py msgid "" @@ -122109,12 +126253,17 @@ msgid "" "more like a sci-fi prop gun than a firearm. An integral top rail is " "provided for mounting sights." msgstr "" +"Es una escopeta bullpup de triple cargador y operada por gas fabricada por " +"Israeli Weapon Industries. Es capaz de cargar 15 cartuchos todo en un " +"paquete relativamente pequeño. Como muchos otros diseños de IWI, este parece" +" más un arma de ciencia ficción que un arma de fuego. Un riel integrado " +"superior permite montarle miras." #: lang/json/gun_from_json.py msgid "USAS 12" msgid_plural "USAS 12s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "USAS 12" +msgstr[1] "USAS 12" #: lang/json/gun_from_json.py msgid "" @@ -122123,12 +126272,16 @@ msgid "" "or drum magazines. The in-line recoil system and sheer weight make for " "pleasant shooting." msgstr "" +"La USAS 12 parece un caricatura medio cuadrada de la M16A2. Al igual que su " +"predecesor Auto Assault-12, es una escopeta de disparo selectivo alimentada " +"con cargadores de tambor o de caja. El sistema de retroceso interno y el " +"peso disminuido la hacen agradable de disparar." #: lang/json/gun_from_json.py msgid "1887 bootleg shotgun" msgid_plural "1887 bootleg shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta trucha 1887" +msgstr[1] "escopetas truchas 1887" #: lang/json/gun_from_json.py msgid "" @@ -122138,12 +126291,18 @@ msgid "" "today. This one has a very short barrel, no stock, and would pair nicely " "with a motorcycle jacket and a Harley Davidson." msgstr "" +"Una de las primeras escopetas de repetición comercialmente exitosas, la " +"Winchester 1887 fue realizada específicamente con acción de palanca por " +"pedido de Winchester. Aunque luego fue tapada por el éxito de mejores " +"diseños, la 1887 sigue siendo popular hoy. Esta tiene un cañón muy corto, no" +" tiene culata y hace buena pareja con una campera de motoquero y una Harley " +"Davidson." #: lang/json/gun_from_json.py msgid "M1897 Trench Gun" msgid_plural "M1897 Trench Guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M1897 de Trinchera" +msgstr[1] "M1897 de Trinchera" #: lang/json/gun_from_json.py msgid "" @@ -122154,6 +126313,27 @@ msgid "" " There aren't any more trenches to clear, so the next zombie infested town " "will have to suffice." msgstr "" +"La Winchester 1897 fue una de las primeras escopetas de acción de bombeo " +"exitosas. En esta configuración 'de trinchera' ha sido romantizada como un " +"ícono estadounidense de la Primera Guerra Mundial. Con su cañón tapado, " +"agarradera para bayoneta y bayoneta de 43 centímetros, esta escopeta es " +"innegablemente temida por su apariencia. Ya no hay tantas trincheras para " +"despejar, así que la próxima ciudad infectada de zombis va a tener que ser " +"el objetivo." + +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "escopeta cuatro vientos" +msgstr[1] "escopetas cuatro vientos" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" +"Es una escopeta simple compuesta de dos caños gruesos de acero, una tapa en " +"la punta y un clavo. La ausencia de miras la hacen solamente útil de cerca." #: lang/json/gun_from_json.py msgid "flaregun" @@ -122184,8 +126364,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "CMES laser cannon" msgid_plural "CMES laser cannons" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cañón láser CMES" +msgstr[1] "cañones láser CMES" #: lang/json/gun_from_json.py msgid "" @@ -122193,18 +126373,23 @@ msgid "" "rotating-barrel active-cooled rapid-fire laser system, can spray death " "downrange with ease." msgstr "" +"Es un sistema integrado de armas para el el mecatraje exoesqueleto CMES. Un " +"sistema de cañón rotativo de disparo rápido de láser que puede esparcir la " +"muerte con facilidad." #: lang/json/gun_from_json.py msgid "RMES marksman system" msgid_plural "RMES marksman systems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sistema francotirador RMES" +msgstr[1] "sistemas francotirador RMES" #: lang/json/gun_from_json.py msgid "" "This is the integral weapon system for the RMES exoskeleton mech-suit, a " "quiet and accurate marksman laser rifle." msgstr "" +"Es un sistema integrado de armas para el el mecatraje exoesqueleto RMES. Un " +"rifle de francotirador silencioso y preciso." #: lang/json/gun_from_json.py msgid "A7 laser rifle" @@ -122219,6 +126404,11 @@ msgid "" "corporate skulduggery. Though the Cataclysm put that on the ash heap of " "history, this weapon can still do the same to your foes." msgstr "" +"Es un rifle láser de última generación, desarrollado por el equipo de " +"investigación y desarrollo \"Aerial Lbas\". Compitió con lo mejor de " +"Rivtech, y hubo rumores sobre trampas empresariales. Aunque el Cataclismo " +"puso eso en la pila de cenizas de la historia, esta arma puede hacer lo " +"mismo con tus enemigos." #: lang/json/gun_from_json.py msgid "V29 laser pistol" @@ -122231,6 +126421,8 @@ msgid "" "This V29 laser pistol was one of the first handheld laser weapons. It is " "larger than most traditional handguns, but displays no recoil whatsoever." msgstr "" +"Esta pistola láser V29 fue una de las primeras armas láser de mano. Es más " +"grande que la mayoría de las pistolas, pero no tiene retroceso." #: lang/json/gun_from_json.py msgid "self bow" @@ -122244,6 +126436,9 @@ msgid "" " the person using it. Weak and wildly inaccurate, it doesn't work that " "well, unfortunately…" msgstr "" +"Es un arco primitivo de una sola pieza de madera, hecho específicamente para" +" la persona que lo está usando. No es potente y poco preciso… " +"lamentablemente, no es muy bueno." #: lang/json/gun_from_json.py msgid "short bow" @@ -122458,6 +126653,9 @@ msgid "" "projectiles instead of the traditional quarrel. Primarily intended for " "hunting small game." msgstr "" +"Es una versión modificada de la ballesta clásica, que te permite utilizar " +"piedras como proyectiles en lugar de los tradicionales pernos. " +"Originalmente, fue pensada para cazar animales pequeños." #: lang/json/gun_from_json.py msgid "pistol crossbow" @@ -122486,6 +126684,8 @@ msgid "" "A slow-loading hand weapon that launches bolts. Bolts fired from this " "weapon have a good chance of remaining intact for re-use." msgstr "" +"Es un arma de mano de recarga lenta que lanza pernos. Los pernos disparados " +"con esta arma tienen una gran probabilidad de no romperse." #: lang/json/gun_from_json.py msgid "composite crossbow" @@ -122554,8 +126754,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "PPA-5" msgid_plural "PPA-5s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "PPA-5" +msgstr[1] "PPA-5" #: lang/json/gun_from_json.py msgid "" @@ -122565,6 +126765,12 @@ msgid "" " It was designed to take down heavy vehicles, and was expected to fully " "enter US Army service not long before the Cataclysm." msgstr "" +"Llamado así por sus siglas en inglés de Acelerador Portátil de Plasma Modelo" +" Cinco, desarrollado por Lockheed Martin Corporation. Este dispositivo " +"utiliza bancos de capacitores avanzados par crear un anillo de plasma de " +"hidrógeno supercalentado y acelerarlo a increíble velocidad. Fue diseñado " +"para destruir vehículos grandes y se esperaba que entrara en servicio en el " +"Ejército de Estados Unidos poco antes del Cataclismo." #: lang/json/gun_from_json.py msgid "Boeing XM-P plasma rifle" @@ -122661,14 +126867,16 @@ msgstr "" msgctxt "weapon" msgid "sling" msgid_plural "slings" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "honda" +msgstr[1] "hondas" #: lang/json/gun_from_json.py msgid "" "A leather sling, can launch rocks much further and faster than throwing them" " by hand." msgstr "" +"Es una honda de cuero. Puede lanzar piedras mucho más lejos y rápido que si " +"lo hicieras con la mano." #: lang/json/gun_from_json.py msgctxt "gun_type_type" @@ -122686,18 +126894,22 @@ msgid "" "A forked piece of wood with an elastic band stretched between two of its " "tips. Can launch tiny pebbles and similar things at high speeds." msgstr "" +"Es un pedazo de madera bifurcado con una banda elástica estirada entre las " +"dos puntas. Puede lanzar piedritas y cosas similares a gran velocidad." #: lang/json/gun_from_json.py msgid "staff sling" msgid_plural "staff slings" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "honda con vara" +msgstr[1] "hondas con vara" #: lang/json/gun_from_json.py msgid "" "This staff can launch rocks with a whiping motion that sends them flying " "much further and faster than throwing them." msgstr "" +"Esta vara puede lanzar piedras con un movimiento de látigo que las arroja " +"volando mucho más lejos y rápido que si lo hicieras con la mano." #: lang/json/gun_from_json.py msgid "brace slingshot" @@ -122710,6 +126922,8 @@ msgid "" "A modern slingshot with a wrist brace, allowing it to fire tiny objects " "slightly more forcefully than a simple wooden slingshot." msgstr "" +"Es una gomera moderna con apoyo para la muñeca, que permite disparar " +"pequeños objetos un poco más ferozmente que con una gomera simple de madera." #: lang/json/gun_from_json.py msgid "pneumatic speargun" @@ -122838,20 +127052,22 @@ msgstr "" #: lang/json/gun_from_json.py msgid "vibrating bioblaster" msgid_plural "vibrating bioblasters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "bioblaster vibrante" +msgstr[1] "bioblasteres vibrantes" #: lang/json/gun_from_json.py msgid "" "You ripped this from a mi-go abomination. You think you should wear gloves " "to reload it. " msgstr "" +"Le sacaste esto a una abominación mi-go. Te parece que deberías usar guantes" +" para recargarlo." #: lang/json/gun_from_json.py msgid "hard-light longbow" msgid_plural "hard-light longbows" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arco largo de luz dura" +msgstr[1] "arcos largos de luz dura" #: lang/json/gun_from_json.py msgid "" @@ -122862,18 +127078,28 @@ msgid "" "not as powerful as conventional ballistic weapons. It runs off of UPS " "power, and rather efficiently so." msgstr "" +"Es un arco largo de metal blanco, elegante y sin cuerda, construido con " +"materiales ultralivianos de la era atómica. En lugar de usar munición, cada " +"disparo usa proyectores de alta tecnología para crear una cuerda y una " +"flecha de luz dura en el lugar, lo que otorga excelente precisión y " +"penetración de armadura. Igual, al ser un arco, no es tan potente como armas" +" de fuego convencionales. Funciona con un UPS y de manera bastante " +"eficiente." #: lang/json/gun_from_json.py msgid "deployed grenade launcher" msgid_plural "deployed grenade launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzagranadas desplegado" +msgstr[1] "lanzagranadas desplegados" #: lang/json/gun_from_json.py msgid "" "A grenade launcher mounted onto your right-hand wrist. Less powerful than a" " proper grenade launcher, but infinitely more portable, and quick to reload." msgstr "" +"Es un lanzagranadas montado en tu muñeca derecha. Menos potente que un " +"lanzagranadas convencional pero definitivamente más portátil y rápido de " +"recargar." #: lang/json/gun_from_json.py msgid "shoddy laser rifle" @@ -122892,8 +127118,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "eidolon derringer" msgid_plural "eidolon derringers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "derringer eidolon" +msgstr[1] "derringeres eidolon" #: lang/json/gun_from_json.py msgid "" @@ -122901,12 +127127,15 @@ msgid "" "operations and close range assassination. It will fire up to four 5x50mm " "penetrators simultaneously, to devastating effect." msgstr "" +"Es un derringer miniatura diseñado como arma de apoyo para operaciones " +"encubiertas y asesinatos a corta distancia. Puede disparar hasta cuatro " +"penetradores 5x50mm de manera simultánea, causando un efecto devastador." #: lang/json/gun_from_json.py msgid "wrist-stunner" msgid_plural "wrist-stunners" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "aturdidor de muñeca" +msgstr[1] "aturdidores de muñeca" #: lang/json/gun_from_json.py msgid "" @@ -122914,12 +127143,15 @@ msgid "" "laser stun gun embed on its wrist is still functional, and can be used when " "connected to an UPS." msgstr "" +"Es una mano robótica cortada de un Centinela Wraitheon. La potente arma de " +"aturdimiento de electroláser metida en su muñeca todavía funciona, y puede " +"ser usada si está conectada a un UPS." #: lang/json/gun_from_json.py msgid "wrist-trilaser" msgid_plural "wrist-trilasers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "triláser de muñeca" +msgstr[1] "triláseres de muñeca" #: lang/json/gun_from_json.py msgid "" @@ -122927,16 +127159,54 @@ msgid "" "the wraitheon drone it originally belonged too. Can still be fired when " "connected to an UPS." msgstr "" +"Es una potente arma láser de tres cañones, todavía montada en la mano " +"robótica de un dron wraitheon al que pertenecía originalmente. Todavía puede" +" ser disparada si se la conecta a un UPS." #: lang/json/gun_from_json.py msgid "trilaser" +msgstr "triláser" + +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "arma craneal biónica" +msgstr[1] "armas craneales biónicas" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" +"Es una pistola biónica .40 de un disparo solo integrada en tu cabeza, bajo " +"la piel." + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "Marlin 39A modificado" +msgstr[1] "Marlin 39A modificados" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" +"Es un Marlin 39A modificado para ser usado en la torreta de un vehículo." + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "SKS modificada" +msgstr[1] "SKS modificadas" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." msgstr "" +"Es una SKS modificada para ser adecuada para usar en la torreta de un " +"vehículo." #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] ".5 LP CRIT" +msgstr[1] ".5 LP CRIT" #: lang/json/gun_from_json.py msgid "" @@ -122945,12 +127215,17 @@ msgid "" "compensates for the lack of raw power and yet the gun manages to be " "relatively easy to aim and lightweight due to the superalloy construction." msgstr "" +"Es un arma de apoyo experimental de baja potencia, bajo desarrollo de " +"C.R.I.T R&D. La .5 LP es una pistola láser relativamente débil pero precisa." +" El diseño con dos cañones compensa la falta de poder y de todas maneras el " +"arma logra ser fácil de apuntar y liviana debido a su construcción de " +"superaleación." #: lang/json/gun_from_json.py msgid "CRIT Chain Laser" msgid_plural "CRIT Chain Lasers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Láser Encadenado CRIT" +msgstr[1] "Láser Encadenado CRIT" #: lang/json/gun_from_json.py msgid "" @@ -122959,36 +127234,45 @@ msgid "" "drill, this gun is a relatively light weapon for the amount of UPS it eats " "and destruction it can cause." msgstr "" +"Es la comprobada favorita de las forjas infernales de R&D. Basada en un " +"video de investigación sobre tres .5 LP atados juntos en un taladro de mano," +" esta arma es relativamente liviana para la cantidad de UPS que consume y la" +" destrucción que puede causar." #: lang/json/gun_from_json.py msgid "CRIT Laser Carbine" msgid_plural "CRIT Laser Carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Carabina Láser CRIT" +msgstr[1] "Carabinas Láser CRIT" #: lang/json/gun_from_json.py msgid "" "A short-barrel lightweight laser gun developed by C.R.I.T R&D. Mainly " "developed to test out a new breakthrough in laser weapons." msgstr "" +"Es un arma láser liviana de cañón corto desarrollada por C.R.I.T. R&D. " +"Principalmente desarrollada para probar un nuevo descubrimiento en armas " +"láser." #: lang/json/gun_from_json.py msgid "CRIT Energy Rifle" msgid_plural "CRIT Energy Rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Rifle de Energía CRIT" +msgstr[1] "Rifles de Energía CRIT" #: lang/json/gun_from_json.py msgid "" "A heavy energy gun developed by C.R.I.T R&D. Mainly developed to test out a" " new breakthrough in hybrid weaponry." msgstr "" +"Es un arma grande de energía desarrollada por C.R.I.T. R&D. Principalmente " +"desarrollada para probar un nuevo descubrimiento en armas híbridas." #: lang/json/gun_from_json.py msgid "CRIT CQB Standard Issue" msgid_plural "CRIT CQB Standard Issues" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "reglamentario CRIT de Pelea en Espacios Cerrados" +msgstr[1] "reglamentarios CRIT de Pelea en Espacios Cerrados" #: lang/json/gun_from_json.py msgid "" @@ -122998,26 +127282,34 @@ msgid "" "user's force and the rugged construction with tonfa-like grip can handle " "bashing in enemy heads." msgstr "" +"Es un simple arma combinada. Es una carabina semiautomática militar con la " +"versatilidad a media distancia del 9mm y la potencia de la escopeta 12 " +"gauge. Para completar más el aspecto de pelea en espacio cerrado, la culata " +"está construida para amplificar la fuerza del usuario y la construcción " +"robusta con una empuñadura similar a un tonfa puede romper la cabeza de un " +"enemigo." #: lang/json/gun_from_json.py msgid "CRIT Fire Glove" msgid_plural "CRIT Fire Gloves" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Guante de Fuego CRIT" +msgstr[1] "Guantes de Fuego CRIT" #: lang/json/gun_from_json.py msgid "Experimental CQB weapon system under development in C.R.I.T R&D." msgstr "" +"Es un sistema experimantal de pelea en espacios cerrados, bajo desarrollo de" +" C.R.I.T R&D." #: lang/json/gun_from_json.py msgid "blast" -msgstr "" +msgstr "explosión" #: lang/json/gun_from_json.py msgid "pellet gun" msgid_plural "pellet guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arma de aire comprimido" +msgstr[1] "armas de aire comprimido" #: lang/json/gun_from_json.py msgid "" @@ -123027,24 +127319,31 @@ msgid "" "short, but the break action charging system requires some arm strength to " "load a pellet." msgstr "" +"Es un arma de aire sorprendentemente potente que puede usarse para cazar " +"animales pequeños. Los pequeños perdigones de plomo o aleación que puede " +"usar brindan una potencia decente en cada tiro. Es bastante precisa y puede " +"hacer tanto daño como un .22 corto, pero el sistema de carga de cañón " +"basculante requiere un poco de fuerza de brazos para cargar los perdigones." #: lang/json/gun_from_json.py msgid "Plasma Cutter" msgid_plural "Plasma Cutters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Cortador de Plasma" +msgstr[1] "Cortadores de Plasma" #: lang/json/gun_from_json.py msgid "" "Experimental cutting tool under development in C.R.I.T R&D. It fires an " "extremely hot wave of plasma that slices into materials." msgstr "" +"Es una herramienta experimental de corte desarrollada por C.R.I.T. R&D. " +"Dispara una onda extremadamente caliente de plasma que corta los materiales." #: lang/json/gun_from_json.py msgid "Rivet Driver" msgid_plural "Rivet Drivers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "remachadora eléctrica" +msgstr[1] "remachadoras eléctricas" #: lang/json/gun_from_json.py msgid "" @@ -123053,24 +127352,31 @@ msgid "" "firing it out, upon reaching a target, the fragile stake explodes into " "shards inside the target." msgstr "" +"Es una herramienta experimental de doble propósito bajo desarrollo de " +"C.R.I.T R&D. Usa un clavo normal y lo alarga en una fracción de segundo " +"antes de dispararlo, y al alcanzar el objetivo, el frágil proyectil explota " +"en esquirlas dentro." #: lang/json/gun_from_json.py msgid "Line Gun" msgid_plural "Line Guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Cañón Líneal" +msgstr[1] "Cañones Líneales" #: lang/json/gun_from_json.py msgid "" "Experimental high power cutting tool under development in C.R.I.T R&D. It " "fires plasma in a wide line for slicing into dense materials." msgstr "" +"Es una herramienta experimental de corte de alta potencia desarrollada por " +"C.R.I.T. R&D. Dispara plasma en una línea ancha para cortar los materiales " +"densos." #: lang/json/gun_from_json.py msgid "Pulse Rifle" msgid_plural "Pulse Rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Rifle de Pulso" +msgstr[1] "Rifles de Pulso" #: lang/json/gun_from_json.py msgid "" @@ -123078,22 +127384,27 @@ msgid "" "Great for enclosed spaces and mobs of enemies. Shoots alloy rounds which " "instantly mushroom out upon impact." msgstr "" +"Es un rifle subsónico experimental de tres cañones bajo desarrollo de " +"C.R.I.T R&D. Muy bueno para espacios cerrados y contra grupos de enemigos. " +"Dispara balas de aleación que se abren al impactar." #: lang/json/gun_from_json.py msgid "Ripper" msgid_plural "Rippers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Destripador" +msgstr[1] "Destripadores" #: lang/json/gun_from_json.py msgid "" "Experimental EM saw under development in C.R.I.T R&D. Great for distance " "cutting of material." msgstr "" +"Es una herramienta experimental electromagnética desarrollada por C.R.I.T. " +"R&D. Es muy buena para cortar materiales a distancia." #: lang/json/gun_from_json.py msgid "em field saw" -msgstr "" +msgstr "sierra de campo electromagnético" #: lang/json/gun_from_json.py msgid "" @@ -123110,8 +127421,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Yeet Cannon" msgid_plural "Yeet Cannons" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Cañón Sacudidor" +msgstr[1] "Cañones Sacudidores" #: lang/json/gun_from_json.py msgid "" @@ -123119,6 +127430,8 @@ msgid "" "the zombies in your path, all the hulks, the spiders, and those damned mole " "rats." msgstr "" +"Podés sacudir todas las balas con esta joyita. Sacudiles a todos los zombis " +"que se te crucen, los gigantones, las arañas y todas esas ratas de mierda." #: lang/json/gun_from_json.py msgid "fake flamesword" @@ -123180,12 +127493,15 @@ msgid "" "much punch as the best of 'em and rewards the skilled shooter with easily-" "crafted ammunition." msgstr "" +"Esta antigua arma de fuego carece del ritmo de disparo de las armas modernas" +" pero causa tanto daño como la mejor, y premia al tirador habilidoso con una" +" munición fácil de fabricar." #: lang/json/gun_from_json.py msgid "pipe rifle" msgid_plural "pipe rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle de caño" +msgstr[1] "rifles de caño" #: lang/json/gun_from_json.py msgid "" @@ -123194,12 +127510,16 @@ msgid "" "There's no extractor, so it might be slow to reload, and its construction " "makes for poor reliability and longevity." msgstr "" +"Es un arma larga rudimentaria con calibre de munición estándar de rifle, " +"reforzada cerca de la recámara. Contiene una sola bala y tiene un mecanismo " +"rudimentario de disparo. No tiene extractor, así que es un poco lenta para " +"recargar, y su construcción la hace ser poco fiable y poco duradera." #: lang/json/gun_from_json.py msgid "survivor carbine" msgid_plural "survivor carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina de supervivencia" +msgstr[1] "carabinas de supervivencia" #: lang/json/gun_from_json.py msgid "" @@ -123209,12 +127529,17 @@ msgid "" " ideal durability and reliability, but this should still be a serviceable " "weapon, provided you can stay accurate with it." msgstr "" +"Es una carabina de construcción rudimentaria con calibre para munición " +"estándar de rifle, alimentada con cargadores de rifles de servicio. Posee un" +" sistema rudimentario de acción de palanca. Las grandes presiones " +"involucradas y la construcción cuestionable la hacen poco fiable y poco " +"duradera, pero se puede usar, si sos capaz de ser preciso con ella." #: lang/json/gun_from_json.py msgid "antique pistol" msgid_plural "antique pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola antigua" +msgstr[1] "pistolas antiguas" #: lang/json/gun_from_json.py msgid "" @@ -123223,12 +127548,17 @@ msgid "" "and is theoretically sustainable. Range and accuracy are hampered by lack " "of rifling, but this old design is still plenty lethal." msgstr "" +"Esta anticuada pistola de un disparo solo que completa muy bien el uniforme " +"de pirata. Aunque es lenta para cargar, no necesita vainas de latón para " +"poder disparar, y es, teóricamente, ecológica. La distancia y la precisión " +"se ven disminuidas por la ausencia de estriado, pero este viejo diseño igual" +" es bastante letal." #: lang/json/gun_from_json.py msgid "antique revolver" msgid_plural "antique revolvers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "revólver antiguo" +msgstr[1] "revólveres antiguos" #: lang/json/gun_from_json.py msgid "" @@ -123237,12 +127567,16 @@ msgid "" "fairly lengthy process. Despite its age, this type of weapon would perform" " adequately against most two-legged threats." msgstr "" +"Es un viejo revólver diseñado durante el periodo de la emigración al oeste. " +"Deben cargarse cartuchos de papel de pólvora por cada disparo, lo que " +"resulta un proceso largo. A pesar de su edad, este tipo de armas se " +"desempeña adecuadamente contra la mayoría de amenazas de dos patas." #: lang/json/gun_from_json.py msgid "antique musket" msgid_plural "antique muskets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mosquete antiguo" +msgstr[1] "mosquetes antiguos" #: lang/json/gun_from_json.py msgid "" @@ -123252,12 +127586,18 @@ msgid "" "theoretically sustainable to fire. Range and accuracy are hampered by lack " "of rifling, but this time-tested design is plenty lethal." msgstr "" +"Con un diseño antiguo, esta arma larga de ánima lisa se vería más acorde en " +"un campo de batalla de antes de 1850 que en tus manos durante el Cataclismo." +" Es lenta para cargar pero no necesita vainas de latón para poder disparar, " +"y es, teóricamente, ecológica de usar. La distancia y la precisión se ven " +"disminuidas por la ausencia de estriado, pero este diseño que superó el paso" +" del tiempo es bastante letal." #: lang/json/gun_from_json.py msgid "grenade launcher" msgid_plural "grenade launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzagranadas" +msgstr[1] "lanzagranadas" #: lang/json/gun_from_json.py msgid "" @@ -123267,12 +127607,17 @@ msgid "" "personnel. Still deadly against hard or soft targets, depending on what " "cartridges are available." msgstr "" +"Es un viejo lanzagranadas de un disparo, que es parecida a una escopeta " +"recortada. Aunque ya ha sido reemplazado por los lanzadores de bajo el " +"cañón, los modelos dedicados como este han sido usados por las fuerzas de la" +" ley y el personal antidisturbios. Sigue siendo letal contra objetivos " +"suaves o duros, dependiendo del cartucho que esté usando." #: lang/json/gun_from_json.py msgid "automatic grenade launcher" msgid_plural "automatic grenade launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzagranadas automático" +msgstr[1] "lanzagranadas automáticos" #: lang/json/gun_from_json.py msgid "" @@ -123283,12 +127628,19 @@ msgid "" " isn't enough to solve your problems, surely a dozen more are. This must be" " mounted on a frame to be fired, and reloading is a bit slow." msgstr "" +"Este lanzagranadas grande e incómodo parece el hijo de una ametralladora y " +"un mortero. Su calibre es enorme y su acción es simplemente masiva. Un " +"enorme cinturón con cartuchos de granada las cargan en la bandeja, lo que " +"permite lanzar varias granadas en sucesión rápida. Si una granada disparada " +"no es suficiente para resolver tu problema, seguro que una docena lo será. " +"Este lanzagranadas tiene que estar montado en una estructura para ser usado," +" y es lento para recargar." #: lang/json/gun_from_json.py msgid "grenade pistol" msgid_plural "grenade pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola de granadas" +msgstr[1] "pistolas de granadas" #: lang/json/gun_from_json.py msgid "" @@ -123300,12 +127652,19 @@ msgid "" "devastating against hard or soft targets. This could be attached to a " "suitable rifle, if so desired." msgstr "" +"Es una pistola regordeta de un disparo solo con un cañón de calibre grande, " +"adecuada para lanzar granadas y bengalas. Es un arma más conveniente para " +"transportar un lanzagranadas que los que van montados en rifles, común entre" +" las fuerzas especiales. En años más recientes, se vendieron algunas " +"versiones para lanzar bengalas. Con el cartucho adecuado, sería devastadora " +"contra objetivos duros o suaves. Puede ser unido a un rifle compatible, si " +"se quiere." #: lang/json/gun_from_json.py msgid "revolver grenade launcher" msgid_plural "revolver grenade launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "revólver lanzagranadas" +msgstr[1] "revólveres lanzagranadas" #: lang/json/gun_from_json.py msgid "" @@ -123315,12 +127674,18 @@ msgid "" "must be re-wound. Needless to say, six well placed shots is an incredible " "amount of firepower, depending on the cartridges loaded." msgstr "" +"Se parece a un revólver grande de un dibujito animado, este lanzador es " +"capaz de disparar seis granadas en una sucesión rápida. Su enorme cilindro " +"está envuelto por un contractor giratorio, que acelera el disparo pero hace " +"más lenta la recarga, ya que tiene que ser enrollado nuevamente. No hay " +"necesidad de decir pero seis disparos es una increíble cantidad de poder de " +"fuego, dependiendo de los cartuchos usados." #: lang/json/gun_from_json.py msgid "cowboy carbine" msgid_plural "cowboy carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina de cowboy" +msgstr[1] "carabinas de cowboy" #: lang/json/gun_from_json.py msgid "" @@ -123330,12 +127695,17 @@ msgid "" "the number of calibers carried and squeeze more power from their pistol " "ammunition." msgstr "" +"Desde los primeros días de la emigración al oeste, cuando la munición era " +"escasa, los tiradores buscaron compartir munición entre sus armas de apoyo y" +" armas largas. Esta carabina de acción de palanca le permite al tirador " +"reducir el número de calibres llevados y exprimir más potencia de la " +"munición de pistola." #: lang/json/gun_from_json.py msgid "machine pistol" msgid_plural "machine pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola ametralladora" +msgstr[1] "pistolas ametralladora" #: lang/json/gun_from_json.py msgid "" @@ -123344,12 +127714,17 @@ msgid "" " Machine pistols mostly see use by vehicle crewmen or bodygaurds of VIPs. " "Due to its preposterous rate of fire it is difficult to control." msgstr "" +"Esta pistola es una ametralladora chiquita que podés meter en una funda y " +"con la que podés vaciarle el cargador a un velocidad feroz contra enemigos " +"cercanos. Las pistolas ametralladora son usadas mayormente por hombres en " +"vehículos o guardaespaldas. Su absurda velocidad de disparo la hace difícil " +"de controlar." #: lang/json/gun_from_json.py msgid "defensive pistol" msgid_plural "defensive pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola defensiva" +msgstr[1] "pistolas defensivas" #: lang/json/gun_from_json.py msgid "" @@ -123358,12 +127733,16 @@ msgid "" "capable of meeting FBI penetration minimums, the lack of a shoulder stock " "limits its utility." msgstr "" +"Es una pistola moderna ideal para servicio policial, militar o defensa " +"personal, con un cargador de caja extraíble y una acción fiable. A pesar de " +"que su calibre es capaz de cumplir con los requisitos de penetración del " +"FBI, la ausencia de culata de apoyo limita su utilidad." #: lang/json/gun_from_json.py msgid "survivalist carbine" msgid_plural "survivalist carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina de supervivencia" +msgstr[1] "carabinas de supervivencia" #: lang/json/gun_from_json.py msgid "" @@ -123373,12 +127752,17 @@ msgid "" "with duty pistols, allowing one to transition to a more stable weapon " "without carrying extra ammo or magazines." msgstr "" +"Estas pequeñas carabinas comparten la munición y cargadores de las pistolas " +"comunes, lo que la hace más controlable que un rifle normal, y también " +"disminuye el costo de la munición. Debido a su compatibilidad, son buena " +"compañía de pistolas de servicio, permitiendo la transición a un arma más " +"estable sin tener que llevar otros cargadores o munición." #: lang/json/gun_from_json.py msgid "police revolver" msgid_plural "police revolvers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "revólver de policía" +msgstr[1] "revólveres de policía" #: lang/json/gun_from_json.py msgid "" @@ -123389,6 +127773,12 @@ msgid "" "make for a serviceable sidearm, and there are no magazines for you to lose " "or damage." msgstr "" +"Los revólveres como este, con calibre defensivo, fueron los favoritos de los" +" departamentos de policía por casi un siglo, hasta el tiroteo de Miami en " +"1986. Después de eso, los revólveres de recarga y disparo lento fueron " +"considerados un problema. Igual, la precisión de este modelo y el retroceso " +"moderado la vuelven utilizable y no hay cargadores que puedas perder o " +"romper." #: lang/json/gun_from_json.py msgid "submachine gun" @@ -123404,12 +127794,17 @@ msgid "" "controllable in automatic fire. It feeds from detachable box magazines, " "which are easy to unload into close range targets." msgstr "" +"Esta arma larga compacta con calibre de munición de pistola es perfecta para" +" atacar trincheras, hombres en vehículos, equipos SWAT y fuerzas especiales." +" Aunque no es tan precisa como un rifle apropiado, especialmente a grandes " +"distancias, es muy controlable en disparo automático. Utiliza cargadores de " +"caja extraíbles, lo que la hace fácil de usar con objetivos cercanos." #: lang/json/gun_from_json.py msgid "survivor subgun" msgid_plural "survivor subguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "fusil de supervivencia" +msgstr[1] "fusiles de supervivencia" #: lang/json/gun_from_json.py msgid "" @@ -123420,12 +127815,18 @@ msgid "" "their nations well enough, so this should be good for zombies... right? " "Accepts standard pistol ammunition." msgstr "" +"Es un subfusil automático fabricado rudimentariamente, que acepta cargadores" +" estándar de pistola y de subfusil. El cerrojo grande lo hace difícil de " +"apuntar y su construcción cuestionable le da una pobre fiabilidad y " +"longevidad. Algunos diseños similares de desesperación se usaron bastante " +"durante la Segunda Guerra Mundial, así que debería servir contra zombis... " +"¿no?" #: lang/json/gun_from_json.py msgid "hand cannon" msgid_plural "hand cannons" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cañón de mano" +msgstr[1] "cañones de mano" #: lang/json/gun_from_json.py msgid "" @@ -123435,12 +127836,17 @@ msgid "" "deficiencies. Though tradtionally such magnums are revolvers, this one is a" " magazine fed semi-automatic." msgstr "" +"Esta pistola grande es casi tan pesada como una carabina chica, y casi con " +"la misma potencia. Con el potente calibre magnum, es adecuada para cazar " +"animales de tamaño medio, humanos o para compensar las propias deficiencias." +" Aunque tradicionalmente esos magnum eran revólveres, esta pistola utiliza " +"cargadores y es semiautomática." #: lang/json/gun_from_json.py msgid "magnum levergun" msgid_plural "magnum leverguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arma magnum de palanca" +msgstr[1] "armas magnum de palanca" #: lang/json/gun_from_json.py msgid "" @@ -123450,12 +127856,17 @@ msgid "" "number of calibers carried, and allow you to squeeze more power from " "ammuntion." msgstr "" +"Es una versión moderna del clásico de acción de palanca, este rifle más " +"grande puede usar la poderosa munición magnum de pistola y también munición " +"de pistolas más débiles. Llevar esto con una pistola magnum te permite " +"reducir el número de calibres necesarios y permite también sacarle más " +"potencia a la munición." #: lang/json/gun_from_json.py msgid "handmade magnum carbine" msgid_plural "handmade magnum carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina magnum casera" +msgstr[1] "carabinas magnum caseras" #: lang/json/gun_from_json.py msgid "" @@ -123464,12 +127875,17 @@ msgid "" "with a rudimentary lever action system. Its powerful cartridge and relative" " precision should serve well against zombies and medium game." msgstr "" +"Es una carabina de construcción rudimentaria con calibre para munición de " +"pistolas magnum y pistolas estándar. Utiliza cargadores comerciales de " +"pistola magnum, y tiene un sistema rudimentario de acción de palanca. Su " +"poderoso cartucho y relativa precisión deberían funcionar bien contra zombis" +" y animales medianos." #: lang/json/gun_from_json.py msgid "pipe magnum" msgid_plural "pipe magnums" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "magnum de caño" +msgstr[1] "magnums de caño" #: lang/json/gun_from_json.py msgid "" @@ -123478,12 +127894,16 @@ msgid "" "assembly to fire it. There's no extractor, so it might be slow to reload, " "and its construction makes for poor reliability and longevity." msgstr "" +"Es un arma hecha con un caño robusto, reforzada en la recámara. Contiene una" +" sola bala de pistola magnum o estándar y tiene un mecanismo rudimentario de" +" disparo. No tiene extractor, así que es un poco lenta para recargar, y su " +"construcción la hace ser poco fiable y poco duradera." #: lang/json/gun_from_json.py msgid "hunting magnum" msgid_plural "hunting magnums" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "magnum de caza" +msgstr[1] "magnums de caza" #: lang/json/gun_from_json.py msgid "" @@ -123492,12 +127912,17 @@ msgid "" "revolvers' cylinders can thus chamber both magnum and standard pistol " "ammunition. You could take medium to large game with this hefty piece." msgstr "" +"Las primeras armas de cazadores ayudaron a desarrollar la munición de magnum" +" de este revólver desde los calibres estándar, que necesitaban revólveres " +"más grandes para usar con seguridad. Los cilindros de estos revólveres " +"pueden usar munición tanto de pistolas magnum como estándar. Esta cosa " +"pesada se puede usar contra animales grandes y medianos." #: lang/json/gun_from_json.py msgid "plinker carbine" msgid_plural "plinker carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina de práctica" +msgstr[1] "carabinas de práctica" #: lang/json/gun_from_json.py msgid "" @@ -123506,12 +127931,16 @@ msgid "" "of holding an impressive amount of its small cartridges. You could take " "small game with this, but anything bigger might not even notice." msgstr "" +"Con casi nada de retroceso y munición económica, rifles como este son " +"populares como armas para principiantes. Tiene un cargador integrado capaz " +"de contener una cantidad impresionante de pequeños cartuchos. Se pueden " +"cazar animales pequeños con esto pero algo más grande ni se mosqueará." #: lang/json/gun_from_json.py msgid "target pistol" msgid_plural "target pistols" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pistola de práctica" +msgstr[1] "pistolas de práctica" #: lang/json/gun_from_json.py msgid "" @@ -123520,12 +127949,16 @@ msgid "" "unsuited for taking on anything but small game, as it is meant to poke holes" " in paper. Accepts box magazines." msgstr "" +"Esta pistola mediana dispara munición de práctica barata y es " +"excepcionalmente popular en prácticas de tiro. Esta pistola no es adecuada " +"para algo más que animales pequeños, y está pensada para hacer agujeros en " +"el papel. Puede usar cargadores de caja." #: lang/json/gun_from_json.py msgid "zip gun" msgid_plural "zip guns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arma casera" +msgstr[1] "armas caseras" #: lang/json/gun_from_json.py msgid "" @@ -123535,6 +127968,11 @@ msgid "" "might be slow to reload, and its construction leaves its longevity in " "question." msgstr "" +"Es un arma de fuego rudimentaria de un disparo solo, hecha con componentes " +"hogareños, y con calibre para munición pequeña de práctica. Las armas como " +"esta generalmente aparecen en manos de criminales e insurgentes. No tiene " +"extractor así que es medio lenta para recargar, y su construcción pone en " +"duda su longevidad." #: lang/json/gun_from_json.py msgid "assault rifle" @@ -123550,6 +127988,11 @@ msgid "" "large creatures and light vehicles, this should take care of most of your " "problems out to several hundred meters." msgstr "" +"Un rifle como este, producto de décadas de mejoras, son cómodos, fiables y " +"adaptables. Es un 'rifle de asalto' capaz de brindar disparo semiautomático " +"preciso y ráfagas de disparo automático. Excepto criaturas grandes y " +"vehículos ligeros, esto podría encargarse de la mayoría de tus problemas " +"hasta unos cien metros de distancia." #: lang/json/gun_from_json.py msgid "light machine gun" @@ -123566,12 +128009,18 @@ msgid "" "does allow for a considerable amount of energy to be sent down range. Slow " "to reload." msgstr "" +"Esta ametralladora ligera es un implemento formidable para fuego de " +"supresión, una parte importante de la táctica de los escuadrones. Su " +"alimentación por cinto permite cargar cientos de balas y sus componentes " +"pesados pueden soportar grandes ráfagas de disparos. Aunque no sea tan " +"precisa como un rifle de servicio, una ametralladora ligera permite enviar " +"una cantidad considerable de energía. Es lenta de recargar." #: lang/json/gun_from_json.py msgid "sniper rifle" msgid_plural "sniper rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle francotirador" +msgstr[1] "rifles francotirador" #: lang/json/gun_from_json.py msgid "" @@ -123580,12 +128029,17 @@ msgid "" "interfaces for optics and supports. With care and practice, all should be " "quite capable of eliminating bipedal threats from very safe ranges. " msgstr "" +"Los rifles francotirador satisfacen la necesidad de disparos precisos a los " +"militares, policías y civiles. Los ejemplares modernos tienen cargadores " +"extraíbles y varias monturas para ópticas y soportes. Con cuidado y " +"práctica, cualquiera puede ser capaz de eliminar amenazas bípedas desde " +"distancias muy seguras." #: lang/json/gun_from_json.py msgid "sporter carbine" msgid_plural "sporter carbines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carabina deportiva" +msgstr[1] "carabinas deportivas" #: lang/json/gun_from_json.py msgid "" @@ -123596,12 +128050,18 @@ msgid "" "rifles are just as adequate for taking on anything smaller than large game, " "however." msgstr "" +"Aunque a veces se la etiqueta incorrectamente como rifle de asalto, esta " +"común carabina barata que usa cargadores no es capaz de tener disparo " +"automático. Es efectiva casi de la misma manera que un rifle de servicio, la" +" variedad más amplia de componentes y diferentes niveles de mantenimiento la" +" hacen menos fiables que las versiones militares. Estos rifles son adecuados" +" para animales pequeños y medianos." #: lang/json/gun_from_json.py msgid "anti-materiel rifle" msgid_plural "anti-materiel rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle antimaterial" +msgstr[1] "rifles antimaterial" #: lang/json/gun_from_json.py msgid "" @@ -123610,12 +128070,16 @@ msgid "" "material weapon is best suited for blinding tanks, shooting at aircraft, or " "destroying explosives. It feeds from comically oversized magazines." msgstr "" +"Este rifle pesado, grande, intimidatorio y excesivo dispara grandes " +"proyectiles con precisión relativa. Aunque parece un rifle francotirador, " +"esta arma antimaterial es mejor para atacar tanques, aviones y para destruir" +" explosivos. Utiliza cargadores de un tamaño casi humorísticamente gigante.." #: lang/json/gun_from_json.py msgid "elephant rifle" msgid_plural "elephant rifles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rifle de caza mayor" +msgstr[1] "rifles de caza mayor" #: lang/json/gun_from_json.py msgid "" @@ -123625,6 +128089,11 @@ msgid "" "recoil is monstruous. You could probably kill anything with this, " "especially if you were to fire both barrels at once." msgstr "" +"Con grabados elegantes, acero azul brillante y madera veteada, este rifle " +"doble de acción de quiebre es casi demasiado linda para usar. Tu hombro te " +"va a pedir que no lo hagas. La recámara es casi tan ancha como para dos " +"dedos y el retroceso es monstruoso. Probablemente puedas matar cualquier " +"cosa con esto, especialmente si podés disparar los dos cañones a la vez." #: lang/json/gun_from_json.py msgid "heavy machine gun" @@ -123640,12 +128109,18 @@ msgid "" "drones are just as susceptible, as are any other 'smaller' threats. Slow to" " reload, incredibly loud, and must be mounted to be fired." msgstr "" +"Esta ametralladora grande y desgarbada, alimentada con cintas, dispara " +"proyectiles enormes y está pensada originalmente como un cambio en las armas" +" antivehiculares. Aunque ya no es adecuada contra tanques o aviones " +"modernos, los vehículos más ligeros o los drones pueden ser susceptibles, " +"como cualquier otra amenaza 'pequeña'. Lenta para recargar, increíblemente " +"ruidosa y debe estar montada para poder disparar." #: lang/json/gun_from_json.py msgid "disposable rocket launcher" msgid_plural "disposable rocket launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzacohetes descartable" +msgstr[1] "lanzacohetes descartables" #: lang/json/gun_from_json.py msgid "" @@ -123655,12 +128130,18 @@ msgid "" " portability and lack of dead weight once expended. Has a backblast, so " "make sure nothing you mind destroying is behind you." msgstr "" +"Construido con fibra de vidrio con miras rudimentarias de plástico y cañón " +"de titanio, esto es un lanzador de un solo misil. Aunque no es tan efectivo " +"como otras armas antiarmaduras, el valor verdadero de este lanzacohetes " +"descartable es su transportabilidad y ausencia de peso muerto una vez " +"utilizado. Tiene una descarga posterior así que asegurate de que no haya " +"nada importante atrás tuyo." #: lang/json/gun_from_json.py msgid "recoilless rocket launcher" msgid_plural "recoilless rocket launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzacohetes sin retroceso" +msgstr[1] "lanzacohetes sin retroceso" #: lang/json/gun_from_json.py msgid "" @@ -123673,12 +128154,20 @@ msgid "" "tremendous backblast, so make sure nothing you mind destroying is behind " "you." msgstr "" +"Este gigantesco tubo pesado tiene un mira óptica compleja y puede lanzar una" +" gran variedad de cargas explosivas, incluyendo misiles comunes o guiados " +"por láser. Dependiendo de la ojiva cargada, esta arma es efectiva contra " +"tanques antiguos, la mayoría de los vehículos, bunkers y personal. Está " +"pensado para ser usada por dos hombres así que la recarga es un poco lenta. " +"Su diseño sin retroceso permite un rango y daño superiores, pero tiene una " +"tremenda descarga trasera, así que asegurate que no haya nada importante " +"atrás tuyo." #: lang/json/gun_from_json.py msgid "double-barrel shotgun" msgid_plural "double-barrel shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta de doble cañón" +msgstr[1] "escopetas de doble cañón" #: lang/json/gun_from_json.py msgid "" @@ -123687,6 +128176,10 @@ msgid "" " Shotshells come in many varieties, and shotguns are suitable for anything " "from some large game to small birds." msgstr "" +"Es un antigua escopeta de doble cañón con un gatillo para cada uno. Los " +"dispares seguidos son increíblemente rápidos pero la recarga es lenta. Los " +"cartuchos vienen en una gran variedad y las escopetas son adecuadas para " +"cualquier cosa desde animales grandes hasta pájaros pequeños." #: lang/json/gun_from_json.py msgid "" @@ -123695,12 +128188,17 @@ msgid "" "there are no extractors or ejectors. Shotshells come in many varieties, and" " shotguns are suitable for anything from some large game to small birds." msgstr "" +"Esta escopeta rudimentaria de doble cañón con un gatillo para cada uno. Los " +"dispares seguidos son increíblemente rápidos pero la recarga es lenta ya que" +" no tienen extractores o eyectores. Los cartuchos vienen en una gran " +"variedad y las escopetas son adecuadas para cualquier cosa desde animales " +"grandes hasta pájaros pequeños." #: lang/json/gun_from_json.py msgid "sporting shotgun" msgid_plural "sporting shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta deportiva" +msgstr[1] "escopetas deportivas" #: lang/json/gun_from_json.py msgid "" @@ -123710,12 +128208,17 @@ msgid "" "varieties, and shotguns are suitable for anything from some large game to " "small birds." msgstr "" +"Con un diseño simple y popular, las escopetas deportivas son usadas por las " +"fuerzas de la ley, civiles y ocasionalmente militares. Su cargador interno " +"es pequeño comparado con los estándares modernos, y la velocidad de recarga " +"es baja. Los cartuchos vienen en una gran variedad y las escopetas son " +"adecuadas para cualquier cosa desde animales grandes hasta pájaros pequeños." #: lang/json/gun_from_json.py msgid "tactical shotgun" msgid_plural "tactical shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta táctica" +msgstr[1] "escopetas tácticas" #: lang/json/gun_from_json.py msgid "" @@ -123726,6 +128229,12 @@ msgid "" "known for being somewhat finicky, these can be tuned to run with some " "reliability." msgstr "" +"Es una escopeta alimentada por un cargador extraíble, más que nada orientada" +" hacia civiles entusiastas de las armas. Con rieles y una apariencia negra " +"amenazante, esta clase de escopeta no parece ser deportiva. Los cargadores " +"reducen los tiempos de recarga que generalmente poseen las escopetas. Aunque" +" es conocida por ser un poco quisquillosa, puede llegar a funcionar con " +"bastante fiabilidad." #: lang/json/gun_from_json.py msgid "Ichaival" @@ -123739,24 +128248,28 @@ msgid "" " string. It has gold and silver ornaments on it, as well as an ornate " "Raven." msgstr "" +"Ichaival, el arco de Odín. Se dice que dispara 10 flechas por cada vez que " +"se usa. Tiene adornos de oro y plata, y también un Cuervo." #: lang/json/gun_from_json.py msgid "Druid composite bow" msgid_plural "Druid composite bows" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arco compuesto de Druida" +msgstr[1] "arcos compuestos de Druida" #: lang/json/gun_from_json.py msgid "" "A bow made of multiple materials to maximize energy efficiency. There are " "two Druid runes embedded at the tips." msgstr "" +"Es un arco hecho con varios materiales para maximizar la eficiencia de la " +"energía. Tiene dos runas Druidas incrustadas en las puntas." #: lang/json/gun_from_json.py msgid "M47A1 Techno-Medusa" msgid_plural "M47A1 Techno-Medusae" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M47A1 Techno-Medusa" +msgstr[1] "M47A1 Techno-Medusae" #: lang/json/gun_from_json.py msgid "" @@ -123765,12 +128278,16 @@ msgid "" "reliability with smaller cartridges, it is not as accurate as dedicated " "caliber revolvers due to freebore." msgstr "" +"Es una actualización de la M47 Medusa de Phillips & Rodgers, mejorada " +"mágicamente. Es un revólver multicalibre ideal para supervivientes. Aunque " +"la Tecnomancia mejora la fiabilidad con cartuchos más chicos, no es tan " +"precisa como revólveres de calibre dedicado debido a su freebore." #: lang/json/gun_from_json.py msgid "gunblade" msgid_plural "gunblades" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "espadarma" +msgstr[1] "espadarmas" #: lang/json/gun_from_json.py msgid "" @@ -123778,50 +128295,43 @@ msgid "" "barrel pump shotgun attached to the blade's spine for finishing blows or a " "first strike." msgstr "" +"Con una construcción similar a la falcata, esta cuchilla inclinada hacia " +"adelante tiene una escopeta de cañón corto unida a la cuchilla para dar el " +"primer golpe o el golpe final." #: lang/json/gun_from_json.py msgid "shotcestus" msgid_plural "shotcesti" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "shotcestus" +msgstr[1] "shotcesti" #: lang/json/gun_from_json.py msgid "" "A sawn-off double-barrel shotgun mounted on a metal cestus. The lack of a " "stock to absorb recoil means some strength is required to fire." msgstr "" +"Es una escopeta doble cañón recortada, montada sobre un cestus metálico. La " +"falta de culata para absorber el retroceso hace que se necesite un poco de " +"fuerza para poder usarla." #: lang/json/gun_from_json.py msgid "Woodbow" msgid_plural "Woodbows" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Maderarco" +msgstr[1] "Maderarcos" #: lang/json/gun_from_json.py msgid "" "A magically conjured ornate recurve bow of solid flexible wood. A matching " "conjured wooden arrow appears when you draw the string back for firing." msgstr "" +"Es un arco recurvo de madera flexible, adornado y conjurado mágicamente. La " +"correspondiente flecha de madera conjurada aparecerá cuando tires de la " +"cuerda para usar el arco." #: lang/json/gun_from_json.py msgid "Fake gun that fires barbed javelins." -msgstr "" - -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" +msgstr "Es una pistola falsa que dispara jabalinas con púas." #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" @@ -123834,8 +128344,8 @@ msgid "" "The integrated underbarrel shotgun of a pipe combination gun which holds two" " shots. It's irremovable." msgstr "" -"Es una escopeta integrada bajocañón de un arma de caño combinada, que tiene " -"dos disparos. No se puede quitar." +"Es el bajocañón integrado de escopeta de un arma de caño combinada, que " +"contiene dos disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "underbarrel" @@ -124078,8 +128588,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "Leadworks magazine adapter" msgid_plural "Leadworks magazine adapters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "adaptador de cargador Leadworks" +msgstr[1] "adaptadores de cargador Leadworks" #: lang/json/gunmod_from_json.py msgid "" @@ -124148,7 +128658,7 @@ msgid "" "A small extension above the grip which an arrow rests upon while being " "aimed. Improves accuracy with no drawbacks." msgstr "" -"Es una pequeña extensión sobre el mango que permite apoyar la flecha " +"Es una pequeña extensión sobre la empuñadura que permite apoyar la flecha " "mientras se está apuntando. Mejora la precisión y no tiene desventajas." #: lang/json/gunmod_from_json.py @@ -124171,8 +128681,9 @@ msgid "" "A counterweight placed forward of the bow's grip allows for greater " "accuracy. Aside from increased weight and size, there are no drawbacks." msgstr "" -"Es un contrapeso puesto delante del mango del arco, que permite mejorar la " -"precisión. La única desventaja que tiene es el incremento del peso." +"Es un contrapeso puesto delante de la empuñadura del arco, que permite " +"mejorar la precisión. La única desventaja que tiene es el incremento del " +"peso." #: lang/json/gunmod_from_json.py msgid "stabilizer" @@ -124218,8 +128729,8 @@ msgstr "amortiguación" #: lang/json/gunmod_from_json.py msgid "belt clip" msgid_plural "belt clips" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "clip de cinturón" +msgstr[1] "clips de cinturón" #: lang/json/gunmod_from_json.py msgid "" @@ -124229,36 +128740,41 @@ msgid "" " to carry with the chamber empty or select a firearm with a very heavy " "trigger pull." msgstr "" +"Es un clip para cinturón que se pone en la empuñadura o al costado de una " +"pistola para facilitar la 'portación a la mexicana', que es llevar encima el" +" arma sin funda. No ofrece ninguna protección para el gatillo así que se " +"recomienda a los usuarios llevarla con la recámara vacía o llevar un arma " +"con un gatillo difícil de apretar." #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rugerlcp" -msgstr "" +msgstr "rugerlcp" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "kp32" -msgstr "" +msgstr "kp32" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "kp3at" -msgstr "" +msgstr "kp3at" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "kpf9" -msgstr "" +msgstr "kpf9" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "cop_38" -msgstr "" +msgstr "cop_38" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "moss_brownie" -msgstr "" +msgstr "moss_brownie" #: lang/json/gunmod_from_json.py msgid "shortened barrel" @@ -124287,18 +128803,22 @@ msgid "" "Testmod for UPS drain on mods, this should never spawn, if you see this, " "it's a bug. 50x more UPS drain." msgstr "" +"Mod de prueba para el uso de UPS en modificaciones, esto no debería aparecer" +" nunca, si lo ves, es un bug. Multiplica por 50 el uso de UPS." #: lang/json/gunmod_from_json.py msgid "Power shot" msgid_plural "Power shots" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tiro poderoso" +msgstr[1] "Tiros poderosos" #: lang/json/gunmod_from_json.py msgid "" "This is a pseudo item -- the builtin part of a fusion blaster for the " "maximum power firing mode." msgstr "" +"Es un pseudo objeto -- es la parte de la pistola de fusión para el modo de " +"máxima potencia." #: lang/json/gunmod_from_json.py msgid "brass catcher" @@ -124317,12 +128837,12 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid ".300 AAC Blackout AR-15 conversion kit" msgid_plural ".300 AAC Blackout AR-15 conversion kits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "kit de conversión .300 AAC Blackout AR-15" +msgstr[1] "kits de conversión .300 AAC Blackout AR-15" #: lang/json/gunmod_from_json.py msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." -msgstr "" +msgstr "Es un montaje superior AR-15 con cañón .300 AAC Blackout." #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" @@ -124332,22 +128852,22 @@ msgstr "ar15" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "m4a1" -msgstr "" +msgstr "m4a1" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "m16a4" -msgstr "" +msgstr "m16a4" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "h&k416a5" -msgstr "" +msgstr "h&k416a5" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "m27iar" -msgstr "" +msgstr "m27iar" #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" @@ -124360,19 +128880,19 @@ msgid "" "A set of lightweight composite grips and furniture that reduces a firearm's " "weight, and as a consequence, its handling and melee damage." msgstr "" -"Es un equipo de mangos compuestos y accesorios que reducen el peso de un " -"arma de fuego, y como consecuencia reduce también su manejo y daño para el " -"cuerpo a cuerpo." +"Es un equipo de empuñaduras compuestas y accesorios que reducen el peso de " +"un arma de fuego, y como consecuencia reduce también su manejo y daño para " +"el cuerpo a cuerpo." #: lang/json/gunmod_from_json.py msgid "grip" -msgstr "mango" +msgstr "empuñadura" #: lang/json/gunmod_from_json.py msgid "ergonomic grip" msgid_plural "ergonomic grips" -msgstr[0] "mango ergonómico" -msgstr[1] "mangos ergonómicos" +msgstr[0] "empuñadura ergonómica" +msgstr[1] "empuñaduras ergonómicas" #: lang/json/gunmod_from_json.py msgid "" @@ -124384,13 +128904,15 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "breacher grip" msgid_plural "breacher grips" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "empuñadura breacher" +msgstr[1] "empuñaduras breacher" #: lang/json/gunmod_from_json.py msgid "" "A very uncomfortable straight grip. Clearly not intended for regular use." msgstr "" +"Es una empuñadura recta muy incómoda. Claramente, no está hecha para un uso " +"regular." #: lang/json/gunmod_from_json.py msgid "beam scatterer" @@ -124415,14 +128937,17 @@ msgstr "lente" #: lang/json/gunmod_from_json.py msgid "focusing lens" msgid_plural "focusing lenses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lente de enfoque" +msgstr[1] "lentes de enfoque" #: lang/json/gunmod_from_json.py msgid "" "A set of optics to concentrate the laser beam on a smaller focus point. " "This increases range and damage output, but complicates targeting." msgstr "" +"Es un conjunto de ópticas para concentrar un rayo láser a un punto de " +"enfoque más pequeño. Esto incrementa la distancia y el daño, pero dificulta " +"la precisión." #: lang/json/gunmod_from_json.py msgid "electrolaser conversion" @@ -124443,14 +128968,16 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "effective emitter" msgid_plural "effective emitters" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "emisor efectivo" +msgstr[1] "emisores efectivos" #: lang/json/gunmod_from_json.py msgid "" "A set of electronics to optimize emitter workcycle and increase overall " "energy efficiency. Decreases power consumption." msgstr "" +"Es un grupo de electrónicos que mejoran el trabajo del emisor e incrementan " +"la eficiencia general de la energía. Disminuye el consumo de energía." #: lang/json/gunmod_from_json.py msgid "emitter" @@ -124467,6 +128994,8 @@ msgid "" "A capacitor with a higher energy density increases range and damage; at the " "cost of a markedly increased power consumption." msgstr "" +"Es un capacitor con energía de alta densidad que incrementa el alcance y el " +"daño, pero consume bastante más energía." #: lang/json/gunmod_from_json.py msgid "speedloader chute" @@ -124484,7 +129013,7 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "loading port" -msgstr "" +msgstr "puerto de carga" #: lang/json/gunmod_from_json.py msgid "match trigger" @@ -124522,17 +129051,17 @@ msgstr "" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "ar15_retool_300blk" -msgstr "" +msgstr "ar15_retool_300blk" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "ar_pistol" -msgstr "" +msgstr "ar_pistol" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "oa93" -msgstr "" +msgstr "oa93" #: lang/json/gunmod_from_json.py msgid "lightning link" @@ -124572,8 +129101,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "replaceable furniture kit" msgid_plural "replaceable furniture kits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "kit de accesorios reemplazables" +msgstr[1] "kits de accesorios reemplazables" #: lang/json/gunmod_from_json.py msgid "" @@ -124582,16 +129111,21 @@ msgid "" "furniture so that it could be easily changed if needed. This allows " "installing any kind of more advanced grips or other furniture." msgstr "" +"Es un kit que consiste en varias partes de acero y plástico que cuando se " +"instala, modificará permanentemente y reemplazará parcialmente algunos " +"accesorios del arma, para que puedan ser cambiados si es necesario. Esto " +"permite instalar cualquier clase de empuñaduras más avanzadas u otros " +"accesorios." #: lang/json/gunmod_from_json.py msgid "grip mount" -msgstr "" +msgstr "montura de empuñadura" #: lang/json/gunmod_from_json.py msgid "side mount" msgid_plural "side mounts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "montura lateral" +msgstr[1] "monturas laterales" #: lang/json/gunmod_from_json.py msgid "" @@ -124599,16 +129133,19 @@ msgid "" "permanently installed onto almost any weapon, along with some fasteners. " "Ideal for bringing out your inner tacticool on older guns." msgstr "" +"Es una montura plástica para poner un accesorio de riel, diseñada para ser " +"instalada permanentemente en casi cualquier arma, y tiene unos ganchos. " +"Ideal para hacerte el tacticool con tus armas viejas." #: lang/json/gunmod_from_json.py msgid "rail mount" -msgstr "" +msgstr "montura de riel" #: lang/json/gunmod_from_json.py msgid "sights mount" msgid_plural "sights mounts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "montura de mira" +msgstr[1] "monturas de mira" #: lang/json/gunmod_from_json.py msgid "" @@ -124617,12 +129154,15 @@ msgid "" "with some fasteners. Ideal for bringing out your inner tacticool on older " "guns." msgstr "" +"Es una montura plástica para poner una mira, diseñada para ser instalada " +"permanentemente en casi cualquier arma excepto lanzadores y pistolas, y " +"tiene unos ganchos. Ideal para hacerte el tacticool con tus armas viejas." #: lang/json/gunmod_from_json.py msgid "launcher sights mount" msgid_plural "launcher sights mounts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "montura de mira de lanzador" +msgstr[1] "monturas de mira de lanzador" #: lang/json/gunmod_from_json.py msgid "" @@ -124630,12 +129170,15 @@ msgid "" "installed onto almost any launcher, along with some fasteners. Ideal for " "bringing out your inner tacticool on rocket launchers." msgstr "" +"Es una montura plástica para poner una mira, diseñada para ser instalada " +"permanentemente en casi cualquier lanzador, y tiene unos ganchos. Ideal para" +" hacerte el tacticool con tus lanzamisiles." #: lang/json/gunmod_from_json.py msgid "pistol sights mount" msgid_plural "pistol sights mounts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "montura de mira para pistola" +msgstr[1] "monturas de mira para pistola" #: lang/json/gunmod_from_json.py msgid "" @@ -124643,12 +129186,15 @@ msgid "" "installed onto almost any pistol, along with some fasteners. Ideal for " "bringing out your inner tacticool on pocket pistols." msgstr "" +"Es una montura plástica para poner una mira, diseñada para ser instalada " +"permanentemente en casi cualquier pistola, y tiene unos ganchos. Ideal para " +"hacerte el tacticool con tus pistolas." #: lang/json/gunmod_from_json.py msgid "replaceable stock kit" msgid_plural "replaceable stock kits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "kit de culata reemplazable" +msgstr[1] "kits de culata reemplazable" #: lang/json/gunmod_from_json.py msgid "" @@ -124658,16 +129204,22 @@ msgid "" "simply attach a stock mount if gun had no stock to start with. This allows " "easy installation of any kind of more advanced stocks." msgstr "" +"Es un kit que consiste en varias partes de acero que cuando se instalan, " +"quitaran la culata fija original del arma, instalará una nueva montura de " +"culata, modificará la culata original para que sea compatible y volver a " +"ponerla en el arma, o solamente unirá la montura de culata si el arma no " +"tenía una originalmente. Este permite una fácil instalación de cualquier " +"culata más avanzada." #: lang/json/gunmod_from_json.py msgid "stock mount" -msgstr "" +msgstr "montura de culata" #: lang/json/gunmod_from_json.py msgid "bottom mount" msgid_plural "bottom mounts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "montura de abajo" +msgstr[1] "monturas de abajo" #: lang/json/gunmod_from_json.py msgid "" @@ -124675,10 +129227,13 @@ msgid "" "be permanently installed onto almost any weapon, along with some fasteners." " Ideal for bringing out your inner tacticool on older guns." msgstr "" +"Es una montura plástica para poner un accesorio bajo el cañón, diseñada para" +" ser instalada permanentemente en casi cualquier arma, y tiene unos ganchos." +" Ideal para hacerte el tacticool con tus armas viejas." #: lang/json/gunmod_from_json.py msgid "underbarrel mount" -msgstr "" +msgstr "montura de bajocañón" #: lang/json/gunmod_from_json.py msgid "ported barrel" @@ -124717,8 +129272,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified muzzle brake" msgid_plural "modified muzzle brakes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "freno modificado de boca" +msgstr[1] "frenos modificados de boca" #: lang/json/gunmod_from_json.py msgid "" @@ -124727,6 +129282,11 @@ msgid "" " This one was modified and customized to mount on pretty much any firearm " "other than launchers, if you so want." msgstr "" +"El freno de boca redirige los gases de la combustión de la pólvora para " +"compensar el levantamiento de la bocacha. Disminuye el retroceso pero " +"aumenta el tamaño y el ruido, y reduce un poco la precisión. Este fue " +"modificado y personalizado para poner en casi cualquier arma de fuego " +"excepto lanzadores." #: lang/json/gunmod_from_json.py msgid "homemade suppressor" @@ -124745,12 +129305,19 @@ msgid "" "when attached, will interfere with your ability to aim down the base sights " "of the gun." msgstr "" +"Es un silenciador casero hecho con un caño y trapos. Mientras los trapos " +"aguanten, reducirá el ruido y el destello de la bocacha generados al " +"disparar. Las armas de fuego son extremadamente ruidosas y puede dañar tu " +"audición si no usás protección; un silenciador reduce el ruido a niveles " +"seguros, y también reduce un poco el retroceso y la velocidad de bocacha. " +"Este silenciador es grande y, cuando se lo pone, interfiere tu habilidad " +"para apuntar." #: lang/json/gunmod_from_json.py msgid "'solvent trap' suppressor" msgid_plural "'solvent trap' suppressors" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "silenciador 'trampa de solvente'" +msgstr[1] "silenciadores 'trampa de solvente'" #: lang/json/gunmod_from_json.py msgid "" @@ -124762,12 +129329,19 @@ msgid "" " attached, will interfere with your ability to aim down the base sights of " "the gun." msgstr "" +"Es un filtro de automotores adaptado rudimentariamente para coincidir con el" +" cañón del arma, armando un silenciador ilegal y no registrado. Qué bueno " +"que no parece haber ningún agente de la ATF que te pueda arrestar. Aunque es" +" similar en diseño a un silenciador real, no fue diseñado para grandes " +"presiones y eventualmente perderá efectividad. El filtro instalado es grande" +" y cuando está puesto, interferirá tu habilidad de apuntar con las miras del" +" arma." #: lang/json/gunmod_from_json.py msgid "soda bottle silencer" msgid_plural "soda bottle silencers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "silenciador de botella" +msgstr[1] "silenciadores de botella" #: lang/json/gunmod_from_json.py msgid "" @@ -124779,6 +129353,13 @@ msgid "" "suppressor is large and, when attached, will interfere with your ability to " "aim down the base sights of the gun." msgstr "" +"Es un 'silenciador' hecho con una botella de gaseosa de 2 litros, algunas " +"botellas más chicas que son como bafles, y un buen pedazo de cinta adhesiva." +" Los disparos son estrepitosamente fuertes y pueden dañar tu audición si no " +"tenés protección y podés estar seguro de que esto no te va a proteger las " +"orejas. Lo que puede hacer es permitirte disparar un tiro o dos con un poco " +"menos de ruido. Este simple silenciador es grande y, cuando está puesto, " +"interferirá en tu habilidad para apuntar con las miras del arma." #: lang/json/gunmod_from_json.py msgid "RK6S34 suppressor" @@ -124807,6 +129388,8 @@ msgid "" "A large suppressor designed to work with shotguns. It's a lot more complex " "than a suppressor for a pistol or rifle." msgstr "" +"Es un silenciador grande diseñado para funcionar en escopetas. Es mucho más " +"complejo que un silenciador para pistola o para rifle." #: lang/json/gunmod_from_json.py msgid "suppressor" @@ -124829,8 +129412,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "MP5SD integral suppressor" msgid_plural "MP5SD integral suppressors" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "silenciador integrado MP5SD" +msgstr[1] "silenciadores integrados MP5SD" #: lang/json/gunmod_from_json.py msgid "" @@ -124839,6 +129422,10 @@ msgid "" "most ammo subsonic at the cost of terminal performance. It is not as " "effective as modern designs." msgstr "" +"Es un silenciador integrado para la H&K MP5SD. Su recámara de gran expansión" +" desacelera la munición a través de varios puertos en el cañón, volviendo " +"subsónica a la mayoría de la munición a cambio de un poco de desempeño " +"terminal. No es tan efectivo como los diseños modernos." #: lang/json/gunmod_from_json.py msgid "compact suppressor" @@ -124857,8 +129444,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "rail-mounted crossbow" msgid_plural "rail-mounted crossbows" -msgstr[0] "ballesta montable de riel" -msgstr[1] "ballestas montables de riel" +msgstr[0] "ballesta montable en riel" +msgstr[1] "ballestas montables en riel" #: lang/json/gunmod_from_json.py msgid "" @@ -124875,8 +129462,8 @@ msgstr "riel" #: lang/json/gunmod_from_json.py msgid "modified rail-mounted crossbow" msgid_plural "modified rail-mounted crossbows" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ballesta modificada montable en riel" +msgstr[1] "ballestas modificadas montables en riel" #: lang/json/gunmod_from_json.py msgid "" @@ -124885,6 +129472,10 @@ msgid "" " and customized to mount on pretty much any weapon other than pistols and " "SMGs, if you so want." msgstr "" +"Es un kit para poner un par de brazos de ballesta y riel de tiro en el cañón" +" de un arma larga. Permite disparar pernos de ballestas. Esta ha sido " +"modificada y personalizada para poder ponerse en casi cualquier arma si " +"querés, excepto pistolas y subfusiles." #: lang/json/gunmod_from_json.py msgid "offset iron sights" @@ -124904,8 +129495,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified offset iron sights" msgid_plural "modified offset iron sights" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mirilla modificada metálica de compensación" +msgstr[1] "mirillas modificadas metálicas de compensación" #: lang/json/gunmod_from_json.py msgid "" @@ -124913,6 +129504,10 @@ msgid "" "other modification prevents use of the primary sights. This one was " "modified and customized to mount on pretty much any weapon, if you so want." msgstr "" +"Es un equipo alternativo de mirillas metálicas montadas a 45º para usar " +"cuando una mira o alguna otra modificación impide el uso de las mirillas " +"primarias. Esta ha sido modificada y personalizada para poner en casi " +"cualquier arma." #: lang/json/gunmod_from_json.py msgid "offset sight rail" @@ -124929,14 +129524,16 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified offset sight rail" msgid_plural "modified offset sight rails" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mirilla metálica de riel de compensación" +msgstr[1] "mirillas metálicas de riel de compensación" #: lang/json/gunmod_from_json.py msgid "" "An additional rail set at 45° for attaching a secondary optic. This one was" " modified and customized to mount on pretty much any weapon, if you so want." msgstr "" +"Es un grupo de rieles adicionales en 45° para poner una óptica secundaria. " +"Esta ha sido modificada y personalizada para poner en casi cualquier arma." #: lang/json/gunmod_from_json.py msgid "rail laser sight" @@ -124972,8 +129569,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified gyroscopic stabilizer" msgid_plural "modified gyroscopic stabilizers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "estabilizador giroscópico modificado" +msgstr[1] "estabilizadores giroscópicos modificados" #: lang/json/gunmod_from_json.py msgid "" @@ -124982,6 +129579,10 @@ msgid "" "one was modified and customized to mount on pretty much any weapon other " "than pistols, if you so want." msgstr "" +"Es una unidad avanzada que se ata con una correa al costado del arma de " +"fuego y reduce la vibración, lo que reduce mucho el retroceso e incrementa " +"levemente la precisión. Este fue modificado y personalizado para poner en " +"casi cualquier arma excepto pistolas." #: lang/json/gunmod_from_json.py msgid "five pin bow sight" @@ -125096,12 +129697,15 @@ msgid "" "A 3-18x44 rifle scope. It is adjustable for windage and elevation in 1/10th" " mrad increments and is remarkably small and light for its magnification." msgstr "" +"Es una mira de rifle 3-18x44. Se puede ajustar por desviación y elevación en" +" incrementos de 1/10mo mrad y es notablemente pequeña y liviana por su " +"aumento." #: lang/json/gunmod_from_json.py msgid "modified rifle scope" msgid_plural "modified rifle scopes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mira modificada para rifle" +msgstr[1] "miras modificadas para rifle" #: lang/json/gunmod_from_json.py msgid "" @@ -125110,6 +129714,10 @@ msgid "" "This one was modified and customized to mount on pretty much any weapon " "other than pistols and SMGs, if you so want." msgstr "" +"Es una mira de rifle 3-18x44. Se puede ajustar por desviación y elevación en" +" incrementos de 1/10mo mrad y es notablemente pequeña y liviana por su " +"aumento. Esta fue modificada y personalizada para poner en casi cualquier " +"arma excepto pistolas y subfusiles." #: lang/json/gunmod_from_json.py msgid "ACOG scope" @@ -125122,12 +129730,14 @@ msgid "" "A 4x32 TA01 Advanced Combat Optical Gunsight with a tritium illuminated " "crosshair." msgstr "" +"Es una Mira Óptica Avanzada de Combate 4x32 TA01 con puntos de mira de " +"tritio iluminados." #: lang/json/gunmod_from_json.py msgid "modified ACOG scope" msgid_plural "modified ACOG scopes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mira modificada ACOG" +msgstr[1] "miras modificadas ACOG" #: lang/json/gunmod_from_json.py msgid "" @@ -125135,6 +129745,9 @@ msgid "" "crosshair. This one was modified and customized to mount on pretty much any" " weapon other than pistols, if you so want." msgstr "" +"Es una Mira Óptica Avanzada de Combate 4x32 TA01 con puntos de mira de " +"tritio iluminados. Esta fue modificada y personalizada para poner en casi " +"cualquier arma excepto pistolas." #: lang/json/gunmod_from_json.py msgid "RS1219 scope" @@ -125164,6 +129777,9 @@ msgid "" "crosshairs. Not as good as the ones made before the Cataclysm. Increases " "weight but improves accuracy." msgstr "" +"Es una simple mira telescópica hecha a mano, es como un telescopio con " +"puntos de mira. No tan buena como las fabricadas antes del Cataclismo. " +"Incrementa el peso pero mejora la precisión." #: lang/json/gunmod_from_json.py msgid "telescopic pistol sight" @@ -125231,8 +129847,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "folding wire stock" msgid_plural "folding wire stocks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "culata de alambre plegable" +msgstr[1] "culatas de alambre plegables" #: lang/json/gunmod_from_json.py msgid "" @@ -125240,6 +129856,9 @@ msgid "" "before use. It's somewhat wobbly but is better than nothing at all. " "Increases the time needed to wield the weapon." msgstr "" +"Es una culata de alambre plegable que puede ocupar muy poco espacio pero " +"necesita desplegarse antes de usar. Es medio endeble pero es mejor que nada." +" Incrementa el tiempo necesario para empuñar el arma." #: lang/json/gunmod_from_json.py msgid "pistol stock" @@ -125250,6 +129869,8 @@ msgstr[1] "culatas para pistola" #: lang/json/gunmod_from_json.py msgid "An add-on stock for handguns considerably improving control of recoil." msgstr "" +"Es una culata para pistolas que mejora considerablemente el control del " +"retroceso." #: lang/json/gunmod_from_json.py msgid "recoil stock" @@ -125299,8 +129920,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified bipod" msgid_plural "modified bipods" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "bípode modificado" +msgstr[1] "bípodes modificados" #: lang/json/gunmod_from_json.py msgid "" @@ -125310,6 +129931,11 @@ msgid "" "was modified and customized to mount on pretty much any weapon, if you so " "want." msgstr "" +"Los bípodes son usados comúnmente en los rifles y ametralladoras, para " +"proveer de un apoyo adelante y reducir el movimiento. Aunque mejoran mucho " +"el manejo del retroceso, solo pueden usarse en ciertas superficies y son " +"lentos para armar. Este ha sido modificado y personalizado pra poner en casi" +" cualquier arma." #: lang/json/gunmod_from_json.py msgid "combination gun shotgun" @@ -125322,14 +129948,14 @@ msgid "" "The integrated underbarrel shotgun of a combination gun which holds two " "shots. It's irremovable." msgstr "" -"Es una escopeta integrada bajocañón de un arma combinada, que tiene dos " -"disparos. No se puede quitar." +"Es el bajocañón integrado de escopeta de un arma combinada, que contiene dos" +" disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "factory handguard" msgid_plural "factory handguards" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "guardamano de fábrica" +msgstr[1] "guardamanos de fábrica" #: lang/json/gunmod_from_json.py msgid "" @@ -125337,32 +129963,35 @@ msgid "" " as efficient as a proper forward grip or bipod at controlling recoil, but " "it's better than nothing." msgstr "" +"Es una empuñadura extraíble que se vuelve estándar en armas sin riel. No es " +"tan eficiente como una empuñadura delantera apropiada o un bípode para " +"controlar el retroceso, pero es mejor que nada." #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "fs2000" -msgstr "" +msgstr "fs2000" #: lang/json/gunmod_from_json.py msgid "forward grip" msgid_plural "forward grips" -msgstr[0] "mango vertical" -msgstr[1] "mangos verticales" +msgstr[0] "empuñadura delantera" +msgstr[1] "empuñaduras delanteras" #: lang/json/gunmod_from_json.py msgid "" "A grip placed forward on the barrel allows for greater control. Not as " "effective as a bipod but usable under all conditions." msgstr "" -"Es un mango que se pone en el cañón del arma, lo que permite tener mayor " -"control. No es tan efectivo como un bípode pero se puede usar bajo cualquier" -" condición." +"Es una empuñadura que se pone en el cañón del arma, lo que permite tener " +"mayor control. No es tan efectiva como un bípode pero se puede usar bajo " +"cualquier condición." #: lang/json/gunmod_from_json.py msgid "modified forward grip" msgid_plural "modified forward grips" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "empuñadura delantera modificada" +msgstr[1] "empuñaduras delanteras modificadas" #: lang/json/gunmod_from_json.py msgid "" @@ -125370,6 +129999,10 @@ msgid "" "effective as a bipod but usable under all conditions. This one was modified" " and customized to mount on pretty much any weapon, if you so want." msgstr "" +"Es una empuñadura que se pone en el cañón del arma, lo que permite tener " +"mayor control. No es tan efectivo como un bípode pero se puede usar bajo " +"cualquier condición. Esta fue modificada y personalizada para poner en casi " +"cualquier arma." #: lang/json/gunmod_from_json.py msgid "integrated bayonet" @@ -125396,44 +130029,50 @@ msgid "" "The integrated second shotgun magazine of the Kel-Tec KSG which holds 7 " "shots. It's irremovable." msgstr "" -"Es el cargador de escopeta secundario integrado del Kel-Tec KSG, que " -"contiene 7 disparos. No se puede quitar." +"Es un segundo cargador de escopeta integrado de Kel-Tec KSG, que contiene 7 " +"disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "KSG-25 second magazine" msgid_plural "KSG-25 second magazines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cargador secundario KSG-25" +msgstr[1] "cargadores secundarios KSG-25" #: lang/json/gunmod_from_json.py msgid "" "The integrated second shotgun magazine of the Kel-Tec KSG-25 which holds 12 " "shots. It's irremovable." msgstr "" +"Es un segundo cargador de escopeta integrado de Kel-Tec KSG-25, que contiene" +" 12 disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "TS12 second magazine" msgid_plural "TS12 second magazines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cargador secundario TS12" +msgstr[1] "cargadores secundarios TS12" #: lang/json/gunmod_from_json.py msgid "" "The integrated second shotgun magazine of the Tavor TS12 which holds 5 " "shots. It's irremovable." msgstr "" +"Es un segundo cargador de escopeta integrado de Tavor TS12, que contiene 5 " +"disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "TS12 third magazine" msgid_plural "TS12 third magazines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cargador terciario TS12" +msgstr[1] "cargadores terciarios TS12" #: lang/json/gunmod_from_json.py msgid "" "The integrated third shotgun magazine of the Tavor TS12 which holds 5 shots." " It's irremovable." msgstr "" +"Es un tercer cargador de escopeta integrado de Tavor TS12, que contiene 5 " +"disparos. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "underbarrel laser sight" @@ -125462,6 +130101,9 @@ msgid "" "The Lemat revolver is unique in that its cylinder axis pin is also a fully " "functional 20ga percussion-primed smoothbore barrel. It's irremovable." msgstr "" +"El revólver Lemat es único en que su eje cilíndrico es también un cañón " +"completamente funcional de ánima lisa, activado por percusión, calibre 20ga." +" No se puede quitar." #: lang/json/gunmod_from_json.py msgid "M203" @@ -125482,8 +130124,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified M203" msgid_plural "modified M203s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M203 modificado" +msgstr[1] "M203 modificados" #: lang/json/gunmod_from_json.py msgid "" @@ -125492,6 +130134,10 @@ msgid "" "and fired. This one was modified and customized to mount on pretty much any" " weapon other than pistols and pump-action guns, if you so want." msgstr "" +"El lanzagranadas M203 fue diseñado originalmente para usar variantes del " +"M16, pero hoy en día puede ser adjuntado a cualquier rifle. Permite cargar y" +" disparar una granada 40mm. Este fue modificado y personalizado para poner " +"en casi cualquier arma excepto pistolas y armas de acción de bombeo." #: lang/json/gunmod_from_json.py msgid "M320 GLM" @@ -125506,12 +130152,15 @@ msgid "" " be either attached to a rifle or combined with a buttstock for standalone " "use." msgstr "" +"El Módulo M320 Lanzagranadas ofrece la funcionalidad de lanzadores más " +"grandes en un tamaño pequeño, a cambio de una menor precisión. Puede ser " +"adjuntado a un rifle o combinado con una culata para ser usado solo." #: lang/json/gunmod_from_json.py msgid "modified M320 GLM" msgid_plural "modified M320 GLMs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "M320 GLM modificado" +msgstr[1] "M320 GLM modificados" #: lang/json/gunmod_from_json.py msgid "" @@ -125521,18 +130170,25 @@ msgid "" "use. This one was modified and customized to mount on pretty much any " "weapon other than pistols and pump-action guns, if you so want." msgstr "" +"El Módulo M320 Lanzagranadas ofrece la funcionalidad de lanzadores más " +"grandes en un tamaño pequeño, a cambio de una menor precisión. Puede ser " +"adjuntado a un rifle o combinado con una culata para ser usado solo. Este " +"fue modificado y personalizado para poner en casi cualquier arma excepto " +"pistolas y armas de acción de bombeo." #: lang/json/gunmod_from_json.py msgid "M6 Survival Gun shotgun" msgid_plural "M6 Survival Gun shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cañón de supervivencia M6" +msgstr[1] "cañones de supervivencia M6" #: lang/json/gunmod_from_json.py msgid "" "The integrated 12 gauge shotgun barrel of the Chiappa M6 Survival Gun. It's" " irremovable." msgstr "" +"Es el cañón integrado calibre 12 gauge de la escopeta Chiappa M6 de " +"supervivencia. No se puede quitar." #: lang/json/gunmod_from_json.py msgid "masterkey shotgun" @@ -125553,8 +130209,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified masterkey shotgun" msgid_plural "modified masterkey shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta masterkey modificada" +msgstr[1] "escopetas masterkey modificadas" #: lang/json/gunmod_from_json.py msgid "" @@ -125563,6 +130219,10 @@ msgid "" "fired. This one was modified and customized to mount on pretty much any " "weapon other than pistols and pump-action guns, if you so want." msgstr "" +"Es una escopeta minimalista de acción de bombeo, que puede ser puesta bajo " +"el cañón de varios rifles. Permite cargar y disparar un total de cuatro " +"cartuchos de escopeta. Este fue modificado y personalizado para poner en " +"casi cualquier arma excepto pistolas y armas de acción de bombeo." #: lang/json/gunmod_from_json.py msgid "40mm pipe launcher" @@ -125575,6 +130235,8 @@ msgid "" "This is a home built launcher tube that can be attached to almost any weapon" " except handguns. It allows a single 40mm grenade to be loaded and fired." msgstr "" +"Es un tubo lanzador casero que puede ser adjuntado a casi cualquier arma, " +"excepto pistolas. Permite cargar y disparar una granada 40mm." #: lang/json/gunmod_from_json.py msgid "pistol bayonet" @@ -125610,8 +130272,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified RM121 aux shotgun" msgid_plural "modified RM121 aux shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta auxiliar modificada RM121" +msgstr[1] "escopetas auxiliares modificadas RM121" #: lang/json/gunmod_from_json.py msgid "" @@ -125620,6 +130282,10 @@ msgid "" "Accepts RMSA10 box magazines. This one was modified and customized to mount" " on pretty much any weapon other than pistols, if you so want." msgstr "" +"El sistema auxiliar Rivtech RM121 es una escopeta semiautomática sin vaina, " +"que puede ser montada debajo del cañón de varios rifles. Acepta los " +"cargadores de caja RMSA10. Este fue modificado y personalizado para poner en" +" casi cualquier arma excepto pistolas." #: lang/json/gunmod_from_json.py msgid "underslung shotgun" @@ -125638,8 +130304,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "modified underslung shotgun" msgid_plural "modified underslung shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta colgante modificada" +msgstr[1] "escopetas colgantes modificadas" #: lang/json/gunmod_from_json.py msgid "" @@ -125648,6 +130314,10 @@ msgid "" " was modified and customized to mount on pretty much any weapon other than " "pistols, if you so want." msgstr "" +"Es una escopeta corta con dos cañones que puede ser puesta bajo el cañón de " +"varios rifles. Permite cargar y disparar un total de dos cartuchos de " +"escopeta. Este fue modificado y personalizado para poner en casi cualquier " +"arma excepto pistolas." #: lang/json/gunmod_from_json.py msgid "spare magazine" @@ -125723,32 +130393,36 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "Underslung flare launcher" msgid_plural "Underslung flare launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzabengalas colgante" +msgstr[1] "lanzabengalas colgantes" #: lang/json/gunmod_from_json.py msgid "" "A small barrel which launches signal flares. However, due to its awkward " "position, it has lower accuracy compared to an actual flaregun." msgstr "" +"Es un pequeño cañón que lanza bengalas. Sin embargo, debido a su incómoda " +"posición, tiene poca precisión comparada con una pistola de bengalas normal." #: lang/json/gunmod_from_json.py msgid "CQB SI shotgun" msgid_plural "CQB SI shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta CQB SI" +msgstr[1] "escopetas CQB SI" #: lang/json/gunmod_from_json.py msgid "" "The integrated underbarrel shotgun of this gun which holds a single shot. " "It's irremovable." msgstr "" +"Es el bajocañón integrado de escopeta que contiene un disparo. No se puede " +"quitar." #: lang/json/gunmod_from_json.py msgid "butt hook stock" msgid_plural "butt hook stocks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "culata gancho" +msgstr[1] "culatas gancho" #: lang/json/gunmod_from_json.py msgid "" @@ -125756,12 +130430,15 @@ msgid "" "and the pivoting hook which latches onto your forearm allows for greater " "stability. " msgstr "" +"Es una culata militar que se pliega para reducir el tamaño del arma. El peso" +" y el gancho giratorio que se engancha en tu antebrazo permiten una gran " +"estabilidad." #: lang/json/gunmod_from_json.py msgid "diffracting lens" msgid_plural "diffracting lenses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lente difractario" +msgstr[1] "lentes difractarios" #: lang/json/gunmod_from_json.py msgid "" @@ -125769,36 +130446,43 @@ msgid "" "beam into several lower powered beams. This slightly increases point-blank " "damage and makes it difficult to not hit, but reduces range" msgstr "" +"Es un conjunto de ópticas hechas para ponerse en armas láser, que difractan " +"el rayo láser en varios rayos de bajo poder. Esto incrementa levemente el " +"daño a quemarropa, pero reduce su alcance." #: lang/json/gunmod_from_json.py msgid "tactical flashlight" msgid_plural "tactical flashlights" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "linterna táctica" +msgstr[1] "linternas tácticas" #: lang/json/gunmod_from_json.py msgid "" "A compact flashlight which is mounted to the side of your weapon, not " "powerful, but good enough for tight hallways." msgstr "" +"Es una linterna compacta que se pone en el costado del arma, no es muy " +"potente pero es suficiente para espacios pequeños." #: lang/json/gunmod_from_json.py msgid "tactical flashlight (on)" msgid_plural "tactical flashlights (on)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "linterna táctica (enc.)" +msgstr[1] "linternas tácticas (enc.)" #: lang/json/gunmod_from_json.py msgid "" "A compact flashlight which is attached to the side of your weapon, not " "powerful, but good enough for tight hallways." msgstr "" +"Es una linterna compacta puesta en el costado del arma, no es muy potente " +"pero es suficiente para espacios pequeños." #: lang/json/gunmod_from_json.py msgid "underbarrel launcher" msgid_plural "underbarrel launchers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzador bajocañón" +msgstr[1] "lanzadores bajocañón" #: lang/json/gunmod_from_json.py msgid "" @@ -125810,12 +130494,19 @@ msgid "" "targets. The launcher can be detached and its sights reattached to the " "could be disassembled and attached to a suitable rifle, if so desired." msgstr "" +"Es un lanzador regordete de un disparo con un cañón de calibre grande, " +"adecuado para granadas y bengalas. Este lanzador puede ser unido a un rifle " +"u otra arma adecuada, e incluye su propio grupo de miras. En años más " +"recientes, se vendieron algunas versiones para lanzar bengalas. Con el " +"cartucho adecuado, sería devastadora contra objetivos duros o suaves. Este " +"lanzador puede ser quitado y sus miras vueltas a poner para poder desarmar y" +" poner en un rifle adecuado." #: lang/json/gunmod_from_json.py msgid "underbarrel launcher (modified)" msgid_plural "underbarrel launcher (modified)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lanzador bajocañón (modificado)" +msgstr[1] "lanzadores bajocañón (modificados)" #: lang/json/gunmod_from_json.py msgid "" @@ -125826,36 +130517,45 @@ msgid "" "would be devastating against hard or soft targets. A crude homemade bracket " "has been attached, allowing a wider variety of hosts." msgstr "" +"Es un lanzador regordete de un disparo adecuado para granadas y bengalas. " +"Este lanzador puede ser unido a un rifle u otra arma adecuada, e incluye su " +"propio grupo de miras. En años más recientes, se vendieron algunas versiones" +" para lanzar bengalas. Con el cartucho adecuado, sería devastadora contra " +"objetivos duros o suaves. Tiene puesto un soporte rudimentario que permite " +"una variedad más amplia de receptores." #: lang/json/gunmod_from_json.py msgid "underbarrel shotgun" msgid_plural "underbarrel shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta bajocañón" +msgstr[1] "escopetas bajocañón" #: lang/json/gunmod_from_json.py msgid "modified underbarrel shotgun" msgid_plural "modified underbarrel shotguns" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "escopeta bajocañón modificada" +msgstr[1] "escopetas bajocañón modificadas" #: lang/json/gunmod_from_json.py msgid "'Silent Winds' suppressor" msgid_plural "'Silent Winds' suppressors" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "silenciador 'Vientos Silenciosos'" +msgstr[1] "silenciadores 'Vientos Silenciosos'" #: lang/json/gunmod_from_json.py msgid "" "Rather than using purely wipe media, an additional localized silence spell " "in this tube quiets gunshots going through to hearing-safe levels." msgstr "" +"Más que usar trapos como material, un hechizo de silencio ha sido localizado" +" en este tubo para silenciar los disparos a niveles seguros para la " +"audición." #: lang/json/gunmod_from_json.py msgid "mana laser sight (rail)" msgid_plural "mana laser sights (rail)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mirilla láser de maná (riel)" +msgstr[1] "mirillas láser de maná (riel)" #: lang/json/gunmod_from_json.py msgid "" @@ -125864,12 +130564,16 @@ msgid "" "acquisition. Aside from increased weight, there are no drawbacks. You can " "rotate the attachment rail to fit under the barrel." msgstr "" +"Es una pequeña mira láser que usa luz a través de un cristal de maná, que se" +" monta sobre el riel de accesorios del arma de fuego para mejorar la " +"facilidad y velocidad para apuntar. La única desventaja que tiene es el " +"incremento del peso. Podés rotar el riel para ponerla bajo el cañón." #: lang/json/gunmod_from_json.py msgid "mana laser sight (underbarrel)" msgid_plural "mana laser sights (underbarrel)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mirilla láser de maná (bajocañón)" +msgstr[1] "mirillas láser de maná (bajocañón)" #: lang/json/gunmod_from_json.py msgid "" @@ -125878,28 +130582,25 @@ msgid "" "acquisition. Aside from increased weight, there are no drawbacks. You can " "rotate the attachment rail to fit on the rail." msgstr "" +"Es una pequeña mira láser que usa luz a través de un cristal de maná, que se" +" monta sobre el riel de accesorios del arma de fuego para mejorar la " +"facilidad y velocidad para apuntar. La única desventaja que tiene es el " +"incremento del peso. Podés rotar el riel para ponerla sobre el riel." #: lang/json/gunmod_from_json.py msgid "mana dot sight" msgid_plural "mana dot sights" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mirilla de punto de maná" +msgstr[1] "mirillas de punto de maná" #: lang/json/gunmod_from_json.py msgid "" "Adds a blue dot optic made from crystallized mana to the top of your gun, " "replacing the iron sights. Increases accuracy and weight." msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" +"Agrega un punto azul óptico hecho de maná cristalizado a la parte superior " +"del arma, reemplazando la mirilla metálica del arma. Incrementa la precisión" +" y el peso." #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" @@ -125917,6 +130618,14 @@ msgstr "" "Buscás cualquier pedazo de biónico rescatable que pueda haber en este " "experimento fallido" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" +"Buscás cualquier pedazo rescatable que pueda quedar en este monstruo de " +"metal y carne" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -125934,8 +130643,42 @@ msgstr "" "rancia, tomando nota de todo lo que llame la atención." #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "Laboriosamente, diseccionás el gigantesco insecto." +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "" +"Con mucho trabajo lográs diseccionar el gigantesco insecto. " +"" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" +"Lo que parece ser pelo de insecto en la quitina de esta criatura se parece " +"más a pequeñas plumas cuando las cortás. Adentro hay un grupo de sacos " +"similares a burbujas que parecen estar flotando, lo que no se ajusta a tu " +"conocimiento sobre abejas reales." + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" +"Hay una membrana similar a la piel, un poco peluda, cubierta de vasos " +"sanguíneos debajo de la quitina de esta criatura. Adentro hay un grupo de " +"sacos similares a burbujas que parecen estar flotando, lo que no se ajusta a" +" tu conocimiento sobre avispas reales." #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -128582,10 +133325,6 @@ msgstr "Escribir algo" msgid "Teleport yourself" msgstr "Teletransportarse" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "Extinguir fuego" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "Secarse/limpiarse" @@ -129036,16 +133775,28 @@ msgid "" "This gear requires careful balance to use. Being hit while wearing it could " "make you fall down." msgstr "" +"Este equipo necesita un equilibrio cuidadoso para ser usado. Ser golpeado " +"mientras se utiliza te podría hacer caer." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can be used to communicate with radio waves." +msgstr "Este objeto puede ser usado para comunicarse mediante ondas de radio." + +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." msgstr "" +"Este objeto puede ser usado para abrir cerraduras sin " +"ningún esfuerzo." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." msgstr "" +"Esta ropa está diseñada para mantenerte seco bajo la lluvia." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129053,6 +133804,8 @@ msgid "" "It seems partially intangible, and can occupy the same space as" " other things when worn." msgstr "" +"Parece parcialmente intangible, y puede ocupar el mismo espacio" +" que otras cosas cuando se lleva puesto." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129137,7 +133890,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can be worn simultaneously with power armor." -msgstr "" +msgstr "Este objeto puede ser usado simultáneamente con la armadura de poder." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129173,6 +133926,8 @@ msgid "" "This gear has certain parts padded with steel to increase " "protection with moderate increase to encumbrance." msgstr "" +"Este equipo tiene algunas partes acolchadas con acero para incrementar" +" la protección pero con un leve aumento de incomodidad." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129200,12 +133955,12 @@ msgstr "Este objeto tiene una receta de nanofabricador." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This bionic is faulty." -msgstr "" +msgstr "Este biónico está defectuoso." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This bionic provides power." -msgstr "" +msgstr "Este biónico provee energía." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129218,6 +133973,8 @@ msgid "" "This food is unappetizing in a way that can't be covered up " "by most cooking." msgstr "" +"Esta comida es poco apetecible de tal manera que su sabor no" +" puede ser cubierto por otra comida." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129225,6 +133982,8 @@ msgid "" "This food is raw, and will be more nutritious if " "cooked." msgstr "" +"Esta comida está cruda, y será más nutritiva si se" +" la cocina." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129282,6 +134041,8 @@ msgid "" "You can 'e'xamine the tile to access the controls, or use the vehicle " "control key (default '^')." msgstr "" +"Podés 'e'xaminar el espacio para acceder a los controles, o usar la tecla " +"para controlar vehículos (por defecto '^')." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129289,6 +134050,9 @@ msgid "" "With a seat or saddle, you drive from here. You can 'e'xamine the tile to " "access the controls, or use the vehicle control key (default '^')." msgstr "" +"Manejás desde acá con un asiento o una montura. Podés 'e'xaminar el espacio " +"para acceder a los controles o usar la tecla para controlar vehículos (por " +"defecto '^')." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -129433,12 +134197,12 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This has a flat surface. It would be a nice place to eat." -msgstr "" +msgstr "Esto tiene una superficie plana. Sería un buen lugar para comer." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "You can craft here." -msgstr "" +msgstr "Podés fabricar acá." #: lang/json/keybinding_from_json.py src/input.cpp src/messages.cpp msgid "Scroll up" @@ -129526,15 +134290,15 @@ msgstr "Marcar objeto seleccionado" #: lang/json/keybinding_from_json.py msgid "Enable auto note for map extra" -msgstr "" +msgstr "Activar noto automática para mapa" #: lang/json/keybinding_from_json.py msgid "Toggle auto notes option" -msgstr "" +msgstr "Cambiar opción de auto notas" #: lang/json/keybinding_from_json.py msgid "Disable auto note for map extra" -msgstr "" +msgstr "Desactivar noto automática para mapa" #: lang/json/keybinding_from_json.py msgid "Add rule" @@ -129594,11 +134358,11 @@ msgstr "Elegir armadura para mover" #: lang/json/keybinding_from_json.py msgid "Select panel for moving" -msgstr "" +msgstr "Elegir panel para mover" #: lang/json/keybinding_from_json.py msgid "Toggle panel off" -msgstr "" +msgstr "Desactivar panel" #: lang/json/keybinding_from_json.py msgid "Change side armor is worn on" @@ -129734,11 +134498,11 @@ msgstr "Borrar nota" #: lang/json/keybinding_from_json.py msgid "Edit Note" -msgstr "" +msgstr "Editar Nota" #: lang/json/keybinding_from_json.py msgid "Mark as Dangerous" -msgstr "" +msgstr "Marcar como Peligroso" #: lang/json/keybinding_from_json.py msgid "Create/Edit Note" @@ -129758,11 +134522,11 @@ msgstr "Activar/Desactivar Transparencias" #: lang/json/keybinding_from_json.py msgid "Toggle Land Use Codes" -msgstr "" +msgstr "Cambiar Códigos de Uso en Tierra" #: lang/json/keybinding_from_json.py msgid "Toggle Map Notes" -msgstr "" +msgstr "Cambiar Notas de Mapa" #: lang/json/keybinding_from_json.py msgid "Toggle City Labels" @@ -129806,7 +134570,7 @@ msgstr "Salir" #: lang/json/keybinding_from_json.py msgid "Choose destination" -msgstr "" +msgstr "Elegir destino" #: lang/json/keybinding_from_json.py msgid "Fire Weapon" @@ -129850,7 +134614,7 @@ msgstr "Cambiar Modo de Disparo" #: lang/json/keybinding_from_json.py msgid "Toggle turret lines" -msgstr "" +msgstr "Cambiar líneas de torreta" #: lang/json/keybinding_from_json.py msgid "Toggle Snap to Target" @@ -129858,7 +134622,7 @@ msgstr "Activar/Desactivar Saltar a objetivo" #: lang/json/keybinding_from_json.py msgid "Toggle moving view / cursor" -msgstr "" +msgstr "Cambiar cursor / vista de movimiento" #: lang/json/keybinding_from_json.py msgid "Select" @@ -129926,7 +134690,7 @@ msgstr "Recrear personaje aleatorio y escenario" #: lang/json/keybinding_from_json.py msgid "Pick random character description" -msgstr "" +msgstr "Seleccionar descripción aleatoria de personaje" #: lang/json/keybinding_from_json.py msgid "Choose character start location" @@ -129940,6 +134704,14 @@ msgstr "Salir de la pantalla de personaje nuevo" msgid "Toggle sorting order" msgstr "Cambiar orden" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "Profesión aleatoria" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "Escenario aleatorio" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "Desplazar arriba descripción" @@ -130042,7 +134814,7 @@ msgstr "Cambiar tamaño" #: lang/json/keybinding_from_json.py msgid "To start" -msgstr "" +msgstr "Para arrancar" #: lang/json/keybinding_from_json.py msgid "Swap origin and target" @@ -130066,11 +134838,11 @@ msgstr "Modificar campos" #: lang/json/keybinding_from_json.py msgid "Edit terrain" -msgstr "" +msgstr "Modificar terreno" #: lang/json/keybinding_from_json.py msgid "Edit furniture" -msgstr "" +msgstr "Modificar mueble" #: lang/json/keybinding_from_json.py msgid "Edit overmap / mapgen" @@ -130110,7 +134882,7 @@ msgstr "Activar/Desactivar Modo de selección de categoría" #: lang/json/keybinding_from_json.py msgid "Toggle inventory view to show item categories" -msgstr "" +msgstr "Cambiar viste de inventario para mostrar categorías" #: lang/json/keybinding_from_json.py msgid "Set item filter" @@ -130118,7 +134890,7 @@ msgstr "Establecer filtro de objetos" #: lang/json/keybinding_from_json.py msgid "Toggle item as favorite" -msgstr "" +msgstr "Hacer o sacar objeto como favorito" #: lang/json/keybinding_from_json.py msgid "Toggle activate/examine" @@ -130126,11 +134898,11 @@ msgstr "Activar/Desactivar Examinar" #: lang/json/keybinding_from_json.py msgid "Toggle safe fuel mod" -msgstr "" +msgstr "Cambiar mod de combustible seguro" #: lang/json/keybinding_from_json.py msgid "Toggle auto start mod" -msgstr "" +msgstr "Cambiar mod de auto arrancar" #: lang/json/keybinding_from_json.py src/martialarts.cpp msgid "Pause" @@ -130182,11 +134954,11 @@ msgstr "Inventario avanzado" #: lang/json/keybinding_from_json.py msgid "Pick up Nearby Item(s)" -msgstr "" +msgstr "Agarrar objeto(s) cercanos" #: lang/json/keybinding_from_json.py msgid "Pickup Item(s) at Player Feet" -msgstr "" +msgstr "Agarrar objeto(s) bajo los pies" #: lang/json/keybinding_from_json.py msgid "Grab something nearby" @@ -130214,7 +134986,7 @@ msgstr "Mirar alrededor" #: lang/json/keybinding_from_json.py msgid "Toggle thief mode" -msgstr "" +msgstr "Cambiar modo ladrón" #: lang/json/keybinding_from_json.py msgid "Peek Around Corners" @@ -130258,7 +135030,7 @@ msgstr "Sacarse objeto puesto" #: lang/json/keybinding_from_json.py msgid "Consume Item Menu" -msgstr "" +msgstr "Menú de Consumir Objeto" #: lang/json/keybinding_from_json.py msgid "Wield" @@ -130270,7 +135042,7 @@ msgstr "Elegir Estilo de Artes Marciales" #: lang/json/keybinding_from_json.py msgid "Reload Weapons" -msgstr "" +msgstr "Recargar Armas" #: lang/json/keybinding_from_json.py msgid "Reload Wielded Item" @@ -130340,13 +135112,17 @@ msgstr "Desarmar objetos" msgid "Sleep" msgstr "Dormir" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "Ejercicio" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "Manejar vehículo" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Travel Mode" -msgstr "" +msgstr "Cambiar Modo de Auto Viaje" #: lang/json/keybinding_from_json.py msgid "Toggle Safe Mode" @@ -130378,7 +135154,7 @@ msgstr "Ver Mapa" #: lang/json/keybinding_from_json.py msgid "Look at the sky" -msgstr "" +msgstr "Mirar el cielo" #: lang/json/keybinding_from_json.py msgid "View Factions" @@ -130386,7 +135162,7 @@ msgstr "Ver Bandos" #: lang/json/keybinding_from_json.py msgid "View Achievements, Scores, and Kills" -msgstr "" +msgstr "Ver Logros, Puntos y Muertes" #: lang/json/keybinding_from_json.py msgid "View Morale" @@ -130422,23 +135198,23 @@ msgstr "Ver Mapa de Olor" #: lang/json/keybinding_from_json.py msgid "View Scent Type" -msgstr "" +msgstr "Ver Tipo de Olor" #: lang/json/keybinding_from_json.py msgid "View Temperature Map" -msgstr "" +msgstr "Ver Mapa de Temperatura" #: lang/json/keybinding_from_json.py msgid "View Visibility Map" -msgstr "" +msgstr "Ver Mapa de Visibilidad" #: lang/json/keybinding_from_json.py msgid "View Lighting Map" -msgstr "" +msgstr "Ver Mapa de Luz" #: lang/json/keybinding_from_json.py msgid "View Radiation Map" -msgstr "" +msgstr "Ver Mapa de Radiació" #: lang/json/keybinding_from_json.py msgid "Switch Sidebar Style" @@ -130450,15 +135226,15 @@ msgstr "Act./Desact. Pantalla completa" #: lang/json/keybinding_from_json.py msgid "Toggle Minimap" -msgstr "" +msgstr "Mostrar/Ocultar Minimapa" #: lang/json/keybinding_from_json.py msgid "Toggle Panel Admin" -msgstr "" +msgstr "Mostrar/Ocultar Panel de Administrador" #: lang/json/keybinding_from_json.py msgid "Reload Item" -msgstr "" +msgstr "Recargar objeto" #: lang/json/keybinding_from_json.py msgid "Reload Tileset" @@ -130482,7 +135258,7 @@ msgstr "Activar/Desactivar auto recolectar" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Pickup" -msgstr "" +msgstr "Cambiar Auto Agarrar" #: lang/json/keybinding_from_json.py msgid "Action Menu" @@ -130562,27 +135338,27 @@ msgstr "Mods Activos de Mundo" #: lang/json/keybinding_from_json.py msgid "Cycle move mode (run/walk/crouch)" -msgstr "" +msgstr "Cambiar modo de movimiento (correr/caminar/agacharse)" #: lang/json/keybinding_from_json.py msgid "Reset Movement to Walk" -msgstr "" +msgstr "Volver a Caminar" #: lang/json/keybinding_from_json.py msgid "Toggle Run" -msgstr "" +msgstr "Empezar a Correr" #: lang/json/keybinding_from_json.py msgid "Toggle Crouch" -msgstr "" +msgstr "Empezar a Agacharse" #: lang/json/keybinding_from_json.py msgid "Movement Mode Menu" -msgstr "" +msgstr "Menú de Modo de Movimiento" #: lang/json/keybinding_from_json.py msgid "Spellcasting" -msgstr "" +msgstr "Hechizos" #: lang/json/keybinding_from_json.py src/game_inventory.cpp msgid "Compare" @@ -130657,7 +135433,7 @@ msgstr "Agregar atajo de teclado global" #: lang/json/keybinding_from_json.py msgid "Execute action keybinding" -msgstr "" +msgstr "Tecla de ejecutar acción" #: lang/json/keybinding_from_json.py msgid "Add zone" @@ -130733,7 +135509,7 @@ msgstr "Mover todos los objetos" #: lang/json/keybinding_from_json.py msgid "Mark/unmark non-favorite items in multidrop menu" -msgstr "" +msgstr "Marcar/Desmarcar no favoritos en menú de soltar varios objetos" #: lang/json/keybinding_from_json.py msgid "Select items @ North-West" @@ -130813,18 +135589,18 @@ msgstr "Cargar plantilla de color" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "Sí" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "No" #: lang/json/keybinding_from_json.py msgid "Quit" -msgstr "" +msgstr "Salir" #: lang/json/keybinding_from_json.py msgid "Ignore further distractions and finish" @@ -130844,19 +135620,19 @@ msgstr "Cancelar" #: lang/json/keybinding_from_json.py msgid "Describe creature" -msgstr "" +msgstr "Describir criatura" #: lang/json/keybinding_from_json.py msgid "Describe furniture" -msgstr "" +msgstr "Describir mueble" #: lang/json/keybinding_from_json.py msgid "Describe terrain" -msgstr "" +msgstr "Describir terreno" #: lang/json/keybinding_from_json.py msgid "Switch lists" -msgstr "" +msgstr "Cambiar listas" #: lang/json/keybinding_from_json.py src/action.cpp msgid "Back" @@ -130864,19 +135640,19 @@ msgstr "Volver" #: lang/json/keybinding_from_json.py msgid "More" -msgstr "" +msgstr "Más" #: lang/json/keybinding_from_json.py msgid "Examine item" -msgstr "" +msgstr "Examinar objeto" #: lang/json/keybinding_from_json.py msgid "Cancel trading" -msgstr "" +msgstr "Cancelar negociación" #: lang/json/keybinding_from_json.py src/player_display.cpp msgid "Change profession name" -msgstr "" +msgstr "Cambiar nombre de profesión" #: lang/json/keybinding_from_json.py src/vehicle_use.cpp src/vehicle_use.cpp msgid "Control multiple electronics" @@ -130912,7 +135688,7 @@ msgstr "Luces atómicas" #: lang/json/keybinding_from_json.py src/vehicle_use.cpp msgid "Control autopilot" -msgstr "" +msgstr "Controlar piloto automático" #: lang/json/keybinding_from_json.py msgid "Toggle camera system" @@ -130948,11 +135724,11 @@ msgstr "Activar/Desactivar freezer" #: lang/json/keybinding_from_json.py msgid "Toggle space heater" -msgstr "" +msgstr "Prender/Apagar caloventor" #: lang/json/keybinding_from_json.py msgid "Toggle cooler" -msgstr "" +msgstr "Prender/Apagar refrigerador" #: lang/json/keybinding_from_json.py msgid "Toggle headlights" @@ -131033,88 +135809,88 @@ msgstr "Nada" #. ~ Description for {'str': 'Nothing'} #: lang/json/map_extra_from_json.py msgid "Nothing of interest is here." -msgstr "" +msgstr "Acá no hay nada de interés." #: lang/json/map_extra_from_json.py msgid "Crater" -msgstr "" +msgstr "Cráter" #. ~ Description for {'str': 'Crater'} #: lang/json/map_extra_from_json.py msgid "There is a crater here." -msgstr "" +msgstr "Acá hay un cráter." #: lang/json/map_extra_from_json.py msgid "College Kids" -msgstr "" +msgstr "Estudiantes" #. ~ Description for {'str': 'College Kids'} #: lang/json/map_extra_from_json.py msgid "Several corpses of college kids are here." -msgstr "" +msgstr "Acá hay varios cadáveres de niños estudiantes." #: lang/json/map_extra_from_json.py msgid "Drug Deal" -msgstr "" +msgstr "Transacción de Droga" #. ~ Description for {'str': 'Drug Deal'} #: lang/json/map_extra_from_json.py msgid "Several corpses of drug dealers are here." -msgstr "" +msgstr "Acá hay varios cadáveres de narcotraficantes." #: lang/json/map_extra_from_json.py msgid "Roadworks" -msgstr "" +msgstr "Obras viales" #. ~ Description for {'str': 'Roadworks'} #: lang/json/map_extra_from_json.py msgid "Roadworks are here." -msgstr "" +msgstr "Acá hay unas obras sobre la calle." #: lang/json/map_extra_from_json.py msgid "Road Mayhem" -msgstr "" +msgstr "Caos en la Calle" #. ~ Description for {'str': 'Road Mayhem'} #: lang/json/map_extra_from_json.py msgid "Road mayhem is here." -msgstr "" +msgstr "Acá hay algún quilombo en la calle." #: lang/json/map_extra_from_json.py msgid "Roadblock (Military)" -msgstr "" +msgstr "Barricada (Militar)" #. ~ Description for {'str': 'Roadblock (Military)'} #: lang/json/map_extra_from_json.py msgid "This road is blocked by military." -msgstr "" +msgstr "Acá la calle está bloqueada por los militares." #: lang/json/map_extra_from_json.py msgid "Roadblock (Bandits)" -msgstr "" +msgstr "Barricada (Bandidos)" #. ~ Description for {'str': 'Roadblock (Bandits)'} #: lang/json/map_extra_from_json.py msgid "This road is blocked by bandits." -msgstr "" +msgstr "Acá la calle está bloqueada por los bandidos." #: lang/json/map_extra_from_json.py msgid "Minefield" -msgstr "" +msgstr "Campo Minado" #. ~ Description for {'str': 'Minefield'} #: lang/json/map_extra_from_json.py msgid "Mines are scattered here." -msgstr "" +msgstr "Acá hay minas plantadas." #: lang/json/map_extra_from_json.py msgid "Supply Drop" -msgstr "" +msgstr "Suministros" #. ~ Description for {'str': 'Supply Drop'} #: lang/json/map_extra_from_json.py msgid "Several supply crates were dropped here." -msgstr "" +msgstr "Hay varias cajas con suministros que cayeron acá." #: lang/json/map_extra_from_json.py msgctxt "Map Extra" @@ -131124,7 +135900,7 @@ msgstr "Militar" #. ~ Description for {'str': 'Military', 'ctxt': 'Map Extra'} #: lang/json/map_extra_from_json.py msgid "Several corpses of soldiers are here." -msgstr "" +msgstr "Acá hay varios cadáveres de soldados." #: lang/json/map_extra_from_json.py msgid "Helicopter Crash" @@ -131133,52 +135909,52 @@ msgstr "Helicóptero Estrellado" #. ~ Description for {'str': 'Helicopter Crash'} #: lang/json/map_extra_from_json.py msgid "Helicopter crashed here." -msgstr "" +msgstr "Acá se cayó un helicóptero." #: lang/json/map_extra_from_json.py msgid "Scientists" -msgstr "" +msgstr "Científicos" #. ~ Description for {'str': 'Scientists'} #: lang/json/map_extra_from_json.py msgid "Several corpses of scientists are here." -msgstr "" +msgstr "Acá hay varios cadáveres de científicos." #: lang/json/map_extra_from_json.py msgid "Portal" -msgstr "" +msgstr "Portal" #. ~ Description for {'str': 'Portal'} #: lang/json/map_extra_from_json.py msgid "Portal is here." -msgstr "" +msgstr "Acá hay un portal." #: lang/json/map_extra_from_json.py msgid "Portal In" -msgstr "" +msgstr "Portal de Entrada" #. ~ Description for {'str': 'Portal In'} #: lang/json/map_extra_from_json.py msgid "Another portal is here." -msgstr "" +msgstr "Acá hay otro portal." #: lang/json/map_extra_from_json.py msgid "Spider Nest" -msgstr "" +msgstr "Nido de Arañas" #. ~ Description for {'str': 'Spider Nest'} #: lang/json/map_extra_from_json.py msgid "Spider nest is here." -msgstr "" +msgstr "Acá hay un nido de arañas." #: lang/json/map_extra_from_json.py msgid "Wasp Nest" -msgstr "" +msgstr "Nido de Avispas" #. ~ Description for {'str': 'Wasp Nest'} #: lang/json/map_extra_from_json.py msgid "Wasp nest is here." -msgstr "" +msgstr "Acá hay un nido de avispas." #: lang/json/map_extra_from_json.py src/gamemode_defense.cpp msgid "Spiders" @@ -131188,179 +135964,182 @@ msgstr "Arañas" #: lang/json/map_extra_from_json.py msgid "This area is covered with webs. Probably spiders are nearby" msgstr "" +"Este área está cubierta de telarañas. Probablemente haya arañas cerca." #. ~ Description for {'str': 'Shia LaBeouf'} #: lang/json/map_extra_from_json.py msgid "Cannibal is nearby." -msgstr "" +msgstr "Hay un caníbal cerca." #: lang/json/map_extra_from_json.py msgid "Jabberwock" -msgstr "" +msgstr "Jabberwock" #. ~ Description for {'str': 'Jabberwock'} #: lang/json/map_extra_from_json.py msgid "Jabberwock is nearby." -msgstr "" +msgstr "Hay un jabberwock cerca." #: lang/json/map_extra_from_json.py msgid "Grove" -msgstr "" +msgstr "Arboleda" #. ~ Description for {'str': 'Grove'} #: lang/json/map_extra_from_json.py msgid "This area is covered with a single type of trees." -msgstr "" +msgstr "Esta área está cubierta con un solo tipo de árboles." #: lang/json/map_extra_from_json.py msgid "Shrubberry" -msgstr "" +msgstr "Arbustos" #. ~ Description for {'str': 'Shrubberry'} #: lang/json/map_extra_from_json.py msgid "This area is covered with a single type of shrubs." -msgstr "" +msgstr "Esta área está cubierta con un solo tipo de arbusto." #: lang/json/map_extra_from_json.py msgid "Clearcut" -msgstr "" +msgstr "Claro" #. ~ Description for {'str': 'Clearcut'} #: lang/json/map_extra_from_json.py msgid "Most trees in this area were uniformly cut down." -msgstr "" +msgstr "En esta área la mayoría de los árboles fueron talados." #: lang/json/map_extra_from_json.py msgid "Pond" -msgstr "" +msgstr "Charco" #. ~ Description for {'str': 'Pond'} #: lang/json/map_extra_from_json.py msgid "Small pond is here." -msgstr "" +msgstr "Acá hay un pequeño charco." #: lang/json/map_extra_from_json.py msgid "Stand of trees" -msgstr "" +msgstr "Línea de árboles" #. ~ Description for {'str': 'Stand of trees'} #: lang/json/map_extra_from_json.py msgid "A copse of trees." -msgstr "" +msgstr "Es un bosquecillo de árboles." #: lang/json/map_extra_from_json.py msgid "Tall grass" -msgstr "" +msgstr "Pasto alto" #. ~ Description for {'str': 'Tall grass'} #: lang/json/map_extra_from_json.py msgid "A meadow of tall grass." -msgstr "" +msgstr "Es un campo con pasto alto." #: lang/json/map_extra_from_json.py msgid "Derelict shed" -msgstr "" +msgstr "Caseta abandonada" #. ~ Description for {'str': 'Derelict shed'} #: lang/json/map_extra_from_json.py msgid "A collapsed shed." -msgstr "" +msgstr "Es una caseta medio derrumbada." #: lang/json/map_extra_from_json.py msgid "Clay Deposit" -msgstr "" +msgstr "Depósito de Arcilla" #. ~ Description for {'str': 'Clay Deposit'} #: lang/json/map_extra_from_json.py msgid "Small clay deposit is here." -msgstr "" +msgstr "Acá hay un pequeño depósito de arcilla." #: lang/json/map_extra_from_json.py msgid "Dead Vegetation" -msgstr "" +msgstr "Vegetación Muerta" #. ~ Description for {'str': 'Dead Vegetation'} #. ~ Description for {'str': 'Dead Vegetation (Point)'} #: lang/json/map_extra_from_json.py msgid "Dead vegetation is here." -msgstr "" +msgstr "Acá hay vegetación muerta." #: lang/json/map_extra_from_json.py msgid "Dead Vegetation (Point)" -msgstr "" +msgstr "Vegetación Muerta (Punto)" #: lang/json/map_extra_from_json.py msgid "Burned Ground" -msgstr "" +msgstr "Suelo Quemado" #. ~ Description for {'str': 'Burned Ground'} #. ~ Description for {'str': 'Burned Ground (Point)'} #: lang/json/map_extra_from_json.py msgid "Burned ground is here." -msgstr "" +msgstr "Acá está el suelo quemado." #: lang/json/map_extra_from_json.py msgid "Burned Ground (Point)" -msgstr "" +msgstr "Suelo Quemado (Punto)" #: lang/json/map_extra_from_json.py msgid "Marloss Pilgrimage" -msgstr "" +msgstr "Peregrinación Marloss" #. ~ Description for {'str': 'Marloss Pilgrimage'} #: lang/json/map_extra_from_json.py msgid "Marloss Pilgrimage is here." -msgstr "" +msgstr "Acá hay una peregrinación marloss." #: lang/json/map_extra_from_json.py msgid "Casings" -msgstr "" +msgstr "Vainas" #. ~ Description for {'str': 'Casings'} #: lang/json/map_extra_from_json.py msgid "Several spent casings are here." -msgstr "" +msgstr "Acá hay varias vainas servidas." #: lang/json/map_extra_from_json.py msgid "Looters" -msgstr "" +msgstr "Saqueadores" #. ~ Description for {'str': 'Looters'} #: lang/json/map_extra_from_json.py msgid "Some looters gathering everything not nailed down." -msgstr "" +msgstr "Hay unos saqueadores que se están llevando todo lo que pueden." #: lang/json/map_extra_from_json.py msgid "Corpses" -msgstr "" +msgstr "Cadáveres" #. ~ Description for {'str': 'Corpses'} #: lang/json/map_extra_from_json.py msgid "Some unfortunates from the billions lost in the Cataclysm." msgstr "" +"Algunos de los desafortunados entre los miles de millones perdidos en el " +"Cataclismo." #. ~ Description for {'str': 'Wasp Nest'} #: lang/json/map_extra_from_json.py msgid "A wasp nest." -msgstr "" +msgstr "Es un nido de avispas." #: lang/json/map_extra_from_json.py msgid "Dermatik Nest" -msgstr "" +msgstr "Nido de Dermatik" #. ~ Description for {'str': 'Dermatik Nest'} #: lang/json/map_extra_from_json.py msgid "A dermatik nest." -msgstr "" +msgstr "Es un nido de dermatiks." #: lang/json/map_extra_from_json.py lang/json/vehicle_from_json.py msgid "Prison Bus" -msgstr "" +msgstr "Colectivo de Cárcel" #. ~ Description for {'str': 'Prison Bus'} #: lang/json/map_extra_from_json.py msgid "A prison bus." -msgstr "" +msgstr "Es un colectivo para trasladar presos." #: lang/json/map_extra_from_json.py msgid "Mass Grave" @@ -131369,25 +136148,34 @@ msgstr "Fosa Común" #. ~ Description for {'str': 'Mass Grave'} #: lang/json/map_extra_from_json.py msgid "A mass grave." -msgstr "" +msgstr "Es una fosa común." #: lang/json/map_extra_from_json.py msgid "Grave" -msgstr "" +msgstr "Tumba" #. ~ Description for {'str': 'Grave'} #: lang/json/map_extra_from_json.py msgid "A grave." -msgstr "" +msgstr "Es una tumba." #: lang/json/map_extra_from_json.py msgid "Zombie Trap" -msgstr "" +msgstr "Trampa Zombi" #. ~ Description for {'str': 'Zombie Trap'} #: lang/json/map_extra_from_json.py msgid "Zombie trap." -msgstr "" +msgstr "Es una trampa para zombi." + +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "Junco" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "Es vegetación en el agua." #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -131409,6 +136197,8 @@ msgstr "Banco Computarizado Consolidado de Hacienda de Alta Seguridad" msgid "" "ERROR! Access denied! Unauthorized access will be met with lethal force!" msgstr "" +"¡ERROR! ¡Acceso denegado! ¡El acceso no autorizado será castigado con fuerza" +" letal!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -131513,7 +136303,7 @@ msgstr " Zona de Basura" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "St. John Dairy. 555-0199 Daily Farm Tours" -msgstr "" +msgstr "Granja San Juan. 555-0199 Visitas a la Granja" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -131784,7 +136574,7 @@ msgstr "Aviso de Seguridad [1057]" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Security Reminder [1058]" -msgstr "" +msgstr "Aviso de Seguridad [1058]" #. ~ Computer option #: lang/json/mapgen_from_json.py @@ -131829,87 +136619,87 @@ msgstr "Analizar sangre" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Irradiation Facility Operation Console" -msgstr "" +msgstr "Consola de Operación de Irradiación" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Uplink to mainframe servers" -msgstr "" +msgstr "Enlace a servidores centrales" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Cycle conveyor belt" -msgstr "" +msgstr "Cambiar cinta transportadora" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Toggle safety shutters" -msgstr "" +msgstr "Cambiar obturadores de seguridad" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Probe radiation levels" -msgstr "" +msgstr "Sondear niveles de radiación" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Commence irradiation sequence" -msgstr "" +msgstr "Iniciar secuencia de irradiación" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "[Maintenance] Extract radiation core" -msgstr "" +msgstr "[Mantenimiento] Extraer núcleo de radiación" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Hazardous Materials Containment" -msgstr "" +msgstr "Contención de Materiales Peligrosos" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Access containment zone" -msgstr "" +msgstr "Acceder zona de contención" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Geiger counter readout" -msgstr "" +msgstr "Lectura de contador geiger" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Security Access Terminal" -msgstr "" +msgstr "Terminal de Acceso de Seguridad" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Open doors" -msgstr "" +msgstr "Abrir puertas" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Access security locker" -msgstr "" +msgstr "Acceder casillero de seguridad" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Power Management" -msgstr "" +msgstr "Administración de Energía" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "External power management" -msgstr "" +msgstr "Administración de energía externa" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Backup power management" -msgstr "" +msgstr "Administración de energía de reserva" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Run emergency auto-diagnostic" -msgstr "" +msgstr "Iniciar autodiagnóstico de emergencia" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132078,7 +136868,7 @@ msgstr "funciona." #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Restricted area! Violators will be shot!" -msgstr "" +msgstr "¡Área restringida! ¡Se disparará contra los infractores!" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -132102,7 +136892,7 @@ msgstr "" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Travelier MOTEL" -msgstr "" +msgstr "HOTEL Viajero" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -132222,17 +137012,17 @@ msgstr "¡NO tirarse de cabeza!" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Armory Access" -msgstr "" +msgstr "Acceso a Armería" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Open Armory Door" -msgstr "" +msgstr "Abrir Puerta de Armería" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Private property. No trespassing!" -msgstr "" +msgstr "Propiedad privada. ¡No pasar!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132328,7 +137118,7 @@ msgstr "el nombre ya no está pero quedó el slogan: 'Te vamos a reparar todo'" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "EnviroCom OS v2.03 - Basement Access" -msgstr "" +msgstr "EnviroCom OS v2.03 - Acceso Sótano" #. ~ Computer option #: lang/json/mapgen_from_json.py @@ -132338,12 +137128,12 @@ msgstr "Abrir escaleras" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Authorized personnel only" -msgstr "" +msgstr "Solo para personal autorizado" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " sewage treatment plant" -msgstr "" +msgstr " planta de tratamiento de aguas cloacales" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -132440,7 +137230,7 @@ msgstr "Instalar Modificación de Repetidor" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Browse Audio Archive" -msgstr "" +msgstr "Revisar Archivo de Audio" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132455,7 +137245,7 @@ msgstr "Casa de Té La Hoja Verde" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "RESTRICTED AREA! AUTHORIZED PERSONNEL ONLY" -msgstr "" +msgstr "¡ÁREA RESTRINGIDA! SOLO PERSONAL AUTORIZADO" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132580,7 +137370,7 @@ msgstr "DESTRABAR ALMACENAMIENTO" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Prototype DARPA-713 AUTHORIZED PILOTS ONLY" -msgstr "" +msgstr "Prototype DARPA-713 SOLO PILOTOS AUTORIZADOS" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -132625,12 +137415,12 @@ msgstr "Ver Rutas de Subte" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Security Terminal" -msgstr "" +msgstr "Terminal de Seguridad" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "UNLOCK SECURITY DOORS" -msgstr "" +msgstr "ABRIR PUERTAS DE SEGURIDAD" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132641,6 +137431,11 @@ msgid "" "\n" "Regulation EX-127 applies." msgstr "" +"Peligro:\n" +"Sala dimensionalmente inestable.\n" +"No pasar la línea amarilla.\n" +"\n" +"Se aplica la regulación EX-127." #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132651,16 +137446,21 @@ msgid "" "\n" "Ration VC+983 appliance." msgstr "" +"Pegrilo;\n" +"Sala dimen inesta sional.\n" +"Pasar la amínea linilla.\n" +"\n" +"Aplique VC+983 ración." #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Surgery room computer" -msgstr "" +msgstr "Computadora sala de cirugía" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Open Storage Chambers" -msgstr "" +msgstr "Abrir Cámaras de Almacenamiento" #. ~ Computer option #: lang/json/mapgen_from_json.py src/mapgen.cpp src/mapgen.cpp @@ -132670,32 +137470,32 @@ msgstr "Manifiesto" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Medical Storage Access" -msgstr "" +msgstr "Acceso Almacenamiento Médico" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Open Storage Door" -msgstr "" +msgstr "Abrir Puerta de Almacenamiento" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DANGER MINEFIELD" -msgstr "" +msgstr "PELIGRO CAMPO MINADO" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Vehicle Testing Track" -msgstr "" +msgstr "Pista de Prueba de Vehículo" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Weapons Testing Range" -msgstr "" +msgstr "Prueba de Rango de Armas" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Armory Entrance" -msgstr "" +msgstr "Entrada Armería" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -132703,6 +137503,13 @@ msgid "" "Whately Family Mortuary Services. Serving New England for three hundred " "years.'" msgstr "" +"Servicios Funerarios Familia Whately. Sirviendo a New England por " +"trescientos años." + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "Controles De Operación DinoLab al Teatro" #: lang/json/martial_art_from_json.py msgid "No style" @@ -132716,13 +137523,13 @@ msgstr "No es un arte marcial, es el viejo y conocido pegar piñas y patadas." #. ~ initiate message for martial art '{'str': 'No style'}' #: lang/json/martial_art_from_json.py msgid "You decide to not use any martial arts." -msgstr "" +msgstr "Decidís no usar ninguna arte marcial." #. ~ initiate message for martial art '{'str': 'No style'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s enters a generic combat stance." -msgstr "" +msgstr "%s adopta una postura genérica de combate." #: lang/json/martial_art_from_json.py msgid "Force unarmed" @@ -132740,13 +137547,13 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Force unarmed'}' #: lang/json/martial_art_from_json.py msgid "You force yourself to fight unarmed." -msgstr "" +msgstr "Te forzás a pelear desarmado." #. ~ initiate message for martial art '{'str': 'Force unarmed'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s decides to fight unarmed." -msgstr "" +msgstr "%s decide pelera desarmado." #: lang/json/martial_art_from_json.py msgid "Aikido" @@ -132759,21 +137566,24 @@ msgid "" "injury to the attacker. It uses defensive throws and disarms but lacks " "offensive techniques." msgstr "" +"El aikido es un arte marcial japonés focalizado en la defensa propia y en " +"minimizar el daño hacia el atacante. Utiliza desarmes y tiradas defensivas, " +"pero no tiene técnicas ofensivas." #. ~ initiate message for martial art '{'str': 'Aikido'}' #: lang/json/martial_art_from_json.py msgid "You enter the hamni stance." -msgstr "" +msgstr "Adoptás la postura hamni." #. ~ initiate message for martial art '{'str': 'Aikido'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s changes into a relaxed combat posture." -msgstr "" +msgstr "%s cambia y adopta una postura relajada de combate." #: lang/json/martial_art_from_json.py msgid "Aikido Stance" -msgstr "" +msgstr "Postura de Aikido" #. ~ Description of buff 'Aikido Stance' for martial art '{'str': 'Aikido'}' #: lang/json/martial_art_from_json.py @@ -132783,10 +137593,13 @@ msgid "" "\n" "Blocked damage reduced by 100% of Dexterity." msgstr "" +"Al dejar de lado la ofensiva en favor de la defensa propia, te hacés mejor protegiendo.\n" +"\n" +"El daño bloqueado se reduce un 100% de tu Destreza." #: lang/json/martial_art_from_json.py msgid "Intermediate Aikido" -msgstr "" +msgstr "Aikido Intermedio" #. ~ Description of buff 'Intermediate Aikido' for martial art '{'str': #. 'Aikido'}' @@ -132798,10 +137611,14 @@ msgid "" "Blocked Damage reduced by 100% of Dexterity.\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"Un practicante intermedio de aikido puede protegerse contra varios oponentes a la vez.\n" +"\n" +"El daño bloqueado se reduce un 100% de tu Destreza.\n" +"+1 intentos de Bloqueo, +1 intentos de Esquivar." #: lang/json/martial_art_from_json.py msgid "Advanced Aikido" -msgstr "" +msgstr "Aikido Avanzado" #. ~ Description of buff 'Advanced Aikido' for martial art '{'str': 'Aikido'}' #: lang/json/martial_art_from_json.py @@ -132810,6 +137627,9 @@ msgid "" "\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"Un practicante avanzado de aikido puede protegerse contra varios oponentes a la vez, más que lo normal.\n" +"\n" +"+1 intentos de Bloqueo, +1 intentos de Esquivar." #: lang/json/martial_art_from_json.py msgid "Boxing" @@ -132822,21 +137642,24 @@ msgid "" "of the Victorian era. Strength reduces blocked damage and moving increase " "dodge skill." msgstr "" +"El deporte del verdadero caballero. El boxeo moderno ha evolucionado desde " +"los combates profesionales de la era victoriana. La fuerza reduce el daño " +"bloqueado y moverse incrementa la habilidad para esquivar." #. ~ initiate message for martial art '{'str': 'Boxing'}' #: lang/json/martial_art_from_json.py msgid "You lower your chin and raise your fists to eye level." -msgstr "" +msgstr "Bajás tu mentón y levantás tus puños al nivel de los ojos." #. ~ initiate message for martial art '{'str': 'Boxing'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s prepares to fight with raised fists." -msgstr "" +msgstr "%s se prepara para pelear levantando los puños." #: lang/json/martial_art_from_json.py msgid "Boxing Stance" -msgstr "" +msgstr "Postura de Boxeo" #. ~ Description of buff 'Boxing Stance' for martial art '{'str': 'Boxing'}' #: lang/json/martial_art_from_json.py @@ -132846,6 +137669,9 @@ msgid "" "\n" "+2 Bash damage, Blocked damge reduced by 50% of Strength." msgstr "" +"Una postura sólida te permite bloquear más daño que lo normal y meter mejores piñas.\n" +"\n" +"+2 daño Golpeante, Daño bloqueado disminuido en 50% de tu Fuerza." #: lang/json/martial_art_from_json.py msgid "Footwork" @@ -132859,6 +137685,10 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts for 1 turns. Stacks 2 times." msgstr "" +"Te hacés más difícil de recibir golpes al mecerte y zigzaguear mientras te movés.\n" +"\n" +"+1.0 a Esquivar.\n" +"Dura 1 turno. Se acumula hasta 2 veces." #: lang/json/martial_art_from_json.py msgid "Counter Chance" @@ -132873,6 +137703,10 @@ msgid "" "+25% Bash damage.\n" "Lasts for 1 turn." msgstr "" +"Ya tuviste tu oportunidad. ¡Ahora golpeá!\n" +"\n" +"+25% daño Golpeante.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Brawling" @@ -132885,21 +137719,24 @@ msgid "" "unarmed or with any weapon to a certain extent. It's not stylish or " "sporting, but it gets the job done." msgstr "" +"Estás acostumbrado a la pelea mano contra pata. Sabés cómo pelear desarmado " +"o con cualquier arma hasta cierto punto. No tiene estilo ni es deportivo, " +"pero funciona bien." #. ~ initiate message for martial art '{'str': 'Brawling'}' #: lang/json/martial_art_from_json.py msgid "You grit your teeth and prepare for a good fight." -msgstr "" +msgstr "Apretás los dientes y te preparás para una buena pelea." #. ~ initiate message for martial art '{'str': 'Brawling'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s gets ready to brawl." -msgstr "" +msgstr "%s se prepara para las piñas." #: lang/json/martial_art_from_json.py msgid "Enhanced Blocking" -msgstr "" +msgstr "Bloqueo Mejorado" #. ~ Description of buff 'Enhanced Blocking' for martial art '{'str': #. 'Brawling'}' @@ -132909,6 +137746,9 @@ msgid "" "\n" "+1 Block attempts." msgstr "" +"La experiencia en el combate te llevó a ser capaz de bloquear varios ataques a la vez.\n" +"\n" +"+1 intentos de Bloqueo." #: lang/json/martial_art_from_json.py msgid "Capoeira" @@ -132921,21 +137761,25 @@ msgid "" "on fluid movement and sweeping kicks. Moving briefly enables stronger " "techniques. Missing an attack grants bonus damage for a short time." msgstr "" +"Es un estilo similar a la danza que tiene sus raíces en la esclavitud en " +"Brasil. La capoeira está focalizada en la fluidez de los movimientos y las " +"patadas barridas. Moverte habilita brevemente las técnicas más potentes. Al " +"errar un ataque tenés un bonus al daño por un breve tiempo." #. ~ initiate message for martial art '{'str': 'Capoeira'}' #: lang/json/martial_art_from_json.py msgid "You begin performing the ginga." -msgstr "" +msgstr "Empezás a interpretar la ginga." #. ~ initiate message for martial art '{'str': 'Capoeira'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s begins to rhythmically rock back and forth." -msgstr "" +msgstr "%s comienza a moverse hacia adelante y atrás de manera rítmica." #: lang/json/martial_art_from_json.py msgid "Capoeira Stance" -msgstr "" +msgstr "Postura de Capoeira" #. ~ Description of buff 'Capoeira Stance' for martial art '{'str': #. 'Capoeira'}' @@ -132945,10 +137789,13 @@ msgid "" "\n" "+1.0 Dodge skill, +1 Dodge attempts." msgstr "" +"No dejás de moverte nunca mientras hacés la ginga. Esto te hace muy movedizo mientras peleás.\n" +"\n" +"+1.0 a Esquivar, +1 intentos de Esquivar." #: lang/json/martial_art_from_json.py msgid "Capoeira Momentum" -msgstr "Momentum Capoeira" +msgstr "Impulso de Capoeira" #. ~ Description of buff 'Capoeira Momentum' for martial art '{'str': #. 'Capoeira'}' @@ -132960,6 +137807,30 @@ msgid "" "Enables \"Spin Kick\" and \"Sweep Kick\" techniques.\n" "Lasts 3 turns." msgstr "" +"Podés sentir el ritmo mientras te movés. No solo sos más difícil de golpear, ¡también tus patadas son más copadas!\n" +"\n" +"+1.0 a Esquivar.\n" +"Habilita las técnicas \"Patada Giratoria\" y \"Patada Barredora\".\n" +"Dura 3 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "Capoeira Tempo" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" +"No le erraste, es solamente parte de la danza y ¡la mejor parte está por empezar!\n" +"\n" +"+15% daño Golpeante.\n" +"Dura 2 turnos. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" @@ -132972,17 +137843,21 @@ msgid "" "techniques and jumping dodges. Dexterity determines your damage, rather " "than Strength; you also receive a dodge bonus move or dodge an attack." msgstr "" +"Uno de los cinco estilos animales Shaolin. La Grulla utiliza técnicas " +"intrincadas de mano y saltos para esquivar. La destreza determina el daño " +"que causás, más que la fuerza. También tenés un bonus a un movimiento para " +"esquivar o a esquivar un ataque." #. ~ initiate message for martial art '{'str': 'Crane Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You raise your leg slightly and balance like a crane." -msgstr "" +msgstr "Levantás tu pierna levemente y te balanceas como una grulla." #. ~ initiate message for martial art '{'str': 'Crane Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a crane-like stance." -msgstr "" +msgstr "%s adopta la postura de la grulla." #: lang/json/martial_art_from_json.py msgid "Crane's Precision" @@ -132998,6 +137873,10 @@ msgid "" "\n" "Bash damage increased by 75% of Dexterity but decreased by 75% of Strength." msgstr "" +"Tus ataques golpean las debilidades de tus enemigos con velocidad y precisión en lugar de fuerza bruta.\n" +"La Destreza incrementa el daño de cuerpo a cuerpo en lugar de la Fuerza.\n" +"\n" +"El daño Golpeante se incrementa en 75% de tu Destreza pero disminuye en un 75% de tu Fuerza." #: lang/json/martial_art_from_json.py msgid "Crane's Flight" @@ -133012,10 +137891,14 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"Igualito a un pájaro, te elevás en el aire para esquivar el peligro.\n" +"\n" +"+1.0 a Esquivar.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Crane's Grace" -msgstr "" +msgstr "Gracia de Grulla" #. ~ Description of buff 'Crane's Grace' for martial art '{'str': 'Crane Kung #. Fu'}' @@ -133026,6 +137909,10 @@ msgid "" "+1 Dodge attempts, +1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"Similar a una grulla, te volvés rápido para esquivar el peligro.\n" +"\n" +"+1 intentos de Esquivar, +1.0 a Esquivar.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Dragon Kung Fu" @@ -133039,17 +137926,21 @@ msgid "" "Your attacks lead to counterattacks which disable your opponents and set " "them up for a powerful finishing move." msgstr "" +"Uno de los cinco estilos animales Shaolin. El Dragón utiliza movimientos " +"fluidos y golpes fuertes. La Inteligencia mejora tu precisión en lugar de la" +" Destreza. Tus ataques son para contratacar lo que desarma a tus oponentes y" +" los prepara para un potente movimiento final." #. ~ initiate message for martial art '{'str': 'Dragon Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You relax and patiently await conflict like the great dragon." -msgstr "" +msgstr "Te relajás y esperás pacientemente el conflicto como un gran dragón." #. ~ initiate message for martial art '{'str': 'Dragon Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a dragon-like stance." -msgstr "" +msgstr "%s adopta la postura del dragón." #: lang/json/martial_art_from_json.py msgid "Dragon's Flight" @@ -133065,10 +137956,15 @@ msgid "" "Enables \"Dragon Vortex Block\" and \"Dragon Wing Dodge\"\n" "Lasts 1 turn." msgstr "" +"La vida y el combate son un círculo. El ataque lleva a un contraataque y a un ataque otra vez. Buscá completar el ciclo.\n" +"\n" +"+1 a Precisión, +2 daño Golpeante.\n" +"Habilita \"Bloqueo del Dragón\" y \"Ala Esquivadora de Dragón\"\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Dragon's Knowledge" -msgstr "" +msgstr "Conocimiento de Dragón" #. ~ Description of buff 'Dragon's Knowledge' for martial art '{'str': 'Dragon #. Kung Fu'}' @@ -133080,6 +137976,10 @@ msgid "" "\n" "Accuracy increased by 25% of Intelligence but decreased by 25% of Dexterity." msgstr "" +"Planeás tu ataque con mucha anticipación confiando en tu intuición en lugar de tu velocidad para atacar.\n" +"La Inteligencia incrementa la Precisión en lugar de tu Destreza.\n" +"\n" +"La Precisión se incrementa en un 25% de la Inteligencia pero disminuye en un 25% de tu Destreza." #: lang/json/martial_art_from_json.py msgid "Eskrima" @@ -133099,17 +137999,17 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Eskrima'}' #: lang/json/martial_art_from_json.py msgid "You enter an open guard stance and prepare to strike." -msgstr "" +msgstr "Entrás en una postura de guardia abierta y te preparás para golpear." #. ~ initiate message for martial art '{'str': 'Eskrima'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s enters an open stance." -msgstr "" +msgstr "%s entra en una postura abierta." #: lang/json/martial_art_from_json.py msgid "Eskrima Stance" -msgstr "" +msgstr "Postura de Eskrima" #. ~ Description of buff 'Eskrima Stance' for martial art '{'str': 'Eskrima'}' #: lang/json/martial_art_from_json.py @@ -133118,6 +138018,30 @@ msgid "" "\n" "+2 Accuracy." msgstr "" +"Tenés habilidad para sacar lo mejor de cada arma. El término 'arma' puede ser muy subjetivo.\n" +"\n" +"+2 a Precisión." + +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "Combinación de Eskrima" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +"Podés continuar un golpe crítico con un ataque más potente si la oportunidad se presenta.\n" +"\n" +"+15% bonus a todo el daño.\n" +"Habilita la técnica \"Golpe Combinado\".\n" +"Dura 3 turnos. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Fencing" @@ -133131,21 +138055,25 @@ msgid "" "Skilled fencers can take advantage of blocks and feints to deliver accurate " "strikes." msgstr "" +"El noble arte de la esgrima se aprende con espadas flexibles de competición," +" pero las técnicas provienen de (y se aplican a) ejemplos más funcionales. " +"Los esgrimistas habilidosos pueden sacar ventaja de los bloqueos y fintas " +"para ejecutar golpes precisos." #. ~ initiate message for martial art '{'str': 'Fencing'}' #: lang/json/martial_art_from_json.py msgid "You move into the en-garde stance." -msgstr "" +msgstr "Te movés para ponerte en-garde." #. ~ initiate message for martial art '{'str': 'Fencing'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s moves into a fencing stance." -msgstr "" +msgstr "%s se mueve para adoptar la postura de esgrima." #: lang/json/martial_art_from_json.py msgid "Fencing Stance" -msgstr "" +msgstr "Postura de Esgrima" #. ~ Description of buff 'Fencing Stance' for martial art '{'str': 'Fencing'}' #: lang/json/martial_art_from_json.py @@ -133155,6 +138083,45 @@ msgid "" "\n" "Blocked damage reduced by 50% of Dexterity." msgstr "" +"Tu postura de costado minimiza las oportunidades de ser dañado en el combate.\n" +"\n" +"El daño bloqueado se reduce un 50% de tu Destreza." + +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "Parada" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" +"Tu próximo golpe encontrará la marca mucho más fácil desde el golpe que paraste.\n" +"\n" +"+1 a Precisión.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "Remise" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"¡Tu finta es la trampa perfecta para el ataque devastador que le sigue!\n" +"\n" +"+1 a Precisión.\n" +"Habilita la técnica \"Ataque Compuesto\".\n" +"Dura 1 turno." #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py @@ -133163,21 +138130,24 @@ msgid "" "\"Flower of Battle\" places great focus on countering one's opponent and " "knocking them down before landing a killing blow" msgstr "" +"Son técnicas marciales de la Europa medieval para lucha con armas de asta. " +"La \"Flor de la Batalla\" pone mucha atención en contrarrestar al oponente y" +" derribarlo antes de dar el golpe final." #. ~ initiate message for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "You hold your weapon in a firm grip, ready to block any attack." -msgstr "" +msgstr "Agarrás tu arma firmemente, preparado para bloquear cualquier ataque." #. ~ initiate message for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s grips their weapon tightly." -msgstr "" +msgstr "%s agarra su arma firmemente." #: lang/json/martial_art_from_json.py msgid "Stand Your Ground" -msgstr "" +msgstr "Mantenerse Firme" #. ~ Description of buff 'Stand Your Ground' for martial art '{'str': 'Fior Di #. Battaglia'}' @@ -133188,10 +138158,13 @@ msgid "" "\n" "+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50% of Strength." msgstr "" +"Sos recio y no te rendirás ante ninguna amenaza.\n" +"\n" +"+2 intentos de Bloqueo, -1.0 a Esquivar, daño bloqueado reducido en 50% de tu Fuerza." #: lang/json/martial_art_from_json.py msgid "Tactical Retreat" -msgstr "" +msgstr "Retirada Táctica" #. ~ Description of buff 'Tactical Retreat' for martial art '{'str': 'Fior Di #. Battaglia'}' @@ -133203,6 +138176,46 @@ msgid "" "-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50% of Strength.\n" "Lasts 1 turn." msgstr "" +"¡Te movés y anulás los efectos de Mantenerse Firme!\n" +"\n" +"-2 intentos de Bloqueo, +1.0 a Esquivar, daño bloqueado reducido en 50% de tu Fuerza.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "Romper Defensa" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"Cada bloqueo exitoso revela una oportunidad en la guardia de tu oponente.\n" +"\n" +"+1 a Precisión.\n" +"Dura 1 turno. Se acumula hasta 3 veces." + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "Finta Táctica" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" +"¡Se tragan tu finta!\n" +"\n" +"Habilita la técnica \"Enganchar y Arrastrar\".\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Judo" @@ -133215,21 +138228,25 @@ msgid "" "offensive. You are resistant to most effects that can knock you down and " "can counter grab and takedown attacks with strong judo throw." msgstr "" +"El judo es un arte marcial que se focaliza en agarradas y tiradas, tanto " +"defensivas como ofensivas. Sos resistente a la mayoría de los efectos que " +"pueden derribarte y podés contrarrestar un agarre y desarmar ataques con una" +" tirada de judo." #. ~ initiate message for martial art '{'str': 'Judo'}' #: lang/json/martial_art_from_json.py msgid "You prepare yourself for a grapple." -msgstr "" +msgstr "Te preparás para un agarre." #. ~ initiate message for martial art '{'str': 'Judo'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s prepares for a grapple." -msgstr "" +msgstr "%s se prepara para un agarre." #: lang/json/martial_art_from_json.py msgid "Judo Stance" -msgstr "" +msgstr "Postura de Judo" #. ~ Description of buff 'Judo Stance' for martial art '{'str': 'Judo'}' #: lang/json/martial_art_from_json.py @@ -133237,6 +138254,8 @@ msgid "" "Your knowledge of grappling allows you to recover from knock down effects instantly.\n" "In addition, you can counter grabs and takedown attacks with a judo throw." msgstr "" +"Tu conocimiento de los agarres te permite recuperarte de una caída instantáneamente.\n" +"Además, podés contrarrestar agarres y desarmar ataques con una tirada de judo." #: lang/json/martial_art_from_json.py msgid "Karate" @@ -133257,17 +138276,17 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Karate'}' #: lang/json/martial_art_from_json.py msgid "You adopt a classic karate stance." -msgstr "" +msgstr "Adoptás la clásica postura de karate." #. ~ initiate message for martial art '{'str': 'Karate'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s adopts a classic karate stance." -msgstr "" +msgstr "%s adopta la clásica postura de karate." #: lang/json/martial_art_from_json.py msgid "Karate Strike" -msgstr "" +msgstr "Golpe de Karate" #. ~ Description of buff 'Karate Strike' for martial art '{'str': 'Karate'}' #: lang/json/martial_art_from_json.py @@ -133278,10 +138297,14 @@ msgid "" "+2 Block attempts, +1 Dodges attempts, blocked damge reduced by 50% of Strength.\n" "Lasts 2 turns." msgstr "" +"Acertar un golpe te permite posicionarte perfectamente para una defensa máxima contra múltiples oponentes.\n" +"\n" +"+2 intentos de Bloqueo, +1 intentos de Esquivar, daño bloqueado reducido en 50% de tu Fuerza.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Karate Stance" -msgstr "" +msgstr "Postura de Karate" #. ~ Description of buff 'Karate Stance' for martial art '{'str': 'Karate'}' #: lang/json/martial_art_from_json.py @@ -133290,6 +138313,9 @@ msgid "" "\n" "+2 Accuracy." msgstr "" +"Tu seria postura te permite golpear con mayor precisión.\n" +"\n" +"+2 a Precisión." #: lang/json/martial_art_from_json.py msgid "Krav Maga" @@ -133310,17 +138336,17 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Krav Maga'}' #: lang/json/martial_art_from_json.py msgid "You assume a practical combat stance." -msgstr "" +msgstr "Asumís una postura práctica para el combate." #. ~ initiate message for martial art '{'str': 'Krav Maga'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a practical combat stance." -msgstr "" +msgstr "%s asume una postura práctica para el combate." #: lang/json/martial_art_from_json.py msgid "Krav Maga Stance" -msgstr "" +msgstr "Postura de Krav Maga" #. ~ Description of buff 'Krav Maga Stance' for martial art '{'str': 'Krav #. Maga'}' @@ -133330,6 +138356,9 @@ msgid "" "\n" "+1 Accuracy, +1 Block attempts." msgstr "" +"Tu entrenamiento hace más fácil acertar golpes y pelear contra múltiples oponentes.\n" +"\n" +"+1 a Precisión, +1 intentos de Bloqueo." #: lang/json/martial_art_from_json.py msgid "Leopard Kung Fu" @@ -133343,21 +138372,25 @@ msgid "" "than Strength. Moving increases dodge skill and accuracy further; attacking" " after moving increases damage." msgstr "" +"Uno de los cinco estilos animales Shaolin. El Leopardo se focaliza en golpes" +" rápidos, estratégicamente planeados. La Destreza determina tu daño, en " +"lugar de la Fuerza. Al moverte incrementás más tu habilidad para esquivar y " +"tu precisión; atacar después de moverte incrementa el daño." #. ~ initiate message for martial art '{'str': 'Leopard Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You prepare to pounce like a leopard." -msgstr "" +msgstr "Te preparás para saltar como un leopardo." #. ~ initiate message for martial art '{'str': 'Leopard Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a leopard-like stance." -msgstr "" +msgstr "%s adopta una postura similar a un leopardo." #: lang/json/martial_art_from_json.py msgid "Leopard's Strategy" -msgstr "" +msgstr "Estrategia del Leopardo" #. ~ Description of buff 'Leopard's Strategy' for martial art '{'str': #. 'Leopard Kung Fu'}' @@ -133369,10 +138402,14 @@ msgid "" "\n" "Bash damage increased by 75% of Dexterity but decreased by 75% of Strength." msgstr "" +"Peleás abrumando a tus oponentes con golpes rápidos que son mucho más difíciles de defender.\n" +"La Destreza incrementa el daño de cuerpo a cuerpo en lugar de la Fuerza.\n" +"\n" +"El daño Golpeante se incrementa en 75% de tu Destreza pero disminuye en un 75% de tu Fuerza." #: lang/json/martial_art_from_json.py msgid "Leopard's Agility" -msgstr "" +msgstr "Agilidad de Leopardo" #. ~ Description of buff 'Leopard's Agility' for martial art '{'str': 'Leopard #. Kung Fu'}' @@ -133382,6 +138419,9 @@ msgid "" "\n" "+1.0 Dodge skill." msgstr "" +"Igual que un gato, sos rápido, ágil y difícil de agarrar.\n" +"\n" +"+1.0 a Esquivar." #: lang/json/martial_art_from_json.py msgid "Leopard's Stalk" @@ -133397,10 +138437,15 @@ msgid "" "Enables \"Leopard's Pounce\" buff.\n" "Lasts 1 turn." msgstr "" +"Acechás orgullosamente por las sombras y te preparas para saltar con una furia imparable.\n" +"\n" +"+2 a Precisión.\n" +"Habilita la técnica \"Salto del Leopardo\".\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Leopard's Pounce" -msgstr "" +msgstr "Salto del Leopardo" #. ~ Description of buff 'Leopard's Pounce' for martial art '{'str': 'Leopard #. Kung Fu'}' @@ -133412,6 +138457,10 @@ msgid "" "+25% bonus to all damage.\n" "Lasts 1 turn." msgstr "" +"Estás preparado. ¡Atacá y reclamá tu presa!\n" +"\n" +"+25% bonus a todo el daño.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" @@ -133426,21 +138475,26 @@ msgid "" "treatise compares the Italian and German traditions of medieval combat with " "detailed step-by-step pictures." msgstr "" +"El arte de la espada larga y de la espada y escudo, previo al posterior " +"desarrollo de la esgrima. Diseñado para el combate tanto con armadura como " +"sin ella, incluye el forcejeo y también las técnicas defensivas y ofensivas " +"con la espada. Este tratado comprara las tradiciones italiana y alemana del " +"combate medieval con dibujos detallados." #. ~ initiate message for martial art '{'str': 'Medieval Swordsmanship'}' #: lang/json/martial_art_from_json.py msgid "You take on a knightly stance." -msgstr "" +msgstr "Adoptás una postura caballeresca." #. ~ initiate message for martial art '{'str': 'Medieval Swordsmanship'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s takes on a knightly stance." -msgstr "" +msgstr "%s adopta una postura caballeresca." #: lang/json/martial_art_from_json.py msgid "Swordsman's Stance" -msgstr "" +msgstr "Postura de Espadachín" #. ~ Description of buff 'Swordsman's Stance' for martial art '{'str': #. 'Medieval Swordsmanship'}' @@ -133451,6 +138505,41 @@ msgid "" "\n" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +"A través de la caballería y la vigilancia, tu defensa con una espada se ha incrementado.\n" +"\n" +"+1 intentos de Esquivar, daño bloqueado reducido en 50% de tu Fuerza." + +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "Desviación" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"¡Desviaste el ataque de tu enemigo y ahora esta vulnerable a un contrataque!\n" +"Habilita las técnicas \"Golpe de Barrido\" and \"Golpe Mortal\".\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "Asesino de Hombres" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"¡Tu poderoso ataque te da la oportunidad de terminar esta pelea ahora mismo!\n" +"Habilita la técnica \"Golpe Feroz\".\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Muay Thai" @@ -133464,21 +138553,25 @@ msgid "" " blocked damage. Blocking attacks or getting hit will increase your damage " "and blocked damage further." msgstr "" +"También conocido como el \"Arte de los 8 Miembros\", el Muay Thai es una " +"técnica de lucha popular de Tailandia que utiliza golpes poderosos. Tu " +"fuerza disminuye el daño bloqueado. Bloquear ataques o recibir golpes " +"incrementará tu daño y el daño bloqueado." #. ~ initiate message for martial art '{'str': 'Muay Thai'}' #: lang/json/martial_art_from_json.py msgid "You perform a short wai khru in honor of your teachers." -msgstr "" +msgstr "Hacés un pequeño wai khru en honor a tus maestros." #. ~ initiate message for martial art '{'str': 'Muay Thai'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s performs a short war-dance." -msgstr "" +msgstr "%s representa una pequeña danza de guerra." #: lang/json/martial_art_from_json.py msgid "Muay Thai Stance" -msgstr "" +msgstr "Postura de Muay Thai" #. ~ Description of buff 'Muay Thai Stance' for martial art '{'str': 'Muay #. Thai'}' @@ -133489,6 +138582,28 @@ msgid "" "\n" "Blocked damage decreased by 50% of Strength." msgstr "" +"La fuerza es todo en el Muay Thai y sabés cómo sacar lo mejor de la tuya.\n" +"\n" +"Daño bloqueado reducido en un 50% de tu Fuerza." + +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "Determinación" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" +"Recibir un golpe no te va a frenar. Vas a durar más que tu oponente y ganar esta pelea.\n" +"\n" +"Daño Golpeante incrementado en un 25% de tu Fuerza, daño bloqueado en un 50% de tu Fuerza.\n" +"Dura 5 turnos." #: lang/json/martial_art_from_json.py msgid "Ninjutsu" @@ -133502,21 +138617,26 @@ msgid "" " silent and does extra damage on the first attack. It also provides small " "combat bonuses every time you move." msgstr "" +"El ninjutsu es un arte marcial y un conjunto de tácticas utilizadas por los " +"ninjas en la época feudal de Japón. Se focaliza en golpes rápidos, precisos " +"y silenciosos. El ninjutsu es casi completamente silencioso y causa más daño" +" en el primer ataque. También provee pequeños bonus al combate cada vez que " +"te movés." #. ~ initiate message for martial art '{'str': 'Ninjutsu'}' #: lang/json/martial_art_from_json.py msgid "You perform a kuji-in mantra with your hands. Rin, Kai, Jin!" -msgstr "" +msgstr "Hacés un mantra kuji-in con tus manos. ¡Rin, Kai, Jin!" #. ~ initiate message for martial art '{'str': 'Ninjutsu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s performs a series of intricate hand signs." -msgstr "" +msgstr "%s hace una serie de signos intrincados con la mano." #: lang/json/martial_art_from_json.py msgid "Ninjutsu Stance" -msgstr "" +msgstr "Postura de Ninjutsu" #. ~ Description of buff 'Ninjutsu Stance' for martial art '{'str': #. 'Ninjutsu'}' @@ -133526,10 +138646,13 @@ msgid "" "\n" "Melee and unarmed attacks generate 0 noise. Moving generates 1/2 as much noise." msgstr "" +"Tu entrenamiento te permite no hacer ruido cuando atacás y menos ruido cuando te movés.\n" +"\n" +"Ataques de cuerpo a cuerpo o desarmado generan 0 ruido. Moverse genera la mitad del ruido." #: lang/json/martial_art_from_json.py msgid "Sneak Attack" -msgstr "" +msgstr "Ataque Sigiloso" #. ~ Description of buff 'Sneak Attack' for martial art '{'str': 'Ninjutsu'}' #: lang/json/martial_art_from_json.py @@ -133539,10 +138662,13 @@ msgid "" "\n" "+50% all damage." msgstr "" +"Para el verdadero shinobi, el primer golpe y el último son el mismo.\n" +"\n" +"+50% a todo el daño." #: lang/json/martial_art_from_json.py msgid "Momentum Shift" -msgstr "" +msgstr "Cambio de Impulso" #. ~ Description of buff 'Momentum Shift' for martial art '{'str': #. 'Ninjutsu'}' @@ -133554,6 +138680,46 @@ msgid "" "+1.0 Dodge skill, Accuracy increased by 20% of Dexterity.\n" "Last 1 turn." msgstr "" +"Los ninjas están entrenados para ser extremadamente ágiles y móviles.\n" +"\n" +"+1.0 habilidad Esquivar, Precisión incrementada en un 20% de tu Destreza.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "Pérdida de Sorpresa" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" +"¡Tus intenciones son reveladas! Vas a tardar unos momentos para volverte sigiloso.\n" +"\n" +"-50% a todo el daño.\n" +"Dura 3 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "Plan de Escape" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" +"Tu objetivo ha muerto. Es momento de irse y planear tu próximo ataque.\n" +"\n" +"+2 intentos de Esquivar, +10 velocidad de movimiento.\n" +"Dura 3 turnos." #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" @@ -133568,21 +138734,26 @@ msgid "" "attacking reduces dodging and damage until you pause. Pausing for a moment " "increases Dodge skill." msgstr "" +"El Niten Ichi-Ryu es una vieja escuela de combate, que transmite el estilo " +"clásico japonés en el uso de las espadas, concebido por el guerrero Miyamoto" +" Musashi. La Percepción incrementa el daño y reduce el daño bloqueado. " +"Moverse y atacar reduce la posibilidad de esquivar y el daño hasta que " +"parás. Parar por un momento incrementa tu habilidad de Esquivar." #. ~ initiate message for martial art '{'str': 'Niten Ichi-Ryu'}' #: lang/json/martial_art_from_json.py msgid "You clear your mind as you prepare yourself for combat." -msgstr "" +msgstr "Limpiás tu mente mientras te preparás para el combate." #. ~ initiate message for martial art '{'str': 'Niten Ichi-Ryu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s relaxes and prepares for combat." -msgstr "" +msgstr "%s se relaja y se prepara para el combate." #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu Stance" -msgstr "" +msgstr "Postura de Niten Ichi-Ryu" #. ~ Description of buff 'Niten Ichi-Ryu Stance' for martial art '{'str': #. 'Niten Ichi-Ryu'}' @@ -133595,10 +138766,15 @@ msgid "" "\n" "Bash and Cut armor penetration increased by 50% of Perception, blocked damage reduced by 100% of Perception." msgstr "" +"Ojos atentos cuidadosos\n" +"miden y muestran tu habilidad.\n" +"La práctica hace la perfección.\n" +"\n" +"Penetración de armadura en Golpe y Corte incrementada en un 50% de tu Percepción, daño bloqueado reducido en un 100% de tu Percepción." #: lang/json/martial_art_from_json.py msgid "Waning Moon" -msgstr "" +msgstr "Cuarto Menguante" #. ~ Description of buff 'Waning Moon' for martial art '{'str': 'Niten Ichi- #. Ryu'}' @@ -133611,10 +138787,16 @@ msgid "" "-5.0 Dodge skill.\n" "Lasts 1 turn." msgstr "" +"Ennegrecido como la oscuridad,\n" +"las pesadillas se acercan de todos lados.\n" +"¡Huí a toda costa!\n" +"\n" +"-5.0 habilidad Esquivar.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Moonlight" -msgstr "" +msgstr "Luz de Luna" #. ~ Description of buff 'Moonlight' for martial art '{'str': 'Niten Ichi- #. Ryu'}' @@ -133627,6 +138809,57 @@ msgid "" "Enables \"In-One Timing\".\n" "Lasts 1 turn." msgstr "" +"Suerte es luz,\n" +"en una noche oscura y nubosa\n" +"mientras brilla la luna\n" +"\n" +"Habilita \"En Un Tiempo\".\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "Hoja Cayendo" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"Un espada filosa corta de verdad.\n" +"Aunque, todas las cosas desaparecen al tiempo.\n" +"El control afila tus habilidades.\n" +"\n" +"-1.0 habilidad Esquivar, -1 daño Golpeante, -1 daño Cortante.\n" +"Dura 1 turno. Se acumula hasta 5 veces." + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "Quietud" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" +"El ojo de la tormenta,\n" +"un breve momento de paz,\n" +"que se va sin dejar rastro.\n" +"\n" +"+2 a Precisión, habilidad Esquivar aumentada en un 50% de tu Percepción.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Pankration" @@ -133639,21 +138872,24 @@ msgid "" "and wrestling techniques to create a brutal sport, though modern revival of " "the art is less of no-holds-barred in nature." msgstr "" +"Es un antiguo arte marcial griego usado por los espartanos. Combina técnicas" +" de boxeo y de lucha para crear un deporte brutal, aunque el estilo moderno " +"de este arte no es tan \"vale todo\" como antes." #. ~ initiate message for martial art '{'str': 'Pankration'}' #: lang/json/martial_art_from_json.py msgid "You crouch slightly and prepare to rush forward." -msgstr "" +msgstr "Te agachás un poco y te preparás para lanzarte hacia adelante." #. ~ initiate message for martial art '{'str': 'Pankration'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s crouches slightly, ready to rush forward." -msgstr "" +msgstr "%s se agacha un poco, listo para lanzarse hacia adelante." #: lang/json/martial_art_from_json.py msgid "Close Combat" -msgstr "" +msgstr "Combate Cercano" #. ~ Description of buff 'Close Combat' for martial art '{'str': #. 'Pankration'}' @@ -133665,6 +138901,10 @@ msgid "" "+20% bash damage.\n" "Lasts 1 turn." msgstr "" +"¡Tenés a tus oponentes justo donde los querías!\n" +"\n" +"+20% daño Golpeante.\n" +"Dura 1 turno." #. ~ Description of buff 'Counter Chance' for martial art '{'str': #. 'Pankration'}' @@ -133675,6 +138915,9 @@ msgid "" "+10% bash damage. Enables \"Close Combat\" buff.\n" "Lasts 1 turn." msgstr "" +"El enemigo ha mostrado una apertura en su defensa.\n" +"+10% daño Golpeante. Habilita la técnica \"Combate Cercano\" buff.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Silat" @@ -133694,13 +138937,13 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Silat'}' #: lang/json/martial_art_from_json.py msgid "You give a salute of respect as you prepare to combat." -msgstr "" +msgstr "Hacés un saludo de respeto y te preparás para el combate." #. ~ initiate message for martial art '{'str': 'Silat'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s gives a combat salute." -msgstr "" +msgstr "%s hace un saludo de combate." #: lang/json/martial_art_from_json.py msgid "Silat Stance" @@ -133713,10 +138956,13 @@ msgid "" "\n" "+1 Dodge attempts." msgstr "" +"Intentás mantenerte lo más relajado posible en la pelea para tener más oportunidades de esquivar.\n" +"\n" +"+1 intentos de Esquivar." #: lang/json/martial_art_from_json.py msgid "Silat Evasion" -msgstr "" +msgstr "Evasión de Silat" #. ~ Description of buff 'Silat Evasion' for martial art '{'str': 'Silat'}' #: lang/json/martial_art_from_json.py @@ -133726,10 +138972,14 @@ msgid "" "+1 Dodge attempts.\n" "Lasts 2 turn." msgstr "" +"Te mantenés agachado mientras te movés, haciendo difícil que tus enemigos te acorralen.\n" +"\n" +"+1 intento de Esquivar.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Silat Appraisal" -msgstr "" +msgstr "Estimación de Silat" #. ~ Description of buff 'Silat Appraisal' for martial art '{'str': 'Silat'}' #: lang/json/martial_art_from_json.py @@ -133740,6 +138990,10 @@ msgid "" "Accuracy increased by 15% of Dexterity.\n" "Lasts 2 turns. Stacks 3 times." msgstr "" +"Cada vez que esquivás un ataque, aprendés un poco más acerca del estilo de lucha de tu oponente. Esto permite que puedas realizar ataques más precisos.\n" +"\n" +"Precisión incrementada en un 15% de tu Destreza.\n" +"Dura 2 turnos. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Snake Kung Fu" @@ -133753,21 +139007,25 @@ msgid "" " than Dexterity. Standing still will increases your accuracy and damage of " "your next attack." msgstr "" +"Uno de los cinco estilos animales Shaolin. La Serpiente se focaliza en " +"movimientos sinuosos y golpes precisos. La Percepción determina tu Precisión" +" en lugar de la Destreza. Al quedarte quieto incrementás tu precisión y daño" +" en tu próximo ataque." #. ~ initiate message for martial art '{'str': 'Snake Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You adopt a fluid stance, ready to strike like a snake." -msgstr "" +msgstr "Adoptás una postura fluida, listo para atacar como una serpiente." #. ~ initiate message for martial art '{'str': 'Snake Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a snake-like stance." -msgstr "" +msgstr "%s adopta una postura como una serpiente." #: lang/json/martial_art_from_json.py msgid "Snake's Sight" -msgstr "" +msgstr "Vista de Serpiente" #. ~ Description of buff 'Snake's Sight' for martial art '{'str': 'Snake Kung #. Fu'}' @@ -133778,6 +139036,28 @@ msgid "" "\n" "Perception increases Accuracy instead of Dexterity. Accuracy increased by 25% of Perception but decreased by 25% of Dexterity." msgstr "" +"Sos paciente y sabés dónde golpear a tu oponente para tener mejores resultados.\n" +"\n" +"La Percepción incrementa la Precisión en lugar de la Destreza. Precisión incrementada en un 25% de tu Percepción pero disminuida en un 25% de tu Destreza." + +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "Bucle de Serpiente" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"Cada serpiente espera el momento perfecto para atacar. ¡Apuntás mientras tus oponentes se preparan y atacás sus debilidades sin piedad!\n" +"\n" +"+1 Precisión, mejora penetración de armadura igual al 50% de tu Percepción.\n" +"Dura 1 turno. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Sōjutsu" @@ -133791,17 +139071,21 @@ msgid "" "to maintain advantage in combat. Standing still gives you an extra block " "attempt but moving will briefly increase your damage." msgstr "" +"Sōjutsu, \"El Camino de la Lanza\", es el arte marcial japonés de luchar con" +" una lanza. El Sōjutsu se enfoca en mantener a los oponentes a la distancia " +"necesaria para mantener la ventaja en el combate. Quedarte quieto te da un " +"intento de bloqueo más pero moverte incremente brevemente tu daño." #. ~ initiate message for martial art '{'str': 'Sōjutsu'}' #: lang/json/martial_art_from_json.py msgid "You prepare to defend against all that approach you." -msgstr "" +msgstr "Te preparás para defenderte contra los que se aproximan." #. ~ initiate message for martial art '{'str': 'Sōjutsu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a wide, defensive stance." -msgstr "" +msgstr "%s adopta una postura amplia y defensiva." #: lang/json/martial_art_from_json.py msgid "Sōjutsu Stance" @@ -133814,10 +139098,13 @@ msgid "" "\n" "+1 Block attempt." msgstr "" +"Tu entrenamiento de otorga una mejor defensa cuando usás un arma de asta.\n" +"\n" +"+1 intentos de Bloqueo." #: lang/json/martial_art_from_json.py msgid "Superior Positioning" -msgstr "" +msgstr "Posicionamiento Superior" #. ~ Description of buff 'Superior Positioning' for martial art '{'str': #. 'Sōjutsu'}' @@ -133829,6 +139116,10 @@ msgid "" "+10% damage, -1 Block attempts.\n" "Lasts 1 turn." msgstr "" +"Abandonás tus defensas por un momento para incrementar el daño de tus ataques.\n" +"\n" +"+10% al daño, -1 intentos de Bloqueo.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Taekwondo" @@ -133843,20 +139134,25 @@ msgid "" "extra damage and your attacks do more damage if you are not holding " "anything." msgstr "" +"El taekwondo es el deporte nacional de Corea, y fue utilizado por el " +"ejército coreano en el siglo XX. Se enfoca en usar patadas así que no se " +"beneficia por empuñar armas. También incluye entrenamiento de fuerza; tus " +"bloqueos absorben daño y tus ataques hacen más daño si no estás empuñando " +"nada." #. ~ initiate message for martial art '{'str': 'Taekwondo'}' #: lang/json/martial_art_from_json.py msgid "You adopt a narrow fighting stance." -msgstr "" +msgstr "Adoptás una postura reducida de lucha." #. ~ initiate message for martial art '{'str': 'Taekwondo'}' #: lang/json/martial_art_from_json.py msgid "You adopts a narrow fighting stance." -msgstr "" +msgstr "adopta una postura reducida de lucha." #: lang/json/martial_art_from_json.py msgid "Taekwondo Stance" -msgstr "" +msgstr "Postura de Taekwondo" #. ~ Description of buff 'Taekwondo Stance' for martial art '{'str': #. 'Taekwondo'}' @@ -133867,10 +139163,13 @@ msgid "" "\n" "Blocked damage decreased by 50% of Strength." msgstr "" +"Usando tus piernas para atacar te permite tener las manos libres para una mejor defensa.\n" +"\n" +"El daño bloqueado reducido en un 50% de tu Fuerza." #: lang/json/martial_art_from_json.py msgid "Unhindered" -msgstr "" +msgstr "Sin Obstáculos" #. ~ Description of buff 'Unhindered' for martial art '{'str': 'Taekwondo'}' #: lang/json/martial_art_from_json.py @@ -133880,6 +139179,9 @@ msgid "" "\n" "+33% bash damage when not using a weapon." msgstr "" +"Tus ataques son más fuertes si no tenés nada en las manos.\n" +"\n" +"+33% daño Golpeante cuando no usás un arma." #: lang/json/martial_art_from_json.py msgid "Tai Chi" @@ -133893,21 +139195,26 @@ msgid "" " the force of an attack makes your Perception decrease damage further on a " "block. Pausing for a moment enables powerful palm strike techniques." msgstr "" +"Aunque el Tai Chi es visto a menudo como un ejercicio físico y mental, es un" +" legítimo arte marcial focalizado en la defensa propia. Su capacidad de " +"absorber la fuerza de un ataque hace que tu Percepción disminuya el daño en " +"un bloqueo. Frenar por un momento te permite técnicas poderosas de golpe de " +"palma." #. ~ initiate message for martial art '{'str': 'Tai Chi'}' #: lang/json/martial_art_from_json.py msgid "You settle into a gentle stance and prepare to defend yourself." -msgstr "" +msgstr "Establecés una postura gentil y te preparás para defenderte." #. ~ initiate message for martial art '{'str': 'Tai Chi'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s settles into a gentle stance." -msgstr "" +msgstr "%s establece una postura gentil." #: lang/json/martial_art_from_json.py msgid "Tai Chi Stance" -msgstr "" +msgstr "Postura de Tai Chi" #. ~ Description of buff 'Tai Chi Stance' for martial art '{'str': 'Tai Chi'}' #: lang/json/martial_art_from_json.py @@ -133917,10 +139224,13 @@ msgid "" "\n" "+1 Block attempts, blocked damage reduced by 100% Perception." msgstr "" +"Te enfocás en la defensa y predecís los ataques de tus oponentes.\n" +"\n" +"+1 intentos de Bloqueo, daño bloqueado reducido en un 100% de tu Percepción." #: lang/json/martial_art_from_json.py msgid "Repulse the Monkey" -msgstr "" +msgstr "Repeler el Mono" #. ~ Description of buff 'Repulse the Monkey' for martial art '{'str': 'Tai #. Chi'}' @@ -133932,6 +139242,30 @@ msgid "" "Accuracy increased by 20% of Perception, gain bash Armor Penetration equal to 50% of Perception.\n" "Lasts 2 turns." msgstr "" +"Al perfeccionar tu posicionamiento y el de tu oponente, te has vuelto más preciso y podés evadir la defensa de tu oponente.\n" +"\n" +"Precisión incrementada en un 20% de tu Percepción, recibís penetración de armadura por golpe igual al 50% de tu Percepción.\n" +"Dura 2 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "Manos Cruzadas" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" +"Al tomarte un tiempo para prepararte, podés usar tu cuerpo entero para atacar y defender.\n" +"\n" +"+1.0 habilidad Esquivar, daño bloqueado reducido en un 50% de tu Percepción.\n" +"Habilita las técnicas \"Golpe de Palma\" and \"Doble Golpe de Palma\".\n" +"Dura 3 turnos." #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" @@ -133951,13 +139285,13 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Tiger Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You clench your hands into ferocious, tiger-like claws." -msgstr "" +msgstr "Tensás tus manos en una forma parecida a garras feroces de tigre." #. ~ initiate message for martial art '{'str': 'Tiger Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a tiger-like stance." -msgstr "" +msgstr "%s adopta una postura similar a un tigre." #: lang/json/martial_art_from_json.py msgid "Tiger Fury" @@ -133973,10 +139307,14 @@ msgid "" "+10% damage.\n" "Lasts 3 turns. Stacks 4 times." msgstr "" +"Atacás con una descarga incesante de golpes. Cuanto más golpeás, más fuerte te volvés.\n" +"\n" +"+10% al daño.\n" +"Dura 3 turnos. Se acumula hasta 4 veces." #: lang/json/martial_art_from_json.py msgid "Tiger's Strength" -msgstr "" +msgstr "Fuerza de Tigre" #. ~ Description of buff 'Tiger's Strength' for martial art '{'str': 'Tiger #. Kung Fu'}' @@ -133988,10 +139326,33 @@ msgid "" "\n" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +"No necesitás defensa. No necesitás tener un plan. Necesitás fuerza. La fuerza romperá la defensa de tus oponentes y los abrumará.\n" +"Tu Fuerza incrementa la Precisión en lugar de la Destreza.\n" +"\n" +"Precisión incrementada en un 25% de tu Fuerza pero disminuida en un 25% de tu Destreza." + +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "Violencia de Tigre" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" +"La pérdida de tu oponente es tu ganancia. Tu próximo ataque romperá la guardia de tu oponente.\n" +"\n" +"Recibís penetración de armadura igual al 50% de tu Fuerza.\n" +"Dura 1 turno. Se acumula hasta 2 veces." #: lang/json/martial_art_from_json.py msgid "Wing Chun" -msgstr "" +msgstr "Wing Chun" #. ~ Description for martial art '{'str': 'Wing Chun'}' #: lang/json/martial_art_from_json.py @@ -134002,21 +139363,27 @@ msgid "" "sensitivity to the opponent's direction of force, and flowing around it to " "get back to hitting." msgstr "" +"El Wing Chun es un arte marcial chino que comienza seleccionando las " +"técnicas efectivas más fáciles de aprender de varias formas animales " +"Shaolin. Tiene una postura alta con el peso completamente en la pierna " +"trasera. Wing Chun se focaliza en la sensibilidad de la dirección de fuerza " +"del oponente, y seguirlo para volver a golpear." #. ~ initiate message for martial art '{'str': 'Wing Chun'}' #: lang/json/martial_art_from_json.py msgid "You take your stance and prepare to receive the gift of violence." msgstr "" +"Adoptás tu postura y te preparás para recibir el regalo de la violencia." #. ~ initiate message for martial art '{'str': 'Wing Chun'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s patiently assumes a curiously pigeon-toed stance." -msgstr "" +msgstr "%s adopta pacientemente una postura curiosamente como una paloma." #: lang/json/martial_art_from_json.py msgid "Chain Punch" -msgstr "" +msgstr "Piña en Cadena" #. ~ Description of buff 'Chain Punch' for martial art '{'str': 'Wing Chun'}' #: lang/json/martial_art_from_json.py @@ -134027,10 +139394,14 @@ msgid "" "-10% move cost.\n" "Lasts 1 turn. Stacks 3 times." msgstr "" +"Tus trompadas tienen el ritmo apropiado para no darle a tu oponente ningún descanso de tus golpes.\n" +"\n" +"-10% al costo de movimiento.\n" +"Dura 1 turno. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Chi-Sao Sensitivity" -msgstr "" +msgstr "Sensibilidad Chi-Sao" #. ~ Description of buff 'Chi-Sao Sensitivity' for martial art '{'str': 'Wing #. Chun'}' @@ -134041,6 +139412,27 @@ msgid "" "\n" " Dodging Skill increased by 15% of Perception. Blocked damage reduced by 50% of Perception." msgstr "" +"Tenés una mayor comprensión del balance y la técnica. Esto te da mejor oportunidad de esquivar los ataques de tu oponente.\n" +"\n" +"Habilidad de Esquivar incrementada en un 15% de tu Percepción. Daño bloqueado reducido en un 50% de tu Percepción." + +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "Biu Ji" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" +"A través de la perfecta aplicación de la forma de Dedos Empujantes podés golpear los puntos débiles de tus oponentes, forzándolos a alejarse ¡y seguir!\n" +"\n" +"Precisión incrementada en un 20% de tu Percepción, Activa las técnicas \"Golpe Recto (Empujar)\" y \"Gancho (Empujar)\".\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Zui Quan" @@ -134055,21 +139447,26 @@ msgid "" " dodge, you inflict more damage with your counterattack for until the end of" " your next turn." msgstr "" +"También conocido como \"boxeo de borracho\", Zui Quan imita el movimiento de" +" un borracho para confundir al enemigo. Recibís un bonus pasivo a esquivar y" +" a la precisión basados en tu inteligencia. El movimiento te da un intento " +"adicional de esquivar y cada vez que esquivás un golpe, inflingís más daño " +"en tu contrataque hasta que termine tu próximo turno." #. ~ initiate message for martial art '{'str': 'Zui Quan'}' #: lang/json/martial_art_from_json.py msgid "You begin to sway to and fro with a confident swagger." -msgstr "" +msgstr "Empezás a moverte hacia adelante y atrás un poco canchereando." #. ~ initiate message for martial art '{'str': 'Zui Quan'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s stumbles as if pretending to be drunk." -msgstr "" +msgstr "%s se tropieza como si estuviera borracho." #: lang/json/martial_art_from_json.py msgid "Zui Quan Stance" -msgstr "" +msgstr "Postura de Zui Quan" #. ~ Description of buff 'Zui Quan Stance' for martial art '{'str': 'Zui #. Quan'}' @@ -134080,10 +139477,13 @@ msgid "" "\n" "Dodging Skill increased by 15% of Intelligence." msgstr "" +"Los otros pueden pensar que tus tropiezos son aleatorios pero vos sabés lo que hacés. Cada movimiento está calculado para evadir el daño de mejor manera.\n" +"\n" +"Habilidad de Esquivar incrementado en un 15% de tu Inteligencia." #: lang/json/martial_art_from_json.py msgid "Advanced Zui Quan" -msgstr "" +msgstr "Zui Quan Avanzado" #. ~ Description of buff 'Advanced Zui Quan' for martial art '{'str': 'Zui #. Quan'}' @@ -134094,10 +139494,13 @@ msgid "" "\n" "+1 Dodge attempts, Accuracy increased by 15% of Intelligence." msgstr "" +"Tenés una mayor comprensión del Zui Quan. Tus habilidades para esquivar y acertar goles es mucho mejor.\n" +"\n" +"+1 intentos de Esquivar. Precisión incrementado en un 15% de tu Inteligencia." #: lang/json/martial_art_from_json.py msgid "Drunken Stumble" -msgstr "" +msgstr "Tropiezo de Borracho" #. ~ Description of buff 'Drunken Stumble' for martial art '{'str': 'Zui #. Quan'}' @@ -134108,10 +139511,14 @@ msgid "" "+2 Dodge attempts.\n" "Lasts 3 turns." msgstr "" +"Con unos pocos pasos rápidos, cambiás completamente tu orientación y esquivás ataques adicionales.\n" +"\n" +"+2 intentos de Esquivar.\n" +"Dura 3 turnos." #: lang/json/martial_art_from_json.py msgid "Drunken Dodging" -msgstr "" +msgstr "Esquive Borracho" #. ~ Description of buff 'Drunken Dodging' for martial art '{'str': 'Zui #. Quan'}' @@ -134123,6 +139530,10 @@ msgid "" "Gain Armor Penetration equal to 25% of Intelligence.\n" "Lasts 1 turn. Stacks 4 times." msgstr "" +"Cada vez que esquivás, tu ventaja posicional incrementa contra tus oponentes. Esto hace que tus ataques golpeen más fuerte con cada esquive exitoso.\n" +"\n" +"Recibís penetración de armadura igual al 25% de tu Inteligencia.\n" +"Dura 1 turno. Se acumula hasta 4 veces." #: lang/json/martial_art_from_json.py msgid "Debug Mastery" @@ -134138,13 +139549,13 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Debug Mastery'}' #: lang/json/martial_art_from_json.py msgid "You get ready pwn some zeds!" -msgstr "" +msgstr "¡Te preparás para golpear algunos zombis!" #. ~ initiate message for martial art '{'str': 'Debug Mastery'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s prepares to cheat at martial arts!" -msgstr "" +msgstr "%s se prepara para hacer trampa con las artes marciales!" #: lang/json/martial_art_from_json.py msgid "Elemental resistance" @@ -134161,6 +139572,38 @@ msgstr "" "+Inteligencia armadura contra electricidad, +Percepción armadura contra " "fuego." +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "Enojándose" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" +"Cuando te ponga las manos encima… +2 al daño Golpeante durante 2 turnos. Se" +" acumula hasta 5 veces." + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "Rayo Golpeante" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" +"El rayo golpea dos veces. + Percepción del daño eléctrico por 3 turnos. Se " +"acumula hasta 2 veces." + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "¡ESTÁS EN LLAMAS! +5 al daño de fuego por 5 turnos." + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "Combativo Biónico" @@ -134172,21 +139615,24 @@ msgid "" "Bionic Combatives combines integrated weaponry, armor and augments into an " "consolidated fighting discipline." msgstr "" +"Es un estilo de combate moderno para el humano post-moderno. Se lo apoda " +"\"Biojutsu\", el Combativo Biónico combina armamento, armadura y mejoras " +"integradas, en una disciplina de combate consolidada." #. ~ initiate message for martial art '{'str': 'Bionic Combatives'}' #: lang/json/martial_art_from_json.py msgid "BEGINNING BIONIC COMBATIVES PROGRAM. INITIATING COMBAT PROTOCOLS." -msgstr "" +msgstr "INICIAR PROGRAMA COMBATIVO BIÓNICO. INICIAR PROTOCOLOS DE COMBATE." #. ~ initiate message for martial art '{'str': 'Bionic Combatives'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s starts moving with swift robotic precision." -msgstr "" +msgstr "%s comienza a moverse con precisión robótica." #: lang/json/martial_art_from_json.py msgid "Biojutsu Stance" -msgstr "" +msgstr "Postura de Biojutsu" #. ~ Description of buff 'Biojutsu Stance' for martial art '{'str': 'Bionic #. Combatives'}' @@ -134199,6 +139645,34 @@ msgid "" "\n" "+2 Blocks attempts, +1 Accuracy." msgstr "" +"void player::ApplyBiojutsuStatic() {\n" +" blocks_left += 2;\n" +" set_hit_bonus( get_hit_bonus() + 1 );\n" +"}\n" +"\n" +"+2 intentos de Bloqueo, +1 Precisión." + +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "Optimización" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +">10 LOCALIZAR OBJETIVO\n" +">20 EJECUTAR OBJETIVO\n" +">30 GOTO 10\n" +"\n" +"+1 Precisión, +2 a todo el daño.\n" +"Dura 3 turnos. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" @@ -134211,21 +139685,25 @@ msgid "" " an onslaught of rapid strikes. Each attack you land increases your attack " "speed. Critical hits increase your damage further." msgstr "" +"Es uno de los Cinco Venenos Mortales, usado por Zhang Yiaoatian. El estilo " +"del Ciempiés usa arremetidas de golpes rápidos. Cada ataque exitoso que " +"hacés incrementa tu velocidad de ataque. Los golpes críticos incrementan más" +" tu daño." #. ~ initiate message for martial art '{'str': 'Centipede Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You ready yourself to attack as fast as possible." -msgstr "" +msgstr "Te preparás para atacar lo más rápido posible." #. ~ initiate message for martial art '{'str': 'Centipede Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a centipede-like stance." -msgstr "" +msgstr "%s adopta una postura similar a un ciempiés." #: lang/json/martial_art_from_json.py msgid "Centipede's Frenzy" -msgstr "" +msgstr "Frenesí de Ciempiés" #. ~ Description of buff 'Centipede's Frenzy' for martial art '{'str': #. 'Centipede Kung Fu'}' @@ -134236,6 +139714,28 @@ msgid "" "-4 move cost.\n" "Lasts 3 turns. Stacks 4 times." msgstr "" +"Tus ataques son un borrón de manos y piernas que se vuelve más rápido a medida que golpeás a tu oponente sin descanso.\n" +"\n" +"-4 al costo de movimiento.\n" +"Dura 3 turnos. Se acumula hasta 4 veces." + +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "Veneno de Ciempiés" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" +"Tu veneno quema a tus oponentes de la peor manera.\n" +"\n" +"+2 al daño Golpeante.\n" +"Dura 2 turnos." #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" @@ -134249,21 +139749,26 @@ msgid "" "bonus to Dodge skill and moving near a wall gives a large bonus to accuracy." " Stronger techniques are enabled when near a wall." msgstr "" +"Es uno de los Cinco Venenos Mortales, usado por Meng Tianxia. El Estilo del " +"Lagarto se focaliza en usar las paredes como tu ventaja. Al pararte cerca de" +" una pared tenés un gran bonus a tu habilidad para Esquivar, y moverte cerca" +" de una pared te da un gran bonus a la precisión. Las técnicas más fuertes " +"son activadas cerca de una pared." #. ~ initiate message for martial art '{'str': 'Lizard Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You ready yourself to attack from any angle." -msgstr "" +msgstr "Te preparás para atacar desde cualquier ángulo." #. ~ initiate message for martial art '{'str': 'Lizard Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a lizard-like stance." -msgstr "" +msgstr "%s adopta una postura similar a un lagarto." #: lang/json/martial_art_from_json.py msgid "Lizard's Venom" -msgstr "" +msgstr "Veneno de Lagarto" #. ~ Description of buff 'Lizard's Venom' for martial art '{'str': 'Lizard #. Kung Fu'}' @@ -134274,10 +139779,14 @@ msgid "" "+2 bash damage.\n" "Lasts 4 turns." msgstr "" +"Tu veneno causa un dolor duradero que tus oponentes nunca olvidarán.\n" +"\n" +"+2 al daño Golpeante.\n" +"Dura 4 turnos." #: lang/json/martial_art_from_json.py msgid "Lizard's Cunning" -msgstr "" +msgstr "Astucia de Lagarto" #. ~ Description of buff 'Lizard's Cunning' for martial art '{'str': 'Lizard #. Kung Fu'}' @@ -134288,10 +139797,14 @@ msgid "" "+3.0 Dodge skill when near a wall.\n" "Enables \"Lizard Tail\" and \"Lizard Wall Counter\" techniques when near a wall." msgstr "" +"Al escalar, saltar o empujarte contra una pared brevemente, podés evitar la mayoría de los ataques de tus oponentes.\n" +"\n" +"+3.0 habilidad Esquivar cuando estás cerca de una pared.\n" +"Habilita las técnicas \"Cola de Lagarto\" y \"Contrataque de Pared de Lagarto\" cuando estás cerca de una pared." #: lang/json/martial_art_from_json.py msgid "Lizard's Leap" -msgstr "" +msgstr "Salto de Lagarto" #. ~ Description of buff 'Lizard's Leap' for martial art '{'str': 'Lizard Kung #. Fu'}' @@ -134302,6 +139815,10 @@ msgid "" "+3 Accuracy when near a wall.\n" "Lasts 3 turns." msgstr "" +"Al escalar, saltar o empujarte contra una pared, podés atacar hacia abajo a los oponentes distraídos.\n" +"\n" +"+3 Precisión cuando estás cerca de una pared.\n" +"Dura 3 turnos." #: lang/json/martial_art_from_json.py msgid "Scorpion Kung Fu" @@ -134315,21 +139832,26 @@ msgid "" "enables a stunning pincer attack. Critical hits do massive damage and knock" " your opponent back along with anyone your opponent comes in contact with." msgstr "" +"Uno de los Cinco Venenos Mortales, usado por Gao Ji. El estilo del Escorpión" +" es un arte misterioso en el que se utiliza las manos como pinzas y una " +"patada de aguijón. Al moverte activás una patada de pinza aturdidora. Los " +"golpes críticos causan un daño masivo y empujan al enemigo y a todos con " +"quienes entre en contacto." #. ~ initiate message for martial art '{'str': 'Scorpion Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You prepare to capture and sting your foes." -msgstr "" +msgstr "Te preparás para capturar y picar a tus oponentes." #. ~ initiate message for martial art '{'str': 'Scorpion Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a scorpion-like stance." -msgstr "" +msgstr "%s adopta una postura similar a un escorpión." #: lang/json/martial_art_from_json.py msgid "Scorpion's Venom" -msgstr "" +msgstr "Veneno de Escorpión" #. ~ Description of buff 'Scorpion's Venom' for martial art '{'str': 'Scorpion #. Kung Fu'}' @@ -134339,10 +139861,13 @@ msgid "" "\n" "+2 bashing damage." msgstr "" +"Tu veneno es una amenaza constante de la que nadie podrá escapar.\n" +"\n" +"+2 daño Golpeante." #: lang/json/martial_art_from_json.py msgid "Scorpion's Charge" -msgstr "" +msgstr "Carga de Escorpión" #. ~ Description of buff 'Scorpion's Charge' for martial art '{'str': #. 'Scorpion Kung Fu'}' @@ -134355,6 +139880,29 @@ msgid "" "Enables \"Pincer Strike\" technique.\n" "Stacks 2 times. Lasts 2 turns." msgstr "" +"¡Lanzate y atrapá a tu presa!\n" +"\n" +"+10% al daño.\n" +"Habilita la técnica \"Golpe de Pinza\".\n" +"Dura 2 turnos. Se acumula hasta 2 veces." + +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "Intimidación de Esorpión" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" +"Nada causa más miedo que un escorpión enojado. Tus ataques pueden mantener a distancia a los demás.\n" +"\n" +"+1 intento de Esquivar.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" @@ -134368,17 +139916,22 @@ msgid "" "armor against physical attacks, though you will lose focus when you move. " "You can meditate by pausing, giving yourself more armor for a short time." msgstr "" +"Uno de los Cinco Venenos Mortales, usado por Liang Shen. Los maestros del " +"Estilo del Sapo pueden enfocarse para protegerse contra todos los ataques. " +"Tenés una armadura poderosa contra los ataques físicos, aunque vas a perder " +"enfoque cuando te movés. Podés meditar al quedarte quieto, dándote más " +"armadura por un breve tiempo." #. ~ initiate message for martial art '{'str': 'Toad Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You pause for a moment and focus on your invincible body." -msgstr "" +msgstr "Frenás por un momento y te enfocás en tu invencible cuerpo." #. ~ initiate message for martial art '{'str': 'Toad Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a toad-like stance." -msgstr "" +msgstr "%s adopta una postura similar a una rana." #: lang/json/martial_art_from_json.py msgid "Toad's Iron Skin" @@ -134392,6 +139945,9 @@ msgid "" "\n" "+6 bash, cut, and stab armor." msgstr "" +"Tue cuerpo es tan fuerte como el hierro pero solo si no te movés.\n" +"\n" +"+6 a la armadura contra daño golpeante, cortante y punzante." #: lang/json/martial_art_from_json.py msgid "Iron Skin Dissipation" @@ -134406,6 +139962,46 @@ msgid "" "-1 bash, cut, and stab armor.\n" "Lasts 6 turns. Stacks 6 times." msgstr "" +"Moverte causa que pierdas tu piel de hierro.\n" +"\n" +"-1 a la armadura contra daño golpeante, cortante y punzante.\n" +"Dura 6 turnos. Se acumula hasta 6 veces." + +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "Meditación de Rana" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" +"Al concentrarte por un momento, podés reafirmar la fuerza de tu piel de hierro.\n" +"\n" +"+3 a la armadura contra daño golpeante, cortante y punzante.\n" +"Dura 2 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "Veneno de Rana" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" +"Tu veneno es solamente otra lección acerca de la fuerza de tu cuerpo de hierro.\n" +"\n" +"+2 al daño Golpeante.\n" +"Dura 5 turnos." #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" @@ -134419,21 +140015,25 @@ msgid "" "dodge, then follows up with a stunning Viper Bite and then finishes with the" " legendary Viper Strike." msgstr "" +"Un heredero de los Cinco Venenos Mortales, usado por Qi Dong. El Estilo de " +"la Víbora (llamado originalmente Estilo de la Serpiente) tiene un combo " +"único de tres partes, que comienza con esquivar un golpe, luego una " +"aturdidora Mordura de Víbora y termina con el legendario Golpe de Víbora." #. ~ initiate message for martial art '{'str': 'Viper Kung Fu'}' #: lang/json/martial_art_from_json.py msgid "You prepare to strike your foes' weaknesses." -msgstr "" +msgstr "Preparás para atacar las debilidades de tus enemigos." #. ~ initiate message for martial art '{'str': 'Viper Kung Fu'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes a viper-like stance." -msgstr "" +msgstr "%s adopta una postura similar a una víbora." #: lang/json/martial_art_from_json.py msgid "Viper's Patience" -msgstr "" +msgstr "Paciencia de Víbora" #. ~ Description of buff 'Viper's Patience' for martial art '{'str': 'Viper #. Kung Fu'}' @@ -134443,10 +140043,13 @@ msgid "" "\n" "+1.0 Dodge skill." msgstr "" +"Cada serpiente espera el momento perfecto para golpear. ¡Convertí los errores de tus oponentes en tu oportunidad para golpear!\n" +"\n" +"+1.0 habilidad de Esquivar." #: lang/json/martial_art_from_json.py msgid "Viper's Ambush" -msgstr "" +msgstr "Emboscada de Víbora" #. ~ Description of buff 'Viper's Ambush' for martial art '{'str': 'Viper Kung #. Fu'}' @@ -134457,10 +140060,14 @@ msgid "" "Enables \"Viper Bite\" technique.\n" "Lasts 1 turn." msgstr "" +"Tu evasión ha dejado a tu oponente disponible para una poderosa mordedura.\n" +"\n" +"Habilita la técnica \"Mordedura de Víbora\".\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Viper's Venom" -msgstr "" +msgstr "Veneno de Víbora" #. ~ Description of buff 'Viper's Venom' for martial art '{'str': 'Viper Kung #. Fu'}' @@ -134471,14 +140078,18 @@ msgid "" "+2 bash damage.\n" "Lasts 3 turn." msgstr "" +"Tu veneno es un duro recordatorio de nunca molestar a un depredador.\n" +"\n" +"+2 daño Golpeante.\n" +"Dura 3 turnos." #: lang/json/martial_art_from_json.py msgid "Sojutsu" -msgstr "" +msgstr "Sojutsu" #: lang/json/martial_art_from_json.py msgid "CRIT Blade-work" -msgstr "" +msgstr "CRIT de Manejo de Cuchilla" #. ~ Description for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134486,11 +140097,13 @@ msgid "" "An offensive style centered around rapid slashes and prodding. Each attack " "landed increases combat ability but leaves you increasingly vunerable" msgstr "" +"Es un estilo ofensivo centrado en los golpes rápidos y punzantes. Cada " +"ataque acertado incrementa la habilidad de combate pero te deja vulnerable." #. ~ initiate message for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py msgid "You prepare to whittle down your enemies." -msgstr "" +msgstr "Te preparás para reducir a tus enemigos." #. ~ initiate message for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134500,7 +140113,7 @@ msgstr "%s inicia el manejo de cuchilla." #: lang/json/martial_art_from_json.py msgid "Unwavering Edge" -msgstr "" +msgstr "Filo Firme" #. ~ Description of buff 'Unwavering Edge' for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134508,10 +140121,13 @@ msgid "" "Gain minor Accuracy, Cutting and Stabbing Arpen per stack. Greatly reduces " "dodge skill. 2 stacks max" msgstr "" +"Recibís un poco de Precisión, penetración de armadura contra daño Cortante y" +" Punzante por vez. Reduce mucho la habilidad de Esquivar. Se acumula hasta 2" +" veces." #: lang/json/martial_art_from_json.py msgid "Ruthlessness" -msgstr "" +msgstr "Impiedad" #. ~ Description of buff 'Ruthlessness' for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134519,10 +140135,12 @@ msgid "" "Additional Stabbing and Cutting damage per stack. Reduces dodge attempts. 4" " stacks max." msgstr "" +"Daño Punzante y Cortante adicionales por vez. Reduce los intentos de " +"Esquivar. Se acumula hasta 4 veces." #: lang/json/martial_art_from_json.py msgid "Rending Strikes" -msgstr "" +msgstr "Golpes Desgarradores" #. ~ Description of buff 'Rending Strikes' for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134530,10 +140148,12 @@ msgid "" "Additional Armor penetration per stack. Further reduces dodge attempts. 3 " "stacks max." msgstr "" +"Penetración de armadura adicional por vez. Reduce más los intentos de " +"Esquivar. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Calculating Eyes" -msgstr "" +msgstr "Ojos Calculadores" #. ~ Description of buff 'Calculating Eyes' for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134542,10 +140162,13 @@ msgid "" "weaponry. Gain great Cutting and Stabbing Armor Penetration on top of minor " "Accuracy" msgstr "" +"Te han enseñado a utilizar apropiadamente armas de filo pequeñas o medianas." +" Recibís mucha penetración de armadura Cortante y Punzante y un poco de " +"Precisión." #: lang/json/martial_art_from_json.py msgid "Honed Movements" -msgstr "" +msgstr "Movimientos Pulidos" #. ~ Description of buff 'Honed Movements' for martial art 'CRIT Blade-work' #: lang/json/martial_art_from_json.py @@ -134553,10 +140176,12 @@ msgid "" "Your skill and handling with sharp weaponry has improved. Gain extra Cutting" " and Stabbing damage." msgstr "" +"Tu habilidad y manejo de las armas con filo ha mejorado. Ganás más daño " +"Cortante y Punzante." #: lang/json/martial_art_from_json.py msgid "C.R.I.T Enforcement" -msgstr "" +msgstr "C.R.I.T. de Ejecución" #. ~ Description for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py @@ -134565,30 +140190,34 @@ msgid "" "grounding enemies. Each attack landed increases your armor by 0.125 and " "offers other combat bonuses based on stats." msgstr "" +"Es un estilo defensivo centrado en golpes aturdidores, empujes y derribar " +"enemigos. Cada ataque acertado incrementa tu armadura en 0.125 y ofrece " +"otros bonus al combate basado en estadísticas." #. ~ initiate message for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py msgid "You ready yourself to stand your ground." -msgstr "" +msgstr "Te preparás para mantenerte firme." #. ~ initiate message for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py #, python-format msgid "%s draws a line in the sand." -msgstr "" +msgstr "%s dibuja una línea en la arena." #: lang/json/martial_art_from_json.py msgid "Bulwark" -msgstr "" +msgstr "Baluarte" #. ~ Description of buff 'Bulwark' for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py msgid "+0.5 armor and other small bonuses per stack. Max of 2 stacks" msgstr "" +"+0.5 en armadura y otros pequeños bonus por vez. Se acumula hasta 2 veces." #: lang/json/martial_art_from_json.py msgid "Unyielding Front" -msgstr "" +msgstr "Frente Inflexible" #. ~ Description of buff 'Unyielding Front' for martial art 'C.R.I.T #. Enforcement' @@ -134597,10 +140226,12 @@ msgid "" "Stand strong in the face of adversity. +1 armor. STR provides accuracy and " "minor bash arpen." msgstr "" +"Mantenete fuerte ante la adversidad. +1 de armadura. La Fuerza brinda " +"Precisión y un poco de penetración de armadura contra golpes." #: lang/json/martial_art_from_json.py msgid "CRIT CQB" -msgstr "" +msgstr "CRIT de Pelea en Espacios Cerrados" #. ~ Description for martial art 'CRIT CQB' #: lang/json/martial_art_from_json.py @@ -134608,31 +140239,35 @@ msgid "" "A style centered around rapid strikes and piercing jabs. Each attack landed" " adds a plethora of combat bonuses." msgstr "" +"Es un estilo centrado en golpes rápidos y trompadas penetrantes. Cada ataque" +" acertado agrega una gran cantidad de bonus al combate." #. ~ initiate message for martial art 'CRIT CQB' #: lang/json/martial_art_from_json.py msgid "You shift your weight for the oncoming fight." -msgstr "" +msgstr "Establecés el peso de tu cuerpo para la pelea que se viene." #. ~ initiate message for martial art 'CRIT CQB' #: lang/json/martial_art_from_json.py #, python-format msgid "%s prepares for hand-to-hand battle." -msgstr "" +msgstr "%s se prepara para la pelea mano a mano." #: lang/json/martial_art_from_json.py msgid "Fluid Tenacity" -msgstr "" +msgstr "Tenacidad Fluida" #. ~ Description of buff 'Fluid Tenacity' for martial art 'CRIT CQB' #: lang/json/martial_art_from_json.py msgid "" "+Atk Speed and other small bonuses based on DEX per stack. Max of 5 stacks" msgstr "" +"+ Velocidad de ataque y otros pequeños bonus basados en la Destreza por vez." +" Se acumula hasta 5 veces." #: lang/json/martial_art_from_json.py msgid "Tactful Initiative" -msgstr "" +msgstr "Iniciativa Discreta" #. ~ Description of buff 'Tactful Initiative' for martial art 'CRIT CQB' #: lang/json/martial_art_from_json.py @@ -134640,6 +140275,9 @@ msgid "" "You have gained an advantage by always remaing mindful of common weaknesses." " DEX provides dodge ability, accuracy and armor penetration." msgstr "" +"Ganaste una ventaja al permanecer atento a las debilidades comunes. La " +"Destreza brinda habilidad para Esquivar, Precisión y penetración de " +"armadura." #: lang/json/martial_art_from_json.py msgid "Desert Wind" @@ -134664,16 +140302,18 @@ msgstr "" msgid "" "You feel a wave of heat wash over you as you assume a running combat stance." msgstr "" +"Sentís una ola de calor que te baña mientras adoptás la postura de combate " +"corriendo." #. ~ initiate message for martial art '{'str': 'Desert Wind'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes into a running combat stance." -msgstr "" +msgstr "%s adopta la postura de combate corriendo." #: lang/json/martial_art_from_json.py msgid "Wind Stride" -msgstr "" +msgstr "Zancada de Viento" #. ~ Description of buff 'Wind Stride' for martial art '{'str': 'Desert #. Wind'}' @@ -134684,10 +140324,14 @@ msgid "" "+1.0 Dodging skill.\n" "Lasts 1 turn." msgstr "" +"Una brisa tibia gira alrededor tuyo mientras te movés rápidamente.\n" +"\n" +"+1.0 habilidad Esquivar.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Zephyr Dance" -msgstr "" +msgstr "Danza Céfiro" #. ~ Description of buff 'Zephyr Dance' for martial art '{'str': 'Desert #. Wind'}' @@ -134698,6 +140342,10 @@ msgid "" "+1.0 Dodging skill, +1 Dodge attempt\n" "Lasts 1 turn." msgstr "" +"Girás grácilmente y te alejás de los ataques, dando vueltas como un céfiro del desierto corriendo por la arena.\n" +"\n" +"+1.0 habilidad Esquivar, +1 intentos de Esquivar\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py msgid "Diamond Mind" @@ -134723,17 +140371,17 @@ msgstr "" #. ~ initiate message for martial art '{'str': 'Diamond Mind'}' #: lang/json/martial_art_from_json.py msgid "You concentrate and become very still for a moment." -msgstr "" +msgstr "Te concentrás y te quedás muy quieto por un momento." #. ~ initiate message for martial art '{'str': 'Diamond Mind'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s becomes very still for a moment." -msgstr "" +msgstr "%s se queda muy quieto por un momento." #: lang/json/martial_art_from_json.py msgid "Stance of Alacrity" -msgstr "" +msgstr "Postura de Celeridad" #. ~ Description of buff 'Stance of Alacrity' for martial art '{'str': #. 'Diamond Mind'}' @@ -134744,10 +140392,13 @@ msgid "" "\n" "-10% move cost" msgstr "" +"Te movés un poco más rápido de lo normal debido a una combinación de confianza y claridad de la mente. Esta leve ventaja se acumula en cada acción\n" +"\n" +"-10% al costo de movimiento." #: lang/json/martial_art_from_json.py msgid "Pearl of Black Doubt" -msgstr "" +msgstr "Perla de Duda Negra" #. ~ Description of buff 'Pearl of Black Doubt' for martial art '{'str': #. 'Diamond Mind'}' @@ -134758,10 +140409,50 @@ msgid "" "+1 Dodge attempt\n" "Lasts 1 turn. Stacks 2 times" msgstr "" +"Con cada fallo, tus oponentes se vuelven más inseguros, su duda crece como una perla irritante en la boca de una ostra desamparada.\n" +"\n" +"+1 intentos de Esquivar.\n" +"Dura 1 turno. Se acumula hasta 2 veces." #: lang/json/martial_art_from_json.py -msgid "Hylian Swordsmanship" +msgid "Quicksilver Motion" +msgstr "Movimiento de Mercurio" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." msgstr "" +"En un abrir y cerrar de ojos, hacés tu movimiento. Tu velocidad, reflejos y confianza ilimitada se combinan para permitirte hacer movimientos rápidos y osados que agarran a tus enemigos con la guardia baja.\n" +"\n" +"+50 a Velocidad.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "Mente sobre Cuerpo" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" +"Tu entrenamiento y resistencia mental te permiten usar tu enfoque para sobreponerte a las amenazas físicas.\n" +"\n" +"+1 Precisión.\n" +"Dura 1 turno. Se acumula hasta 2 veces." + +#: lang/json/martial_art_from_json.py +msgid "Hylian Swordsmanship" +msgstr "Espadachín Hyliano" #. ~ Description for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py @@ -134771,21 +140462,25 @@ msgid "" "defense by using spins, jumps, and flips to confuse enemies and strike from " "unexpected angles." msgstr "" +"Esta extraña forma de combate ha sido practicada por muchos héroes " +"legendarios a través de los años. El Espadachín Hyliano favorece la " +"movilidad para la ofensiva y la defensa usando giros, saltos y vueltas para " +"confundir a los enemigos y golpearlos desde ángulos inesperados." #. ~ initiate message for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py msgid "You begin to step lightly from side to side." -msgstr "" +msgstr "Empezás a moverte ágilmente de un lado a otro." #. ~ initiate message for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s begins to step lightly from side to side." -msgstr "" +msgstr "%s empieza a moverse ágilmente de un lado a otro." #: lang/json/martial_art_from_json.py msgid "Combat Acrobat" -msgstr "" +msgstr "Acróbata de Combate" #. ~ Description of buff 'Combat Acrobat' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -134795,10 +140490,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"Siempre te mantenés agíl de pies. Es mejor esquivar que ser golpeado.\n" +"\n" +"+1.0 habilidad Esquivar." #: lang/json/martial_art_from_json.py msgid "Intermediate Combat Acrobat" -msgstr "" +msgstr "Acróbata Intermedio de Combate" #. ~ Description of buff 'Intermediate Combat Acrobat' for martial art #. '{'str': 'Hylian Swordsmanship'}' @@ -134808,10 +140506,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"Después de mucha práctica, te has vuelto incluso más ágil en combate.\n" +"\n" +"+1.0 habilidad Esquivar." #: lang/json/martial_art_from_json.py msgid "Master Combat Acrobat" -msgstr "" +msgstr "Acróbata Maestro de Combate" #. ~ Description of buff 'Master Combat Acrobat' for martial art '{'str': #. 'Hylian Swordsmanship'}' @@ -134821,10 +140522,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"¡Has visto tanto combate que tu habilidad para esquivar se ha vuelto de excelencia!\n" +"\n" +"+1.0 habilidad Esquivar." #: lang/json/martial_art_from_json.py msgid "Dash Attack" -msgstr "" +msgstr "Ataque Lanzado" #. ~ Description of buff 'Dash Attack' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -134836,10 +140540,14 @@ msgid "" "+10% damage.\n" "Lasts 1 turn. Stacks 3 times." msgstr "" +"Sacando ventaja del impulso, te lanzás contra los enemigos para meter un golpe potente.\n" +"\n" +"+10% al daño.\n" +"Dura 1 turno. Se acumula hasta 3 veces." #: lang/json/martial_art_from_json.py msgid "Flurry Rush" -msgstr "" +msgstr "Ráfaga Apurada" #. ~ Description of buff 'Flurry Rush' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -134851,10 +140559,63 @@ msgid "" "-25% move cost.\n" "Lasts 1 turn." msgstr "" +"Cuando esquivás perfectamente un ataque, podés atacar rápidamente por un breve tiempo.\n" +"\n" +"-25% al costo de movimiento.\n" +"Dura 1 turno." #: lang/json/martial_art_from_json.py -msgid "Panzer Kunst" +msgid "Charge Up" +msgstr "Cargar" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." msgstr "" +"Tomándote un momento para prepararte, ¡podés desplegar un ataque fuerte y giratorio!\n" +"\n" +"+20% al daño, habilita la técnica \"Ataque Giratorio\".\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "Corazón de Hierro" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" +"El objetivo de la disciplina Corazón de Hierro es el dominio absoluto de la " +"espada. A través de prácticas y estudios interminables, el estudiante de " +"Corazón de Hierro consigue habilidades superhumanas con sus armas. Sus " +"maniobras son demostraciones de una habilidad marcial asombrosa -patrones " +"entrelazados de acero que marean, confunden y finalmente matan sin remedio." + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "Alejás tu miedo y te parás altanero." + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "%s adopta una postura intrépida y valiente." + +#: lang/json/martial_art_from_json.py +msgid "Panzer Kunst" +msgstr "Panzer Kunst" #. ~ Description for martial art '{'str': 'Panzer Kunst'}' #: lang/json/martial_art_from_json.py @@ -134862,21 +140623,23 @@ msgid "" "Panzer Kunst or \"Armor Art\" is a futuristic martial art devised for " "cyborgs fighting in zero-gravity environments." msgstr "" +"Panzer Kunst o \"Arte de Armadura\" es una arte marcial futurista concebida " +"para ciborgs peleando en ambientes de gravedad cero." #. ~ initiate message for martial art '{'str': 'Panzer Kunst'}' #: lang/json/martial_art_from_json.py msgid "You adopt a panzer kunst stance." -msgstr "" +msgstr "Adoptás la postura de panzer kunst." #. ~ initiate message for martial art '{'str': 'Panzer Kunst'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s adopts a panzer kunst stance." -msgstr "" +msgstr "%s adopta la postura de panzer kunst." #: lang/json/martial_art_from_json.py msgid "Schatten Folgen" -msgstr "" +msgstr "Schatten Folgen" #. ~ Description of buff 'Schatten Folgen' for martial art '{'str': 'Panzer #. Kunst'}' @@ -134888,10 +140651,14 @@ msgid "" "\n" "+1 Dodge attemps, Dodge Skill increased by 12%% of Perception." msgstr "" +"\"Rastreo Sombrío\"\n" +"Como un künstler, estás entrenado para mantenerte en el punto ciego de tu objetivo.\n" +"\n" +"+1 intentos de Esquivar, Habilidad Esquivar incrementada en%% de tu Percepción." #: lang/json/martial_art_from_json.py msgid "Einzug Rüstungen" -msgstr "" +msgstr "Einzug Rüstungen" #. ~ Description of buff 'Einzug Rüstungen' for martial art '{'str': 'Panzer #. Kunst'}' @@ -134902,6 +140669,492 @@ msgid "" "+5 bash Armor Penetration.\n" "Lasts 2 turns." msgstr "" +"\"Penetración de Armadura\"\n" +"Al armonizar con el ritmo de tu oponente, podés golpearlo cuando su guardia sea más débil.\n" +"+5 penetración de armadura contra Golpe.\n" +"Dura 2 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "Pokken" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" +"Pokkén o \"Puño Bolsillo\" es una extraña arte marcial desarrollada por la " +"famosa serie de videojuegos Pokémon. De alguna manera, un grupo de fanáticos" +" dedicados lograron combinar los movimientos usados por varios pokemones con" +" múltiples artes marciales existentes como el boxeo y el karate. De manera " +"sorprendente, funciona. Algunos incluso dirán que es una manera " +"superefectiva de pelear." + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "Te preparás para la batalla." + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "%s está por desafiar a alguien a pelear." + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "Resistencia" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" +"Estimula tu defensa después de que recibís un golpe.\n" +"\n" +"Recibís armadura contra golpe, corte y penetración igual a un 50% de tu Fuerza.\n" +"Dura 3 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "Francotirador" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" +"Activa técnicas después de que hayas realizado un golpe crítico.\n" +"\n" +"+50% al daño.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "Agallas" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" +"Aumenta tu daño después de vencer a un oponente.\n" +"\n" +"+50% al daño.\n" +"Dura 3 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "Sol Poniente" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" +"La disciplina Sol Poniente enseña a sus iniciados a convertir la fuerza del " +"oponente en contra de ellos mismos. Con un rápido cambio de postura y un " +"ataque cuidadoso, un luchador de Sol Poniente recibe un enemigo atacando y " +"lo envía tropezando hacia otra dirección." + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "Establecés el peso de tu cuerpo para defenderte." + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "%s establece el peso de su cuerpo y adopta una nueva postura." + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "Defensa Desconcertante" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"Intencionalmente, te movés y posicionás de manera extraña para confundir y descolocar a tus oponentes.\n" +"\n" +"Habilidad de Esquivar incrementada en un 20% de tu Inteligencia, activa las técnicas \"Tirada Poderosa\" y \"Tirada de Balista\".\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "Apertura Falsa" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" +"Al bajar intencionalmente tu guardia, forzás a tu oponente a sobreextenderse y ¡podés sacar ventaja de tu próximo ataque!\n" +"\n" +"+20 Velocidad.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "Shii-Cho" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" +"Shii-Cho, \"El camino del Sarlacc\" fue la primera forma de combate con " +"sable de luz desarrollado por los Jedi durante su transición de las armas de" +" metal a las de luz. Shii-Cho es considerado una forma de entrenamiento que " +"todos los Jedi aprenden a entender las bases del combate armado. Shii-Cho se" +" distingue en la lucha contra grupos pero carece de potencia ofensiva para " +"otras formas de sable." + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "Ponés un pie atrás y sostenés tu arma vertical en tu lado dominante." + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "%s pone un pie atrás y sostiene su arma verticalmente." + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" +"Sos un guerrero determinado. Tu calma interna te ayuda a acertar tus golpes y protegerte.\n" +"\n" +"Daño bloqueado reducido en un 100% de tu Fuerza, +1 Precisión." + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "Entrenamiento de Aprendiz" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"Tu entrenamiento en Shii-Cho te enseña cómo combatir contra múltiples oponentes.\n" +"\n" +"+1 intentos de Bloqueo, +1 efectividad de Bloqueo." + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "Entrenamiento de Caballero" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"El entrenamiento más avanzado en Shii-Cho mejora tu habilidad en el combate contra múltiples oponentes.\n" +"\n" +"+1 intentos de Bloqueo, +1 efectividad de Bloqueo." + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "Entrenamiento Maestro" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"Como maestro del Shii-Cho, tu habilidad para pelear contra grupos es insuperable.\n" +"\n" +"+1 intentos de Bloqueo, +1 efectividad de Bloqueo." + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "Dragón de Piedra" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" +"La disciplina del Dragón de Piedra se focaliza en la fuerza, potencia y " +"fortaleza. Sus enseñanzas otorgan al experto marcial la habilidad de romper " +"el acero con un solo golpe focalizado. Las habilidades defensivas del Dragón" +" de Piedra se focaliza en otorgar acceso al poder de resistencia de la " +"piedra para desviar ataques." + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "Clavás tus talones en el suelo y te mantenés firme." + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "%s clava sus talones en el suelo." + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "Huesos de Piedra" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"Focalizás tu energía en mejorar tus defensas, extrayendo el poder del impacto de tu arma para fortalecerte contra un contrataque.\n" +"\n" +"+1 armardura Golpeante, Cortante y Penetrante.\n" +"Dura 1 turno. Se acumula hasta 5 veces." + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "Postura Pie Pétreo" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" +"Te agachás y establecés tus pies en el suelo, extrayendo la resiliencia de la tierra a tu cuerpo. Sin embargo, si te movés mucho perdés tu postura.\n" +"\n" +"+10% al daño, +2 armadura Golpeante, Cortante y Punzante." + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "Piedra Agrietada" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" +"Moverte mucho negará los efectos de la Postura de Pie Seguro. ¡Quedate quieto para evitar romper tu postura!\n" +"\n" +"Habilita la técnica \"Piedra Destruida\".\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "Piedra Destruida" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" +"No sos capaz de mantener tu Postura de Pie Seguro y tenés que dejar de moverte por un breve tiempo para volver a recibir sus beneficios.\n" +"\n" +"-10% al daño, -2 armadura Golpeante, Cortante y Punzante.\n" +"Dura 4 turnos." + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "Huesos de Hierro" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" +"Cuando lográs un ataque exitoso, entrás en un estado de meditación que te deja casi invulnerable al daño.\n" +"\n" +"+5 armadura Golpeante, Cortante y Punzante.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "Garra de Tigre" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" +"La disciplina de la Garra de Tigre aprovecha la furia salvaje que acecha en " +"el corazón de los iniciados. En la batalla, esos guerreros rugirán como " +"animales salvajes, atacarán con una furia similar a la de los bárbaros, y " +"dependerán de sus asaltos aplastantes y despiadados para derrotar enemigos." + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "Emitís un rugido bajo al prepararte para la batalla." + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "%s se agacha como un animal salvaje." + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "Golpe Crítico Mejorado" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" +"Siempre golpeá con toda la fuerza. Nunca te guardes nada salvo que quieras morir.\n" +"\n" +"+5% a la probabilidad de golpe crítico." + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "Ataque de Trompada" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" +"Con el rugido de una bestia salvaje, te lanzás a la refriega. Golpeá primero y golpeá fuerte.\n" +"\n" +"+2 Precisión, +10% al daño.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "Depredador Acorralado" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" +"Un animal acorralado es una criatura terrorífica y peligrosa. A vos te pasa lo mismo.\n" +"\n" +"-20% al costo de movimiento.\n" +"Dura 1 turno." + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "Sangre En El Agua" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" +"El olor de la sangre te hace ponerte loco. Querés más. ¡AHORA!\n" +"\n" +"+1 Precisión, +15% al daño.\n" +"Dura 1 turno. Se acumula hasta 2 veces." + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "Presa Débil" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" +"Cortás a través de los enemigos más débiles como un poderoso depredador suelto entre una horda de presas.\n" +"\n" +"+30 Velocidad.\n" +"Dura 2 turnos. Se acumula hasta 2 veces." #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" @@ -134929,7 +141182,7 @@ msgstr "completamente dañado/a" #: lang/json/material_from_json.py msgid "Resin" -msgstr "" +msgstr "Resina" #: lang/json/material_from_json.py src/veh_interact.cpp msgid "dented" @@ -135001,7 +141254,7 @@ msgstr "Acero Berreta" #: lang/json/material_from_json.py msgid "Cardboard" -msgstr "" +msgstr "Cartón" #: lang/json/material_from_json.py msgid "ripped" @@ -135033,7 +141286,7 @@ msgstr "roto/a" #: lang/json/material_from_json.py msgid "Dragon Scale" -msgstr "" +msgstr "Escama de Dragón" #: lang/json/material_from_json.py msgid "Chitin" @@ -135057,7 +141310,7 @@ msgstr "Diamante" #: lang/json/material_from_json.py msgid "Gemstone" -msgstr "" +msgstr "Piedra Preciosa" #: lang/json/material_from_json.py msgid "Egg" @@ -135093,7 +141346,7 @@ msgstr "completamente mutilado/a" #: lang/json/material_from_json.py msgid "Gutskin" -msgstr "" +msgstr "Piel de Tripa" #: lang/json/material_from_json.py msgid "Fresh Clay" @@ -135153,7 +141406,7 @@ msgstr "Comida chatarra" #: lang/json/material_from_json.py msgid "Foodplace's delicious foodstuff" -msgstr "" +msgstr "comida cosa deliciosa de Foodplace" #: lang/json/material_from_json.py msgid "Kevlar" @@ -135161,11 +141414,11 @@ msgstr "Kevlar" #: lang/json/material_from_json.py msgid "Layered Kevlar" -msgstr "" +msgstr "Kevlar en Capas" #: lang/json/material_from_json.py msgid "Rigid Kevlar" -msgstr "" +msgstr "Kevlar Rígido" #: lang/json/material_from_json.py msgid "Lead" @@ -135177,7 +141430,7 @@ msgstr "Cuero" #: lang/json/material_from_json.py msgid "Lycra" -msgstr "" +msgstr "Licra" #: lang/json/material_from_json.py msgid "Dairy" @@ -135205,7 +141458,7 @@ msgstr "Papel" #: lang/json/material_from_json.py msgid "Dry Plant" -msgstr "" +msgstr "Planta Seca" #: lang/json/material_from_json.py msgid "Plastic" @@ -135225,15 +141478,15 @@ msgstr "Platino" #: lang/json/material_from_json.py msgid "Rubber" -msgstr "" +msgstr "Goma" #: lang/json/material_from_json.py msgid "stressed" -msgstr "" +msgstr "tirante" #: lang/json/material_from_json.py msgid "slashed" -msgstr "" +msgstr "rajado" #: lang/json/material_from_json.py src/item_location.cpp msgid "worn" @@ -135241,7 +141494,7 @@ msgstr "puesto" #: lang/json/material_from_json.py msgid "ruined" -msgstr "" +msgstr "arruinado" #: lang/json/material_from_json.py msgid "Steel" @@ -135257,15 +141510,15 @@ msgstr "Superaleación" #: lang/json/material_from_json.py msgid "layered carbide" -msgstr "" +msgstr "carburo en capas" #: lang/json/material_from_json.py msgid "Synthetic Fabric" -msgstr "" +msgstr "Tela Sintética" #: lang/json/material_from_json.py msgid "Tin" -msgstr "" +msgstr "Estaño" #: lang/json/material_from_json.py msgid "Vegetable Matter" @@ -135331,27 +141584,27 @@ msgstr "molido/a" #: lang/json/material_from_json.py msgid "Dried Vegetable" -msgstr "" +msgstr "Verdura Desecada" #: lang/json/material_from_json.py msgid "Cured Meat" -msgstr "" +msgstr "Carne Curada" #: lang/json/material_from_json.py msgid "Processed Food" -msgstr "" +msgstr "Comida Procesada" #: lang/json/material_from_json.py msgid "Cheese" -msgstr "" +msgstr "Queso" #: lang/json/material_from_json.py msgid "Ice Cream" -msgstr "" +msgstr "Helado" #: lang/json/material_from_json.py msgid "Soil" -msgstr "" +msgstr "Tierra Fértil" #: lang/json/material_from_json.py msgid "Zinc" @@ -135359,11 +141612,11 @@ msgstr "Zinc" #: lang/json/material_from_json.py msgid "Titanium" -msgstr "" +msgstr "Titanio" #: lang/json/material_from_json.py msgid "Graphene Weave" -msgstr "" +msgstr "Grafeno Tejido" #: lang/json/material_from_json.py msgid "scarred" @@ -135371,35 +141624,35 @@ msgstr "con cicatrices" #: lang/json/material_from_json.py msgid "Prismetallic Blend" -msgstr "" +msgstr "Mezcla Prismetálica" #: lang/json/material_from_json.py msgid "Chromogenic Weave" -msgstr "" +msgstr "Tejido Cromogénico" #: lang/json/material_from_json.py msgid "Collagenic Polymer" -msgstr "" +msgstr "Polímero Colágeno" #: lang/json/material_from_json.py msgid "Emulsified Hydrogel" -msgstr "" +msgstr "Hidrogel Emulsionado" #: lang/json/material_from_json.py -msgid "pupled" -msgstr "" +msgid "pulped" +msgstr "destruido" #: lang/json/material_from_json.py msgid "Arcane Skin" -msgstr "" +msgstr "Piel Arcana" #: lang/json/material_from_json.py msgid "Black Dragon Hide" -msgstr "" +msgstr "Pellejo de Dragón Negro" #: lang/json/material_from_json.py msgid "Demon Chitin" -msgstr "" +msgstr "Quitina Demoníaca" #: lang/json/material_from_json.py msgid "Orichalcum" @@ -135407,57 +141660,67 @@ msgstr "Oricalco" #: lang/json/material_from_json.py msgid "Sugar" -msgstr "" +msgstr "Azúcar" #: lang/json/mission_def_from_json.py msgid "Gather bones for Brigitte LaCroix. About 8 should do it." -msgstr "" +msgstr "Recolectá huesos para Brigitte LaCroix. Con 8 debería estar bien." #: lang/json/mission_def_from_json.py msgid "There is always work to be done, song to be woven." -msgstr "" +msgstr "Siempre hay trabajo para hacer, y canción para tejer." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " "between your fingertips. Then bring me the bones and I shall carve them for" " you." msgstr "" +"Si querés que te pongan en el camino de la iluminación, primero tenés que " +"aprender a escuchar y oir la canción. Salí, carneá una criatura y sentí el " +"poder entre la punta de tus dedos. Luego traeme los huesos y yo te los voy a" +" tallar." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." -msgstr "" +msgstr "Excelente. Ahora andá." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "" +"Entiendo tu reticencia. Sentite libre de volver cuando veas el camino." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " "an unspoiled living creature." msgstr "" +"Los cuerpos tambaleantes que vemos por todos lados se mueven en " +"discordancia. Su canción puede ser usada pero para un Acólito, sería " +"innecesariamente difícil. Asegurate de tallar una criatura viva pura." #: lang/json/mission_def_from_json.py msgid "Have you felt the song in your hands yet?" -msgstr "" +msgstr "¿Ya sentiste la canción en tus manos?" #: lang/json/mission_def_from_json.py msgid "" "And so, another cycle ends. You have done well. I will now bestow my mark " "upon you, so that others may know the path you walk and aid you." msgstr "" +"Y así, otro círculo se cierra. Lo hiciste bien. Ahora voy a otorgar mi marca" +" sobre vos, así los otros sabrán el camino que andás y te ayudarán." #: lang/json/mission_def_from_json.py msgid "So you say, but the song sings otherwise." -msgstr "" +msgstr "Eso decís, pero la canción canta otra cosa." #: lang/json/mission_def_from_json.py msgid "Then you shall try again, until you hear." -msgstr "" +msgstr "Entonces deberás volver a intentarlo, hasta que oigas." #: lang/json/mission_def_from_json.py msgid "Follow Sarcophagus Team" @@ -135465,7 +141728,7 @@ msgstr "Seguir Equipo de Sarcófago" #: lang/json/mission_def_from_json.py msgid "You wouldn't believe what I found…" -msgstr "" +msgstr "No me vas a creer lo que encontré…" #: lang/json/mission_def_from_json.py msgid "" @@ -135528,17 +141791,19 @@ msgstr "Encontrar inhalador" #: lang/json/mission_def_from_json.py msgid "I'm… short… of breath…" -msgstr "" +msgstr "No… puedo… respirar…" #: lang/json/mission_def_from_json.py msgid "I'm asthmatic. I need you to get an inhaler for me…" -msgstr "" +msgstr "Soy asmático. Necesito que me consigas un inhalador…" #: lang/json/mission_def_from_json.py msgid "" "Oh, thank god, thank you so much! I won't last more than a couple of days, " "so hurry…" msgstr "" +"¡Oh, gracias a dios, te agradezco mucho! No voy a aguantar más de dos días, " +"así que rápido…" #: lang/json/mission_def_from_json.py msgid "What?! Please, without your help!" @@ -135571,11 +141836,11 @@ msgstr "Encontrar Antibióticos" #: lang/json/mission_def_from_json.py msgid "This infection is bad, bad…" -msgstr "" +msgstr "La infección está mal, mal…" #: lang/json/mission_def_from_json.py msgid "I'm infected. Badly. I need you to get some antibiotics for me…" -msgstr "" +msgstr "Estoy infectado. Mal. Necesito que me consigas unos antibióticos…" #: lang/json/mission_def_from_json.py msgid "Find any antibiotics yet?" @@ -135597,6 +141862,11 @@ msgid "" " me a black box from one of the wrecks I'll look into where we might open'er" " at." msgstr "" +"Tenemos la bandera pero ahora necesitamos encontrar las tropas de EE.UU para" +" ver en qué podemos ayudar. No vi a nadie pero supongo que uno de esos " +"helicópteros que andaban por ahí cuando empezó todo es un buen lugar para " +"revisar. Si me podés conseguir una caja negra de uno de los estrellados, voy" +" a ver dónde la podemos abrir." #: lang/json/mission_def_from_json.py msgid "Do you have any better ideas?" @@ -135679,7 +141949,7 @@ msgstr "Encontrar Placa de Ayudante" #: lang/json/mission_def_from_json.py msgid "Those twisted snakes…" -msgstr "" +msgstr "Esas serpientes retorcidas…" #: lang/json/mission_def_from_json.py msgid "" @@ -135702,10 +141972,12 @@ msgid "" "We're also official… just hang in there and I'll show you what we can really" " do." msgstr "" +"También somos oficiales… solo quedate por ahí y te voy a mostrar lo que " +"podemos hacer." #: lang/json/mission_def_from_json.py msgid "They shouldn't be that hard to find… should they?" -msgstr "" +msgstr "No deberían ser tan difíciles de encontrar… ¿no?" #: lang/json/mission_def_from_json.py msgid "Any luck?" @@ -135717,7 +141989,7 @@ msgstr "Buen trabajo, Ayudante. Estamos en marcha." #: lang/json/mission_def_from_json.py msgid "Thanks for trying… I guess." -msgstr "" +msgstr "Gracias por intentarlo… supongo." #: lang/json/mission_def_from_json.py msgid "The day of reckoning will come for the criminals if it hasn't already." @@ -135748,7 +142020,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Seriously? God damned commie…" -msgstr "" +msgstr "¿En serio? Maldita sea, camarada…" #: lang/json/mission_def_from_json.py msgid "Find a large federal building or school, they must have one." @@ -135767,6 +142039,9 @@ msgid "" "You give up? This country fell apart because no one could find a good man " "to rely on… might as well give up, I guess." msgstr "" +"¿Te das por vencido? Este país se cae a pedazos porque nadie puede conseguir" +" un buen hombre en el cual confiar… yo también debería darme por vencido, " +"supongo." #: lang/json/mission_def_from_json.py msgid "Find Corporate Accounts" @@ -135808,6 +142083,9 @@ msgid "" "Great, let's see… uh… hmmm… Fine, I didn't even do my own taxes but I'm " "sure this will prove their guilt if we get an expert to examine it." msgstr "" +"Buenísimo, vamos a ver… uh… hmmm… Bien, ni siquiera miro mis propios " +"impuestos pero estoy seguro que esto probará su culpa si conseguimos un " +"experto que lo pueda examinar. " #: lang/json/mission_def_from_json.py msgid "" @@ -135822,7 +142100,7 @@ msgstr "Encontrar Registros de Pacientes" #: lang/json/mission_def_from_json.py msgid "I hope I don't see many names I know…" -msgstr "" +msgstr "Espero que no encuentre muchos nombres que conozca…" #: lang/json/mission_def_from_json.py msgid "" @@ -135856,11 +142134,11 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Oh dear, I thought Timmy would have made it…" -msgstr "" +msgstr "Oh dios, pensé que Timmy se había salvado…" #: lang/json/mission_def_from_json.py msgid "I bet some of them are still out there…" -msgstr "" +msgstr "Estoy seguro que alguno de ellos todavía anda por ahí…" #: lang/json/mission_def_from_json.py msgid "Find Weather Log" @@ -135868,7 +142146,7 @@ msgstr "Encontrar Registro de Clima" #: lang/json/mission_def_from_json.py msgid "I wonder if a retreat might exist…" -msgstr "" +msgstr "Me pregunto si puede existir un retiro…" #: lang/json/mission_def_from_json.py msgid "" @@ -135896,6 +142174,8 @@ msgstr "Sí, reconozco que era un posibilidad lejana." #: lang/json/mission_def_from_json.py msgid "I'm not sure, maybe a news station would have what we are looking for?" msgstr "" +"No estoy seguro, ¿tal vez los medios de noticias puedan tener lo que estamos" +" buscando?" #: lang/json/mission_def_from_json.py msgid "These look more complicated than I thought, just give me some time." @@ -135916,7 +142196,7 @@ msgstr "Encontrar Reliquia" #: lang/json/mission_def_from_json.py msgid "St. Michael the archangel defend me in battle…" -msgstr "" +msgstr "El arcángel San Miguel me defiende en la batalla…" #: lang/json/mission_def_from_json.py msgid "" @@ -135925,6 +142205,10 @@ msgid "" "truth to them. Please go and find me a religious relic… I doubt it will be" " of much use but I've got to hope in something." msgstr "" +"Como el mundo parece abandonar la realidad que supimos conocer, se hace " +"probable que las viejas supersticiones que fueron dejadas de lado puedan " +"tener algo de verdad en ellas. Por favor, buscame una reliquia religiosa… " +"dudo que sea de mucha ayuda pero tengo que creer en algo." #: lang/json/mission_def_from_json.py msgid "" @@ -135934,7 +142218,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Ya, I guess the stress may just be getting to me…" -msgstr "" +msgstr "Sí, supongo que el stress me está haciendo mal…" #: lang/json/mission_def_from_json.py msgid "I suppose a large church or cathedral may have something." @@ -135948,7 +142232,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Thank you, I need some time alone now…" -msgstr "" +msgstr "Gracias, ahora necesito un tiempo solo…" #: lang/json/mission_def_from_json.py msgid "What good does this do us?" @@ -135956,7 +142240,7 @@ msgstr "¿Para qué nos sirve esto?" #: lang/json/mission_def_from_json.py msgid "It was a lost cause anyways…" -msgstr "" +msgstr "De todas maneras, era un caso perdido…" #: lang/json/mission_def_from_json.py msgid "Retrieve Deposit Box" @@ -136010,7 +142294,7 @@ msgstr "Recuperar Software" #: lang/json/mission_def_from_json.py msgid "Oh man, I can't believe I forgot to download it…" -msgstr "" +msgstr "Uh loco, no puedo creer que me olvidé de descargarlo…" #: lang/json/mission_def_from_json.py msgid "There's some important software on my computer that I need on USB." @@ -136026,7 +142310,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Seriously? It's an easy job…" -msgstr "" +msgstr "¿De en serio? Es una tarea fácil…" #: lang/json/mission_def_from_json.py msgid "Take this USB drive. Use the console, and download the software." @@ -136042,7 +142326,7 @@ msgstr "¡Excelente, gracias!" #: lang/json/mission_def_from_json.py msgid "Wow, you failed? All that work, down the drain…" -msgstr "" +msgstr "¿Guau, no pudiste? Todo ese trabajo, perdido para siempre…" #: lang/json/mission_def_from_json.py msgid "Analyze Zombie Blood" @@ -136051,6 +142335,7 @@ msgstr "Analizar Sangre de Zombi" #: lang/json/mission_def_from_json.py msgid "It could be very informative to perform an analysis of zombie blood…" msgstr "" +"Puede ser muy informativo realizar un análisis de la sangre de un zombi…" #: lang/json/mission_def_from_json.py msgid "" @@ -136074,6 +142359,8 @@ msgstr "" msgid "" "Are you sure? The scientific value of that blood data could be priceless…" msgstr "" +"¿Estás seguro? El valor científico de la información de esa sangre puede ser" +" invalorable…" #: lang/json/mission_def_from_json.py msgid "" @@ -136097,7 +142384,7 @@ msgstr "¡Esperá, no puede ser que tengas la información! ¡Mentiroso!" #: lang/json/mission_def_from_json.py msgid "What a shame, that data could have proved invaluable…" -msgstr "" +msgstr "Qué lástima, esa información puede ser invalorable…" #: lang/json/mission_def_from_json.py msgid "Investigate Cult" @@ -136112,6 +142399,12 @@ msgid "" "location for me? I'm not sure what was going on here but the priest seemed " "fairly worried about it." msgstr "" +"No tenés idea de qué tan interesante es este diario. Encontré dos pistas " +"prometedoras… Primero lo primero, la Iglesia Católica ha estado llevando a " +"cabo sus propias investigaciones acerca del fenómeno del culto global y " +"parece que recientemente se ha vuelto muy interesada en un culto local. " +"¿Podrías investigar un lugar por mí? No estoy seguro que hacían ahí, pero el" +" cura parece bastante preocupado al respecto." #: lang/json/mission_def_from_json.py msgid "" @@ -136121,6 +142414,11 @@ msgid "" "before and after the outbreak. The name of the cult is believed to be the " "Church of Starry Wisdom but it is noted that accounts differ." msgstr "" +"Te deseo la mejor de las suertes, que el dios que te guste guíe tu camino… " +"Tal vez lo necesites más ahora que en las excursiones anteriores que " +"hiciste. Hay una nota acerca de posibles sacrificios humanos en los días " +"previos y luego del comienzo. Se cree que el nombre del culto es la Iglesia " +"de la Sabiduría Estrellada, pero se sabe que los informes difieren." #: lang/json/mission_def_from_json.py msgid "" @@ -136128,10 +142426,14 @@ msgid "" "not sure what you might be looking for but I'm positive you'll find " "something out of the ordinary if you look long enough." msgstr "" +"Dudo de que el lugar todavía esté ocupado pero yo llevaría por lo menos un " +"arma de fuego… No estoy seguro de lo que tengas que buscar pero sí sé que " +"vas a encontrar algo fuera de lo común si buscás bien." #: lang/json/mission_def_from_json.py msgid "I'm positive there is something there… there has to be, any luck?" msgstr "" +"Estoy seguro de que hay algo ahí… tiene que haber algo, ¿tuviste suerte?" #: lang/json/mission_def_from_json.py msgid "" @@ -136140,6 +142442,10 @@ msgid "" "survivors of this cult… I don't known if they are responsible for the " "outbreak but they certainly know more about it than I do." msgstr "" +"Gracias, tu informe sobre estas… creaciones demoníacas prueba que los miedos" +" de las iglesias eran fundados. Nuestra prioridad debería ser descartar que " +"haya sobrevivido alguno de este culto… No sé si ellos son responsables por " +"el comienzo de esto pero seguro que saben más que yo." #: lang/json/mission_def_from_json.py msgid "Prison Visionary" @@ -136155,6 +142461,13 @@ msgid "" "in a position to cast out the account just yet… it seems the man has " "prophesied events accurately before concerning the Church of Starry Wisdom." msgstr "" +"Tengo otra tarea si tenés ganas. Hay un prisionero sobre el que el cura hace" +" especial mención. Me pregunto si podrías revisar qué puede haber pasado con" +" él o si dejó algo en su celda. El cura admite que el individuo es bastante " +"inestable, para decirlo a la ligera, pero el cura personalmente creía que " +"este hombre era una clase de visionario arrepentido. No estoy en posición " +"olvidar el informe todavía… parece que el hombre ya había profetizado " +"sucesos acertadamente acerca de la Iglesia de la Sabiduría Estrellada." #: lang/json/mission_def_from_json.py msgid "" @@ -136163,6 +142476,10 @@ msgid "" "sure what they would have decided to do with the inmates when they knew " "death was almost certain. " msgstr "" +"Te deseo la mejor de las suertes, que el dios que te guste guíe tu camino… " +"Solo puedo imaginar que la cárcel va a ser un pequeño pedazo del infierno. " +"No estoy seguro de que lo que hubieran decidido hacer con los presos cuando " +"sabían que la muerte era algo casi seguro." #: lang/json/mission_def_from_json.py msgid "" @@ -136186,7 +142503,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Well damn, you must be the guys here to pick me up…" -msgstr "" +msgstr "Bueno, por fin, ustedes deben ser los que venían a buscarme…" #: lang/json/mission_def_from_json.py msgid "" @@ -136230,11 +142547,11 @@ msgstr "¿Algún problema, jefe?" #: lang/json/mission_def_from_json.py msgid "Wait… are you really making me a deputy?" -msgstr "" +msgstr "Esperá… ¿en serio me estás haciendo el ayudante?" #: lang/json/mission_def_from_json.py msgid "I don't think so…" -msgstr "" +msgstr "No me parece…" #: lang/json/mission_def_from_json.py msgid "Quitting already?" @@ -136246,7 +142563,7 @@ msgstr "Matar 100 Zombis" #: lang/json/mission_def_from_json.py msgid "You seem to know this new world better than most…" -msgstr "" +msgstr "Parece que conocés este mundo nuevo mejor que la mayoría…" #: lang/json/mission_def_from_json.py msgid "" @@ -136257,6 +142574,13 @@ msgid "" " to the best of my ability but you really showed promise taking out that " "other beast. You, I, and a 100 zombies laid to rest, what do you say?" msgstr "" +"Estás mejor equipado que la mayoría… ¿te interesaría hacer este mundo un " +"poquito mejor para el resto de nosotros? Los pueblos tienen suficientes " +"provisiones para que los sobrevivientes empecemos a asegurarnos un punto de " +"apoyo, pero no tenemos a nadie con la habilidad y el equipo para achicar el " +"número de muertos vivientes. Te voy a ayudar todo lo que pueda porque " +"mostraste habilidad para eliminar esa otra bestia. Vos, yo, y 100 zombis " +"para matar, ¿qué te parece?" #: lang/json/mission_def_from_json.py msgid "" @@ -136272,6 +142596,9 @@ msgid "" "most of us survivors won't make it unless someone decides to take the " "initiative." msgstr "" +"Hey, yo tampoco sería voluntario para una cosa así… pero luego me acuerdo " +"que la mayoría de los sobrevivientes no vamos a hacerlo salvo que alguien " +"decida tomar la iniciativa." #: lang/json/mission_def_from_json.py msgid "I'd secure an ammo cache and try to sweep a town in multiple passes." @@ -136288,6 +142615,8 @@ msgid "" "Man… you're a goddamn machine. It was a pleasure working with you. You " "know, you may just change our little neck of the world if you keep this up." msgstr "" +"Chabón… sos una máquina. Fue un placer trabajar con vos. Ya sabés, puede que" +" cambies nuestro lugar en el mundo si seguís así." #: lang/json/mission_def_from_json.py msgid "I don't think that was quite a hundred dead zeds." @@ -136300,6 +142629,8 @@ msgstr "Matar Líder de Horda" #: lang/json/mission_def_from_json.py msgid "I've heard some bad rumors so I hope you are up for another challenge…" msgstr "" +"Escuché algunos rumores malos, así que espero que estés dispuesto a " +"enfrentar otro desafío…" #: lang/json/mission_def_from_json.py msgid "" @@ -136352,6 +142683,8 @@ msgid "" "The eater of the dead… something was ripping zombies to shreds and only " "leaving a few scattered limbs…" msgstr "" +"El comedor de muertos… algo está desgarrando a los zombis en pedazos y solo " +"deja algunas partes desparramadas…" #: lang/json/mission_def_from_json.py msgid "" @@ -136401,6 +142734,8 @@ msgid "" "I'm glad you came back alive… I wasn't sure if I had sent you to your " "death." msgstr "" +"Me alegra que hayas vuelto vivo… no estaba seguro si te había mandado a la " +"muerte." #: lang/json/mission_def_from_json.py msgid "Kill Zombie Mom" @@ -136408,29 +142743,32 @@ msgstr "Matar Mamá Zombi" #: lang/json/mission_def_from_json.py msgid "Oh god, I can't believe it happened…" -msgstr "" +msgstr "Oh dios, no puedo creer lo que pasó…" #: lang/json/mission_def_from_json.py msgid "" "My mom… she's… she was killed, but then she just got back up… she's one of " "those things now. Can you put her out of her misery for me?" msgstr "" +"Mi mamá… ella… la mataron, pero después se volvió a levantar… se convirtió " +"en una de esas cosas. ¿Podés hacerme el favor de terminar con su miserable " +"vida?" #: lang/json/mission_def_from_json.py msgid "Thank you… she would've wanted it this way." -msgstr "" +msgstr "Gracias… ella lo hubiera querido así. " #: lang/json/mission_def_from_json.py msgid "Please reconsider, I know she's suffering…" -msgstr "" +msgstr "Por favor, pensalo, yo sé que ella está sufriendo…" #: lang/json/mission_def_from_json.py msgid "Find a gun if you can, make it quick…" -msgstr "" +msgstr "Buscate un arma si podés, hacelo rápido…" #: lang/json/mission_def_from_json.py msgid "Well…? Did you… finish things for my mom?" -msgstr "" +msgstr "¿Y…? ¿Ya pudiste… terminar lo de mi mamá?" #: lang/json/mission_def_from_json.py msgid "Thank you. I couldn't rest until I knew that was finished." @@ -136438,7 +142776,7 @@ msgstr "Gracias. No podía descansar hasta saber que se había terminado. " #: lang/json/mission_def_from_json.py msgid "Really… that's too bad." -msgstr "" +msgstr "En serio… qué mal." #: lang/json/mission_def_from_json.py msgid "Null mission" @@ -136450,7 +142788,7 @@ msgstr "Llegar a Casa de Granja" #: lang/json/mission_def_from_json.py msgid "I just need a place to start over…" -msgstr "" +msgstr "Solo quiero un lugar para empezar de nuevo…" #: lang/json/mission_def_from_json.py msgid "" @@ -136459,6 +142797,11 @@ msgid "" " the first to go. I'd like to start over, just rebuild at one of the farms " "in the countryside. Can you help me secure one?" msgstr "" +"He aceptado que todos los que conocía están muertos… de una forma o de otra." +" Realmente quisiera haber podido hacer algo para salvar a mi hermano pero él" +" fue uno de los primeros en irse. Me gustaría empezar de nuevo, solo " +"reconstruir en una de las granjas del campo. ¿Me podés ayudar a asegurar " +"una?" #: lang/json/mission_def_from_json.py msgid "" @@ -136504,7 +142847,7 @@ msgstr "Llegar a Campamento FEMA" #: lang/json/mission_def_from_json.py msgid "Maybe they escaped to one of the camps…" -msgstr "" +msgstr "Tal vez se escaparon a alguno de esos campamentos…" #: lang/json/mission_def_from_json.py msgid "" @@ -136513,10 +142856,14 @@ msgid "" " of the FEMA camps? I know some were overrun but I don't want to believe " "all of them could have fallen." msgstr "" +"No puedo agradecerte lo suficiente que me hayas traído los registros de " +"pacientes, pero tengo otro pedido. Parece que conocés el lugar… ¿me podrías " +"llevar a uno de los campamentos FEMA? Sé que algunos fueron infestados pero " +"no quiero creer que todos han caído." #: lang/json/mission_def_from_json.py msgid "Thank you, just bring me to the camp… I just want to see." -msgstr "" +msgstr "Gracias, solo llevame hasta el campamento… Solo quiero verlo." #: lang/json/mission_def_from_json.py msgid "Please, I don't know what else to do." @@ -136543,7 +142890,7 @@ msgstr "Alcanzar Sitio Seguro" #: lang/json/mission_def_from_json.py msgid "Reach The Mansion And Finish This Delivery" -msgstr "" +msgstr "Ir a la Mansión y Terminar La Entrega" #: lang/json/mission_def_from_json.py msgid "Recover Priest's Diary" @@ -136591,18 +142938,28 @@ msgid "" "woods. Wasn't sure how long we were going to be so I told him to just camp " "there until we picked him up." msgstr "" +"Tenemos otro problema que enfrentar pero no creo que podamos hacerlo " +"nosotros solos. Así que, pregunté y conseguí un voluntario… más o menos. Es " +"más egoísta que la mierda pero tiene habilidad con las armas. Se suponía que" +" iba a agarrar todo lo que tuviera de valor y se encontraría con nosotros en" +" la cabaña del bosque. No estaba seguro de cuánto íbamos a tardar así que le" +" dije que se quede ahí hasta que lo pasáramos a buscar." #: lang/json/mission_def_from_json.py msgid "" "Rodger, if he's a no-show then any other gunslinger will do… but I doubt " "he'll quit before we even begin." msgstr "" +"Rodger, si no aparece entonces cualquier otro pistolero servirá… pero dudo " +"de que se rinda antes de empezar." #: lang/json/mission_def_from_json.py msgid "" "I hope the bastard is packing heat… else we'll need to grab him a gun before" " we hit our next target." msgstr "" +"Espero que el bastardo esté trayendo fierros… si no vamos a necesitar " +"conseguirle un arma antes de buscar nuestro próximo objetivo." #: lang/json/mission_def_from_json.py msgid "Found a gunslinger?" @@ -136622,7 +142979,7 @@ msgstr "Encontrar Perro Perdido" #: lang/json/mission_def_from_json.py msgid "Oh, my poor puppy…" -msgstr "" +msgstr "Oh, mi pobre cachorrito…" #: lang/json/mission_def_from_json.py msgid "" @@ -136657,43 +143014,51 @@ msgstr "¡Muchas gracias por encontrarlo!" #: lang/json/mission_def_from_json.py msgid "Oh no! My poor puppy…" -msgstr "" +msgstr "¡Oh no! Mi pobre cachorrito…" #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" -msgstr "" +msgstr "Entrar en la armería y recuperar la foto familiar" #: lang/json/mission_def_from_json.py msgid "I need you to get my family photo from the armory safe." msgstr "" +"Necesito que consigas la foto de mi familia que está en la caja fuerte de la" +" armería." #: lang/json/mission_def_from_json.py msgid "" "I left the only photo I have from my family in the armory. I don't have the" " code, can you get in?" msgstr "" +"Dejé la única foto que tenía de mi familia en la armería. No tengo el " +"código, ¿podrás entrar igual?" #: lang/json/mission_def_from_json.py msgid "Thanks, it's great to see someone willing to help a out." -msgstr "" +msgstr "Gracias, qué bueno es encontrarse gente dispuesta a ayudar." #: lang/json/mission_def_from_json.py msgid "" "Well, I'll find someone else to do it for me, real shame with all those guns" " locked up too…" msgstr "" +"Bueno, voy a buscar otro que lo quiera hacer por mí, una verdadera lástima " +"con todas esas armas guardadas ahí…" #: lang/json/mission_def_from_json.py msgid "You look like a resourceful sort, maybe you can hack it or something." -msgstr "" +msgstr "Parece que tenés recursos, por ahí podés hackearla o algo así." #: lang/json/mission_def_from_json.py msgid "Got the photo? Should've been in my gun safe." -msgstr "" +msgstr "¿Tenés la foto? Debería estar en mi caga fuerte de armas." #: lang/json/mission_def_from_json.py msgid "Thanks! I'll be sure to put in a good word for you around town." msgstr "" +"¡Gracias! Me voy a asegurar de que se enteren lo que hiciste por mí en el " +"pueblo." #: lang/json/mission_def_from_json.py msgid "OK, then hand it over." @@ -136705,15 +143070,15 @@ msgstr "Es lo que hay." #: lang/json/mission_def_from_json.py msgid "Find Antibiotics Before You Die!" -msgstr "" +msgstr "¡Encontrar Antibióticos Antes de Morir!|" #: lang/json/mission_def_from_json.py msgid "Prove your worth to Foodperson" -msgstr "" +msgstr "Probar tu valor a Foodperson" #: lang/json/mission_def_from_json.py msgid "Prove your dedication to Foodplace." -msgstr "" +msgstr "Probar tu dedicación a Foodplace." #: lang/json/mission_def_from_json.py msgid "" @@ -136721,42 +143086,49 @@ msgid "" "you worthy of my friendship. Ten loyalty cards should be enough, I'm sure " "you already have much more than that waiting for you at home, right?" msgstr "" +"Mostrame la prueba de tu lealtad al gran Foodplace, y voy a considerar si te" +" merecés mi amistad. Diez tarjetas de lealtad deberían ser suficientes, " +"estoy seguro que ya tenés más que eso esperandote en tu casa, ¿no?" #: lang/json/mission_def_from_json.py msgid "That's the spirit! Good luck kid." -msgstr "" +msgstr "¡Ese es el ánimo! Buena suerte, pibe." #: lang/json/mission_def_from_json.py msgid "That's alright not everyone is cutout for this." -msgstr "" +msgstr "Está bien, no todos están hechos para esto." #: lang/json/mission_def_from_json.py msgid "" "Those are very precious, people would probably keep them on their person or " "in bank vaults. And definitely not throw them in the trash!" msgstr "" +"Esas son muy preciadas, la gente probablemente las lleva consigo o las " +"guarda en el banco. ¡Y definitivamente no las tirarían en la basura!" #: lang/json/mission_def_from_json.py msgid "How is it going? Do you have them?" -msgstr "" +msgstr "¿Cómo va? ¿Las conseguiste?" #: lang/json/mission_def_from_json.py msgid "" "YES! I knew you could do it! You proved your worth and I'm proud to call " "you a friend." msgstr "" +"¡SÍ! ¡Sabía que lo podías hacer! Probaste tu valía y me enorgullece llamarte" +" amigo." #: lang/json/mission_def_from_json.py msgid "Well… where are they?" -msgstr "" +msgstr "Bueno… ¿dónde están?" #: lang/json/mission_def_from_json.py msgid "I'm so disappointed in you kid…" -msgstr "" +msgstr "Estoy muy decepcionado de vos, pibe…" #: lang/json/mission_def_from_json.py msgid "Prove You're A Survivor" -msgstr "" +msgstr "Probá que Sos un Superviviente" #. ~ Description for mission '{'str': "Prove You're A Survivor"}' #: lang/json/mission_def_from_json.py @@ -136764,10 +143136,14 @@ msgid "" "Prove you're a survivor by surviving for 10 days after the Cataclysm, and " "then returning to the person who gave you this mission." msgstr "" +"Probá que sos un superviviente sobreviviendo 10 días después del Cataclismo," +" y después volviendo a la persona que te dio esta misión." #: lang/json/mission_def_from_json.py msgid "It's hard to tell who actually has the skills to survive these days…" msgstr "" +"Es difícil decir quién tiene realmente las habilidades para sobrevivir estos" +" días…" #: lang/json/mission_def_from_json.py msgid "" @@ -136779,38 +143155,50 @@ msgid "" "know you've got what it takes, or you don't and I'll know that I was right " "not to follow you." msgstr "" +"Es difícil sobrevivir solo, y probablemente tengamos mejores oportunidades " +"si trabajamos juntos. El problema es que no te conozco y no sé de qué sos " +"capaz. Tal vez tengas lo necesario, tal vez no. De cualquier manera voy a " +"necesitar pruebas. Volvé en unos días y te voy a seguir con gusto. " +"Básicamente, es una situación de ganar y ganar para mí: o volvés y sé que " +"tenés lo necesario, o no volvés y sé que tenía razón al no ir con vos." #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." -msgstr "" +"I'll see you then… or I won't, and then I'll know I made the right decision." +msgstr "Te veo después… o no, y entonces sabré que tomé la decisión correcta." #: lang/json/mission_def_from_json.py msgid "" "Don't die. If you're asking me for advice, that doesn't bode well for you." msgstr "" +"No te mueras. Si me pedís un consejo, eso no sería un buen presagio para " +"vos." #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." -msgstr "" +msgid "Well, you're not dead… yet." +msgstr "Bueno, no estás muerto… todavía." #: lang/json/mission_def_from_json.py msgid "" "I'll be honest, I wasn't really expecting to see you again. A promise is a " "promise, I'll follow you now!" msgstr "" +"Voy a ser sincero, no esperaba volver a verte. Pero una promesa es una " +"promesa, ¡voy con vos!" #: lang/json/mission_def_from_json.py msgid "I know time is relative and all that." -msgstr "" +msgstr "Ya sé que el tiempo es relativo y todo eso." #: lang/json/mission_def_from_json.py msgid "I'm not quite sure how you failed to survive AND are talking to me." msgstr "" +"No estoy muy seguro cómo hiciste para no sobrevivir Y estar acá hablando " +"conmigo." #: lang/json/mission_def_from_json.py msgid "Gather cattail stalks to create cattail jelly" -msgstr "" +msgstr "Recolectar tallos de junco para crear gelatina de junco" #. ~ Description for mission '{'str': 'Gather cattail stalks to create cattail #. jelly'}' @@ -136822,6 +143210,11 @@ msgid "" "harvesting cattail stalks. Bring back the provided " "bag as well." msgstr "" +"Recolectar 80 tallos de junco del pantano y " +"traerlos para aprender cómo hacer gelatina de " +"junco. Levanta tu habilidad de supervivencia a por" +" lo menos 1 al recolectar los tallos. Traé de " +"nuevo la bolsa que te dieron también." #: lang/json/mission_def_from_json.py msgid "" @@ -136829,6 +143222,9 @@ msgid "" "have been surviving using their wits and the bounty of Mother Nature for a " "long time. Care to learn a little?" msgstr "" +"Los servicios médicos son un poco escasos después del , pero " +"la gente ha sobrevivido usando su ingenio y la abundancia de la Madre " +"Naturaleza por mucho tiempo. ¿Querés aprender un poco?" #: lang/json/mission_def_from_json.py msgid "" @@ -136838,51 +143234,62 @@ msgid "" "collect 80 cattail stalks, and bring them back here. In exchange, I'll show" " you how to harvest the jelly." msgstr "" +"¿Sabías que los juncos son un recurso para hacer una gelatina que funciona " +"como antiséptico y analgésico? Algo como esto es probable que te sea útil. " +"Quiero que te lleves esta bolsa, vayas hasta el pantano más cerca, " +"recolectes 80 tallos de junco y los traigas para acá. A cambio te voy a " +"mostrar cómo extraer la gelatina." #: lang/json/mission_def_from_json.py msgid "" "Great! This bag should be big enough to hold all of the stalks we'll need." " Don't forget to bring it back." msgstr "" +"¡Genial! Esta bolsa debería ser suficientemente grande para contener todos " +"los tallos que necesitamos. No te olvides de traerla de vuelta." #: lang/json/mission_def_from_json.py msgid "Your loss." -msgstr "" +msgstr "Vos te lo perdés." #: lang/json/mission_def_from_json.py msgid "The cattails grow in the fresh water in swamps. You can't miss them." msgstr "" +"Los juncos crecen cerca del agua potable en los pantanos. No te los podés " +"perder." #: lang/json/mission_def_from_json.py msgid "" "Got those cattail stalks yet? Don't forget to bring back my bag and improve" " your survival skill to at least 1 as well." msgstr "" +"¿Ya conseguiste los tallos de junco? No te olvides de traerme mi bolsa y de " +"mejorar tu habilidad de supervivencia a 1 por lo menos." #: lang/json/mission_def_from_json.py msgid "Great! Hand them over and I'll show you how this works." -msgstr "" +msgstr "¡Genial! Damelos y te muestro cómo se hace." #: lang/json/mission_def_from_json.py msgid "OK, then hand them over." -msgstr "" +msgstr "Bueno, damelos." #: lang/json/mission_def_from_json.py msgid "Well, that's a shame." -msgstr "" +msgstr "Bueno, qué lástima." #: lang/json/mission_def_from_json.py msgid "Picky Meals" -msgstr "" +msgstr "Quisquilloso" #. ~ Description for mission '{'str': 'Picky Meals'}' #: lang/json/mission_def_from_json.py msgid "Find 100 salt." -msgstr "" +msgstr "Encontrar 100 unidades de sal." #: lang/json/mission_def_from_json.py msgid "I need a supply of salt." -msgstr "" +msgstr "Necesito suministro de sal." #: lang/json/mission_def_from_json.py msgid "" @@ -136890,46 +143297,53 @@ msgid "" " just need it as a seasoning, it's also vital for food preservation. Could " "you find about 20 pounds of salt for me?" msgstr "" +"Ya sé que no suena muy importante, pero me estoy quedando sin sal. No " +"solamente la necesitamos para condimentar, también es vital para la " +"conservación de comida. ¿Podrías conseguirme unos 10 kilos de sal?" #: lang/json/mission_def_from_json.py msgid "Don't forget to tell me when you have them." -msgstr "" +msgstr "No te olvides de avisarme cuando la consigas." #: lang/json/mission_def_from_json.py msgid "It's okay, I can do without them. Just let me know if you reconsider." -msgstr "" +msgstr "Está bien, no es tan importante. Pero avisame si te arrepentís." #: lang/json/mission_def_from_json.py msgid "" "There's a lot of places to look. They are common in house kitchens, " "restaurants or grocery stores." msgstr "" +"Hay muchos lugares para buscar. Es común que haya en las cocinas de las " +"casas, restoranes y almacenes." #: lang/json/mission_def_from_json.py msgid "How is the search going? Have you found 'em?" -msgstr "" +msgstr "¿Cómo va la búsqueda? ¿La conseguiste?" #: lang/json/mission_def_from_json.py msgid "" "I really apreciate your help. Don't worry, you won't leave empty-handed." msgstr "" +"Realmente aprecio tu ayuda. No te preocupes, no te vas a ir con las manos " +"vacías." #: lang/json/mission_def_from_json.py msgid "Don't worry about it, it's not that important." -msgstr "" +msgstr "No te preocupes por eso, no es tan importante." #: lang/json/mission_def_from_json.py msgid "Pickled Meals" -msgstr "" +msgstr "Comidas al Escabeche" #. ~ Description for mission '{'str': 'Pickled Meals'}' #: lang/json/mission_def_from_json.py msgid "Find 5 glass jars." -msgstr "" +msgstr "Encontrar 5 frascos de vidrio." #: lang/json/mission_def_from_json.py msgid "I need several glass jars." -msgstr "" +msgstr "Necesito varios frascos de vidrio." #: lang/json/mission_def_from_json.py msgid "" @@ -136938,48 +143352,57 @@ msgid "" "could do our own canning if we had some more glass jars. I could get by " "with 5 for now." msgstr "" +"Esta tarea es un poco más seria. No tengo los suficientes frascos para " +"preservar la comida perecedera, y no podemos almacenar todo en sal. " +"Podríamos hacer nuestras propias conservas si tuviéramos más frascos de " +"vidrio. Con 5 ya estaríamos bien, por ahora." #: lang/json/mission_def_from_json.py msgid "" "Thanks for accepting this task. It'll take a load off my shoulders. I " "finally won't have to worry about this problem anymore." msgstr "" +"Gracias por aceptar esta tarea. Me sacás un peso de encima. Finalmente no " +"tendré que preocuparme por este problema." #: lang/json/mission_def_from_json.py msgid "Just let me know if you change your mind." -msgstr "" +msgstr "Haceme saber si cambiás de idea." #: lang/json/mission_def_from_json.py msgid "" "Glass jars are not that hard to find. I'd look for them in residental " "areas." msgstr "" +"Los frascos de vidrio no son difíciles de encontrar. Yo los buscaría en las " +"casas." #: lang/json/mission_def_from_json.py msgid "Have you found the jars?" -msgstr "" +msgstr "¿Encontraste los frascos?" #: lang/json/mission_def_from_json.py msgid "" "Thank you for your help. Here's your reward. I have one more task to do." msgstr "" +"Gracias por tu ayuda. Acá está tu recompensa. Tengo otra tarea para hacer." #: lang/json/mission_def_from_json.py msgid "It's not a big deal, it isn't that urgent." -msgstr "" +msgstr "No es gran cosa, no es tan urgente." #: lang/json/mission_def_from_json.py msgid "Prickled Meals" -msgstr "" +msgstr "Comidas Espinosas" #. ~ Description for mission '{'str': 'Prickled Meals'}' #: lang/json/mission_def_from_json.py msgid "Find a butcher knife." -msgstr "" +msgstr "Encontrar cuchillo de carnicero." #: lang/json/mission_def_from_json.py msgid "I need something sharper." -msgstr "" +msgstr "Necesito algo más afilado." #: lang/json/mission_def_from_json.py msgid "" @@ -136987,168 +143410,186 @@ msgid "" "hard without it. It's good to have one, even though I won't use it that " "often. Could you get me one?" msgstr "" +"No tengo ningún cuchillo de carnicero acá. Es difícil cortar algo duro sin " +"uno de esos. Está bueno tener uno, incluso aunque no lo necesite muy " +"seguido. ¿Me podrás conseguir uno?" #: lang/json/mission_def_from_json.py msgid "Thank you for accepting. I can't cut anything with this dull knife." msgstr "" +"Gracias por aceptar. No puedo cortar nada con este cuchillo desafilado." #: lang/json/mission_def_from_json.py msgid "I guess I have to cut them with my steak knife." -msgstr "" +msgstr "Supongo que voy a tener que cortarlos con mi cuchillo para carne." #: lang/json/mission_def_from_json.py msgid "" "Butcher knives are not that rare to find. They are commonly found in " "kitchens." msgstr "" +"Los cuchillos de carnicero no son tan difíciles de conseguir. Comúnmente " +"están en cualquier cocina." #: lang/json/mission_def_from_json.py msgid "Do you have that knife now?" -msgstr "" +msgstr "¿Ya tenés el cuchillo?" #: lang/json/mission_def_from_json.py msgid "I am grateful for the help you've done." -msgstr "" +msgstr "Estoy agradecido por la ayuda que me diste." #: lang/json/mission_def_from_json.py msgid "Busy While Work" -msgstr "" +msgstr "Ocupado en el Trabajo" #. ~ Description for mission '{'str': 'Busy While Work'}' #: lang/json/mission_def_from_json.py msgid "Find 3 mystery novels." -msgstr "" +msgstr "Encontrar 3 novelas de misterio." #: lang/json/mission_def_from_json.py msgid "I'd like to read some mystery novels." -msgstr "" +msgstr "Me gustaría leer unas novelas de misterio." #: lang/json/mission_def_from_json.py msgid "" "Hmm, that would be great! But if you do, please bring more than just one. " "I could read a single novel in a day. Could you get me… 3 mystery novels?" msgstr "" +"Hmm, ¡eso estaría buenísimo! Pero si vas, por favor traeme más de uno. Puedo" +" leer una novela en un día. ¿Podrías traerme… 3 novelas de misterio?" #: lang/json/mission_def_from_json.py msgid "Just bring it to me when you have it." -msgstr "" +msgstr "Traémelos cuando los tengas." #: lang/json/mission_def_from_json.py msgid "Nevermind then. I hope you'll change your mind." -msgstr "" +msgstr "Entonces no importa. Espero que cambies de idea." #: lang/json/mission_def_from_json.py msgid "I'd loot libraries and bookstores." -msgstr "" +msgstr "Yo buscaría en bibliotecas y librerías." #: lang/json/mission_def_from_json.py msgid "So, have you found the books?" -msgstr "" +msgstr "¿Y? ¿Encontraste los libros?" #: lang/json/mission_def_from_json.py msgid "" "Thank you. This will keep me busy for a while. Please take this as a token" " of my gratitude." msgstr "" +"Gracias. Esto me va a tener entretenido por un tiempo. Por favor, aceptá " +"esto como una muestra de mi gratitud." #: lang/json/mission_def_from_json.py msgid "Could you give them to me?" -msgstr "" +msgstr "¿Me los podés dar?" #: lang/json/mission_def_from_json.py msgid "Fine. I can read something else." -msgstr "" +msgstr "Bien. Puedo leer otras cosas." #: lang/json/mission_def_from_json.py msgid "Timber!" -msgstr "" +msgstr "¡Guarda con el árbol!" #. ~ Description for mission '{'str': 'Timber!'}' #: lang/json/mission_def_from_json.py msgid "Bring five logs." -msgstr "" +msgstr "Traer cinco troncos." #: lang/json/mission_def_from_json.py msgid "I need 5 logs for fences." -msgstr "" +msgstr "Necesito 5 troncos para hacer vallas." #: lang/json/mission_def_from_json.py msgid "" "I need to build fences and ditches around my rabbits. Could you find about…" " five logs for me?" msgstr "" +"Necesito construir vallas y zanjas alrededor de mis conejos. ¿Podrías " +"traerme unos… cinco troncos?" #: lang/json/mission_def_from_json.py msgid "There's a lot of places to look. Trees are pretty common." -msgstr "" +msgstr "Hay muchos lugares para buscar. Los árboles son bastante comunes." #: lang/json/mission_def_from_json.py msgid "How is the search going? Have you found'em?" -msgstr "" +msgstr "¿Cómo va la búsqueda? ¿Los conseguiste?" #: lang/json/mission_def_from_json.py msgid "" "I really appreciate your help. Don't worry, you won't leave empty-handed." msgstr "" +"Realmente aprecio tu ayuda. No te preocupes, no te vas a ir con las manos " +"vacías." #: lang/json/mission_def_from_json.py msgid "Sweets" -msgstr "" +msgstr "Golosinas" #. ~ Description for mission '{'str': 'Sweets'}' #: lang/json/mission_def_from_json.py msgid "Find 25 blackberries." -msgstr "" +msgstr "Encontrar 25 zarzamoras." #: lang/json/mission_def_from_json.py msgid "I need 25 blackberries." -msgstr "" +msgstr "Necesito 25 zarzamoras." #: lang/json/mission_def_from_json.py msgid "Fruits would let me break the monotony of grains and meats." msgstr "" +"Las frutas me van a permitir romper la monotonía de los granos y las carnes." #: lang/json/mission_def_from_json.py msgid "" "Thanks for accepting this task. Otherwise I might kill a stranger for some " "oranges. Just kidding." msgstr "" +"Gracias por aceptar esta tarea. De otra manera, podría matar a un extraño " +"por algunas naranjas. Es un chiste." #: lang/json/mission_def_from_json.py msgid "Find someone growing berries or an orchard." -msgstr "" +msgstr "Buscá algunos arbustos o un huerto de árboles." #: lang/json/mission_def_from_json.py msgid "Have you found the fruit?" -msgstr "" +msgstr "¿Encontraste la fruta?" #: lang/json/mission_def_from_json.py msgid "Thank you for your help. Here's your reward." -msgstr "" +msgstr "Gracias por tu ayuda. Acá está tu recompensa." #: lang/json/mission_def_from_json.py msgid "Return Barry to Eddie at the dairy." -msgstr "" +msgstr "Llevar a Barry con Eddie en el tambo." #: lang/json/mission_def_from_json.py msgid "I just want to go home." -msgstr "" +msgstr "Solo quiero irme a casa." #: lang/json/mission_def_from_json.py msgid "I can't believe you are here, please take me back to the ranch." msgstr "" +"No puedo creer que estés acá, por favor, llevame de nuevo a la granja." #: lang/json/mission_def_from_json.py msgid "Thank you, I thought I was dead." -msgstr "" +msgstr "Gracias, pensé que estaba muerto." #: lang/json/mission_def_from_json.py msgid "Please god no!" -msgstr "" +msgstr "¡Por favor, Dios, no!" #: lang/json/mission_def_from_json.py msgid "We shouldn't stay here too long, more might show up." -msgstr "" +msgstr "No tendríamos que quedarnos mucho tiempo acá, podrían venir más." #: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "How much further?" @@ -137159,81 +143600,91 @@ msgid "" "Thanks, we'll never be able to repay you, Here's a token of my gratitude, I " "made these suits for my family and always keep a few extra around." msgstr "" +"Gracias, nunca te lo voy a poder pagar. Acá hay una muestra de mi gratitud, " +"hice estos trajes para mi familia y siempre tengo unos de más." #: lang/json/mission_def_from_json.py msgid "I don't feel saved…" -msgstr "" +msgstr "No me siento rescatado…" #: lang/json/mission_def_from_json.py msgid "Tell my family that I love them…" -msgstr "" +msgstr "Decile a mi familia que los amo…" #: lang/json/mission_def_from_json.py msgid "Find an anvil" -msgstr "" +msgstr "Encontrar un yunque" #: lang/json/mission_def_from_json.py msgid "I need an anvil to do advanced metal work." -msgstr "" +msgstr "Necesito un yunque para hacer trabajo de herrería más complejo." #: lang/json/mission_def_from_json.py msgid "I could really use an anvil." -msgstr "" +msgstr "Me vendría bien un yunque." #: lang/json/mission_def_from_json.py msgid "You might be able to find one in a hardware store or similar." -msgstr "" +msgstr "Podrías encontrar uno en alguna ferretería o negocio similar." #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we'll find the time to make it ourselves." msgstr "" +"Igual, gracias, vamos a intentar tomarnos el tiempo para hacerlo nosotros." #: lang/json/mission_def_from_json.py msgid "If you can't find one, maybe you can make one for me." -msgstr "" +msgstr "Si no podés encontrar uno, tal vez puedas fabricarme uno." #: lang/json/mission_def_from_json.py msgid "Do you have the anvil?" -msgstr "" +msgstr "¿Tenés el yunque?" #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, this will really make a difference, here's some horse armor" " I've been working on. Eventually I'll have the whole herd outfitted." msgstr "" +"Te lo agradezco, esto va a hacer la diferencia. Acá tenés armadura de " +"caballo que estuve haciendo. Eventualmente, voy a poder tener toda la manada" +" equipada." #: lang/json/mission_def_from_json.py msgid "What good does this do me?" -msgstr "" +msgstr "¿Para qué me sirve esto?" #: lang/json/mission_def_from_json.py msgid "Find Chris Isherwood" -msgstr "" +msgstr "Encontrar a Chris Isherwood" #: lang/json/mission_def_from_json.py msgid "" "Chris hasn't come back from his latest search for Barry, I'm getting " "concerned." msgstr "" +"Chris no volvió de la última vez que fue a buscar a Barry, me está " +"preocupando." #: lang/json/mission_def_from_json.py msgid "Can you go find my son and tell him to check in with us." -msgstr "" +msgstr "¿Podrías ir a buscar a mi hijo y decirle que se comunique?" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "Gracias. " #: lang/json/mission_def_from_json.py msgid "Oh well. I hope he turns up soon." -msgstr "" +msgstr "Oh, bueno. Espero que vuelva pronto." #: lang/json/mission_def_from_json.py msgid "" "He might be on the property somewhere, maybe by that old cabin near the " "entrance, sometimes he camps there." msgstr "" +"Puede estar en algún lugar de la propiedad, tal vez cerca de esa cabaña en " +"la entrada, a veces hace campamento por ahí." #: lang/json/mission_def_from_json.py msgid "How is the search going?" @@ -137244,42 +143695,50 @@ msgid "" "Thanks, I was getting ready to go look myself. Now that I have the anvil, " "I've been working on new armor for the horses, take this prototype I made." msgstr "" +"Gracias, ya estaba por ir yo mismo. Ahora que tengo el yunque, estuve " +"trabajando en una nueva armadura para los caballos, llevate este prototipo " +"que hice." #: lang/json/mission_def_from_json.py msgid "I hope he didn't meet Barry's fate…" -msgstr "" +msgstr "Espero que no le haya pasado lo mismo que a Barry…" #: lang/json/mission_def_from_json.py msgid "Free Barry from the mysterious structure" -msgstr "" +msgstr "Liberar a Barry de esa misteriosa estructura" #: lang/json/mission_def_from_json.py msgid "" "We need to investigate the alien encampment and try to find out what " "happened to Barry." msgstr "" +"Necesitamos investigar ese campamento alienígena e intentar encontrar qué le" +" pasó a Barry." #: lang/json/mission_def_from_json.py msgid "I can take you to the structure, I tracked them to it." -msgstr "" +msgstr "Te puedo llevar hasta la estructura, los pude rastrear." #: lang/json/mission_def_from_json.py msgid "Awesome, I want some answers!" -msgstr "" +msgstr "¡Genial, quiero respuestas!" #: lang/json/mission_def_from_json.py msgid "Thanks anyway, I'll keep my eye on it, maybe I'll find a way one day." msgstr "" +"Gracias igual, voy a seguir prestando atención, tal vez encuentre una manera" +" alguna vez." #: lang/json/mission_def_from_json.py msgid "" "I feel like we are underprepared if they see us, I marked the location for " "you." msgstr "" +"Siento que no estamos preparados si nos ven, marqué el lugar para vos." #: lang/json/mission_def_from_json.py msgid "You ready?" -msgstr "" +msgstr "¿Estás listo?" #: lang/json/mission_def_from_json.py msgid "" @@ -137287,147 +143746,174 @@ msgid "" "for my family before we left. If we survive, the cabin should be fixed up " "and ready for you to move in if you want to stay." msgstr "" +"Es más alto de lo que recuerdo, deberíamos buscar prisioneros. Dejé una nota" +" para mi familia antes de salir. Si sobrevivimos, la cabaña debería ser " +"arreglada para que te puedas mudar si querés quedarte." #: lang/json/mission_def_from_json.py msgid "Well it was here…" -msgstr "" +msgstr "Bueno, estaba acá…" #: lang/json/mission_def_from_json.py msgid "Gather 50 dandelions" -msgstr "" +msgstr "Recolectar 50 dientes de león" #: lang/json/mission_def_from_json.py msgid "I could use some help foraging ingredients." -msgstr "" +msgstr "Me vendría bien un poco ayuda recolectando ingredientes." #: lang/json/mission_def_from_json.py msgid "" "I could use some fresh dandelions for the next batch of wine. Can you bring" " me 50 dandelions?" msgstr "" +"Me vendrían bien unos dientes de león frescos para la siguiente tanda de " +"vino. ¿Me podrías traer 50 dientes de león?" #: lang/json/mission_def_from_json.py msgid "Thank you, I'll put these to good use." -msgstr "" +msgstr "Gracias, les voy a dar un buen uso." #: lang/json/mission_def_from_json.py msgid "Oh well. Maybe some other time, thanks." -msgstr "" +msgstr "Ah, bueno. Tal vez en otro momento, gracias." #: lang/json/mission_def_from_json.py msgid "You can find them in the fields during the spring and summer months." msgstr "" +"Podrías encontrarlas en los campos durante los meses de primavera y verano." #: lang/json/mission_def_from_json.py msgid "Thanks. Here's a small reward to show my appreciation for your help." msgstr "" +"Gracias. Acá tenés una pequeña recompensa como muestra de mi agradecimiento " +"por tu ayuda." #: lang/json/mission_def_from_json.py msgid "I wonder if the wildlife ate all the greens…" -msgstr "" +msgstr "Me pregunto si los animales se habrán comido todo lo verde…" #: lang/json/mission_def_from_json.py msgid "Find 20 bee balm seeds" -msgstr "" +msgstr "Encontrar 20 semillas de monarda" #: lang/json/mission_def_from_json.py msgid "I could use some seeds from the forest." -msgstr "" +msgstr "Me vendrían bien unas semillas del bosque." #: lang/json/mission_def_from_json.py msgid "" "We could use some seeds for the next planting season. Can you bring me 20 " "bee balm seeds?" msgstr "" +"Nos vendrían bien unas semillas para la próxima temporada de siembra. ¿Me " +"podrías traer 20 semillas de monarda?" #: lang/json/mission_def_from_json.py msgid "" "Thank you. It's important to have a good stock before the flu season hits." msgstr "" +"Gracias. Es importante tener un buen suministro antes de que empiece la " +"temporada de gripe." #: lang/json/mission_def_from_json.py msgid "" "You should search through the forest, make sure to check in the underbrush " "for beebalm and then harvest its seeds." msgstr "" +"Deberías buscar en el bosque, y asegurarte de buscar entre la maleza para " +"encontrar monardas y recolectar sus semillas." #: lang/json/mission_def_from_json.py msgid "" "Wow, perfect. Here are some of my own remedies and if those don't work try " "my other gift." msgstr "" +"Wow, perfecto. Acá tenés algunos remedios míos y si esos no te funcionan, " +"probá con mi otro regalo." #: lang/json/mission_def_from_json.py msgid "I'll have to find someone more at home in the forest…" -msgstr "" +msgstr "Voy a tener que buscar otra persona que se sienta mejor en el bosque…" #: lang/json/mission_def_from_json.py msgid "Find and capture a cat" -msgstr "" +msgstr "Encontrar y capturar un gato" #: lang/json/mission_def_from_json.py msgid "I could use a barn cat to keep the mice down." -msgstr "" +msgstr "Me vendría bien un gato para controlar a los ratones." #: lang/json/mission_def_from_json.py msgid "" "I saw some feral cats out by the old cabin. Can you capture one for me?" msgstr "" +"Vi algunos gatos salvajes cerca de la vieja cabaña. ¿Podrás capturar uno " +"para mí?" #: lang/json/mission_def_from_json.py msgid "" "Thank you! Please hurry back! Take this cage so you have a chance of " "capturing one." msgstr "" +"¡Gracias! ¡Por favor, apurate! Llevate esta jaula así lo podés capturar." #: lang/json/mission_def_from_json.py msgid "I didn't want to use chemicals on these rats." -msgstr "" +msgstr "No quise usar químicos en estas ratas." #: lang/json/mission_def_from_json.py msgid "" "Take this pet carrier; if you can get close to a cat, you can put it inside." " If you're having problems, try befriending it with cat food." msgstr "" +"Llevate este transportador para mascota, si te podés acercar a un gato, " +"podés ponerlo adentro. Si tenés problemas, tratá de acercarte con comida " +"para gato." #: lang/json/mission_def_from_json.py msgid "Have you found a cat?" -msgstr "" +msgstr "¿Encontraste un gato?" #: lang/json/mission_def_from_json.py msgid "" "Thank you so much, I want you to have this copy of my natural remedy " "journal. I'll name this handsome fellow Joshua." msgstr "" +"Muchas gracias, quiero que tengas esta copia de mi cuaderno de remedios " +"naturales. A este bonito le voy a poner Joshua." #: lang/json/mission_def_from_json.py msgid "What?! You're lying, I can tell! Did you even bring back my cage?" msgstr "" +"¡¿Qué?! ¡Estás mintiendo, me doy cuenta! ¿Por lo menos me trajiste la jaula?" #: lang/json/mission_def_from_json.py msgid "Oh no! I guess they are too nimble for you…" -msgstr "" +msgstr "¡Oh, no! Supongo que son demasiado rápidos para vos…" #: lang/json/mission_def_from_json.py msgid "Gather 120 Rocks" -msgstr "" +msgstr "Recolectar 120 piedras" #: lang/json/mission_def_from_json.py msgid "We need to build some kilns." -msgstr "" +msgstr "Necesitamos construir algunas fosas de carbonización." #: lang/json/mission_def_from_json.py msgid "I could use 120 rocks to construct some kilns." msgstr "" +"Podría usar 120 piedras para construir algunas fosas de carbonización." #: lang/json/mission_def_from_json.py msgid "" "You can break up some larger stones, or gather them up from the fields." -msgstr "" +msgstr "Podés romper algunas piedras grandes, o juntarlas de los campos." #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we'll find the time to get them ourselves." msgstr "" +"Gracias, igual. Vamos a hacernos un tiempo para ir a recolectarlas nosotros." #: lang/json/mission_def_from_json.py msgid "Mining would always be an option if you had the resources." @@ -137439,173 +143925,201 @@ msgstr "¿Ya tenés la piedra?" #: lang/json/mission_def_from_json.py msgid "I appreciate it, this will make Luke happy." -msgstr "" +msgstr "Te lo agradezco, esto va a poner feliz a Luke." #: lang/json/mission_def_from_json.py msgid "Gather 2000 units of sand" -msgstr "" +msgstr "Recolectar 2000 unidades de arena" #: lang/json/mission_def_from_json.py msgid "I do have some resource gathering I could use help with." msgstr "" +"Tengo una tarea de recolección de materiales en la que me podrías ayudar." #: lang/json/mission_def_from_json.py msgid "" "Now that the forge is set up, we could use 2000 units of sand to get " "production going." msgstr "" +"Ahora que la forja ya está puesta, necesitaríamos 2000 unidades de arena " +"para comenzar la producción." #: lang/json/mission_def_from_json.py msgid "Oh well. I'll try to find time to get it myself, thanks." msgstr "" +"Ah, bueno. Voy a intentar hacerme el tiempo para buscarla yo mismo, gracias." #: lang/json/mission_def_from_json.py msgid "" "You can find it along river banks, or maybe landscaping supplies and " "hardware stores." msgstr "" +"Podés encontrar en las orillas de los ríos, o tal vez en los negocios de " +"paisajismo o en ferreterías." #: lang/json/mission_def_from_json.py msgid "Thanks, now Luke can get started. Here's a token of my thanks." msgstr "" +"Gracias, ahora Luke puede empezar. Acá está mi muestra de agradecimiento." #: lang/json/mission_def_from_json.py msgid "I wonder where all the sand went…" -msgstr "" +msgstr "Me pregunto qué habrá pasado con toda la arena…" #: lang/json/mission_def_from_json.py msgid "Gather 1000 units of clay" -msgstr "" +msgstr "Recolectar 2000 unidades de arcilla" #: lang/json/mission_def_from_json.py msgid "I do have some resource gathering I could use help if you have time." msgstr "" +"Tengo una tarea de recolección de materiales en la que necesito ayuda si " +"tenés tiempo." #: lang/json/mission_def_from_json.py msgid "" "Now that the clay kiln is set up, we could use 1000 units of clay to get " "production going." msgstr "" +"Ahora que la fosa de carbonización está puesta, necesitaríamos 1000 unidades" +" de arcilla para comenzar la producción." #: lang/json/mission_def_from_json.py msgid "" "You can find it along river banks, or maybe look for deposits in the forest." msgstr "" +"Podés encontrar en las orillas de los ríos, o tal vez en pequeños " +"yacimientos en el bosque." #: lang/json/mission_def_from_json.py msgid "" "Thanks, now Luke can get started making jugs, We'd like to give you a cow, " "Here's Daisy, take good care of her and she'll provide you with milk." msgstr "" +"Gracias, ahora Luke puede empezar a hacer jarros. Nos gustaría darte una " +"vaca, acá está Daisy. Cuidala bien y ella te va a brindar su leche." #. ~ Nickname for creature 'mon_cow' #: lang/json/mission_def_from_json.py msgid "Daisy" -msgstr "" +msgstr "Daisy" #: lang/json/mission_def_from_json.py msgid "Find 10 3L jars" -msgstr "" +msgstr "Encontrar 10 frascos de 3L" #: lang/json/mission_def_from_json.py msgid "I could use some help scavenging." -msgstr "" +msgstr "Necesitaría ayuda buscando cosas." #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" +"Nos vendrían bien algunos frascos de 3 litros parar preservar nuestra " +"producción. ¿Podrías traerme 10 frascos grandes de tres litros? Te voy a dar" +" unas conservas a cambio." #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve foods while we can." -msgstr "" +msgstr "Gracias. Es importante poder preservar la comida mientras podamos." #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another way, thanks." -msgstr "" +msgstr "Ah, bueno. Voy a ver si encuentro otra manera, gracias." #: lang/json/mission_def_from_json.py msgid "Grocery stores, house kitchens, there's plenty of places to look." msgstr "" +"En los mercados, las cocinas de las casas, hay muchos lugares donde " +"buscarlos." #: lang/json/mission_def_from_json.py msgid "Wow, perfect. Thanks. Here's your reward." -msgstr "" +msgstr "Wow, perfecto. Gracias. Acá está tu recompensa." #: lang/json/mission_def_from_json.py msgid "I wonder where all the jars went…" -msgstr "" +msgstr "Me pregunto qué habrá pasado con todos los frascos…" #: lang/json/mission_def_from_json.py msgid "Find 100 wheat seeds" -msgstr "" +msgstr "Encontrar 20 semillas de trigo" #: lang/json/mission_def_from_json.py msgid "I do have some more scavenging for you." -msgstr "" +msgstr "Tengo una tarea para que me vayas a buscar algo." #: lang/json/mission_def_from_json.py msgid "" "We could use some seeds for the next planting season. Can you bring me 100 " "wheat seeds? I'll give you some fresh produce." msgstr "" +"Nos vendrían bien unas semillas para la próxima temporada de siembra. ¿Me " +"podrías traer 100 semillas de trigo? Te voy a dar producción fresca a " +"cambio." #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve healthy foods while we can." -msgstr "" +msgstr "Gracias. Es importante tener comida saludable mientras podamos." #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another supplier, thanks." -msgstr "" +msgstr "Ah, bueno. Voy a ver si encuentro otro que me ayude, gracias." #: lang/json/mission_def_from_json.py msgid "I wonder where all the seeds went…" -msgstr "" +msgstr "Me pregunto qué habrá pasado con todas las semillas…" #: lang/json/mission_def_from_json.py msgid "Kill monster" -msgstr "" +msgstr "Matar monstruo" #: lang/json/mission_def_from_json.py msgid "We could use some help killing some wolves." -msgstr "" +msgstr "Nos vendría bien un poco de ayudar para matar unos lobos." #: lang/json/mission_def_from_json.py msgid "" "There's been some wolves that keep scaring our chickens and horses, I'd be " "grateful if you can kill them." msgstr "" +"Hay unos lobos que están asustando a nuestras gallinas y caballos, estaría " +"agradecido si los podés matar." #: lang/json/mission_def_from_json.py msgid "Wonderful, let me know when it is done." -msgstr "" +msgstr "Maravilloso, avisame cuando ya lo hayas hecho." #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we will try some traps." -msgstr "" +msgstr "Gracias, igual, vamos a probar con unas trampas." #: lang/json/mission_def_from_json.py msgid "A gun will probably help." -msgstr "" +msgstr "Un arma te podría ayudar." #: lang/json/mission_def_from_json.py msgid "Did you kill it?" -msgstr "" +msgstr "¿Lo mataste?" #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, I've got this old saddle I want you to have. I'll be happy" " to put a horse under it if you want to do some more heroics." msgstr "" +"Te lo agradezco, tengo esta vieja montura que me gustaría darte. Me pondría " +"contento poner un caballo abajo de ella si estás interesado en hacer algunos" +" actos heroicos más." #: lang/json/mission_def_from_json.py msgid "Show me the bodies." -msgstr "" +msgstr "Mostrame los cadáveres." #: lang/json/mission_def_from_json.py msgid "We could use some help killing some monsters." -msgstr "" +msgstr "Nos vendría bien un poco de ayuda para matar unos monstruos." #: lang/json/mission_def_from_json.py msgid "" @@ -137613,47 +144127,59 @@ msgid "" "are, but they're very fast, I'm willing to outfit you with a horse if you " "succeed." msgstr "" +"Nos vendría bien un poco de ayuda para matar una horda de monstruos. No sé " +"dónde están pero son muy rápidos, estoy dispuesto a darte un caballo si " +"lográs tener éxito." #: lang/json/mission_def_from_json.py msgid "Be ready for anything." -msgstr "" +msgstr "Preparate para cualquier cosa." #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, this will help keep our animals safe. This is, Steve, he's" " a good, steady horse. You should talk to Carlos about some armor for him." msgstr "" +"Te lo agradecería, esto nos ayudará a mantener seguros a los animales. Este " +"es Steve, es un caballo bueno y tranquilo. Tendrías que hablar con Carlos " +"para conseguirle armadura al caballo." #. ~ Nickname for creature 'mon_horse' #: lang/json/mission_def_from_json.py msgid "Steve" -msgstr "" +msgstr "Steve" #: lang/json/mission_def_from_json.py msgid "Find The Art of Glassblowing book" -msgstr "" +msgstr "Encontrar el libro El Arte de Soplar Vidrio" #: lang/json/mission_def_from_json.py msgid "I need more knowledge to get the glass blowing started." msgstr "" +"Necesito más conocimiento para poder comenzar con la producción de vidrio " +"soplado." #: lang/json/mission_def_from_json.py msgid "" "I could really use a book on glass blowing. With the internet gone, I don't" " have any handy references." msgstr "" +"Me vendría bien un libro sobre el arte de soplar vidrio. Ahora que no hay " +"internet no tengo material a mano." #: lang/json/mission_def_from_json.py msgid "Fantastic, I'm not supposed to leave our land." -msgstr "" +msgstr "Fantástico, se supone que yo no tengo que salir de acá." #: lang/json/mission_def_from_json.py msgid "Oh well, figured I'd have to do a lot of practice anyway." -msgstr "" +msgstr "Ah, bueno, igual voy a tener que hacer un montón de práctica." #: lang/json/mission_def_from_json.py msgid "A library, bookstore or a glass blower's studio should have one." msgstr "" +"Una biblioteca, una librería o un taller de un soplador de vidrio deberían " +"tener uno de esos." #: lang/json/mission_def_from_json.py msgid "Do you have the book?" @@ -137661,33 +144187,37 @@ msgstr "¿Ya conseguiste el libro?" #: lang/json/mission_def_from_json.py msgid "I appreciate it, this will make my life so much easier." -msgstr "" +msgstr "Te lo agradezco, esto facilitará mucho mi vida." #: lang/json/mission_def_from_json.py msgid "I don't see a book…?" -msgstr "" +msgstr "No veo un libro…" #: lang/json/mission_def_from_json.py msgid "At least you escaped with your life…" -msgstr "" +msgstr "Por lo menos, escapaste con vida…" #: lang/json/mission_def_from_json.py msgid "Find a copy of DIY Compendium" -msgstr "" +msgstr "Encontrar una copia del Compendio Hágalo Usted Mismo" #: lang/json/mission_def_from_json.py msgid "I need more knowledge to get better pottery." -msgstr "" +msgstr "Necesito más conocimiento para poder hacer mejor alfarería." #: lang/json/mission_def_from_json.py msgid "" "I could really use the book, DIY Compendium. With the internet gone, I " "don't have any handy references." msgstr "" +"Me vendría bien el libro, Compendio Hágalo Usted Mismo. Ahora que no hay " +"internet no tengo material a mano." #: lang/json/mission_def_from_json.py msgid "A library, bookstore should have one, schools are another good idea." msgstr "" +"Una biblioteca, una librería deberían tener uno, las escuelas podrían ser " +"otro lugar." #: lang/json/mission_def_from_json.py msgid "Locate Commo Team" @@ -137695,7 +144225,7 @@ msgstr "Localizar Eq. de Comunicaciones" #: lang/json/mission_def_from_json.py msgid "We need help…" -msgstr "" +msgstr "Necesitamos ayuda…" #: lang/json/mission_def_from_json.py msgid "" @@ -137723,6 +144253,8 @@ msgid "" "I don't know why you would bother wasting your time down here if you can't " "handle a few small tasks…" msgstr "" +"No sé por qué te tendrías que molestar en perder el tiempo acá abajo si no " +"podés encargarte de unas pequeñas tareas…" #: lang/json/mission_def_from_json.py msgid "We were briefed that the communications array was on this level." @@ -137924,13 +144456,15 @@ msgstr "Llegar al Centro de Refugiados" #: lang/json/mission_def_from_json.py msgid "Bring 40 small cardboard boxes" -msgstr "" +msgstr "Traer 40 cajitas de cartón" #: lang/json/mission_def_from_json.py msgid "" "Gotta start small right? Little ones for keeping little things safe. I " "could use 'em." msgstr "" +"¿Hay que empezar de abajo, no? Cajitas para poner cosas chiquitas. Me " +"vendrían bien." #: lang/json/mission_def_from_json.py msgid "" @@ -137938,77 +144472,88 @@ msgid "" "could use 'em. I need a bunch of 'em. Little ones, you know? Can you " "bring me like… like… forty?" msgstr "" +"¿Hay que empezar de abajo, no? Cajitas para poner cosas chiquitas. Me " +"vendrían bien. Necesito muchas. Chiquitas, ¿eh? ¿Me podrías traer unas… " +"cuarenta?" #: lang/json/mission_def_from_json.py msgid "Oh man, thanks so much my friend. You won't regret it." -msgstr "" +msgstr "Uh, chabón, muchas gracias. No te vas a arrepentir." #: lang/json/mission_def_from_json.py msgid "I didn't think so." -msgstr "" +msgstr "No me parece." #: lang/json/mission_def_from_json.py msgid "Watch out, he's looking for it too." -msgstr "" +msgstr "Cuidado, él también las está buscando." #: lang/json/mission_def_from_json.py msgid "Got the little ones yet?" -msgstr "" +msgstr "¿Conseguiste las cajitas ya?" #: lang/json/mission_def_from_json.py msgid "Oh this is so great, so great!" -msgstr "" +msgstr "¡Uh, esto es genial, genial!" #: lang/json/mission_def_from_json.py msgid "Oh, that's too bad. Guess they're eating it all." -msgstr "" +msgstr "Uh, qué mal. Supongo que se las están comiendo todas." #: lang/json/mission_def_from_json.py msgid "Bring a roll of duct tape" -msgstr "" +msgstr "Traer un rollo de cinta adhesiva" #: lang/json/mission_def_from_json.py msgid "" "These ones are good, good ones. They need something to, you know, bind them" " together. Surround them, light side, dark side." msgstr "" +"Estos están buenos, buenos. Necesitan algo para, ya sabés, mantenerlos " +"unidos. Rodearlos, lado de luz, lado oscuro." #: lang/json/mission_def_from_json.py msgid "" "These ones are good, good ones. They need something to, you know, bind them" " together. Surround them, light side, dark side. Bring me the Force!" msgstr "" +"Estos están buenos, buenos. Necesitan algo para, ya sabés, mantenerlos " +"unidos. Rodearlos, lado de luz, lado oscuro.¡Traeme la Fuerza!" #: lang/json/mission_def_from_json.py msgid "It's all around us… but did you get it in a crude matter form?" -msgstr "" +msgstr "Está a nuestro alrededor… pero ¿la conseguiste en forma cruda?" #: lang/json/mission_def_from_json.py msgid "Bring 10 medium-sized cardboard boxes" -msgstr "" +msgstr "Traer 10 cajas medianas de cartón" #: lang/json/mission_def_from_json.py msgid "" "Ten bigger ones now please. The list doesn't lie. You've done so well." msgstr "" +"Diez de las grandes ahora, por favor. La lista no miente. Lo hiciste muy " +"bien." #: lang/json/mission_def_from_json.py msgid "" "Ten bigger ones now please. The list doesn't lie. You've done so well. I " "got a little more on the list, but we're more than half there." msgstr "" +"Diez de las grandes ahora, por favor. La lista no miente. Lo hiciste muy " +"bien. Tengo un poco más en la lista pero vamos por un poco más de la mitad." #: lang/json/mission_def_from_json.py msgid "Any luck? Bigger ones?" -msgstr "" +msgstr "¿Tuviste suerte? ¿De las grandes?" #: lang/json/mission_def_from_json.py msgid "I'm so happy now!" -msgstr "" +msgstr "¡Soy tan feliz!" #: lang/json/mission_def_from_json.py msgid "Bring 10 large plastic sheets" -msgstr "" +msgstr "Traer 10 láminas grandes de plástico" #: lang/json/mission_def_from_json.py msgid "" @@ -138035,29 +144580,31 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "We're almost there, now." -msgstr "" +msgstr "Casi que terminamos, ahora." #: lang/json/mission_def_from_json.py msgid "They keep a lot of this stuff in hardware stores and lumber yards." -msgstr "" +msgstr "Guardan muchas de estas cosas en las ferreterías y las madereras." #: lang/json/mission_def_from_json.py msgid "" "I really feel bad sending you on this one, it's dangerous. Have you found " "anything?" msgstr "" +"Me siento un poco mal mandándote a hacer esto, es peligroso. ¿Encontraste " +"algo?" #: lang/json/mission_def_from_json.py msgid "Nice, this will do perfectly!" -msgstr "" +msgstr "¡Bien, esto va a andar perfecto!" #: lang/json/mission_def_from_json.py msgid "Oh, that's too bad." -msgstr "" +msgstr "Uh, qué mal." #: lang/json/mission_def_from_json.py msgid "Bring 5 large cardboard boxes" -msgstr "" +msgstr "Traer 5 cajas grandes de cartón" #: lang/json/mission_def_from_json.py msgid "" @@ -138065,6 +144612,9 @@ msgid "" "parts myself, it's been easier with more cardboard around. Can you bring me" " five more really big cardboard boxes?" msgstr "" +"Esto es lo último que necesito. Estuve juntando otras partes, es más fácil " +"con más cartón alrededor. ¿Me podrías traer cinco más de las cajas bien " +"grandes?" #: lang/json/mission_def_from_json.py msgid "" @@ -138073,32 +144623,38 @@ msgid "" " five more really big cardboard boxes? Five more cardboard boxes, as big as" " it gets. I have a few already stored up, that should be all I need." msgstr "" +"Esto es lo último que necesito. Estuve juntando otras partes, es más fácil " +"con más cartón alrededor. ¿Me podrías traer cinco más de las cajas bien " +"grandes? Cinco cajas más de cartón, tan grandes como haya. Ya tengo algunas " +"guardadas, eso sería todo lo que necesito." #: lang/json/mission_def_from_json.py msgid "Yes! The home stretch!" -msgstr "" +msgstr "¡Sí! ¡La casa se agranda!" #: lang/json/mission_def_from_json.py msgid "Oh man, but we're so close!" -msgstr "" +msgstr "¡Uh, chabón, pero ya estamos por terminar!" #: lang/json/mission_def_from_json.py msgid "Try looking in cargo storage areas." -msgstr "" +msgstr "Fijate buscando en los lugares de almacenamiento." #: lang/json/mission_def_from_json.py msgid "Did you bring me those last few boxes?" -msgstr "" +msgstr "¿Me trajiste esas últimas cajas?" #: lang/json/mission_def_from_json.py msgid "" "Brilliant! You're a true hero. I'll see if I can find a place to set these" " up now." msgstr "" +"¡Buenísimo! Sos un verdadero héroe. Voy a ver si encuentro un lugar para " +"poner esto ahora." #: lang/json/mission_def_from_json.py msgid "No! Oh god, no, this can't be happening…" -msgstr "" +msgstr "¡No! Por dios, no, esto no puede estar pasando…" #: lang/json/mission_def_from_json.py msgid "Find Dana's family sourdough culture" @@ -139384,6 +145940,87 @@ msgstr "Sí, seguro." msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Hacer 2 Destiladores" @@ -140845,6 +147482,54 @@ msgstr "" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "" @@ -143180,6 +149865,23 @@ msgstr "" "Podés moverte más rápido que la mayoría. Tenés un 15% de bonus sobre la " "velocidad normal a pie." +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -143192,13 +149894,50 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." msgstr "" #: lang/json/mutation_from_json.py @@ -143307,12 +150046,12 @@ msgstr "Sanador/a Veloz" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" -"Tus heridas sanan más rápido cuando dormís y también podés recuperar un poco" -" de PV cuando estás despierto." #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -144045,10 +150784,11 @@ msgstr "Sanador/a Lento/a" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." msgstr "" -"Tus heridas sanan un poco más lento que la mayoría de la gente. Y cuando " -"dormís recuperás menos PV (puntos de vida)." #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -144056,12 +150796,11 @@ msgstr "Poco Sanador/a" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." msgstr "" -"La salud que recuperás mientras dormís se verá muy perjudicada y solo " -"recuperás un tercio de PV." #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -144069,12 +150808,11 @@ msgstr "Sanador/a Imperceptivo/a" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" -"Casi no recuperás nada de salud mientras dormís - sanarás solo un décimo de " -"PV." #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -144913,12 +151651,11 @@ msgstr "Sanador Muy Rápido" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" -"Tu carne se regenera lentamente, y vas a recuperar PV incluso sin estar " -"durmiendo." #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -144926,8 +151663,12 @@ msgstr "Regeneración" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "Tu carne se regenera de sus heridas increíblemente rápido." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -144935,8 +151676,10 @@ msgstr "Sanador Reptiliano" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "Tus miembros rotos se curan solos sin mucha dificultad." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -145923,7 +152666,7 @@ msgstr "Miembros Elásticos" #. ~ Description for {'str': 'Stretchy Limbs'} #: lang/json/mutation_from_json.py msgid "Your limbs seem to have a little more 'give' to them. +1 Dexterity." -msgstr "Tus miembros parecen tener un poco más de elasticidad. Destreza +1." +msgstr "Tus miembros parecen tener un poco más de elasticidad. +1 a Destreza." #: lang/json/mutation_from_json.py msgid "Rubbery Limbs" @@ -148907,8 +155650,7 @@ msgid "Well, maybe you'll just have to make your own world wide web." msgstr "" "Bueno, tal vez tengas que hacer tu propia telaraña informática mundial." -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "Superviviente" @@ -149273,10 +156015,6 @@ msgid "" "you." msgstr "" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "Doctor en Medicina" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -149681,15 +156419,34 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "Historia de Superviviente" +msgid "Survivor: Confused 1" +msgstr "" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -149697,6 +156454,86 @@ msgstr "Historia de Superviviente" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "Historia de Superviviente" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "" @@ -150985,6 +157822,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "" @@ -150993,7 +157852,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -151498,10 +158358,6 @@ msgstr "Solo estoy intentando sobrevivir." msgid "I'm tracking game." msgstr "Estoy rastreando animales." -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "Soldado" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "Barman" @@ -151974,6 +158830,14 @@ msgstr "" msgid "Humans created me. Let's see what I can be on my own." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "" @@ -152243,10 +159107,6 @@ msgstr "Cartonero" msgid "Laborer" msgstr "Peón de campo" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "Leñador" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "Ebanista" @@ -152259,6 +159119,14 @@ msgstr "" msgid "Millyficen Whately" msgstr "" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "" + #: lang/json/npc_from_json.py msgid "magus" msgstr "" @@ -154746,6 +161614,18 @@ msgstr "calle, cámara de inspección" msgid "bridge" msgstr "puente" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "restobar de ruta" @@ -159702,6 +166582,118 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -159870,8 +166862,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -159884,8 +166877,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -161142,6 +168136,226 @@ msgid "" "find some other use." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -162808,7 +170022,7 @@ msgid "build a metalworking forge" msgstr "" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" #: lang/json/recipe_from_json.py @@ -167166,6 +174380,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -169917,102 +177165,6 @@ msgstr "" msgid "I'd kill for a sip of water right now." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" -"Sí, claro, ¡no pude evitar darme cuenta que tenés cerveza! Abramos una y " -"charlemos, , ¿cómo va?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" -"Ah, definitivamente. ¿Qué tal una de esas cervezas que tenés encima? ¿Qué " -"onda vos?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "" -"¡Sí, convidame alguna de esas birras que veo que tenés y podemos conversar " -"todo lo que quieras! Es joda, ¿cómo va, ?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "Ey, dale, , así descanso un rato, ¿cómo andás?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "Sí dale, , ¿cómo va?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "¡Dale, vamos a charlar un rato! ¿Todo bien?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "¿Por qué no? ¿Cómo te va?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "Me parece bien, ¿cómo va?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "Puedo tomarme unos minutos, ¿cómo andan las cosas?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "Dale,, ¿vos bien?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "Bueno, ¿necesitas descargarte sobre algo?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "¡Siempre dispuesto a una buena charla! Pero ¿por qué, estás bien?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "OK, , así nos conocemos un poco más, ¿cómo la vas llevando?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "Definitivamente, buena idea. ¿Cómo te trata esto?" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "maldición" @@ -172479,6 +179631,18 @@ msgstr "" msgid "Was it rough surviving thus far?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -173194,6 +180358,301 @@ msgstr "" msgid " will follow normal engagement rules." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "Me parece bien, ¿cómo va?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "Dale,, ¿vos bien?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "Bueno, ¿necesitas descargarte sobre algo?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "¡Siempre dispuesto a una buena charla! Pero ¿por qué, estás bien?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -174524,6 +181983,14 @@ msgstr "" "casquillo. El texto dice: \"8x40mm sin casquillo de Rivtech. Nada se le " "asemeja.\"" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -174533,6 +182000,21 @@ msgid "" " reads: \"WE ARE HERE TO PROTECT YOU.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -177600,6 +185082,334 @@ msgstr "-style" msgid "-chant" msgstr "-chant" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" +"Es la carne de un animal muy mutado. Tiene una textura perturbadoramente " +"floja y esponjosa, pero el olor... es casi normal. Tiene extraños nudos y " +"formaciones que no parece nada naturales: pedazos de hueso y pelo " +"incrustados en el músculo, como si intentaran formar otro organismo. De " +"todas maneras, para digerible, si lo cocinás y le sacás las peores partes." + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" +"Es un pedazo cocinado de carne de un animal mutante. Tiene una textura " +"perturbadoramente esponjosa, pero el gusto... es bastante normal. Con " +"suerte, ya le pudiste sacar todos los pedazos de pelo y hueso..." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -185990,6 +193800,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "El medio de la nada" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "Celda de Experimentos" @@ -186135,11 +193949,11 @@ msgid "Acolyte." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186174,8 +193988,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186188,11 +194002,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" @@ -186210,11 +194024,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" #: lang/json/talk_topic_from_json.py @@ -186223,7 +194037,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" @@ -186237,10 +194051,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" #: lang/json/talk_topic_from_json.py @@ -186250,7 +194064,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" @@ -186266,8 +194080,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" @@ -186277,15 +194091,21 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" #: lang/json/talk_topic_from_json.py msgid "Yeah, alright." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "" @@ -186295,9 +194115,7 @@ msgid "That is all for now." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." +msgid "There are bones to etch, songs to sing. Wish to join me?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186309,7 +194127,7 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" +msgid "A song may yet be sung by you, should you wish to." msgstr "" #: lang/json/talk_topic_from_json.py @@ -186321,10 +194139,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "Entiendo." @@ -186337,14 +194151,6 @@ msgstr "" msgid "Perhaps another time, Seer." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "" @@ -186353,10 +194159,6 @@ msgstr "" msgid "Not interested." msgstr "No estoy interesado." -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "" @@ -186373,20 +194175,13 @@ msgstr "" msgid "I'm off then." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" @@ -186397,7 +194192,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -186412,11 +194207,6 @@ msgstr "" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "" @@ -186428,14 +194218,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" #: lang/json/talk_topic_from_json.py @@ -186462,6 +194252,14 @@ msgstr "" msgid "Skip it, let's get going." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "Hablemos de los campamentos de bandos." + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "" @@ -186640,7 +194438,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -186801,8 +194599,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186824,7 +194622,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186876,8 +194674,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." -msgstr "No, solo no..." +msgid "No, just no…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Just let me sleep, !" @@ -186888,8 +194686,8 @@ msgid "Make it quick, I want to go back to sleep." msgstr "Hacelo rápido, quiero irme a dormir." #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." -msgstr "Unos minutitos más..." +msgid "Just few minutes more…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Anything to do before I go to sleep?" @@ -186919,11 +194717,11 @@ msgid "no, go back to sleep." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -186935,76 +194733,118 @@ msgid "I want to set some miscellaneous rules." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Can you teach me anything?" -msgstr "¿Me podés enseñar algo?" +msgid "I'd like to know a bit more about your abilities." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's trade items" -msgstr "Vamos a intercambiar objetos" +msgid "There's something I want you to do." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I want you to use this item." +msgid "I just wanted to talk for a bit." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hold on to this item." +msgid "Can you help me understand something? (HELP/TUTORIAL)" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Guard this position." -msgstr "Cuidá esta posición." +msgid "I'm going to go my own way for a while." +msgstr "Voy a seguir mi propio camino por un tiempo." #: lang/json/talk_topic_from_json.py -msgid "I want to assign you to work at this camp." +msgid "Let's go." +msgstr "Vamos." + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." +msgid "Sure, what did you want to say?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "Hablemos de los campamentos de bandos." +msgid "Mind if we just chat for a bit about your history?" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Find a horse and mount up!" +msgid "Let's just chitchat for a while, I could use some relaxation." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Get off your mount, please." +msgid "I changed my mind, wanted to ask you something else." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please go to this location." +msgid "I'm all ears, my friend." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." +msgid "You gonna give me orders?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" +msgid "What would you like?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" +msgid "Just say the word." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." +msgid "Can you teach me anything?" +msgstr "¿Me podés enseñar algo?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's trade items" +msgstr "Vamos a intercambiar objetos" + +#: lang/json/talk_topic_from_json.py +msgid "I want you to use this item." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." +msgid "Hold on to this item." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "Voy a seguir mi propio camino por un tiempo." +msgid "Guard this position." +msgstr "Cuidá esta posición." #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "Vamos." +msgid "I want to assign you to work at this camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Find a horse and mount up!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Get off your mount, please." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please go to this location." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I want you to build a camp here." +msgstr "Quiero que construyas un campamento acá." + +#: lang/json/talk_topic_from_json.py +msgid "We need to abandon this camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Show me what needs to be done at the camp." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about your current activity." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -187162,15 +195002,15 @@ msgstr "" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "No importa." @@ -187375,11 +195215,11 @@ msgid "OVERRIDE: " msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py @@ -187546,10 +195386,6 @@ msgstr "" msgid "Stay at your current position." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "" @@ -187622,62 +195458,6 @@ msgstr "" msgid "Sure thing, I'll make my way there." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "" -"Sí, el calor de este verano me está pegando mal, vamos a descansar un rato, " -"¿cómo andás, ?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "OK, así dejo de cagarme de frío un rato. ¿Cómo va?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -187732,21 +195512,21 @@ msgid "Hello there." msgstr "Hola, ¿qué tal?" #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." -msgstr "Bueno, sin hacer movimientos repentinos..." +msgid "Okay, no sudden movements…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "¡Quedate lejos!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "Este es mi territorio, ." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "Este es mi territorio, ." + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Calmate. No te voy a lastimar." @@ -187799,30 +195579,30 @@ msgstr "¿Qué pasa?" msgid "I don't care." msgstr "No me importa." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "No tengo ningún otro trabajo para vos." - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "No tengo ningún trabajo para vos." #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "" +msgid "I don't have any more jobs for you." +msgstr "No tengo ningún otro trabajo para vos." #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Tengo un trabajo para vos. ¿Querés que te cuente?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Tengo otro trabajo para vos. ¿Querés que te cuente?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Tengo un trabajo para vos. ¿Querés que te cuente?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -187832,6 +195612,10 @@ msgstr "Ah, bueno." msgid "Never mind, I'm not interested." msgstr "No importa, no estoy interesado." +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "¿Cuál trabajo?" @@ -187840,10 +195624,6 @@ msgstr "¿Cuál trabajo?" msgid "What about it?" msgstr "¿Qué te parece?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "¡Yo lo hago!" @@ -188058,6 +195838,10 @@ msgstr "Hmm, bueno." msgid "Thanks!" msgstr "¡Gracias!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "" @@ -188082,17 +195866,13 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "Ah, ok." #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." -msgstr "Hasta que no tenga algún antibiótico, no..." +msgid "Not until I get some antibiotics…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "You asked me recently; ask again later." @@ -188190,23 +195970,23 @@ msgstr "No, vamos a estar bien acá." msgid "On second thought, never mind." msgstr "Pensandolo bien, olvidate." +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "" +"çNo puedo entrenarte apropiadamente mientras estás controlando un vehículo!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." -msgstr "Dale tiempo, te voy a mostrar algo nuevo después..." +msgid "Give it some time, I'll show you something new later…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "Tengo razones para negarte el entrenamiento." -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "" -"çNo puedo entrenarte apropiadamente mientras estás controlando un vehículo!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "¡No hay ninguna chance, me van a dejar atrás!" @@ -188228,8 +196008,8 @@ msgid "See you around." msgstr "Nos vemos por ahí." #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." -msgstr "Realmente no me siento cómodo haciendo eso..." +msgid "I really don't feel comfortable doing so…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll give you some space." @@ -188300,7 +196080,7 @@ msgid "Thanks, see you later!" msgstr "¡Gracias, nos vemos después!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." +msgid "You picked up something that does not belong to you…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -188394,13 +196174,13 @@ msgid "You might be seeing more of me…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" #: lang/json/talk_topic_from_json.py @@ -188422,7 +196202,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -188435,7 +196215,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" @@ -188457,7 +196237,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -188473,7 +196253,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -188508,14 +196288,6 @@ msgstr "Decime cómo funcionan los campamentos de bandos." msgid "Tell me how faction camps have changed." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "Quiero que construyas un campamento acá." - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "Nada. Hablemos de otra cosa." @@ -188737,10 +196509,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "" -"¿Seguro? Este no parece un lugar particularmente seguro para ponerse a " -"charlar..." #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." @@ -188762,6 +196532,50 @@ msgstr "¿De qué querés hablar?" msgid "Actually, never mind." msgstr "En realidad, no importa." +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "" @@ -188783,7 +196597,7 @@ msgid "May the earth flourish beneath our paths." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -188967,8 +196781,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" @@ -189542,7 +197356,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -190024,6 +197838,38 @@ msgstr "" msgid "Huh." msgstr "Ah." +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -190076,19 +197922,9 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" -"Eventualmente, sí. Estuvo tranquilo por unas horas. Tenía sed, estaba herido" -" y con mucho miedo. Mi entrenamiento era lo único que evitaba que me " -"volviera loco. Decidí intentar salir y ver cuáles eran mis heridas. Fue " -" fácil. El costado de la camioneta estaba destrozado, así que al final" -" solo estaba tirado abajo de un poco de escombro, con las ruinas de la " -"camioneta formando como una carpa encima mío. Ni siquiera tenía heridas " -"graves. Agarré todo el equipamiento que pude, y salí. Era de noche. Podía " -"escuchar ruido de luchas alejadas, así que fui para el otro lado. Hice unas " -"cuadras hasta que me encontré algún ... Salí corriendo. Corrí y " -"corrí y corrí un poco más. Y acá estoy." #: lang/json/talk_topic_from_json.py msgid "" @@ -190428,6 +198264,30 @@ msgstr "Pobre Dan el Sucio. " msgid "Thanks for telling me that stuff. " msgstr "Gracias por contarme. " +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -190489,6 +198349,24 @@ msgid "" "died in the crash, but I am not going back to find out." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -190527,6 +198405,21 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "¿Qué pensás que les pasó? ¿Los volviste a ver?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -190595,6 +198488,40 @@ msgid "" "pretty good life compared to those first few months." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -190607,6 +198534,50 @@ msgstr "" "Estaba ocupado con los otros pasajeros, así que hice lo que hubiera hecho " "cualquiera y salí cagando." +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -190658,6 +198629,27 @@ msgstr "Perdón. ¿Me podés contar algo más de ellos?" msgid "Right. Sorry." msgstr "Está bien. Perdón." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -190678,6 +198670,19 @@ msgstr "" "pude llevarme. Volví unos días después pero el lugar estaba abandonado. No " "sé qué le pasó a toda esa gente." +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -190776,6 +198781,42 @@ msgstr "Perdón por preguntar. " msgid "Sorry for asking. " msgstr "Perdón por preguntar. " +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -191490,6 +199531,48 @@ msgstr "" "un shopping abandonado pero como necesitaba comida me fui al bosque. No me " "estaba yendo muy bien, así que me alegra que hayas aparecido." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -191554,6 +199637,128 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "Gracias por decirme todo eso. " +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -191878,13 +200083,48 @@ msgstr "" msgid "I can respect that." msgstr "Puedo respetar eso." +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "Gracias por eso." + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191986,6 +200226,43 @@ msgstr "" "enojar. El que yo era antes ya no está. Se murió. Me importa un carajo lo " "que te parezca 'sano', no me vuelvas a preguntar, ." +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -192347,11 +200624,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "" -"Evasión de impuestos. Yo era contador, y lo ayudaba a mi jefe a mover una " -"montaña de plata de manera inteligente. No suficientemente inteligente, " -"parece ser..." #: lang/json/talk_topic_from_json.py msgid "" @@ -192572,6 +200846,32 @@ msgstr "" "Supongo que seremos los humildes quienes poblaremos la Tierra. Aunque no me " "gustan nuestras posibilidades." +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -192583,6 +200883,23 @@ msgstr "" " a transitar este Infierno en la Tierra. Me arrepiento de no haber prestado " "atención en Catecismo." +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -192851,10 +201168,6 @@ msgstr "¿Cómo era trabajar para los Mercaderes Libres?" msgid "What was working for the Old Guard like?" msgstr "¿Y cómo era trabajar para la Vieja Guardia?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "Gracias por eso." - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "Gracias por eso. Vamos yendo." @@ -193119,6 +201432,22 @@ msgstr "" msgid "What were you saying before that?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "Hola, ¿qué tal?" @@ -193642,7 +201971,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194035,10 +202364,6 @@ msgid "" " catastrophe." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "" @@ -194722,12 +203047,12 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"How's things with you? My cardboard collection is getting quite impressive." +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "" +"How's things with you? My cardboard collection is getting quite impressive." msgstr "" #: lang/json/talk_topic_from_json.py @@ -195524,7 +203849,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" @@ -196258,7 +204583,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -197320,12 +205645,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" #: lang/json/talk_topic_from_json.py @@ -197453,12 +205778,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" #: lang/json/talk_topic_from_json.py @@ -197522,7 +205847,7 @@ msgid "Hm? Oh, hi." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "" #: lang/json/talk_topic_from_json.py @@ -197886,8 +206211,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" #: lang/json/talk_topic_from_json.py @@ -197904,9 +206229,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -198268,8 +206593,8 @@ msgid "" msgstr "No hospedamos basuras como vos, terminá con tus negocios y tomatelas." #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." -msgstr "No estoy al mando acá, estás buscando a otra persona..." +msgid "I'm not in charge here, you're looking for someone else…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -198316,12 +206641,12 @@ msgid "Well, I'd better be going. Bye." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." -msgstr "Bienvenido, alguacil..." +msgid "Welcome marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." -msgstr "Bienvenido..." +msgid "Welcome…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -198572,12 +206897,12 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." -msgstr "Alguacil..." +msgid "Marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." -msgstr "Ciudadano..." +msgid "Citizen…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Can I trade for supplies?" @@ -199240,7 +207565,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -199287,6 +207612,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "" @@ -199300,11 +207637,11 @@ msgid "Hey." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Yes?" +msgid "Good to see you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Good to see you." +msgid "About those jobs…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -199316,7 +207653,7 @@ msgid "Want help with something else?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." +msgid "Lets set a combat strategy" msgstr "" #: lang/json/talk_topic_from_json.py @@ -199370,6 +207707,10 @@ msgstr "" msgid "Anything on your mind?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "" @@ -199409,15 +207750,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "" #: lang/json/talk_topic_from_json.py @@ -199457,7 +207798,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -199526,8 +207867,8 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "No puedo ni imaginar para qué necesitaría tu ayuda." #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." -msgstr "Quedate quieto mientras busco mis tijeras..." +msgid "Stand still while I get my clippers…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Thanks…" @@ -199961,8 +208302,8 @@ msgstr "" " la mayor parte del tiempo afuera del puesto." #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "Por favor, dejame solo..." +msgid "Please leave me alone…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -199982,17 +208323,14 @@ msgstr "Qué triste." #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." -msgstr "No sé qué podés hacer. Yo probé de todo. Dame un poco de tiempo..." +"I don't know what you could do. I've tried everything. Just give me time…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "" -"¡Sigo enfermándome! Al principio pensé que era algo que comí pero ahora " -"parece que no puedo mantener nada adentro..." #: lang/json/talk_topic_from_json.py msgid "Uhm." @@ -200122,8 +208460,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" #: lang/json/talk_topic_from_json.py @@ -200409,7 +208747,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Zombears are terrifying creatures of destruction." -msgstr "" +msgstr "Los ozombis son terribles criaturas de destrucción." #: lang/json/talk_topic_from_json.py msgid "" @@ -200444,6 +208782,263 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "Qué hacés, carto." @@ -200547,7 +209142,7 @@ msgid "Oh, you again." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -200555,7 +209150,7 @@ msgid "I'm busy, what is it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "" #: lang/json/talk_topic_from_json.py @@ -200702,7 +209297,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Lizard Tail" -msgstr "" +msgstr "Cola de Lagarto" #: lang/json/technique_from_json.py #, python-format @@ -200731,7 +209326,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Lizard Wall Counter" -msgstr "" +msgstr "Contrataque de Pared de Lagarto" #: lang/json/technique_from_json.py #, python-format @@ -200923,7 +209518,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Centipede Strike" -msgstr "" +msgstr "Golpe de Ciempiés" #: lang/json/technique_from_json.py #, python-format @@ -200937,17 +209532,18 @@ msgstr " golpea velozmente %s" #: lang/json/technique_from_json.py msgid "Centipede Bite" -msgstr "" +msgstr "Mordida de Ciempiés" #: lang/json/technique_from_json.py #, python-format msgid "You palm strike %s with a painful Centipede Bite" -msgstr "" +msgstr "Le das un golpe de palma al %s con una dolorosa Mordida de Ciempiés" #: lang/json/technique_from_json.py #, python-format msgid " palm strikes %s with a painful Centipede Bite" msgstr "" +" le da un golpe de palma al %s con una dolorosa Mordida de Ciempiés" #: lang/json/technique_from_json.py #, python-format @@ -200982,10 +209578,6 @@ msgstr "Bloqueás el/a %s" msgid " blocks %s" msgstr " bloquea el/a %s" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "Parada" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -201500,31 +210092,31 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Sweep Kick" -msgstr "" +msgstr "Patada Barredora" #: lang/json/technique_from_json.py #, python-format msgid "You sweep kick %s" -msgstr "" +msgstr "Le tirás una patada barredora al %s" #: lang/json/technique_from_json.py #, python-format msgid " sweep kicks %s" -msgstr "" +msgstr " le tira una patada barredora al %s" #: lang/json/technique_from_json.py msgid "Spin Kick" -msgstr "" +msgstr "Patada Giratoria" #: lang/json/technique_from_json.py #, python-format msgid "You spin kick %s" -msgstr "" +msgstr "Le tirás una patada giratoria al %s" #: lang/json/technique_from_json.py #, python-format msgid " spin kicks %s" -msgstr "" +msgstr " le tira una patada giratoria al %s" #: lang/json/technique_from_json.py msgid "Crane Wing" @@ -201584,21 +210176,21 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Claw" -msgstr "" +msgstr "Garra de Dragón" #: lang/json/technique_from_json.py #, python-format msgid "You lash out at %s with a Dragon Claw" -msgstr "" +msgstr "Atacás al %s con la Garra de Dragón" #: lang/json/technique_from_json.py #, python-format msgid " lashes out at %s with a Dragon Claw" -msgstr "" +msgstr " ataca al %s con la Garra de Dragón" #: lang/json/technique_from_json.py msgid "Dragon Vortex Block" -msgstr "" +msgstr "Bloqueo del Dragón" #: lang/json/technique_from_json.py #, python-format @@ -201612,7 +210204,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Wing Dodge" -msgstr "" +msgstr "Ala Esquivadora de Dragón" #: lang/json/technique_from_json.py #, python-format @@ -201626,17 +210218,17 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Tail" -msgstr "" +msgstr "Cola de Dragón" #: lang/json/technique_from_json.py #, python-format msgid "You sweep %s with a quick Dragon Tail" -msgstr "" +msgstr "Barrés al %s con una rápida Cola de Dragón" #: lang/json/technique_from_json.py #, python-format msgid " sweeps %s with a quick Dragon Tail sweep" -msgstr "" +msgstr " barre al %s con una rápida barrida de la Cola de Dragón" #: lang/json/technique_from_json.py msgid "Dragon Strike" @@ -201645,12 +210237,12 @@ msgstr "Golpe de Dragón" #: lang/json/technique_from_json.py #, python-format msgid "You descend upon %s with a powerful Dragon Strike" -msgstr "" +msgstr "Descendés sobre el %s con un potente Golpe de Dragón" #: lang/json/technique_from_json.py #, python-format msgid " descends upon %s with a powerful Dragon Strike" -msgstr "" +msgstr " desciende sobre el %s con un potente Golpe de Dragón" #: lang/json/technique_from_json.py msgid "Round Strike" @@ -201696,7 +210288,7 @@ msgstr " le da un golpe seco al %s" #: lang/json/technique_from_json.py msgid "Combination Strike" -msgstr "" +msgstr "Golpe Combinado" #: lang/json/technique_from_json.py #, python-format @@ -201762,17 +210354,18 @@ msgstr " le da un golpe de esgrima al %s" #: lang/json/technique_from_json.py msgid "Compound Attack" -msgstr "" +msgstr "Ataque Compuesto" #: lang/json/technique_from_json.py #, python-format msgid "Your feint leads to a compound attack against %s" -msgstr "" +msgstr "Tu finta te lleva a hacer un ataque compuesto contra el %s" #: lang/json/technique_from_json.py #, python-format msgid "'s feint leads to a compound attack against %s" msgstr "" +"La finta de lo lleva a hacer un ataque compuesto contra el %s" #: lang/json/technique_from_json.py msgid "Fencing Riposte" @@ -201842,7 +210435,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Hook and Drag" -msgstr "" +msgstr "Enganchar y Arrastrar" #: lang/json/technique_from_json.py #, python-format @@ -202134,7 +210727,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Sweeping Strike" -msgstr "" +msgstr "Golpe de Barrido" #: lang/json/technique_from_json.py #, python-format @@ -202148,7 +210741,7 @@ msgstr " hace caer %s con un golpe de barrido" #: lang/json/technique_from_json.py msgid "Vicious Strike" -msgstr "" +msgstr "Golpe Feroz" #: lang/json/technique_from_json.py #, python-format @@ -202580,12 +211173,12 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid "You crouch low and sweep-kick %s" -msgstr "" +msgstr "Te agachás y le tirás una patada barredora al %s" #: lang/json/technique_from_json.py #, python-format msgid " crouches low and sweep-kicks %s" -msgstr "" +msgstr " se agacha y le tira una patada barredora al %s" #: lang/json/technique_from_json.py #, python-format @@ -202599,17 +211192,17 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Palm Strike" -msgstr "" +msgstr "Golpe de Palma" #: lang/json/technique_from_json.py #, python-format msgid "You palm strike %s" -msgstr "" +msgstr "Le das un golpe de palma al %s" #: lang/json/technique_from_json.py #, python-format msgid " palm strikes %s" -msgstr "" +msgstr " le da un golpe de palma al %s" #: lang/json/technique_from_json.py msgid "Grasp the Sparrow's Tail" @@ -202627,17 +211220,17 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Double Palm Strike" -msgstr "" +msgstr "Doble Golpe de Palma" #: lang/json/technique_from_json.py #, python-format msgid "You double-handed palm strike %s" -msgstr "" +msgstr "Le das un golpe de palma con las dos manos al %s" #: lang/json/technique_from_json.py #, python-format msgid " double-handed palm strikes %s" -msgstr "" +msgstr " le da un golpe de palma con las dos manos al %s" #: lang/json/technique_from_json.py msgid "Tiger Palm" @@ -202683,7 +211276,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Straight Punch (Knockback)" -msgstr "" +msgstr "Golpe Recto (Empujar)" #: lang/json/technique_from_json.py #, python-format @@ -202711,7 +211304,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "L-hook (Knockback)" -msgstr "" +msgstr "Gancho (Empujar)" #: lang/json/technique_from_json.py #, python-format @@ -203412,17 +212005,102 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Spin Attack" -msgstr "" +msgstr "Ataque Giratorio" #: lang/json/technique_from_json.py #, python-format msgid "You unleash a spin attack against %s and those nearby" -msgstr "" +msgstr "Desplegás un ataque giratorio contra el %s y los que estén cerca" #: lang/json/technique_from_json.py #, python-format msgid " unleashes a spin attack against %s and those nearby" msgstr "" +" desplega un ataque giratorio contra el %s y los que estén cerca" + +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" #: lang/json/technique_from_json.py msgid "Ausstoß" @@ -203480,6 +212158,216 @@ msgstr "" msgid " launches a supersonic punch at %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "Tirada Poderosa" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "Tirás al %s para un lado con tu Tirada Poderosa" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr " tira al %s con su Tirada Poderosa" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "Tirada de Balista" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "Girás y arrojás al %s con tu Tirada de Balista" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr " gira y arroja al %s para un lado con su Tirada de Balista" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -203525,6 +212413,10 @@ msgstr "" msgid "Life springs anew from the dead grass." msgstr "" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "tierra calcinada" @@ -204623,209 +213515,14 @@ msgid "" msgstr "" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "tierra" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" -"Es tierra. Parece que es de buena calidad como para cultivar. También puede " -"ser quitada para usar en alguna construcción." - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "tomp" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "" -"Es un área grande con arena que podría utilizarse de varias maneras, si se " -"la extrae de manera apropiada." - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "arcilla" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "" -"Es un campo lleno de arcilla maleable, ideal para la alfarería si se la " -"extrae de manera apropiada." - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "montículo de arcilla" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "¡splash!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "montículo de arena" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "montículo de tierra" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" -"Es un área de tierra removida, difícil para caminar por ahí. Si se la " -"examina un poco, se ve que es bastante favorable para plantar semillas y " -"cosas así." - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "" -"Es una pilla gigante de tierra en la que parece que podrías meterte para " -"usar de refugio." - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "desperfecto extraño" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" -"Es un agujero antinatural con forma humanoide, y te resulta extrañamente " -"familiar. Sentís una extraña sensación al examinarlo, como si te " -"perteneciera de alguna manera." - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "suelo de piedra" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" -"Es un área relativamente plana de piedra y roca. Parece lo suficientemente " -"estable como para poder ser extraída con el equipo adecuado de minería." - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "pavimento" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "" -"Es un pedazo de asfalto, lentamente degradándose por las rajaduras, el " -"congelamiento y la falta de mantenimiento." - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "pavimento amarillo" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" -"Son rayas de pintura amarilla cuidadosamente alineadas en la ruta para " -"informar a los conductores que no deben cruzarlas. Aunque ya nadie cuida que" -" estas cosas se cumplan." - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "vereda" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" -"Es un área con concreto común, dañado por el congelamiento y las rajaduras " -"grandes que tiene debido a la falta de mantenimiento." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." +msgid "overgrown floor" msgstr "" -"Es un sector nuevo con concreto con terminaciones en la superficie para " -"hacerlo más estético y resistente a los ciclos de congelamiento y " -"descongelamiento." -#. ~ Description for concrete +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -204833,40 +213530,14 @@ msgid "SMASH!" msgstr "¡SMASH!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "suelo de metal" - -#. ~ Description for metal floor -#: lang/json/terrain_from_json.py -msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgid "overgrown wall" msgstr "" -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "baldosa de linóleo" - -#. ~ Description for linoleum tile +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "suelo de tierra" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." msgstr "" -"Es un piso que consiste en tierra fina mezclada que ha sido apisonada." #: lang/json/terrain_from_json.py msgid "concrete floor" @@ -204965,6 +213636,23 @@ msgstr "" "terminado. Al piso todavía no lo emparejaron y el techo todavía no está " "completamente lleno." +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "suelo de piedra" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" +"Es un área relativamente plana de piedra y roca. Parece lo suficientemente " +"estable como para poder ser extraída con el equipo adecuado de minería." + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "suelo de metal" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -204974,6 +213662,10 @@ msgstr "" "Es un piso de buena calidad y resistente con baldosas cuadriculadas que " "reduce el riesgo de patinarse y caerse, con un techo que combina." +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "tomp" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "suelo" @@ -205022,6 +213714,10 @@ msgstr "" "Es un piso de madera dura que ha sido tratado con químicos para disminuir la" " posibilidad de patinarse, generalmente utilizado para deportes recreativos." +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "suelo de tierra" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -205108,28 +213804,15 @@ msgid "A blue section of flooring." msgstr "" #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "" - -#. ~ Description for industrial carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." +msgid "carpet" msgstr "" +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "bunker carpet" +msgid "Base carpet!" msgstr "" -#. ~ Description for bunker carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "" - -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "Es una suave alfombra roja." @@ -205149,6 +213832,124 @@ msgstr "Es una suave alfombra verde." msgid "Soft purple carpet." msgstr "Es una suave alfombra púrpura." +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "baldosa de linóleo" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "suelo pintado encerado" @@ -205187,6 +213988,37 @@ msgstr "" "apocalípticas. Espero que te guste el sonido de la lluvia sobre el metal " "corrugado." +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "tierra" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" +"Es tierra. Parece que es de buena calidad como para cultivar. También puede " +"ser quitada para usar en alguna construcción." + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" +"Es un área grande con arena que podría utilizarse de varias maneras, si se " +"la extrae de manera apropiada." + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "musgo" @@ -205196,6 +214028,32 @@ msgstr "musgo" msgid "Moist spongy moss." msgstr "Es musguito esponjoso y húmedo." +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "arcilla" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "" +"Es un campo lleno de arcilla maleable, ideal para la alfarería si se la " +"extrae de manera apropiada." + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "montículo de arcilla" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "¡splash!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "" @@ -205205,6 +214063,150 @@ msgstr "" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "montículo de arena" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "montículo de tierra" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" +"Es un área de tierra removida, difícil para caminar por ahí. Si se la " +"examina un poco, se ve que es bastante favorable para plantar semillas y " +"cosas así." + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "" +"Es una pilla gigante de tierra en la que parece que podrías meterte para " +"usar de refugio." + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "desperfecto extraño" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" +"Es un agujero antinatural con forma humanoide, y te resulta extrañamente " +"familiar. Sentís una extraña sensación al examinarlo, como si te " +"perteneciera de alguna manera." + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "pavimento" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "" +"Es un pedazo de asfalto, lentamente degradándose por las rajaduras, el " +"congelamiento y la falta de mantenimiento." + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "pavimento amarillo" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" +"Son rayas de pintura amarilla cuidadosamente alineadas en la ruta para " +"informar a los conductores que no deben cruzarlas. Aunque ya nadie cuida que" +" estas cosas se cumplan." + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "vereda" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" +"Es un área con concreto común, dañado por el congelamiento y las rajaduras " +"grandes que tiene debido a la falta de mantenimiento." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" +"Es un sector nuevo con concreto con terminaciones en la superficie para " +"hacerlo más estético y resistente a los ciclos de congelamiento y " +"descongelamiento." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "" +"Es un piso que consiste en tierra fina mezclada que ha sido apisonada." + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "nogal" @@ -209301,6 +218303,78 @@ msgstr "" msgid "A ladder leading down." msgstr "" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "pendiente hacia abajo" @@ -209792,7 +218866,7 @@ msgstr "¡Clank!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "¡Bang!" @@ -211760,6 +220834,11 @@ msgstr "casco de madera de bote" msgid "A wooden board that keeps the water out of your boat." msgstr "Es una tabla de madera que mantiene el agua afuera de tu bote." +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -212279,14 +221358,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "asiento de madera" +msgid "flimsy wooden seat" +msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "Es un lugar para sentarse." +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "asiento de madera" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "púa de madera" @@ -212524,6 +221608,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "" @@ -213140,6 +222233,11 @@ msgstr "" msgid "At least %s from %s (%s remaining)" msgstr "" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -213156,12 +222254,13 @@ msgid "Within %s of %s (passed)" msgstr "" #: src/achievement.cpp -msgid "Triggered by " +#, c-format +msgid "Triggered by %s" msgstr "" #: src/achievement.cpp #, c-format -msgid "%s/%s " +msgid "%s/%s %s" msgstr "" #: src/achievement.cpp @@ -213368,8 +222467,9 @@ msgstr "" msgid "The lock stumps your efforts to pick it." msgstr "La cerradura no cede a tus intentos de forzarla." -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "" @@ -213430,6 +222530,120 @@ msgstr "" msgid "Continue trying to fall asleep and don't ask again." msgstr "" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -215157,7 +224371,7 @@ msgstr "" msgid "< [%s] Sort: %s >" msgstr "" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "" @@ -215733,7 +224947,7 @@ msgstr "está constantemente retorciéndose" #: src/artifact.cpp msgid "wriggling" -msgstr "retorciendo" +msgstr "serpenteante" #: src/artifact.cpp msgid "glowing" @@ -215741,11 +224955,11 @@ msgstr "brillante" #: src/artifact.cpp msgid "glows faintly" -msgstr "está brillando ligeramente" +msgstr "brillando ligeramente" #: src/artifact.cpp msgid "humming" -msgstr "zumbando" +msgstr "zumbante" #: src/artifact.cpp msgid "hums very quietly" @@ -215753,7 +224967,7 @@ msgstr "zumbando muy despacito" #: src/artifact.cpp msgid "moving" -msgstr "móvil" +msgstr "moviéndose" #: src/artifact.cpp msgid "shifts from side to side slowly" @@ -215765,11 +224979,11 @@ msgstr "hace ruidos de murmuro muy suaves" #: src/artifact.cpp msgid "whispering" -msgstr "murmurando" +msgstr "murmurante" #: src/artifact.cpp msgid "breathing" -msgstr "respirando" +msgstr "respirante" #: src/artifact.cpp msgid "shrinks and grows very slightly with a regular pulse, as if breathing" @@ -215786,7 +225000,7 @@ msgstr "está muy frío al tacto" #: src/artifact.cpp msgid "itchy" -msgstr "picazón" +msgstr "picante" #: src/artifact.cpp msgid "makes your skin itch slightly when it is close" @@ -215842,11 +225056,11 @@ msgstr "tibio" #: src/artifact.cpp msgid "makes a rattling sound when moved" -msgstr "hace un sonido de tamborileo cuando se lo mueve" +msgstr "hace un traqueteo cuando se lo mueve" #: src/artifact.cpp msgid "rattling" -msgstr "tamborileo" +msgstr "traqueteante" #: src/artifact.cpp msgid "has a surface reminiscent of reptile scales" @@ -218073,6 +227287,29 @@ msgstr "%s (%i lugares);" msgid "Increased storage capacity by %i." msgstr "Capacidad de almacenamiento incrementada en %i." +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "" @@ -218243,7 +227480,8 @@ msgid "(incapacitated)" msgstr "" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" +#, c-format +msgid "(fuel saving ON > %d %%)" msgstr "" #: src/bionics_ui.cpp @@ -218310,10 +227548,18 @@ msgstr "" msgid "Accuracy" msgstr "Precisión" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "Probabilidad de Golpe Crítico" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "Esquivar" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "Velocidad" @@ -218804,57 +228050,6 @@ msgstr "Te parás." msgid " stands up." msgstr " se para." -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s breaks free of the webs!" -msgstr "¡El %s se libera de las telarañas!" - -#: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "¡Te conseguís liberar de las telarañas!" - -#: src/character.cpp -msgid " frees themselves from the webs!" -msgstr "¡ consigue liberarse de las telarañas!" - -#: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "¡Intentás liberarte de las telarañas, pero no podés!" - -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the light snare!" -msgstr "¡El %s se escapa de la trampa ligera de lazo!" - -#: src/character.cpp -msgid "You free yourself from the light snare!" -msgstr "¡Te conseguís liberar de la trampa ligera de lazo!" - -#: src/character.cpp -msgid " frees themselves from the light snare!" -msgstr "¡ consigue liberarse de la trampa ligera de lazo!" - -#: src/character.cpp -msgid "You try to free yourself from the light snare, but can't get loose!" -msgstr "¡Intentás liberarte de la trampa ligera de lazo, pero no podés!" - -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the heavy snare!" -msgstr "¡El %s se escapa de la trampa pesada de lazo!" - -#: src/character.cpp -msgid "You free yourself from the heavy snare!" -msgstr "¡Te conseguís liberar de la trampa pesada de lazo!" - -#: src/character.cpp -msgid " frees themselves from the heavy snare!" -msgstr "¡ consigue liberarse de la trampa pesada de lazo!" - -#: src/character.cpp -msgid "You try to free yourself from the heavy snare, but can't get loose!" -msgstr "¡Intentás liberarte de la trampa pesada de lazo, pero no podés!" - #: src/character.cpp src/monster.cpp #, c-format msgid "The %s escapes the bear trap!" @@ -218877,29 +228072,51 @@ msgstr "¡ consigue liberarse de la trampa para oso!" msgid "You try to free yourself from the bear trap, but can't get loose!" msgstr "¡Intentás liberarte de la trampa para oso, pero no podés!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s escapes the light snare!" +msgstr "¡El %s se escapa de la trampa ligera de lazo!" + #: src/character.cpp -msgid "You free yourself from the rubble!" -msgstr "¡Te conseguís liberar de los escombros!" +msgid "You free yourself from the light snare!" +msgstr "¡Te conseguís liberar de la trampa ligera de lazo!" #: src/character.cpp -msgid " frees themselves from the rubble!" -msgstr "¡ consigue liberarse de los escombros!" +msgid " frees themselves from the light snare!" +msgstr "¡ consigue liberarse de la trampa ligera de lazo!" #: src/character.cpp -msgid "You try to free yourself from the rubble, but can't get loose!" -msgstr "¡Intentás liberarte de los escombros, pero no podés!" +msgid "You try to free yourself from the light snare, but can't get loose!" +msgstr "¡Intentás liberarte de la trampa ligera de lazo, pero no podés!" + +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s escapes the heavy snare!" +msgstr "¡El %s se escapa de la trampa pesada de lazo!" #: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "Intentás escaparte del pozo, pero te resbalás y volvés a caer." +msgid "You free yourself from the heavy snare!" +msgstr "¡Te conseguís liberar de la trampa pesada de lazo!" #: src/character.cpp -msgid "You escape the pit!" -msgstr "¡Te escapás del pozo!" +msgid " frees themselves from the heavy snare!" +msgstr "¡ consigue liberarse de la trampa pesada de lazo!" #: src/character.cpp -msgid " escapes the pit!" -msgstr "¡ se escapa del pozo!" +msgid "You try to free yourself from the heavy snare, but can't get loose!" +msgstr "¡Intentás liberarte de la trampa pesada de lazo, pero no podés!" + +#: src/character.cpp +msgid "You free yourself from the rubble!" +msgstr "¡Te conseguís liberar de los escombros!" + +#: src/character.cpp +msgid " frees themselves from the rubble!" +msgstr "¡ consigue liberarse de los escombros!" + +#: src/character.cpp +msgid "You try to free yourself from the rubble, but can't get loose!" +msgstr "¡Intentás liberarte de los escombros, pero no podés!" #: src/character.cpp #, c-format @@ -218940,6 +228157,52 @@ msgstr "¡Lográs liberarte del agarre!" msgid " breaks out of the grab!" msgstr "¡ logra liberarse del agarre!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "¡El %s se libera de las telarañas!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "¡Te conseguís liberar de las telarañas!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr "¡ consigue liberarse de las telarañas!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "¡Intentás liberarte de las telarañas, pero no podés!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "Intentás escaparte del pozo, pero te resbalás y volvés a caer." + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "¡Te escapás del pozo!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr "¡ se escapa del pozo!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -219798,6 +229061,10 @@ msgstr "" msgid "Your body strains under the weight!" msgstr "¡Tu cuerpo se esfuerza en mantener tanto peso!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -222466,7 +231733,7 @@ msgstr "¡Golpe en la cabeza!" #: src/creature.cpp src/iuse.cpp src/melee.cpp msgid "Critical!" -msgstr "Critico!" +msgstr "¡Crítico!" #: src/creature.cpp msgid "Good hit!" @@ -222761,14 +232028,6 @@ msgstr "" msgid "Test trait group" msgstr "Probar grupo de peculiaridades" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "Mostrar mensaje debug" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "Error del juego (prueba de manejo de fallos)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "" @@ -222797,6 +232056,18 @@ msgstr "" msgid "Enable achievements" msgstr "" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "Mostrar mensaje debug" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "Error del juego (prueba de manejo de fallos)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "" + #: src/debug_menu.cpp msgid "Game…" msgstr "" @@ -222893,10 +232164,6 @@ msgstr "" msgid "Map…" msgstr "" -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -223414,6 +232681,10 @@ msgstr "Marcar como completada" msgid "Remove mission without proper cleanup" msgstr "Quitar misión sin borrar todo" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -223929,15 +233200,6 @@ msgid "" "Roof: %s" msgstr "" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -224654,138 +233916,182 @@ msgid "Liked" msgstr "Querido" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "Leyenda" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" -msgstr "Indiscutido" +msgstr "Indiscutido/a" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" -msgstr "Potente" +msgstr "Poderoso/a" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" -msgstr "Famoso" +msgstr "Famoso/a" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" -msgstr "Muy Conocido" +msgstr "Muy Conocido/a" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" -msgstr "Del que se Habla" +msgstr "Popular" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" -msgstr "Basura Despreciable" +msgstr "Basura Inútil" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "Alimaña" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "Despreciable" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "Parásito" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "Chupasangre" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "Hazmerreír" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "Neutral" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" -msgstr "Rico Asqueroso" +msgstr "Asquerosamente rico/a" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "Pudiente" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" -msgstr "Próspero" +msgstr "Próspero/a" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" -msgstr "Acaudalado" +msgstr "Acaudalado/a" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" -msgstr "Cómodo" +msgstr "Cómodo/a" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "Deficiente" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" -msgstr "Fracasado" +msgstr "Fracasado/a" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" -msgstr "Empobrecido" +msgstr "Empobrecido/a" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" -msgstr "Destituir" +msgstr "Desamparado/a" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "Rebosante" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" -msgstr "Adecuadamente" +msgstr "Adecuada" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "Tirando para No Aflojar" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" -msgstr "Malnutrido" +msgstr "Malnutrición" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" -msgstr "Muerto de Hambre" +msgstr "Muertos de Hambre" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "Legendario/a" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" -msgstr "Experto" +msgstr "Experto/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" -msgstr "Veterano" +msgstr "Veterano/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" -msgstr "Habilidoso" +msgstr "Habilidoso/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "Competente" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" -msgstr "Inexperto" +msgstr "Inexperto/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" -msgstr "Lisiado" +msgstr "Lisiado/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" -msgstr "Debilitado" +msgstr "Debilitado/a" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "Inútil" @@ -225390,12 +234696,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -225403,19 +234709,6 @@ 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" -"Lugares: %d/3\n" #: src/faction_camp.cpp #, c-format @@ -226615,7 +235908,7 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" +msgid "No suitable items are located at the drop points…" msgstr "" #: src/faction_camp.cpp @@ -226633,8 +235926,7 @@ msgstr "" 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." +"%s ve un horror cornudo y se escabulle antes de que se le acerque demasiado." #: src/faction_camp.cpp #, c-format @@ -226831,6 +236123,13 @@ msgstr "" msgid "Wait till you wake up…" msgstr "" +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -226941,6 +236240,11 @@ msgctxt "action" msgid "open" msgstr "abrir" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -228044,6 +237348,10 @@ msgstr "No tenés nada para recargar." msgid "You aren't holding something you can reload." msgstr "" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -228478,11 +237786,25 @@ msgstr "" msgid "You cannot haul items here." msgstr "No podés arrastrar objetos acá." +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "¡%s está en el medio!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "¡Hay un %s en el medio!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -229871,11 +239193,6 @@ msgstr "¡Hay un estúpido en el medio!" msgid "The %s is in the way!" msgstr "¡El/a %s está en el medio!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "¡%s está en el medio!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -230609,6 +239926,10 @@ msgstr "¡Ignorar láser de determinación de objetivo!" msgid "Creature whitelisted: %s" msgstr "Criatura permitida: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "¿Te querés suicidar?" @@ -231140,6 +240461,11 @@ msgstr "" msgid "Attempt to hack this safe?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -231991,11 +241317,28 @@ msgstr "" msgid "There is a %s there. Take down?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "Hay un %s ahí. ¿Lo querés desarmar?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "¡Desarmás la trampa!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "No pudiste desarmar la trampa." + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "¡No pudiste desarmar la trampa, y la hiciste accionar!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -232376,6 +241719,10 @@ msgstr "" msgid "Splint broken limbs" msgstr "" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "No tenés instalado ningún biónico." @@ -232403,16 +241750,78 @@ msgid " doesn't have limbs that require splinting." msgstr "" #: src/iexamine.cpp -msgid "This mill already contains flour." +msgid "You don't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "Los espasmos musculares empiezan a desaparecer." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "El medicamento no hace nada para ayudarte con los espasmos." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." msgstr "" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." msgstr "" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "This mill contains %s, which can't be milled!" msgstr "" #: src/iexamine.cpp @@ -232598,7 +242007,8 @@ msgid "Remove brake and start milling" msgstr "" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." +#, c-format +msgid "Remove brake and start milling, milling will take about %s." msgstr "" #: src/iexamine.cpp @@ -232632,18 +242042,7 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "" -msgstr[1] "" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." +msgid "It should take about %s to finish milling." msgstr "" #: src/iexamine.cpp @@ -232832,6 +242231,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "Terminando" @@ -233413,7 +242817,7 @@ msgstr "Volumen (%s): " msgid "There are no available choices" msgstr "No hay opciones disponibles" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "" @@ -233865,7 +243269,7 @@ msgid "" "very bad idea." msgstr "" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -234315,10 +243719,6 @@ msgstr "" msgid "Weight capacity bonus: " msgstr "" -#: src/item.cpp -msgid "Storage: " -msgstr "Almacenamiento: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* Este objeto puede ser usado con un casco." @@ -234602,6 +244002,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -234625,9 +244053,21 @@ msgstr "* Este objeto puede ser reforzado." msgid "* This item is not repairable." msgstr "* Este objeto no se puede reparar." +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. +#: src/item.cpp +#, c-format +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." msgstr "" #: src/item.cpp @@ -234743,30 +244183,30 @@ msgstr "" #: src/item.cpp #, c-format msgid "Critical hit chance %d%% - %d%%" +msgstr "Probabilidad de Golpe Crítico %d%% - %d%%" + +#: src/item.cpp +msgid "Bashing: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" +msgid "Critical bash: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" +msgid "Cutting: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" +msgid "Critical cut: " msgstr "" -"%d punzante (%d en golpe crítico)" #: src/item.cpp -#, c-format -msgid "%d moves per attack" +msgid "Piercing: " +msgstr "" + +#: src/item.cpp +msgid "Critical pierce: " msgstr "" #: src/item.cpp @@ -235371,8 +244811,9 @@ msgstr "Tu %1$s no puede contener más %2$s." msgid "That %s doesn't have room to expand." msgstr "Ese/a %s no tiene más espacio para expandirlo/a." -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d x %s" @@ -235496,10 +244937,67 @@ msgstr "No tenés ningún objeto con uso registrado" msgid "Execute which action?" msgstr "¿Qué acción querés realizar?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" +msgstr[1] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "" @@ -235539,6 +245037,11 @@ msgstr "¿Qué grupo querés probar?" msgid "Result of 100 spawns:" msgstr "Resultado de 100 creaciones:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d x %s" + #: src/item_location.cpp msgid "inventory" msgstr "inventario" @@ -235561,6 +245064,10 @@ msgstr "abierto" msgid "Pocket %d:" msgstr "Bolsillo %d:" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "" @@ -235727,6 +245234,34 @@ msgstr "bolsillo ya tiene mucho peso" msgid "not enough space" msgstr "no tiene lugar" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "click." @@ -235796,14 +245331,6 @@ msgstr "Te tomás unos anitibióticos." msgid " takes some antibiotics." msgstr " se toma unos antibióticos." -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "Los espasmos musculares empiezan a desaparecer." - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "El medicamento no hace nada para ayudarte con los espasmos." - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -237373,10 +246900,6 @@ msgstr "S N A K E" msgid "Sokoban" msgstr "Sokoban" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "Buscaminas" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "¡Luces encendidas!" @@ -240299,7 +249822,7 @@ msgstr "El %s necesita un %s al lado." msgid "You can't place a %s there. It contains a trap already." msgstr "No podés poner un %s ahí. Ya tiene una trampa." -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "¡Hacés disparar un %s!" @@ -241499,6 +251022,10 @@ msgstr "Principiante" msgid "Intermediate" msgstr "Intermedio" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "Experto" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "Ancho de nivel:" @@ -242062,6 +251589,15 @@ msgstr "" msgid "Summon" msgstr "" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "Alcance" @@ -242082,6 +251618,10 @@ msgstr "" msgid "Spawned" msgstr "" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "" @@ -242134,6 +251674,15 @@ msgstr "" msgid "%s wounds are closing up!" msgstr "" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "" @@ -242602,30 +252151,23 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "¡Desarmás la trampa!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "No pudiste desarmar la trampa." +msgid "Something has crawled out of the %s plants!" +msgstr "¡Algo salió arrastrándose de las plantas de %s!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "¡No pudiste desarmar la trampa, y la hiciste accionar!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "¡Algo salió arrastrándose del/a %s!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "¡Algo salió arrastrándose de las plantas de %s!" +msgid "You've spotted a %1$ss!" +msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "¡Algo salió arrastrándose del/a %s!" +msgid " triggers a %s!" +msgstr "" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -243416,7 +252958,7 @@ msgstr "" #: src/melee.cpp msgid "You miss and stumble with the momentum." -msgstr "Le errás y te tropezás por el ímpetu." +msgstr "Le errás y te tropezás por el impulso." #: src/melee.cpp msgid "You swing wildly and miss." @@ -243429,7 +252971,7 @@ msgstr "Le errás." #: src/melee.cpp #, c-format msgid "%s misses and stumbles with the momentum." -msgstr "%s le erra y tropieza por el ímpetu." +msgstr "%s le erra y tropieza por el impulso." #: src/melee.cpp #, c-format @@ -243812,13 +253354,13 @@ msgstr "%s pero no causás daño." #: src/melee.cpp #, c-format msgid "%s. Critical!" -msgstr "%s. ¡Critico!" +msgstr "%s. ¡Crítico!" #. ~ someone hits something for %d damage (critical) #: src/melee.cpp #, c-format msgid "%s for %d damage. Critical!" -msgstr "" +msgstr "%s por %d de daño. ¡Crítico!" #. ~ NPC hits something #: src/melee.cpp @@ -244181,6 +253723,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "¡Ahora sos buscada por la policía!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -245150,6 +254705,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "Activar una alarma." +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -247975,6 +257542,11 @@ msgstr "" msgid "zombie slave" msgstr "esclavo zombi" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "Empujar %s" + #: src/monexamine.cpp msgid "Rename" msgstr "Renombrar" @@ -248940,12 +258512,6 @@ msgstr "" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "humano" -msgstr[1] "humanos" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -249927,17 +259493,6 @@ msgstr "Edad:" msgid "Blood type:" msgstr "" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "" - #: src/newcharacter.cpp msgid "Name:" msgstr "Nombre:" @@ -249950,6 +259505,22 @@ msgstr "Género:" msgid "Select a starting location." msgstr "Elegí un lugar de comienzo." +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" +msgstr[1] "" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Stats:" msgstr "Características:" @@ -250019,6 +259590,13 @@ msgstr "" msgid "Starting location:" msgstr "Lugar de comienzo:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "" @@ -251711,6 +261289,14 @@ msgstr "Destrozar" msgid "Pulp Adjacent" msgstr "Destrozar cercano" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "Auto hacer mina" @@ -253330,17 +262916,6 @@ msgstr "Mutaciones por radiación" msgid "If true, radiation causes the player to mutate." msgstr "Si está activado, la radiación causará mutaciones en el personaje." -#: src/options.cpp -msgid "Z-levels" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" - #: src/options.cpp msgid "Character point pools" msgstr "Grupos de puntos de personaje" @@ -254246,6 +263821,16 @@ msgstr "Zona:" msgid "# Unexplored" msgstr "# Sin explorar" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "Distancia a la misión activa:" @@ -254573,6 +264158,10 @@ msgstr "¡Ardiendo!" msgid "Very hot!" msgstr "¡Mucho calor!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "Cómodo" + #: src/panels.cpp msgid "Very cold!" msgstr "¡Mucho frío!" @@ -256045,6 +265634,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "" +#: src/player_display.cpp +msgid "Starving" +msgstr "Muerto de Hambre" + #: src/player_display.cpp msgid "Underfed" msgstr "" @@ -256137,6 +265730,10 @@ msgid "" "\n" msgstr "" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "Malnutrido" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -257277,6 +266874,15 @@ msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "" msgstr[1] "" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" +msgstr[1] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -258159,6 +267765,15 @@ msgctxt "grammatical gender list" msgid "n" msgstr "" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "¡Pisaste plástico de burbuja!" @@ -261352,6 +270967,10 @@ msgstr "…%s = Ver descripción completa " msgid "--NO AVAILABLE MODS--" msgstr "--MODS NO DISPONIBLES--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "Guardar como defecto la lista de modos activos" diff --git a/lang/po/es_ES.po b/lang/po/es_ES.po index 43cc563912845..3b1825809680a 100644 --- a/lang/po/es_ES.po +++ b/lang/po/es_ES.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-06-26 12:50+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Miguel de Dios Matias , 2020\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_ES/)\n" @@ -289,7 +289,6 @@ msgstr[0] "piedra" msgstr[1] "piedras" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -5855,7 +5854,6 @@ msgstr[1] "oro" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -5935,7 +5933,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "Una pequeña lámina de metal." @@ -7302,70 +7299,6 @@ msgstr[1] "" msgid "Seeing this is a bug." msgstr "Ver esto es un bug." -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "TEST pedazo de platino" -msgstr[1] "TEST pedazos de platino" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -7673,8 +7606,6 @@ msgstr[1] "pares de tapones para los oídos" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "Tapones industriales para los oídos. Se ponen adentro de la oreja." @@ -9669,8 +9600,6 @@ msgstr[0] "par de calcetines" msgstr[1] "pares de calcetines" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "Son calcetines. Se ponen en los pies." @@ -11634,6 +11563,18 @@ msgstr "" "traje antiexplosivos. Están diseñados para proteger contra la fragmentación " "y el calor." +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -18107,7 +18048,6 @@ msgstr[1] "" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "Tu armadura de poder se activa." @@ -18480,7 +18420,6 @@ msgstr[0] "mochila" msgstr[1] "mochilas" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "" @@ -18594,7 +18533,6 @@ msgstr[0] "maletín" msgstr[1] "maletines" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "Útil para llevar dinero, documentos, o contrabando." @@ -19580,7 +19518,6 @@ msgstr[0] "traje para materiales peligrosos" msgstr[1] "trajes para materiales peligrosos" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -20553,7 +20490,6 @@ msgstr[0] "camiseta de mangas largas" msgstr[1] "camisetas de mangas largas" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "Es una camiseta de algodón de mangas largas." @@ -21335,6 +21271,19 @@ msgid "" "weight." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "caestus" +msgstr[1] "caestus" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -22836,61 +22785,15 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'test power armor'} +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" #: lang/json/BATTERY_from_json.py @@ -23370,8 +23273,8 @@ msgid_plural "Aero-Evaporator CBMs" msgstr[0] "MCB Aero-evaporador" msgstr[1] "MCB Aero-evaporadores" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -24548,8 +24451,8 @@ msgid_plural "Internal Furnace CBMs" msgstr[0] "MCB Horno interno" msgstr[1] "MCB Horno interno" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -24664,8 +24567,8 @@ msgid_plural "Wind Turbine CBMs" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -24673,22 +24576,6 @@ msgid "" "power level." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "MCB Soldador de precisión" -msgstr[1] "MCBs Soldador de precisión" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "" -"Un conjunto de pequeñas herramientas electrónicas, incluyendo soldadoras de " -"mano y tenazas cortaalambres. No sirven para nada por sí mismas, pero son " -"necesarias para fabricar biónicos." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -24751,14 +24638,43 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "MCB Soldador de precisión" +msgstr[1] "MCBs Soldador de precisión" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "" +"Un conjunto de pequeñas herramientas electrónicas, incluyendo soldadoras de " +"mano y tenazas cortaalambres. No sirven para nada por sí mismas, pero son " +"necesarias para fabricar biónicos." + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "MCB Generador de Sobrecarga Iónica" msgstr[1] "MCB Generador de Sobrecarga Iónica" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -24929,6 +24845,35 @@ msgstr[1] "" msgid "template for a paperback nonfiction book" msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -26404,8 +26349,8 @@ msgstr[1] "esquemas" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -27594,10 +27539,8 @@ msgstr[1] "novelas de aventura" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." +"in the heart of the African continent." msgstr "" -"Una excitante historia sobre una carrera contra el tiempo, en busca de una " -"ciudad perdida localizada en el corazón oscuro del continente africano." #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -27614,30 +27557,6 @@ msgstr "" "Una atrapante historia de dos amigos luchando por sobrevivir en las calles " "de la ciudad de Nueva York." -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "novela de iniciación" -msgstr[1] "novelas de iniciación" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "" -"Una clásica historia sobre madurar, narra las emotivas y divertidas " -"experiencias de un joven sobre la vida, el amor y el sexo." - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "" -"Es una novela gráfica acerca de una joven mujer viviendo en Irán durante los" -" 80, viendo cómo el mundo cambia a su alrededor cuando Irak invade su país." - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -27770,76 +27689,6 @@ msgstr[1] "novelas de misterio" msgid "A detective investigates an unusual murder in a secluded location." msgstr "Un detective investiga un inusual asesinato en un lugar aislado." -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "novela pulp" -msgstr[1] "novelas pulp" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "" -"Un historia dura de detectives, llena de acción contundente e intriga." - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "Asesinatos de Ayer" -msgstr[1] "Asesinatos de Ayer" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -28012,11 +27861,8 @@ msgstr[1] "novelas de samurai" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." +"marauding outlaws. This hardback is quite hefty." msgstr "" -"La clásica historia de un espadachín errante que llega a un pequeño poblado " -"y es contratado para ayudar a sus habitantes a defenderse de una banda de " -"forajidos saqueadores." #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -28062,16 +27908,18 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "" msgstr[1] "" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" #: lang/json/BOOK_from_json.py @@ -28100,329 +27948,6 @@ msgid "" "nuclear destruction isn't much of an influence on human nature." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "novela de ciencia ficción" -msgstr[1] "novelas de ciencia ficción" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "Extraterrestres, pistolas de rayos y naves espaciales." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "Es una copia de \"Los desposeídos\" de Ursula Le Guin." - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" -"Es una copia de \"La chica mecánica\" de Paolo Bacigalupi. La nota en la " -"solapa te hace preguntarte cómo le fue a Tailandia en el fin del mundo. " - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "Es una copia de \"Vurt\" por Jeff Noon." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "Es una copia de \"La guerra de los mundos\" de H.G. Wells." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "Es una copia de \"Simulacron-3\" de Daniel F. Galouye." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "Es una copia de \"Viaje al centro de la Tierra\" de Julio Verne." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -29733,6 +29258,585 @@ msgid "" " key work in the existentialist tradition." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "novela pulp" +msgstr[1] "novelas pulp" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "" +"Un historia dura de detectives, llena de acción contundente e intriga." + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "Asesinatos de Ayer" +msgstr[1] "Asesinatos de Ayer" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "novela de ciencia ficción" +msgstr[1] "novelas de ciencia ficción" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "Extraterrestres, pistolas de rayos y naves espaciales." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "Es una copia de \"Los desposeídos\" de Ursula Le Guin." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" +"Es una copia de \"La chica mecánica\" de Paolo Bacigalupi. La nota en la " +"solapa te hace preguntarte cómo le fue a Tailandia en el fin del mundo. " + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "Es una copia de \"Vurt\" por Jeff Noon." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "Es una copia de \"La guerra de los mundos\" de H.G. Wells." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "Es una copia de \"Simulacron-3\" de Daniel F. Galouye." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "Es una copia de \"Viaje al centro de la Tierra\" de Julio Verne." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -30058,8 +30162,9 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" #: lang/json/BOOK_from_json.py @@ -31496,11 +31601,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "" msgstr[1] "" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -31510,24 +31616,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "" msgstr[1] "" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "" msgstr[1] "" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -31538,11 +31646,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "" msgstr[1] "" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -31553,11 +31662,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "" msgstr[1] "" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -31566,11 +31676,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "" msgstr[1] "" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -31580,11 +31691,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "" msgstr[1] "" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -31594,11 +31706,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "" msgstr[1] "" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -31608,11 +31721,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "" msgstr[1] "" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -31620,6 +31734,64 @@ msgid "" " unsavory elements." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "novela de iniciación" +msgstr[1] "novelas de iniciación" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "" +"Una clásica historia sobre madurar, narra las emotivas y divertidas " +"experiencias de un joven sobre la vida, el amor y el sexo." + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -33292,6 +33464,47 @@ msgid "" "harmless." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -33647,36 +33860,6 @@ msgid "" " - F. \"." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -35412,12 +35595,7 @@ msgstr[1] "" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." +msgid "Meat from a heavily mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -35430,10 +35608,8 @@ msgstr[1] "pedazos de carne mutante" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -35506,10 +35682,7 @@ msgstr[1] "" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" +msgid "This is a cooked chunk of meat from a mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -35518,6 +35691,14 @@ msgid_plural "cooked scraps of mutant meat" msgstr[0] "" msgstr[1] "" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -35549,6 +35730,17 @@ msgstr "" " esenciales, pero mucha gente lo considera desagradable salvo que sea " "cuidadosamente preparado." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -35741,6 +35933,17 @@ msgid "" "all cooked out." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -35920,8 +36123,9 @@ msgstr[1] "" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -37372,19 +37576,17 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "Es agua con azúcar o miel agregada. El gusto está bien." #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" -msgstr[0] "té" -msgstr[1] "tés" +msgid "black tea" +msgid_plural "black teas" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" -"La bebida del caballero, hecha aplicando agua caliente a hojas de la planta " -"del té, /Camellia sinensis/." #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -37437,6 +37639,33 @@ msgstr "" "Agua mineral extravagante, tan extravagante que tenerla en la mano te hace " "sentir extravagante." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -43473,7 +43702,6 @@ msgstr[0] "piñones" msgstr[1] "piñones" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "" @@ -44498,16 +44726,42 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -44604,14 +44858,11 @@ msgstr[1] "" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -45480,12 +45731,12 @@ msgstr "" " para extraer la azúcar." #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "hoja de té" -msgstr[1] "hojas de té" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "Dried leaves of a tropical plant. You can boil them into tea, or you can " @@ -45494,6 +45745,19 @@ msgstr "" "Hojas secas de una planta tropical. La puedes hervir para hacer té, o las " "puedes comer crudas. No te van a llenar mucho, igual." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -48365,6 +48629,72 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -48754,6 +49084,12 @@ msgid_plural "ankylosaurus eggs" msgstr[0] "" msgstr[1] "" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "" +msgstr[1] "" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -49088,7 +49424,7 @@ msgid_plural "scream mushrooms" msgstr[0] "" msgstr[1] "" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -49284,113 +49620,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -50308,21 +50537,6 @@ msgstr[1] "latas de aluminio" msgid "An aluminum can, like what soda comes in." msgstr "Es una lata de aluminio, como la de los refrescos." -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "lata abierta de aluminio" -msgstr[1] "latas abiertas de aluminio" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Es una lata de aluminio, como las de los refrescos. Esta ha sido abierto y " -"no puede ser cerrado fácilmente." - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -50332,26 +50546,9 @@ msgstr[1] "cartones de papel" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" -"Un cartón de medio galón construido con papel, aluminio y plástico laminado." -" Tiene una tapa roscada para un cierre fácil." - -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "cartón de papel abierto" -msgstr[1] "cartones de papel abiertos" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" -"Un cartón de medio galón construido con papel, aluminio y plástico laminado." -" Está abierto y su contenido se echará a perder." #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" @@ -50375,19 +50572,6 @@ msgstr[1] "" msgid "A small tin can, like what tuna comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -50399,19 +50583,6 @@ msgstr[1] "" msgid "A medium tin can, like what soup comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -50497,19 +50668,6 @@ msgstr[1] "vasos de plástico" msgid "A small, vacuum formed cup." msgstr "Es un vaso pequeño que en algún momento estuvo sellado al vacío." -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "vaso abierto de plástico" -msgstr[1] "vasos abiertos de plástico" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "" -"Es un vaso pequeño sellado al vacío en algún momento. Ahora, esencialmente " -"basura." - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -50698,7 +50856,6 @@ msgstr[0] "jarro de galón" msgstr[1] "jarros de galón" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "" @@ -50815,7 +50972,6 @@ msgstr[0] "odre pequeño" msgstr[1] "odres pequeños" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -50953,19 +51109,6 @@ msgid "" "food." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -51501,6 +51644,34 @@ msgstr[1] "pedazos de quitina" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "Un pedazo del exoesqueleto de un insecto. Es liviano y muy duradero." +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -51571,6 +51742,34 @@ msgid "" "Felt patches, bundled tightly together for storage. Disassemble to unpack." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -52851,8 +53050,8 @@ msgid_plural "lotus flowers" msgstr[0] "" msgstr[1] "" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -54410,6 +54609,17 @@ msgstr "" "Un cañón láser que pertenecía a una torreta láser TX-5LR Cerberus. No se " "puede usar como arma así solo sin las partes necesarias." +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "conjunto de corazas de hueso" +msgstr[1] "conjuntos de corazas de hueso" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "Placas de hueso para ser usadas como coraza en un vehículo." + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -58753,7 +58963,7 @@ msgstr[1] "" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" #. ~ Description for {'str': 'lucerne hammer'} @@ -59148,7 +59358,6 @@ msgstr[0] "palo con punta" msgstr[1] "palos con punta" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "Es un simple palo de madera con una punta afilada." @@ -59250,19 +59459,15 @@ msgstr[1] "alabardas" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." +" attached to a long sturdy stick." msgstr "" -"Es un arma de asta versátil con una cuchilla de hacha, una púa, y otras " -"cosas divertidas agregadas a un palo largo." #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." +"spike, and other fun things attached to a thick pole." msgstr "" -"Es una réplica berreta sin filo de una arma de asta con una cuchilla de " -"hacha, una púa, y otras cosas divertidas agregadas a un palo largo." #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -59919,19 +60124,6 @@ msgstr "" "cuchilla similar a una garra, proveniente de India y diseñada para estar " "oculta en la palma de la mano." -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "caestus" -msgstr[1] "caestus" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -60203,7 +60395,6 @@ msgstr[0] "tubo" msgstr[1] "tubos" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -60427,7 +60618,13 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -61381,11 +61578,9 @@ msgstr[1] "gujas improvisadas" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." msgstr "" -"Es una gran cuchilla unida a un palo largo. Puede causar un daño " -"considerable." #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -61564,6 +61759,21 @@ msgstr[1] "" msgid "A stapler for fastening sheets of paper together." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -61853,6 +62063,19 @@ msgstr "" " al vehículo hasta que flote. Después ponele los remos o el motor para que " "se pueda mover." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -62859,7 +63082,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "Una lámina fina de metal." @@ -62984,17 +63206,6 @@ msgstr[1] "conjuntos de coraza de quinita biosilicificada" msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "conjunto de corazas de hueso" -msgstr[1] "conjuntos de corazas de hueso" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "Placas de hueso para ser usadas como coraza en un vehículo." - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -63299,8 +63510,8 @@ msgid_plural "workbenches" msgstr[0] "" msgstr[1] "" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -63486,6 +63697,17 @@ msgstr "" "Una canillas de metal que puede ser puesta en un tanque de agua para " "facilitar el uso." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -64112,6 +64334,18 @@ msgstr[1] "permutadores lógicos acausales" msgid "It has given you an answer, but you are yet to ask anything." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -64206,10 +64440,21 @@ msgstr[1] "" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." msgstr "" -"Es un poderoso electroimán hecho con un superconductor de temperatura " -"ambiente." #: lang/json/GENERIC_from_json.py msgid "composite alloy" @@ -64833,6 +65078,17 @@ msgid "" "battles is bookmarked." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -64846,6 +65102,66 @@ msgid "" "art." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -64868,7 +65184,7 @@ msgstr[1] "" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" @@ -64993,7 +65309,7 @@ msgstr[1] "" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" #: lang/json/GENERIC_from_json.py @@ -66380,140 +66696,6 @@ msgid "" "much more expensive." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "ARMAS" @@ -69958,30 +70140,6 @@ msgid "" "tips." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "predeterminado" @@ -69997,7 +70155,10 @@ msgstr "" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -70039,8 +70200,9 @@ msgstr "" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -70247,16 +70409,6 @@ msgstr "" msgid "Allows stats to raise via skill progression." msgstr "" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "DATOS DE PRUEBA" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "Desarrollo Urbano" @@ -72348,6 +72500,17 @@ msgstr "" "todas las cabezas se mueven rápidamente y las bocas arman un coro de gritos " "y quejidos." +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "humano" +msgstr[1] "humanos" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -74601,6 +74764,19 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -75255,6 +75431,92 @@ msgid "" "looking for patient to assist." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -78030,6 +78292,19 @@ msgstr "" "Un dinosaurio enorme con similitudes al rinoceronte, con una cresta de " "huesos de la que le salen tres cuernos grandes." +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -78057,6 +78332,19 @@ msgstr "" "Este dinosaurio parece como un quirquincho prehistórico gigante. Su cola " "termina en lo que parece un garrote enorme de hueso con púas." +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -78289,6 +78577,116 @@ msgid_plural "magenta and green hatchlings" msgstr[0] "" msgstr[1] "" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -78301,12 +78699,133 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -78314,6 +78833,73 @@ msgid "" "sickle-like claw." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -79063,21 +79649,6 @@ msgid "" "traditional forces." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" -"Tiene una forma vagamente humanoide, cubierta de capas de algo que parece " -"papel higiénico." - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -79452,19 +80023,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "" @@ -80209,6 +80767,22 @@ msgstr "" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "" @@ -80612,8 +81186,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "" @@ -81101,10 +81675,10 @@ msgstr "" msgid "Jolt" msgstr "" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "" @@ -81173,6 +81747,31 @@ msgstr "" msgid "Wall of Fog" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "" @@ -81285,65 +81884,37 @@ msgstr "" msgid "X-ray Vision" msgstr "" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "" - -#. ~ Description for Pew, Pew #: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." +msgid "Knock" msgstr "" -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "El Suelo es Lava" - -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." msgstr "" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" +msgid "Improved Knock" msgstr "" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" msgstr "" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" #: lang/json/TOOLMOD_from_json.py @@ -83929,28 +84500,33 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" msgstr[0] "" msgstr[1] "" +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" msgid_plural "Belts of Weaponry" @@ -88878,13 +89454,11 @@ msgstr[1] "móviles inteligentes" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "Activas la aplicación de linterna." #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "El cargador del móvil inteligente es demasiado bajo." @@ -90373,7 +90947,6 @@ msgstr[0] "hacha de bombero" msgstr[1] "hachas de bombero" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -90390,7 +90963,6 @@ msgstr[0] "barra halligan" msgstr[1] "barras halligan" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -90663,6 +91235,30 @@ msgstr "" "Es una piedra aplanada sujetada a un palo. Funciona bastante bien como pala," " pero la verdad es que no se puede comparar con una pala seria." +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -90693,6 +91289,28 @@ msgstr "" "Es una herramienta para cavar. Úsala para cavar pozos en los espacios " "adyacentes al lugar donde estés parado." +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -91523,6 +92141,12 @@ msgstr "" "Es una forja portátil para metalurgia, alimentada a carbón. Si se combina " "con las herramientas adecuadas, se puede usar para trabajar el metal." +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -91675,6 +92299,18 @@ msgstr "" "Son unas largas pinzas de metal. Son comúnmente usadas para cocinar o para " "trabajar el metal." +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -91846,6 +92482,19 @@ msgstr "" "de transportar. Te aísla del suelo, lo que facilita dormir. Úsalo para " "desenrollarlo y ponerlo en el suelo." +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -93826,7 +94475,6 @@ msgstr[0] "trapo" msgstr[1] "trapos" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -94307,12 +94955,12 @@ msgstr "" "apagarla." #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" +msgid "stone axe head" +msgid_plural "stone axe heads" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -94320,12 +94968,12 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" +msgid "metal axe head" +msgid_plural "metal axe heads" msgstr[0] "" msgstr[1] "" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -94450,6 +95098,12 @@ msgstr "" "para cocinar ladrillos, pero la puedes usar para cocinar cualquier cosa " "hecha de arcilla." +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -94622,7 +95276,6 @@ msgstr[0] "gato hidráulico de tipo tijera" msgstr[1] "gatos hidráulicos de tipo tijera" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "" @@ -94879,7 +95532,6 @@ msgstr[0] "destornillador" msgstr[1] "destornilladores" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -94929,7 +95581,6 @@ msgstr[0] "soldadora de mano" msgstr[1] "soldadoras de mano" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -95359,14 +96010,14 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" +msgid "pseudo atomic butter churn" +msgid_plural "pseudo atomic butter churns" msgstr[0] "" msgstr[1] "" #: lang/json/TOOL_from_json.py -msgid "pseudo atomic butter churn" -msgid_plural "pseudo atomic butter churns" +msgid "precision solderers" +msgid_plural "precision solderers" msgstr[0] "" msgstr[1] "" @@ -95566,6 +96217,21 @@ msgid "" "specialized tools." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -96418,6 +97084,66 @@ msgid_plural "greater wands of cone of cold" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -96598,6 +97324,66 @@ msgid_plural "disposable greater wands of cone of cold" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -96734,75 +97520,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -97195,14 +97912,42 @@ msgstr "" msgid "Freeman's favorite" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "Aspirante a maga" @@ -98009,10 +98754,6 @@ msgstr "" msgid "mana energy" msgstr "" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "Bomba de Adrenalina" @@ -99584,19 +100325,6 @@ msgstr "" msgid "Wind Turbines" msgstr "Turbinas de viento" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "" @@ -99643,6 +100371,19 @@ msgid "" "and fast." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -99991,7 +100732,7 @@ msgid "Merciful" msgstr "" #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "Todo/as" @@ -102633,7 +103374,7 @@ msgstr "" msgid "You mount your steed." msgstr "" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "En LLamas" @@ -105130,66 +105871,6 @@ msgstr "" msgid "The gum webs constrict your movement." msgstr "" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "Tus Seguidores" @@ -105387,6 +106068,17 @@ msgid "" " the kind words used about them." msgstr "" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "" @@ -109470,6 +110162,77 @@ msgid "" "temperature. You'll need to take it down first." msgstr "" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -109838,8 +110601,7 @@ msgid "" " a double barrel shotgun." msgstr "" -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "escopeta" @@ -110010,7 +110772,8 @@ msgstr "" "siglo XXI. Con poco de cinta adhesiva y partes electrónicas, funciona con un" " UPS normal." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistola" @@ -110589,8 +111352,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" msgstr[0] "" msgstr[1] "" @@ -113836,6 +114599,18 @@ msgid "" "will have to suffice." msgstr "" +#: lang/json/gun_from_json.py +msgid "makeshift shotgun" +msgid_plural "makeshift shotguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -114595,6 +115370,16 @@ msgstr "" msgid "trilaser" msgstr "" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -115386,6 +116171,12 @@ msgid "" "reliability." msgstr "" +#: lang/json/gun_from_json.py +msgid "slam-fire shotgun" +msgid_plural "slam-fire shotguns" +msgstr[0] "" +msgstr[1] "" + #: lang/json/gun_from_json.py msgid "Ichaival" msgid_plural "Ichaivals" @@ -115466,22 +116257,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -117511,16 +118286,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "Destripás y fileteás el pescado" @@ -117552,8 +118317,32 @@ msgid "" msgstr "" #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "Laboriosamente, diseccionas el gigantesco insecto." +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -120536,6 +121325,13 @@ msgstr "" msgid "This item can be used to communicate with radio waves." msgstr "" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -122862,6 +123658,15 @@ msgstr "" msgid "Zombie trap." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -124167,6 +124972,11 @@ msgid "" "years.'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "Sin estilo" @@ -124437,6 +125247,21 @@ msgid "" "Lasts 3 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "Capoeira Tempo" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "Kung Fu de la Grulla" @@ -124592,6 +125417,22 @@ msgid "" "+2 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "Combinación de Eskrima" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "Esgrima" @@ -124629,6 +125470,33 @@ msgid "" "Blocked damage reduced by 50% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "Parada" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -124677,6 +125545,34 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "Judo" @@ -124925,6 +125821,32 @@ msgid "" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "Muay Thai" @@ -124963,6 +125885,21 @@ msgid "" "Blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "Ninjutsu" @@ -125028,6 +125965,34 @@ msgid "" "Last 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "Niten Ichi-Ryu" @@ -125101,6 +126066,39 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "Pancracio" @@ -125252,6 +126250,21 @@ msgid "" "Perception increases Accuracy instead of Dexterity. Accuracy increased by 25% of Perception but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "" @@ -125406,6 +126419,21 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "Kung Fu del Tigre" @@ -125462,6 +126490,21 @@ msgid "" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "" @@ -125515,6 +126558,20 @@ msgid "" " Dodging Skill increased by 15% of Perception. Blocked damage reduced by 50% of Perception." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "Zui Quan" @@ -125634,6 +126691,34 @@ msgstr "" "+Inteligencia armadura contra electricidad, +Percepción armadura contra " "fuego." +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "Combativo Biónico" @@ -125673,6 +126758,22 @@ msgid "" "+2 Blocks attempts, +1 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "Kung Fu del Ciempiés" @@ -125710,6 +126811,20 @@ msgid "" "Lasts 3 turns. Stacks 4 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "Kung Fu del Lagarto" @@ -125829,6 +126944,20 @@ msgid "" "Stacks 2 times. Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "Kung Fu del Sapo" @@ -125880,6 +127009,34 @@ msgid "" "Lasts 6 turns. Stacks 6 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "Kung Fu de la Víbora" @@ -126221,6 +127378,34 @@ msgid "" "Lasts 1 turn. Stacks 2 times" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "" @@ -126314,6 +127499,46 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "" @@ -126365,6 +127590,393 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "Alcohol" @@ -126848,7 +128460,7 @@ msgid "Emulsified Hydrogel" msgstr "" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "" #: lang/json/material_from_json.py @@ -128598,7 +130210,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "Gracias. " @@ -128890,7 +130502,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" @@ -130644,6 +132256,87 @@ msgstr "Si, seguro." msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Hacer 2 Destiladores" @@ -131955,6 +133648,54 @@ msgstr "" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "" @@ -134290,6 +136031,23 @@ msgstr "" "Puedes moverte más rápido que la mayoría. Tienes un 15% de bonus sobre la " "velocidad normal a pie." +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -134302,13 +136060,50 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." msgstr "" #: lang/json/mutation_from_json.py @@ -134417,12 +136212,12 @@ msgstr "Sanador/a Veloz" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" -"Te curas más rápido cuando duermes e incluso recuperas una pequeña cantidad " -"de PV cuando no duermes." #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -135161,8 +136956,11 @@ msgstr "Sanador/a Lento/a" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." -msgstr "Te curas un poco más lento que la mayoría; dormir curará menos PV." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." +msgstr "" #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -135170,12 +136968,11 @@ msgstr "Poco Sanador/a" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." msgstr "" -"Tu recuperación de la salud a través del sueño se ve gravemente afectada y " -"hace que recuperes solo un tercio de los PV habituales." #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -135183,12 +136980,11 @@ msgstr "Sanador/a Imperceptivo/a" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" -"Apenas te recupera la salud al dormir, solo sanará una décima parte de los " -"PV habituales." #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -135998,12 +137794,11 @@ msgstr "Sanador Muy Rápido" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" -"Tu carne se regenera lentamente, y vas a recuperar PV incluso sin estar " -"durmiendo." #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -136011,8 +137806,12 @@ msgstr "Regeneración" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "Tu carne se regenera de sus heridas increíblemente rápido." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -136020,8 +137819,10 @@ msgstr "Sanador Reptiliano" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "Tus miembros rotos se curan solos sin mucha dificultad." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -137191,9 +138992,9 @@ msgid "" "grass as well as underbrush and shrubs. Eat either one by activating this, " "standing over your target, and pressing E." msgstr "" -"Estás acostumbrado a comer plantas de manera directa, y podés obtener " -"nutrientes del pasto y también de la maleza y de los arbustos. Te los podés " -"comer parándote encima y apretando 'E'." +"Estás acostumbrado a comer plantas de manera directa, y puedes obtener " +"nutrientes de la hierba y también de la maleza y de los arbustos. Te los " +"puedes comer parándote encima y apretando 'E'." #: lang/json/mutation_from_json.py msgid "Intestinal Fortitude" @@ -140597,7 +142398,8 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py @@ -141857,6 +143659,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "" @@ -141865,7 +143689,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -142847,6 +144672,14 @@ msgstr "" msgid "Humans created me. Let's see what I can be on my own." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "" @@ -143132,6 +144965,14 @@ msgstr "" msgid "Millyficen Whately" msgstr "" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "" + #: lang/json/npc_from_json.py msgid "magus" msgstr "dulce" @@ -150603,6 +152444,118 @@ msgstr "" "supervivientes de un lugar a otro. Sabias que solo era cuestión de tiempo " "antes que los horrores que rondan el cielo te derribaran." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -150783,8 +152736,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -150797,8 +152751,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -152075,6 +154030,226 @@ msgid "" "find some other use." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -153741,7 +155916,7 @@ msgid "build a metalworking forge" msgstr "" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" #: lang/json/recipe_from_json.py @@ -158156,6 +160331,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -168429,6 +170638,326 @@ msgstr "-estilo" msgid "-chant" msgstr "-chant" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -176763,6 +179292,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "El medio de la nada" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "Celda de Experimentos" @@ -177059,6 +179592,12 @@ msgstr "" msgid "Yeah, alright." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "" @@ -177068,9 +179607,7 @@ msgid "That is all for now." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." +msgid "There are bones to etch, songs to sing. Wish to join me?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -177082,7 +179619,7 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" +msgid "A song may yet be sung by you, should you wish to." msgstr "" #: lang/json/talk_topic_from_json.py @@ -177094,10 +179631,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "Entiendo." @@ -177692,11 +180225,11 @@ msgid "no, go back to sleep." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -177935,15 +180468,15 @@ msgstr "" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "No importa." @@ -178147,14 +180680,14 @@ msgstr "" msgid "OVERRIDE: " msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -178510,14 +181043,14 @@ msgstr "Bueno, sin hacer movimientos repentinos..." msgid "Keep your distance!" msgstr "¡Quédate lejos!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "Este es mi territorio, ." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "Este es mi territorio, ." + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Cálmate. No voy a hacerte daño." @@ -178570,30 +181103,30 @@ msgstr "¿Qué pasa?" msgid "I don't care." msgstr "No me importa." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "No tengo ningún otro trabajo para ti." - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "No tengo ningún trabajo para ti." #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "Tengo más trabajos para tí. ¿Quieres saber de ellos?" +msgid "I don't have any more jobs for you." +msgstr "No tengo ningún otro trabajo para ti." #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "Tengo otros trabajos para ti. ¿Quieres saber de ellos?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Tengo un trabajo para ti. ¿Quieres que te cuente?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "Tengo más trabajos para tí. ¿Quieres saber de ellos?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Tengo otro trabajo para ti. ¿Quieres que te cuente?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Tengo un trabajo para ti. ¿Quieres que te cuente?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -178603,6 +181136,10 @@ msgstr "Ah, bueno." msgid "Never mind, I'm not interested." msgstr "No importa, no estoy interesado." +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "No estás trabajando en nada para mí ahora." + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "¿Cuál trabajo?" @@ -178611,10 +181148,6 @@ msgstr "¿Cuál trabajo?" msgid "What about it?" msgstr "¿Qué te parece?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "No estás trabajando en nada para mí ahora." - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "¡Lo haré!" @@ -178829,6 +181362,10 @@ msgstr "Hmm, bueno." msgid "Thanks!" msgstr "¡Gracias!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "" @@ -178853,10 +181390,6 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "Ah, bueno." @@ -178961,6 +181494,10 @@ msgstr "No, vamos a estar bien aquí." msgid "On second thought, never mind." msgstr "Pensandolo bien, olvidate." +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "" @@ -178973,10 +181510,6 @@ msgstr "Dale tiempo, te voy a mostrar algo nuevo después..." msgid "I have some reason for denying you training." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "¡No hay ninguna oportunidad, me van a dejar atrás!" @@ -184865,12 +187398,12 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"How's things with you? My cardboard collection is getting quite impressive." +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "" +"How's things with you? My cardboard collection is getting quite impressive." msgstr "" #: lang/json/talk_topic_from_json.py @@ -189374,6 +191907,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "" @@ -189387,11 +191932,11 @@ msgid "Hey." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Yes?" +msgid "Good to see you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Good to see you." +msgid "About those jobs…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -189403,7 +191948,7 @@ msgid "Want help with something else?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." +msgid "Lets set a combat strategy" msgstr "" #: lang/json/talk_topic_from_json.py @@ -189457,6 +192002,10 @@ msgstr "" msgid "Anything on your mind?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "" @@ -190528,6 +193077,263 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "" @@ -191059,10 +193865,6 @@ msgstr "Bloqueas el/la %s" msgid " blocks %s" msgstr " bloquea el/la %s" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "Parada" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -193500,6 +196302,90 @@ msgstr "" msgid " unleashes a spin attack against %s and those nearby" msgstr "" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "" @@ -193556,6 +196442,216 @@ msgstr "" msgid " launches a supersonic punch at %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -193601,6 +196697,10 @@ msgstr "" msgid "Life springs anew from the dead grass." msgstr "" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "tierra calcinada" @@ -201399,6 +204499,11 @@ msgstr "casco de madera de bote" msgid "A wooden board that keeps the water out of your boat." msgstr "" +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -201845,14 +204950,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "asiento de madera" +msgid "flimsy wooden seat" +msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "Un lugar para sentarse." +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "asiento de madera" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "púa de madera" @@ -202062,6 +205172,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "" @@ -202671,6 +205790,11 @@ msgstr "" msgid "At least %s from %s (%s remaining)" msgstr "" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -202687,12 +205811,13 @@ msgid "Within %s of %s (passed)" msgstr "" #: src/achievement.cpp -msgid "Triggered by " +#, c-format +msgid "Triggered by %s" msgstr "" #: src/achievement.cpp #, c-format -msgid "%s/%s " +msgid "%s/%s %s" msgstr "" #: src/achievement.cpp @@ -204657,7 +207782,7 @@ msgstr "[<] pág. %1$d de %2$d [>]" msgid "< [%s] Sort: %s >" msgstr "< [%s] Orden: %s >" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "[%s] Filtro" @@ -207802,10 +210927,18 @@ msgstr "" msgid "Accuracy" msgstr "Precisión" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "Esquivar" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "Velocidad" @@ -208298,20 +211431,25 @@ msgstr " se para." #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "¡El %s se libera de las telarañas!" +msgid "The %s escapes the bear trap!" +msgstr "¡El %s se escapa de la trampa para osos!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "¡Te consigues liberarte de las telarañas!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr "¡ consigue liberarse de las telarañas!" +msgid "You free yourself from the bear trap!" +msgstr "¡Te consigues liberarte de la trampa para oso!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "¡Intentas liberarte de las telarañas, pero no puedes!" +msgid " frees themselves from the bear trap!" +msgstr "¡ consigue liberarse de la trampa para oso!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "¡Intentas liberarte de la trampa para oso, pero no puedes!" #: src/character.cpp src/monster.cpp #, c-format @@ -208347,28 +211485,6 @@ msgstr "¡ consigue liberarse de la trampa pesada de lazo!" msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "¡Intentas liberarte de la trampa pesada de lazo, pero no puedes!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "¡El %s se escapa de la trampa para osos!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "¡Te consigues liberarte de la trampa para oso!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr "¡ consigue liberarse de la trampa para oso!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "¡Intentas liberarte de la trampa para oso, pero no puedes!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "¡Te consigues liberarte de los escombros!" @@ -208381,18 +211497,6 @@ msgstr "¡ consigue liberarse de los escombros!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "¡Intentas liberarte de los escombros, pero no puedes!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "Intentas escaparte del pozo, pero te resbalás y volvés a caer." - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "¡Te escapás del pozo!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr "¡ se escapa del pozo!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -208432,6 +211536,35 @@ msgstr "¡Logras liberarte del agarre!" msgid " breaks out of the grab!" msgstr "¡ logra liberarse del agarre!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "¡El %s se libera de las telarañas!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "¡Te consigues liberarte de las telarañas!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr "¡ consigue liberarse de las telarañas!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "¡Intentas liberarte de las telarañas, pero no puedes!" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "Intentas escaparte del pozo, pero te resbalás y volvés a caer." + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "¡Te escapás del pozo!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr "¡ se escapa del pozo!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -212232,14 +215365,6 @@ msgstr "Dibujar benchmark (X segundos)" msgid "Test trait group" msgstr "Probar grupo de rasgos" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "Mostrar mensaje de depuración" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "Alternar ruta de PNJ en el mapa" @@ -212268,6 +215393,18 @@ msgstr "Información..." msgid "Enable achievements" msgstr "" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "Mostrar mensaje de depuración" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "Salir a menú principal" + #: src/debug_menu.cpp msgid "Game…" msgstr "" @@ -212364,10 +215501,6 @@ msgstr "Generar mapa anidado" msgid "Map…" msgstr "Mapa..." -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "Salir a menú principal" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -212890,6 +216023,10 @@ msgstr "Marcar como completada" msgid "Remove mission without proper cleanup" msgstr "" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -214140,138 +217277,182 @@ msgid "Liked" msgstr "Querido" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "Leyenda" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "Indiscutido" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "Potente" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "Famoso" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "Muy Conocido" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "Del que se Habla" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "Basura Despreciable" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "Alimaña" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "Despreciable" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "Parásito" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "Chupasangre" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "Hazmerreír" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "Neutral" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "Rico Asqueroso" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "Pudiente" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "Próspero" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "Acaudalado" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "Cómodo" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "Deficiente" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "Fracasado" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "Empobrecido" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "Destituir" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "Rebosante" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "Adecuadamente" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "Desguazando por" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "Malnutrido" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "Muerto de Hambre" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "Leyenda" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "Experto" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "Veterano" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "Habilidoso" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "Competente" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "Inexperto" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "Lisiado" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "Debilitado" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "Inútil" @@ -214866,12 +218047,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -215886,7 +219067,7 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" +msgid "No suitable items are located at the drop points…" msgstr "" #: src/faction_camp.cpp @@ -216105,6 +219286,13 @@ msgstr "¡El/La %s está peligrosamente cerca!" msgid "Wait till you wake up…" msgstr "" +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -216215,6 +219403,11 @@ msgctxt "action" msgid "open" msgstr "" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -217728,11 +220921,25 @@ msgstr "" msgid "You cannot haul items here." msgstr "" +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "¡%s esta en el camino!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "¡Hay un %s en el medio!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -219118,11 +222325,6 @@ msgstr "¡Hay un estúpido en el medio!" msgid "The %s is in the way!" msgstr "¡El %s esta en el camino!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "¡%s esta en el camino!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -220392,6 +223594,11 @@ msgstr "" msgid "Attempt to hack this safe?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -221617,6 +224824,10 @@ msgstr "" msgid "Splint broken limbs" msgstr "" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "No tienes instalado ningún biónico." @@ -221644,16 +224855,78 @@ msgid " doesn't have limbs that require splinting." msgstr "" #: src/iexamine.cpp -msgid "This mill already contains flour." +msgid "You don't have any wounds that need treatment." msgstr "" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." +msgid " doesn't have any wounds that need treatment." msgstr "" +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "Los espasmos musculares empiezan a desaparecer." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "El medicamento no hace nada para ayudarte con los espasmos." + #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "This mill contains %s, which can't be milled!" msgstr "" #: src/iexamine.cpp @@ -221829,7 +225102,8 @@ msgid "Remove brake and start milling" msgstr "" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." +#, c-format +msgid "Remove brake and start milling, milling will take about %s." msgstr "" #: src/iexamine.cpp @@ -221863,18 +225137,7 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "" -msgstr[1] "" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." +msgid "It should take about %s to finish milling." msgstr "" #: src/iexamine.cpp @@ -222640,7 +225903,7 @@ msgstr "Volumen (%s):" msgid "There are no available choices" msgstr "No hay opciones disponibles" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "[%s] Filtro: " @@ -223533,10 +226796,6 @@ msgstr "Modificador de capacidad de peso:" msgid "Weight capacity bonus: " msgstr "Bonus de capacidad de peso:" -#: src/item.cpp -msgid "Storage: " -msgstr "Almacenamiento: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* Este objeto puede ser usado con un casco." @@ -223821,6 +227080,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* Esta herramienta funciona con energía biónica." +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -223844,9 +227131,21 @@ msgstr "* Este objeto puede ser reforzado." msgid "* This item is not repairable." msgstr "* Este objeto no se puede reparar." +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items +#: src/item.cpp +#, c-format +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." msgstr "" #: src/item.cpp @@ -223965,26 +227264,27 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" +msgid "Bashing: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" +msgid "Critical bash: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" +msgid "Cutting: " msgstr "" #: src/item.cpp -#, c-format -msgid "%d moves per attack" +msgid "Critical cut: " +msgstr "" + +#: src/item.cpp +msgid "Piercing: " +msgstr "" + +#: src/item.cpp +msgid "Critical pierce: " msgstr "" #: src/item.cpp @@ -224587,8 +227887,9 @@ msgstr "Tu %1$s no puede contener más %2$s." msgid "That %s doesn't have room to expand." msgstr "Ese/a %s no tiene más espacio para expandirlo/a." -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d x %s" @@ -224712,6 +228013,56 @@ msgstr "No tienes ningún objeto con uso registrado" msgid "Execute which action?" msgstr "¿Qué acción quieres realizar?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" @@ -224752,6 +228103,11 @@ msgstr "¿Qué grupo quieres probar?" msgid "Result of 100 spawns:" msgstr "Resultado de 100 creaciones:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d x %s" + #: src/item_location.cpp msgid "inventory" msgstr "inventario" @@ -224934,6 +228290,34 @@ msgstr "" msgid "not enough space" msgstr "" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "click." @@ -225003,14 +228387,6 @@ msgstr "Te tomas unos anitibióticos." msgid " takes some antibiotics." msgstr " se toma unos antibióticos." -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "Los espasmos musculares empiezan a desaparecer." - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "El medicamento no hace nada para ayudarte con los espasmos." - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -230690,6 +234066,10 @@ msgstr "Principiante" msgid "Intermediate" msgstr "Intermedio" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "Experto" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "Ancho de nivel:" @@ -234337,6 +237717,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "Activar una alarma." +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -238128,12 +241520,6 @@ msgstr "Enfocar las tendencias hacia:" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "humano" -msgstr[1] "humanos" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -239111,17 +242497,6 @@ msgstr "" msgid "Blood type:" msgstr "" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "" - #: src/newcharacter.cpp msgid "Name:" msgstr "Nombre:" @@ -239134,6 +242509,22 @@ msgstr "Género:" msgid "Select a starting location." msgstr "Elige un lugar de comienzo." +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" +msgstr[1] "" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Stats:" msgstr "Características:" @@ -239203,6 +242594,13 @@ msgstr "" msgid "Starting location:" msgstr "Lugar de comienzo:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "" @@ -240898,6 +244296,14 @@ msgstr "Destrozar" msgid "Pulp Adjacent" msgstr "Destrozar adyacente" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "Minería automática" @@ -243533,6 +246939,16 @@ msgstr "Zona:" msgid "# Unexplored" msgstr "# Sin explorar" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "Distancia a la misión activa:" @@ -243862,6 +247278,10 @@ msgstr "¡Abrasador!" msgid "Very hot!" msgstr "¡Muy caliente!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "Cómodo" + #: src/panels.cpp msgid "Very cold!" msgstr "¡Muy Frio!" @@ -245344,6 +248764,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "Sed -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "Muerto de Hambre" + #: src/player_display.cpp msgid "Underfed" msgstr "Desnutrido/a" @@ -245438,6 +248862,10 @@ msgstr "" "Tu cuerpo está severamente debilitado por el hambre. ¡Podrías morir si no comienzas a comer comidas regulares!\n" "\n" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "Malnutrido" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -246580,6 +250008,15 @@ msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "%1$d herramienta con %2$s de %3$d o más." msgstr[1] "%1$d herramientas con %2$s de %3$d o más." +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" +msgstr[1] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -250637,6 +254074,10 @@ msgstr "...%s = Ver descripción completa" msgid "--NO AVAILABLE MODS--" msgstr "--NINGÚN MOD DISPONIBLE--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "Guardar como defecto la lista de mods activos" diff --git a/lang/po/ja.po b/lang/po/ja.po index b20a90b86a319..c9cfb1371ab6c 100644 --- a/lang/po/ja.po +++ b/lang/po/ja.po @@ -12,7 +12,6 @@ # 02a55f6b0b75a11ad1dedf9f8b4d9b4f, 2018 # 山田太郎, 2018 # Ban Kaidou, 2019 -# T5idr3, 2019 # Dokuo Utuda, 2019 # Maruyama Ryota , 2019 # kanro mizuame , 2019 @@ -23,8 +22,9 @@ # a a , 2019 # Itoh Shu , 2020 # xyz , 2020 -# zojirushi, 2020 # Susuki Mochiduki, 2020 +# T5idr3, 2020 +# zojirushi, 2020 # TEATIME , 2020 # Pigmentblue15, 2020 # @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Pigmentblue15, 2020\n" "Language-Team: Japanese (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ja/)\n" @@ -266,7 +266,6 @@ msgid_plural "rocks" msgstr[0] "石" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -800,6 +799,16 @@ msgstr[0] "ナイトロックス" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "酸素と窒素を潜水に適した比率で混合した気体です。" +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "消火剤" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "消火に効果的な粉末薬品です。" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -3993,6 +4002,25 @@ msgid "" "with some kind of mask or mouth protection." msgstr "化学物質噴霧器に装填して使う、強力な殺虫剤です。使用の際はマスクなどで口を防護しましょう" +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "弾薬(12.3ln)" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" +"12.3ln弾は第二次カルパチア紛争をきっかけにルーマニアで導入されました。この弾薬を使うPA " +"md.71ライフルが東側諸国で急速に人気を博し、その後世界に広まったという経緯から、12.3ln弾はユーラシア圏の標準的な軍用弾薬になりました。そのため、エクゾディはこの弾薬を容易に収集、備蓄できました。見た目は.30-06口径スプリングフィールド弾と非常によく似ていますが、先端が少し細くなっています。" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -4966,7 +4994,7 @@ msgstr[0] "塗料(黄)" msgid "A can of yellow paint." msgstr "塗料(黄)の入った缶です。" -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "絨毯(赤)" @@ -5035,7 +5063,6 @@ msgstr[0] "金" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -5104,7 +5131,6 @@ msgid_plural "small metal sheets" msgstr[0] "小型板金" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "金属製の小さな薄板です。" @@ -6363,63 +6389,6 @@ msgstr[0] "マナ" msgid "Seeing this is a bug." msgstr "このアイテムが見えている場合はバグが発生しています。" -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "石(テスト)" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "小型板金(テスト)" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "矢(木/ブロードヘッド/テスト)" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "矢(テスト)" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "弾薬(9mm/テスト)" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "弾薬(9mm/汎用JHP)" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "弾薬(.45口径/テスト)" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "弾薬(.45口径/テストJHP)" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "ガス(テスト)" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "ガスのような謎の物質です。テスト用ですので、吸い込まないでください。" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "プラチナ片(テスト)" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -6696,8 +6665,6 @@ msgstr[0] "耳栓" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "工業用品質の耳栓です。耳の内部に入れて使います。" @@ -6979,7 +6946,7 @@ msgstr[0] "弾倉ポーチ" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "ほとんどの種類の小型弾薬を入れて持ち運べる小さなポーチです。流石にロケット弾は入りません。使用すると弾薬を装填します。" #: lang/json/ARMOR_from_json.py @@ -7071,9 +7038,9 @@ msgstr[0] "矢筒" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." -msgstr "革製の腰掛け矢筒です。20本の矢を収納できます。" +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." +msgstr "腰に掛けて使う革製の矢筒です。使用すると最大20本の矢を収納します。" #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -7084,8 +7051,8 @@ msgstr[0] "矢筒(白樺樹皮)" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." -msgstr "白樺樹皮を編んで作った、腰に身に着ける矢筒です。20本の矢を収納できます。使用すると矢を収納します。" +"20 arrows or bolts. Use insert to store arrows or bolts." +msgstr "白樺樹皮を編んで作った、腰に掛けて使う矢筒です。使用すると最大20本の矢を収納します。" #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -7096,10 +7063,11 @@ msgstr[0] "矢筒(大型)" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" -"肩に背負って使う、金属で補強した大型の革製矢筒です。矢が60本入ります。歴史的には徒歩弓兵よりも弓騎兵が好んで使っていましたが、ゾンビとの戦いに役立つかは未知数です。使用すると矢を収納します。" +"革製の金属で補強した、肩に背負って使う大型の矢筒です。歴史上では弓騎兵、徒歩弓兵などが使っていましたが、ゾンビとの戦いに役立つかは未知数です。使用すると最大60本の矢を収納します。" #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -7110,8 +7078,8 @@ msgstr[0] "矢筒(大型/白樺樹皮)" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." -msgstr "白樺樹皮で作られた大型の矢筒です。肩に掛けて背負います。60本の矢を収納できます。" +"hold 60 arrows or bolts. Use insert to store arrows or bolts." +msgstr "白樺樹皮を編んで作った、肩に背負って使う大型の矢筒です。使用すると最大60本の矢を収納します。" #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -8441,8 +8409,6 @@ msgid_plural "pairs of socks" msgstr[0] "靴下" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "靴下です。足に身に付けて下さいね。" @@ -10092,6 +10058,17 @@ msgid "" "heat." msgstr "ケブラーとノーメックスで作られた、対爆仕様の軽装甲グローブです。破片や熱から保護するように設計されています。" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "スパイクグローブ" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "関節部に金属が付いているグローブです。" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -15788,7 +15765,6 @@ msgstr[0] "戦闘用外骨格" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "パワーアーマーを装着しました。" @@ -16123,7 +16099,6 @@ msgid_plural "backpacks" msgstr[0] "バックパック" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "小型のバックパックです。最低限の動作制限で、十分な収納容積を確保できます。" @@ -16221,7 +16196,6 @@ msgid_plural "briefcases" msgstr[0] "ブリーフケース" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "札束や書類、密輸品などを運ぶのに便利です。" @@ -16521,10 +16495,10 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." -msgstr "主に旅行中の衣服を運ぶ用途に使う、中型サイズのスーツケースです。収納性は抜群ですが、持ち運びにはあまり適しません。" +msgstr "主に旅行中の衣服を運ぶ用途に使う、車輪が付いた中型サイズのスーツケースです。収納性は抜群ですが、持ち運びにはあまり適しません。" #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -17060,7 +17034,6 @@ msgid_plural "hazmat suits" msgstr[0] "化学防護服" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -17889,7 +17862,6 @@ msgid_plural "long-sleeved shirts" msgstr[0] "長袖シャツ" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "綿製の長袖シャツです。" @@ -18564,6 +18536,18 @@ msgid "" "weight." msgstr "頭から足先までをすっぽりと包む大きな寝袋です。それなりの重量があります。" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "セスタス" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "拳の位置に金属板を組み込んだ、革製のハンドラップです。パンチ力と防御力が向上します。" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -19960,54 +19944,15 @@ msgid "" msgstr "有害な環境から全身を保護する、目に見えない魔法のオーラです。" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "靴下(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "長袖シャツ(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "耳栓(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "化学防護服(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "バックパック(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "ブリーフケース(テスト)" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "矢筒(テスト)" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" +msgstr[0] "電撃のオーラ" -#. ~ Description for {'str': 'test quiver'} +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "テスト用の矢筒です。矢やボルトを20本収納できます。" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "パワーアーマー(テスト)" - -#. ~ Description for {'str': 'test power armor'} -#: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." -msgstr "テスト用に試作されたパワーアーマーです。" +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." +msgstr "近接攻撃してきた敵を電撃で攻撃する、目に見えないオーラです。" #: lang/json/BATTERY_from_json.py msgid "test battery" @@ -20406,8 +20351,8 @@ msgid "Aero-Evaporator CBM" msgid_plural "Aero-Evaporator CBMs" msgstr[0] "CBM: 水蒸気液化装置" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -21505,8 +21450,8 @@ msgid "Internal Furnace CBM" msgid_plural "Internal Furnace CBMs" msgstr[0] "CBM: 体内炉" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -21606,8 +21551,8 @@ msgid "Wind Turbine CBM" msgid_plural "Wind Turbine CBMs" msgstr[0] "CBM: 風力タービン" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -21615,18 +21560,6 @@ msgid "" "power level." msgstr "胴体に小型の風力タービンが格納されています。起動すると風車を展開し、CBM用の電力をゆっくりと発電します。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "CBM: 精密はんだ付け装置" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "はんだごてやワイヤーカッターなどの細々とした電子機器製作ツール類です。単体では何の役にも立ちませんが、CBM製作に必要です。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -21680,13 +21613,37 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "背骨と脳幹の間に移植された爆弾です。タイマーが付いていますが、リセットするコードはありません。" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "CBM: スカルガン" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "頭部に.40口径の単発銃を埋め込みます。起動することで射撃したり装填したりできます。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "CBM: 精密はんだ付け装置" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "はんだごてやワイヤーカッターなどの細々とした電子機器製作ツール類です。単体では何の役にも立ちませんが、CBM製作に必要です。" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "CBM: 過重イオン発生装置" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -21845,6 +21802,33 @@ msgstr[0] "ペーパーバックノンフィクション本" msgid "template for a paperback nonfiction book" msgstr "ペーパーバックのノンフィクション本のテンプレートです。" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "汎用パルプ本" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "パルプ本のテンプレートです。ペーパーバック本とほとんど同じですよね?" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "汎用SF小説" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "SF小説が書かれたペーパーバック本のテンプレートです。" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "SF小説が書かれたハードカバー本のテンプレートです。" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -23149,8 +23133,8 @@ msgstr[0] "開発概要" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -24177,9 +24161,8 @@ msgstr[0] "本(一般/冒険小説)" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." -msgstr "" -"今回の冒険はアフリカ大陸の中心に存在したと言われる失われた都市を探し出す旅です。敵との戦闘や危険な罠を掻い潜り、無事に失われた都市を見つけられるのか。興奮と感動の冒険物語です。" +"in the heart of the African continent." +msgstr "アフリカ大陸の中心部に位置する失われた都市を一刻も早く見つけようと奮闘する、感動の物語です。" #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -24193,25 +24176,6 @@ msgid "" "York City." msgstr "ニューヨーク市の路上で苦労しながら生活する2人の友情を描いた、興味をそそる物語です。" -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "本(一般/青春小説)" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "若者が日常生活や愛、セックスなどを通じて感動を体験し、成長を遂げていく古典的な物語です。" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "1980年代、イラクに侵攻されたイランに住む少女の目線で、周囲の世界の変化を描いたグラフィックノベルです。" - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -24326,73 +24290,6 @@ msgstr[0] "本(一般/ミステリー小説)" msgid "A detective investigates an unusual murder in a secluded location." msgstr "探偵が、人里離れた土地で猟奇殺人を捜査します。" -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "本(一般/大衆小説)" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "ハードボイルドな探偵が織り成す、過激な格闘戦と陰謀が売りの探偵物語です。" - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "本(一般/忘れ去られた殺人イカ惑星!)" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" -"年老いた暗殺者が信じがたい惑星を発見する、サイケデリックな宇宙探索アドベンチャー小説です。「忘れ去られた殺人イカ惑星!」のストーリーの核に痛ましい真実が含まれていることが分かったのは、全てが手遅れになってからでした。" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "本(一般/メトロポリスの偉大なるマント)" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" -"スーパーヒーローの活躍を描いた、古典的なパルプ小説のペーパーバック本です。素性を隠した自警団のメンバーたちが、究極の悪を倒すために協力して戦うことを学びます。" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "本(一般/昨日の殺人)" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "テンポの速い犯罪もののパルプ小説です。鋼の精神を持つ飲んだくれの刑事が、最後の復讐の機会を得ます。" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "本(一般/フラッシュ・コンドルと真紅の犯罪者)" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" -"写真と映像と拳で犯罪に立ち向かう熱血写真家のコンドルは、単なる犯罪専門のアマチュア写真家ではありません。彼女は邪悪な欺瞞を解き明かし、「真紅の犯罪者」を裁くことができるのでしょうか?" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -24557,8 +24454,8 @@ msgstr[0] "本(一般/サムライ小説)" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." -msgstr "寒村に訪れた主人公の浪人を、住人たちが村を無法者達から守る用心棒として雇う...という古典的な物語です。" +"marauding outlaws. This hardback is quite hefty." +msgstr "寒村に訪れた主人公の浪人を村人が用心棒として雇い、無法者たちから村を守ってもらう古典的な物語です。かなり重いハードカバー本です。" #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -24600,17 +24497,19 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "本(一般/巨匠とマルガリータ)" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" -"悪魔、ポンティオ・ピラト、イエス・キリスト、吸血鬼、喋るネコ、文学界のエリートなどが登場する、ミハイル・ブルガーコフが執筆したスターリンによる専制政治の風刺小説です。" +"悪魔、ポンティオ・ピラト、イエス・キリスト、吸血鬼、喋るネコ、モスクワ文学界のエリートなどが登場する、ミハイル・ブルガーコフが執筆した小説です。善と悪の本質に関する哲学的な命題を探求しています。" #: lang/json/BOOK_from_json.py msgid "A Handful of Dust" @@ -24636,340 +24535,6 @@ msgid "" "nuclear destruction isn't much of an influence on human nature." msgstr "原子爆弾の脅威も人間性にはあまり影響を与えられないことを表現した、カート・ヴォネガットが四番目に発表した小説のペーパーバック版です。" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "本(一般/SF小説)" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "エイリアン、光線銃、宇宙船があなたを待っています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" -"ギブソンの「ニューロマンサー」です。1980年代に執筆されましたが、現代社会の様々な分野を驚くほど正確に予測していました。しかし、それも大変動が起きるまでの話です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" -"アルフレッド・ベスターの「虎よ、虎よ!」です。\n" -"\n" -"虎よ! 虎よ!\n" -"ぬばたまの夜の森に燦爛と燃え\n" -"そもいかなる不死の手のまたは目の作りしや\n" -"汝がゆゆしき均整を" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "アーシュラ・ル=グウィンの「天のろくろ」です。ページの所々に汚れた指の跡が残っています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "アーシュラ・ル=グウィンの「所有せざる人々」です。" - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "レイ・ブラッドベリの「華氏451度」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "ダン・シモンズの「ハイペリオン」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" -"ダン・シモンズの「エンディミオン」です。物語はD・H・ローレンスの詩から始まります。\n" -"\n" -"われらに神を与えよ。われらに神を!\n" -"われらに神を与えよ。\n" -"もううんざりだ、人間にも\n" -"動力にも。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "フィリップ・K・ディックの「アンドロイドは電気羊の夢を見るか?」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "ウィリアム・バロウズの「ノヴァ急報」です。随分年季が入っており、ページの端が折れています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "アイザック・アシモフの「ファウンデーション」です。裏表紙が剥ぎ取られています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "フランク・ハーバートの「デューン」です。本の角が折れ曲がっており、奇妙な事に、ページの間に砂が挟まっています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "フランツ・カフカの「審判」です。かなり年季が入っています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "マーガレット・アトウッドの「侍女の物語」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "パオロ・バチガルピの「ねじまき少女」です。帯文を読むと、タイが世界の終焉をどのように切り抜けたのか思いを馳せずにはいられません。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "ブルース・スターリングの「ネットの中の島々」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "アイザック・アシモフの「ファウンデーション対帝国」です。裏ページには手書きの食料品リストが記されています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "フィリップ・K・ディックの「暗闇のスキャナー」です。まだ新品のような匂いが残っています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "ブルース・スターリングが編纂した「ミラーシェード: サイバーパンク・アンソロジー」です。表紙にコーヒーの染みが丸く残っています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "A・E・ヴァン・ヴォークトの「非Aの世界」です。押し花を作るのに使われたようです。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "リチャード・モーガンの「オルタード・カーボン」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "メアリー・シェリーの「フランケンシュタイン」です。怪物の名前ではなかったのですね?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "エリック・フランク・ラッセルの「特務指令<ワスプ>」です。この小説は未来のテロリストのハンドブックです。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "リチャード・マシスンの「アイ・アム・レジェンド」です。裏表紙に乾いた血液が付いています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "ストルガツキー兄弟の「ストーカー」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "ジョー・ホールドマンの「終りなき戦い」です。イヌか何かの動物に噛まれたような跡が残っています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "ロバート・A・ハインライの「月は無慈悲な夜の女王」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "カート・ヴォネガットの「猫のゆりかご」です。背表紙に印字された著者名の綴りが間違っています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "サミュエル・R・ディレイニーの「ノヴァ」です。表紙に「書評用献本。再販禁止」と記載されています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "ヴォネガットの「タイタンの妖女」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "シェリ・S. テッパーの「女の国の門」です。子供が赤いクレヨンで1ページ目に落書きをしたようです。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" -"ウィリアム・ギブスンの「カウント・ゼロ」です。背表紙に「図書館用」のスタンプが押され、「サイエンスフィクション」のステッカーが貼られています。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "N・K・ジェミシンの「ザ・フィフス・シーズン」です。かすかに土の匂いがします。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "A・E・ヴァン・ヴォークトの「武器製造業者」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "ベッキー・チェンバーズの「レコード・オブ・ア・スペースボーン・フュー」です。ほぼ新品のようです。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "イアン・M・バンクスの「ユーズ・オブ・ウェポンズ」です。背表紙がひび割れ、一部のページの綴じが緩んでいるようです。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "ジャン=バティスト・カズン・ド・グレインヴィルの「最後の男」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "オーウェルの「1984年」です。ページの綴じが緩んでおり、取り扱いには注意が必要です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "ハインラインの「異星の客」です。本の角が折れ曲がっています。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "オースン・スコット・カードの「エンダーのゲーム」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "オルダス・ハクスリーの「すばらしい新世界」です。風雨に晒され傷んでいます。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "アーサー・コナン・ドイルの「失われた世界」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "アーサー・C・クラークの「宇宙島へ行く少年」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "H・G・ウェルズの「モロー博士の島」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "スタニスワフ・レムの「天の声」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "フレッド・ホイルの「暗黒星雲」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "オラフ・ステープルドンの「最後にして最初の人類」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "スタニスワフ・レムの「ソラリス」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "シオドア・スタージョンの「人間以上」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "ジェフ・ヌーンの「ヴァート」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "ウォルター・M・ミラー・ジュニアの「黙示録3174年」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "H・G・ウェルズの「宇宙戦争」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "チャールズ・ストロスの「アイアン・サンライズ」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "スーザン・コリンズの「ハンガー・ゲーム」です。帯文を読むと、深夜にテレビで放送していた日本映画が連想されます。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "ジョン・ウィンダムの「トリフィドの日」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "アンソニー・バージェスの「時計じかけのオレンジ」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "ウォルター・テヴィスの「地球に落ちてきた男」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "ダニエル・F・ガロイの「模造世界」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "エルンスト・ユンガーの「ザ・グラス・ビーズ」です。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "ジュール・ヴェルヌの「地底旅行」です。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "ラリー・ニーヴンの「リングワールド」です。後半の数ページが欠落していますが、幸いなことに通販広告のページだったようです。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "ダグラス・アダムズの「銀河ヒッチハイク・ガイド」です。何度も読まれた跡があります。" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -26126,6 +25691,592 @@ msgid "" " key work in the existentialist tradition." msgstr "実存主義における重要作である、ジャン=ポール・サルトルが著した「存在と無」のペーパーバック本です。" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "本(一般/大衆小説)" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "ハードボイルドな探偵が織り成す、過激な格闘戦と陰謀が売りの探偵物語です。" + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "本(一般/金星から来た黒いワルキューレ)" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "リー・ラケットという人物が著した小説です。風雨に晒されていたようです。" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "本(一般/間違った明日)" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "リー・ラケットという人物が著した、ドラッグストアで買えそうな安っぽいペーパーバック本です。" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "本(一般/神は死体から現れない)" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" +"リー・ラケットという名前の女性が著した、ボロボロのペーパーバック本です。怒りと嫉妬によって男性や女性がどのように豹変するかを描いた、非常にハードボイルドな物語です。" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "本(一般/ディープ・ダイブ)" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "リー・ラケットという名前の女性が著した、宇宙旅行をテーマにした短編小説です。" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "本(一般/忘れ去られた殺人イカ惑星!)" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" +"年老いた暗殺者が信じがたい惑星を発見する、サイケデリックな宇宙探索アドベンチャー小説です。「忘れ去られた殺人イカ惑星!」のストーリーの核に痛ましい真実が含まれていることが分かったのは、全てが手遅れになってからでした。" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "本(一般/メトロポリスの偉大なるマント)" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" +"スーパーヒーローの活躍を描いた、古典的なパルプ小説のペーパーバック本です。素性を隠した自警団のメンバーたちが、究極の悪を倒すために協力して戦うことを学びます。" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "本(一般/昨日の殺人)" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "テンポの速い犯罪もののパルプ小説です。鋼の精神を持つ飲んだくれの刑事が、最後の復讐の機会を得ます。" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "本(一般/フラッシュ・コンドルと真紅の犯罪者)" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" +"写真と映像と拳で犯罪に立ち向かう熱血写真家のコンドルは、単なる犯罪専門のアマチュア写真家ではありません。彼女は邪悪な欺瞞を解き明かし、「真紅の犯罪者」を裁くことができるのでしょうか?" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "本(一般/SF小説)" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "エイリアン、光線銃、宇宙船があなたを待っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" +"ギブソンの「ニューロマンサー」です。1980年代に執筆されましたが、現代社会の様々な分野を驚くほど正確に予測していました。しかし、それも大変動が起きるまでの話です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" +"アルフレッド・ベスターの「虎よ、虎よ!」です。\n" +"\n" +"虎よ! 虎よ!\n" +"ぬばたまの夜の森に燦爛と燃え\n" +"そもいかなる不死の手のまたは目の作りしや\n" +"汝がゆゆしき均整を" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "アーシュラ・ル=グウィンの「天のろくろ」です。ページの所々に汚れた指の跡が残っています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "アーシュラ・ル=グウィンの「所有せざる人々」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "ダン・シモンズの「ハイペリオン」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" +"ダン・シモンズの「エンディミオン」です。物語はD・H・ローレンスの詩から始まります。\n" +"\n" +"われらに神を与えよ。われらに神を!\n" +"われらに神を与えよ。\n" +"もううんざりだ、人間にも\n" +"動力にも。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "フィリップ・K・ディックの「アンドロイドは電気羊の夢を見るか?」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "ウィリアム・バロウズの「ノヴァ急報」です。随分年季が入っており、ページの端が折れています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "アイザック・アシモフの「ファウンデーション」です。裏表紙が剥ぎ取られています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "フランツ・カフカの「審判」です。かなり年季が入っています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "マーガレット・アトウッドの「侍女の物語」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "パオロ・バチガルピの「ねじまき少女」です。帯文を読むと、タイが世界の終焉をどのように切り抜けたのか思いを馳せずにはいられません。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "ブルース・スターリングの「ネットの中の島々」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "アイザック・アシモフの「ファウンデーション対帝国」です。裏ページには手書きの食料品リストが記されています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "フィリップ・K・ディックの「暗闇のスキャナー」です。まだ新品のような匂いが残っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "ブルース・スターリングが編纂した「ミラーシェード: サイバーパンク・アンソロジー」です。表紙にコーヒーの染みが丸く残っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "A・E・ヴァン・ヴォークトの「非Aの世界」です。押し花を作るのに使われたようです。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "リチャード・モーガンの「オルタード・カーボン」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "メアリー・シェリーの「フランケンシュタイン」です。怪物の名前ではなかったのですね?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "エリック・フランク・ラッセルの「特務指令<ワスプ>」です。この小説は未来のテロリストのハンドブックです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "リチャード・マシスンの「アイ・アム・レジェンド」です。裏表紙に乾いた血液が付いています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "ジョー・ホールドマンの「終りなき戦い」です。イヌか何かの動物に噛まれたような跡が残っています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "ロバート・A・ハインライの「月は無慈悲な夜の女王」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "サミュエル・R・ディレイニーの「ノヴァ」です。表紙に「書評用献本。再販禁止」と記載されています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "ヴォネガットの「タイタンの妖女」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "シェリ・S. テッパーの「女の国の門」です。子供が赤いクレヨンで1ページ目に落書きをしたようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" +"ウィリアム・ギブスンの「カウント・ゼロ」です。背表紙に「図書館用」のスタンプが押され、「サイエンスフィクション」のステッカーが貼られています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "A・E・ヴァン・ヴォークトの「武器製造業者」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "ベッキー・チェンバーズの「レコード・オブ・ア・スペースボーン・フュー」です。ほぼ新品のようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "イアン・M・バンクスの「ユーズ・オブ・ウェポンズ」です。背表紙がひび割れ、一部のページの綴じが緩んでいるようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "ジャン=バティスト・カズン・ド・グレインヴィルの「最後の男」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "オーウェルの「1984年」です。ページの綴じが緩んでおり、取り扱いには注意が必要です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "ハインラインの「異星の客」です。本の角が折れ曲がっています。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "オースン・スコット・カードの「エンダーのゲーム」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "アーサー・コナン・ドイルの「失われた世界」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "アーサー・C・クラークの「宇宙島へ行く少年」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "H・G・ウェルズの「モロー博士の島」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "スタニスワフ・レムの「天の声」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "フレッド・ホイルの「暗黒星雲」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "オラフ・ステープルドンの「最後にして最初の人類」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "スタニスワフ・レムの「ソラリス」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "シオドア・スタージョンの「人間以上」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "ジェフ・ヌーンの「ヴァート」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "ウォルター・M・ミラー・ジュニアの「黙示録3174年」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "H・G・ウェルズの「宇宙戦争」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "チャールズ・ストロスの「アイアン・サンライズ」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "スーザン・コリンズの「ハンガー・ゲーム」です。帯文を読むと、深夜にテレビで放送していた日本映画が連想されます。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "ジョン・ウィンダムの「トリフィドの日」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "アンソニー・バージェスの「時計じかけのオレンジ」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "ウォルター・テヴィスの「地球に落ちてきた男」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "ダニエル・F・ガロイの「模造世界」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "エルンスト・ユンガーの「ザ・グラス・ビーズ」です。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "ジュール・ヴェルヌの「地底旅行」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "ラリー・ニーヴンの「リングワールド」です。後半の数ページが欠落していますが、幸いなことに通販広告のページだったようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "ダグラス・アダムズの「銀河ヒッチハイク・ガイド」です。何度も読まれた跡があります。" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "本(一般/デューン)" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "フランク・ハーバートの「デューン」です。本の角が折れ曲がっており、奇妙な事に、ページの間に砂が挟まっています。" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "フランク・ハーバートが著した「デューン」の頑丈なハードカバー本です。カバーに「近日映画公開予定」と書かれた、かなり新しい復刻版です。" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "本(一般/タラントの寓話)" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "オクティヴィア・バトラーが著した「種蒔く人の寓話」の続編である、「タラントの寓話」の頑丈なハードカバー本です。" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "本(一般/第五の季節)" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "N・K・ジェミシンが著した「第五の季節」のサイン入りハードカバー本です。かすかに土の匂いがします。" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "本(一般/われら)" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" +"エヴゲーニイ・ザミャーチンが著した「われら」の注釈付き新訳版です。\n" +"\n" +"1924年に出版された原初の近代ディストピア小説として有名な「われら」を、ウラジーミル・ウォズニアックが2015年に翻訳したものです。大量の注釈が付け加えてあり、ザミャーチンが書く文章の詩的性質を強調しています。" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" +"ディストピア小説の代表作であるエフゲニー・ザミャーチンの「われら」は1924年に出版されましたが、1988年までソ連によって出版が差し止められていました。\n" +"\n" +"これはクラレンス・ブラウンがロシア語から翻訳し、簡単な前書きを加えたたもので、1993年に出版され流通していました。やや摩耗した表紙には、不審そうに後ろを振り返るシュールな人物写真が載っています。" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "本(一般/宇宙創世記ロボットの旅)" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" +"トルルとクラパウチュスという名の二体のロボットの偉業とライバル関係を描いた、350ページのペーパーバック本です。原作はスタニスワフ・レムがポーランド語で出版しましたが、この英語版はマイクル・カンデルによって見事に翻訳されています。" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "本(一般/すばらしい新世界)" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" +"オルダス・ハクスリーの「すばらしい新世界」です。雨に濡れたまま放置されていたようです。胎児が製造され瓶詰めにされる殺風景な工場から物語は始まります。" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "本(一般/路傍のピクニック)" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" +"アルカジイとボリスのストルガツキー兄弟が著した「路傍のピクニック」のペーパーバック本です。20か国語以上の言語に翻訳されており、「ストーカー」という別名でも知られています。この本は幸いにもよく知る言語で書かれています。" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "本(一般/華氏451)" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "レイ・ブラッドベリの「華氏451度」です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "ペーパーバックのディストピア小説です。どこかのいたずら者によって本の縁が焦がされていますが、本文は問題なく読めます。" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "「火の色は愉しかった。ものが燃えつき、黒い色に変わっていくのを見るのは、格別の愉しみだった。」" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" +"レイ・ブラッドベリが著した「華氏451」の1979年に再販されたソフトカバー本です。図書館の除籍図書のようです。破れた裏表紙のポケットには水色の図書カードが入っており、1981年に「スザンヌ・コリンズ」という人物が借りていたようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "レイ・ブラッドベリの「華氏451」を現代風に復刻した、表紙が赤と黒に塗られたペーパーバック小説です。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "このSF小説は以下の3部構成になっています:「炉床と火トカゲ」「ふるいと砂」「火はあかるく燃えて」" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -26434,9 +26585,11 @@ msgstr[0] "本(一般/リングベアラーになって良かった10の事)" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." -msgstr "結婚式のリングベアラーについて書いた本です。著者は、大切な指輪を運ぶ小さな天使の責任と名誉について語っています。" +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." +msgstr "" +"結婚式のリングベアラーについて書いた本です。著者は、大切な指輪を運ぶ小さな天使の責任と名誉について語っています。リングベアラーに選ばれた子供は、この本を大事に読み、大切な日の完璧な振る舞い方を学びます。" #: lang/json/BOOK_from_json.py msgid "How to Raise a Gentleman: A Civilized Guide to Parenting" @@ -27679,10 +27832,11 @@ msgstr "「逃げ出したパンケーキ」というタイトルの、子供向 #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "本(一般/ダサかわガール)" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -27693,22 +27847,24 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "本(一般/変身ジャクソン)" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "呪文によって外見を変えられる不思議な能力を手に入れたジャクソン。鏡の中の自分はどんな姿に映るのでしょうか?" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "本(一般/もう炎上なんてしない)" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -27717,10 +27873,11 @@ msgstr "10代のインフルエンサーが、本物の悪魔かもしれない #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "本(一般/ハイ&ロウ)" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -27732,10 +27889,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "本(一般/瞳の中の炎)" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -27744,10 +27902,11 @@ msgstr "遠い未来、高度なテクノロジーによって、保護者は我 #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "本(一般/傷だらけのピーナッツバター)" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -27757,10 +27916,11 @@ msgstr "困窮者向けの食品割引切符で育った女性が、若い料理 #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "本(一般/いつでも準備オーケー)" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -27771,10 +27931,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "本(一般/少年の研究)" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -27785,10 +27946,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "本(一般/夏の気まぐれ)" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -27797,6 +27959,59 @@ msgid "" msgstr "" "ヤングアダルト向けの小説です。夏にちょっとしたインターンシップに参加したある女性が信じられないような発見をして、悪い注目を浴びてしまいます。" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "本(一般/暗いところで)" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "マルキアは未来を夢見ています。テオは過去に憧れています。2人は今を生きる道を見つけられるのでしょうか?" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "本(一般/裏切りは回り道)" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" +"10代後半向けのハードカバー本です。2人の主人公がクラスメイトに残酷ないたずらを仕掛け、バレないように必死に逃げる中で、罪悪感を共有し結束が高まります。" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "本(一般/青春小説)" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "若者が日常生活や愛、セックスなどを通じて感動を体験し、成長を遂げていく古典的な物語です。" + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "本(一般/パンテオン:イランの若者の物語)" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "1980年代、イラクに侵攻されたイランに住む少女の目線で周囲の世界の変化を描いた、ハードカバーのグラフィックノベルです。" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -28176,6 +28391,18 @@ msgid "" "your pain at bay." msgstr "激しいフィットネスのような儀式を行うことで苦痛を和らげます。" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "巻物(ベールフル・ポリモーフ)" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "敵をカエルに変えます。" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -29366,6 +29593,44 @@ msgid "" "harmless." msgstr "分厚い霧の壁を広範囲に出現させます。敵が霧に触れると強烈な気圧が発生して地面に押し付けられますが、仲間は問題なく通り抜けられます。" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "呪文書(ノック)" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "魔法のエネルギーを利用して、隣接する鍵の掛かった木製のドアを開けられます。" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "呪文書(インプローブド・ノック)" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "魔法のエネルギーを利用して、隣接する鍵の掛かったドアを開けられます。" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "呪文書(リペリング・アーク)" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "パチパチと音を立てるオーラで全身を包み、悪意ある攻撃者を電撃で迎え撃ちます。" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -29645,6 +29910,20 @@ msgid "" "on combining magic with EM radiation." msgstr "魔法と電磁波の融合に関する情報がびっしりと載っている、研究所の参考資料です。" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "ルーン文字の石板片" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" +"更に大きな厚板から切り出されたように見える、小さな黒い石板です。表面に刻まれた金色に光るルーン文字を見つめると、ゆっくりと読みやすい文字に変化します。" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -29705,35 +29984,6 @@ msgstr "" "愛しているよ。\n" "Fより」" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "本(一般/初めにコマンドラインありき)" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "1999年にニール・スティーブンソンが著した、コンピューターOSと自動車販売店を比較して語るユーモラスなエッセイです。" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "本(学習/コンパイラ設計原論)" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" -"アルフレッド・エイホとジェフリー・ウルマンが1977年に著した、コンピュータ科学に関する古典的な教科書です。表紙には、コンパイラ設計の複雑さを表す緑色のドラゴンと、LALRパーサ生成と構文主導型変換を操る騎士が描かれています。" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -31227,14 +31477,8 @@ msgstr[0] "変異肉塊" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." -msgstr "" -"ひどく変異した動物の肉です。締まりのないスポンジのような質感が不安ですが...とりあえず臭いは、おおむね普通です。見たこともない奇妙な瘤や器官も混ざっており、肉の内部に固まった骨や毛を見ると、まるで別の生物を生み出そうとしていたかのように思えます。まったく食用に向かない部分を取り除いて調理すれば、少なくとも消化は可能です。" +msgid "Meat from a heavily mutated animal." +msgstr "重度の変異を起こした動物から切り落とされた肉です。" #: lang/json/COMESTIBLE_from_json.py msgid "scrap of mutant meat" @@ -31245,12 +31489,9 @@ msgstr[0] "変異屑肉" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." -msgstr "" -"ひどく変異した動物の屑肉です。少し奇妙な臭いがし、肉の内部には成長途中の毛や骨の小片が混ざっています。まったく食用に向かない部分を取り除いて調理すれば、少なくとも消化は可能です。" +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." +msgstr "重度の変異を起こした動物の細かい肉片です。控えめに言っても不味そうな臭いがします。" #: lang/json/COMESTIBLE_from_json.py msgid "mutant humanoid meat" @@ -31318,18 +31559,22 @@ msgstr[0] "変異肉(調理済)" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" -msgstr "" -"変異した動物の肉を調理したものです。スポンジのような質感が不安ですが、味に関しては...おおむね普通です。毛や骨などの食用に向かない部分は、ちゃんと取り出せているはずです..." +msgid "This is a cooked chunk of meat from a mutated animal." +msgstr "変異した動物の肉塊を調理したものです。" #: lang/json/COMESTIBLE_from_json.py msgid "cooked scrap of mutant meat" msgid_plural "cooked scraps of mutant meat" msgstr[0] "変異屑肉(調理済)" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "変異体のくず肉を調理したものです。身が細かすぎて、見た目は普通の肉と変わらないように見えます。" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -31356,6 +31601,16 @@ msgid "" "prepared." msgstr "調理済みの新鮮な内臓類です。必須栄養素が詰まっていますが、しっかりと調理をせずに食べるのは一般的に悪食と見なされます。" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "変異臓物" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "巨大な突然変異体の昆虫から採取された臓器です。" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -31521,6 +31776,16 @@ msgid "" "all cooked out." msgstr "適切な調理が施された、何の味もしない灰色の臓器です。調理前より不味そうに見えますが、寄生虫は完全に死滅しています。" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "変異肺" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "恐らく肺組織だと考えられます。" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -31673,9 +31938,11 @@ msgstr[0] "変異脂肪塊" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." -msgstr "変異した生物を解体して手に入れた脂肪です。そのまま食べることも可能ですが、他の食品類の材料として使うべきでしょう。" +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." +msgstr "" +"重度の変異を起こした動物から切りとった脂肪です。一般的な変異肉よりも更に酷い臭いがします。正体不明の油分が滴り落ち、小さな水たまりを作っています。" #: lang/json/COMESTIBLE_from_json.py msgid "mutant tallow" @@ -32941,16 +33208,16 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "砂糖や蜂蜜を加えた水です。それなりの味ですよ。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" +msgid "black tea" +msgid_plural "black teas" msgstr[0] "紅茶" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." -msgstr "チャノキから採れる紅茶葉に湯を注いで作る、世界中にいる紳士のための飲み物です。" +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." +msgstr "チャノキから採れる葉を酸化させた紅茶葉に湯を注いだ、世界中にいる紳士のための飲み物です。" #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -32994,6 +33261,31 @@ msgstr[0] "ミネラルウォーター" msgid "Fancy mineral water, so fancy it makes you feel fancy just holding it." msgstr "特別なボトルに入った上質な天然水です。上質な水を持っていると、何だか特別な気分になりますね。" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "緑茶" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "チャノキから採れる葉に湯を注いで作った飲み物です。紅茶よりもすっきりとしていて飲みやすく、アジア圏で古くから好まれています。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "フルーツティー" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "茶葉ではなくハーブやドライフルーツを使った美味しい飲み物です。「ティー」と呼ばれてはいますが、実際には煎じつめて作ります。" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -34596,6 +34888,30 @@ msgid "" "cheese. Delicious." msgstr "塩味の効いたトルティーヤチップスに挽肉を添え、溶かしたチーズをかけました。とても美味しいです。" +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "ナチョス(豆)" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "塩味の効いたトルティーヤチップスに豆を添えました。溶かしたチーズをかけるとより美味しく食べられます。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "ナチョス(豆とチーズ)" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "塩味の効いたトルティーヤチップスに豆を添え、溶かしたチーズをかけました。ベジタリアンではなくても美味しく食べられます。" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -38204,7 +38520,6 @@ msgid_plural "pine nuts" msgstr[0] "松の実" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "松かさから取り出した、カリカリとした美味しい木の実です。" @@ -39051,24 +39366,52 @@ msgid "" msgstr "鳥用の餌です。主成分は種子や牧草、マメ科の草であり、小鳥に最適の飼料です。" #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "ドッグフード" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "ドッグフード(ウェット)" -#. ~ Description for {'str_sp': 'dog food'} +#. ~ Description for {'str_sp': 'wet dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." -msgstr "犬用の餌です。変な匂いがしますが、犬はこれが大好き。" +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "缶詰に入った、生肉を使ったイヌ用の柔らかい餌です。変な匂いがしますが、イヌはこれが大好きです。" #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "キャットフード" +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "ドッグフード(ドライ)" + +#. ~ Description for {'str_sp': 'dry dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "長く保存できる、イヌ用の硬い餌です。乾燥した肉や穀物を使っており、ビタミンやミネラルが豊富です。" -#. ~ Description for {'str_sp': 'cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." -msgstr "猫用の餌です。変な匂いがしますが、猫はこれが大好き。" +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "キャットフード(ウェット)" + +#. ~ Description for {'str_sp': 'wet cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "缶詰に入った、生肉を使ったネコ用の柔らかい餌です。ネコが好きそうな変な臭いがします。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "キャットフード(ドライ)" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "長く保存できる、ネコ用の硬い餌です。乾燥した肉や穀物を使っており、ビタミンやミネラルが豊富です。" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -39104,21 +39447,45 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "花の蜜です。このアイテムが見えている場合はバグが発生しています。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" -msgstr[0] "ティーバッグ" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "ティーバッグ(紅茶)" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "中に茶葉が入った紙袋です。沸騰したお湯に浸して紅茶を淹れましょう。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "ティーバッグ(緑茶)" + +#. ~ Description for {'str': 'green tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "中に茶葉が入った紙袋です。沸騰したお湯に浸して緑茶を淹れましょう。" -#. ~ Description for {'str': 'tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "ティーバッグ(フルーツティー)" + +#. ~ Description for {'str': 'fruit tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." -msgstr "中に茶葉が入った紙袋です。沸騰したお湯の中に入れて紅茶を淹れましょう。" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." +msgstr "中に茶葉とフルーツが入った紙袋です。沸騰したお湯に浸してフルーツティーを淹れましょう。" #: lang/json/COMESTIBLE_from_json.py msgid "herbal tea bag" msgid_plural "herbal tea bags" -msgstr[0] "ハーブティーバッグ" +msgstr[0] "ティーバッグ(ハーブティー)" #. ~ Description for {'str': 'herbal tea bag'} #: lang/json/COMESTIBLE_from_json.py @@ -39198,16 +39565,17 @@ msgstr[0] "プロテインバー" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" -"SoyPelusa社がクラウドファンディングを募り大成功を収めた、「ダイズーム」という名のプロテインバーです。人間はこのバーを一日3本食べれば永遠に生きられると言われています。出資者が製品を受け取った後で、ある欠陥が見つかりました。食べた者の大多数が、これを食べ続けるくらいなら餓死した方がマシだと感じたのです。その後SoyPelusa社は倒産しましたが、避難所の備蓄食料に丁度いいと考えたFEMAは、売れ残って倉庫に積まれていた製品をすべて買い取りました。そして、この有名なクラウドファンディングの遺産は生存者の手に渡りました。愉快な話ですね。" +"SoyPelusa社がクラウドファンディングを募り大成功を収めた、「ダイズーム」という名のプロテインバーです。\n" +"\n" +"人間はこのバーを一日3本食べれば永遠に生きられると言われています。出資者が製品を受け取った後で、ある欠陥が見つかりました。食べた者の大多数が、これを食べ続けるくらいなら餓死した方がマシだと感じたのです。その後SoyPelusa社は倒産しましたが、避難所の備蓄食料に丁度いいと考えたFEMAは、売れ残って倉庫に積まれていた製品をすべて買い取りました。\n" +"\n" +"そして、この有名なクラウドファンディングの遺産は生存者の手に渡りました。愉快な話ですね。" #: lang/json/COMESTIBLE_from_json.py msgid "protein shake" @@ -39963,17 +40331,28 @@ msgid "" msgstr "この多肉質の熟した根には糖分が含まれています。砂糖を抽出するにはいくつかの処理が必要です。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" +msgid "black tea leaf" +msgid_plural "black tea leaves" msgstr[0] "紅茶葉" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "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." -msgstr "" -"水分を飛ばした熱帯植物の葉です。紅茶にしても良いですし、生でも食べられます。これで飢えを癒すには気分が悪くなるぐらいどっさり食べる必要がありますが。" +msgstr "乾燥させた熱帯植物の葉です。紅茶を淹れられますが、そのまま食べても大丈夫です。あまり空腹は満たせません。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "緑茶葉" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "乾燥させた熱帯植物の葉です。緑茶を淹れられますが、そのまま食べても大丈夫です。あまり空腹は満たせません。" #: lang/json/COMESTIBLE_from_json.py msgid "tomato" @@ -42515,6 +42894,66 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "穀粉と水を混ぜ合わせた、粘性の高いペーストです。穀粉をそのまま使うより効率よくパンを焼けます。" +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "茎(パイナップル)" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "パイナップルの根茎です。自家栽培できます。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "種(メロン)" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "メロンの種です。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "苗(バナナ)" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "バナナの苗木です。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "苗(オレンジ)" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "オレンジの苗木です。間違いなく遺伝子組み換え植物です。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "苗(レモン)" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "レモンの苗木です。間違いなく遺伝子組み換え植物です。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "苗(ココナッツ)" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "人間が大変動以前に行なっていた度が過ぎた行動の結実です。" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -42884,6 +43323,11 @@ msgid "ankylosaurus egg" msgid_plural "ankylosaurus eggs" msgstr[0] "卵(アンキロサウルス)" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "卵(アパトサウルス)" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -43194,7 +43638,7 @@ msgid "scream mushroom" msgid_plural "scream mushrooms" msgstr[0] "サケビタケ" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -43377,104 +43821,6 @@ msgid "" msgstr "" "我々は現時点では存在しない。少し知恵の働く人間が、デバッグ中に発見したものと推測する。我々が存在を隠している間は、我々に加わることを許可しない。" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "松の実(テスト)" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "ビターアーモンド(テスト)" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "アーモンドの一種です。ヒドロシアン酸が微量に含まれており、生食すると中毒を起こします。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "幻覚性ナツメグ(テスト)" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "精神作用をもつミリスチシンが多く含まれています。多量に摂取すると厄介な副作用を多数もたらし、幻覚や多幸感を引き起こす可能性があります。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "リンゴ(テスト)" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "テスト用のリンゴです。ミミズが入っているかもしれませんが、美味しいですよ!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "液体(テスト)" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "何からできているのか分かりませんが、液体であることは間違いありません。テスト用ですので、飲まないでください!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "ワイン(未発酵/テニスボール/テスト)" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "未発酵のテニスボールワインです。テニスボールの搾り汁を煮沸したゴム臭いジュースです。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "ワイン(テニスボール/テスト)" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "テニスボールの搾り汁を発酵させて作る安価な酒です。味の方も概ねそんな感じです。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "チューインガム(テスト)" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "不思議なほど刺激的なブルーベリー味の、喉の渇きを癒すチューインガムです。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "変異した親指(テスト)" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "変異した人間の親指です。考えたくもありませんが、これを食べると突然変異を引き起こす可能性があります。" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -44279,18 +44625,6 @@ msgstr[0] "アルミ缶" msgid "An aluminum can, like what soda comes in." msgstr "アルミニウムの缶です。炭酸系飲料によく使われています。" -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "開いたアルミ缶" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "炭酸系飲料によく使われている、アルミニウム製の缶です。既に開いており、再密封は容易ではありません。" - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -44299,22 +44633,10 @@ msgstr[0] "密封紙パック" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "紙とアルミニウムをビニールでラミネート加工した紙パックです。キャップが付いているため、簡単に再封できます。" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "紙パック(2L)" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "紙とアルミニウムをビニールでラミネート加工した、容量2Lの紙パックです。既に一度開封されており、内容物の腐敗が進行します。" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -44335,18 +44657,6 @@ msgstr[0] "ブリキ缶S" msgid "A small tin can, like what tuna comes in." msgstr "ツナなどを入れられる、小さなブリキ製の缶です。" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "開いたブリキ缶S" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "ツナなどを入れられる、小さなブリキ製の缶です。既に開いており、再密封は容易ではありません。" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -44357,18 +44667,6 @@ msgstr[0] "ブリキ缶M" msgid "A medium tin can, like what soup comes in." msgstr "スープなどを入れられる、中くらいのブリキ製の缶です。" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "開いたブリキ缶M" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "スープなどを入れられる、中くらいのブリキ製の缶です。既に開いており、再密封は容易ではありません。" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -44437,16 +44735,6 @@ msgstr[0] "使い捨てカップ" msgid "A small, vacuum formed cup." msgstr "真空成形で作られた小さなカップです。" -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "開いた使い捨てカップ" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "真空成形の小さなカップップです。使い道はなくただのゴミです。" - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -44604,7 +44892,6 @@ msgid_plural "gallon jugs" msgstr[0] "ガロンジャグ(3.75L)" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "牛乳や家庭用洗剤を入れるプラスチック製の容器です。" @@ -44696,7 +44983,6 @@ msgid_plural "small waterskins" msgstr[0] "水筒(1.5L/革)" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -44815,18 +45101,6 @@ msgid "" "food." msgstr "豆などを入れられる、大きなブリキ製の缶です。かなりの量の食物を保存できます。" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "開いたブリキ缶L" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "豆などを入れられる、大きなブリキ製の缶です。既に開いており、再密封は容易ではありません。" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -45292,6 +45566,33 @@ msgstr[0] "キチンの塊" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "昆虫の外骨格の一部です。軽くて非常に耐久性があります。" +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "体内キチン" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "昆虫の内骨格の一部です。" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "ガス嚢" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" +"変異した昆虫の体内から取り出した、ブドウほどの大きさの泡状の膜の集合体です。小さなヘリウム風船のように浮いており、空気より軽いガスによって飛翔を補助していると思われます。" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -45353,6 +45654,32 @@ msgid "" "Felt patches, bundled tightly together for storage. Disassemble to unpack." msgstr "保管のためにしっかりと束ねたフェルトの生地です。分解して使いましょう。" +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "素材束(木材)" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "10枚の建設用木材をロープで固定したものです。分解して使いましょう。" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "素材束(頑丈な短枝)" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "10本の頑丈な短枝をロープで固定したものです。分解して使いましょう。" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -46442,8 +46769,8 @@ msgid "lotus flower" msgid_plural "lotus flowers" msgstr[0] "スイレンの花" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -47805,6 +48132,16 @@ msgid "" msgstr "" "TX-5LRケルベロスレーザーキャノンから取り外された一本の砲身です。作動に必要な部品がいくつも欠けており、このまま武器として使うことはできません。" +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "装甲キット(骨)" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "車両に取り付けられる、骨で作られた装甲です。" + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -49302,6 +49639,54 @@ msgid "" "wound." msgstr "顎から上が消失した死体です。何が原因でこうなったのか見当もつきません。" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -50978,7 +51363,7 @@ msgstr[0] "マイク" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "音声の録音や増幅に使われる、クリップが付いた一般的なマイクです。底面にはアンプに接続するための3ピンXLRコネクタが備わっています。" #: lang/json/GENERIC_from_json.py @@ -51150,6 +51535,19 @@ msgid "" "anything on its own." msgstr "井戸から飲み水を汲み上げるために使う、昔ながらの機械式ポンプです。個人で使用するにしても少々心もとない性能です。" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "管継手セット" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "エンドキャップ、分岐継手などの金属パイプ用継手が複数揃っています。色々な作業に役立ちます。" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -51755,8 +52153,8 @@ msgstr[0] "ルツェルンハンマー" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." -msgstr "尖った金鎚、スパイク、鉤を長い棒の先に取り付けた、多芸な長柄武器です。" +"attached to a beefy wooden pole." +msgstr "尖った金鎚、スパイク、鉤を頑丈な木の棒の先に取り付けた、多芸な長柄武器です。" #. ~ Description for {'str': 'lucerne hammer'} #: lang/json/GENERIC_from_json.py @@ -52112,7 +52510,6 @@ msgid_plural "pointy sticks" msgstr[0] "尖った棒" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "先端を尖らせてある木の棒です。" @@ -52204,15 +52601,15 @@ msgstr[0] "ハルバード" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." -msgstr "斧やスパイクなど賑やかなものを長い棒の先に取り付けた、多芸な長柄武器です。" +" attached to a long sturdy stick." +msgstr "斧やスパイクなど賑やかなものを長く頑丈な棒の先に取り付けた、多芸な長柄武器です。" #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." -msgstr "斧やスパイクなど賑やかなものを長い棒の先に取り付けた、多芸な長柄武器...の安価で刃が鈍いレプリカです。" +"spike, and other fun things attached to a thick pole." +msgstr "斧やスパイクなど賑やかなものを頑丈な棒の先に取り付けた、多芸な長柄武器...の安価で刃が鈍いレプリカです。" #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -52782,18 +53179,6 @@ msgid "" "from India designed to be concealed under and against the palm." msgstr "バグナクや鉄の前足とも呼ばれる、インド発祥の小さな鉤爪上の刃です。手のひらで握りこむようにして使うようになっています。" -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "セスタス" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "拳の位置に金属板を組み込んだ、革製のハンドラップです。パンチ力と防御力が向上します。" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -52942,6 +53327,110 @@ msgid "" msgstr "" "奇妙な樹脂の断片です。縁は丸みを帯びていて艶があり、表面がざらついた巨大なビーチグラスのようにも見えます。触ってみるとほのかに温かさを感じます。" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "シャシー(エクゾディ)" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" +"おおよそ六角形に造られたフレームとそれに付随する車体は、まるで単一の素材から切り出されたようにみえます。重度の摩耗や修理の痕跡があるにもかかわらず、取付穴や付属品は非常に耐久性に優れています。汎用性が高い構造になっており、激しい戦闘にも耐えられるように感じます。" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "シャシー(エクゾディドローン)" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" +"おおよそ六角形に造られた小さなフレームとそれに付随する車体は、まるで単一の素材から切り出されたようにみえます。重度の摩耗や修理の痕跡があるにもかかわらず、取付穴や付属品は非常に耐久性に優れています。汎用性が高い構造になっており、激しい戦闘にも耐えられるように感じます。" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "サイバネティック神経回路装置" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" +"液体と電力、信号をやり取りするためのタンクとチューブが連なった複雑な形状の装置です。生きた状態で移植することが最も困難な臓器である、脳と脊椎を収容するために使います。" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "奇妙な電子機械" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" +"配線と形状を見れば、コンピュータかそれに類する電子機器であることは推察できますが、それが何なのか、どのような役割を果たすのかは、全く分かりません。非常に重く頑丈な作りになっています。" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "金属製の装置" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" +"電子機器のようですが、見たこともない外見です。金属の板に銅色のリングが同心円状にはめ込まれており、そのリングから中央の軸に向かってワイヤーが伸びています。" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "サイバネティックセンサー" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" +"ガラスで作られた目玉のような物体です。小さな皿ほどの大きさから推察するに、ある種のカメラだと考えられます。内部の仕組みはまったく理解できず、今までに見たどのカメラとも似ていません。" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "回転装置" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" +"銅線のような物を巻いたコイルとピストンが付いているため、恐らくモーターや発電機の一種だと考えられます。今までに見たこともないデザインのため、どのように動かすのか見当もつきません。" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -53026,7 +53515,6 @@ msgid_plural "pipes" msgstr[0] "パイプ" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -53223,7 +53711,12 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "商業用の包装や家の雨漏りを防ぐ用途で使われていたような、重く大きなビニールシートです。" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "硬質プラスチック板" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -53281,14 +53774,15 @@ msgstr "長さ約2.4m、太さ約5cmほどの、真っ直ぐな木の枝です #: lang/json/GENERIC_from_json.py msgid "long pole" msgid_plural "long poles" -msgstr[0] "長竿" +msgstr[0] "10フィートの棒" #. ~ Description for {'str': 'long pole'} #: lang/json/GENERIC_from_json.py msgid "" "A stout, ten-foot pole. Could be used similarly to a spear. The Cataclysm " "gives fresh meaning to walking softly and carrying a big stick." -msgstr "長さ約3mの頑丈な棒です。槍のように遠距離から攻撃できます。大変動の到来によって、忍び歩きや長竿が新たに脚光を浴びることになりました。" +msgstr "" +"長さ約3mの頑丈な棒です。槍のように遠距離から攻撃できます。大変動の到来によって、忍び歩きや10フィート棒が新たに脚光を浴びることになりました。" #: lang/json/GENERIC_from_json.py msgid "plank" @@ -54090,9 +54584,9 @@ msgstr[0] "簡易ハルバード" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." -msgstr "長い棒に大型の刃を取り付けた武器です。かなりの攻撃力があります。" +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." +msgstr "木の棒の先端に大型の刃を取り付けた武器です。かなりの攻撃力があります。" #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -54250,6 +54744,21 @@ msgstr[0] "ホッチキス" msgid "A stapler for fastening sheets of paper together." msgstr "紙をまとめて固定するための道具です。" +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "穴開けパンチ" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" +"この金属製の道具を使えば、紙束に穴を一つ開けられます。地道に一つずつ開け続ければ、複数の穴も開けられます。もし一回の使用で穴をたくさん開けたいなら、紙を折れば不可能ではありませんが...とにかく、これは1穴パンチです。" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -54494,6 +55003,19 @@ msgid "" "until it floats. Then attach oars or a motor to get the boat to move." msgstr "水に浮く性質をもつ、木製の船体です。車両が十分な浮力を得るまで船体を取り付け、オールまたはモーターを取り付ければボートが動きます。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "船体(丸太)" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" +"水に浮く性質をもつ、丸太を繋げて作った船体です。車両が十分な浮力を得るまで船体を取り付け、オールまたはモーターを取り付ければボートが動きます。" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -55357,7 +55879,6 @@ msgid_plural "sheet metal" msgstr[0] "板金" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "金属製の薄板です。" @@ -55466,16 +55987,6 @@ msgstr[0] "装甲キット(シリコンキチン)" msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "車両に取り付けられる、シリコン化したキチン質で作られた耐久性の高い装甲です。" -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "装甲キット(骨)" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "車両に取り付けられる、骨で作られた装甲です。" - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -55731,8 +56242,8 @@ msgid "workbench" msgid_plural "workbenches" msgstr[0] "作業台" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -55901,6 +56412,16 @@ msgstr[0] "蛇口" msgid "A metal faucet that can be attached to a water tank for easy access." msgstr "金属製の蛇口です。給水タンクに取り付けると内部の液体を簡単に流せます。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "木製ホイールハブ" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "自転車のホイールを取り付ける穴が付いた木製部品です。" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -56481,6 +57002,17 @@ msgstr[0] "非因果的論理演算装置" msgid "It has given you an answer, but you are yet to ask anything." msgstr "あらゆる問いに答えてくれますが、まだ何も問うていません。" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "メタマテリアル生地" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "複雑に織られた、虹色の光沢を放つ緻密な作りの生地です。" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -56567,9 +57099,21 @@ msgstr[0] "超電導電磁石" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." msgstr "常温超伝導体から作られた強力な電磁石です。" +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "磁性流体ダイナモ" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." +msgstr "様々なフラクタル模様に刻々と変化する黒色の流体金属です。" + #: lang/json/GENERIC_from_json.py msgid "composite alloy" msgid_plural "composite alloys" @@ -56677,7 +57221,7 @@ msgstr "フォトニック技術で作り出した神経繊維の軸索は、化 #: lang/json/GENERIC_from_json.py msgid "neurosynaptic interface matrix" msgid_plural "neurosynaptic interface matrices" -msgstr[0] "神経シナプス接続マトリックス" +msgstr[0] "神経シナプス接続回路網" #. ~ Description for {'str': 'neurosynaptic interface matrix', 'str_pl': #. 'neurosynaptic interface matrices'} @@ -57155,6 +57699,16 @@ msgid "" "battles is bookmarked." msgstr "古代ハイリア人の伝承や物語を集めた書物です。歴史的な戦いの章には栞が挟んであります。" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "本(武術/ストームガードの戦士)" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "この本には「鋼の心」の訓練法が書かれています。" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -57167,6 +57721,61 @@ msgid "" "art." msgstr "サイボーグ格闘術創始者の哲学と技術について詳しく記した伝記です。" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "本(武術/ポケットモンスター大百科)" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "様々な架空のモンスターの強さと技、それらの実戦での使い方が、詳細なリスト形式で記されています。" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "本(武術/遠い地平線)" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "この本には「落陽」の訓練法が書かれています。" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "ジェダイ・ホロクロン(フォームI)" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "この装置は、ジェダイのライトセーバー戦闘型の一つ、シャイ=チョーの訓練法を映し出します。" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "本(武術/花崗岩の欠片)" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "この本には「石竜」の訓練法が書かれています。" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "本(武術/斬り捨てる鉤爪)" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "この本には「虎の爪」の訓練法が書かれています。" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -57187,7 +57796,7 @@ msgstr[0] "光粉" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "実体化したウィルオウィスプが残した粉です。今もなお超自然の光を放っているようです。" @@ -57306,7 +57915,7 @@ msgstr[0] "マナダスト" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "結晶化したマナが粉末状になったものです。魔法のエネルギーによってかすかに明滅しています。" #: lang/json/GENERIC_from_json.py @@ -58559,126 +59168,6 @@ msgid "" "much more expensive." msgstr "オリハルコン製のフレームです。鋼鉄よりもはるかに頑丈ですが、価格も桁違いです。" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "木材(テスト)" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "2×4材に近い寸法の、幅が狭く分厚い木製の板です。まともな近接武器として使えますが、様々な建設の資材にもなります。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "パイプ(テスト)" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "板金(テスト)" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "ガロンジャグ(3.75L)(テスト)" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "水筒(1.5L/革)(テスト)" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "風船(テスト)" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "伸縮性と水密性があり気密性が高い、完璧なテスト用風船です。" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "尖った棒(テスト)" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "不格好な剣(テスト)" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "テスト用の不格好な剣です。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "普通の剣(テスト)" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "テスト用の剣です。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "素晴らしい剣(テスト)" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "テスト用の素晴らしい剣です。" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "箱(テスト)" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "比率が確定していない、シンプルな容積1Lの段ボール箱です。" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "14cm棒(テスト)" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "長さがちょうど14cmの細い棒です。" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "15cm棒(テスト)" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "長さがちょうど15cmの細い棒です。" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "アトミックコーヒーサーバー(テスト)" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "アトミック飲料の放射性を保つよう設計された、テスト用のコーヒーサーバーです。" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "銃器" @@ -59074,7 +59563,7 @@ msgstr "分類: 木材" #. ~ Description for Loot: Wood #: lang/json/LOOT_ZONE_from_json.py msgid "Destination for firewood and items that can be used as such." -msgstr "焚き木として利用できるアイテムを置く区域です。" +msgstr "焚物として利用できるアイテムを置く区域です。" #: lang/json/LOOT_ZONE_from_json.py msgid "Loot: Custom" @@ -61344,6 +61833,34 @@ msgid "" "thrower." msgstr "噴霧器に化学物質を供給する容量2Lの自家製加圧容器です。" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "弾倉(12.3ln/PA Md.71エクゾディ)" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" +"古典的なPA " +"Md.71クリップをベースとした、スタイリッシュな小型弾倉です。エクゾディによる改造を経て、空気より軽いドローンで運用できるようになりました。小型かつ装填が少し不便なため、ゾンビの大群を相手にした地上戦には向きません。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "弾倉(12.3ln/PA Md.68エクゾディ)" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "重量があるPA Md.68バトルライフル用の、途方もなく重い大型弾倉です。エクゾディが独自に設計、製造しました。" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -61781,28 +62298,6 @@ msgid "" "tips." msgstr "杖に取り付けられる特殊な小型のマナクリスタルです。" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "乾電池(テスト)" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "テスト用の乾電池です。" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "充電式バッテリー(テスト)" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "充電できるかもしれないテスト用バッテリーです。" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "初期設定" @@ -61818,8 +62313,12 @@ msgstr "コア - Aftershock" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." -msgstr "非現実的でよりSFらしい要素を追加します。" +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." +msgstr "" +"リアリズムを逸脱した、よりSFらしい方向性の要素を追加します。他のMODとの互換性を維持しつつゲーム性を大幅に変えることを長期的な目標としています。" #: lang/json/MOD_INFO_from_json.py msgid "Blaze Industries" @@ -61860,9 +62359,11 @@ msgstr "追加 - Dark Skies Above" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" -msgstr "CataclysmをXCOM2風のエイリアンに占領された世界へ完全に変更します。他のMODとの併用は自己責任で行ってください。" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." +msgstr "" +"異星人に関連する職業やシナリオを追加し、世界を大幅に変更するMODです。他のMODで追加される要素を打ち消す可能性があります!自己責任で導入してください。" #: lang/json/MOD_INFO_from_json.py msgid "DinoMod" @@ -62067,16 +62568,6 @@ msgstr "変更 - スキルと連動した能力成長" msgid "Allows stats to raise via skill progression." msgstr "スキルレベルが上昇すると能力値も上昇するようになります。" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "追加 - テストデータ" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "自動化テストで使う疑似アイテムやレシピ、その他のコンテンツを追加します。" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "追加 - 市街地" @@ -62359,6 +62850,48 @@ msgid "" msgstr "" "人間の身体に金属部品とワイヤーが絡み付き融合しています。その目は虚ろですが、時折、異様な人体の不可逆性を思い出したかのように悲痛な表情を浮かべます。十分な外科手術の技術があれば、ある程度人間らしい姿に戻してやることもできます。このサイボーグがそれを望んでいるならの話ですが..." +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "エクゾディ作業ロボット" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "様々な建設工具を備えた人型ロボットです。" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "エクゾディ四足歩行ロボット" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" +"見慣れない部品を組み合わせて作られた、巨大な四足歩行ロボットです。足音と共に重々しく妙に優雅な足取りで移動し、地面に浅いクレーターを残します。様々な武器を搭載していますが、こちらを狙っているようには見えません。" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "サイボーグゾンビ" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" +"死んだ人間と死んだ技術が合わさって作られた怪物です。鋼と肉が混じり合い、怒った幼児に振り回される人形のように滅茶苦茶に動きます。機械部品の動力は停止したようで、肉の帯がそれらを包み込み、でたらめに引っ張り固定しています。金属製の骨格と装甲の裂け目から、腐りかけの肉が飛び出しています。" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -62577,6 +63110,23 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "4つの回転翼を備えた通常の何倍も大きなマンハックです。小型原子爆弾を内蔵しているようです。もしも運悪く標的にされたなら...逃げましょう。" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "狙撃ドローン" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" +"観測気球とクワッドローターを組み合わせたような姿の、奇妙な機械です。本体と思しきシンプルな箱の下には、ライフルを装備した小型の多関節腕が吊るされています。プロペラが一瞬起動した後すぐに停止し、気流をものともしないほとんど静止した状態を維持しています。電源が切れるまでかなり長く空中に留まっていられそうです。" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -63889,6 +64439,16 @@ msgid "" "about rapidly and the mouths form a chorus of groaning screams." msgstr "人間と他の生き物の体が腐り結合したような、肉の怪物です。頭部にある複数の目はせわしなく動き、複数の口が呻きと叫びの大合唱を奏でています。" +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "人間" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "人間の死体の疑似アイテムです。このアイテムが見えている場合はバグが発生しています。" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -64285,6 +64845,21 @@ msgid "" msgstr "" "アメリカ東部に生息するピューマは、大柄なネコ科の捕食者です。この地域では絶滅したと思われていましたが、種の保全努力により、個体数を回復させる事に成功しました。素早く静かに動くこの狩人は、強いジャンプ力によって遠距離から獲物を狙い、致命的な攻撃力をもつ爪で捕獲し、発達した牙で噛み殺します。" +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "トラ" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" +"ネコ科の大型肉食動物、荘厳な姿のトラです。原産はアジアですが、現在ではアメリカ国内の私有地に最も多く生息しています。素早くパワフルなこの肉食動物は、世界でもっとも有名で愛されていますが、同時に最も危険な動物でもあります。" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -65863,6 +66438,18 @@ msgstr "大きく育った華やかな異界のシダ植物です。唸るよう msgid "Lightning arcs from the leech stalk!" msgstr "異界植物から電撃が放出されました!" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "シグナルツリー" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "幹は天高くそびえ、最上部の枝が黄色く輝いています。低い太鼓のような音が鳴り響いています。" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -66344,6 +66931,19 @@ msgstr[0] "拡声装置" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "大音量でメッセージを繰り返し伝え続ける、強力な拡声器です。" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "改造タレット" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "この重厚なタレットは、まるで様々な技術を組み合わせてボルトで固定したような、極めて異質な形状です。重そうなマシンガンを装備しています。" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -66430,6 +67030,148 @@ msgid "" msgstr "" "Uncanny社の最初の製品である、優しい顔でたたずむ4本腕の人型ロボットです。その容貌は驚くほど細部まで作りこまれていますが、手触りは硬く不快です。世界が崩壊しても支援すべき患者を探し続けています。" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "スケルトン犬" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"かつてイヌだったものは、全ての皮膚が剥がれ、融合した骨の甲殻が露わになっています。肉がすべて失われた動く骨は、血管や筋肉のように全身を覆う艶やかな黒い粘液の脈動によって制御されているようです。" + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "フェラル・ゾンビピューマ" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" +"このピューマの目には生気がなく、毛皮は引き裂かれボロボロに傷付き、黒い液体が滲み出ています。爪と牙がまるで鋭く尖ったスパイクのように不自然に伸びています。" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "スケルトンベア" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" +"腐った皮膚が剥がれ落ち、代わりに骨が過成長して天然の鎧になったクマのゾンビです。身体がパキパキと気味の悪い音を立てて震えるたびに、関節から黒い粘液が大量に漏れ出しています。" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "冥暗ゾンビピューマ" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" +"この不気味な化け物の周りには影が立ち込めており、まるで光が届くのを拒絶しているかのようです。フラフラと歩く大きなネコのぼんやりとした形がかろうじて認識できます。" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "強酸ゾンビクマ" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "毛皮がまだらに抜けた、色素の薄いクマのゾンビです。べとついた皮膚は薄く、その下の血管を黄色い液体が流れているのがはっきりと確認できます。" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "凶暴ゾンビヘラジカ" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"このヘラジカの目からは黒い粘性の液体が滲み出ており、身体は引き裂かれてボロボロです。発達した全身の筋肉と化膿で膨れ上がった傷口によって、非常に大柄に見えます。" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "棘状ゾンビヘラジカ" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" +"長く艶のない毛皮に身を包んだ、大きなヘラジカのゾンビです。茨のような蔦が体内から伸び、毛皮と絡み合っています。角は長い棘で覆われており、神秘的な銀色の液体が滴っています。" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -66454,21 +67196,6 @@ msgid "" "outpace its two-legged friends." msgstr "活発に動き回る形の崩れた犬の死体です。筋肉質の恐るべき獣は、二本足で歩く人間を易々と追い越します。" -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "スケルトン犬" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"かつてイヌだったものは、全ての皮膚が剥がれ、融合した骨の甲殻が露わになっています。肉がすべて失われた動く骨は、血管や筋肉のように全身を覆う艶やかな黒い粘液の脈動によって制御されているようです。" - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -66572,6 +67299,30 @@ msgid "" "and its eyes bulge with black goo." msgstr "ゾンビ化したピューマです。後ろ脚が肥大化し、目は黒く粘つく何かによって膨張して見えます。" +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "ゾンビトラ" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "一見すると普通のトラですが、時折よろめき、顎は外れかけており、大きく開いた目は黒く輝いています。" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "ゾンビクモの大群" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "何千、何万ものクモが高々と積み上がり、粘り気のある緑色の体液を滲ませながら、悪臭を放つ死骸を必死に動かそうとしています。" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -67104,6 +67855,43 @@ msgstr "身体が不気味に捻じれて昆虫のような姿に変形してい msgid "The impaler launches a barb!" msgstr "毒虫ゾンビは針を射出しました!" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -68950,6 +69738,18 @@ msgid "" " emerge." msgstr "サイに似た強大な恐竜です。盾のような硬質のとさかと3本の大きな角が特徴です。" +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "改造トリケラトプス兵" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "生体部品がパチパチと音を立てて明滅している、巨大な3本角をもつ四足歩行の恐竜です。角は威嚇的に光っています。" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -68973,6 +69773,18 @@ msgid "" "massive spiked club of bone." msgstr "巨大なアルマジロといった風体の恐竜です。尾の先端が棘付き棍棒になっています。" +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "アパトサウルス" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "長い首と鞭のように伸びた尻尾をもつ、巨大な四足歩行の恐竜です。頭は高い位置にあり、首は頑丈な打撃武器になりそうです。" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -69037,7 +69849,7 @@ msgstr "羽毛を持つ中型の二足歩行恐竜です。両足の先端に鎌 #: lang/json/MONSTER_from_json.py msgid "Deinonychus bio-operator" msgid_plural "Deinonychus bio-operator" -msgstr[0] "改造デイノニクス" +msgstr[0] "改造デイノニクス兵" #. ~ Description for {'str_sp': 'Deinonychus bio-operator'} #: lang/json/MONSTER_from_json.py @@ -69171,6 +69983,98 @@ msgid "magenta and green hatchling" msgid_plural "magenta and green hatchlings" msgstr[0] "恐竜幼体(赤紫色&緑色)" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "真菌ゾンビスピノサウルス" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" +"かつては背中に帆を背負った巨大なワニ頭の肉食恐竜でしたが、今や真菌の糸が口や目など全身のあらゆる穴から飛び出し、カビが生えたただの巨大な肉塊と化しています。" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "真菌ゾンビティラノサウルス" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "かつては恐竜の王でしたが、今や真菌の糸が口や目など全身のあらゆる穴から飛び出し、カビが生えたただの巨大な肉塊と化しています。" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "真菌ゾンビデイノニクス" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" +"かつては羽毛が生えた中型の肉食恐竜でしたが、今や真菌の糸が口や目など全身のあらゆる穴から飛び出し、カビが生えたただの巨大な肉塊と化しています。" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "ゾンビガリミムス" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "ボロボロの羽毛と酷く臭う黒い液体で覆われた、フラフラと歩く中型二足歩行恐竜のゾンビです。" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "ゾンビパキケファロサウルス" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" +"ボロボロの羽毛と酷く臭う黒い液体で覆われた、フラフラと歩く中型二足歩行恐竜のゾンビです。ダチョウのように硬そうな丸いドーム型の頭部が特徴です。" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "ゾンビカンプトサウルス" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "頑丈な足と幅広い肩、尖った嘴が特徴的な、羽毛が生えた大型の二足歩行恐竜ゾンビです。ボロボロの羽毛は黒い粘液で汚れています。" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "ゾンビスピノサウルス" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "瞳から黒い液体が滲み出ている、ボロボロの帆を背負ったワニのような獰猛な顔つきのゾンビ恐竜です。" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -69182,11 +70086,99 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "巨大な牙が生えた、悪臭を放つ傷だらけの筋肉の塊です。" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "ゾンビアルバートサウルス" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "鋭い爪を生やした脚を引きずって歩く巨大な恐竜のゾンビです。立派な顎から黒い液体が垂れています。" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "ゾンビトリケラトプス" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "サイに似た強大な恐竜のゾンビです。盾のような硬質のとさかと3本の大きな角が特徴です。目元に黒い液体が涙のように滲んでいます。" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "ゾンビステゴサウルス" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" +"背中に大きな骨質の板がいくつも生えた、動きの鈍い大型の四足歩行恐竜です。脚を引きずっていますが、棘の生えた尻尾を生前よりも激しく振り回しています。" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "ゾンビアンキロサウルス" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "剥がれかけた装甲と黒く光る目をもつ、巨大なアルマジロといった風体の恐竜のゾンビです。尾の先端が棘付き棍棒になっています。" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "ゾンビアパトサウルス" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "長い首と鞭のように伸びた尻尾をもつ、巨大な四足歩行の恐竜のゾンビです。頭は高い位置にあり、首は頑丈な打撃武器になりそうです。" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "ゾンビドラゴン" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "全身を鱗と骨の棘で覆った、恐ろしいスピードで動く巨大なゾンビドラゴンです。色鮮やかな角は摩耗して不潔に汚れており、鱗と棘も損傷しています。" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "ゾンビアロサウルス" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "大型の捕食性二足歩行恐竜のゾンビです。鱗が生えた広い背中に虎のような縞模様があります。" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" msgstr[0] "ゾンビデイノニクス" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -69194,6 +70186,376 @@ msgid "" "sickle-like claw." msgstr "ボロボロの羽毛と酷く臭う黒い液体で覆われた、フラフラと歩く中型二足歩行恐竜のゾンビです。両足から生えた鎌のような爪を振り回しています。" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "ゾンビユタラプトル" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "羽毛に覆われた腕、長い尾、大鎌のような鉤爪を持つ大型二足歩行恐竜のゾンビです。フラフラと動きまわり、時折飛び跳ねています。" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "ゾンビパラサウロロフス" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "まだら模様と棒状のとさかを持つ大型恐竜です。死後も動き続けており、目玉を失った目蓋が腫れています。" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "ゾンビディモルフォドン" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "体長約90cm程度の、羽毛がボロボロになった飛行爬虫類のゾンビです。短い翼と大きく色鮮やかなくちばしを持っています。" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "ゾンビディロフォサウルス" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" +"脚を引きずって歩く中型恐竜のゾンビです。鋭い牙が生えており、頭部には特徴的な2つの頭骨があります。傷ついた身体から肉片がフリルのように垂れ下がっています。" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "冥暗ゾンビスピノサウルス" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "ボロボロの帆を背負った巨大な二足歩行恐竜です。頭部は細長く、口が尖っています。不気味な影に包まれており、輪郭がぼやけています。" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "冥暗ゾンビティラノサウルス" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "羽毛が生えた巨大な二足歩行恐竜のゾンビです。頭部は大きく、口元から鋭い歯列が覗いています。不気味な影に包まれており、輪郭がぼやけています。" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "冥暗ゾンビデイノニクス" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" +"羽毛が生えた中型の二足歩行恐竜のゾンビです。両足から生えた大鎌のような爪を振り回しています。不気味な影に包まれており、輪郭がぼやけています。" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "スケルトンティラノサウルス" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "黒い粘液が滴る大きな尖った歯を見せつけている、巨大な骨の集合体です。" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -69646,6 +71008,18 @@ msgid "" "off creatures that disturb it." msgstr "敵を追い払うために鋭い金切り声を発する、人間大のキノコです。" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "カエル" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "アメリカで一般的なウシガエルです。王子様は逃げた方が良さそうです。" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -69910,18 +71284,6 @@ msgstr "" "レイセオン-" "12Nのレベル10建設工兵モデルです。1体につき兵士1人を補助する役割を持つレイセオンシリーズは、従来の軍隊と問題なく統合できるよう設計されています。" -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "トイレットペーパーミイラ" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "人型のようにも見える、トイレットペーパーのようなものを巻き付けた怪物です。。" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -70281,19 +71643,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "デーモンキチンのメッシュ素材で自作した、それぞれクリニエール、ペイトレール、クルーピエと呼ばれる馬鎧です。友好的なウマに装着できます。" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "ニャワーアーマー" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" -"保護用フードとチェストプレートが付いた、軽く滑らかなケブラー製のネコ用ハーネスです。背面には非常に小さく役に立たないマジックテープ付きポケットがあります。" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "哺乳類" @@ -70306,6 +71655,14 @@ msgstr "両生類" msgid "a bird" msgstr "鳥類" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "異星サイボーグ" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "[重々しい衝撃音]" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "爬虫類" @@ -71038,6 +72395,22 @@ msgstr "頭蓋爆弾発動" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "頭蓋爆弾発動に使われる疑似呪文です。致命的なダメージを与えます。" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "スカルガン反動(CBM)" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "スカルガン発動に使われる疑似呪文です。体力によっては致命的なダメージを与える可能性があります。" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "発射の反動で首が後ろに折れ曲がりました。" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "気絶攻撃(超能力)" @@ -71160,6 +72533,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "儀式によってアニミストと波長の合う神秘的な石を創り出します。石はレシピの触媒として利用できます。" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "ソウルレンド" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "敵の肉体から精神を無理やり引き剥がし、その結果生じる亡霊を意志の力で縛ります。" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "イグニス・ファトゥス" @@ -71382,6 +72766,15 @@ msgstr "疲労増加(デバッグ専用)" msgid "Uses a little fatigue" msgstr "疲労が少し増加します。" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "ポリモーフ(デバッグ)" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "体重を減らしたかったんですか?" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "HP消費(デバッグ専用)" @@ -71440,8 +72833,8 @@ msgstr "指定位置から全てのオブジェクトを押し出します。" msgid "Debug Full Protection" msgstr "完全防御(デバッグ専用)" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "あらゆるものから害されることがなくなります。" @@ -71813,6 +73206,10 @@ msgstr "マナ・ボルト" msgid "Haste" msgstr "ヘイスト" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "ベールフル・ポリモーフ" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "マナ・ビーム" @@ -71934,10 +73331,10 @@ msgstr "4体のデーモンスパイダー(幼体)を召喚します。" msgid "Jolt" msgstr "ジョルト" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "パシッ。" @@ -72006,6 +73403,31 @@ msgstr "閃光効果を追加します。" msgid "Wall of Fog" msgstr "ウォール・オブ・フォグ" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "リペリング・アークオーラ付与(副次効果)" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "リペリング・アークの副次的効果です。" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "電撃が弧を描いて翻りました!" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "リペリング・アーク" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "パチパチと音を立てるオーラで全身を包み、悪意ある攻撃者を電撃で迎え撃ちます。" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "ブレス" @@ -72118,66 +73540,38 @@ msgstr "内なるレイラインを使ってCBM用の電力を過充電し、顔 msgid "X-ray Vision" msgstr "エックスレイ・ビジョン" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "マナ・サイフォン" - -#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "マナ・サイフォン系列の突然変異の呪文効果です。デバッグ中でなければ、この呪文は習得できません。" +msgid "Knock" +msgstr "ノック" -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "ビビビビ" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "標的を指差して「ビビビビ」と音を立てました。" - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "ザ・フロア・イズ・ラヴァ" - -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" -msgstr "床が溶岩になっています!上に登れる椅子やカウンターを探した方が良さそうですね。" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." +msgstr "鍵がかかったドアを開ける魔法です。木製のドアにしか通用しません。" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" -msgstr "スポーツ・トレイニング・モンタージュ" +msgid "Improved Knock" +msgstr "インプローブド・ノック" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." -msgstr "すごく長い時間がかかることをあっという間にこなして見せる、それがモンタージュ。" +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." +msgstr "鍵がかかったドアを開ける魔法です。あらゆるドアに通用します。" -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "キス・ジ・アウィー" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "かつて母親にしてもらったような、痛みを消す優しいキスをします。" - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" -msgstr "サモン・マミー" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" +msgstr "マナ・サイフォン" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." -msgstr "心の中の掃除用具入れから、トイレットペーパーの怪物を呼び出します。" +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." +msgstr "マナ・サイフォン系列の突然変異の呪文効果です。デバッグ中でなければ、この呪文は習得できません。" #: lang/json/TOOLMOD_from_json.py msgid "reactor core expansion device" @@ -74481,25 +75875,31 @@ msgid "" msgstr "雷の神トールが身に着けていた魔法の帯、またはそのレプリカです。着用者の基礎筋力が2倍になります。" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" -msgstr[0] "魔法の腰袋" - -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" +msgstr[0] "小型次元ツールベルト" + +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." -msgstr "腰に巻き付ける幅の広い帯です。収納した物の重量が大幅に軽減される小さな袋が多数付いています。" +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." +msgstr "収納しやすいポーチがたくさん付いた、腰にフィットする丈夫な作業用ベルトです。他の次元アイテムと同様に、収納した物の重量が軽減されます。" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" -msgstr[0] "魔法の大容量腰袋" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" +msgstr[0] "大型次元ツールベルト" + +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" +"収納しやすいポーチがたくさん付いた、腰にフィットする大型の作業用ベルトです。他の次元アイテムと同様に、収納した物の重量が大幅に軽減されます。" #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" @@ -75521,6 +76921,18 @@ msgid "bionic firestarter" msgid_plural "bionic firestarters" msgstr[0] "発火装置(CBM)" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "燻製ラック" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "これはcrafting_pseudo_itemであり、所持している場合はバグが発生しています。" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -75586,7 +76998,7 @@ msgstr[0] "ジャック・オ・ランタン" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "点火する" @@ -78132,12 +79544,6 @@ msgid "pseudo butter churn" msgid_plural "pseudo butter churns" msgstr[0] "バター撹拌機" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "これはcrafting_pseudo_itemであり、所持している場合はバグが発生しています。" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -78939,13 +80345,11 @@ msgstr[0] "スマートフォン" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "ライトアプリを有効化しました。" #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "スマートフォンの充電が足りません。" @@ -80284,7 +81688,6 @@ msgid_plural "fire axes" msgstr[0] "消火斧" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -80297,7 +81700,6 @@ msgid_plural "Halligan bars" msgstr[0] "ハリガンバール" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -80324,14 +81726,37 @@ msgid "throwable fire extinguisher" msgid_plural "throwable fire extinguishers" msgstr[0] "投擲式消火器" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "ピンを引き抜く" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "投擲式消火器のピンを引き抜きました。" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." msgstr "" -"手榴弾の形をした消火器です。一般的な消火器ほど効果的ではありませんが、遠くから投げることで効果を発揮します。熱を加えることで消火剤が噴き出します。" +"手榴弾の形をした消火器です。一般的な消火器ほど効果的ではありませんが、近寄らずに火を消せます。プラスチック製のピンを引き抜くと起動しますが、熱を加えても起動するので、そのまま炎の中に投げ入れても大丈夫です。" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "投擲式消火器(起動)" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" +msgstr "投擲式消火器のピンは既に引かれており、今にも消火剤をまき散らしそうです。投げましょう!" #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -80522,6 +81947,28 @@ msgid "" "shovel but really can't compare to a real shovel." msgstr "平らな石に木を添えたシャベルの代用品です。" +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "熊手(金属)" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "収穫祭の必需品、丈夫な金属製の熊手です。" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "熊手(プラスチック)" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "安っぽいプラスチック製の熊手です。落ち葉を掬う以外の用途に使うとすぐに壊れてしまいます。" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -80545,6 +81992,26 @@ msgstr[0] "シャベル" msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "掘削するための道具です。使用すると隣接する地形に穴を掘ります。" +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "雪かきシャベル" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "雪かきに使う頑丈なシャベルです。" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "雪かきシャベル(プラスチック)" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "雪かきに使う安っぽいプラスチック製のシャベルです。" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -81253,6 +82720,11 @@ msgid "" "the right tools, you could use this for metalworking." msgstr "炭を燃やして使う、携帯型の鍛造炉です。適切な道具と組み合わせれば、この炉で金属加工ができます。" +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "岩石炉" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -81380,6 +82852,17 @@ msgid "" "metalworking fabrication recipes." msgstr "金属製の長いトングです。料理や金属加工に使います。" +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "紙やすり" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "ざらざらとした紙です。金属加工や大工仕事でよく使われます。" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -81529,6 +83012,18 @@ msgid "" "and place on the ground." msgstr "丸めて畳んである毛皮のベッドロールです。断熱効果があり、床に敷いておくと寝心地が良くなります。使用すると地面に広げます。" +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "散水ホース" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "柔軟性が高い散水ホースです。短く切れば、何かの製作材料にしたり、車両の燃料を吸い上げたりと、色々な使い方ができそうです。" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -83280,7 +84775,6 @@ msgid_plural "rags" msgstr[0] "布" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -83693,11 +85187,11 @@ msgid "" msgstr "電動チェーンソーは大きな騒音を立てて動いています。使用すると電源を切ります。" #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "手斧(石)" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "斧頭(石)" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -83705,11 +85199,11 @@ msgid "" msgstr "木をなんとか伐採できる程度には鋭い、幅の狭い石器です。" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "手斧(金属)" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "斧頭(金属)" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -83825,6 +85319,11 @@ msgid "" "but you could use it to fire anything made of clay." msgstr "炭を燃やして使う携帯型の窯です。レンガを焼成するためのものですが、粘土で作ったものを焼くこともできます。" +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "窯" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -83973,7 +85472,6 @@ msgid_plural "scissor jacks" msgstr[0] "シザースジャッキ" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "車両を持ち上げる際に使う、小型のシザースジャッキです。" @@ -84187,7 +85685,6 @@ msgid_plural "screwdrivers" msgstr[0] "ドライバー" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -84226,7 +85723,6 @@ msgid_plural "soldering irons" msgstr[0] "はんだごて" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -84610,16 +86106,16 @@ msgid "" " towards enemy targets and highlight them with a powerful spotlight." msgstr "停止中の追跡ロボットです。展開に成功すると敵目がけて飛び立ち、強力なスポットライトで照らします。" -#: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" -msgstr[0] "精密はんだ付け装置" - #: lang/json/TOOL_from_json.py msgid "pseudo atomic butter churn" msgid_plural "pseudo atomic butter churns" msgstr[0] "アトミックバター撹拌機" +#: lang/json/TOOL_from_json.py +msgid "precision solderers" +msgid_plural "precision solderers" +msgstr[0] "精密はんだ付け装置" + #: lang/json/TOOL_from_json.py msgid "atomic smartphone" msgid_plural "atomic smartphones" @@ -84807,6 +86303,21 @@ msgid "" msgstr "" "非常に小さな工具と暗号化されたデジタルキーのセットです。一般的には、臨床現場でCBMを修理する際に使います。単純な作りのCBMであれば分解も可能ですが、より複雑なものは更に専門的な工具が必要です。" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "CBMツールキット" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" +"非常に小さなロボットツールと暗号化されたデジタルキーがセットになったものです。元々は工場生産されたCBMを分解して品質をテストするために使う道具です。高度な技術と忍耐力をもつエンジニアなら、これを使ってCBMを一から手作業で組み立てることも可能です。" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -85631,6 +87142,60 @@ msgid "greater wand of cone of cold" msgid_plural "greater wands of cone of cold" msgstr[0] "上級杖(コーン・オブ・コールド)" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "下級杖(ノック)" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "マナクリスタルを嵌め込むソケットが付いた、細長い木製の杖です。この杖を使用するとノックを詠唱できます。" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "中級杖(ノック)" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "上級杖(ノック)" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "下級杖(インプローブド・ノック)" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "マナクリスタルを嵌め込むソケットが付いた、細長い木製の杖です。この杖を使用するとインプローブド・ノックを詠唱できます。" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "中級杖(インプローブド・ノック)" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "上級杖(インプローブド・ノック)" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -85793,6 +87358,60 @@ msgid "disposable greater wand of cone of cold" msgid_plural "disposable greater wands of cone of cold" msgstr[0] "上級杖(コーン・オブ・コールド/起動)" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "下級杖(ノック/起動)" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "マナクリスタルが埋め込まれた細長い木製の杖です。この杖を使用するとノックを詠唱できます。" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "中級杖(ノック/起動)" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "上級杖(ノック/起動)" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "下級杖(インプローブド・ノック/起動)" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "マナクリスタルが埋め込まれた細長い木製の杖です。この杖を使用するとインプローブド・ノックを詠唱できます。" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "中級杖(インプローブド・ノック/起動)" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "上級杖(インプローブド・ノック/起動)" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -85922,66 +87541,6 @@ msgid "" msgstr "" "魔法の金属を溶かして加工しやすい鋳塊にするための、携帯できる高性能な炉です。デーモンスパイダーのキチンを使って魔術的な強化が施されています。" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "布(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "ハリガンバール(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "消火斧(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "ドライバー(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "ソニック・ドライバー(テスト)" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "ソニック・ドライバーは見た目は普通のドライバーですが、ソニック機能が搭載されています。" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "はんだごて(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "シザースジャッキ(テスト)" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "スマートフォン(テスト)" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "ライト、カメラ、MP3プレーヤーを搭載した、UPS稼働のスマートフォンです。" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "紙マッチ(テスト)" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "テスト用のマッチです。放火しましょう。これも科学の発展のためです!" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -86271,7 +87830,7 @@ msgstr "死人の余生一日目" #: lang/json/achievement_from_json.py msgid "Survive for a day and find a safe place to sleep" -msgstr "一日生き延びて安全な寝床を見つけました。" +msgstr "一日生き延びて安全な寝床を見つける" #: lang/json/achievement_from_json.py msgid "Thank God it's Friday" @@ -86279,7 +87838,7 @@ msgstr "花の金曜日" #: lang/json/achievement_from_json.py msgid "Survive for a week" -msgstr "一週間生き延びました。" +msgstr "一週間生き延びる" #: lang/json/achievement_from_json.py msgid "28 days later" @@ -86287,7 +87846,7 @@ msgstr "28日後..." #: lang/json/achievement_from_json.py msgid "Survive for a month" -msgstr "一か月間生き延びました。" +msgstr "一か月間生き延びる" #: lang/json/achievement_from_json.py msgid "A time to every purpose under heaven" @@ -86295,7 +87854,7 @@ msgstr "天が下の万の事には期あり" #: lang/json/achievement_from_json.py msgid "Survive for a season" -msgstr "一季節を生き延びました。" +msgstr "一季節を生き延びる" #: lang/json/achievement_from_json.py msgid "Brighter days ahead?" @@ -86303,15 +87862,15 @@ msgstr "光明の未来に向かって?" #: lang/json/achievement_from_json.py msgid "Survive for a year" -msgstr "一年間生き延びました。" +msgstr "一年間生き延びる" #: lang/json/achievement_from_json.py msgid "Pheidippides was a hack" msgstr "新世界のフィリッピデス" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." -msgstr "マラソン...にもうちょっと足した距離を走りました。" +msgid "Run a marathon… plus a little bit more." +msgstr "マラソン...にもうちょっと足した距離を走る" #: lang/json/achievement_from_json.py msgid "Please don't fall down at my door" @@ -86319,7 +87878,7 @@ msgstr "家の前で倒れ込まないで" #: lang/json/achievement_from_json.py msgid "Walk 500 miles, then walk 500 more." -msgstr "500マイル(約805km)以上歩きました。" +msgstr "500マイル(約805km)以上歩く" #: lang/json/achievement_from_json.py msgid "Every rose has its thorn" @@ -86341,13 +87900,629 @@ msgstr "どんな谷も越えられる" msgid "Freeman's favorite" msgstr "フリーマンのお気に入り" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "バールを装備する" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "鉄壁" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "タンクスーツを装備する" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" -msgstr "何を隠している?" +msgstr "非公開情報" + +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "研究室の最奥部に入る" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "最後の憩の館" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "避難センターにたどり着く" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "全てはここから始まった" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "ゲーム開始地点に戻る" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "木こり入門" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "誰もいない森の中で木が倒れたとき、その音はするのでしょうか?" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "木こり" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "斧を持った人間にとっての森とは何でしょうか?" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "森林破壊" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "森を拓けばオオカミが飛び出します。" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "墓掘り人" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "求めるものは、より多くの死体です。" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "墓泥棒" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "ちょっと、断られたらどうするんです?本人に許可を取りましょうよ。" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "告別式" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "数多の人間が死んでも放っておかれる状況で、埋葬は特権です。" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "葬儀屋" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "腐敗する遺体をゾンビと一緒に扱うべきではありません。" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "葬儀場" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "世界を埋葬するなんて可能なのでしょうか?" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "サイバーパンク" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "心は熱しているが、肉体は弱い。" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "時計仕掛けの人間" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "機械の汚れた手で、お前に復讐しよう...お前にも。それが何であれ、私にもまだ分からぬ。だが世界は恐怖におののく。" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "ホモ・エボルティス" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "人類の世は終わりを告げ、長きに渡る超人類の世が幕を開けます。" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "破壊されたが敗北はしていない" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "医療保険は適用されますか?" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "自由貿易" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "並外れた商品をバカバカしいほどの安値でご提供!" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "カット・ミー・オウン・スロート・ディブラー" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "イヌイットのお客さん、氷はいかがかな。とっても安いよ、出血大サービスだよ。" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "口八丁" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "私たち、友達だろ?" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "雄弁" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "巨体ゾンビを説得して帰らせたという伝説があります。" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "ハッカーマン" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "このOSには非常口がある。どんなところにも非常口はあるものだ。" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "Kevinと似て非なるもの" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "チートではありません。デバッグです。" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "医療関係者" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "お客様の中にお医者様はいらっしゃいませんか?" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "Dr. HOUSE" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "この患者はSLEだ。" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "技術者" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "いいからレンチを取ってくれ。" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "マクガイバー" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "この計画の要は信仰と唾とダクトテープです。" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "罠猟師" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "良い罠はビーバーとゾンビーバーを区別しません。" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "マインスイーパー" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "一度のミスが命取り。" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "エースドライバー" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "曲がれないカーブはありません。" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "The Stig" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "F1なんて休日のドライブみたいなものです。" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "スイマー" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "水を得た魚のようです。" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "マイケル・フェルプス" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "ジョーズよりずっと速い。" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "DIY" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "これをそこに置いて、あれをそれに入れたら、はい出来上がり。" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "何でも屋" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "接着剤さえ用意できれば不可能はありません。" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "料理長" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "ヒレ肉の照り焼きも朝飯前です。" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "ヘルズ・キッチン" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "本日のメニューはスープ・ア・ロニオン、ブルゴーニュ風牛ワイン煮込み、クレームブリュレです。" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "仕立て屋" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "針と糸と夢を携えています。" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "ファッションデザイナー" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "男性、女性、変異体のファッションが得意分野です。" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "サバイバー" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "サバイバルは得意分野です。" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "ベア・グリルス" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "自分の尿まで使って生き残るというのですか?" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "オームの法則" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "サンダーオーム。2ボルトが1ボルトになる。抵抗は無意味だ。" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "ニコラ・テスラ" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "9V電池の味は簡単に確かめられるものではない。" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "大当たり" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "レゴラスより上手です。" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "ロビン・フッド" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "ウィリアム・テル?知らない人ですね。" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "鷹の目" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "狙い撃ち。" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "百発百中" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "逃げるな。疲れて死ぬだけだ。" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "砲手" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "口径の差を見せつけましょう。" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "ロケットマン" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "月まで届けてあげよう。バラバラにしてね。" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "小さくても油断は禁物" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "銃口の先に立った者はわざわざ口径を測ったりしません。" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "ダーティハリー" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" +"こいつはマグナム44って言って世界一強力な拳銃なんだ。お前のドタマなんて一発で消し飛ぶぜ?楽にあの世まで逝けるんだ。運が良けりゃな。さあどうする?" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "ライフル銃兵" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "これが我が銃。銃は数あれど我が物は一つ。これぞ我が最良の友。我が命。我銃を制すなり。我が命を制するごとく。" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "兵士" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" +"我なくして銃役立たず。銃なくして我役立たず。我的確に銃を撃つなり。我が銃を常に清く保ち備えん。我が体を常に清く保ち備えるがごとく。我らは共に一体とならん。" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "銃身が2倍で楽しさも2倍" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "1発で9回命中させるのも夢ではありません。" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "エルマー・ファッド" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "どったのセンセー?ウハギ狩り?" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "スプレー・アンド・プレイ" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "1発は当たるでしょう。統計的な問題ですね。" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "SMGをバババババ!" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "もっと弾薬が必要です。" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "ぽーい!" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "そして二度と戻ってはこなかった。" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "コービー・ブライアント" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "手榴弾投擲!" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "暴れ者" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "左手にガラス瓶、右手に椅子の脚。" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "ストリートファイター" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "重要なのはスタイルではなく勝利です。" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "バッター" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "素振りをする度にホームランに近付きます。" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "石器時代" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "棍棒は人類最初の道具でした。最後の道具になるかもしれません。習得しておきましょう。" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "剣の道" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "宮本武蔵" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "剣とは単なる武器以上のもの、すなわち人生に対する問いへの答えとなるべきものです。" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "煙に巻く" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "最強の攻撃も当たらなければ意味はありません。" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "ネオ" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "弾丸も躱せるでしょうか?" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "白刃" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "お前がパーティーを楽しんでいる間、ずっと刃物の研究をしていたんだ。" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "切り裂きジャック" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "目の前に見えるのは短剣か?取っ手を俺の方に向けている。よし、掴んでみよう。" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "少林寺への道" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "拳に軍団が宿っている気がします。" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "ミヤギ先生" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "お前自身が武器となるのだ。" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "空き巣" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "バール?そんなの野蛮ですよ。" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "錠前師" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "どんな錠前にも鍵はあります。" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "周期表" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "大体は料理と同じですが、スプーンを舐めるのは止めましょう。" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "ハイゼンベルク" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "すでに知ってるはずだ。私はメスを作っている。私の名は。" #: lang/json/achievement_from_json.py msgid "Would-be Wizard" @@ -86803,6 +88978,11 @@ msgstr "ハッキング" msgid "canceling activity serialized with legacy code" msgstr "古いコードでシリアライズされた行動の取消" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "運動" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "核融合セル" @@ -87104,6 +89284,10 @@ msgstr "噴霧薬品" msgid "compressed air" msgstr "圧縮空気" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "弾薬(12.3ln)" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "紙筒弾" @@ -87156,10 +89340,6 @@ msgstr "水銀" msgid "mana energy" msgstr "マナ" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "激しい蒸気" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "アドレナリン刺激装置" @@ -88617,20 +90797,6 @@ msgstr "" msgid "Wind Turbines" msgstr "風力タービン" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "精密はんだ付け装置" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" -"精密はんだごて、ワイヤーカッター、ケーブルリールが手に内蔵されています。サイズが小さすぎるため製作できるものは限られていますが、適切な機械がないときに最低限の道具でCBMを制作できます。" - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "折畳式グレネードランチャー" @@ -88679,6 +90845,20 @@ msgid "" msgstr "" "脊椎の上部に爆弾を移植され、働かされていましたが、卑劣な設置者たちは全員死んでしまいました。残念ながら、30日ごとにコードを入力しないと爆発して死んでしまいます。早くコードを見つける必要があります。" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "精密はんだ付け装置" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"精密はんだごて、ワイヤーカッター、ケーブルリールが手に内蔵されています。サイズが小さすぎるため製作できるものは限られていますが、適切な機械がないときに最低限の道具でCBMを制作できます。" + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -89025,8 +91205,64 @@ msgstr "1体のキャラクターも殺していません。" msgid "Merciful" msgstr "慈悲の心" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "エルフの小道" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "木を伐採しない" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "ホモ・サピエンス" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "CBMを移植しない" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "欠陥CBMを移植しない" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "変異しない" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "X線検査異常なし" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "純血種" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "構造的完全性" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "四肢の骨を折らない" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "教師よ、子供にかまうな" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "スキルレベルを上げない" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "自称文盲" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "本を読まない" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "全て" @@ -89649,10 +91885,6 @@ msgstr "壁を黄色に塗る" msgid "Take Paint Off Wall" msgstr "壁の塗料を落とす" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "絨毯を取り除く" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "絨毯(赤)を敷く" @@ -89693,6 +91925,30 @@ msgstr "階段(木)を設置する" msgid "Mine Upstair" msgstr "上階を掘削する" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "車両建造を始める" @@ -89783,7 +92039,7 @@ msgstr "貯蔵穴の設置には深い穴が必要です。" #: lang/json/construction_from_json.py msgid "Mark firewood source" -msgstr "焚木置き場の印を付ける" +msgstr "焚物置き場の印を付ける" #: lang/json/construction_from_json.py msgid "" @@ -91514,7 +93770,7 @@ msgstr "動物に騎乗しています。" msgid "You mount your steed." msgstr "動物に騎乗しました。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "炎上" @@ -92687,7 +94943,7 @@ msgstr "結構な量のタバコをふかしました。" msgid "You smoked too much." msgstr "タバコの吸い過ぎです。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "高揚" @@ -93979,70 +96235,6 @@ msgstr "身体中ガムまみれです!" msgid "The gum webs constrict your movement." msgstr "ガムの網が絡まって上手く動けません。" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "デバッグ" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" -"デバッグを行いました!\n" -"全てが完璧に動作しています。" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "ソース内に飛び込み、ラバーダックに死ぬほど話しかけました。" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "最適化" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "ミニマックス" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "最悪であることに利点はなく、最良であることに欠点はありません!" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "体内のの測定基準がびっくりハウスの鏡のように引き延ばされました。" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "おっと" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "えっ" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "うわー!" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" -"何もかもが激しすぎます!\n" -"混乱し、まごついています。" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "[激化]" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "あなたの仲間" @@ -94230,6 +96422,17 @@ msgid "" " the kind words used about them." msgstr "ウェイトリー一家は、ニューイングランドの歴史ある風変わりな一族です。風変わり、というのはオブラートに包んだ表現です。" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "スワンパーズ教団ホテル&カジノ" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "人気は高いものの秘密主義を貫く教団の信者たちと、恐竜に愛情を注ぐ芸能界の重鎮たちのグループです。穢れのない人間を歓迎しています。" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "エンシェント・ワン" @@ -94764,6 +96967,18 @@ msgstr "火" msgid "raging fire" msgstr "燃え盛る炎" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "薄い消火剤" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "消火剤" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "濃い消火剤" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "旧瓦礫" @@ -95796,8 +98011,7 @@ msgid "" msgstr "室内で安全に火を起こすために使う、一般的な家具です。煙を屋外に排出するための煙突が付いています。火をつけたまま放置するのは危険です。" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "ガチャン!" @@ -95966,7 +98180,7 @@ msgid "" msgstr "積み上げられた枯れ草です。快適さや暖かさを気にしないなら、ベッドとして使えます。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "バリバリッ!" @@ -96625,11 +98839,9 @@ msgstr "運動器具" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." -msgstr "" -"頑丈なパイプの骨組みの端に重いバーベルが取り付けてある、筋力トレーニングで用いる装置です。バーベルは非常に大きく、補助員なしで使うと重傷を負うことになります。" +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." +msgstr "頑丈なパイプの骨組みの端に重いバーベルが取り付けてある、筋力トレーニングで用いる装置です。プレートを着け外しして重量を調整できます。" #: lang/json/furniture_from_json.py msgid "ball machine" @@ -96712,7 +98924,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "ergometer" -msgstr "エルゴメーター" +msgstr "電動エルゴメーター" #. ~ Description for ergometer #: lang/json/furniture_from_json.py @@ -96722,9 +98934,21 @@ msgid "" " to be scavanged." msgstr "ハンドルと踏台を使ってボート漕ぎのような運動を行う器具です。電力がないと動かせませんが、分解すれば役に立つ部品が手に入るかもしれません。" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "エルゴメーター" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "ハンドルと踏台を使ってボート漕ぎのような運動を行う器具です。内部機構で負荷を調整する旧式モデルですが、電力なしでも動かせます。" + #: lang/json/furniture_from_json.py msgid "treadmill" -msgstr "ランニングマシーン" +msgstr "電動トレッドミル" #. ~ Description for treadmill #: lang/json/furniture_from_json.py @@ -96734,6 +98958,18 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "移動せずに走り続けるための、制御盤が付いた電動ベルトコンベアです。こんな運動器具がなくても、有酸素運動はたっぷり行っている気がします。" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "トレッドミル" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "内部機構で負荷を調整できるベルトコンベアーです。踏み台の角度が急勾配になっていますが、使用者の自重によって適切な位置に調整されます。" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "サンドバッグ" @@ -96970,6 +99206,7 @@ msgid "" "rest your feet for once, and if coupled with a suitable table, you could eat" " a meal properly and almost pretend that things were normal again." msgstr "" +"4本の脚と座面と背もたれで構成された、シンプルな木製の椅子です。座って足を休めてもいいですし、適当なテーブルも用意すればちゃんとした食事スペースになり、以前までの日常を忘れずにいられます。" #: lang/json/furniture_from_json.py msgid "sofa" @@ -96982,6 +99219,7 @@ msgid "" "alongside one another, or one person to lay back on. It's not quite a bed, " "but it's a hell of a lot more comfortable than the floor." msgstr "" +"2人でゆったりと座ったり、1人で横になったりするのに十分な広さがある布張りのソファです。ベッドほどではありませんが、床で寝るのに比べれば格段に快適です。" #: lang/json/furniture_from_json.py msgid "stool" @@ -96993,14 +99231,14 @@ msgid "" "A simple stool, with four legs and a seat. While it's a touch more " "maneuverable to sit on, the lack of back support means it's significantly " "less comfortable than a normal chair." -msgstr "" +msgstr "4本の脚と座面で構成された、シンプルなスツールです。座り心地はまずまずですが、背もたれがないため、通常の椅子よりは劣ります。" #. ~ Description for camp chair #: lang/json/furniture_from_json.py msgid "" "A somewhat uncomfortable folding chair, with fabric strung across a metal " "frame. Not the best, but better than nothing, and a lot easier to pack up." -msgstr "" +msgstr "金属の骨組みに布が張られた、やや座り心地の悪い折り畳みいすです。最高の椅子ではありませんが、地べたに座るよりは快適で、持ち運びも楽です。" #: lang/json/furniture_from_json.py msgid "log stool" @@ -97011,7 +99249,7 @@ msgstr "丸太椅子" msgid "" "A short section from a tree trunk with one of the flat ends smoothed down. " "Makes for a decent place to sit, but not quite a real chair." -msgstr "" +msgstr "木の幹を短く切り、切断面が滑らかになるよう加工したものです。座り心地は快適ですが、本物の椅子には及びません。" #: lang/json/furniture_from_json.py msgid "deck chair" @@ -97024,6 +99262,7 @@ msgid "" "it's built to take outdoor conditions and is an improvement over the ground," " it's not particularly comfortable." msgstr "" +"木製の骨組みに布が張られた、折り畳み式のデッキチェアです。屋外で使うためにデザインされており、地べたに座るよりはマシですが、座り心地は特に快適という程ではありません。" #: lang/json/furniture_from_json.py msgid "bulletin board" @@ -97034,7 +99273,7 @@ msgstr "掲示板" msgid "" "A wide wooden frame with a sheet of corkboard inside. Good for pinning " "various notices for other survivors to read." -msgstr "" +msgstr "幅の広い木枠の中にコルクボードがはめ込んであります。他の生存者に読んでもらう様々な連絡事項を張り出せそうです。" #: lang/json/furniture_from_json.py msgid "sign" @@ -97045,7 +99284,7 @@ msgstr "看板" msgid "" "A simple signpost made of wood. Basically two planks alongside each other " "nailed to another plank that holds them up." -msgstr "" +msgstr "木でできたシンプルな看板です。並べた2枚の板をもう1枚の板に釘で固定した形状が一般的です。" #: lang/json/furniture_from_json.py msgid "warning sign" @@ -97056,7 +99295,7 @@ msgstr "警戒標識" msgid "" "A triangular signpost painted white with a red border. Designed to easily " "catch the eye, signs of this nature seldom display anything but bad news." -msgstr "" +msgstr "白地に赤い縁取りがされた三角形の標識です。目に留まりやすいデザインの標識であり、大抵は悪い情報が書かれています。" #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "bed" @@ -97069,6 +99308,7 @@ msgid "" "pillows, and despite being a completely ordinary mattress, it's a sight for " "sore, tired eyes." msgstr "" +"頑丈な木枠に嵌った、一般的なマットレスです。ごく普通のどこにでもあるマットレスですが、ブランケットや枕が無くても睡眠で疲れを癒す効果は絶大です。" #: lang/json/furniture_from_json.py msgid "bunk bed" @@ -97082,6 +99322,7 @@ msgid "" " you'd like to somebody you wouldn't normally want to share a mattress with," " a bed's a bed." msgstr "" +"一人用マットレスを上下の段に収納できる、頑丈な木製の2段ベッドです。一般的に、1枚のマットレスを共有したくない相手と共に使うものですが、ベッドとして問題なく使えます。" #: lang/json/furniture_from_json.py msgid "bed frame" @@ -97093,6 +99334,7 @@ msgid "" "A sturdy wooden bed frame built to hold most standard mattresses. Despite " "being one half of a bed, it's just about impossible to lay on by itself." msgstr "" +"大抵の標準的なマットレスを収納できる、頑丈な木製のベッドフレームです。ベッドを構成する要素の半分であるにもかかわらず、これだけで眠ることは困難です。" #: lang/json/furniture_from_json.py msgid "whack." @@ -97105,6 +99347,7 @@ msgid "" " entire bed without the mattress, it's pretty close. If it's someplace " "actually safe to sleep, it's practically a luxury in of itself." msgstr "" +"床に置かれた一般的なマットレスです。快適性はマットレスのないベッドよりはマシか、同程度です。安全に眠れる場所が確保できれば、これ程贅沢な寝床はありません。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py src/map.cpp @@ -97119,6 +99362,7 @@ msgid "" "it's someplace actually safe to sleep, it's practically a luxury in of " "itself." msgstr "" +"床に置かれたフワフワの羽毛入りマットレスです。快適性はマットレスのないベッドよりはマシか、同程度です。安全に眠れる場所が確保できれば、これ程贅沢な寝床はありません。" #: lang/json/furniture_from_json.py msgid "makeshift bed" @@ -97131,6 +99375,7 @@ msgid "" " bed, albeit with a slightly lumpy mattress. Considering the circumstances," " it's not too bad at all." msgstr "" +"薄っぺらい木枠に即席のマットレスをはめ込んだベッドです。少しゴワゴワしていますが、一般的なベッドと比べても遜色ありません。今の状況を考えれば、まったく悪くない寝床です。" #: lang/json/furniture_from_json.py msgid "straw bed" @@ -97141,7 +99386,7 @@ msgstr "藁ベッド" msgid "" "An improvised bedding pile made of hay. Better than nothing, but not " "particularly comfortable, and quite itchy." -msgstr "" +msgstr "干し草の山で作った即席の寝床です。地べたで眠るよりはマシですが、特に快適でもなく、痒みが気になります。" #: lang/json/furniture_from_json.py msgid "bookcase" @@ -97152,7 +99397,7 @@ msgstr "本棚" msgid "" "A simple wooden shelf for storing dozens of books. While designed for " "books, it does a decent job of storing anything else that'll fit." -msgstr "" +msgstr "何十冊もの本を収納できるシンプルな木製の棚です。本を並べるために作られたものですが、他の物品を置いても問題ありません。" #: lang/json/furniture_from_json.py msgid "entertainment center" @@ -97164,7 +99409,7 @@ msgid "" "While not quite as cool by itself as the name might imply, this large wooden" " cabinet can store a variety of things, like a TV and media systems, with " "shelving space and cupboards for anything that'll fit." -msgstr "" +msgstr "この家具自体に格好いい要素はありませんが、テレビやメディアシステムなど、様々なものを収納でき、食器を置くスペースや棚も付いています。" #: lang/json/furniture_from_json.py msgid "coffin" @@ -97178,6 +99423,7 @@ msgid "" "to be given a proper final resting place. An honor that countless many will" " likely never receive." msgstr "" +"死者を敬い埋葬するための、簡素な木製の棺です。大変動前は葬儀は一般的な慣習でしたが、今の状況でまともな眠りにつける場所を用意してもらえるのは、極めてまれで名誉あることです。大多数の人々は、この名誉を享受できません。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py msgid "wham!" @@ -97195,6 +99441,7 @@ msgid "" "to be given a proper final resting place. This one is open and unoccupied, " "and gazing inside fills you with a sense of melancholic weariness." msgstr "" +"死者を敬い埋葬するための、簡素な木製の棺です。大変動前は葬儀は一般的な慣習でしたが、今の状況でまともな眠りにつける場所を用意してもらえるのは、極めてまれで名誉あることです。蓋は開いており、中を眺めていると憂鬱な倦怠感に満たされます。" #: lang/json/furniture_from_json.py msgid "crate" @@ -97207,6 +99454,7 @@ msgid "" "about anything inside. If you don't have a proper tool to pry it open, " "smashing it is an option, albeit one that risks destroying the contents." msgstr "" +"密閉された木箱です。ラベルは貼られておらず、中に様々なものが入ります。こじ開けるための道具を持っていない場合は叩き壊して開けることも可能ですが、内容物が損傷する危険が伴います。" #: lang/json/furniture_from_json.py msgid "open crate" @@ -97218,7 +99466,7 @@ msgid "" "An open wooden storage box, capable of holding any number of things. The " "lid has been pried off and is leaned adjacent to it, and with a fresh set of" " nails, could be sealed back shut." -msgstr "" +msgstr "様々なものを収納できる、開いた状態の木箱です。蓋は隣に立てかけてあり、釘を打ちつければ再度封印できそうです。" #. ~ Description for large cardboard box #: lang/json/furniture_from_json.py @@ -97228,6 +99476,7 @@ msgid "" "for carrying, it's very hard to see out of, and won't do anything to protect" " you if you're found." msgstr "" +"茶色い紙で作られた大型の箱です。様々なものが入っている、あるいは何かが潜んでいる可能性があります。運搬用の小さな穴が2つしか空いていないことを考えると外からは中が見えませんが、もし見つかった場合は何の障壁にもなりません。" #: lang/json/furniture_from_json.py msgid "crumple!" @@ -97246,7 +99495,7 @@ msgstr "衣装棚" msgid "" "A simple wooden cabinet with a column of short drawers. While intended for " "storing clothes, there's nothing stopping you from storing whatever fits." -msgstr "" +msgstr "縦に並んだ幅の狭い引き出しが付いた、シンプルな木製の衣装棚です。衣類を収納するための家具ですが、入るものなら何でも収納できます。" #: lang/json/furniture_from_json.py msgid "glass front cabinet" @@ -97259,6 +99508,7 @@ msgid "" "contents. Often used for displaying rare, visually pleasing, or otherwise " "valuable goods, it's odd that it doesn't have a lock." msgstr "" +"前面は中が見えるようにガラス張りになっている、背の高い金属製の棚です。珍しいものや見た目が美しいものを陳列するのに使われることが多いですが、おかしなことに鍵はかけられません。" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -97278,6 +99528,7 @@ msgid "" "ammunition. If you had something to listen close with and a hell of a lot " "of time, you could probably crack it." msgstr "" +"ダイヤル式のコンビネーションロックを備えた、分厚い金属製の重くて大きなコンテナです。銃器やその改造部品、弾薬などを安全に保管できるように設計されています。小さな音を聞きとる道具と非常に長時間の猶予があれば、開錠できそうです。" #: lang/json/furniture_from_json.py msgid "screeching metal!" @@ -97294,6 +99545,7 @@ msgid "" "Unfortunately, the lock is completely broken, and short of some pretty " "serious machinery, you have no possible way of opening it." msgstr "" +"銃器や弾薬を保管するための、重くて頑丈な金属製の保管庫です。残念ながら、ロックが完全に壊れています。並外れた破壊力を持つ機械でも使わない限り、開きそうにありません。" #: lang/json/furniture_from_json.py msgid "electronic gun safe" @@ -97307,6 +99559,7 @@ msgid "" "ammunition. If you had some way of hacking into it, you could probably " "crack it open." msgstr "" +"電子ロックシステムを備えた、分厚い金属製の重くて大きなコンテナです。銃器やその改造部品、弾薬などを安全に保管できるように設計されています。何らかのハッキング手段があれば開けられそうです。" #: lang/json/furniture_from_json.py msgid "locker" @@ -97317,7 +99570,7 @@ msgstr "ロッカー" msgid "" "A tall sheet metal cabinet, useful for storing just about anything that'll " "fit." -msgstr "" +msgstr "背の高い板金製の戸棚です。中に納まるサイズであればどんなものでも収納できます。" #: lang/json/furniture_from_json.py msgid "mailbox" @@ -97330,10 +99583,11 @@ msgid "" "deliveries. Although considering the circumstances, it will likely never " "see proper use again." msgstr "" +"郵便物を受け取るために作られた、木製の支柱に乗った金属製の箱です。今の状況を考えると、まともな用途で再び使われるようになる日は来ないと思われます。" #: lang/json/furniture_from_json.py msgid "clothing rail" -msgstr "ハンガーレール" +msgstr "ハンガーラック" #. ~ Description for clothing rail #: lang/json/furniture_from_json.py @@ -97341,7 +99595,7 @@ msgid "" "A metal frame on a set of wheels used for hanging large amounts of clothes." " Usually used in theater or retail environments, it's easy to use and quick" " to access." -msgstr "" +msgstr "大量の衣類を吊るすために使われる、ホイールが付いた金属製のフレームです。通常は劇場や衣料品店で使われており、衣類を簡単に出し入れできます。" #: lang/json/furniture_from_json.py msgid "display rack" @@ -97352,7 +99606,7 @@ msgstr "棚(金属)" msgid "" "A sheet metal shelving unit, with the storage surfaces angled in such a way " "as to show off the items stored." -msgstr "" +msgstr "収納したものがよく見えるように棚板に角度が付いている、板金製の棚です。" #: lang/json/furniture_from_json.py msgid "wooden rack" @@ -97363,7 +99617,7 @@ msgstr "棚(木)" msgid "" "A wooden shelving unit with angled storage surfaces designed to show off " "whatever is stored on it." -msgstr "" +msgstr "収納したものがよく見えるように棚板に角度が付いている、木製の棚です。" #: lang/json/furniture_from_json.py msgid "coat rack" @@ -97374,7 +99628,7 @@ msgstr "コート掛け" msgid "" "A tall wooden pole with a set of hooks used to store outdoor jackets and " "hats to allow easy access." -msgstr "" +msgstr "アウトドア用のジャケットや帽子を掛けられる、フックが付いた背の高い木製の柱です。衣類を簡単に出し入れできます。" #: lang/json/furniture_from_json.py msgid "recycle bin" @@ -97388,6 +99642,7 @@ msgid "" "factory, the drastic change in priorities as of late means that these may " "hold valuable materials." msgstr "" +"緑色の大きなプラスチック製容器には、「リサイクル」のマークが描かれています。廃棄物を処理して工場に集めるための容器ですが、ものの価値が大きく変動した今の状況では、貴重品が入っている可能性もあります。" #: lang/json/furniture_from_json.py msgid "safe" @@ -97399,6 +99654,7 @@ msgid "" "A small, heavy, and near-unbreachable metal box with a rotary combination " "lock. Although, this isn't actually locked, just closed." msgstr "" +"ダイヤル式のコンビネーションロックを備えた、重く小さな、中身を強奪されることは滅多にない金属製の箱です。これはロックが掛かっておらず、ただ扉が閉じられているだけのようです。" #. ~ Description for safe #: lang/json/furniture_from_json.py @@ -97407,6 +99663,7 @@ msgid "" "lock. With something to listen really closely and a hell of a lot of time, " "you might be able to crack it." msgstr "" +"ダイヤル式のコンビネーションロックを備えた、重く小さな、中身を強奪されることは滅多にない金属製の箱です。非常に小さな音を聞き分けられる道具と地獄のように長い時間があれば、金庫破りも可能です。" #: lang/json/furniture_from_json.py msgid "open safe" @@ -97418,6 +99675,7 @@ msgid "" "A small, heavy, and near-unbreachable metal box with a rotary combination " "lock, albeit significantly less secure with the door open." msgstr "" +"ダイヤル式のコンビネーションロックを備えた、重く小さな、中身を強奪されることは滅多にない金属製の箱です。扉が開いているので、安全性は大幅に低下しています。" #: lang/json/furniture_from_json.py msgid "trash can" @@ -97429,7 +99687,7 @@ msgid "" "A plastic bin for storing discarded waste as to be disposed of later. " "Although, considering the circumstances, it might be worth seeing what's " "inside." -msgstr "" +msgstr "ごみを廃棄する前に一時的に集めておくための、プラスチック製のごみ箱です。今の状況を考えると、漁ってみてもいいかもしれません。" #: lang/json/furniture_from_json.py msgid "wardrobe" @@ -97441,7 +99699,7 @@ msgid "" "A very large wooden cabinet for storing clothes, effectively an upright " "closet. Could technically be used to store anything else that would fit, " "though." -msgstr "" +msgstr "衣類を収納するための、非常に大きな木製の棚、いわば縦長のクローゼットです。中に入るサイズであれば、衣類以外も収納できます。" #: lang/json/furniture_from_json.py msgid "filing cabinet" @@ -97453,6 +99711,7 @@ msgid "" "A rack of metal drawers designed to hold various files and paperwork. " "Paperwork that has more than likely lost all worth or value by now." msgstr "" +"様々なファイルや書類を保管するために設計された、引き出しが付いた金属製の棚です。中に入っている書類は、今では何の価値もなくなってしまったと思われます。" #: lang/json/furniture_from_json.py msgid "utility shelf" @@ -97463,7 +99722,7 @@ msgstr "収納棚" msgid "" "A simple heavy-duty plastic and metal shelving unit, intended to store tools" " and materials for easy access to workers." -msgstr "" +msgstr "プラスチックと金属で作られたシンプルで頑丈な棚です。中に保管した工具や材料を楽に出し入れできるように設計されています。" #: lang/json/furniture_from_json.py msgid "warehouse shelf" @@ -97473,7 +99732,7 @@ msgstr "倉庫棚" #: lang/json/furniture_from_json.py msgid "" "A huge, sturdy steel shelf for storing pallets of crates in warehouses." -msgstr "" +msgstr "倉庫内に木製パレットを収納するための、巨大で頑丈なスチール製の棚です。" #: lang/json/furniture_from_json.py msgid "wooden keg" @@ -97484,7 +99743,7 @@ msgstr "ビア樽(木)" msgid "" "A large standing wooden barrel, completely watertight. Good for storing " "liquids of all kinds or fermenting alcohol." -msgstr "" +msgstr "完全防水加工が施された、大きな木製樽です。様々な液体の保管や酒類の発酵に適しています。" #: lang/json/furniture_from_json.py msgid "display case" @@ -97497,6 +99756,7 @@ msgid "" " Useful for storing valuable things while still showing them off. Not " "actually as secure as it looks, as the display windows are easily broken." msgstr "" +"腰の高さまである頑丈そうな木製のケースです。上部にはガラスが嵌っています。貴重品を展示しつつ保管するのに便利です。ガラスが割れやすいため、見た目ほど安全ではありません。" #: lang/json/furniture_from_json.py msgid "broken display case" @@ -97510,6 +99770,7 @@ msgid "" "if the glass hadn't been shattered. Careful not to cut yourself when " "looting." msgstr "" +"腰の高さまである頑丈そうな木製のケースです。上部にはガラスが嵌っています。貴重品を展示しつつ保管するのに便利でしたが、ガラスが粉々に割れてしまいました。略奪する際は、手を切らないように気を付けましょう。" #: lang/json/furniture_from_json.py msgid "standing tank" @@ -97519,7 +99780,7 @@ msgstr "スタンディングタンク" #: lang/json/furniture_from_json.py msgid "" "A huge metal tank that can be used to safely store large amounts of liquid." -msgstr "" +msgstr "大量の液体を安全に保管できる、巨大な金属製のタンクです。" #: lang/json/furniture_from_json.py msgid "dumpster" @@ -97532,6 +99793,7 @@ msgid "" "city's waste management any time soon. Despite the unpleasant nature of " "climbing inside, it could make for a viable hiding spot." msgstr "" +"市の不用品回収でもすぐには引き取ってもらえない可能性が高いごみを入れる、金属製の大型ごみ箱です。よじ登って中に入るのはあまり良い気分ではありませんが、隠れ場所として利用できるかもしれません。" #: lang/json/furniture_from_json.py msgid "butter churn" @@ -97542,7 +99804,7 @@ msgstr "バター撹拌機" msgid "" "A metal tube with a built-in mixer for making butter. Rather than needing " "electricity, it is pedal-driven, allowing use without power." -msgstr "" +msgstr "バターを攪拌するミキサーが付いた金属容器です。ペダル式のため、電力なしで動作します。" #: lang/json/furniture_from_json.py msgid "counter" @@ -98002,10 +100264,6 @@ msgstr "アーク炉です。コークスと石灰石を混ぜた粉末を入れ msgid "filled arc furnace" msgstr "アーク炉(装填済)" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "燻製ラック" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -98335,6 +100593,79 @@ msgid "" "temperature. You'll need to take it down first." msgstr "車両電源で稼働するように改造された冷凍庫です。まずはこの場から取り外す必要があります。" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "睡眠ポッド" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "内部の環境が調整された睡眠ポッドです。密集した都市環境でエネルギー消費を削減するための簡単な方法です。" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "冷凍睡眠ポッド" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "長期間の睡眠ポッドです。主に臓器移植の順番待ちをする患者や捜査を掻い潜りたい犯罪者が使用します。" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "CRISPRバイオラボ" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "アームと点滴器、ピペットが付いた箱型の装置です。大変動以前は遺伝子組み換え操作に使われていました。" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "3Dプリンター" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "試作品を手早い作成や大衆向けの娯楽用に使われていた、箱型の装置です。" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "神経網挿入装置" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" +"悪夢のような歯科医療機器と、正確な位置調整が可能なスライド付きソケットが組み合わさったような姿の装置です。手の届きにくい場所にデリケートなものを設置する必要がある際に便利です。" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "単分子ノコギリ" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" +"チーズカッター程のサイズの装置です。ワイヤーが一定方向に回転し、どれだけ角度を付けても原子レベルの精密な切断が可能です。未使用時にもワイヤーの周囲数cmが歪んで見えており、手の怪我を防ぎます。ワイヤーが切れない限り、この装置は分解できません。" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -98683,7 +101014,8 @@ msgstr "酸溜まりを発射する疑似アイテムです。" msgid "auto" msgstr "オート" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "ライフル" @@ -98706,8 +101038,7 @@ msgid "" msgstr "" "銃身が3つ連なった自家製の銃器です。.30-06口径弾を装填する銃身が1つあり、残り2つの銃身には散弾を装填します。二連ショットガンから取り外した部品とパイプから作られています。" -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "ショットガン" @@ -98855,7 +101186,8 @@ msgid "" msgstr "" "21世紀半ばに開発されたV29レーザーピストルをベースにして自作した銃器です。有り体に言えばダクトテープと電子部品の塊です。一般的なUPSで作動します。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "ハンドガン" @@ -98915,7 +101247,7 @@ msgid "" "deadly." msgstr "スクラップから自作した多工程の空圧式ライフルです。とても静かで高い殺傷力があります。" -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "セミオート" @@ -99347,9 +101679,9 @@ msgid "" msgstr "古風なデザインのAR-15を小型化した、自衛用に市販されている銃身約19cmの銃です。" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" -msgstr[0] "ライフル(.223口径/MAS 223)" +msgid "MAS .223" +msgid_plural "MAS .223" +msgstr[0] "ライフル(.223口径/MAS .223)" #: lang/json/gun_from_json.py msgid "" @@ -101610,14 +103942,14 @@ msgstr "" "Firearms社が開発したブローバック式セミオートピストルです。この企業は安価かつ嵩張って扱い辛い小型の銃を製造することで有名です。鋼鉄製に比べて壊れやすい鋳造亜鉛スライドが使われています。" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" -msgstr[0] "ハンドガン(9mm/CZ-75)" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" +msgstr[0] "ハンドガン(9mm/CZ75B)" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " @@ -101726,6 +104058,40 @@ msgid "" msgstr "" ".30-06口径の銃身と2つの散弾用滑腔銃身を併せ持った、中折式の複合銃です。かつて自己中心的なハンター達がアフリカで振り回していた銃を、自己中心的な子孫達がニューイングランドで振り回しています。" +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "ライフル(12.3ln/PA Md.68バトルライフル)" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" +"12.3ln弾を使う銃で最も人気だったのは、もちろんPA " +"md.71でしたが、その前身であるmd.68はある種の失敗作だという意見が多数ありました。信頼性と威力はあったものの、歩兵が持つ銃器としては重すぎて扱い辛かったことが理由です。しかしゾンビによる世界崩壊が訪れたことで、手に入りやすい弾薬を使う据え付けの銃として復活を遂げました。この銃は扱い辛さという懸念がはるかに少ないエクゾディに打って付けだったのです。" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "ライフル(12.3ln/PA Md.71ゾンビハント)" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" +"第三次カルパチア戦争で一躍有名になった人気の高いルーマニア製アサルトライフルを、狙撃兵器として機能するようにエクゾディが再設計したものです。優先度の高い標的を確実に撃ち抜きます。再設計によって、標的を粉々にして復活を防ぐための非常に高速な5連バースト射撃が可能になています。" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -101881,7 +104247,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "handmade lever shotgun" msgid_plural "handmade lever shotguns" -msgstr[0] "" +msgstr[0] "ショットガン(12ga/手製レバーアクション)" #: lang/json/gun_from_json.py msgid "" @@ -101889,6 +104255,7 @@ msgid "" "While still a primitive pipe and 2x4 design, it is a formiddable shotgun in " "it's own right with room for improvement." msgstr "" +"小型のチューブ型弾倉を内蔵した、銃身が短い自作のレバーアクション式ショットガンです。パイプと木材を組み合わせた原始的な作りですが改造も可能であり、手強いショットガンであることは間違いありません。" #: lang/json/gun_from_json.py msgid "Browning Auto 5" @@ -102221,6 +104588,17 @@ msgid "" msgstr "" "ウィンチェスター1897は、商業的に成功した最初のポンプアクションショットガンの一つです。その「トレンチ(塹壕)」向けの設計から、第一次世界大戦中はアメリカの理想を鮮やかに体現した象徴とされていました。放熱板と着剣装置、そして銃剣を備えたこの銃の外見は、間違いなく恐ろしいものです。掃討する塹壕は見当たらないので、ゾンビがはびこる街で活躍させましょう。" +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "ショットガン(簡易)" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "2本の太い鋼鉄製パイプ、エンドキャップ、釘を組み合わせて作った粗悪な散弾銃です。照準器がないため、近距離でしか使えません。" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -102865,6 +105243,33 @@ msgstr "レイセオン社のロボットの手元に内蔵されていた、強 msgid "trilaser" msgstr "三連レーザー" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "ショットガン(.40口径/スカルガン)" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "頭部と一体化した、.40口径単発銃です。" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -103722,20 +106127,6 @@ msgstr "頑丈で柔軟な木に凝った装飾が施された、魔法の力を msgid "Fake gun that fires barbed javelins." msgstr "棘付きジャベリンを発射する疑似アイテムです。" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "コンパウンドボウ(テスト)" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -105542,15 +107933,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "アイアンサイトを取り外し、マナクリスタルで作った光学式ブルードットサイトを搭載します。精度が向上し、重量が増加します。" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "魚の内臓を取り、切り身にしました。" @@ -105565,6 +107947,12 @@ msgid "" " experiment" msgstr "実験の失敗作の中から取り出せそうなCBMが残っていないか探りました。" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "肉と金属が混じった怪物から取り出せそうな部品が残っていないか探りました。" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -105578,8 +107966,34 @@ msgid "" msgstr "部位を乱雑に切り分け、特に目を引いた悪臭を放つ巨大な肉塊を取り出しました。" #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "巨大な昆虫をなんとか解体しました。" +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "巨大な昆虫を丹念に解体しました。" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" +"この生物に生えていたキチン質の毛のような素材を剥がすと、非常に小さな羽のような形をしていることが分かります。体内には、浮遊しているように見える泡のような塊があり、よく知るハチが持っている一般的な器官だとは思えません。" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" +"キチン質を剥がすと、血管で覆われた毛皮と皮膚の中間のような膜が見えます。体内には、浮遊しているように見える泡のような塊があり、よく知るハチが持っている一般的な器官だとは思えません。" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -105601,6 +108015,8 @@ msgid "" "apocalyptic world. You have survived the original onslaught, but the future" " looks pretty grim." msgstr "" +"Cataclysm: Dark Days " +"Aheadは、終末世界を舞台にしたターン制サバイバルゲームです。ひとまずは混乱の中を生き延びましたが、今後も状況は厳しさを増すでしょう。" #: lang/json/help_from_json.py msgid "" @@ -105623,6 +108039,8 @@ msgid "" "survival situation, and at least a dozen more from the eldritch and sci-fi " "nature of the Cataclysm itself." msgstr "" +"Cataclysm: Dark Days " +"Aheadが従来のローグライクゲームと異なる点はいくつかあります。レベルに応じて範囲が限定されたダンジョンを探索するのではなく、東西南北に無限に広がる世界を探索します。サバイバル要素をもつローグライクのため、食料の確保や水分補給、定期的な睡眠も必要です。リアリズムの原則に基づいているため、サバイバル生活で起こりうるあらゆる困難を予測しておくべきですが、大変動によってもたらされた超自然的・空想科学的な現象がもたらす困難はその比ではありません。" #: lang/json/help_from_json.py msgid "" @@ -105631,6 +108049,7 @@ msgid "" "Firearms, medications, and a wide variety of tools are all available to help" " you survive." msgstr "" +"Cataclysmは他のゲームよりも多くの作業を必要としますが、近未来が舞台なので、現代世界より簡単にこなせる作業もあります。銃器や薬物など、多種多様なアイテムが揃っており、文明崩壊後の世界を生き延びるのに役立ちます。" #: lang/json/help_from_json.py msgid ": Movement" @@ -107651,10 +110070,6 @@ msgstr "書く" msgid "Teleport yourself" msgstr "瞬間移動する" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "火を消す" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "体の濡れ/汚れを拭く" @@ -107905,7 +110320,7 @@ msgstr "このアイテムは火を起こせます。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can serve as a firewood." -msgstr "このアイテムは焚き木として利用できます。" +msgstr "このアイテムは焚物として利用できます。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -108053,6 +110468,13 @@ msgstr "このアイテムの着用時は慎重にバランスをとる必要が msgid "This item can be used to communicate with radio waves." msgstr "このアイテムは電波を使って通信します。" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "このアイテムは開錠自動成功させます。" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -108581,7 +111003,7 @@ msgstr "初期化/フィルタ" #: lang/json/keybinding_from_json.py msgid "Cycle display mode" -msgstr "表示モードの切替" +msgstr "循環切替/表示モード" #: lang/json/keybinding_from_json.py msgid "Show recipe result" @@ -108887,6 +111309,14 @@ msgstr "終了/キャラクター新規作成メニュー" msgid "Toggle sorting order" msgstr "切替/整列順序" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "ランダム職業" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "ランダムシナリオ" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "説明を上にスクロール" @@ -109287,6 +111717,10 @@ msgstr "アイテムを分解する" msgid "Sleep" msgstr "睡眠" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "運動" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "車両を運転する" @@ -109509,7 +111943,7 @@ msgstr "MOD確認" #: lang/json/keybinding_from_json.py msgid "Cycle move mode (run/walk/crouch)" -msgstr "切替/移動方法(駆足/歩行/屈む)" +msgstr "循環切替/移動モード(駆足/歩行/屈む)" #: lang/json/keybinding_from_json.py msgid "Reset Movement to Walk" @@ -109760,12 +112194,12 @@ msgstr "読込/色設定テンプレート" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "Yes" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "No" @@ -110066,7 +112500,7 @@ msgstr "複数の物資が投下されています。" #: lang/json/map_extra_from_json.py msgctxt "Map Extra" msgid "Military" -msgstr "軍隊式" +msgstr "兵士" #. ~ Description for {'str': 'Military', 'ctxt': 'Map Extra'} #: lang/json/map_extra_from_json.py @@ -110336,6 +112770,15 @@ msgstr "ゾンビトラップ" msgid "Zombie trap." msgstr "ゾンビを嵌めるための罠です。" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "葦原" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "水生植物が生えています。" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -111650,6 +114093,11 @@ msgid "" "years.'" msgstr "ウィートリー・ファミリー墓守サービス社です。ニューイングランドで300年の歴史があります。" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "DinoLab手術室制御端末" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "なし" @@ -111866,7 +114314,7 @@ msgstr "%sは乱闘の態勢を整えました。" #: lang/json/martial_art_from_json.py msgid "Enhanced Blocking" -msgstr "" +msgstr "強化ブロック" #. ~ Description of buff 'Enhanced Blocking' for martial art '{'str': #. 'Brawling'}' @@ -111876,6 +114324,9 @@ msgid "" "\n" "+1 Block attempts." msgstr "" +"戦闘訓練を重ね、一度に複数の攻撃をブロックできるようになりました。\n" +"\n" +"回避+1" #: lang/json/martial_art_from_json.py msgid "Capoeira" @@ -111937,6 +114388,25 @@ msgstr "" "「回転蹴り」「蹴り上げ」有効化\n" "3ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "カポエイラのステップ" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" +"見逃してはいけません。このダンスは、ここからクライマックスが始まるのです!\n" +"\n" +"打撃与ダメージ+15%\n" +"2ターン継続、最大蓄積数3" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "鶴形拳" @@ -112116,6 +114586,27 @@ msgstr "" "\n" "精度+2" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "エスクリマの連携技" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +"相手が隙を見せれば、より激しく攻めて会心の一撃を狙います。\n" +"\n" +"与ダメージボーナス+15%\n" +"「連携攻撃」有効化\n" +"3ターン継続、最大蓄積数3" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "フェンシング" @@ -112157,6 +114648,42 @@ msgstr "" "\n" "器用x50%のブロック時ダメージ軽減" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "受け流す" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" +"回避行動からすぐさま攻撃に移ることで、より命中しやすくなります。\n" +"\n" +"命中+1\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "ルミーズ" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"このフェイント攻撃は、強力な追い打ちを仕掛けるための完璧な布石です!\n" +"\n" +"命中+1\n" +"「複合攻撃」有効化\n" +"1ターン継続" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -112212,6 +114739,42 @@ msgstr "" "ブロック-2、回避スキル+1.0、筋力x50%のブロック時ダメージ軽減\n" "1ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "防御崩し" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"ブロックに成功することで、相手の防御の隙が見えます。\n" +"\n" +"命中+1\n" +"1ターン継続、最大蓄積数3" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "巧妙なフェイント" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" +"敵は見事に騙されました!\n" +"\n" +"「引き倒し」有効化\n" +"1ターン継続" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "柔道" @@ -112487,6 +115050,38 @@ msgstr "" "\n" "回避+1、筋力x50%のブロック時ダメージ軽減" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "身かわし" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"攻撃を回避しました。敵の懐はがら空きです。反撃を仕掛けましょう!\n" +"「下段攻撃」「致命の一撃」有効化\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "必殺攻撃" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"強力な攻撃によって、この戦いを今すぐ終わらせるチャンスが訪れました!\n" +"「危険な一撃」有効化\n" +"1ターン継続" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "ムエタイ" @@ -112529,6 +115124,25 @@ msgstr "" "\n" "筋力x50%のブロック時ダメージ軽減" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "決意" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" +"攻撃を受けても動きは鈍りません。相手を長期戦に巻き込み勝利しましょう。\n" +"\n" +"筋力x25%の打撃与ダメージ上昇、筋力x50%のブロック時ダメージ軽減\n" +"5ターン継続" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "忍術" @@ -112606,6 +115220,42 @@ msgstr "" "%の命中精度上昇\n" "1ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "不意打ち失敗" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" +"バレてしまいました!再び不意打ちを仕掛けるには少し待つ必要があります。\n" +"\n" +"全与ダメージ-50%\n" +"3ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "撤退" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" +"敵を倒しました。次の行動計画を練りましょう。\n" +"\n" +"回避+2、移動速度+10\n" +"3ターン継続" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "二天一流" @@ -112697,6 +115347,51 @@ msgstr "" "「一寸の見切り」有効化\n" "1ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "朽葉" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"業物も\n" +"砥がねば錆びる\n" +"常に砥げ\n" +"\n" +"回避スキル-1.0、打撃与ダメージ-1、斬撃与ダメージ-1\n" +"1ターン継続、最大蓄積数5" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "静寂" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" +"嵐の目\n" +"束の間の凪\n" +"疾く過ぎぬ\n" +"\n" +"命中+2、感覚x50%の回避スキル上昇\n" +"2ターン継続" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "パンクラチオン" @@ -112869,6 +115564,25 @@ msgstr "" "器用ではなく感覚によって命中精度が上昇します。\n" "感覚x25%の命中精度上昇、器用x25%の命中精度低下" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "とぐろ巻き" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"ヘビは攻撃を仕掛ける絶好の瞬間をじっと待ちます。敵が気を許した隙を突き、弱点を容赦なく攻めましょう!\n" +"\n" +"命中+1、感覚x50%の貫通力上昇\n" +"1ターン継続、最大蓄積数3" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "槍術" @@ -113046,6 +115760,26 @@ msgstr "" "感覚x20%の命中精度上昇、感覚x50%の打撃装甲貫通。\n" "2ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "十字手" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" +"時間をかけて準備を整えることで、全身をフルに使った攻防が可能になります。\n" +"\n" +"回避スキル+1.0、感覚x50%のブロック時ダメージ軽減\n" +"「掌打」「双掌打」有効化\n" +"3ターン継続" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "虎形拳" @@ -113108,6 +115842,25 @@ msgstr "" "\n" "筋力x25%の命中精度上昇、器用x25%の命中精度低下" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "虎の猛攻" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" +"敵が途方に暮れたらこっちのものです。次に繰り出す攻撃は装甲を貫通します。\n" +"\n" +"筋力x50%の貫通力上昇\n" +"1ターン継続、最大蓄積数2" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "詠春拳" @@ -113169,6 +115922,24 @@ msgstr "" "\n" "感覚x15% の回避スキル上昇、感覚x50%のブロック時ダメージ軽減" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "標指" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" +"指を突き出す動きを多用する型を完璧に学べば、敵の弱点を的確に狙って撃退できるようになります!\n" +"\n" +"感覚x20%の命中精度上昇、「正拳突き(吹き飛ばし)」「横拳(吹き飛ばし)」有効化\n" +"2ターン継続" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "酔拳" @@ -113298,6 +116069,34 @@ msgid "" "armor, +Perception fire armor." msgstr "筋力の値で斬撃耐性、器用の値で酸耐性、知性の値で電撃耐性、感覚の値で火炎耐性が増加します。" +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "激怒" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "どう料理してやりましょうか... 打撃与ダメージ+2、2ターン継続、最大蓄積数5" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "雷撃" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "2度の雷撃を繰り出します。感覚依存で電撃与ダメージ上昇、3ターン継続、最大蓄積数2" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "燃えています!火炎与ダメージ上昇、5ターン継続" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "サイボーグ格闘術" @@ -113343,6 +116142,28 @@ msgstr "" "\n" "ブロック+2、命中精度+1" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "最適化" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"命中+1、全与ダメージ+2\n" +"3ターン継続、最大蓄積数3" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "蜈蚣功" @@ -113385,6 +116206,25 @@ msgstr "" "行動コスト-4\n" "3ターン継続、最大蓄積数4" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "百足の毒" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" +"最高のタイミングで毒が敵を蝕みます。\n" +"\n" +"\n" +"打撃与ダメージ+2\n" +"2ターン継続" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "壁虎功" @@ -113525,6 +116365,24 @@ msgstr "" "「鋏撃」有効化\n" "2ターン継続、最大蓄積数2" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "蠍の威嚇" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" +"怒ったサソリほど恐ろしいものはありません。攻撃中はだれも近寄れません。\n" +"\n" +"回避+1\n" +"1ターン継続" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "蛤蟆功" @@ -113584,6 +116442,42 @@ msgstr "" "打撃/斬撃/刺突耐性-1\n" "6ターン継続、最大蓄積数6" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "蝦蟇の瞑想" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" +"瞬間的に集中することで、皮膚を鉄のように硬くします。\n" +"\n" +"打撃/斬撃/刺突耐性+3\n" +"2ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "蝦蟇の毒" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" +"この毒によって、鉄の皮膚以外にも強みがあることを見せつけましょう。\n" +"\n" +"打撃与ダメージ+2\n" +"5ターン継続" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "蛇功" @@ -113833,7 +116727,7 @@ msgstr "弱点を常に意識しておくことで優位性を保ちます。器 #: lang/json/martial_art_from_json.py msgid "Desert Wind" -msgstr "" +msgstr "砂漠の旋風" #. ~ Description for martial art '{'str': 'Desert Wind'}' #: lang/json/martial_art_from_json.py @@ -113843,22 +116737,23 @@ msgid "" "many Desert Wind maneuvers are in fact carefully honed gestures that evoke " "the power of fire, if performed correctly and with the proper focus." msgstr "" +"「砂漠の旋風」の戦闘技術は、素早い動きと旋回運動、炎のように強烈な攻撃に重点を置いています。複雑な回転と曲がりくねった軌道を組み合わせた斬撃は砂漠の旋風の技の多くに取り入れられていますが、集中して正しく実行すれば炎の力を引き出せる緻密で重要な動作です。" #. ~ initiate message for martial art '{'str': 'Desert Wind'}' #: lang/json/martial_art_from_json.py msgid "" "You feel a wave of heat wash over you as you assume a running combat stance." -msgstr "" +msgstr "走りながら戦闘態勢を整えると、熱波が全身を包みました。" #. ~ initiate message for martial art '{'str': 'Desert Wind'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s assumes into a running combat stance." -msgstr "" +msgstr "%sは走りながら戦闘態勢を整えました。" #: lang/json/martial_art_from_json.py msgid "Wind Stride" -msgstr "" +msgstr "旋風の歩み" #. ~ Description of buff 'Wind Stride' for martial art '{'str': 'Desert #. Wind'}' @@ -113869,10 +116764,14 @@ msgid "" "+1.0 Dodging skill.\n" "Lasts 1 turn." msgstr "" +"熱をもった風が周囲で渦巻き、素早く移動できるようになります。\n" +"\n" +"回避スキル+1.0\n" +"1ターン継続" #: lang/json/martial_art_from_json.py msgid "Zephyr Dance" -msgstr "" +msgstr "軟風の舞" #. ~ Description of buff 'Zephyr Dance' for martial art '{'str': 'Desert #. Wind'}' @@ -113883,10 +116782,14 @@ msgid "" "+1.0 Dodging skill, +1 Dodge attempt\n" "Lasts 1 turn." msgstr "" +"砂漠を撫でるそよ風のように優雅に回転し、攻撃を回避します。\n" +"\n" +"回避スキル+1.0、回避+1\n" +"1ターン継続" #: lang/json/martial_art_from_json.py msgid "Diamond Mind" -msgstr "" +msgstr "金剛石の心" #. ~ Description for martial art '{'str': 'Diamond Mind'}' #: lang/json/martial_art_from_json.py @@ -113898,21 +116801,22 @@ msgid "" "concept of the mind as the battleground. An enemy defeated in his mind must" " inevitably." msgstr "" +"真の速さは身体ではなく、心に宿る。金剛石の心を学ぶ者はこの認識を心に刻み、他者が知覚できない程の短時間で思考を変えられるように訓練します。思考と動作を高速化する力の正体は、脳内イメージを戦場に変えるという概念です。イメージの中で敗北した敵は、現実でも必然的に同じ道を辿ります。" #. ~ initiate message for martial art '{'str': 'Diamond Mind'}' #: lang/json/martial_art_from_json.py msgid "You concentrate and become very still for a moment." -msgstr "" +msgstr "集中力を高め、一瞬、しんと静まり返りました。" #. ~ initiate message for martial art '{'str': 'Diamond Mind'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s becomes very still for a moment." -msgstr "" +msgstr "%sは一瞬、しんと静まり返りました。" #: lang/json/martial_art_from_json.py msgid "Stance of Alacrity" -msgstr "" +msgstr "躍動の構え" #. ~ Description of buff 'Stance of Alacrity' for martial art '{'str': #. 'Diamond Mind'}' @@ -113923,10 +116827,13 @@ msgid "" "\n" "-10% move cost" msgstr "" +"自信と激情、明晰な心を共に高めることで、通常よりも少し速く動きます。一回の効果はわずかですが、移動する度に効果が加算されます。\n" +"\n" +"行動コスト-10%" #: lang/json/martial_art_from_json.py msgid "Pearl of Black Doubt" -msgstr "" +msgstr "疑心の黒真珠" #. ~ Description of buff 'Pearl of Black Doubt' for martial art '{'str': #. 'Diamond Mind'}' @@ -113937,10 +116844,50 @@ msgid "" "+1 Dodge attempt\n" "Lasts 1 turn. Stacks 2 times" msgstr "" +"敵が攻撃を外す度に、まるで無力な牡蠣の体内で成長する黒真珠のように疑念が増幅され、どんどん攻撃が命中しなくなります。\n" +"\n" +"回避+1\n" +"1ターン継続、最大蓄積数2" #: lang/json/martial_art_from_json.py -msgid "Hylian Swordsmanship" +msgid "Quicksilver Motion" +msgstr "水銀の構え" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" +"目にも留まらぬ速度で動きます。スピード、反射神経、そして無限の自信を身に着けることで、素早く大胆な動きによって敵を休ませません。\n" +"\n" +"速度+50\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "肉体を超越する精神" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" msgstr "" +"鍛錬と不屈の精神によって、集中力を高めることで物理的な脅威を克服します。\n" +"\n" +"命中+1\n" +"1ターン継続、最大蓄積数2" + +#: lang/json/martial_art_from_json.py +msgid "Hylian Swordsmanship" +msgstr "ハイリア剣術" #. ~ Description for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py @@ -113950,21 +116897,22 @@ msgid "" "defense by using spins, jumps, and flips to confuse enemies and strike from " "unexpected angles." msgstr "" +"時代を超えて様々な伝説の英雄たちに受け継がれてきた、貴重な戦闘形態です。スピン、ジャンプ、宙返りを繰り出して敵を混乱させ、機動力を利用して予想外の角度から攻撃することで攻防を有利に進めます。" #. ~ initiate message for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py msgid "You begin to step lightly from side to side." -msgstr "" +msgstr "横に軽くステップを踏み始めました。" #. ~ initiate message for martial art '{'str': 'Hylian Swordsmanship'}' #: lang/json/martial_art_from_json.py #, python-format msgid "%s begins to step lightly from side to side." -msgstr "" +msgstr "%sは横に軽くステップを踏み始めました。" #: lang/json/martial_art_from_json.py msgid "Combat Acrobat" -msgstr "" +msgstr "アクロバット(序位)" #. ~ Description of buff 'Combat Acrobat' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -113974,10 +116922,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"常に軽やかに飛び回ります。打たれそうなら避ければいいのです。\n" +"\n" +"回避スキル+1.0" #: lang/json/martial_art_from_json.py msgid "Intermediate Combat Acrobat" -msgstr "" +msgstr "アクロバット(中位)" #. ~ Description of buff 'Intermediate Combat Acrobat' for martial art #. '{'str': 'Hylian Swordsmanship'}' @@ -113987,10 +116938,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"訓練を重ね、戦闘時の動きが更に軽快になっています。\n" +"\n" +"回避スキル+1.0" #: lang/json/martial_art_from_json.py msgid "Master Combat Acrobat" -msgstr "" +msgstr "アクロバット(極位)" #. ~ Description of buff 'Master Combat Acrobat' for martial art '{'str': #. 'Hylian Swordsmanship'}' @@ -114000,10 +116954,13 @@ msgid "" "\n" "+1.0 Dodging skill." msgstr "" +"数多の戦闘経験を経て、一流の回避技術を身に着けました!\n" +"\n" +"回避スキル+1.0" #: lang/json/martial_art_from_json.py msgid "Dash Attack" -msgstr "" +msgstr "ダッシュ攻撃" #. ~ Description of buff 'Dash Attack' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -114015,10 +116972,14 @@ msgid "" "+10% damage.\n" "Lasts 1 turn. Stacks 3 times." msgstr "" +"瞬発力を利用して敵に強力な攻撃を叩き込みます。\n" +"\n" +"与ダメージ+10%\n" +"1ターン継続、最大蓄積数3" #: lang/json/martial_art_from_json.py msgid "Flurry Rush" -msgstr "" +msgstr "ラッシュ攻撃" #. ~ Description of buff 'Flurry Rush' for martial art '{'str': 'Hylian #. Swordsmanship'}' @@ -114030,6 +116991,55 @@ msgid "" "-25% move cost.\n" "Lasts 1 turn." msgstr "" +"攻撃を完璧にかわした際に、すぐさま反撃に転じます。\n" +"\n" +"行動コスト-25%\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "突進" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"回転しながら強烈な斬撃を放つために、ある程度勢いをつけます。\n" +"\n" +"全与ダメージ+20%、「回転斬り」有効化\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "鋼の心" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" +"剣の扱いを完璧にマスターすることが「鋼の心」の目標です。絶え間ない練習と研究によって、鋼の心の修練者は手にした武器で超人的な技を放ちます。鋼の心の動きは驚異的な武術の実戦であり、目を眩ませ、混乱させ、最終的に抵抗させず殺すという一定のパターンをなぞります。" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "恐怖を排して背筋を伸ばしました。" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "%sは大胆不敵な構えをとりました。" #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" @@ -114090,6 +117100,468 @@ msgstr "" "打撃装甲貫通+3\n" "2ターン継続" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "ポッ拳" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" +"ポッ拳あるいは「ポケット・フィスト」は、有名なテレビゲーム「ポケモン」シリーズから発展した、奇妙な格闘技です。熱心なファン達は努力を重ね、様々なポケモンの動きとボクシングや空手などの既存の格闘技を組み合わせることに成功しました。驚くべきことに、この格闘術は実戦的であり、非常に効果的だという人もいます。" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "バトルの準備を整えました。" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "%sはバトルを挑む準備を整えました。" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "持久力" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" +"攻撃を受けると防御力が上昇します。\n" +"\n" +"筋力x50%の打撃/斬撃/刺突耐性上昇\n" +"3ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "スナイパー" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" +"会心攻撃が命中すると攻撃力が上昇します。\n" +"\n" +"与ダメージ+50%\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "自信過剰" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" +"敵を倒すと攻撃力が上昇します。\n" +"\n" +"与ダメージ+50%\n" +"3ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "落陽" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" +"「落陽」の技術は、敵の力を敵に返すことに重点を置いています。構えを素早く変えて慎重に攻撃を仕掛け、突っ込んできた敵の力を別の方向にずらしてかわします。" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "重心をずらし、自身を守る準備を整えました。" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "%sは重心をずらし、今までと異なる構えをとりました。" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "奇妙な構え" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"わざと不用意に動いて適当に構え、敵を混乱させてその隙に投げ技を仕掛けます。\n" +"\n" +"知性x20%の回避スキル上昇、「全力投げ」「巨砲投げ」有効化\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "偽装降伏" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" +"意図的に防御態勢を解くことで相手を油断させて、不意打ちを狙います。\n" +"\n" +"速度+20\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "シャイ=チョー" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" +"シャイ=チョー、別名「サルラック戦法」は、ジェダイの武器が金属剣からライトセーバーへ移行する時期に開発された、ライトセーバーを用いる初の戦闘技術です。全てのジェダイが武器をもった戦闘の基本を理解するために学ぶ、訓練用のフォームとされています。集団戦を得意としていますが、他の戦法と比べると攻撃力に欠けています。" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "片足を一歩後ろに下げ、武器を利き手側に立てて構えました。" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "%sは片足を一歩後ろに下げ、武器を立てて構えました。" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" +"戦士としての決意を高めました。澄みきった心は攻撃と防御の要です。\n" +"\n" +"筋力x100%のブロック時ダメージ軽減、命中精度+1" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "見習いの訓練" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"シャイ=チョーを使った訓練によって、複数の敵との戦い方を学びます。\n" +"\n" +"ブロック+1、ブロック効果+1" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "騎士の訓練" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"シャイ=チョーを使った更なる訓練によって、複数の敵との戦闘技術を向上させます。\n" +"\n" +"ブロック+1、ブロック効果+1" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "マスターの訓練" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"シャイ=チョーをマスターしました。集団戦闘では誰にも負けません。\n" +"\n" +"ブロック+1、ブロック効果+1" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "岩竜" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" +"強さ、筋力、持久力に重きを置く戦術です。この教えを学べば、武術に長けた者なら一撃で鋼鉄を砕くことすら可能になります。防御面では石がもっている恒久性に着目し、攻撃を逸らすことに焦点を当てています。" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "踵で地面をしっかりと踏みしめ、体勢を安定させました。" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "%sは踵で地面をしっかりと踏みしめました。" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "岩の骨" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"精神を集中して防御力を高め、武器が敵に当たったときの衝撃を利用してカウンターに備えました。\n" +"\n" +"打撃/斬撃/刺突耐性+1\n" +"1ターン継続、最大蓄積数5" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "岩足の構え" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" +"しゃがみこんで地面を足で踏みしめ、力を溜める構えです。ただし、動き過ぎると体勢が崩れてしまいます。\n" +"\n" +"与ダメージ+10%、打撃/斬撃/刺突耐性+2" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "ヒビ割れた岩" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" +"動き過ぎると岩足の構えの効果が薄れてしまいます。姿勢を崩さないように、じっとしていましょう。\n" +"\n" +"「崩れた岩」有効化\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "崩れた岩" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" +"適切な体勢を維持できていません。構え直すためにしばらくその場でじっとしている必要があります。\n" +"\n" +"与ダメージ-10%、打撃/斬撃/刺突耐性-2\n" +"4ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "鉄の骨" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" +"攻撃が命中すると瞑想状態になり、ダメージをほとんど受けなくなります。\n" +"\n" +"打撃/斬撃/刺突耐性+5\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "虎の爪" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" +"虎の爪の規律は、その者の心の奥底に潜む猛烈な怒りを受け入れることを目指しています。実戦では虎の爪の戦士は野生動物のように唸り、蛮族のような毛皮をまとって戦い、敵を倒すために圧倒的かつ悪質な攻撃を繰り出します。" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "低い唸り声を発し、戦いに備えました。" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "%sは野生動物のように屈みこみました。" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "強化会心攻撃" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" +"どんな時も全力で攻撃します。死にたくないのなら、この衝動を押し込めてはいけません。\n" +"\n" +"会心発生+5%" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "先制パンチ" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" +"野獣のような雄たけびをあげて戦いに身を投じます。鋭い先制攻撃を繰り出します。\n" +"\n" +"命中+2、与ダメージ+10%\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "手負いの獣" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" +"追いつめられた動物は恐ろしく危険です。今の状況はまさにそれです。\n" +"\n" +"行動コスト-20%\n" +"1ターン継続" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "血潮の香り" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" +"血の香りを嗅いで精神が駆り立てられました。もっと欲しい。今すぐ欲しい!\n" +"\n" +"命中+1、与ダメージ+15%\n" +"1ターン継続、最大蓄積数2" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "弱肉強食" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" +"草食動物の群れの中に放たれた猛獣のように、弱い相手を次々に切り裂きます。\n" +"\n" +"速度+30\n" +"2ターン継続、最大蓄積数2" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "アルコール" @@ -114558,23 +118030,23 @@ msgstr "傷跡の付いた" #: lang/json/material_from_json.py msgid "Prismetallic Blend" -msgstr "" +msgstr "プリズメタル" #: lang/json/material_from_json.py msgid "Chromogenic Weave" -msgstr "" +msgstr "クロモジェニック繊維" #: lang/json/material_from_json.py msgid "Collagenic Polymer" -msgstr "" +msgstr "高分子コラーゲン" #: lang/json/material_from_json.py msgid "Emulsified Hydrogel" -msgstr "" +msgstr "乳化ハイドロゲル" #: lang/json/material_from_json.py -msgid "pupled" -msgstr "" +msgid "pulped" +msgstr "ドロドロの" #: lang/json/material_from_json.py msgid "Arcane Skin" @@ -114604,7 +118076,7 @@ msgstr "ブリジット・ラクロワのために骨を集めましょう。8 msgid "There is always work to be done, song to be woven." msgstr "どこにでもやるべき仕事があり、作られるべき歌がある。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -114613,16 +118085,16 @@ msgid "" msgstr "" "悟りへの道を歩むなら、まず歌に耳を傾け学びなさい。旅立ち、生き物を解体し、指先で力を感じ取りなさい。そして骨を持って来なさい。彫刻を作ってあげよう。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "素晴らしい。さあ取り掛かるのだ。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "気が進まないことは理解できる。道を見出したらまた来なさい。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -115852,7 +119324,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "じゃあ、また会おう...もし二度と会えなかったら、私は正しい決断をしたってことだな。" #: lang/json/mission_def_from_json.py @@ -115861,7 +119333,7 @@ msgid "" msgstr "死ぬな。アドバイスを求めるなんて、順調な滑り出しとは言えないな。" #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." +msgid "Well, you're not dead… yet." msgstr "おや、生きてるみたいだな…今の所は。" #: lang/json/mission_def_from_json.py @@ -116298,7 +119770,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "息子を見つけたら、私たちの所へ戻ってくるよう伝えてほしいんだ。" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "ありがとう。" @@ -116592,9 +120064,9 @@ msgstr "物資を探すのを手伝ってくれると助かるんだけど。" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." -msgstr "ガラス瓶を使って農作物を保存したいんだ。3Lのガラス瓶を20個持ってきてもらえないか?報酬としてジャムをあげよう。" +msgstr "ガラス瓶を使って農作物を保存したいんだ。3Lのガラス瓶を10個持ってきてもらえないか?報酬としてジャムをあげよう。" #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve foods while we can." @@ -118378,6 +121850,88 @@ msgstr "ええ、もちろん。" msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "何もないじゃないか。自分で金を探すことにするよ。" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "ノイズを消し去る" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "ハブ01の電波塔を調査して電波への干渉源を見つけ出し、問題を解決しましょう。" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" +"先日、近くにあるタワーに無線送信機を設置したんだが、ついさっき機能しなくなってしまったんだ。原因を調査する手伝いをしてくれたら、非常にありがたいな。" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "よし、さっそく現場へ向かおう。もちろん、来てくれるよな?" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "そうか、話を聞いてくれただけでも嬉しいよ。" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "一度現場へ行ってみないと原因は分からないだろうな。いずれにせよ、発砲準備はしておこう。" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "原因を取り除けたか?" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "確かにそうみたいだ。ハブに戻ろう。" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "ああ、そりゃどうも。" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "ハブ01へ戻る" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "ハブ01へ戻りましょう。" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "ハブへ戻ろう。" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "ええと..." + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "マップがあるだろ?私も持ってるが、自分で見た方が早い。" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "まだか?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "手伝ってくれてありがとう。一つ借りができたな。" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "道に迷いでもしたのか?" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "まさか迷子になるなんて..." + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "2個の蒸留器を作る" @@ -119667,6 +123221,56 @@ msgstr "この素晴らしい部品をどう改造しようか。" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "用意してもらえないと、フランケンシュタイン博士になれないじゃないか。" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "ボー・バロニクスのために肉塊を集めましょう。8個必要です。" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "捕食者たちは腹を空かせてる。肉が必要だ。" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" +"捕食者の餌を用意してくれたら、礼をしよう。屋外で、まともな動物を解体してくれ。まともじゃない動物はダメだ。問題なく食べられる物を頼むよ。肉塊を持ってきてもらえれば、捕食者たちの世話ができる。" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "素晴らしい。これで捕食者たちに飯を用意できる。" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "分かった。偉大なる捕食者はいつも腹を空かせているよ。" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" +"ここ数日、動物たちは何かの影響を受けてより大きく危険になっている。肉も汚染された変異肉になってしまった。捕食者たちの健康に悪いから、本物の肉を用意してくれ。" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "肉塊を持ってきたのか?" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "これで捕食者たちに飯を用意できる。" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "捕食者が食べてくれると良いのだが。" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "肉塊が見当たらないようだが。森や沼には捕食者に食べられるのを待っている肉たちがいるはずだ。" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "呪文書を見つける" @@ -120360,12 +123964,12 @@ msgstr "意欲デバッグ" #. ~ Move mode name #: lang/json/move_modes_from_json.py msgid "walk" -msgstr "" +msgstr "歩行" #. ~ Move mode character in move mode menu #: lang/json/move_modes_from_json.py msgid "w" -msgstr "" +msgstr "歩" #. ~ movement-type #: lang/json/move_modes_from_json.py src/advanced_inv.cpp src/weather.cpp @@ -120390,12 +123994,12 @@ msgstr "メックの脚部出力を少し上げました。" #. ~ Move mode name #: lang/json/move_modes_from_json.py msgid "run" -msgstr "" +msgstr "駆足" #. ~ Move mode character in move mode menu #: lang/json/move_modes_from_json.py msgid "r" -msgstr "" +msgstr "走" #. ~ movement-type #: lang/json/move_modes_from_json.py @@ -120430,22 +124034,22 @@ msgstr "動物が疲れているため速度を上げられません。" #. ~ Failure to switch to this move mode, mech steed #: lang/json/move_modes_from_json.py msgid "Your mech's leg servos are unable to operate faster." -msgstr "" +msgstr "サーボモーターが付いた機械の脚は速く動きません。" #. ~ Move mode name #: lang/json/move_modes_from_json.py msgid "crouch" -msgstr "" +msgstr "屈む" #. ~ Move mode character in move mode menu #: lang/json/move_modes_from_json.py msgid "c" -msgstr "c" +msgstr "屈" #. ~ movement-type #: lang/json/move_modes_from_json.py msgid "C" -msgstr "C" +msgstr "屈" #. ~ Successfully switch to this move mode, no steed #: lang/json/move_modes_from_json.py @@ -121985,6 +125589,23 @@ msgid "" "footing." msgstr "より速く移動できます。平らな場所での移動時は行動コストに15%のボーナスを得ます。" +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "反射性発光器官" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "頭部から発光器官が生えています。意識的にはコントロールできず、感情や身体の状況に応じて光ります。" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "反射性発光器官(オン)" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "弱い発光器官" @@ -121997,15 +125618,52 @@ msgid "" "mating season." msgstr "頭部から発光器官が伸び、弱々しい光を放っています。暗闇でも目立ち、交尾の時期にパートナーを引き寄せるのに便利です。" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "弱い発光器官(オン)" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "発光器官がほのかに光っています。" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "発光器官" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." msgstr "発光器官が眩い光を放っています。" +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "発光器官(オン)" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "発光器官が明るく光っています。" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "普通の人間" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "何も問題がない、普通の人間です。心配する必要はありません。" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "凶暴な怪物" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." +msgstr "怒りによって心が曇り、まともな思考ができなくなりますが、強くなった気がします。" + #: lang/json/mutation_from_json.py msgid "Good Hearing" msgstr "優れた聴覚" @@ -122099,10 +125757,12 @@ msgstr "高速治癒" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." -msgstr "睡眠時のHP回復速度が速くなり、起きている時ですら徐々にHPが回復します。" +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." +msgstr "傷が普通より早く治ります。睡眠時は通常より50%、起きている間は通常より20%早くHPが回復します。骨折した手足も2倍の速さで治ります。" #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -122241,7 +125901,7 @@ msgstr "整理上手" msgid "" "You pack things very efficiently! You can retrieve things from containers " "10% faster." -msgstr "" +msgstr "荷物を効率的に整頓できます。容器内からアイテムを拾得する速度が10%上昇します。" #: lang/json/mutation_from_json.py msgid "Strong Back" @@ -122585,7 +126245,7 @@ msgstr "武術鍛錬" msgid "" "You have received some martial arts training at a local dojo. You start " "with your choice of Karate, Judo, Aikido, Tai Chi, Taekwondo, or Pankration." -msgstr "道場で格闘術の教えを受けてきました。空手、柔道、合気道、太極拳、テコンドー、パンクラチオンの内1つを修得した状態で始まります。" +msgstr "道場で格闘術の教えを受けてきました。空手、柔道、合気道、太極拳、テコンドー、パンクラチオンのいずれかを選択して開始します。" #: lang/json/mutation_from_json.py msgid "Self-Defense Classes" @@ -122597,7 +126257,7 @@ msgid "" "You have taken some self-defense classes at a nearby gym. You start with " "your choice of Capoeira, Krav Maga, Muay Thai, Ninjutsu, Wing Chun, or Zui " "Quan." -msgstr "近所のジムで護身術を習っていました。カポエイラ、クラヴマガ、ムエタイ、忍術、詠春拳、酔拳のうち1つを修得しています。" +msgstr "近所のジムで護身術を習っていました。カポエイラ、クラヴマガ、ムエタイ、忍術、詠春拳、酔拳のいずれかを選択して開始します。" #: lang/json/mutation_from_json.py msgid "Shaolin Adept" @@ -122621,7 +126281,7 @@ msgid "" "Eskrima, Fencing, Fior Di Battaglia, Medieval Swordsmanship, Niten Ichi-Ryu," " Pentjak Silat, or Sōjutsu." msgstr "" -"武器を使った戦闘術を鍛錬してきました。開始時からエスクリマ、フェンシング、西洋長柄武器術、中世剣術、二天一流、プンチャック・シラット、槍術のうち1つを習得しています。" +"武器を使った戦闘術を鍛錬してきました。開始時からエスクリマ、フェンシング、西洋長柄武器術、中世剣術、二天一流、プンチャック・シラット、槍術のいずれかを選択して開始します。" #: lang/json/mutation_from_json.py msgid "Competitive Fencer" @@ -122736,8 +126396,11 @@ msgstr "低速治癒" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." -msgstr "傷の治りが遅くなります。睡眠時の体力回復量が減少します。" +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." +msgstr "傷の治りが普通より遅くなります。睡眠中のHP回復速度はもちろん、骨折した手足の回復速度も通常の75%です。" #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -122745,10 +126408,11 @@ msgstr "治癒力不足" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." -msgstr "睡眠中の回復力が大きく損なわれており、通常HPの1/3までしかHPが自然回復しません。" +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." +msgstr "回復力が著しく損なわれています。睡眠中のHP回復速度はもちろん、骨折した手足の回復速度も通常の33%です。" #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -122756,10 +126420,11 @@ msgstr "治癒力欠乏" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." -msgstr "睡眠中の回復力が大きく損なわれており、通常HPの1/10までしかHPが自然回復しません。" +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." +msgstr "回復力は無いに等しく、死の危険性が付きまといます。睡眠中のHP回復速度はもちろん、骨折した手足の回復速度も通常の10%です。" #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -122835,7 +126500,7 @@ msgstr "整頓下手" msgid "" "You are terrible at organizing and storing your possessions. You retrieve " "things from containers 10% slower." -msgstr "" +msgstr "持ち物を整理整頓するのが苦手です。容器内からアイテムを拾得する速度が10%低下します。" #: lang/json/mutation_from_json.py msgid "Illiterate" @@ -123474,10 +127139,12 @@ msgstr "超高速治癒" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." -msgstr "身体が緩やかに治癒していきます。寝ていない時にもHPを回復します。" +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." +msgstr "" +"傷が普通より非常に早く治ります。睡眠時は通常より50%、起きている間は通常より60%早くHPが回復します。骨折した手足も4倍の速さで治ります。" #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -123485,8 +127152,13 @@ msgstr "再生力" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "身体が信じられない速度で傷を再生します。" +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" +"傷が信じられないほど早く治ります。睡眠時は通常より150%、起きている間は通常より200%早くHPが回復します。骨折した手足も16倍の速さで治ります。" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -123494,8 +127166,10 @@ msgstr "爬虫類の治癒力" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "手足が致命的な傷を負ってしまっても、特に困難を伴わずに自分自身の治癒力で回復します。" +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "手足が骨折しても自力で治るため、大した問題になりません。骨折した部位に添え木を着用する必要がなく、通常の20倍の速度で回復します。" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -126964,8 +130638,7 @@ msgstr "クモ" msgid "Well, maybe you'll just have to make your own world wide web." msgstr "あなただけのワールド・ワイド・ウェブを構築しましょうか。" -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "サバイバー" @@ -127281,10 +130954,6 @@ msgid "" msgstr "" "真のフードパーソンです。ただのマスコットだと思っている人もいますが、実は違います。自分自身がフードパーソンです。マスクが顔そのものです。この世界と無意識の中間に立つ唯一の存在です。" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "医療関係者" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -127531,7 +131200,7 @@ msgstr "「恐縮だが」、バグに用心しておいてくれないか?" #: lang/json/mutation_from_json.py msgid "Debug Very Strong Back" -msgstr "" +msgstr "丈夫な足腰(デバッグ専用)" #. ~ Description for {'str': 'Debug Very Strong Back'} #: lang/json/mutation_from_json.py @@ -127655,19 +131324,38 @@ msgstr "個人的な好みなのか子供時代のトラウマなのか不明で #: lang/json/mutation_from_json.py msgid "Fast Reflexes" -msgstr "" +msgstr "高反射神経" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." -msgstr "" - -#: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "サバイバーストーリー" - -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." +msgstr "反射神経が高く、攻撃や拘束をより簡単に回避できます。" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Confused 1" +msgstr "生存者: 混乱1" + +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -127675,6 +131363,86 @@ msgstr "サバイバーストーリー" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "このNPCはどうやって大変動から生き残ったのか語ります。" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "生存者: 過去抹消1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "生存者: 過去抹消2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "生存者: 過去抹消3" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "生存者: 過去抹消4" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "生存者: 過去抹消5" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "生存者: 信仰1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "生存者: 信仰2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "生存者: 空想家1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "生存者: 結婚式1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "生存者: 避難者1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "生存者: 避難者2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "生存者: 避難者3" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "生存者: 避難者4" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "生存者: 避難者5" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "生存者: 避難者6" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "生存者: FEMA避難者1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "生存者: 見殺し1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "生存者: 見殺し2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "生存者: 見殺し2" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "サバイバーストーリー" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "占骨術師の印" @@ -128873,7 +132641,7 @@ msgstr "酔って戦う古代拳法を知らぬ間に身に付けました!ア #: lang/json/mutation_from_json.py msgid "Hero's Spirit" -msgstr "" +msgstr "英雄の魂" #. ~ Description for {'str': "Hero's Spirit"} #: lang/json/mutation_from_json.py @@ -128881,29 +132649,52 @@ msgid "" "You have studied the deeds and legends of ancient heroes. From your " "research, you have learned an ancient form of combat called Hylian " "Swordsmanship." -msgstr "" +msgstr "古代の英雄たちの偉業や伝説を研究し、古代の戦闘技術であるハイリア剣術を学びました。" #: lang/json/mutation_from_json.py msgid "Ki Strike" -msgstr "" +msgstr "気の力" #. ~ Description for {'str': 'Ki Strike'} #: lang/json/mutation_from_json.py msgid "" "Who needs weapons? You deal more melee damage while unarmed. This damage " "improves as your unarmed skill increases." -msgstr "" +msgstr "武器なんて必要ですか?武器を装備していない時の方が攻撃力が高まります。" + +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "ジェダイの訓練" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "ジェダイの訓練を受けました。ライトセーバーを使った戦い方を知っています。" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "ポッ拳の使い手" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "奇怪なポケット・フィストの格闘技に精通しています。よく鍛錬すれば、きっと師匠になれます。" #: lang/json/mutation_from_json.py msgid "Martial Adept" -msgstr "" +msgstr "武道の達人" #. ~ Description for {'str': 'Martial Adept'} #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." -msgstr "" +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." +msgstr "「崇高な道」が使う武術を学んだ武術の達人です。砂漠の旋風、金剛石の心、鋼の心、落陽、岩竜、虎の爪のいずれかを選択して開始します。" #: lang/json/mutation_from_json.py msgid "Magus" @@ -129094,7 +132885,7 @@ msgstr "マナの旋風" #: lang/json/mutation_from_json.py msgid "Manatouched Mana Efficiency" -msgstr "" +msgstr "マナタッチ(貯蔵量上昇)" #. ~ Description for {'str': 'Manatouched Mana Efficiency'} #. ~ Description for Greater Mana Efficiency @@ -129104,7 +132895,7 @@ msgstr "体内に溜めておけるマナの量が平均より大幅に高くな #: lang/json/mutation_from_json.py msgid "Manatouched Mana Regeneration" -msgstr "" +msgstr "マナタッチ(回復速度上昇)" #. ~ Description for Manatouched Mana Regeneration #. ~ Description for Greater Mana Regeneration @@ -129114,7 +132905,7 @@ msgstr "マナの回復速度が通常より大幅に上昇します。" #: lang/json/mutation_from_json.py msgid "Manatouched Mana Sensitivity" -msgstr "" +msgstr "マナタッチ(消費効率上昇)" #. ~ Description for Manatouched Mana Sensitivity #. ~ Description for Greater Mana Sensitivity @@ -129414,10 +133205,6 @@ msgstr "生き残ろうと必死に頑張ってるところさ。" msgid "I'm tracking game." msgstr "足跡を追って狩りをしているんだ。" -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "兵士" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "バーテンダー" @@ -129890,6 +133677,14 @@ msgstr "知性マストドン" msgid "Humans created me. Let's see what I can be on my own." msgstr "人類が私を創った。自分の力でどこまでやれるだろうか。" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "スワンパー" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "捕食者たちが帰ってきたから、飯を用意しないと。" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "特殊部隊員" @@ -130159,10 +133954,6 @@ msgstr "戦闘員" msgid "Laborer" msgstr "労働者" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "木こり" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "木工師" @@ -130175,6 +133966,14 @@ msgstr "異生物学者、狂人" msgid "Millyficen Whately" msgstr "ミリフィセン ウィートリー" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "CEO" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "ボー・バロニクス" + #: lang/json/npc_from_json.py msgid "magus" msgstr "メイガス" @@ -131145,7 +134944,7 @@ msgstr "電器店(屋上)" #: lang/json/overmap_terrain_from_json.py msgid "electronics store 2nd floor" -msgstr "" +msgstr "電器店(2階)" #: lang/json/overmap_terrain_from_json.py msgid "sporting goods store" @@ -131909,15 +135708,15 @@ msgstr "軽工場" #: lang/json/overmap_terrain_from_json.py msgid "private airport" -msgstr "" +msgstr "私設空港" #: lang/json/overmap_terrain_from_json.py msgid "private airport runway" -msgstr "" +msgstr "施設空港(滑走路)" #: lang/json/overmap_terrain_from_json.py msgid "helicopter pad" -msgstr "" +msgstr "ヘリコプター発着場" #: lang/json/overmap_terrain_from_json.py msgid "science lab" @@ -132673,6 +136472,18 @@ msgstr "道路(マンホール)" msgid "bridge" msgstr "橋" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "休憩所" @@ -132919,7 +136730,7 @@ msgstr "州立葬儀場(屋上)" #: lang/json/overmap_terrain_from_json.py msgid "Dinosaur Exhibit" -msgstr "" +msgstr "恐竜園" #: lang/json/overmap_terrain_from_json.py msgid "wildlife field office" @@ -132939,7 +136750,7 @@ msgstr "スカベンジャーの拠点" #: lang/json/overmap_terrain_from_json.py msgid "goblin encampment" -msgstr "" +msgstr "ゴブリンの野営地" #: lang/json/overmap_terrain_from_json.py msgid "magic shop" @@ -133602,7 +137413,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Professional Cyclist" -msgstr "プロの自転車乗り" +msgstr "プロのロードレーサー" #. ~ Profession (male Professional Cyclist) description #: lang/json/professions_from_json.py @@ -133618,7 +137429,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Professional Cyclist" -msgstr "プロの自転車乗り" +msgstr "プロのロードレーサー" #. ~ Profession (female Professional Cyclist) description #: lang/json/professions_from_json.py @@ -133976,7 +137787,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Chain Smoker" -msgstr "ヘビースモーカー" +msgstr "チェーンスモーカー" #. ~ Profession (male Chain Smoker) description #: lang/json/professions_from_json.py @@ -133991,7 +137802,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Chain Smoker" -msgstr "ヘビースモーカー" +msgstr "チェーンスモーカー" #. ~ Profession (female Chain Smoker) description #: lang/json/professions_from_json.py @@ -134006,7 +137817,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Crackhead" -msgstr "高純度コカイン常用者" +msgstr "高純度コカイン乱用者" #. ~ Profession (male Crackhead) description #: lang/json/professions_from_json.py @@ -134021,7 +137832,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Crackhead" -msgstr "高純度コカイン常用者" +msgstr "高純度コカイン乱用者" #. ~ Profession (female Crackhead) description #: lang/json/professions_from_json.py @@ -134047,6 +137858,7 @@ msgid "" " mean a thing anymore, and for all the crap thrown your way, you're still " "standing. God damn, you need a drink." msgstr "" +"社会から爪弾きにされ、家も家族も友人も失くし、酒瓶だけが慰めでした。しかし社会は意義を失いました。爪弾きにされてもなお、自分の足で立っています。とにかく、まずは酒を飲みましょうか。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134062,11 +137874,12 @@ msgid "" " mean a thing anymore, and for all the crap thrown your way, you're still " "standing. God damn, you need a drink." msgstr "" +"社会から爪弾きにされ、家も家族も友人も失くし、酒瓶だけが慰めでした。しかし社会は意義を失いました。爪弾きにされてもなお、自分の足で立っています。とにかく、まずは酒を飲みましょうか。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Tweaker" -msgstr "薬物中毒者" +msgstr "アンフェタミン乱用者" #. ~ Profession (male Tweaker) description #: lang/json/professions_from_json.py @@ -134076,11 +137889,12 @@ msgid "" "floor and everything has gone completely to shit. The only thing running " "through your head, though, is where you're gonna find your next hit." msgstr "" +"昨晩何があったのかよく覚えていませんが、床で目を覚ますと、何もかもが完全におかしくなっていました。頭の中には、この後キメるヤクをどこで探そうかという悩み以外何も浮かんできません。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Tweaker" -msgstr "薬物中毒者" +msgstr "アンフェタミン乱用者" #. ~ Profession (female Tweaker) description #: lang/json/professions_from_json.py @@ -134090,11 +137904,12 @@ msgid "" "floor and everything has gone completely to shit. The only thing running " "through your head, though, is where you're gonna find your next hit." msgstr "" +"昨晩何があったのかよく覚えていませんが、床で目を覚ますと、何もかもが完全におかしくなっていました。頭の中には、この後キメるヤクをどこで探そうかという悩み以外何も浮かんできません。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Pillhead" -msgstr "アヘン中毒者" +msgstr "アヘン乱用者" #. ~ Profession (male Pillhead) description #: lang/json/professions_from_json.py @@ -134104,11 +137919,12 @@ msgid "" "your pain. With the pharmacies shut down and your dealers turned undead, " "satisfying those cravings just got a lot more difficult." msgstr "" +"若い頃のちょっとした事がきっかけで、鎮痛用のアヘンにハマりました。薬局は閉鎖され、売人もゾンビになってしまったので、この欲求は中々満たせそうにありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Pillhead" -msgstr "アヘン中毒者" +msgstr "アヘン乱用者" #. ~ Profession (female Pillhead) description #: lang/json/professions_from_json.py @@ -134118,6 +137934,7 @@ msgid "" "your pain. With the pharmacies shut down and your dealers turned undead, " "satisfying those cravings just got a lot more difficult." msgstr "" +"若い頃のちょっとした事がきっかけで、鎮痛用のアヘンにハマりました。薬局は閉鎖され、売人もゾンビになってしまったので、この欲求は中々満たせそうにありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134132,6 +137949,7 @@ msgid "" "tourists around. The Cataclysm has grounded you for now, but the sky still " "calls to you…" msgstr "" +"パイロットの免許を取得し、会社員や観光客を運んで生計を立てていました。大変動によって地上に縛られてしまいましたが、今も空の呼び声が聞こえる気がします..." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134146,6 +137964,7 @@ msgid "" "tourists around. The Cataclysm has grounded you for now, but the sky still " "calls to you…" msgstr "" +"パイロットの免許を取得し、会社員や観光客を運んで生計を立てていました。大変動によって地上に縛られてしまいましたが、今も空の呼び声が聞こえる気がします..." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134161,6 +137980,7 @@ msgid "" " loyal dog is still at your side, though, ready to face the Cataclysm with " "you." msgstr "" +"忠犬と協力して麻薬密輸業者を逮捕する仕事に人生を捧げていましたが、世界が崩壊し、もはやそんな仕事はなくなりました。しかし少なくとも、隣にいる忠実な友は大変動に挑む覚悟を決めたようです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134176,6 +137996,7 @@ msgid "" " loyal dog is still at your side, though, ready to face the Cataclysm with " "you." msgstr "" +"忠犬と協力して麻薬密輸業者を逮捕する仕事に人生を捧げていましたが、世界が崩壊し、もはやそんな仕事はなくなりました。しかし少なくとも、隣にいる忠実な友は大変動に挑む覚悟を決めたようです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134188,7 +138009,7 @@ msgctxt "prof_desc_male" msgid "" "Everyone is dead? Oh well, it doesn't matter; it's not like you got along " "with people much anyway. Your beloved cats are all the friends you need!" -msgstr "" +msgstr "全人類が死んでしまったのでしょうか?いや、そんなの気にする必要はありません。人間なんて二の次です。ネコさえいれば、他の友は不要です!" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134201,7 +138022,7 @@ msgctxt "prof_desc_female" msgid "" "Everyone is dead? Oh well, it doesn't matter; it's not like you got along " "with people much anyway. Your beloved cats are all the friends you need!" -msgstr "" +msgstr "全人類が死んでしまったのでしょうか?いや、そんなの気にする必要はありません。人間なんて二の次です。ネコさえいれば、他の友は不要です!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134217,6 +138038,7 @@ msgid "" "with your life. Who's going to respect your authority when the government " "this badge represents might not even exist anymore?" msgstr "" +"救助要請を受けて現場に向かう、ちっぽけな街の警官でしたが、すぐに自分自身が救助を求める羽目になり、なんとか命からがら逃げ出しました。もはや警察の権威が何の役に立つのでしょう?このバッジの威光を保証する政府すら、消えてしまったのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134232,6 +138054,7 @@ msgid "" "with your life. Who's going to respect your authority when the government " "this badge represents might not even exist anymore?" msgstr "" +"救助要請を受けて現場に向かう、ちっぽけな街の警官でしたが、すぐに自分自身が救助を求める羽目になり、なんとか命からがら逃げ出しました。もはや警察の権威が何の役に立つのでしょう?このバッジの威光を保証する政府すら、消えてしまったのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134246,6 +138069,7 @@ msgid "" "when the Cataclysm struck. Now your prime suspect is dead. Everyone's " "dead. You could really use a smoke." msgstr "" +"ある殺人事件の重要な手掛かりを掴んだその時、大変動が起こりました。第一容疑者も、他の誰も彼もが死んでしまいました。取りあえずタバコを吸いましょうか。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134260,6 +138084,7 @@ msgid "" "when the Cataclysm struck. Now your prime suspect is dead. Everyone's " "dead. You could really use a smoke." msgstr "" +"ある殺人事件の重要な手掛かりを掴んだその時、大変動が起こりました。第一容疑者も、他の誰も彼もが死んでしまいました。取りあえずタバコを吸いましょうか。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134275,6 +138100,7 @@ msgid "" "apocalypse. Unfortunately, the chain of command has broken down; your only " "mission now is to stay alive." msgstr "" +"警察の精鋭部隊の一員として十全の訓練をこなしており、恐るべき非常事態を生き抜けるだけの装備も揃っています。しかし、残念ながら指揮系統は崩壊してしまいました。最後にして唯一の指令は、生き延びることです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134290,6 +138116,7 @@ msgid "" "apocalypse. Unfortunately, the chain of command has broken down; your only " "mission now is to stay alive." msgstr "" +"警察の精鋭部隊の一員として十全の訓練をこなしており、恐るべき非常事態を生き抜けるだけの装備も揃っています。しかし、残念ながら指揮系統は崩壊してしまいました。最後にして唯一の指令は、生き延びることです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134305,6 +138132,7 @@ msgid "" "Unfortunately, the chain of command has broken down; your only mission now " "is to stay alive." msgstr "" +"警察の精鋭部隊の一員として十全の訓練をこなしている、近接戦闘の達人です。しかし、残念ながら指揮系統は崩壊してしまいました。最後にして唯一の指令は、生き延びることです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134320,6 +138148,7 @@ msgid "" "Unfortunately, the chain of command has broken down; your only mission now " "is to stay alive." msgstr "" +"警察の精鋭部隊の一員として十全の訓練をこなしている、近接戦闘の達人です。しかし、残念ながら指揮系統は崩壊してしまいました。最後にして唯一の指令は、生き延びることです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134335,6 +138164,7 @@ msgid "" "the line, and you can't afford to miss if you don't want to end up as " "something's dinner." msgstr "" +"研ぎ澄まされた精密射撃の技で任務を果たし、たとえ孤立しようが、敵を狙い撃つことで罪なき市民を守ってきました。今は生き延びることが第一目標です。少しでも狙いを外せば、誰かの夕食にされてしまいます。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134350,6 +138180,7 @@ msgid "" "the line, and you can't afford to miss if you don't want to end up as " "something's dinner." msgstr "" +"研ぎ澄まされた精密射撃の技で任務を果たし、たとえ孤立しようが、敵を狙い撃つことで罪なき市民を守ってきました。今は生き延びることが第一目標です。少しでも狙いを外せば、誰かの夕食にされてしまいます。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134365,6 +138196,7 @@ msgid "" "bit of luck and a lot of head-bashing that you got away in one piece, and " "the worst is yet to come." msgstr "" +"以前から暴徒は残忍な連中でしたが、死んでも蘇って生者を貪るなんてことはありませんでした。防御線が崩壊し、人混みに揉まれながら、幸運にも無傷で逃げ出せました。最悪の事態が起こるのはこれからです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134380,6 +138212,7 @@ msgid "" "bit of luck and a lot of head-bashing that you got away in one piece, and " "the worst is yet to come." msgstr "" +"以前から暴徒は残忍な連中でしたが、死んでも蘇って生者を貪るなんてことはありませんでした。防御線が崩壊し、人混みに揉まれながら、幸運にも無傷で逃げ出せました。最悪の事態が起こるのはこれからです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134394,6 +138227,7 @@ msgid "" "been around the block a few times, and you'd charge way more than a dollar -" " and get it, too!" msgstr "" +"1ドルのためなら母親でも売るような奴だと蔑まれていましたが、そんなことは一切していません!少し街を歩くだけで1ドル以上の価値ある情報を見つけ、手に入れることもできる才能を持っています!" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134408,6 +138242,7 @@ msgid "" "been around the block a few times, and you'd charge way more than a dollar -" " and get it, too!" msgstr "" +"1ドルのためなら母親でも売るような奴だと蔑まれていましたが、そんなことは一切していません!少し街を歩くだけで1ドル以上の価値ある情報を見つけ、手に入れることもできる才能を持っています!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134423,6 +138258,7 @@ msgid "" "your side more than your trusty bow. So, when it did, you made sure to " "bring it along." msgstr "" +"子供の頃から狩猟が大好きで、すぐにアーチェリーの才能を開花させました。文明が崩壊したとしても、信頼できる弓以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134438,6 +138274,7 @@ msgid "" "your side more than your trusty bow. So, when it did, you made sure to " "bring it along." msgstr "" +"子供の頃から狩猟が大好きで、すぐにアーチェリーの才能を開花させました。文明が崩壊したとしても、信頼できる弓以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134453,6 +138290,7 @@ msgid "" "at your side more than your trusty crossbow. So, when it did, you made sure" " to bring it along." msgstr "" +"子供の頃から狩猟が大好きで、特にクロスボウを好んで使っていました。文明が崩壊したとしても、信頼できるクロスボウ以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134468,6 +138306,7 @@ msgid "" "at your side more than your trusty crossbow. So, when it did, you made sure" " to bring it along." msgstr "" +"子供の頃から狩猟が大好きで、特にクロスボウを好んで使っていました。文明が崩壊したとしても、信頼できるクロスボウ以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134483,6 +138322,7 @@ msgid "" "want at your side more than your trusty shotgun. So, when it did, you made " "sure to bring it along." msgstr "" +"子供の頃から狩猟が大好きで、特にショットガンを好んで使っていました。文明が崩壊したとしても、信頼できるショットガン以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134498,6 +138338,7 @@ msgid "" "want at your side more than your trusty shotgun. So, when it did, you made " "sure to bring it along." msgstr "" +"子供の頃から狩猟が大好きで、特にショットガンを好んで使っていました。文明が崩壊したとしても、信頼できるショットガン以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134513,6 +138354,7 @@ msgid "" "side more than your trusty rifle. So, when it did, you made sure to bring " "it along." msgstr "" +"子供の頃から狩猟が大好きで、特にライフルを好んで使っていました。文明が崩壊したとしても、信頼できるライフル以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134528,6 +138370,7 @@ msgid "" "side more than your trusty rifle. So, when it did, you made sure to bring " "it along." msgstr "" +"子供の頃から狩猟が大好きで、特にライフルを好んで使っていました。文明が崩壊したとしても、信頼できるライフル以外に望むものは何もありません。その思いが本当かどうか確かめるため、大変動に立ち向かいましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134543,6 +138386,7 @@ msgid "" "and wonder - are your meager skills, and the few supplies you grabbed on the" " way out, sufficient to help rebuild?" msgstr "" +"金物屋で働き、多くの家を修復してきました。今、目の前に広がるのは廃墟と化した街並みだけです。未熟な腕と手元に残るわずかな資材を手に、果たして、この荒廃した世界を修復できるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134558,6 +138402,7 @@ msgid "" "and wonder - are your meager skills, and the few supplies you grabbed on the" " way out, sufficient to help rebuild?" msgstr "" +"金物屋で働き、多くの家を修復してきました。今、目の前に広がるのは廃墟と化した街並みだけです。未熟な腕と手元に残るわずかな資材を手に、果たして、この荒廃した世界を修復できるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134571,6 +138416,7 @@ msgid "" "You once ruled the road in your big rig. When the riots hit, you hopped in " "and drove it to safety. Now it's just you and your truck against the world." msgstr "" +"大型トラックを走らせて車道を支配していました。暴動が起きたため、車に飛び乗り安全な場所まで移動しましたが、今や世界に反抗しているのは、自分自身と愛車だけです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134584,6 +138430,7 @@ msgid "" "You once ruled the road in your big rig. When the riots hit, you hopped in " "and drove it to safety. Now it's just you and your truck against the world." msgstr "" +"大型トラックを走らせて車道を支配していました。暴動が起きたため、車に飛び乗り安全な場所まで移動しましたが、今や世界に反抗しているのは、自分自身と愛車だけです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134625,6 +138472,7 @@ msgid "" "ruins, and the only thing between you and death is the open road and your " "backpack." msgstr "" +"両親の財産を頼りに暮らし、観光のために世界中を飛び回っていましたが、帰ってくると地元は廃墟と化していました。手元のリュックサックと閑散とした道路の活用法次第で、今後の生死が決まります。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134640,6 +138488,7 @@ msgid "" "ruins, and the only thing between you and death is the open road and your " "backpack." msgstr "" +"両親の財産を頼りに暮らし、観光のために世界中を飛び回っていましたが、帰ってくると地元は廃墟と化していました。手元のリュックサックと閑散とした道路の活用法次第で、今後の生死が決まります。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134654,6 +138503,7 @@ msgid "" " and unreasonable than usual today. Time to show the meaning of fast food… " "by running for your life!" msgstr "" +"勤務先であるハンバーガー専門店の今日のディナータイムは、いつもより血の気が多く滅茶苦茶な様子でした。ファーストフードの意義を示す時が来ました...全速力で逃げましょう!" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134668,6 +138518,7 @@ msgid "" " and unreasonable than usual today. Time to show the meaning of fast food… " "by running for your life!" msgstr "" +"勤務先であるハンバーガー専門店の今日のディナータイムは、いつもより血の気が多く滅茶苦茶な様子でした。ファーストフードの意義を示す時が来ました...全速力で逃げましょう!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134680,7 +138531,7 @@ msgctxt "prof_desc_male" msgid "" "Small businesses often hired you for electrical work. You were halfway " "through your latest job when the whole power grid went dead." -msgstr "" +msgstr "電気工事に駆り出されることが多い、小規模業者です。仕事の最中に停電が発生しました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134693,7 +138544,7 @@ msgctxt "prof_desc_female" msgid "" "Small businesses often hired you for electrical work. You were halfway " "through your latest job when the whole power grid went dead." -msgstr "" +msgstr "電気工事に駆り出されることが多い、小規模業者です。仕事の最中に停電が発生しました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134709,6 +138560,7 @@ msgid "" "significantly less useful. Unless you manage to find a military mainframe, " "that is." msgstr "" +"カフェイン剤を摂取しながら夜通しモニターと睨めっこし、その道のプロになりました。電力がなければ、残念ながら専門技術も役には立ちません。軍が使っている大型コンピュータでも発見できれば、話は別ですが。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134724,6 +138576,7 @@ msgid "" "significantly less useful. Unless you manage to find a military mainframe, " "that is." msgstr "" +"カフェイン剤を摂取しながら夜通しモニターと睨めっこし、その道のプロになりました。電力がなければ、残念ながら専門技術も役には立ちません。軍が使っている大型コンピュータでも発見できれば、話は別ですが。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134739,6 +138592,7 @@ msgid "" "there'll be something useful in one of these books you've been lugging " "around all year." msgstr "" +"貫徹だけでテストに挑んだり、幾何学の授業で少し躓いたりするだけの、平凡な高校生でした。年中持ち歩いていた教科書の中に、もしかすると何かの役に立つ知識があるかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134754,6 +138608,7 @@ msgid "" "there'll be something useful in one of these books you've been lugging " "around all year." msgstr "" +"貫徹だけでテストに挑んだり、幾何学の授業で少し躓いたりするだけの、平凡な高校生でした。年中持ち歩いていた教科書の中に、もしかすると何かの役に立つ知識があるかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134767,7 +138622,7 @@ msgid "" "You just stepped out of a nice, hot shower to find the world had ended. " "You've got some soap, along with the most massively useful thing ever… a " "towel." -msgstr "" +msgstr "熱いシャワーを浴びているまさにその時、大変動が起きました。石鹸とその場にあった最も役立ちそうな物...タオルをとっさに持ち出しました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134781,7 +138636,7 @@ msgid "" "You just stepped out of a nice, hot shower to find the world had ended. " "You've got some soap, along with the most massively useful thing ever… a " "towel." -msgstr "" +msgstr "熱いシャワーを浴びているまさにその時、大変動が起きました。石鹸とその場にあった最も役立ちそうな物...タオルをとっさに持ち出しました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134794,7 +138649,7 @@ msgctxt "prof_desc_male" msgid "" "You spent most of your life on a Harley, out on the open road with your " "club. Now they're all dead. Time to ride or die." -msgstr "" +msgstr "人生の大半をハーレーと共に過ごし、愛好会の皆と公道を駆けていましたが、気のいい仲間は皆死にました。乗るか、死ぬか。選択の時です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134807,7 +138662,7 @@ msgctxt "prof_desc_female" msgid "" "You spent most of your life on a Harley, out on the open road with your " "club. Now they're all dead. Time to ride or die." -msgstr "" +msgstr "人生の大半をハーレーと共に過ごし、愛好会の皆と公道を駆けていましたが、気のいい仲間は皆死にました。乗るか、死ぬか。選択の時です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134821,7 +138676,7 @@ msgid "" "Things got a little weird on your way to your weekly dance class. Zombies " "don't seem to know how to dance, but you're not about to let them step on " "your toes." -msgstr "" +msgstr "毎週のダンス教室へ向かう途中で、騒ぎに巻き込まれました。踊り方を知らないゾンビにつま先を踏ませるつもりはありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134835,7 +138690,7 @@ msgid "" "Things got a little weird on your way to your weekly dance class. Zombies " "don't seem to know how to dance, but you're not about to let them step on " "your toes." -msgstr "" +msgstr "毎週のダンス教室へ向かう途中で、騒ぎに巻き込まれました。踊り方を知らないゾンビにつま先を踏ませるつもりはありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134850,6 +138705,7 @@ msgid "" "off a string of daring, high-profile heists. The cops would love to get " "their hands on you, but seem otherwise occupied." msgstr "" +"非の打ち所のない技術と生体部品の力を使い、大胆な泥棒を次々と成功させて注目を集めていました。いつもはしつこい警察ですが、今は他のことで忙しいようです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134864,6 +138720,7 @@ msgid "" "off a string of daring, high-profile heists. The cops would love to get " "their hands on you, but seem otherwise occupied." msgstr "" +"非の打ち所のない技術と生体部品の力を使い、大胆な泥棒を次々と成功させて注目を集めていました。いつもはしつこい警察ですが、今は他のことで忙しいようです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134879,6 +138736,7 @@ msgid "" "than you ever were before, thanks to a suite of bionic systems powered by " "your own metabolic functions. Make the most of your second chance at life." msgstr "" +"機械化手術の被験者となる事で一命を取り留めました。自身の代謝機能によって給電されるCBMのお陰で、前より健康的な生活を送れるのです。第二の人生を最大限に活用しましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134894,6 +138752,7 @@ msgid "" "than you ever were before, thanks to a suite of bionic systems powered by " "your own metabolic functions. Make the most of your second chance at life." msgstr "" +"機械化手術の被験者となる事で一命を取り留めました。自身の代謝機能によって給電されるCBMのお陰で、前より健康的な生活を送れるのです。第二の人生を最大限に活用しましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134906,7 +138765,7 @@ msgctxt "prof_desc_male" msgid "" "When the diagnosis came back positive, you made a vow: to fight for your " "life, and to never give in to despair. Now is the time to renew that vow." -msgstr "" +msgstr "陽性の診断結果が出たあの日から、人生のために戦い、絶望に屈しないと決めました。今こそその誓いを新たにする時です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134919,7 +138778,7 @@ msgctxt "prof_desc_female" msgid "" "When the diagnosis came back positive, you made a vow: to fight for your " "life, and to never give in to despair. Now is the time to renew that vow." -msgstr "" +msgstr "陽性の診断結果が出たあの日から、人生のために戦い、絶望に屈しないと決めました。今こそその誓いを新たにする時です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134934,6 +138793,7 @@ msgid "" "the immense power of mutation. You are determined to live on, if only to " "spite them for what they did to you." msgstr "" +"突然変異の計り知れない力を解明するという目的の下、研究員から実験動物のように扱われていました。ほんの少しでも奴らへの仕返しになるのなら、生き続けてやろうと決意しました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134948,6 +138808,7 @@ msgid "" "the immense power of mutation. You are determined to live on, if only to " "spite them for what they did to you." msgstr "" +"突然変異の計り知れない力を解明するという目的の下、研究員から実験動物のように扱われていました。ほんの少しでも奴らへの仕返しになるのなら、生き続けてやろうと決意しました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134961,7 +138822,7 @@ msgid "" "Your dreams of becoming a super-human mutant through genetic alteration may " "have fallen a bit short, but the scientists say you're ready. It's time for" " a field test." -msgstr "" +msgstr "遺伝子の変異によって超人になるという夢が実現するにはまだ時間がかかるようですが、その科学者は実現可能だと言いました。実地テストの時間です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -134975,7 +138836,7 @@ msgid "" "Your dreams of becoming a super-human mutant through genetic alteration may " "have fallen a bit short, but the scientists say you're ready. It's time for" " a field test." -msgstr "" +msgstr "遺伝子の変異によって超人になるという夢が実現するにはまだ時間がかかるようですが、その科学者は実現可能だと言いました。実地テストの時間です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -134991,6 +138852,7 @@ msgid "" " human now, but that might prove to be an advantage against the horrors that" " await." msgstr "" +"元々は正常な状態でした。しかし、テスト中のプログラム処理が正常に完了せず、全ての人間性を根こそぎ剥ぎ取られてしまいました。今やほとんどただの機械でしかありませんが、恐怖に対抗できるのは利点かもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135006,6 +138868,7 @@ msgid "" " human now, but that might prove to be an advantage against the horrors that" " await." msgstr "" +"元々は正常な状態でした。しかし、テスト中のプログラム処理が正常に完了せず、全ての人間性を根こそぎ剥ぎ取られてしまいました。今やほとんどただの機械でしかありませんが、恐怖に対抗できるのは利点かもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135053,7 +138916,7 @@ msgid "" "You'll never get your shot at the Cyberolympics. All that's left of your " "dream is a single leftover protein shake. Well, that and your bulging, " "cybernetically-enhanced muscles." -msgstr "" +msgstr "サイバーオリンピックで勝利する夢は潰えました。残されたものは、プロテインシェイク、そして生体部品によって膨らんだ筋肉だけです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135067,7 +138930,7 @@ msgid "" "You'll never get your shot at the Cyberolympics. All that's left of your " "dream is a single leftover protein shake. Well, that and your bulging, " "cybernetically-enhanced muscles." -msgstr "" +msgstr "サイバーオリンピックで勝利する夢は潰えました。残されたものは、プロテインシェイク、そしてサイバネ加工によって膨らんだ筋肉だけです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135082,6 +138945,7 @@ msgid "" "running, and you enhanced your body with cybernetics to go even faster. Now" " there's plenty to run from - this is your kind of game." msgstr "" +"決して一線を退くことのない運動選手でした。走ることをこよなく愛し、更に速く走るために身体を改造しました。今後は走りを生かせる状況に何度も遭遇することでしょう。これもある種の競技ですね。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135096,6 +138960,7 @@ msgid "" "running, and you enhanced your body with cybernetics to go even faster. Now" " there's plenty to run from - this is your kind of game." msgstr "" +"決して一線を退くことのない運動選手でした。走ることをこよなく愛し、更に速く走るために身体を改造しました。今後は走りを生かせる状況に何度も遭遇することでしょう。これもある種の競技ですね。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135140,6 +139005,7 @@ msgid "" "enhanced to operate in the most dire of emergency situations. You're pretty" " sure this counts." msgstr "" +"第二世代の機械化消防士として機械で身体を強化し、どれほど危険な緊急事態にも対応できるようになりました。今の事態も間違いなくその一つに入ります。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135154,6 +139020,7 @@ msgid "" "enhanced to operate in the most dire of emergency situations. You're pretty" " sure this counts." msgstr "" +"第二世代の機械化消防士として機械で身体を強化し、どれほど危険な緊急事態にも対応できるようになりました。今の事態も間違いなくその一つに入ります。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135167,7 +139034,7 @@ msgid "" "You were employed by a major international corporation as a representative " "and technical advisor, utilizing the incredible power of your cybernetically" " augmented mind." -msgstr "" +msgstr "国際的な大手企業に、代表者兼技術顧問として雇われ、精神を生体部品で増強して超人的な力を操ります。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135181,7 +139048,7 @@ msgid "" "You were employed by a major international corporation as a representative " "and technical advisor, utilizing the incredible power of your cybernetically" " augmented mind." -msgstr "" +msgstr "国際的な大手企業に、代表者兼技術顧問として雇われ、精神を生体部品で増強して超人的な力を操ります。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135195,7 +139062,7 @@ msgid "" "You are the result of one of the military's last research programs: a " "prototype cyborg soldier. The wars they expected you to fight have become " "obsolete, but war never changes." -msgstr "" +msgstr "軍の最新研究の一つである、機械化兵士計画の成果物です。期待されていた戦争はもはや勃発しそうにありませんが、戦いが終わることもなさそうです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135209,7 +139076,7 @@ msgid "" "You are the result of one of the military's last research programs: a " "prototype cyborg soldier. The wars they expected you to fight have become " "obsolete, but war never changes." -msgstr "" +msgstr "軍の最新研究の一つである、機械化兵士計画の成果物です。期待されていた戦争はもはや勃発しそうにありませんが、戦いが終わることもなさそうです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135225,6 +139092,7 @@ msgid "" "targets from implausible distances, even after weeks of total isolation in " "enemy territory." msgstr "" +"最高機密の軍事プログラムを受けて完成した、完璧な狙撃手です。生体部品、装備、様々な実地訓練によって、敵地での数週間に渡る単独行動の後でも超遠距離からターゲットを狙撃できるようになりました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135240,6 +139108,7 @@ msgid "" "targets from implausible distances, even after weeks of total isolation in " "enemy territory." msgstr "" +"最高機密の軍事プログラムを受けて完成した、完璧な狙撃手です。生体部品、装備、様々な実地訓練によって、敵地での数週間に渡る単独行動の後でも超遠距離からターゲットを狙撃できるようになりました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135255,6 +139124,7 @@ msgid "" "specialist: you have night vision, an alarm, lock picking capabilities and a" " hacking module." msgstr "" +"数百万ドルもの税金をかけて複数の生体部品が体内に埋め込まれ、政府によって潜入と偵察の専門家に改造されました。暗視装置、危険察知用の生体アラーム、ピッキングとハッキングのツールなどを内蔵しています。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135270,6 +139140,7 @@ msgid "" "specialist: you have night vision, an alarm, lock picking capabilities and a" " hacking module." msgstr "" +"数百万ドルもの税金をかけて複数の生体部品が体内に埋め込まれ、政府によって潜入と偵察の専門家に改造されました。暗視装置、危険察知用の生体アラーム、ピッキングとハッキングのツールなどを内蔵しています。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135284,6 +139155,7 @@ msgid "" " sleeper agent capable of silently engaging your target while maintaining an" " innocuous appearance. Your handler cut all contact a week ago." msgstr "" +"数百万ドルもの秘密資金が投入され、生体部品を埋め込んだ潜伏工作員に改造されました。一般人の外見を維持したまま、ターゲットを秘密裏に始末します。上司からの連絡は1週間前に完全に途絶えました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135298,6 +139170,7 @@ msgid "" " sleeper agent capable of silently engaging your target while maintaining an" " innocuous appearance. Your handler cut all contact a week ago." msgstr "" +"数百万ドルもの秘密資金が投入され、生体部品を埋め込んだ潜伏工作員に改造されました。一般人の外見を維持したまま、ターゲットを秘密裏に始末します。上司からの連絡は1週間前に完全に途絶えました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135313,6 +139186,7 @@ msgid "" "best gear on the market in preparation for your biggest hit yet. Sadly, you" " came out of surgery to find your whole gang had been eaten." msgstr "" +"困難な仕事もやり遂げると評判のギャングであり、ボスのお気に入りの一人でした。「基本的な」生体部品と市場で手に入る中で最高の武器を与えられ、これまでで最大規模の抗争に備えていましたが、移植手術を終えて戻ってみると、残念ながら構成員たちは皆食い殺されていました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135328,6 +139202,7 @@ msgid "" "best gear on the market in preparation for your biggest hit yet. Sadly, you" " came out of surgery to find your whole gang had been eaten." msgstr "" +"困難な仕事もやり遂げると評判のギャングであり、ボスのお気に入りの一人でした。「基本的な」生体部品と市場で手に入る中で最高の武器を与えられ、これまでで最大規模の抗争に備えていましたが、移植手術を終えて戻ってみると、残念ながら構成員たちは皆食い殺されていました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135342,6 +139217,7 @@ msgid "" "You have a large capacity for power, but are filled with broken and useless " "bionics. Your ethanol power supply still works, at least." msgstr "" +"手術ミスを繰り返し、体内には壊れた生体部品が残りました。大容量の蓄電装置とエタノール燃焼発電システムは問題なく機能していますが、その他はまともに動きません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135356,6 +139232,7 @@ msgid "" "You have a large capacity for power, but are filled with broken and useless " "bionics. Your ethanol power supply still works, at least." msgstr "" +"手術ミスを繰り返し、体内には壊れた生体部品が残りました。大容量の蓄電装置とエタノール燃焼発電システムは問題なく機能していますが、その他はまともに動きません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135369,6 +139246,7 @@ msgid "" "You always had to have the latest and best gadgets and gizmos, so is it any " "wonder that you upgraded your flesh along with your smart phone?" msgstr "" +"常に最新鋭かつ最高級の機械装置を入手せずにはいられない性格でした。スマートフォンを買い替えるように人体を改造し続けることの、一体何がおかしいのでしょう?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135382,6 +139260,7 @@ msgid "" "You always had to have the latest and best gadgets and gizmos, so is it any " "wonder that you upgraded your flesh along with your smart phone?" msgstr "" +"常に最新鋭かつ最高級の機械装置を入手せずにはいられない性格でした。スマートフォンを買い替えるように人体を改造し続けることの、一体何がおかしいのでしょう?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135422,6 +139301,7 @@ msgid "" "decent living selling your catches and running trapping tutorials. " "Hopefully, your skills will come in useful against less conventional game." msgstr "" +"これまでの人生の大半の時間を、父親と共に罠猟をして過ごしてきました。獲物を売って生計を立てる中で、罠を上手く仕掛けられるようになりました。この技術が、今まで見たこともない標的に対して通用するといいのですが。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135436,6 +139316,7 @@ msgid "" "decent living selling your catches and running trapping tutorials. " "Hopefully, your skills will come in useful against less conventional game." msgstr "" +"これまでの人生の大半の時間を、父親と共に罠猟をして過ごしてきました。獲物を売って生計を立てる中で、罠を上手く仕掛けられるようになりました。この技術が、今まで見たこともない標的に対して通用するといいのですが。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135450,6 +139331,7 @@ msgid "" "metalsmithing program, but despite the havoc you've managed to keep ahold of" " some of the equipment you were carrying." msgstr "" +"コミュニティ・カレッジで金属加工の授業を受け、帰宅する途中でトラブルに巻き込まれました。パニックの中、持っていた工具の一部はなんとか失くさずに済みました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135464,6 +139346,7 @@ msgid "" "metalsmithing program, but despite the havoc you've managed to keep ahold of" " some of the equipment you were carrying." msgstr "" +"コミュニティ・カレッジで金属加工の授業を受け、帰宅する途中でトラブルに巻き込まれました。パニックの中、持っていた工具の一部はなんとか失くさずに済みました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135478,6 +139361,7 @@ msgid "" "performing at kids' parties was a dream come true until the world ended. " "There are precious few balloon animals in your future now." msgstr "" +"皆を笑顔にすることが一番の望みでした。学校を中退し、誕生会などで子供達を楽しませたいという夢を実現させようとしていました。しかし、それも文明が崩壊するまでの話です。今となっては貴重な動物型の風船がいくつか手元にあるだけです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135492,6 +139376,7 @@ msgid "" "performing at kids' parties was a dream come true until the world ended. " "There are precious few balloon animals in your future now." msgstr "" +"皆を笑顔にすることが一番の望みでした。学校を中退し、誕生会などで子供達を楽しませたいという夢を実現させようとしていました。しかし、それも文明が崩壊するまでの話です。今となっては貴重な動物型の風船がいくつか手元にあるだけです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135507,6 +139392,7 @@ msgid "" "kinky black leather. Unfortunately, there are no safewords in the " "apocalypse." msgstr "" +"安全な場所を求めて急ぐあまり、ご主人様と離れ離れになってしまいました。非常に倒錯したデザインの黒い革製スーツしか持っていない状況で、これから一人で生き延びなければなりません。生憎、この世界にプレイを中断するセーフワードはありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135522,6 +139408,7 @@ msgid "" "kinky black leather. Unfortunately, there are no safewords in the " "apocalypse." msgstr "" +"安全な場所を求めて急ぐあまり、ご主人様と離れ離れになってしまいました。非常に倒錯したデザインの黒い革製スーツしか持っていない状況で、これから一人で生き延びなければなりません。生憎、この世界にプレイを中断するセーフワードはありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135565,6 +139452,7 @@ msgid "" "Now zombies are eating everyone, and even worse, the convention is " "cancelled! At least you were ready in case your costume tore." msgstr "" +"夜遅くまで友人とアニメを見たりスナック菓子を食べたりしながら暮らしていましたが、ある時北東部でアニメコンベンションがあると聞き、足を運びました。ところが道中でゾンビが人間を食い殺し、残念ながらコンベンションも中止になりました!用意したものと言えば、コスプレ用の衣装が破れた時のための道具くらいです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135580,6 +139468,7 @@ msgid "" "Now zombies are eating everyone, and even worse, the convention is " "cancelled! At least you were ready in case your costume tore." msgstr "" +"夜遅くまで友人とアニメを見たりスナック菓子を食べたりしながら暮らしていましたが、ある時北東部でアニメコンベンションがあると聞き、足を運びました。ところが道中でゾンビが人間を食い殺し、残念ながらコンベンションも中止になりました!用意したものと言えば、コスプレ用の衣装が破れた時のための道具くらいです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135610,7 +139499,7 @@ msgstr "大切な日に大変動が起き、結婚式の服装のまま一目散 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Punk Rock Dude" -msgstr "パンクロックの伊達男" +msgstr "パンクロッカー" #. ~ Profession (Punk Rock Dude) description #: lang/json/professions_from_json.py @@ -135618,12 +139507,12 @@ msgctxt "prof_desc_male" msgid "" "All those wicked songs about the apocalypse have come to life. Brutal! Now" " that the system is dead, it's time to party among the bones of the world!" -msgstr "" +msgstr "黙示録の世界を歌う邪悪な歌に命が吹き込まれました。まさに残忍!体制が倒れた今こそ、文明世界の死骸にまみれてパーティーを開く時です!" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Punk Rock Girl" -msgstr "パンクロックの少女" +msgstr "パンクロッカー" #. ~ Profession (Punk Rock Girl) description #: lang/json/professions_from_json.py @@ -135631,7 +139520,7 @@ msgctxt "prof_desc_female" msgid "" "All those wicked songs about the apocalypse have come to life. Brutal! Now" " that the system is dead, it's time to party among the bones of the world!" -msgstr "" +msgstr "黙示録の世界を歌う邪悪な歌に命が吹き込まれました。まさに残忍!体制が倒れた今こそ、文明世界の死骸にまみれてパーティーを開く時です!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135647,6 +139536,7 @@ msgid "" "while on call, you were forced to fight your way to safety with little more " "than your trusty iron and your bunker gear to protect you." msgstr "" +"ファーストレスポンダーとしてこの災厄の衝撃的な恐怖を直接目撃しました。救助活動の中でほとんどの装備と仲間を失い、残った信頼できるハリガンバールと消防服で安全な場所までの道を切り開くしかありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135662,6 +139552,7 @@ msgid "" "while on call, you were forced to fight your way to safety with little more " "than your trusty iron and your bunker gear to protect you." msgstr "" +"ファーストレスポンダーとしてこの災厄の衝撃的な恐怖を直接目撃しました。救助活動の中でほとんどの装備と仲間を失い、残った信頼できるハリガンバールと消防服で安全な場所までの道を切り開くしかありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135674,7 +139565,7 @@ msgctxt "prof_desc_male" msgid "" "Your ska band broke up after the drummer became a zombie. Now you're alone " "in the Cataclysm with some cigarettes and your mp3 player." -msgstr "" +msgstr "所属していたスカバンドはドラマーがゾンビになった後に解散しました。現在、数本のタバコとMP3プレーヤーを持って、孤独に佇んでいます。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135687,7 +139578,7 @@ msgctxt "prof_desc_female" msgid "" "Your ska band broke up after the drummer became a zombie. Now you're alone " "in the Cataclysm with some cigarettes and your mp3 player." -msgstr "" +msgstr "所属していたスカバンドはドラマーがゾンビになった後に解散しました。現在、数本のタバコとMP3プレーヤーを持って、孤独に佇んでいます。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135700,7 +139591,7 @@ msgctxt "prof_desc_male" msgid "" "Neither snow nor rain nor heat nor dark of night stays you from delivering " "the mail, but nobody said anything about aliens." -msgstr "" +msgstr "雪が降ろうが、雨が降ろうが、暑かろうが、真っ暗な夜中だろうが、とにかく郵便物を届けていましたが、化け物が出るなんて初耳です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135713,7 +139604,7 @@ msgctxt "prof_desc_female" msgid "" "Neither snow nor rain nor heat nor dark of night stays you from delivering " "the mail, but nobody said anything about aliens." -msgstr "" +msgstr "雪が降ろうが、雨が降ろうが、暑かろうが、真っ暗な夜中だろうが、とにかく郵便物を届けていましたが、化け物が出るなんて初耳です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135727,7 +139618,7 @@ msgid "" "Your trial was contentious, but inevitably you found yourself behind bars. " "The Cataclysm has offered you a chance to escape, but freedom may come with " "a steep price." -msgstr "" +msgstr "裁判を経て、当然のように刑務所に収監されました。大変動によって脱獄のチャンスを得ましたが、この幸運の代償は高くつきそうです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135741,7 +139632,7 @@ msgid "" "Your trial was contentious, but inevitably you found yourself behind bars. " "The Cataclysm has offered you a chance to escape, but freedom may come with " "a steep price." -msgstr "" +msgstr "裁判を経て、当然のように刑務所に収監されました。大変動によって脱獄のチャンスを得ましたが、この幸運の代償は高くつきそうです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135756,6 +139647,7 @@ msgid "" "fate you're one of the few still alive. True death comes only from your " "hands, so you're in for a job." msgstr "" +"電気椅子への行進を待つ連続殺人犯でしたが、どのような運命のいたずらか、今では貴重な生きた人間の一人です。真の死を与えてやれるのは自分以外にいません。仕事に取り掛かりましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135770,6 +139662,7 @@ msgid "" "fate you're one of the few still alive. True death comes only from your " "hands, so you're in for a job." msgstr "" +"電気椅子への行進を待つ連続殺人犯でしたが、どのような運命のいたずらか、今では貴重な生きた人間の一人です。真の死を与えてやれるのは自分以外にいません。仕事に取り掛かりましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135784,6 +139677,7 @@ msgid "" "accounts. This plan immediately failed and got you arrested. They said you" " were too soft for prison, but guess what? They're dead, and you're not." msgstr "" +"会社の口座から資金をちょっぴり拝借するための天才的な計画を立てていましたが、目論見は失敗し、逮捕されてしまいました。軟弱者が刑務所でやっていけるのかと言われていましたが、これはいかなる運命でしょう?馬鹿にしていた奴らは全員死に、軟弱者が生き残りました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135798,6 +139692,7 @@ msgid "" "accounts. This plan immediately failed and got you arrested. They said you" " were too soft for prison, but guess what? They're dead, and you're not." msgstr "" +"会社の口座から資金をちょっぴり拝借するための天才的な計画を立てていましたが、目論見は失敗し、逮捕されてしまいました。軟弱者が刑務所でやっていけるのかと言われていましたが、これはいかなる運命でしょう?馬鹿にしていた奴らは全員死に、軟弱者が生き残りました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135842,6 +139737,7 @@ msgid "" " you and threw you in prison on trumped-up charges to silence you. Clearly," " they should have listened." msgstr "" +"研究所で起きていることを暴くために全力を尽くしましたが、口封じのために罪をでっちあげられて逮捕され、刑務所に放り込まれました。今の状況を見るに、やはり噂は本当だったようです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135856,6 +139752,7 @@ msgid "" " you and threw you in prison on trumped-up charges to silence you. Clearly," " they should have listened." msgstr "" +"研究所で起きていることを暴くために全力を尽くしましたが、口封じのために罪をでっちあげられて逮捕され、刑務所に放り込まれました。今の状況を見るに、やはり噂は本当だったようです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135898,6 +139795,7 @@ msgid "" "to be seen. Does it count as breaking and entering if everyone in town is " "undead?" msgstr "" +"幸運が巡ってきたようです。奪えるものは山ほどあり、警官も見当たりません。市民全員がゾンビになった場合、この行為は不法侵入になるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135912,6 +139810,7 @@ msgid "" "to be seen. Does it count as breaking and entering if everyone in town is " "undead?" msgstr "" +"幸運が巡ってきたようです。奪えるものは山ほどあり、警官も見当たりません。市民全員がゾンビになった場合、この行為は不法侵入になるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135924,7 +139823,7 @@ msgctxt "prof_desc_male" msgid "" "Through a series of painful and expensive surgeries, you became a walking " "bionic weapon, your services as a mercenary available to the highest bidder." -msgstr "" +msgstr "激痛と大金を代償に手術を行い、歩く兵器になりました。傭兵としての技能は、大金を出さないと雇えないレベルにまで向上しています。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135937,7 +139836,7 @@ msgctxt "prof_desc_female" msgid "" "Through a series of painful and expensive surgeries, you became a walking " "bionic weapon, your services as a mercenary available to the highest bidder." -msgstr "" +msgstr "激痛と大金を代償に手術を行い、歩く兵器になりました。傭兵としての技能は、大金を出さないと雇えないレベルにまで向上しています。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135953,6 +139852,7 @@ msgid "" " Your posthuman hunger still cries out to be fed; where will you get your " "bionic fix now?" msgstr "" +"生体部品の移植に憧れていました。裏路地の怪しげなバイオクリニックで中古品をセルフインストールして欲求を満たしている内に、すっかり中毒になってしまいました。人の限界を超えたいという欲望は今も満たされていません。どこへ行けば治せるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135968,6 +139868,7 @@ msgid "" " Your posthuman hunger still cries out to be fed; where will you get your " "bionic fix now?" msgstr "" +"生体部品の移植に憧れていました。裏路地の怪しげなバイオクリニックで中古品をセルフインストールして欲求を満たしている内に、すっかり中毒になってしまいました。人の限界を超えたいという欲望は今も満たされていません。どこへ行けば治せるのでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -135982,6 +139883,8 @@ msgid "" "posthuman monster, forced to hide in the shadows. Amidst the desolation, " "however, even a creature such as yourself might find its niche." msgstr "" +"生体部品の過剰移植で精神を蝕まれ、身を隠すことを余儀なくされた、人の限界を超えた怪物です。災厄の世界でなら、こんな化け物でも居場所を見つけられるかもしれません。" +" " #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -135996,6 +139899,8 @@ msgid "" "posthuman monster, forced to hide in the shadows. Amidst the desolation, " "however, even a creature such as yourself might find its niche." msgstr "" +"生体部品の過剰移植で精神を蝕まれ、身を隠すことを余儀なくされた、人の限界を超えた怪物です。災厄の世界でなら、こんな化け物でも居場所を見つけられるかもしれません。" +" " #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136010,6 +139915,7 @@ msgid "" " your brain, you were forced to flee the courtroom in disgrace. Now nobody " "seems to care about your objections." msgstr "" +"陪審員を掌の上で転がす名弁護士でしたが、被告に脳を食いちぎられそうになり、不名誉にも法廷から逃げ出さざるを得なくなりました。この状況に異議ありと叫んでも、誰も聞いてくれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136024,6 +139930,7 @@ msgid "" " your brain, you were forced to flee the courtroom in disgrace. Now nobody " "seems to care about your objections." msgstr "" +"陪審員を掌の上で転がす名弁護士でしたが、被告に脳を食いちぎられそうになり、不名誉にも法廷から逃げ出さざるを得なくなりました。この状況に異議ありと叫んでも、誰も聞いてくれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136038,6 +139945,7 @@ msgid "" "faithful, but it appears that prayers were not enough. Now that they are " "all dead, you should probably find something more tangible to protect you." msgstr "" +"黙示録の日が訪れました!教区民を守るために最善を尽くしましたが、祈りは届かなかったようです。死者達から身を守るために、もっと具体的な策を探すべきかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136052,6 +139960,7 @@ msgid "" "faithful, but it appears that prayers were not enough. Now that they are " "all dead, you should probably find something more tangible to protect you." msgstr "" +"黙示録の日が訪れました!教区民を守るために最善を尽くしましたが、祈りは届かなかったようです。死者達から身を守るために、もっと具体的な策を探すべきかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136097,6 +140006,7 @@ msgid "" "in prayer. Back then they came from far and wide to listen to you; now they" " come to eat your brains." msgstr "" +"黙示録の日が訪れる前は、預言者の声を聞き、コーランを熟読し、地域社会を平和に導くために地元のモスクで祈りを捧げる日々を過ごしていました。かつては遠方から信者達が話を聞きに来てくれましたが、今では脳味噌を食べにやってくる者ばかりです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136112,6 +140022,7 @@ msgid "" "in prayer. Back then they came from far and wide to listen to you; now they" " come to eat your brains." msgstr "" +"黙示録の日が訪れる前は、預言者の声を聞き、コーランを熟読し、地域社会を平和に導くために地元のモスクで祈りを捧げる日々を過ごしていました。かつては遠方から信者達が話を聞きに来てくれましたが、今では脳味噌を食べにやってくる者ばかりです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136183,6 +140094,7 @@ msgid "" "host your daily podcast, and the undead don't seem particularly moved by " "your sermons." msgstr "" +"町から町へと旅を続け、善き教えを広めることに人生を捧げてきました。さて、何もかもが地獄の底に堕ち、今日の分のポッドキャスト配信も中止になり、死者に説教をしてみたところでその心が動くこともありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136198,6 +140110,7 @@ msgid "" "host your daily podcast, and the undead don't seem particularly moved by " "your sermons." msgstr "" +"町から町へと旅を続け、善き教えを広めることに人生を捧げてきました。さて、何もかもが地獄の底に堕ち、今日の分のポッドキャスト配信も中止になり、死者に説教をしてみたところでその心が動くこともありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136210,7 +140123,7 @@ msgctxt "prof_desc_male" msgid "" "You've decided today is the day to take your first lesson at the local dojo." " You'll be great at it, you're sure of it." -msgstr "" +msgstr "今日こそ地元の道場へ行き、初めてのレッスンに参加しようと決めました。きっと素晴らしい体験ができるに違いありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136223,7 +140136,7 @@ msgctxt "prof_desc_female" msgid "" "You've decided today is the day to take your first lesson at the local dojo." " You'll be great at it, you're sure of it." -msgstr "" +msgstr "今日こそ地元の道場へ行き、初めてのレッスンに参加しようと決めました。きっと素晴らしい体験ができるに違いありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136288,7 +140201,7 @@ msgctxt "prof_desc_male" msgid "" "Your rival challenged you to the fight of your life, but now you fight just " "to keep yourself alive." -msgstr "" +msgstr "これまでは人生をかけて戦ってきましたが、これからは命を守るためだけに戦う日々が始まります。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136301,7 +140214,7 @@ msgctxt "prof_desc_female" msgid "" "Your rival challenged you to the fight of your life, but now you fight just " "to keep yourself alive." -msgstr "" +msgstr "これまでは人生をかけて戦ってきましたが、これからは命を守るためだけに戦う日々が始まります。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136317,6 +140230,7 @@ msgid "" "safety, you find yourself with only your wits and some leftover pizza. And " "they didn't even leave a tip!" msgstr "" +"今日最後のピザを地元の低温工学研究所に届けに行くと、腹を空かせたゾンビに食い殺されかけました。身を守るため逃げ出しましたが、今は残りのピザと自分の知恵以外頼れるものはありません。そういえば、チップを貰うのも忘れていました!" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136332,6 +140246,7 @@ msgid "" "safety, you find yourself with only your wits and some leftover pizza. And " "they didn't even leave a tip!" msgstr "" +"今日最後のピザを地元の低温工学研究所に届けに行くと、腹を空かせたゾンビに食い殺されかけました。身を守るため逃げ出しましたが、今は残りのピザと自分の知恵以外頼れるものはありません。そういえば、チップを貰うのも忘れていました!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136346,6 +140261,7 @@ msgid "" "a long-lost temple, but then the ground started to shake uncontrollably. " "You had a bad feeling about that, so you got out of there quickly." msgstr "" +"死んだ祖父の手記を手掛かりに長らく忘れ去られていた寺院へやってきたその時、地面が激しく揺れ始めました。嫌な予感がしたため、さっさと逃げ出しました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136360,6 +140276,7 @@ msgid "" "a long-lost temple, but then the ground started to shake uncontrollably. " "You had a bad feeling about that, so you got out of there quickly." msgstr "" +"死んだ祖父の手記を手掛かりに長らく忘れ去られていた寺院へやってきたその時、地面が激しく揺れ始めました。嫌な予感がしたため、さっさと逃げ出しました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136374,6 +140291,7 @@ msgid "" "hordes don't seem to value the latest news, but at least your trusty bicycle" " is still in working order." msgstr "" +"世界の終焉という知らせを届けるために、朝から仕事へ出かけました。アンデッドの大群は最新のニュースには無関心なようですが、信頼する自転車は役に立ってくれるはずです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136388,6 +140306,7 @@ msgid "" "hordes don't seem to value the latest news, but at least your trusty bicycle" " is still in working order." msgstr "" +"世界の終焉という知らせを届けるために、朝から仕事へ出かけました。アンデッドの大群は最新のニュースには無関心なようですが、信頼する自転車は役に立ってくれるはずです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136403,6 +140322,7 @@ msgid "" "speed violence. Things are looking grim; how long can you race laps around " "the undead before you get blocked for good?" msgstr "" +"これまで地獄を爆走するような激しい試合をこなしてきましたが、他のチームメンバーは全滅しました。スピードと暴力がなければここまで長くは生きられなかったでしょう。状況はかなり厳しいようです。一度捕まればそこまで、ゾンビたちを避けながらいつまでレースを続けられるでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136418,6 +140338,7 @@ msgid "" "speed violence. Things are looking grim; how long can you race laps around " "the undead before you get blocked for good?" msgstr "" +"これまで地獄を爆走するような激しい試合をこなしてきましたが、他のチームメンバーは全滅しました。スピードと暴力がなければここまで長くは生きられなかったでしょう。状況はかなり厳しいようです。一度捕まればそこまで、ゾンビたちを避けながらいつまでレースを続けられるでしょうか?" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136432,6 +140353,7 @@ msgid "" "should things be any different now? With a handful of seeds and your trusty" " hoe, it's time to rebuild the Earth, one plant at a time." msgstr "" +"土と水、そして日光があればそれで満足でした。どうしてこんなことになってしまったのでしょうか?残り少ない種と信頼できる鍬を持ち、少しずつ着実に大地を再生しましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136446,6 +140368,7 @@ msgid "" "should things be any different now? With a handful of seeds and your trusty" " hoe, it's time to rebuild the Earth, one plant at a time." msgstr "" +"土と水、そして日光があればそれで満足でした。どうしてこんなことになってしまったのでしょうか?残り少ない種と信頼できる鍬を持ち、少しずつ着実に大地を再生しましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136460,6 +140383,7 @@ msgid "" "epidemics. Despite your best efforts, you were unable to form up before all" " communications ceased and you found yourself alone amongst the dead." msgstr "" +"政府は蔓延する感染症に対処するため、州兵を動員しました。死力を尽くしましたが、隊列を組む前から通信は途絶しており、いつの間にか死者の群れの中に一人、取り残されていました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136474,6 +140398,7 @@ msgid "" "epidemics. Despite your best efforts, you were unable to form up before all" " communications ceased and you found yourself alone amongst the dead." msgstr "" +"政府は蔓延する感染症に対処するため、州兵を動員しました。死力を尽くしましたが、隊列を組む前から通信は途絶しており、いつの間にか死者の群れの中に一人、取り残されていました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136488,6 +140413,7 @@ msgid "" " amidst the ruins of civilization. Whether through force, guile, or luck, " "you've obtained the best gear you could find." msgstr "" +"文明の残骸の中で人生を満喫していたお陰か、大変動を免れた数少ない幸運な人々の仲間入りを果たしました。暴力か策略か、あるいは幸運によるものかは分かりませんが、素晴らしい装備を手に入れています。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136502,6 +140428,7 @@ msgid "" " amidst the ruins of civilization. Whether through force, guile, or luck, " "you've obtained the best gear you could find." msgstr "" +"文明の残骸の中で人生を満喫していたお陰か、大変動を免れた数少ない幸運な人々の仲間入りを果たしました。暴力か策略か、あるいは幸運によるものかは分かりませんが、素晴らしい装備を手に入れています。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136517,6 +140444,7 @@ msgid "" "command and find yourself in this predicament. The only mission left now is" " to survive." msgstr "" +"ブートキャンプでのサバイバル訓練を真面目に受けておくべきでした。さもなくば、然るべき命令を下してくれる指揮系統よりも長生きするべきではありませんでした。窮地に立たされた状況を理解した今、唯一の任務は生き延びる事です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136532,6 +140460,7 @@ msgid "" "command and find yourself in this predicament. The only mission left now is" " to survive." msgstr "" +"ブートキャンプでのサバイバル訓練を真面目に受けておくべきでした。さもなくば、然るべき命令を下してくれる指揮系統よりも長生きするべきではありませんでした。窮地に立たされた状況を理解した今、唯一の任務は生き延びる事です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136546,6 +140475,7 @@ msgid "" "petty thieves. Your job training didn't provide any terribly useful skills," " but you do have your trusty tazer, baton, and pocket knife." msgstr "" +"10代のチンピラやチンケな泥棒から夜のモールを守るという、退屈な仕事をしていました。研修では役に立つを技能を一つも教えてもらえませんでしたが、信頼できるテーザー銃と警棒、ポケットナイフを持っています。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136560,6 +140490,7 @@ msgid "" "petty thieves. Your job training didn't provide any terribly useful skills," " but you do have your trusty tazer, baton, and pocket knife." msgstr "" +"10代のチンピラやチンケな泥棒から夜のモールを守るという、退屈な仕事をしていました。研修では役に立つを技能を一つも教えてもらえませんでしたが、信頼できるテーザー銃と警棒、ポケットナイフを持っています。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136574,6 +140505,7 @@ msgid "" " understanding with Mother Nature. The world as they knew it might have " "ended for your forsaken species, but you can hardly tell the difference." msgstr "" +"屋外での長年の放浪生活を経て、いつしか母なる大自然を完璧に理解できるようになっていました。世界が終わり、人類は見捨てられたらしいのですが、今のところ何の変化も感じません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136588,6 +140520,7 @@ msgid "" " understanding with Mother Nature. The world as they knew it might have " "ended for your forsaken species, but you can hardly tell the difference." msgstr "" +"屋外での長年の放浪生活を経て、いつしか母なる大自然を完璧に理解できるようになっていました。世界が終わり、人類は見捨てられたらしいのですが、今のところ何の変化も感じません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136603,6 +140536,7 @@ msgid "" "gotten bigger and meaner. Now their horrible noises have you spooked - you " "just hope the fish aren't as nasty." msgstr "" +"ほぼ毎日沼地で釣り糸を垂らしながら、平穏な暮らしを送っていました。いつも虫たちの賑やかな鳴き声に楽しく耳を傾けていましたが、その音は徐々に喧しく下劣なものになり、最近は恐怖しか感じません。魚があんなものに成り果てていないといいのですが。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136618,6 +140552,7 @@ msgid "" "gotten bigger and meaner. Now their horrible noises have you spooked - you " "just hope the fish aren't as nasty." msgstr "" +"ほぼ毎日沼地で釣り糸を垂らしながら、平穏な暮らしを送っていました。いつも虫たちの賑やかな鳴き声に楽しく耳を傾けていましたが、その音は徐々に喧しく下劣なものになり、最近は恐怖しか感じません。魚があんなものに成り果てていないといいのですが。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136692,6 +140627,7 @@ msgid "" "newsbots, and pizza delivery drones. Bionic implants helped you control " "them remotely. Now all the drones carry guns instead of pizza." msgstr "" +"無人道路清掃機、ニュースボット、ピザ配達ドローンなどをプログラミングする仕事に就いていました。生体部品を移植したお陰で、遠隔操作もお手の物です。ドローンたちはピザの代わりに銃を抱えるようになってしまいました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136706,6 +140642,7 @@ msgid "" "newsbots, and pizza delivery drones. Bionic implants helped you control " "them remotely. Now all the drones carry guns instead of pizza." msgstr "" +"無人道路清掃機、ニュースボット、ピザ配達ドローンなどをプログラミングする仕事に就いていました。生体部品を移植したお陰で、遠隔操作もお手の物です。ドローンたちはピザの代わりに銃を抱えるようになってしまいました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136720,6 +140657,7 @@ msgid "" " off. Things have gotten pretty bad, but at least the grown-ups aren't " "telling you where you can't roll." msgstr "" +"ローラーブレードが大好きです!ローラーブレードを脱いでいるより履いている時間の方が長いほどです。事態は悪化していますが、少なくとも大人たちに注意されることはありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136734,6 +140672,7 @@ msgid "" " off. Things have gotten pretty bad, but at least the grown-ups aren't " "telling you where you can't roll." msgstr "" +"ローラーブレードが大好きです!ローラーブレードを脱いでいるより履いている時間の方が長いほどです。事態は悪化していますが、少なくとも大人たちに注意されることはありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136749,6 +140688,7 @@ msgid "" "grown-ups to tell you what to do is the only reason you're alive. Man, you " "really should've played hooky today." msgstr "" +"大人の指図など気にもせず、結果的に校長室で毎日のように怒られていました。これからは大人たちに指図されることもないのだから、生き残った甲斐があったというものです。やれやれ、今日は学校をサボるべきでしたね。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136764,6 +140704,7 @@ msgid "" "grown-ups to tell you what to do is the only reason you're alive. Man, you " "really should've played hooky today." msgstr "" +"大人の指図など気にもせず、結果的に校長室で毎日のように怒られていました。これからは大人たちに指図されることもないのだから、生き残った甲斐があったというものです。やれやれ、今日は学校をサボるべきでしたね。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136811,6 +140752,7 @@ msgid "" "you're facing the hardest test yet, and you're not sure if those are the " "right kind of tools for the job." msgstr "" +"あらゆる学力テストに合格してほしいと願う両親の要望に応えて、知性と記憶力を高める生体部品を移植されました。さて、今までで最も難しいテストに直面していますが、生体部品がこの状況で役に立つのでしょうか。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136826,6 +140768,7 @@ msgid "" "you're facing the hardest test yet, and you're not sure if those are the " "right kind of tools for the job." msgstr "" +"あらゆる学力テストに合格してほしいと願う両親の要望に応えて、知性と記憶力を高める生体部品を移植されました。さて、今までで最も難しいテストに直面していますが、生体部品がこの状況で役に立つのでしょうか。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136840,6 +140783,7 @@ msgid "" " of the game. In the Cataclysm, it means getting eaten by monsters. Don't " "slip up." msgstr "" +"ドッジボールで回避に失敗するということは、ボールが当たって内野から除外されることを意味していました。大変動の世界で回避に失敗することは、化け物に喰われることを意味します。失敗は許されません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136854,6 +140798,7 @@ msgid "" " of the game. In the Cataclysm, it means getting eaten by monsters. Don't " "slip up." msgstr "" +"ドッジボールで回避に失敗するということは、ボールが当たって内野から除外されることを意味していました。大変動の世界で回避に失敗することは、化け物に喰われることを意味します。失敗は許されません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136868,6 +140813,7 @@ msgid "" "that make things go boom, but there aren't any teachers around to enforce " "the rules any more." msgstr "" +"学校のクラブ活動では、本当に楽しい化学実験、つまり何かを爆発させるような実験で遊ぶことは絶対に許されませんでした。しかし、ルールを決める教師はもう居ません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136882,6 +140828,7 @@ msgid "" "that make things go boom, but there aren't any teachers around to enforce " "the rules any more." msgstr "" +"学校のクラブ活動では、本当に楽しい化学実験、つまり何かを爆発させるような実験で遊ぶことは絶対に許されませんでした。しかし、ルールを決める教師はもう居ません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136896,6 +140843,7 @@ msgid "" "can use your technical skills to help you stay alive. You just haven't " "figured out how to make an awesome death ray yet." msgstr "" +"学校ではA/V部に所属していました。身に付けた機械弄りのスキルは生存の助けになるでしょう。ただ、今はまだスーパー殺人光線銃の作り方が分かりません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136910,6 +140858,7 @@ msgid "" "can use your technical skills to help you stay alive. You just haven't " "figured out how to make an awesome death ray yet." msgstr "" +"学校ではA/V部に所属していました。身に付けた機械弄りのスキルは生存の助けになるでしょう。ただ、今はまだスーパー殺人光線銃の作り方が分かりません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136924,6 +140873,7 @@ msgid "" "aggravation of imparting knowledge to young minds. If zombies have any " "interest in education, they're not showing it." msgstr "" +"生涯に渡って子供たちを教育し、若い心に知識を与える喜びと難しさを経験してきました。直接聞いたわけではありませんが、ゾンビが教育に関心を持っているようには見えません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136938,6 +140888,7 @@ msgid "" "aggravation of imparting knowledge to young minds. If zombies have any " "interest in education, they're not showing it." msgstr "" +"生涯に渡って子供たちを教育し、若い心に知識を与える喜びと難しさを経験してきました。直接聞いたわけではありませんが、ゾンビが教育に関心を持っているようには見えません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136952,6 +140903,7 @@ msgid "" "publisher seems more difficult a prospect than usual. You managed to hold " "onto your camera - hopefully you can get some fantastic shots." msgstr "" +"大変動に肉薄して記録を残せばきっと出世間違いなしですが、いつもの調子で出版社を見つけるのは難しそうです。カメラはなんとか持ち出せたので、上手くいけば素晴らしい写真が撮れそうです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136966,6 +140918,7 @@ msgid "" "publisher seems more difficult a prospect than usual. You managed to hold " "onto your camera - hopefully you can get some fantastic shots." msgstr "" +"大変動に肉薄して記録を残せばきっと出世間違いなしですが、いつもの調子で出版社を見つけるのは難しそうです。カメラはなんとか持ち出せたので、上手くいけば素晴らしい写真が撮れそうです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -136979,7 +140932,7 @@ msgid "" "It was hard enough getting kids to run laps without having to worry about " "them trying to eat your brains. Zombies won't even line up when you blow " "your whistle." -msgstr "" +msgstr "脳みそを食べようと狙ってくる子供達にグラウンドを走るよう指示するなんて、まず不可能です。ホイッスルを吹いてもゾンビは整列してくれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -136993,7 +140946,7 @@ msgid "" "It was hard enough getting kids to run laps without having to worry about " "them trying to eat your brains. Zombies won't even line up when you blow " "your whistle." -msgstr "" +msgstr "脳みそを食べようと狙ってくる子供達にグラウンドを走るよう指示するなんて、まず不可能です。ホイッスルを吹いてもゾンビは整列してくれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137008,6 +140961,7 @@ msgid "" "brainer to grab your bag and run when the sirens sounded. The cities are " "overrun, but you're prepared to make a home wherever you may find yourself." msgstr "" +"暇さえあれば大自然の中でハイキングやキャンプを楽しんでいたので、サイレンが鳴ったときは反射的にバッグを掴み、逃げ出しました。都市は蹂躙されましたが、どこであろうと家を構える覚悟はできています。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137022,6 +140976,7 @@ msgid "" "brainer to grab your bag and run when the sirens sounded. The cities are " "overrun, but you're prepared to make a home wherever you may find yourself." msgstr "" +"暇さえあれば大自然の中でハイキングやキャンプを楽しんでいたので、サイレンが鳴ったときは反射的にバッグを掴み、逃げ出しました。都市は蹂躙されましたが、どこであろうと家を構える覚悟はできています。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137034,7 +140989,7 @@ msgctxt "prof_desc_male" msgid "" "You're a miner, not a minor! Your canteen is dry, your jackhammer is out of" " gas, and you're on your last pair of batteries for your mining helmet…" -msgstr "" +msgstr "鉱山作業員はマイナーな職業ではありません!水筒は空、ジャックハンマーはガス欠、採掘用ヘルメットの電池も残り1本です..." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137047,7 +141002,7 @@ msgctxt "prof_desc_female" msgid "" "You're a miner, not a minor! Your canteen is dry, your jackhammer is out of" " gas, and you're on your last pair of batteries for your mining helmet…" -msgstr "" +msgstr "鉱山作業員はマイナーな職業ではありません!水筒は空、ジャックハンマーはガス欠、採掘用ヘルメットの電池も残り1本です..." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137061,7 +141016,7 @@ msgid "" "Before this all began, you were having the time of your life at your dream " "job: blowing stuff up. The Cataclysm means you're finally allowed to do it " "full time. " -msgstr "" +msgstr "事が起こる以前は、夢だった爆破解体を仕事にして、人生を楽しんでいました。これからはフルタイムで爆破解体が楽しめそうです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137075,7 +141030,7 @@ msgid "" "Before this all began, you were having the time of your life at your dream " "job: blowing stuff up. The Cataclysm means you're finally allowed to do it " "full time. " -msgstr "" +msgstr "事が起こる以前は、夢だった爆破解体を仕事にして、人生を楽しんでいました。これからはフルタイムで爆破解体が楽しめそうです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137120,6 +141075,7 @@ msgid "" "ever leaving home. You came here to get a taste of New England, but New " "England keeps trying to get a taste of you!" msgstr "" +"休日を過ごすには最高の場所だと思っていましたが、今は外出したことを後悔し始めています。ニューイングランドの食を求めてやってきたのに、ニューイングランドで食い尽くされそうになっています!" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137134,6 +141090,7 @@ msgid "" "ever leaving home. You came here to get a taste of New England, but New " "England keeps trying to get a taste of you!" msgstr "" +"休日を過ごすには最高の場所だと思っていましたが、今は外出したことを後悔し始めています。ニューイングランドの食を求めてやってきたのに、ニューイングランドで食い尽くされそうになっています!" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137148,6 +141105,7 @@ msgid "" "cast and crew all seem to have turned into zombies, which is pretty bad " "timing for you. Looks like it's for real this time…" msgstr "" +"リアリティ番組の撮影のため、素っ裸で森の中へ入りました。不思議なことに、出演者もスタッフも皆ゾンビの仮装をしているようですが、嫌な予感がします。随分リアルな特殊メイクですね..." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137162,6 +141120,7 @@ msgid "" "cast and crew all seem to have turned into zombies, which is pretty bad " "timing for you. Looks like it's for real this time…" msgstr "" +"リアリティ番組の撮影のため、素っ裸で森の中へ入りました。不思議なことに、出演者もスタッフも皆ゾンビの仮装をしているようですが、嫌な予感がします。随分リアルな特殊メイクですね..." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137177,6 +141136,7 @@ msgid "" "the few non-zombies in the world that can calibrate an Autodoc, which might " "come in handy." msgstr "" +"生体部品技術が世に登場してすぐに関連職に就き、移植を監督する日々を送ってきました。オートドクを調整できる数少ない生きた人間として、きっと重宝されることでしょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137192,6 +141152,7 @@ msgid "" "the few non-zombies in the world that can calibrate an Autodoc, which might " "come in handy." msgstr "" +"生体部品技術が世に登場してすぐに関連職に就き、移植を監督する日々を送ってきました。オートドクを調整できる数少ない生きた人間として、きっと重宝されることでしょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137207,6 +141168,7 @@ msgid "" " 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 "" +"好き勝手言うメンバー達との毎週の交流に四苦八苦している内に、ある考えが浮かびました。損な役回りはもう止めて、思うままに行動すべきです。そういう訳で、2人のドタキャン、更に2人のゾンビ化も放り出して逃げ出しました。崩壊する世界のどこかで、きっと新たなプレイヤーも見つかるでしょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137222,6 +141184,7 @@ msgid "" " 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 "" +"好き勝手言うメンバー達との毎週の交流に四苦八苦している内に、ある考えが浮かびました。損な役回りはもう止めて、思うままに行動すべきです。そういう訳で、2人のドタキャン、更に2人のゾンビ化も放り出して逃げ出しました。崩壊する世界のどこかで、きっと新たなプレイヤーも見つかるでしょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137237,6 +141200,7 @@ msgid "" "you did. You invested in bionics to make you smarter and memorized the " "entire handbook. Let's hope that knowledge helps you now." msgstr "" +"運、それとも意志の力でしょうか。莫大な富を得て、世界的な有名人たちが参加するゲームを主宰していました。プレイヤーをコテンパンにする力を得られるならと、より知能を高めるために生体部品を移植し、ルールブックを全て暗記しました。知識がこの状況を乗り切る助けになることを祈りましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137252,6 +141216,7 @@ msgid "" "you did. You invested in bionics to make you smarter and memorized the " "entire handbook. Let's hope that knowledge helps you now." msgstr "" +"運、それとも意志の力でしょうか。莫大な富を得て、世界的な有名人たちが参加するゲームを主宰していました。プレイヤーをコテンパンにする力を得られるならと、より知能を高めるために生体部品を移植し、ルールブックを全て暗記しました。知識がこの状況を乗り切る助けになることを祈りましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137264,7 +141229,7 @@ msgctxt "prof_desc_male" msgid "" "You were called in on your day off to feed the animals at the zoo. For some" " reason, none of your coworkers bothered showing up for work today." -msgstr "" +msgstr "休日に呼び出され、動物園で餌をやっていました。どういう訳か、今日は同僚たちが誰一人として出勤してきません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137277,7 +141242,7 @@ msgctxt "prof_desc_female" msgid "" "You were called in on your day off to feed the animals at the zoo. For some" " reason, none of your coworkers bothered showing up for work today." -msgstr "" +msgstr "休日に呼び出され、動物園で餌をやっていました。どういう訳か、今日は同僚たちが誰一人として出勤してきません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137290,7 +141255,7 @@ msgctxt "prof_desc_male" msgid "" "You decided to get away from the family for the day, so you headed to the " "fairway for a nice relaxing round of golf." -msgstr "" +msgstr "リラックスしたプレーで良いスコアを出すために、今日一日は家族を置いてゴルフ場へ向かいました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137303,7 +141268,7 @@ msgctxt "prof_desc_female" msgid "" "You decided to get away from the family for the day, so you headed to the " "fairway for a nice relaxing round of golf." -msgstr "" +msgstr "リラックスしたプレーで良いスコアを出すために、今日一日は家族を置いてゴルフ場へ向かいました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137349,6 +141314,7 @@ msgid "" "this concerns you, but last week the grocery service stopped coming and now " "the TV no longer turns on. This displeases you." msgstr "" +"奇妙な髪型と日本風の衣装で年中過ごしており、住民から好奇の目で見られていました。神道の神が遣わした使者ではないかと噂されることもありました。その話とは関係ありませんが、先週から食料配達サービスが止まり、テレビの電源も入りません。何とも不快な気分です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137364,6 +141330,7 @@ msgid "" "this concerns you, but last week the grocery service stopped coming and now " "the TV no longer turns on. This displeases you." msgstr "" +"奇妙な髪型と日本風の衣装で年中過ごしており、住民から好奇の目で見られていました。神道の神が遣わした使者ではないかと噂されることもありました。その話とは関係ありませんが、先週から食料配達サービスが止まり、テレビの電源も入りません。何とも不快な気分です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137378,6 +141345,7 @@ msgid "" " latest tournament was cut short when zombies invaded the piste. The " "referee was eaten, so you're not sure if the rules are still in play." msgstr "" +"競技フェンシングリーグ出場に備えて何年もトレーニングを重ねてきましたが、ゾンビが試合場に乱入したらしく、開催中のトーナメントが中断されました。審判が喰われたので、ルールはあってないようなものです。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137392,6 +141360,7 @@ msgid "" " latest tournament was cut short when zombies invaded the piste. The " "referee was eaten, so you're not sure if the rules are still in play." msgstr "" +"競技フェンシングリーグ出場に備えて何年もトレーニングを重ねてきましたが、ゾンビが試合場に乱入したらしく、開催中のトーナメントが中断されました。審判が喰われたので、ルールはあってないようなものです。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137434,7 +141403,7 @@ msgctxt "prof_desc_male" msgid "" "Taking care of cows, horses, and other animals is your passion, but the ways" " things are going, this isn't going to be just another day at the ranch." -msgstr "" +msgstr "ウシやウマなどの動物の世話に情熱を注いできましたが、この状況では、牧場での仕事をただこなすだけでは、一日を終えられそうにありません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137447,7 +141416,7 @@ msgctxt "prof_desc_female" msgid "" "Taking care of cows, horses, and other animals is your passion, but the ways" " things are going, this isn't going to be just another day at the ranch." -msgstr "" +msgstr "ウシやウマなどの動物の世話に情熱を注いできましたが、この状況では、牧場での仕事をただこなすだけでは、一日を終えられそうにありません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137462,6 +141431,7 @@ msgid "" "equipment and ensuring that the performers got what they needed. The show " "must go on." msgstr "" +"脚光を浴びることのない舞台裏で、機材を運び、修理をこなし、アーティストが必要とするものを用意してきました。この状況でもショーを止めるわけにはいきません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137476,6 +141446,7 @@ msgid "" "equipment and ensuring that the performers got what they needed. The show " "must go on." msgstr "" +"脚光を浴びることのない舞台裏で、機材を運び、修理をこなし、アーティストが必要とするものを用意してきました。この状況でもショーを止めるわけにはいきません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137490,6 +141461,7 @@ msgid "" "applause. You weren't able to grab much during the panic, but at least you " "have your loaded six string on your back." msgstr "" +"ソロパートは完璧でしたが、観客は拍手の代わりに悲鳴をよこしました。混乱の中で持ち出せたものはわずかですが、少なくとも愛用のギターは手元にあります。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137504,6 +141476,7 @@ msgid "" "applause. You weren't able to grab much during the panic, but at least you " "have your loaded six string on your back." msgstr "" +"ソロパートは完璧でしたが、観客は拍手の代わりに悲鳴をよこしました。混乱の中で持ち出せたものはわずかですが、少なくとも愛用のギターは手元にあります。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137517,6 +141490,7 @@ msgid "" "At the local mall, you saw a sign advertising a discount on survival kits. " "You bought one, more for show than for actual use. Now it's all you have." msgstr "" +"地元のショッピングモールでサバイバルキットを安く買えるというチラシを見て、実際には使わないと思いつつも取りあえず購入しました。それが、今あなたが所持している唯一の物です。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137530,6 +141504,7 @@ msgid "" "At the local mall, you saw a sign advertising a discount on survival kits. " "You bought one, more for show than for actual use. Now it's all you have." msgstr "" +"地元のショッピングモールでサバイバルキットを安く買えるというチラシを見て、実際には使わないと思いつつも取りあえず購入しました。それが、今あなたが所持している唯一の物です。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137545,6 +141520,7 @@ msgid "" "your trusty six-shooter and wandered into a world where it's always high " "noon." msgstr "" +"西部劇のイベントやショーに出演し、観光客に射撃術を披露することで生計を立てていましたが、世界は崩壊しました。信頼できる6連発銃を手に、昼夜を問わない決闘の世界へ足を踏み入れましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137560,6 +141536,7 @@ msgid "" "your trusty six-shooter and wandered into a world where it's always high " "noon." msgstr "" +"西部劇のイベントやショーに出演し、観光客に射撃術を披露することで生計を立てていましたが、世界は崩壊しました。信頼できる6連発銃を手に、昼夜を問わない決闘の世界へ足を踏み入れましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137575,6 +141552,7 @@ msgid "" "for more than drugs and booze, but you still have a chance to use the last " "symbol of your luxurious life - your sports car - and get far away." msgstr "" +"親の金を湯水のように使い、贅沢な暮らしをしていました。いつものようにドラッグパーティーに参加していましたが、ゲストはヤクや酒より飢えを満たせるものを見つけたようです。最後に残った贅沢な生活のシンボル、スポーツカーを使えば、遠くへ逃げられるかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137590,6 +141568,7 @@ msgid "" "for more than drugs and booze, but you still have a chance to use the last " "symbol of your luxurious life - your sports car - and get far away." msgstr "" +"親の金を湯水のように使い、贅沢な暮らしをしていました。いつものようにドラッグパーティーに参加していましたが、ゲストはヤクや酒より飢えを満たせるものを見つけたようです。最後に残った贅沢な生活のシンボル、スポーツカーを使えば、遠くへ逃げられるかもしれません。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137621,6 +141600,120 @@ msgid "" msgstr "" "兵士や生存者を次から次へと移送し、何もかもが崩壊していく様子を空から眺めていました。空を飛び回る化け物の姿を見れば、墜落するのは時間の問題だと分かります。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "救急隊員" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" +"同僚からの応援要請に対応しようとしていましたが、結局合流はできませんでした。信頼できる救急車に乗っており、世界が崩壊する状況でも患者を輸送する準備はできています。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "救急隊員" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" +"同僚からの応援要請に対応しようとしていましたが、結局合流はできませんでした。信頼できる救急車に乗っており、世界が崩壊する状況でも患者を輸送する準備はできています。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "救急救命士" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "同僚に応援を要請しましたが、結局合流はできませんでした。医薬品はなんとか持ち出せましたが、今はまず自分の命を救う必要がありそうです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "救急救命士" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "同僚に応援を要請しましたが、結局合流はできませんでした。医薬品はなんとか持ち出せましたが、今はまず自分の命を救う必要がありそうです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "衛生兵" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "負傷者に包帯を巻き、添え木を当てていたまさにその時、大変動が訪れました。負傷者は増え続け、やがて誰もいなくなりました。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "衛生兵" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "負傷者に包帯を巻き、添え木を当てていたまさにその時、大変動が訪れました。負傷者は増え続け、やがて誰もいなくなりました。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "ヘロイン乱用者" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "地元のフードプレイスの裏手で神に出会ったのが、最後の記憶です。そして人々は互いを喰い始めました。これは熱狂がもたらす幻覚なのでしょうか。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "ヘロイン乱用者" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "地元のフードプレイスの裏手で神に出会ったのが、最後の記憶です。そして人々は互いを喰い始めました。これは熱狂がもたらす幻覚なのでしょうか。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -137799,10 +141892,11 @@ msgstr "CBM技師" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" -"CBMの製造に関係する警備の厳重な施設で、面白味のない技師の仕事をしていました。手にはんだごてを移植し、精密機械の補助を受けながら働いて高い給料を得ていました。" +"CBMの製造に関係する警備の厳重な施設で、面白味のない技師の仕事をしていました。残業含め16時間の業務をこなしている途中で最後の避難命令が発出され、工具を掴んでなんとか屋外へ脱出しました。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137814,10 +141908,11 @@ msgstr "CBM技師" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" -"CBMの製造に関係する警備の厳重な施設で、面白味のない技師の仕事をしていました。手にはんだごてを移植し、精密機械の補助を受けながら働いて高い給料を得ていました。" +"CBMの製造に関係する警備の厳重な施設で、面白味のない技師の仕事をしていました。残業含め16時間の業務をこなしている途中で最後の避難命令が発出され、工具を掴んでなんとか屋外へ脱出しました。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -137958,7 +142053,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Bionic Operator" -msgstr "" +msgstr "サイボーグ(熟練の傭兵)" #. ~ Profession (male Bionic Operator) description #: lang/json/professions_from_json.py @@ -137971,11 +142066,12 @@ msgid "" " blows up. Now you're free until the bomb goes off. Maybe you'll find " "someone who can remove it." msgstr "" +"12の先頭集団に所属し、六大陸を渡り歩いてきた傭兵です。以前の勤め先の副社長から、生体部品を報酬に3か月間部下として働いてほしいと言われ、引き受けたのが間違いでした。次に目覚めたときには頭蓋に爆弾を埋め込まれていたのです。1か月ごとにリセットしなければ爆発してしまいます。ひとまず爆発の時間までは自由の身です。爆弾を解除してくれる人を見つけましょう。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Bionic Operator" -msgstr "" +msgstr "サイボーグ(熟練の傭兵)" #. ~ Profession (female Bionic Operator) description #: lang/json/professions_from_json.py @@ -137988,6 +142084,7 @@ msgid "" " blows up. Now you're free until the bomb goes off. Maybe you'll find " "someone who can remove it." msgstr "" +"12の先頭集団に所属し、六大陸を渡り歩いてきた傭兵です。以前の勤め先の副社長から、生体部品を報酬に3か月間部下として働いてほしいと言われ、引き受けたのが間違いでした。次に目覚めたときには頭蓋に爆弾を埋め込まれていたのです。1か月ごとにリセットしなければ爆発してしまいます。ひとまず爆発の時間までは自由の身です。爆弾を解除してくれる人を見つけましょう。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -139117,6 +143214,240 @@ msgid "" "find some other use." msgstr "テストでズルをするために使っていた魔法は、大変動の世界で他の用途に役立つかもしれません。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "瞑想者" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" +"自分を磨くことに集中したかったため、社会からはなれたところにいました。孤独こそが唯一の友人だったのに、この状況では嫌でも天変地異に好かれてしまいます。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "瞑想者" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" +"自分を磨くことに集中したかったため、社会からはなれたところにいました。孤独こそが唯一の友人だったのに、この状況では嫌でも天変地異に好かれてしまいます。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "不良牧師" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" +"配偶者が病気で死んだとき、信仰を失いました。それ以来、いつも飲んだくれています。神はこの黙示録の日にあらゆる人を罰しています。わずかに残った慈悲を人々に見せるべきでしょうか。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "不良牧師" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" +"配偶者が病気で死んだとき、信仰を失いました。それ以来、いつも飲んだくれています。神はこの黙示録の日にあらゆる人を罰しています。わずかに残った慈悲を人々に見せるべきでしょうか。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "テクノプレッパー" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "世界がいつか突然崩壊するだろうと信じていました。訓練と呪文とリボルバーがあれば、生き延びるチャンスは大いに高まります。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "テクノプレッパー" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "世界がいつか突然崩壊するだろうと信じていました。訓練と呪文とリボルバーがあれば、生き延びるチャンスは大いに高まります。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "疑似バンパイア" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"小さい頃からホラーノベルを溺愛しており、資産を使って呪文や生体部品で夜の住人を増やしていました。趣味に没頭するあまり健康意識が低くなり、青白く不健康な身体になってしまいました。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "疑似バンパイア" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"小さい頃からホラーノベルを溺愛しており、資産を使って呪文や生体部品で夜の住人を増やしていました。趣味に没頭するあまり健康意識が低くなり、青白く不健康な身体になってしまいました。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "魔法学校の生徒" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" +"魔法学校に入学して1年が経ち、忍耐力、知恵、そしていくつかの便利な魔法を学びました。教師がゾンビになったので、もう授業はありません。最後のレッスンの始まりです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "魔法学校の生徒" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" +"魔法学校に入学して1年が経ち、忍耐力、知恵、そしていくつかの便利な魔法を学びました。教師がゾンビになったので、もう授業はありません。最後のレッスンの始まりです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "過激なロッカー" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" +"特殊効果を活用して強烈で刺激的なステージを作りあげ、所属していたメタルバンドは大躍進を遂げました。大変動の世界を舞台にしたファイナルツアーの幕開けです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "過激なロッカー" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" +"特殊効果を活用して強烈で刺激的なステージを作りあげ、所属していたメタルバンドは大躍進を遂げました。大変動の世界を舞台にしたファイナルツアーの幕開けです。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "魔法警官" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" +"実験的な法執行プログラムに登録されました。容疑者の死傷を減らしコストも削減できることから、テーザー銃と銃弾の代わりにストームシェイプの魔法を使っています。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "魔法警官" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" +"実験的な法執行プログラムに登録されました。容疑者の死傷を減らしコストも削減できることから、テーザー銃と銃弾の代わりにストームシェイプの魔法を使っています。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "魔法格闘家" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" +"地下で開かれているマジックボクシング大会で、無敵の削岩機として名を馳せていました。対戦相手は皆ゾンビになったので、もう手加減する必要はありません。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "魔法格闘家" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" +"地下で開かれているマジックボクシング大会で、無敵の削岩機として名を馳せていました。対戦相手は皆ゾンビになったので、もう手加減する必要はありません。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -140790,7 +145121,7 @@ msgid "build a metalworking forge" msgstr "金属加工炉" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "金床とるつぼを置いて、作れるものを増やしましょう。" #: lang/json/recipe_from_json.py @@ -143992,13 +148323,13 @@ msgstr "パニックと混沌の中を避難している時に、何かに噛ま #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Fungal Infection" -msgstr "" +msgstr "挑戦 - 真菌感染症" #. ~ Name for scenario 'Challenge - Fungal Infection' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Fungal Infection" -msgstr "" +msgstr "挑戦 - 真菌感染症" #. ~ Description for scenario 'Challenge - Fungal Infection' for a male #. character. @@ -144006,7 +148337,7 @@ msgstr "" msgctxt "scen_desc_male" msgid "" "You feel spores crawling beneath your skin. It's only a matter of time." -msgstr "" +msgstr "胞子が皮膚の下を這っているのを感じます。あまり時間は残されていません。" #. ~ Description for scenario 'Challenge - Fungal Infection' for a female #. character. @@ -144014,7 +148345,7 @@ msgstr "" msgctxt "scen_desc_female" msgid "" "You feel spores crawling beneath your skin. It's only a matter of time." -msgstr "" +msgstr "胞子が皮膚の下を這っているのを感じます。あまり時間は残されていません。" #. ~ Name for scenario 'Burning Building' for a male character #: lang/json/scenario_from_json.py @@ -145082,6 +149413,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "魔法使いの隠れ家" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "亡命者" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "亡命者" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "自分の所属、もしくは個人的な理由から、亡命者になり、周囲の人々から敬遠されています。見捨てずにいてくれるのは死者だけです。" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "自分の所属、もしくは個人的な理由から、亡命者になり、周囲の人々から敬遠されています。見捨てずにいてくれるのは死者だけです。" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "亡命先国" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -145263,7 +149628,7 @@ msgstr "料理" #: lang/json/skill_from_json.py msgid "" "Your skill in combining food ingredients to make other, tastier food items." -msgstr "" +msgstr "食料を組み合わせて更に美味しい食事を作るためのスキルです。" #: lang/json/skill_from_json.py src/crafting_gui.cpp msgid "tailoring" @@ -145493,14 +149858,14 @@ msgstr "" #: lang/json/skill_from_json.py msgid "chemistry" -msgstr "" +msgstr "化学" #. ~ Description for {'str': 'chemistry'} #: lang/json/skill_from_json.py msgid "" "Your skill in creating certain mixtures, solutions and compounds from " "various chemical ingredients." -msgstr "" +msgstr "様々な化学成分を使って特定の混合物、溶液、化合物などを作り出すためのスキルです。" #: lang/json/skill_from_json.py msgid "weapon" @@ -147113,7 +151478,7 @@ msgstr "やめろ。ソラジンは心を曇らせる。心を鋭く保つんだ msgid "" "Sure, take thorazine. If you want to lose your mind and wander into a horde" " of undead!" -msgstr "" +msgstr "ああ、ソラジンを飲めばいいさ。気が狂ってゾンビの大群の中に突っ込みたいならね!" #: lang/json/snippet_from_json.py msgid "Pink tablets! I love those!" @@ -147181,11 +151546,11 @@ msgstr "それができたらいいんだけどね、。" #: lang/json/snippet_from_json.py msgid "Nothing to trade, sorry ." -msgstr "" +msgstr "取り引きできるものはないな。、申し訳ない。" #: lang/json/snippet_from_json.py msgid "Maybe next time?" -msgstr "" +msgstr "また今度にしない?" #: lang/json/snippet_from_json.py msgid "No thanks, I really don't feel like it." @@ -147221,7 +151586,7 @@ msgstr "一つの場所に腰を落ち着けるタイプじゃないんだ。" #: lang/json/snippet_from_json.py msgid "I'm more of a free spirit, can't settle, sorry." -msgstr "" +msgstr "私はどっちかと言うと自由人なんだ。申し訳ないけど、定住はできない。" #: lang/json/snippet_from_json.py msgid " " @@ -147507,96 +151872,6 @@ msgstr "こんなに喉が渇いたのは生まれて初めてだ。" msgid "I'd kill for a sip of water right now." msgstr "一杯の水のためなら何だってやるさ。" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "いいね、ビールを用意してくれた事にはもちろん気づいていたさ!冷えた奴を飲みながら話そう。、景気はどう?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "もちろんだ。そのビールをあけながらってのもいいな?ともかく、最近どう?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "ああ、君が持ってるビールを分けてくれるなら、好きなだけ話そう!まぁそれは冗談だけど、、調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "ねえ、冷たいビールがあればお喋りはもっと盛り上がるだろうな。調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "雑談中にビールを空ければ...しばらくの間は世界の崩壊について考えずにいられそうじゃないか?" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "ああ、もちろん、。そろそろ一息入れたかったんだ。調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "もちろんいいよ。、調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "ああ、くだらないことを話そう!最近どう?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "断ると思う?最近は元気にしてる?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "ああいいよ。元気でやってる?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "数分ぐらいならいいか。元気かい?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "よし、、元気かい?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "もちろん良いよ。話していれば君も胸のつかえが取れるだろ?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "いつでも語り合う準備はできてたよ!でもどうしたんだ、大丈夫?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "そうだな、。もっとお互いの事を知るべきだ。最近は上手くやってる?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "もちろん、いい気晴らしになるよ。調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "、いいアイデアだ。しばらく世界の惨状は忘れよう。調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "ああ、そりゃいいや。最近調子はどう?" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "いいね。ええと、じゃあ、天気の話でもする?" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "チクショウ" @@ -148082,11 +152357,11 @@ msgstr "ちょっと待って、聞こえてる?" #: lang/json/snippet_from_json.py msgid "What's the rush?" -msgstr "" +msgstr "何を急いでるんだ?" #: lang/json/snippet_from_json.py msgid "Wait for me , I can't keep up with you like this!" -msgstr "" +msgstr "、待って、こんなんじゃついていけない!" #: lang/json/snippet_from_json.py msgid "I'm unaffiliated." @@ -150061,6 +154336,18 @@ msgstr "どうやって大変動を生き延びたのか教えてほしい。" msgid "Was it rough surviving thus far?" msgstr "今までどうやって無事に乗り切ったんだ?" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "どうしてこんなことになった?一体何が起きたのかな?" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "どうなってるんだ?世界で何が起きているんだ?" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "どのようにして世界が崩壊したのか、何か聞いたことはないか?" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -150533,114 +154820,114 @@ msgstr "生存者" #: lang/json/snippet_from_json.py msgid "Clean water, the taste that refreshes!" -msgstr "" +msgstr "綺麗な飲み水は元気が出るね!" #: lang/json/snippet_from_json.py msgid "I was parched, but not I am not." -msgstr "" +msgstr "酷く喉が渇いていたけど、もう大丈夫だ。" #: lang/json/snippet_from_json.py msgid "Water is nice, but I should get a grog ration." -msgstr "" +msgstr "水はいいね、でもたまには酒でもいいかな。" #: lang/json/snippet_from_json.py msgid "That wasn't Evian, but I'm not thirsty." -msgstr "" +msgstr "エビアンじゃないけど、喉の渇きは癒せたな。" #: lang/json/snippet_from_json.py msgid "And now I have eaten and am not hungry." -msgstr "" +msgstr "空腹は解消できたな。" #: lang/json/snippet_from_json.py msgid "That food was good, but I miss real restaurants." -msgstr "" +msgstr "美味しい食事だったけど、本物のレストランが恋しいな。" #: lang/json/snippet_from_json.py msgid "Well, that satisfied me." -msgstr "" +msgstr "よし、満腹だ。" #: lang/json/snippet_from_json.py msgid "" "I just had some food, but I'm still peckish. Would you mind if I ate more?" -msgstr "" +msgstr "さっき食べたばかりなのに、まだ腹が減ってるな。もう少し食べてもいい?" #: lang/json/snippet_from_json.py msgid "Hey, , we're out of food." -msgstr "" +msgstr "ねえ、、備蓄食料が切れたよ。" #: lang/json/snippet_from_json.py msgid "Hey, the larder is empty! We're going to starve." -msgstr "" +msgstr "ちょっと、備蓄食料が空だ!飢え死にしてしまうよ。" #: lang/json/snippet_from_json.py msgid "" "Uhm, , I don't meant to criticize, but we should focus on " "distributing some food into the basecamp larder." -msgstr "" +msgstr "その、、批判するつもりじゃないけど、拠点の備蓄食料を集めることを優先するべきじゃないか。" #: lang/json/snippet_from_json.py msgid "right on top of us!" -msgstr "" +msgstr "は真上だ!" #: lang/json/snippet_from_json.py msgid "right there!" -msgstr "" +msgstr "はそこだ!" #: lang/json/snippet_from_json.py msgid "danger close!" -msgstr "" +msgstr "が近くに!" #: lang/json/snippet_from_json.py msgid "almost in melee range!" -msgstr "" +msgstr "がもうすく射程距離内だ!" #: lang/json/snippet_from_json.py msgid "too close for comfort!" -msgstr "" +msgstr "が近すぎる、マズい!" #: lang/json/snippet_from_json.py msgid "within shooting range." -msgstr "" +msgstr "が射程距離内に入った。" #: lang/json/snippet_from_json.py msgid "only a couple of seconds' away." -msgstr "" +msgstr "が肉薄してる。" #: lang/json/snippet_from_json.py msgid "just a bit away." -msgstr "" +msgstr "がすぐそこにいる。" #: lang/json/snippet_from_json.py msgid "closer than I'd like." -msgstr "" +msgstr "が近くに居る、マズいな。" #: lang/json/snippet_from_json.py msgid "near enough to see us." -msgstr "" +msgstr "は目と鼻の先だ。" #: lang/json/snippet_from_json.py msgid "quite a bit away." -msgstr "" +msgstr "はかなり遠くにいるな。" #: lang/json/snippet_from_json.py msgid "maybe within shooting range." -msgstr "" +msgstr "が射程距離内に入ったかもしれない。" #: lang/json/snippet_from_json.py msgid "at a good distance." -msgstr "" +msgstr "と程よい距離が取れている。" #: lang/json/snippet_from_json.py msgid "far enough away that we could make sneak away." -msgstr "" +msgstr "はかなり遠くにいる。こっそり離れられそうだ。" #: lang/json/snippet_from_json.py msgid "out on the horizon, so don't worry much." -msgstr "" +msgstr "は地平線の向こうだ。心配ないよ。" #: lang/json/snippet_from_json.py msgid "at a long distance." -msgstr "" +msgstr "は遠くにいるな。" #: lang/json/snippet_from_json.py msgid " will use ranged weapons." @@ -150776,6 +155063,311 @@ msgstr "は可能な限り敵と戦いません。" msgid " will follow normal engagement rules." msgstr "は通常の戦闘規則に従います。" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "それはいいな、ビールを飲もうじゃないか。" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "そうだな。ビールを用意しないか?" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "ああ、君が持ってるビールを分けてくれるなら、好きなだけ話そう!ハハ、冗談だよ。" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "ねえ、冷たいビールがあればお喋りはもっと盛り上がるだろうな。" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "雑談中にビールを空ければ...世界の崩壊について悩まずにいられそうだな。" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "、こっちにも一缶くれないか。" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "ああ、この暑さには参るよな?" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "夏を満喫しよう。" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "正直、もう少し涼しくなればいいのにと思うよ。" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "いいよ。話していれば凍えずに済むからな。" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "そうそう、雪は嫌いじゃないんだ。" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "ゾンビが凍らないのは変だよな。" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "ええと、かなり体調が悪いんだけど...分かったよ。" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "ちょうど息抜きしたかったんだけど、そっちも?" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "それで、調子はどう?" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "くだらない話をしよう!も話したいよな?" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "ああいいよ。元気でやってる?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "数分ぐらいならいいよな。元気かい?" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "よし、、元気かい?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "もちろん良いよ。話していれば君も胸のつかえが取れるだろ?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "いつでも語り合う準備はできてたよ!でもどうしたんだ、大丈夫?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "分かったよ、。調子はどう?" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "いいね。調子はどう?" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "しばらく世界の惨状は忘れよう。調子はどう?" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "そりゃいいや。最近調子はどう?" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "ええと、じゃあ、天気の話でもする?" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "時間を作ってくれてありがとう。最近どう?" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "ちょうど脚が疲れてきたんだ。そっちも?" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "今日は最高の気分だ。何故かは分からないけど、かなり良い感じだよ。" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" +"世界が終わったなんて信じられないよ。全てが崩壊したあの日のことが頭から離れないんだ。暴動。デマ。狂人。こんなことになるなんて思いもしなかった。" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" +"世界が終わる前に出回ってた噂に真実が混じってるとか、思ったことある?確か水道水に洗脳薬が混じってるとか、バイオテロとかだったかな?筋の通った話もあるけど、非現実的すぎる。なんたって、こっちは本物のゾンビを相手してるんだからな。" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "この状況でもっと信心深くなるべきなのか、それとも信仰を捨てるべきなのか、悩んでるんだ。はどう思う?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "荷物の整頓について考えてた。散らかりすぎだ。武器を取ろうと思ったらチョコバーだったなんて、嫌だろ?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "どうしてこんなに悩んでるんだって、不思議に思たことはないか?どうせ最後はゾンビになるのに、戦うのを止めない。何か意味があるんだろうか?" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "今すぐゾンビの群れに突っ込んで、弾丸をぶち込んでやりたいよ。もちろん大騒動になって命の危険に晒されるのは無しで。" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "目を閉じる度に、暴動の様子が浮かぶんだ。私だけだろうか。分かってくれるか?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "世界が崩壊する前までに過ごしてきた時間が、全部夢だったんじゃないかって思ったことない?" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "世界が終わるんだと実感したのはいつだった?私は、YouTubeで赤ん坊を殺す女を見たときだ。酷いもんだよ、なぁ?" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "政府の役人は今もどこかの地下壕に引きこもってるんだろうか。" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" +"世界が終わった時に流れていた狂ったニュースを覚えてるか?暴動事件の話にかき消されてしまったようだけどね。ほら、ロードアイランド州の知事が合衆国から独立するとか宣言してただろ?" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" +"ゾンビは、人間だった頃の自分を覚えてるんじゃないだろうか。そして、死体の中に意識だけ閉じ込められて、自分のやったことを見続けるんだ。気になって眠れないよ。" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "洗脳薬を水道水に入れて暴動を引き起こしたって話があったけど...あの薬は今も水道水に残ってるんだろうか?" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" +"誰がこんなことを引き起こしたのか、考えずにはいられないな。ニュースは信用できない。ゾンビのことを「暴徒」だと何週間も主張し続けていたからな。原因は何だ?ゾンビの起源とは?" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" +"中国についての噂に少しでも真実があるなら、中国の国内もこんな感じなんだろうか?それともアメリカが隔離所みたいな扱いになっていて、世界のどこかは今も無事なのか?" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" +"ケガの治り方がいつもと違うことに気づいたか?世界が崩壊する前から兆候はあったが、より顕著になってきた。傷が塞がる過程で肉芽組織がほとんど形成されないなんて事があるのか。" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "ゾンビがどうやってエネルギーを得ているのかまだ理解できない。まるで永久機関だ。" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" +"パズルのピースがなかなか嵌らないな。誰がゾンビを作ったのか?エネルギー源は?洗脳薬の噂は本当だったのかもしれない。もしくは、生物工学者が死者を生き返らせる方法を見つけたのかな。" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "ゾンビたちはどうやって動いてるんだ?何を食べている?いつかは腐って動かなくなるんだろうか?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "最近は、トイレットペーパー不足が心配だな。どう思う?" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "密室になってる建物を開けたら中にゾンビが1体いるなんて、変だと思わないか?どうやって入ったんだ?" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" +"時々思うんだけど、発狂して暴れた奴以外も、人類全員が精神異常者になったんじゃないか?世界が崩壊してからこんなに好き放題できるなんて思わなかったよ。" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "最近は何か面白い本を読んだ?本が残っていてほっとしたよ。" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" +"何か恋しいものはある?私は映画館だ。ハリウッドは生き残ってるかな?ゾンビ俳優がいるかも。ゾンビになってもクソ映画を撮り続けてたりして。ハハ、見てみたいな。" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "ちゃんと聞いてるよ、..." + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "色々なことが思い浮かぶよ..." + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "うん、うん。そんなことを考えてたのか..." + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -152096,6 +156688,14 @@ msgid "" msgstr "" "Rivtech社の弾薬の広告です。装甲板の真ん中に穴が開いており、その横には派手な色の弾薬が写っています。見出しには「Rivtechの8x40mmケースレス弾。圧倒的な威力」と書かれています。" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -152106,6 +156706,21 @@ msgid "" msgstr "" "ノースロップ社の支援ロボット軍事モデルの広告です。フェンスを背景に暗緑色で特徴的なクモの巣状の模様が描かれた機体が載っています。機体は背後の地平線に浮かぶ黒い影を捉え、小型のロボットを高速で射出しています。見出しには「あなたを守るためにここにいる」と書かれています。" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -155188,6 +159803,341 @@ msgstr "スタイル" msgid "-chant" msgstr "チャント" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" +"ひどく変異した動物の肉です。締まりのないスポンジのような質感が不安ですが...とりあえず臭いは、おおむね普通です。見たこともない奇妙な瘤や器官も混ざっており、肉の内部に固まった骨や毛を見ると、まるで別の生物を生み出そうとしていたかのように思えます。まったく食用に向かない部分を取り除いて調理すれば、少なくとも消化は可能です。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" +"この動物の肉は酷く変異しています。筋肉組織に奇妙な渦巻き模様を描く粒が混じっており、粒の中心部には硬い軟骨の瘤があります。不快なにおいが漂っています。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" +"この動物の肉は酷く変異しています。筋肉と筋肉の間にある筋膜組織から、太い棘のような毛が生えています。毛を抜く度に、悪臭を放つクリーム色の液体が噴出します。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "この動物の肉は酷く変異しています。筋線維が太い紐のような形状に変わっており、革、あるいはパンに生えるカビのような臭いがします。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" +"変異した動物の肉を調理したものです。スポンジのような質感が不安ですが、味に関しては...おおむね普通です。毛や骨などの食用に向かない部分は、ちゃんと取り出せているはずです..." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" +"変異した動物の肉を調理したものです。不味そうな器官は全部取り除いたと思っていましたが、内部に隠れていた嚢が調理中に破裂して油のような液体が漏れ、肉がベトベトになってしまいました。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "変異した動物の肉を調理したものです。食べられそうな部分だけを切り出し、コショウを塗しました。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "変異した動物の肉を調理したものです。熱によって筋線維がまるで生きているかのように捻じれ、硬く密集してしまいました。" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" +"変異した巨大昆虫から取り出した器官です。何に使えばいいのか見当もつきません。解剖学の本には載っていないようなものばかりで、棘や毛のような正体不明の物体が無造作に飛び出しています。" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" +"変異した巨大昆虫から取り出した器官です。気味の悪い緑色をしており、解体した際に一部の表面が裂けており、中には人間の指や爪のように見える部位が列になって生えています。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" +"変異した巨大昆虫から取り出した、巨大な肉厚の嚢です。表面は柔らかく滑らかな皮で覆われており、その下で紐状の組織がコイルのように絡み合っているのが見えます。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "変異した巨大昆虫から取り出した、長い紐状の器官です。頭から腹部まで伸びており、脊髄にあたる位置からは複数の長い触手が飛び出しています。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" +"変異した生物から取り出した、肉付きの良い灰色の器官です。皮膚を刺激する白っぽい黄色のコーティングに塗れており、肉質のチューブのようなものが複数突き出ています。鼻を突くにおいが漂っており、これが自然界に存在する生物の器官ではないことが確信できます。" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" +"変異した生物から取り出した、長い肉質の管の上に小型哺乳類の心臓が並んでいるような姿の器官です。管の先端には、胃のようにも見える大きな肉嚢が繋がっています。" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" +"間違いなく肺であると考えられます。イヌのような大型哺乳類の肺に近いですが、数十個の小葉が板状に並んでおり、奇妙な細い棘や枝分かれした突起物が表面に点在しています。" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" +"間違いなく肺であると考えられます。どことなく「翼」に似た形状をしており、先端にあたる部分には小さな節が並んでいます。表面に生えた羽毛のような素材が、この器官を虫の外殻に固定していました。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "変異した虫の外骨格の一部です。内側には血管と奇妙な鉤状の突起が並んでいます。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "変異した虫の外骨格の一部です。内側には神経組織や筋状の血管が貼り付いたままになっています。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "巨大な虫の内部に入っていた、管状の硬いキチン質です。支柱のような役割を果たしていたようですが、普通の虫にこんな部位はないはずです。" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "変異した巨大な虫の内部に入っていた、長く柔軟なキチン質の棒です。血管や結節が混じっています。" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "外殻を剥がすと、キチン質の装甲に沿って血管が通っていることが分かります" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "既に死んでいるためか、外殻は驚くほど簡単に剥がれました" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "この生物のもつキチン質の表面には、皮膚のような薄い膜が貼り付いています" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "この変異体の外殻の下には、マジックテープのような剛毛が生えています" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "隠されていた肉体は、まるで甲羅を被せられて節足動物のように捻じ曲げられた小さな哺乳類のようです" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "ロブスターの怪物の殻を剥くように、生物を解体しました" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "キチン質はこの生物にしっかりと貼り付いているようです。接着面の丈夫な繊維をノコギリで引きちぎる必要がありそうです" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "体内には、一般的な節足動物の肉にはとても見えない海綿体のような物質に張り付いた、成形途中のような臓器が入っていました" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "鉤状の棘の集合体が、上手く器官を支えていたようです" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" +"内部は、いまだに震え続ける奇妙な臓器や器官がぐちゃぐちゃに混ざった複雑な構造になっており、自然界のどんな生物の構造とも似ていないことが分かります" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "キチン質の下には、成形途中のような姿の器官がめちゃくちゃに並んでおり、それらの表面は剛毛で覆われています" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "内部では、一般的な生物のものとは思えない臓器や組織が複雑に絡み合っています" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "内部には、虫というより大型哺乳類のものに近い肺や心臓、腸が入っていました" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "内部の肉はおぞましい悪臭を放っています。臓器は湿った細い毛に覆われており、何か酷い間違いによって誕生した新種生物のものに見えます" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "捻じれた繊維のの束を裂いてみると、内部には、この生物の姿を模した成形途中の肉が入っていました" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "道具を使っているとスポンジ状の組織がすぐに崩れてしまうため、難しい作業を強いられています" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "外殻を引っ張り上げると、酸性の液体が飛び散りました" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "キチン質を剥がすと、酸性の液体が噴出しました" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "外殻を剥がすと、酸を溜めていた腺が破裂し、液体が湯気を立てながら周囲に飛び散りました" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "内臓からは刺激臭が漂っていますが、外殻から出たような酸性の液体はないようです" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "酸を分泌する腺のような器官を破らないように、注意深く作業を進めました" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "キチン質の下にある太いロープ上の組織が、鳥類の器官によく似た部位を包み、保護しています" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "死体から出る強酸性の蒸気に阻まれて、作業がなかなか進みません" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "この生物の体内にあるのは成形途中のような形状の器官ばかりで、どれが何のための臓器なのかさっぱり分かりません" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "酸がたっぷり詰まった腺を何度か破ってしまい、危うく火傷をするところでした。" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +"。" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +"。" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -160273,35 +165223,35 @@ msgstr "「久しぶり、だよね?また会えてよかった。」" msgid "" "I've seen some big dinosaurs out there. I know that should be scary, but " "all I felt was hungry." -msgstr "" +msgstr "野外で大きな恐竜を見かけたんだ。怖かったはずなんだけど、空腹感が勝ったね。" #: lang/json/snippet_from_json.py msgid "" "I think those little dinosaurs are kind of cute, like a cat kind of. Do you" " think they eat cat food?" -msgstr "" +msgstr "小さな恐竜はネコみたいなもんだから、かわいいよ。恐竜はキャットフードを食べるかな?" #: lang/json/snippet_from_json.py msgid "Dinosaurs are a bow hunter's best friend. Feathers forever!" -msgstr "" +msgstr "弓使いは恐竜が大好き。羽根がたくさん生えてるからね!" #: lang/json/snippet_from_json.py msgid "" "A buddy of mine wandered close to the swamps and was eaten by a T-Rex, a big" " lizard. I'd be careful unless you have a gun and plenty of ammo." -msgstr "" +msgstr "相棒が沼地に迷い込んで、T-レックスっていう大きなトカゲに喰われてしまったんだ。銃とたくさんの弾薬を持っていないなら、気を付けるべき敵だ。" #: lang/json/snippet_from_json.py msgid "" "I hear the zombies have been in the swamps. Bad news if they bite a " "dinosaur before it bites them." -msgstr "" +msgstr "沼地にもゾンビがいるらしいな。ゾンビが恐竜を噛んだとしたら、ヤバいことになりそうだ。" #: lang/json/snippet_from_json.py msgid "" "I know there aren't alligators in the sewer, but I heard there was some kind" " of big lizard down there. Probably not a good idea to check." -msgstr "" +msgstr "下水道にワニはいないだろうが、大きなトカゲはいるそうだ。覗いてみようなんて思わない方がいい。" #: lang/json/snippet_from_json.py msgid "" @@ -160309,12 +165259,13 @@ msgid "" "something nice and gave them a pet you could ride them like a pony. Or " "maybe they'd eat you instead." msgstr "" +"大型恐竜の中には、結構聞き分けの良さそうな奴もいる。何か餌を食べさせてペットにすれば、ポニーみたいに騎乗できるんじゃないか?失敗すればこっちが食べられるだろうけど。" #: lang/json/snippet_from_json.py msgid "" "One time I found a strange egg out in the woods. It was probably a " "dinosaur, but I cooked it and it was pretty good!" -msgstr "" +msgstr "森の中で、奇妙な卵を見つけたことがある。恐竜の卵だったのかもしれないけど、調理したら結構おいしかったよ。" #: lang/json/snippet_from_json.py msgid "" @@ -160331,6 +165282,7 @@ msgid "" "were already prepared and are proceeding ahead of schedule. The hosts are " "most receptive to improvement." msgstr "" +"訪問者たちの研究は着実に進んでいる。大型レーザー作戦は十分な資金を得られなかったが、次善策の改造兵士については既に準備が整っており、予定よりも前倒しで進んでいる。改造希望者は多数用意できる。" #: lang/json/snippet_from_json.py msgid "" @@ -160374,7 +165326,7 @@ msgstr "「どうしてここでクソトカゲが這いまわってるんだ? msgid "" "\"I bet dinosaurs can read and play chess so don't eat us because we can " "teach you important things like magnets and ramen\"" -msgstr "" +msgstr "「きっと恐竜は文字も読めるしチェスもできるんだ磁石とかラーメンとか大事なことを教えてやるから食べないでくれ頼む」" #: lang/json/snippet_from_json.py msgid "\"where's some .700 t-rex medicine when you need it?\"" @@ -160396,6 +165348,7 @@ msgid "" "charming way. The Swampers are doing their part in this crisis and are " "accepting donations of meat and money to feed the hungry." msgstr "" +"『行方不明者多数』今話題の宗教団体「スワンパーズ」のメンバーやその系列ホテル、カジノチェーン関係者らが行方不明になったという報告は日に日に増加しており、トラブル続きの我が国を震撼させています。コメントを求められたカリスマCEO、ボー・バロニックス氏は行方不明者の所在の説明については拒否し、「大喰らい共が帰ってきた。きっと満足するだろう」とだけ述べ、ウインクして微笑みました。" #: lang/json/snippet_from_json.py msgid "" @@ -160406,6 +165359,7 @@ msgid "" "died out millions of years ago but 'at this point why not, at least they're " "cute'. And cute they are!" msgstr "" +"『かわいい訪問者』本日、クリテイシャス幼稚園上空に青色のエネルギー波と光を点滅させる神秘的なポータルが出現し、子供たちのもとにモコモコとした小さなかわいい恐竜やその幼体が降り注ぎました。地元の古生物学者でありストリッパーでもあるオスニエル・マーシュ氏は、恐竜は数百万年前に絶滅していなかったとする懐疑論を表明しましたが、「とにかく、少なくともこの生物がかわいいことは確かです」と述べました。確かに、かわいいですね!" #: lang/json/snippet_from_json.py msgid "" @@ -160414,6 +165368,7 @@ msgid "" "and 'possibly drug-related' but cautioned refugees to 'get all the guns you " "can' because 'it's bad out there'." msgstr "" +"『恐竜騒動を否定』FEMA職員のエルンスト・ストーマー氏は昨夜未明、都市部が危険な状態であること、郊外での恐竜の目撃報告は勘違いであり「麻薬に関連している可能性がある」ことを発表しました。ストーマー氏は避難者に対して「外出は危険です。できる限り銃を用意してください」と注意を促しました。" #: lang/json/snippet_from_json.py msgid "" @@ -163381,6 +168336,10 @@ msgstr "LMOEシェルター(地下室)" msgid "Middle of Nowhere" msgstr "郊外" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "無人島" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "実験区画" @@ -163526,11 +168485,11 @@ msgid "Acolyte." msgstr "修行者よ。" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "戻ってきたな。歌を聞きに来たのか?" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "そこのお前。静かに。この歌が聞こえるか?" #: lang/json/talk_topic_from_json.py @@ -163565,8 +168524,8 @@ msgstr "もう行くよ。お気をつけて、占い師さん。" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "注意深く耳を傾けろ。骨たちが...歌っている。聞こえるか?歌っているだろう?物語が聞こえるだろう?" #: lang/json/talk_topic_from_json.py @@ -163579,11 +168538,11 @@ msgstr "ええと...ああ、そうだね。もう行かないと。" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" "大変動が起きた時、あらゆるものが...変化した。あらゆる生物の骨は大抵、歌を歌う。生物は破壊され、変化し、再び立ち上がる。無限の輪廻だ。死人が生き返り歩きだす。化け物たちが互いを引き裂きあう。よく観察すれば、野蛮な力が共鳴して静かに震えているのが分かるはずだ。骨を取れば、輪廻の輪は断ち切られる。その物語や、歌や、力がお前のものとなる。" @@ -163602,11 +168561,11 @@ msgstr "ええと、そうだな、その話を信じている人は他にもい #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" "骨を潰せば、その持ち主が再び立ち上がることはない。骨を調べれば、その持ち主に何があったのか分かる。すなわち、物語だ。変化を引き起こす源は生きており、私たちすべての中で動き、この新世界を構成する必然的な一要素となっている。それは変化の力を持っている。すなわち、強さだ。二つが合わさり...美しい歌となる。" @@ -163616,7 +168575,7 @@ msgstr "同意できるかはともかく、あなたが言いたいことは伝 #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "この主張に同意する者は存在する。彼らを助けよ。我らは多数ではないだろうが、歌に導かれて力を得る。" @@ -163630,10 +168589,10 @@ msgstr "主張?どうして骨を集めるんだ?" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" "歌は様々な方法で形を成す。骨を彫って作った魔除けや武器、防具は計り知れぬ力を秘めている。時が来れば私や私の縁者たちが数多の歌を集めて歌い、世界を復元し、あるいは終焉させる。復元と終焉。そこに違いはない。" @@ -163644,7 +168603,7 @@ msgstr "世界の終焉?何だって?" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" "一つの歌に十分な力を集めれば、大変動を巻き戻す...もしくは、時を加速させ、全てを終わらせることができる。どちらも等しく世界の終焉だ。しかし、望ましいのは、どちらの選択肢も選べる現状の世界だ。" @@ -163661,8 +168620,8 @@ msgstr "狂人め。" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" "受け入れてくれるのだな。この上なく良い心がけだ。きっと、お前もいつか歌の力を感じ、我らの縁者となるだろう。修行者よ、歌を感じ取れるよう、今は耳を傾け続けなさい。" @@ -163673,9 +168632,9 @@ msgstr "あ...ありがとう。" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" "お前が疑うのももっともだ。きっと、お前もいつか歌を聞き、その力を感じる時がくるだろう。だがそれまではお前は修行者であり続け、縁者への道は閉ざされたままだ。" @@ -163683,6 +168642,12 @@ msgstr "" msgid "Yeah, alright." msgstr "ああ、そりゃいいや。" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "歌は...今のところ聞こえないな。恐らく時間が経てば、この世界の骨にもっと多くの記録が刻まれることだろう。" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "修行者は一度に多くの歌を歌うべきではない。" @@ -163692,10 +168657,8 @@ msgid "That is all for now." msgstr "今は話すことはない。" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." -msgstr "歌は...今のところ聞こえないな。恐らく時間が経てば、この世界の骨にもっと多くの記録が刻まれることだろう。" +msgid "There are bones to etch, songs to sing. Wish to join me?" +msgstr "彫る骨と、奏でる歌がある。我らに加わるか?" #: lang/json/talk_topic_from_json.py msgid "Do you wish to take on more songs?" @@ -163706,8 +168669,8 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "これ以上の骨をお前に負担させられると思っているのか?" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" -msgstr "彫る骨と、奏でる歌がある。我らに加わるか?" +msgid "A song may yet be sung by you, should you wish to." +msgstr "お前が望むなら、歌うこともできるだろう。" #: lang/json/talk_topic_from_json.py msgid "There is an additional song you could take on, if you'd like." @@ -163718,10 +168681,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "もっと知りたいのなら、役に立つかもしれない骨について心当たりがある。" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "お前が望むなら、歌うこともできるだろう。" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "なるほどね。" @@ -163734,15 +168693,6 @@ msgstr "話してくれ。" msgid "Perhaps another time, Seer." msgstr "またいつか会おう、占い師さん。" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" -"悟りへの道を歩むなら、まず歌に耳を傾け学びなさい。旅立ち、生き物を解体し、指先で力を感じ取りなさい。そして骨を持って来なさい。彫刻を作ってあげよう。" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "ああ、その話をもっと詳しく知りたい。協力するよ。" @@ -163751,10 +168701,6 @@ msgstr "ああ、その話をもっと詳しく知りたい。協力するよ。 msgid "Not interested." msgstr "興味が無いね。" -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "素晴らしい。さあ取り掛かるのだ。" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "仕事は終わったけど、私からも尋ねたいことがある..." @@ -163771,21 +168717,13 @@ msgstr "私の活動に役立つ道具を分けてもらえない?" msgid "I'm off then." msgstr "もう行くよ。" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" -"いたるところで見かける動く死体は、敵意を持って動いている。あれらの歌を聞くのもいいが、修行の身には堪えよう。自然のままの生き物を狙うといい。" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "つまり、ゾンビでも怪物でもない普通の生物だな。分かったよ。" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "悟りへの道はお前自身で歩め。私の助けはお前の歩みを妨げ、お前の歌を迷わせることになる。" @@ -163796,7 +168734,7 @@ msgstr "なるほど。よく分かったよ。" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "私はお前に印を与えた。つまり、お前が歌を聞く方法を学び取れるかもしれないという事だ。そうだな、私の力を貸し与えよう。" #: lang/json/talk_topic_from_json.py @@ -163811,11 +168749,6 @@ msgstr "そう言ってもらえると嬉しいよ。さあ行こう。" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "良い提案だが、今は一人で取り組みたいことがある。またいつか聞いてくれ。" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "気が進まないことは理解できる。道を見出したらまた来なさい。" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "どうだろうな。話を変えよう..." @@ -163827,14 +168760,14 @@ msgstr "なるほど。私はもう行くよ。" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" "大変動で変わったのは、歩く死体や怪物だけではない。ある種の...輪廻が生まれたのだ。全ては繰り返される。自分自身の輪廻は知覚できないが、我ら全て、つまりお前にも、私にも起こることだ。お前は何度倒れた?お前は身体から肉を剥がされ、食い尽くされる。あるいはかすかな呻き声とともに死に絶える。だが、お前の骨は再び立ち上がる。異なる肉、異なる名、時には異なる記憶を同じ骨に纏って。我らは皆同じ輪廻に囚われている。ただ忘却し続ける。だからこそ、我らは歌を集める必要がある。それが、復活ではなく破壊を意味するとしても終焉を目指さねばならない理由だ。" @@ -163864,6 +168797,14 @@ msgstr "その話はもういい。" msgid "Skip it, let's get going." msgstr "その話はもういい、そろそろ行こう。" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "この世界で生き抜くために役立つ話はある?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "拠点について話そう。" + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "「大抵の」指示とは、どういう意味だ?" @@ -164069,7 +169010,7 @@ msgstr "医薬品の渡し方を教えてくれ。" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -164274,8 +169215,8 @@ msgstr "やあ、。" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "止まれ、両手を上にあげろ!ああ、驚かせてしまったな...もう法律なんて無いのに..." #: lang/json/talk_topic_from_json.py @@ -164297,7 +169238,7 @@ msgstr "もう行かないと。" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "事が起こったとき、私は持ち場で見張り中だった。連絡を入れても警官は誰一人戻らず、それどころか人間は一人残らずいなくなった..." #: lang/json/talk_topic_from_json.py @@ -164351,7 +169292,7 @@ msgstr "" "ああ、私のように街で立て籠もってる奴がいる。何度か取引をしたが...たまに知らない放浪者も来て、自分が置き去りにしたものより良い商品がないかとチェックしているな。" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." +msgid "No, just no…" msgstr "やめろ、おい やめろ..." #: lang/json/talk_topic_from_json.py @@ -164363,7 +169304,7 @@ msgid "Make it quick, I want to go back to sleep." msgstr "まだ眠いんだ、すぐにでも寝直したいよ。" #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." +msgid "Just few minutes more…" msgstr "あと5分..." #: lang/json/talk_topic_from_json.py @@ -164394,14 +169335,14 @@ msgstr "はい、起こしてください!" msgid "no, go back to sleep." msgstr "いいえ、眠らせておいてください。" -#: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" -msgstr "何だい、友よ?" - #: lang/json/talk_topic_from_json.py msgid " *pshhhttt* I'm reading you boss, over." msgstr "...ザザザザ...ちゃんと聞こえているよ、どうぞ。" +#: lang/json/talk_topic_from_json.py +msgid "What is it, friend?" +msgstr "何だい、友よ?" + #: lang/json/talk_topic_from_json.py msgid "I want to give you some commands for combat." msgstr "戦闘時の指示を出したい。" @@ -164410,6 +169351,68 @@ msgstr "戦闘時の指示を出したい。" msgid "I want to set some miscellaneous rules." msgstr "その他の規則を設定したい。" +#: lang/json/talk_topic_from_json.py +msgid "I'd like to know a bit more about your abilities." +msgstr "あなたについてもっと詳しく知りたい。" + +#: lang/json/talk_topic_from_json.py +msgid "There's something I want you to do." +msgstr "やってほしいことがあるんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "I just wanted to talk for a bit." +msgstr "ちょっと話がしたくなったんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Can you help me understand something? (HELP/TUTORIAL)" +msgstr "色々と教えてもらえないか?(ヘルプ/チュートリアル)" + +#: lang/json/talk_topic_from_json.py +msgid "I'm going to go my own way for a while." +msgstr "当分は一人で行動させて欲しい。" + +#: lang/json/talk_topic_from_json.py +msgid "Let's go." +msgstr "行こう。" + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" +msgstr "*ザザッ* 冗談だろ?これは携帯電話じゃないんだ。直接会った時にしてくれないか?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what did you want to say?" +msgstr "分かったよ、何の話だ?" + +#: lang/json/talk_topic_from_json.py +msgid "Mind if we just chat for a bit about your history?" +msgstr "あなたの過去について話してもらえないか?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's just chitchat for a while, I could use some relaxation." +msgstr "気分転換に、少し雑談でもしようか。" + +#: lang/json/talk_topic_from_json.py +msgid "I changed my mind, wanted to ask you something else." +msgstr "気が変わった、他に聞きたいことがあるんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "I'm all ears, my friend." +msgstr "友よ、ちゃんと聞いてるよ。" + +#: lang/json/talk_topic_from_json.py +msgid "You gonna give me orders?" +msgstr "何か指示を出してくれるのか?" + +#: lang/json/talk_topic_from_json.py +msgid "What would you like?" +msgstr "用事は何だ?" + +#: lang/json/talk_topic_from_json.py +msgid "Just say the word." +msgstr "詳しく言ってくれ。" + #: lang/json/talk_topic_from_json.py msgid "Can you teach me anything?" msgstr "何か教えてくれないか?" @@ -164434,14 +169437,6 @@ msgstr "この場所を見張ってくれ。" msgid "I want to assign you to work at this camp." msgstr "この拠点で仕事をしてくれ。" -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." -msgstr "現在の行動について話そう。" - -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "拠点について話そう。" - #: lang/json/talk_topic_from_json.py msgid "Find a horse and mount up!" msgstr "ウマを探して騎乗しろ!" @@ -164455,32 +169450,20 @@ msgid "Please go to this location." msgstr "この場所へ向かってくれ。" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." -msgstr "あなたについてもっと詳しく知りたい。" - -#: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" -msgstr "この世界で生き抜くために役立つ話はある?" - -#: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" -msgstr "あなたの過去について話してもらえないか?" - -#: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." -msgstr "気分転換に、少し雑談でもしようか。" +msgid "I want you to build a camp here." +msgstr "ここに拠点を作ろう。" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." -msgstr "あなたへの指示について教えてくれ(NPCチュートリアル)。" +msgid "We need to abandon this camp." +msgstr "この拠点を放棄しよう。" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "当分は一人で行動させて欲しい。" +msgid "Show me what needs to be done at the camp." +msgstr "拠点でやるべきことを教えてくれ。" #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "行こう。" +msgid "Let's talk about your current activity." +msgstr "現在の行動について話そう。" #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -164638,15 +169621,15 @@ msgstr "必要なら敵の近くへ移動して戦え。" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "後ろに下がるな。私の移動の邪魔になる地点へ移動するな。" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "何でもない。" @@ -164850,14 +169833,14 @@ msgstr "その話は忘れてくれ。さあ行こう。" msgid "OVERRIDE: " msgstr "上書き: " -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -165022,10 +170005,6 @@ msgstr "この場所へ向かってくれ..." msgid "Stay at your current position." msgstr "その場に留まってくれ。" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "拠点でやるべきことを教えてくれ。" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "私は現在、をしている。" @@ -165098,60 +170077,6 @@ msgstr "...ザザザザ...了解、指定された場所へ向かう、どうぞ msgid "Sure thing, I'll make my way there." msgstr "分かった、指定された場所へ向かう。" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "ああ、この暑さに私も参っていたんだ。ちょっと休憩しよう。、調子はどう?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "いいよ。話していれば凍えずに済むからな。最近どう?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "そうだな、そろそろ息抜きの時間だ!最近調子はどう?" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "まだ日は落ちていないようだな?調子はどう?" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "その、今はかなり体調が悪いんだけど...それでもやるのか?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "よし、そうだな、私の依頼をたくさん引き受けてくれてありがとう!それで、の調子はどう?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "よし、すこし休憩しよう。ああ、そうだ、頼みを聞いてくれてありがとう。それで...調子はどう?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "今なら少し時間があるな。思えばもう1か月くらいは経ったんだな...これから先、どうするつもりなんだ?" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "なるほどね、悪くない、悪くないよ..." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -165206,21 +170131,21 @@ msgid "Hello there." msgstr "やあ、君か。" #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." +msgid "Okay, no sudden movements…" msgstr "よし、急に動いたりはするなよ..." #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "近寄るな!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "ここはうちのシマだ、。" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "ここはうちのシマだ、。" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "落ち着けよ。君を傷付けるつもりはないよ。" @@ -165273,30 +170198,30 @@ msgstr "どうした?" msgid "I don't care." msgstr "どうでもいいね。" +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "特に頼みたい事はないね。" + #: lang/json/talk_topic_from_json.py msgid "I don't have any more jobs for you." msgstr "頼みたい事はそれだけだ。" #: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "特に頼みたい事はないね。" +msgid "I have other jobs for you. Want to hear about them?" +msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" #: lang/json/talk_topic_from_json.py msgid "I have more jobs for you. Want to hear about them?" msgstr "他にも頼みたい事があるんだ。聞いてくれるか?" #: lang/json/talk_topic_from_json.py -msgid "I have other jobs for you. Want to hear about them?" +msgid "I have another job for you. Want to hear about it?" msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" #: lang/json/talk_topic_from_json.py msgid "I just have one job for you. Want to hear about it?" msgstr "1つ頼みたい事があるんだ。聞いてくれるか?" -#: lang/json/talk_topic_from_json.py -msgid "I have another job for you. Want to hear about it?" -msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" - #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -165306,6 +170231,10 @@ msgstr "ああ、分かったよ。" msgid "Never mind, I'm not interested." msgstr "いいや、興味ないね。" +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "頼んでいる仕事は今のところ何もないよ。" + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "どの依頼の話だ?" @@ -165314,10 +170243,6 @@ msgstr "どの依頼の話だ?" msgid "What about it?" msgstr "何だ?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "頼んでいる仕事は今のところ何もないよ。" - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "いいだろう、引き受けたよ!" @@ -165526,6 +170451,10 @@ msgstr "ふーん、分かった。" msgid "Thanks!" msgstr "ありがとう!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "相棒、運転に集中してくれ!" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "運転に集中させてくれ!" @@ -165550,16 +170479,12 @@ msgstr "今は何も思いつかないな。後でまた聞いてくれる?" msgid "I have some reason for not telling you." msgstr "ちょっと理由があって話せないんだ。" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "相棒、運転に集中してくれ!" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "あぁ、分かった。" #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." +msgid "Not until I get some antibiotics…" msgstr "抗生物質さえあれば..." #: lang/json/talk_topic_from_json.py @@ -165658,22 +170583,22 @@ msgstr "いや、ここでいい。" msgid "On second thought, never mind." msgstr "ただの思い付きだ、気にしないでくれ。" +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "車両を運転している間は、ちゃんと訓練できないよ!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "車両を運転している間は、ちゃんと訓練できないよ!" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." +msgid "Give it some time, I'll show you something new later…" msgstr "少し時間をくれないか。後で話をしよう。" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "ちょっと理由があって訓練はできないんだ。" -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "車両を運転している間は、ちゃんと訓練できないよ!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "絶対に嫌だね、付いて行くからな!" @@ -165695,7 +170620,7 @@ msgid "See you around." msgstr "またな。" #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." +msgid "I really don't feel comfortable doing so…" msgstr "申し訳ないが、本当に嫌なんだ..." #: lang/json/talk_topic_from_json.py @@ -165767,7 +170692,7 @@ msgid "Thanks, see you later!" msgstr "ありがとう、それじゃあまた!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." +msgid "You picked up something that does not belong to you…" msgstr "自分の所有物ではないものを拾ったな..." #: lang/json/talk_topic_from_json.py @@ -165861,13 +170786,13 @@ msgid "You might be seeing more of me…" msgstr "これからもよろしく..." #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "また会ったな。*ザザザザ*" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "ワ...私は自由だ。*ザザザザ* 自由なんだ!*ブブブ* 久しぶりに人と会えたよ。" #: lang/json/talk_topic_from_json.py @@ -165889,7 +170814,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "失礼、私には関係ないことだ。存分に自由を満喫してくれ。" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "*ブブブ* もちろん!これからどうするんだ?" #: lang/json/talk_topic_from_json.py @@ -165902,7 +170827,7 @@ msgstr "これからは別々の道を歩もう。自由を満喫してくれ。 #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "...なんだって。*ビィィィ* どうして君を信用したんだろうな?*ザザザザ* 奴らと同じくらい悪人じゃないか!" @@ -165924,8 +170849,8 @@ msgstr "この話は忘れてくれ。自由を満喫するといい。" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" -msgstr "分かった、分かったよ、*ブブブブ* 悪かった!痛いのはもう嫌だ!チップを入れること以外なら何でもする!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +msgstr "分かった、分かったよ、*ブブブブ* 悪かった!痛いのはもう嫌だ!チップの移植以外なら何でもする!" #: lang/json/talk_topic_from_json.py msgid "Follow me and do my bidding, then." @@ -165940,7 +170865,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "いや、私が悪かった。そんなつもりじゃなかったんだ。これからは好きに生きればいい。" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "...お前を...*ザザザザ*...殺す!" #: lang/json/talk_topic_from_json.py @@ -165975,14 +170900,6 @@ msgstr "拠点の仕組みを教えてくれ。" msgid "Tell me how faction camps have changed." msgstr "拠点の仕組みがどう変わったか教えてくれ。" -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "ここに拠点を作ろう。" - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "この拠点を放棄しよう。" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "何でもない。他の話をしよう。" @@ -166256,7 +171173,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "本気か?ここが下らない話ができるほど安全な場所だとは思えないな..." #: lang/json/talk_topic_from_json.py @@ -166279,6 +171196,50 @@ msgstr "何について話そうか?" msgid "Actually, never mind." msgstr "やっぱり何でもない。" +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "友よ、どうしました?" @@ -166300,7 +171261,7 @@ msgid "May the earth flourish beneath our paths." msgstr "我々の旅路のもとで、大地が繁栄しますように。" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "魂、精神、そして肉体の統一..." #: lang/json/talk_topic_from_json.py @@ -166488,11 +171449,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" -"私は農場で育ったから、化け物やゴブリンのことはよく分からない。でも、手間暇かけて農作物を育てているよ。田舎は良いよ。綺麗だし。危険も少ないし。いや、少ないといいな。" +"私は農場で育ったから、化け物やゴブリンのことはよく分からない。でも、手間暇かけて農作物を育てているよ。田舎は良い。綺麗だし。危険も少ないし。いや、少ないといいな。" #: lang/json/talk_topic_from_json.py msgid "Hey, I didn't expect to live long enough to see another living human!" @@ -167070,7 +172031,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "私のことは気にしないで。もう行くよ。" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "確かに私だ!唯一無二のフードパーソン!" #: lang/json/talk_topic_from_json.py @@ -167527,6 +172488,39 @@ msgstr "" msgid "Huh." msgstr "ふぅん。" +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "「今の状況」をまったく理解できない。どうして私が、世界が崩壊したことを知っていると思ったんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "よし、分かった。これまでの経験の中で、覚えていることだけでいいから、教えてもらえるか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" +"何、そんなことも知らないのか?いや、申し訳ない、これじゃ不公平だな。不気味な事件だったよ。始まりは暴動だった、よな?普通に人生を送り、仕事をしていたら、人々が暴動を起こし始めたんだ。一般的な抗議行動とも、暴力的なものでもない。ただ外に出て、滅茶苦茶暴れ出した。ニュースは無視しようとしてたけど、インターネット上はそうもいかなかい。何が原因かは分からないが、水道水に薬だか毒が混入したとか言われてたかな?それでも、最初はこんなに酷くなるとは思いもしなかった。途中で倒れた「暴徒」が立ち上がり、胸に穴が空いたまま歩き出したのが本当の混乱の幕開けさ。その出来事の数日後、いや数週間後か...そこから先が、ぼやけているんだ。他の誰かに、世界が完全に崩壊するまでの状況を尋ねる必要があるな。" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "詳しく教えてくれてありがとう。" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -167582,10 +172576,10 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" -"最終的にはそうだな。周囲は何時間も静かだった。私は喉がカラカラで、怪我もしていたし、何より怖かった。発狂しないで済んだのは日々の訓練のお陰だろうな。私は何とか抜け出して、怪我の程度を見てみようと思ったんだ。簡単だったよ。バンの側面は裂けて外に通じていたし、私を圧し潰していた瓦礫もそこまで大きくはないようだったからね。バンの残骸がテントのように覆いかぶさってくれていたんだ。怪我もそこまで酷くはなかった。私はできる限り装備をたくさん持って、抜け出したんだ。辺りは夜になっていて、街の外からは戦闘しているような音がしたから、中心部に向かった。何ブロックか歩くと、と遭遇したから...逃げ出した。逃げて逃げて逃げ続けて、ここに辿り付いたんだ。" +"最終的にはそうだな。周囲は何時間も静かだった。喉がカラカラで、怪我もしていたし、何より怖かった。発狂しないで済んだのは日々の訓練のお陰だろうな。私は何とか抜け出して、怪我の程度を見てみようと思ったんだ。簡単だったよ。バンの側面は裂けて外に通じていたし、私を圧し潰していた瓦礫もそこまで大きくはないようだったからね。バンの残骸がテントのように覆いかぶさってくれていたんだ。怪我もそこまで酷くはなかった。私はできる限り装備をたくさん持って、抜け出したんだ。辺りは夜になっていて、街の外からは戦闘しているような音がしたから、中心部に向かった。何ブロックか歩くと、と遭遇したから...逃げ出した。逃げて逃げて逃げ続けて、ここに辿り付いたんだ。" #: lang/json/talk_topic_from_json.py msgid "" @@ -167869,6 +172863,32 @@ msgstr "かわいそうなフィルシー・ダン。 msgid "Thanks for telling me that stuff. " msgstr "話してくれてありがとう。" +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" +"ええと、たしか、本当にヤバい暴動があった、んだっけ?皆が暴力的で不快な気持ちに満たされていたな。実を言うと、私は少し精神的な旅に出ていたから、あまり覚えていないんだ。一番奇妙に思ったのは、誰もが互いを*心配*していなかったことだ。人間の思いやりが全部吸い取られてしまったみたいだった。きっとこれは、ある種のネガティブエネルギーの仕業だ。死者を生き返ったのもそのせいだ。それから、ええと、怪物?そこまでは分からないよ。" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "色々知っているみたいだな。原因は何だと思う?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" +"難問だな。でも、世界が終わる一年くらい前に、ある夢を見たことを思い出したんだ。夢の中に出てきた大きな悪のエネルギーは、地球上のあらゆる正の感情を吸い上げようとしていた。きっとそのせいで、人間がモンスターやゾンビになってしまったんじゃないか?そして、今に至る、ということだ。ありえないことが起きてるってことだろう?" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -167921,6 +172941,25 @@ msgid "" msgstr "" "に関しては解決できたと思い込んでいたってことさ。気が大きくなって、段々と遠出をするようになったんだ。ある時叫び声をあげるゾンビが私を見つけて、他の群れを呼び寄せたんだ。その群れに交じってたのが、、フォルクスワーゲンくらいある胴体が全て骨の装甲で覆われた、巨大な獣じみた顔のゾンビだ。あんなの勝てっこない。そのデカブツは他のゾンビ共のせいで身動きが取れていなかったから、大急ぎで拠点に戻ったよ。窓を閉めて鍵を掛けたが、遅すぎた。追ってきたデカブツが壁を叩き壊し始めたんだ。私は持てるものだけ持って、地平線のかなたまで逃げた。去り際に見えたのは、完全に崩れ落ちた拠点だ。デカブツは恐らく崩壊に巻き込まれて死んだと思うけど、調べに戻ろうとは思わないよ。" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" +"何があったかって?よく分からないな。知っての通り、政府や警察は、暴動なんかを含めたあらゆる騒動を完全に抑え込めなかった。原因はよく分からない。最初はよくある事だと思ったけど、そうじゃなかったんだ。ちょっと興奮したし、革命の始まりだと思って恐ろしくもなった。でも参加しようと考えるほど熱狂もしなかった。もし参加したら死んでいただろうね。とりあえず自宅に籠って、小さな非常持ち出し袋を準備したんだ。そうこうしてると、酷い傷を負って倒れた暴徒が立ち上がってそのまま暴れ出す動画がネット上に流れ始めた。初めてそれを見て信じた奴がどれだけいるのかは知らないが、それがきっかけで、私は街を捨てて避難シェルターへ向かった。その後何が起きたのかは、正確には分からない。私が暮らしていた都市部は荒れ放題で、今は人っ子一人いないよ。携帯電話も圏外になっていたけど、昨日政府が転覆したっていう緊急メッセージだけは例外だった。そして数日が経ち、電気もストップしてしまったんだ。" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -167956,6 +172995,22 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "一体何が起きたんだろう?他の場所でもそいつらを見かけた?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" +"ええと、暴徒や、軍隊や、警官や、ゾンビや、大地を闊歩してる悪夢みたいな気色悪い化け物について、私が知ってると思うのか?何が原因だと訊かれても、そんなの、知るか、としか言えないよ。きっと、政府が生物兵器の実験か何かで事故を起こしたんじゃないかな。起きたことを最初から最後まで嘘でごまかそうとしたんだろう。「中国からの攻撃」なんてたわ言が本気にされてるとは思えない。それで、地球上のどこかの国が災厄を封じ込めようとして、今の終末に至るってとこか。アメリカのどこかでマジの核兵器が爆発した、って話も聞いた。多分ヨーロッパらへんの国が、なんとかこの状況をアメリカで押し留めようとしてるんだ。もしかしたら効果があったのかも。今も酷い状況だけど、これ以上酷いことにはならないだろう。" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -168017,6 +173072,42 @@ msgid "" msgstr "" "そうだ。拠点の居心地はかなり良かったが、段々と気が狂いそうになってきたんだ。一日中暗く、肌寒い場所で、拾ってきたジャンクフードを食べて過ごす...そんな生活じゃ精神が長くは持たない。地上の気候が暖かくなって日照時間も伸びてきた頃に、ようやくちょっと勇気を出すことにした。について学ぶ時間は十分あったから、その後はかなり順調だったよ。転々と寝床を変えながら木の実なんかを食べて暮らしたけど、最初の数か月に比べたらずいぶん良い生活が送れるようになったな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" +"はぁ、、何が発端なのかすら分からないよ。暴動か?いや、兆候はそれ以前からあった。数週間前から変な噂が広まっていたんだ。本当に恐ろしい、普通じゃない犯罪、誰かが人を食ったとか、口にも出したくない類の話を聞いただろ?だから、暴動が始まった時は既に、これは普通じゃないって気がしていたんだ。それもあってか、安全なうちに避難できたし、買い溜めしておく時間もあった。あまり遠出しないようにもしていたよ。あの頃は皆メチャクチャにイカレていた。何年か前にあった感染症の大流行を思い出したけど、警察が市街地に集まって狂ったようにに市民を撃ち殺して回ったりはしなかったさ。" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "何が原因なのか、心当たりはないか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" +"さあね。政府からの情報も矛盾するものばかりだったし、実際に凶悪事件は起きていた。あれだよ、女が赤ん坊を殺す動画、見ただろう?あぁ、まだ悪夢を見る。あれは何だったんだろうな。女の表情はよく見えなかった。もちろん、もっと酷い出来事を、この目で実際に見てきた。でも、あの光景が今でも私を悩ませるんだ。とにかく、暴動はいつまで経っても治まらず、暴徒がゾンビになったときは、何もかも手遅れだった。士気が下がっただけなのか、他の原因があるのかは知らないが、軍と警察も暴徒と同じように同士討ちを始めたって噂を聞いた。死者が生き返った根本的な原因は何かって?何の手掛かりも浮かばないね。" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -168026,6 +173117,53 @@ msgid "" msgstr "" "たくさんの避難民と一緒に避難センター行きのバスに乗っていたら、途中で今までに見たこともないような巨大なゾンビと衝突したんだ。何も特別なことはしていないが、化け物は他の乗客を狙っていたから、何とか逃げ出せたよ。" +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "話を続けてくれ、それから何が起きたんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" +"肺が口から飛び出しそうになるまで走ったよ。それから、森の中のモミの木の根元で一夜を過ごした。朝起きたら、誰かの話し声が聞こえたから、見に行ったんだ。周囲には暴徒や狂人がたくさんいたから、かなり慎重に動いたよ。そして目撃したのは、ゾンビよりもたちの悪い怪物さ。壊れたテープレコーダーみたいに無意味な台詞を呟く巨大な昆虫みたいな奴だ。そいつは生死も分からない倒れた人間を何人か引きずっていた。正直、正体を探るなんて無理だった。茂みに身を潜めて、声が聞こえなくなるまで息をせずじっとしていたよ。" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "それからどこへ向かったんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" +"茂みから出ても何も起きなかったから、少し離れたところにある古い小屋へ向かったよ。雨が降ってきていたけど、そこなら雨風を防げるし、人目にもつかない。バックパックに詰め込んだクソみたいな味の栄養バーがなくなるまでは、そこで過ごしたんだ。その後はこうして別の人間と出会うまで、放浪生活さ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" +"何だろう、バック・トゥ・ザ・フューチャーみたいなものかな?世界は終わった、それだけさ。地震や、鳥や、ヘビや、飛行機は関係ない。暴動から始まって、犯罪者を始末するために警察を、そして軍を派遣したんだ、。政府は洗脳攻撃だって主張して時間稼ぎをしようとしたけど、まあそれはいつも通りのクソだね。政府なんてのはのは法を破る口実を探してる、権利を持った赤ん坊だ。今回は特に酷かった。結局どうしようもなくなって逃げ出したんだけどな。暴動を鎮圧するために都市の中心部を爆撃しているなんて噂も聞いた。流石にそれは極端すぎるって思ったよ。" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -168069,6 +173207,29 @@ msgstr "悪かった。ハチについて詳しく教えてもらえないかな msgid "Right. Sorry." msgstr "それもそうだな。悪かったよ。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" +"分かった、聞いてほしい。政府の言うことは信じるな。暴動の発生、軍による制圧の失敗、過去数日の間に現れた核でも使わないと倒せないような巨大モンスター。これらすべてに共通点がある。" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "興味深い話だ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" +"マトリックスって映画を見たことは?まさにあれなんだ。この生活が。このシミュレーションの作者は、私たちをここに閉じ込めておくために、ある程度辛い状況に置き続ける必要がある。最近ありえない事ばかり起きているのは、きっとアルゴリズムが滅茶苦茶になって、暴走状態に陥ったに違いない。でも、この幻想が終わらないんだから、まだ機能はしているんだ。" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -168082,6 +173243,20 @@ msgid "" msgstr "" "ええと、携帯電話の警報が鳴りやんで、避難シェルターへ行けってメッセージが流れたから、その通りにしたんだ。避難シェルターはものすごく混雑していたから、皆は避難センターへ向かうバスを待っていたけど、いくら待ってもバスはこなかった。その後はもう分かるだろう。パニック状態になって、喧嘩が起きた。それからどうなったのかはよく分からない。私はシェルターのロッカーから荷物を持てるだけ持って森へ逃げたんだ。数日後に戻ったら、もぬけの殻だったよ。他の人がどうなったかなんて、想像もつかないな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" +"避難所で色々な話は聞いたが、正直言って、それらしい説は一つだけだった。これはある種の科学実験が失敗している状態なんだ。そもそもどうして暴動とゾンビが発生したのかは知らないが、世界中で制圧に失敗したなんて考えられない。ああ、私も「政府は崩壊した」なんてビラを見たけど、そういった噂が急速に広まっても*意味*がないじゃないか。恐らく私たちはある種の隔離ゾーンにいるんだ。中で何が起きたとしても、経過や機能を確認するために実験を継続して、次の有事にもっと上手く対応できるようにする。ゾーンの外では、きっと普段通りの生活が営まれているはずだ。" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -168156,6 +173331,44 @@ msgstr "悪いことを聞いてしまったな。" msgid "Sorry for asking. " msgstr "悪いことを聞いてしまったな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "へぇ、ブッ飛んだ意見を聞く心の準備はできた?政府がやったんだよ、。意図的に、あるいは多少意図的にね。" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "えっ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" +"まさに言葉のとおりだ。政府は嘘をついていた。何が起こってるのかは神のみぞ知る、ってね。実際は何が起きているのか理解させたくなかったんだ。恐らく、最初は、人々を統制する手法として始まった。それがいつの間にか裏目に出た。多分、最初は市民から教育を奪おうとしたんだ。簡単に欺けるようにね。それが失敗したので、次は水道水に薬物を混ぜて市民を愚鈍にしようとした。愚鈍というか、暴力的になった奴もいたけど。政府はその状況を利用して戒厳令を敷こうとしたが、上手くいかず、あちこちで戦闘が発生してしまった。バラまいた薬物が変異源だったから、人々はゾンビに変わってしまったんだよ、。" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "その他の異変はどうなんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" +"それもきっと変異だろう。何を使ったのか知らないが、こんなありえないことをやってのけるなんて、科学は狂ってるな。水道に何を入れたのか知らないけど、知覚が少しおかしくなってる可能性もある。怪物も幻覚かもしれないな?ちょっと想定外だったし、今も信じられないけど、他に考えようがない。" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -168783,6 +173996,51 @@ msgid "" msgstr "" "大変な大騒ぎの中で、避難がずいぶん遅れてしまったんだ。街から出られなかったから、地下室でガールスカウトクッキーとか温いルートビアを飲んで数日間生き延びたよ。結局、に見つかることもなく逃げ出して、その後は放棄されたショッピングモールにしばらく立て籠もった。でも、食べ物が必要になったから、野外で暮らそうと森へ向かっていたんだ。野外生活は今一うまく行かなかったから、君に会えてほっとしているよ。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" +"よし、じゃあ、聞いてくれ。おかしいと思うかもしれないけど、、ゾンビに上手く対処できてるんだから、そういうのは放っておいていいんじゃないかな。ギリシャ神話は知ってる?" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "そんなに知らないな。それと何の関係が?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "ああ。どうしてそんな質問を?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" +"ああ、ええと、インディージョーンズのボツシナリオみたいに聞こえるかもしれないけど、きっと誰かがパンドラの箱を開けたんだ。もしくはそれに近いものをね。そしてその力を何かの用途に使おうとした。もしかしたら、上手くいくかもしれないと思って。そうだな、神々の力って単語は、なんだかクリーンエネルギーっぽいからな。その企てが失敗し、何かマズいものが解き放たれた。フィクションに出てくる比喩的な奴じゃなくて、本物のハデスの力を地球上にもたらしたんだ。ああ、現実離れした話ってことは分かってる。最初に言っただろ、放っておけって。" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "何?パンドラの箱?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" +"神話に出てくるんだ。パンドラが神々の家で封をされた箱を見つけて、中を調べてみようと考えた。彼女が箱を開けると、中から想像を絶する恐怖と病があふれ出した。聞いたことある展開だろ?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "なるほど、それがどう関係してくるんだ?" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -168831,6 +174089,137 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "詳しく教えてくれてありがとう。" +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" +"暴動やら何やらの原因は何だってことか?そうだな、中国の生物兵器だって話も聞いたが、こんな大掛かりなことをやってのける生物兵器を作れるとは思えない。バカみたいに聞こえるかもしれないが、私が思い付く説はただ一つ、宇宙人だ。" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "宇宙人の侵略だということか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" +"多分、そうかも。でも、まともな侵略にしては無秩序すぎると思うんだ。これは想像だけど、北極の氷に何かが封印されていたんだ。数年前、氷の中から発見された宇宙人の死体がネットで話題になったのを覚えてるか?君はそこまで知らないかもしれないけど、しばらく話題になった後でデマだったことが判明した。ただ、その後私は、その死体に似た姿の宇宙人が歩いているところを目撃したんだ。きっと、デマって話は嘘で、隠蔽工作だったんだ。恐らく、宇宙人はウイルスのようなものをもっていたんだろう。世界中を巡って、静かに、あらゆるものを感染させたんだ。そして、どういう訳か今になってそれが活性化し、凶暴化や怪物化、変異を引き起こしているんだよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" +"包み隠さず話そう。私は最初、暴動に参加していた。あの時何を考えていたのか覚えていないんだ。それ以前も警察の残虐行為への抗議活動に参加したことはあるが、あれはそんなもんじゃない。看板を持って行進せずに、屋外でバットを振り回して何もかもぶっ壊すんだ。あんなに腹が立ったのは初めてだよ。暴動が始まってしばらく経っていた時期だったが、政府がまた市民を弾圧しようとしてるみたいに見えたんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "暴徒たちは気が狂ったに違いないという噂が出回っていた。" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "暴動に参加して無事に戻ってきた人はあまりいない。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" +"ああ、その通りだ。あの暴動は...人間のやることとは思えない。活動家とまではいかないが、今までに参加した抗議活動とは全く違うものだった。でも、止められなかったんだ。他の暴徒と同じくらい、酷いことをしたよ。窓を割り、傍観者を殴り、車を燃やした。警官から戦闘服を剥ぎ取って...もう止めよう。思い出したくないんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "どうやって生き残ったんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "何がきっかけで正気に戻ったんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" +"ある時、目が覚めたんだ。暴動鎮圧用のタレットを搭載した軍用車両が出てきた頃だったかな。そんな装備を初めて見たかどうかすら覚えていない精神状態だっだ。とにかく、それから銃声が聞こえて、気が付いたら重装備の軍用施設に突撃する暴徒の群れの端っこにいた。何が起きたのか確かめようと暴徒を見たら、あいつらが、野生動物、いや、ゾンビみたいな目つきをしていることに気づいた。すぐにその場を離れたよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" +"正直言って、分からないな。時間が経てば、他の暴徒も正気に戻ったんだろうか。私は何も特別じゃない。きっと他の奴らも目が覚めたけど、偶然にも群衆の端にいなかっただけだ。そして、私が正気に戻ったとたん、他の暴徒が私を獲物として見ていることに気づいた。その後何が起きるのか、確かめる気なんてなかったけどね。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" +"近辺の街のことはよく知っていた。廃墟になってる建物へ向かい、割れた窓から侵入して、数日間そこに籠ったよ。かなりの量の食料を盗んで、独り占めした。周囲が静まり返ってきたから、外へ出て、そしてここに来たんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" +"ああ、暴動に至るまでの経過は私も覚えているよ。悲惨な状態だった。酷い犯罪のニュースもあったし、警官の対処法が問題になって、いつものように人種問題でピリピリしていた。そして市民は暴動を始めたんだ。珍しいことじゃないけど、暴動が起きた場所が奇妙だったんだ。中流階級の住宅地や、中西部の小さな町とかな。まあともかく、私は暴動に加わった。その後のことはあまりはっきりとは覚えていないんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "暴動に参加したのか?" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "何が原因か、心当たりがあるようだな。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" +"そうだな。暴動は洗脳薬のせいだと言っている者もいるらしいが、率直に言って、的外れな説だとは思えない。実際にそんな感じだったんだ。意識がトんだって程ではなかったけど、目が覚めるまでは奇妙な感覚だった。でも、ゾンビや怪物は洗脳薬じゃ説明できない。原因を推測してはみたけど、悪魔の呪いとか、エイリアンの新兵器とか、下手なSFじみた話しか思いつかないな。" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -169114,15 +174503,52 @@ msgstr "" msgid "I can respect that." msgstr "もっともな意見だ。" +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "過去の話はあまりしたくないんだ、分かってくれないか?" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "漠然とした話でもいい、少しだけでも教えてもらえないか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" +"ええと...ああ。水道水に麻薬か、生物兵器を混ぜたんじゃないかな。知ってのとおり、非難の的になっていたのは、中国だ。人々は醜く、暴力的にふるまった。暴動が始まり、親しい人々もそれに参加した。何故そんなことをするのか分からなかったよ。暴動は軍と警察を巻き込み、更に悪化した。暴徒だけじゃない、あらゆる人間が動物のようにふるまっていた。そして、本当のハルマゲドンが訪れたかのように怪物や悪魔が世界を闊歩するようになった。人間は死んで、モンスターになって蘇ったんだ。そういう話だろ。もっと知りたいなら、他の人に聞くんだな。" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "話してくれてありがとう。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" +"実は...まったく覚えていないんだ。世界がこんなことになる前の人生は、ぼんやりと思い出せる。でも、が訪れた時の事は?もやが掛かっているみたいだ。何か酷い目に遭ったに違いないとは思ってる。覚えていることは、暴力、赤ん坊を殺す女性。忘れた方がいい気がするな。" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" -"実は...まったく覚えていないんだ。世界がこんなことになる前の人生は、ぼんやりと思い出せる。でも、が訪れた時の事は?もやが掛かっているみたいだ。今いる場所も、何が起きたのかも分からない。どうやらかなりひどい目に遭ったみたいだ。それとも頭を強く打ったのかな。いや、その両方かも。" +"実は...まったく覚えていないんだ。世界がこんなことになる前の人生は、ぼんやりと思い出せる。でも、が訪れた時の事は?もやが掛かっているみたいだ。今いる場所も、何が起きたのかも分からない。どうやらかなりひどい目に遭ったみたいだ。それとも頭を強く打ったのかな。いや、その両方かも。その可能性が高そうだな。はっきりとした最初の記憶は、携帯電話に既読メールが入っていたことだ。政府の緊急放送システムから送られてきた奴で、アメリカは陥落したって書いてあった。" #: lang/json/talk_topic_from_json.py msgid "" @@ -169214,6 +174640,46 @@ msgid "" msgstr "" "おい。はっきり言ったはずだ。またしつこく聞くようなら怒るからな。かつての私は死んだ。消えたんだ。その下らない「健全」とかいう話は止めろ、、二度と言うな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" +"何が原因かって聞いてるのか?ニュースでやってたろ。中国の生物兵器だよ。何年か前のパンデミックと同じだが、今回の対処は正しかった。いや、正し過ぎたかな。今となってはどうでもいいが、中国の本国にも伝染して、あっちも全滅だって聞いたよ。正義は成されたな。" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "実際に何があったのか、詳しく教えてもらえないか?" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "他のおかしな出来事はどうやって説明するんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" +"まあ、知ってのとおりさ。最初に水道に洗脳薬が混入され、暴動が起きた。その薬がウイルスだったって、今なら分かるね。軍と警察が必死になって制圧しようとしたが、手に負えなかった。それからウイルスが突然変異して、まるでB級映画のように死者を生き返らせ始めたんだ。そしてB級映画は現実になった。あのデカい怪物を中国が誤って逃がしたのか意図的に解き放ったのかは、分からない。名状しがたい巨大な怪物...あれのことを考えると今でも背筋が凍るよ。でも戦闘用じゃないのは確かだ。軍がすぐに倒してしまったからね。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" +"何?あれも同じさ。手法が生物兵器から核兵器になったんだ。水爆よりもっと酷い奴さ。アメリカはなんとかして鎮圧しようとしたけど、もう手遅れだったんだ。" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -169521,7 +174987,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "脱税だよ。会計士をしていたんだが、賢いやり方で上司が大金を動かすのを手伝ったんだ。いや、賢くはなかった。捕まったんだからな..." #: lang/json/talk_topic_from_json.py @@ -169706,6 +175172,34 @@ msgid "" msgstr "" "信仰を守り、祈り、地獄からの使いを見かけたら打ち倒す。私たちにできることなんて、それぐらいしか無いだろう?もしかしたら、地球を素直に明け渡してしまった方が楽なのかもしれない。でも、そんなのは癪だからな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" +"明白じゃないか?あれは...携挙だ。私がまだ地上にいる、その理由は分からないが、私はどんな患難の中にあろうとイエスキリストを信じている。患難が過ぎ去れば、きっと私を天国に迎え入てくださるのだろう。まぁ...大筋はこんなところだと思っている。私が考えているとおりに事が運ぶとは限らないが、これは予言と言ってもいい。" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "もっと現実的な話かと思っていたよ。何が起きたんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" +"えっ、ああ、私の記憶が確かなら、一連の出来事は黙示録の文章に沿っているんだ。牧師とはあまり話していないけどね。最初の災い...これは数年前の感染症の大流行だ。人々は終末が近いと言うようになった。次は血の災い、いや、暴力の災いだったかな?これが暴動を表してる。水が血に変わる、ってのが撃たれる人々だな。それから火の災い。暴動を封じ込めようとする中で爆弾なんかがあちこちで爆発していたのを覚えている。そして悪魔や怪物が地上を闊歩し、死者が墓から抜け出し、最後に柔和な人々がこの地を受け継ぐ。極めて明白だ。" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -169714,6 +175208,24 @@ msgid "" msgstr "" "他のみんなと同じさ。神様から目を背けて、その代償を支払ってるところだよ。携挙が訪れたけど、私は取り残された。そして今、地上の地獄を彷徨っているんだ。もっと真面目に日曜学校へ行っておけばよかったな。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" +"そうだな、これは携挙だったんだろう。思った通りには行かなかったけど。光が点滅するように、皆が*パッ*と居なくなるって聞いてたのに、滅茶苦茶の大混乱だ。通りでは暴動が発生し、軍と警察は反キリストの手先となって人々を殺して回る...これは父が言っていたんだけど、麦と殻を選り分けるって話が思い浮かばないか?私たちの真の罪が示された時、神は真の災いをお与えになる。死者が歩き始め、機関銃の弾痕を残したまま軍隊と戦う。軍でも内部で反乱が起き始める。そして、地獄の軍団が現れるんだ。巨大な怪物は想像以上に恐ろしい力をもっており、全てを引き裂き街を壊滅させた。軍も到着したがすぐに劣勢になり、私たちは死者から身を隠し逃げようとしたんだ。それから数日経って、停電が起きた。" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -169938,10 +175450,6 @@ msgstr "自由商人に雇われていた頃はどんな仕事をしていたん msgid "What was working for the Old Guard like?" msgstr "オールドガードに雇われていた頃はどんな仕事をしていたんだ?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "話してくれてありがとう。" - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "話してくれてありがとう。さあ行こうか。" @@ -170169,6 +175677,23 @@ msgstr "" msgid "What were you saying before that?" msgstr "前の話をもう一度聞かせてもらえないかな?" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" +"正直に言うと、結婚式の計画を立ててたから、現状に至る発端の出来事なんて気にしていなかったんだ。暴動が起きてることは知ってたが、住んでる街の外だったからね。近所で暴動があった時も、無視を決め込んでいた。ゾンビが現れてようやく、とてもおかしなことが起きてるって気づいたんだ。式場から逃げてる最中に、空が裂けて、裂け目からインデペンデンス・デイの宇宙人みたいな奴が飛び出してきた。まるで黒魔術の儀式か何かだったよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "こんにちは。" @@ -170705,8 +176230,8 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "私の農場から立ち去った方がいい。政府の策略には乗らないよ。" #: lang/json/talk_topic_from_json.py -msgid "Go on..." -msgstr "何を話そうか..." +msgid "Go on…" +msgstr "続けて..." #: lang/json/talk_topic_from_json.py msgid "Is your forge operational?" @@ -171113,10 +176638,6 @@ msgid "" " catastrophe." msgstr "うちの土地から出て行け。政府はこの大災害で無能さを露呈したな。" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "何を話そうか..." - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "あなたの妻について聞きたい。近くにいるのか?" @@ -171767,15 +177288,15 @@ msgstr "分かった。彼らを説得してみる。" msgid "All right! Let's get going." msgstr "わかったよ!さあ行こう。" +#: lang/json/talk_topic_from_json.py +msgid "We've done it! We've solved the list!" +msgstr "やった!リストが全部埋まった!" + #: lang/json/talk_topic_from_json.py msgid "" "How's things with you? My cardboard collection is getting quite impressive." msgstr "調子はどう?私の段ボールコレクションはかなり良い感じだよ。" -#: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "やった!リストが全部埋まった!" - #: lang/json/talk_topic_from_json.py msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "段ボールの事は話したっけ?君、段ボール持ってる?" @@ -172580,11 +178101,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" -"気味が悪いだろ?ムダ毛みたいなものだ。大変動からしばらく経って、至る所から生え始めた。原因は分からない。嫌だからと言って怒っても仕方がない、まぁ、嫌だけど。" +"気味が悪いだろ?ムダ毛みたいなものだ。大変動からしばらく経って、体中に生え始めた。原因は分からない。嫌だからと言って怒っても仕方がない、まぁ、嫌だけど。" #: lang/json/talk_topic_from_json.py msgid "" @@ -173334,7 +178855,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -174444,12 +179965,12 @@ msgstr "どうやってここにたどり着いたんだ?" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" "ダナが妊娠していたから、2人で早めに避難したんだ。避難所に詰め込まれ、ここへ向かうバスに乗った。でも道中で巨大な化け物がバスを横転させて、ほとんどの避難者が死んだんだ。私たちは生き残った数人と一緒にここを目指し、たどり着いた。そんなに遠い道のりじゃなかったし、どういう訳か、化け物は私たちを狙わずバスを攻撃し続けていたからね。" @@ -174583,12 +180104,12 @@ msgstr "どうにか元気にやっている、と思いたいな。気にかけ #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" "長い、長い話だ。実はこの辺じゃなくて、カナダ西部の郊外から来た。ニューイングランドへは前から行きたいと思っていたから、休暇に出かけたんだ。私は確かに避難者だがアメリカ国民ではないので、階下へは連れて行ってもらえなかった。嫌な話だが、仕方ない。実を言うと、家族や友人の状況が分からなくて、何とかしようとしている最中なんだ。" @@ -174657,7 +180178,7 @@ msgid "Hm? Oh, hi." msgstr "うん?おや、どうも。" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "...やあ。" #: lang/json/talk_topic_from_json.py @@ -175035,10 +180556,10 @@ msgstr "そうしよう。どんな手を使って彼らに退去を認めさせ #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" -"いくら事態が片付いても、全員分のベッドも足りないし、物資も不十分だ。耐えるしかない。私たちもできる限りのことはしている...少なくとも避難場所は提供した。" +"いくら事態が片付いても、全員分のベッドは足りないし、物資も不十分だ。耐えるしかない。私たちもできる限りのことはしている...少なくとも避難場所は提供した。" #: lang/json/talk_topic_from_json.py msgid "" @@ -175055,9 +180576,9 @@ msgstr "その区画は何が不味いんだ?" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -175387,8 +180908,8 @@ msgid "" msgstr "お前のようなクズと話すことなんか無い、諦めて失せろ。" #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." -msgstr "私はここの担当者ではない。他を当たってくれ。" +msgid "I'm not in charge here, you're looking for someone else…" +msgstr "私はここの担当者ではない。他を当たってくれ..." #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -175435,11 +180956,11 @@ msgid "Well, I'd better be going. Bye." msgstr "ええと、そろそろ行くよ。さようなら。" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." +msgid "Welcome marshal…" msgstr "ようこそ、執行官..." #: lang/json/talk_topic_from_json.py -msgid "Welcome..." +msgid "Welcome…" msgstr "ようこそ..." #: lang/json/talk_topic_from_json.py @@ -175683,11 +181204,11 @@ msgstr "" "残念ながら、無理だ。農園へ行った人の大部分は上階で待機していた避難民だ。安全な寝床を待つよりもリスクが少ないからな。地下から出ていったのはほんの少しだし、元から混雑した状態だったからな。もっとたくさんの人が太陽や新鮮な空気、重労働を求めて牧場に向かってくれるといいが...知ってるだろうが、みんなゾンビの大群に襲われるのが怖いんだ。" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." +msgid "Marshal…" msgstr "執行官..." #: lang/json/talk_topic_from_json.py -msgid "Citizen..." +msgid "Citizen…" msgstr "市民..." #: lang/json/talk_topic_from_json.py @@ -176307,7 +181828,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" "現状だと、ガスマスク、スーツ、道具をセットで割引価格で売ってやるよ。うちで使ってるコイン2枚でどうだ。\n" "\n" @@ -176361,6 +181882,18 @@ msgstr "分かってるじゃないか、幸運を祈ってるよ。" msgid "Got it." msgstr "分かった。" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "道中は注意しておいた方がいい。" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "この辺は気を付けて行動した方がいい。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "何だ?" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "何か用か?" @@ -176373,14 +181906,14 @@ msgstr "時間報酬制だ、さっさと話せ..." msgid "Hey." msgstr "やあ。" -#: lang/json/talk_topic_from_json.py -msgid "Yes?" -msgstr "何だ?" - #: lang/json/talk_topic_from_json.py msgid "Good to see you." msgstr "会えて嬉しいよ。" +#: lang/json/talk_topic_from_json.py +msgid "About those jobs…" +msgstr "それらの仕事について..." + #: lang/json/talk_topic_from_json.py msgid "Good to see you around." msgstr "会えて光栄だ。" @@ -176390,8 +181923,8 @@ msgid "Want help with something else?" msgstr "何か手伝ってほしいことはある?" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." -msgstr "何でもない、もう行くよ。" +msgid "Lets set a combat strategy" +msgstr "戦闘時の約束事を決めよう。" #: lang/json/talk_topic_from_json.py msgid "" @@ -176444,6 +181977,10 @@ msgstr "何か興味深い話はある?" msgid "Anything on your mind?" msgstr "どうかした?" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "何か手伝おうか?" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "雇用主について何か知っているか?" @@ -176487,15 +182024,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "その話を聞いて、確かに奇妙だと思えてきたよ。" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "今から狩りにでも向かおうかと思案してるんだ..." #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "この世界がいつマトモになるのか考えてたんだ..." #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "うん?いいや、ただここで一休みするのが好きなんだ。" #: lang/json/talk_topic_from_json.py @@ -176535,7 +182072,7 @@ msgstr "大人しくしていろよ。" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "まだ外には無法者がうろついてる。執行官、あなたの仕事は多い..." #: lang/json/talk_topic_from_json.py @@ -176605,7 +182142,7 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "私が君の手伝いを必要とする状況ってのがちょっと想像できないな。" #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." +msgid "Stand still while I get my clippers…" msgstr "バリカンを使うからじっとしててくれ..." #: lang/json/talk_topic_from_json.py @@ -176987,7 +182524,7 @@ msgid "" msgstr "思うに、車両回収部隊はいつだって手伝いを必要としてるはずなんだが、連中は常に外にいるから、なかなか捕まらないんだよな。" #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." +msgid "Please leave me alone…" msgstr "ほっといてくれ..." #: lang/json/talk_topic_from_json.py @@ -177006,15 +182543,14 @@ msgstr "気の毒に。" #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." +"I don't know what you could do. I've tried everything. Just give me time…" msgstr "あんたに何が出来る。出来ることは自分で試したよ。ほっといてくれ..." #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." -msgstr "具合が悪いんだよ!何か悪いものを食ったんだと思うんだがとにかくゲロが止まらんのだ..." +"seems like I can't keep anything down…" +msgstr "具合が悪いんだよ!何か悪いものを食ったんだと思うんだが、とにかくゲロが止まらないんだ..." #: lang/json/talk_topic_from_json.py msgid "Uhm." @@ -177139,8 +182675,8 @@ msgstr "仲間に加わるのは止めておこう。" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "ここで?果物やベリー類だよ。他には農機具もあるが、購入には暗号通貨が必要だ。" #: lang/json/talk_topic_from_json.py @@ -177467,6 +183003,269 @@ msgstr "今では、私が人間かどうか判定する人自体が少ないね msgid "Now I choose the cause I'll die for." msgstr "そして、自分が行くべき道を選んだってわけ。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "ああ。外で恐竜を見かけたから聞いたんだ。あの恐竜と何か関係があるのか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" +"役に立つかは知らないが、色々知ってる。教会でも見たし、農場でも見たし、展示会場も全部見て回った。スワンパーなら何が起きてるのかしってるかもしれない。確かあの恐竜は正義の生き物で、帰ってきたのは皆を救うためだとか。いや、食べるため、だったかな。" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "これで捕食者に飯を用意できる。" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "ようこそ。腹が減ったのか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "腹が減ってるようだな。この世は飢えに満ちている。捕食者たちの時代がやってきたんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "やあ。捕食者って誰だ?" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "その捕食者について..." + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "前にも言っていたな。どういう意味なんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "捕食者に餌をやる方法はあるのか?" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "もう行くよ。お気をつけて、CEO。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "捕食者が帰ってきたんだ、偽物も連れてな。本物には飯を用意して、偽物は駆除しないと。" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "何の話をしているんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "いや、結構。もう行くよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" +"大変動によって、忘れ去られた偉大なる捕食者たちが目覚めたんだ。崇高な役割を果たし、世界を我が物とし、大地を咆哮で満たすために。人類の時代は終わった。私のようなごくわずかな生き残りは、肉を盗もうとする偽者からこの新世界を守るため、役割を果たすべきなんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "それで、その肉は何に使うんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "その捕食者と偽者っていうのは誰なんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "他にも生き残りがいるのか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" +"かつて失われた大いなる捕食者とは、恐竜のことだ。私たちが肉を集めているのも、恐竜に与えるためだ。偽者というのは、この世界から肉を盗む他の奴らのことだ。肉はあいつらの物じゃない。だから取り返すんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "なるほど、恐竜を崇拝しているんだな。理解したよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" +"スワンパーはこんな時代が来ることを予見し、準備をしていたんだ。他の奴らが時間と肉を無駄にしている時、私たちは飯を食って強くなり、この火のために肉をたくさん備蓄しておいたんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "へえ、それはすごい。" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "肉の話ばかりしているな。そんなに肉が大事なのか?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" +"肉は偉大なる捕食者を強くする。私たちは肉を集めて与える。私たちは生まれてから死ぬまで捕食者たちに仕える。この目標は常に変わらないが、幸運にも生きて目的達成を迎えられた者はほとんどいない。" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "目的?どうしてそんな目的になったんだ?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "捕食者の復活は預言者によって伝えられていた。私を含めた忠実なしもべたちは、啓示以来、その日を待ち望み、準備を進めていたんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "預言が真実だと証明されて良かったな。" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "狂ってる。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "理解してくれるか。君も歓迎しよう。捕食者を養うのを手伝ってくれ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "目の前にあるものを否定するのか。この状況は預言されていたんだ。" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "捕食者は飯を食ったよ。少し経てばまた腹を空かせるだろう。" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "何をすべきか分かっているだろう。" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "捕食者たちに飯を用意しないと。準備はいいか?" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "まだまだやることはあるんだ。準備はいいか?" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "食事の準備ができた。肉を集める準備はできたか?" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "捕食者たちは腹を空かせている。" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "もっと肉が必要だ。" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "捕食者たちは肉を食べたがってる。" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "CEO、また次の機会にしよう。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "捕食者たちの世話をしたいなら、肉を集めてきてくれ。常にたくさん用意しておく必要がある。" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "捕食者たちのお役に立てて幸せだよ。指示に従おう。" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "素晴らしい。上手くやってくれよ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "捕食者たちは選り好みしないから、何の肉でも構わない。ただし、変異した生物の肉や汚染された肉ではダメだ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "つまり、ゾンビでも巨大な怪物でもない、普通の動物の肉だな。分かったよ。" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "もちろん、必要なものがあれば持っていって構わないよ。" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "だからナイフがあったんだな。" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "ああ、友人のブリジットを知っているのか。ならば話が早い、さあ行こう!" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "いいや、私はここで会社を経営しなければならない。" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "そうだろうな、CEO。" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "ありがたい!" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "今はまだいい。ここに残って会社経営を続けるべきだ。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "分かった。気が変わったら、いつ来てもらっても構わない。偉大なる捕食者はいつも腹を空かせているからな。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" +"捕食者が帰ってくるとき,その肉を盗む偽者も帰ってくるとは言われていたんだ。私たちに求められているのは、真の捕食者が可能な限り多くの肉を手に入れ、偽者の腹を満たさせないこと。それだけだ。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "なるほど、そういうことかCEO。" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "意味が分からない。この話は終わりにしよう。" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "やぁ、スカベンジャー。" @@ -177564,7 +183363,7 @@ msgid "Oh, you again." msgstr "ああ、またお前か。" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "あ?*モゴモゴ*...誰だ?" #: lang/json/talk_topic_from_json.py @@ -177572,7 +183371,7 @@ msgid "I'm busy, what is it?" msgstr "忙しいのだ、何か用か?" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "我が塔と我が研究を置いてか?そうはいかない。" #: lang/json/talk_topic_from_json.py @@ -177999,10 +183798,6 @@ msgstr "%sの攻撃を防ぎました。" msgid " blocks %s" msgstr "は%sの攻撃を防ぎました。" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "受け流す" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -179147,7 +184942,7 @@ msgstr "は%sに掴まれそうになりましたが、巧妙に逃れ #: lang/json/technique_from_json.py msgid "Sweeping Strike" -msgstr "振り払い" +msgstr "下段攻撃" #: lang/json/technique_from_json.py #, python-format @@ -179175,7 +184970,7 @@ msgstr "は%sに勢いよく切り込みました。" #: lang/json/technique_from_json.py msgid "Mordhau" -msgstr "" +msgstr "モルダウ" #: lang/json/technique_from_json.py #, python-format @@ -180338,106 +186133,190 @@ msgstr "は武器で%sの急所を狙いました。" #: lang/json/technique_from_json.py msgid "Burning Blade" -msgstr "" +msgstr "燃える刃" #: lang/json/technique_from_json.py #, python-format msgid "You unleash a fiery attack against %s" -msgstr "" +msgstr "%s目がけて燃えるように強烈な攻撃を放ちました。" #: lang/json/technique_from_json.py #, python-format msgid " unleash a fiery attack against %s" -msgstr "" +msgstr "は%s目がけて燃えるように強烈な攻撃を放ちました。" #: lang/json/technique_from_json.py msgid "Inferno Blade" -msgstr "" +msgstr "焦熱の刃" #: lang/json/technique_from_json.py #, python-format msgid "You strike %s with powerful inferno" -msgstr "" +msgstr "%s目がけて燃え盛る炎のような攻撃を放ちました。" #: lang/json/technique_from_json.py #, python-format msgid " strikes %s with powerful inferno" -msgstr "" +msgstr "は%s目がけて燃え盛る炎のような攻撃を放ちました。" #: lang/json/technique_from_json.py msgid "Firesnake" -msgstr "" +msgstr "火蛇" #: lang/json/technique_from_json.py #, python-format msgid "You strike through %s with a snaking flame" -msgstr "" +msgstr "%sを蛇のように曲がりくねる炎で打ちました。" #: lang/json/technique_from_json.py #, python-format msgid " strikes through %s with a snaking flame" -msgstr "" +msgstr "は%sを蛇のように曲がりくねる炎で打ちました。" #: lang/json/technique_from_json.py msgid "Ring of Fire" -msgstr "" +msgstr "炎の輪" #: lang/json/technique_from_json.py #, python-format msgid "You become a flaming blur as you strike %s and those around you" -msgstr "" +msgstr "炎塊に変化し、周囲を巻き込みながら%sを打ち据えました。" #: lang/json/technique_from_json.py #, python-format msgid "" " becomes a flaming blur as they strike %s and those around them" -msgstr "" +msgstr "は炎塊に変化し、周囲を巻き込みながら%sを打ち据えました。" #: lang/json/technique_from_json.py msgid "Flashing Sun" -msgstr "" +msgstr "煌めく太陽" #: lang/json/technique_from_json.py #, python-format msgid "You carve an arc through %s and those nearby" -msgstr "" +msgstr "弧を描くように周囲を巻き込みながら%sを攻撃しました。" #: lang/json/technique_from_json.py #, python-format msgid " carve an arc through %s and those nearby" -msgstr "" +msgstr "は弧を描くように周囲を巻き込みながら%sを攻撃しました。" #: lang/json/technique_from_json.py msgid "Insightful Strike" -msgstr "" +msgstr "天眼の一撃" #: lang/json/technique_from_json.py #, python-format msgid "You spot %s's weakpoint and strike" -msgstr "" +msgstr "%sの弱点を狙って攻撃しました。" #: lang/json/technique_from_json.py #, python-format msgid " spot %s's weakpoint and strike" -msgstr "" +msgstr "は%sの弱点を狙って攻撃しました。" #: lang/json/technique_from_json.py msgid "Greater Insightful Strike" -msgstr "" +msgstr "大いなる天眼の一撃" #: lang/json/technique_from_json.py msgid "Spin Attack" -msgstr "" +msgstr "回転斬り" #: lang/json/technique_from_json.py #, python-format msgid "You unleash a spin attack against %s and those nearby" -msgstr "" +msgstr "回転斬りを放ち、周囲を巻き込みながら%sを攻撃しました。" #: lang/json/technique_from_json.py #, python-format msgid " unleashes a spin attack against %s and those nearby" -msgstr "" +msgstr "は回転斬りを放ち、周囲を巻き込みながら%sを攻撃しました。" + +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "武装解除攻撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "巧みに%sの武装を解除しました。 " + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "は巧みに%sの武装を解除しました。" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "光速復帰" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "%sへの攻撃を外しましたが、瞬く間に体勢を立て直しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "は%sへの攻撃を外しましたが、瞬く間に体勢を立て直しました。" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "とどめの一撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "%sめがけてとどめの一撃を放ちました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "は%sめがけてとどめの一撃を放ちました。" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "昏倒攻撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "強烈な攻撃で%sを気絶させました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "は強烈な攻撃で%sを気絶させました。" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "鋼の疾風" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "風に舞い飛ぶ鋼のように、周囲を巻き込みながら%sを切り裂きました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "は風に舞い飛ぶ鋼のように、周囲を巻き込みながら%sを切り裂きました。" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "大鎌の刃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "周囲を巻き込みながら%sをスパッと刈り取りました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "は周囲を巻き込みながら%sをスパッと刈り取りました。" #: lang/json/technique_from_json.py msgid "Ausstoß" @@ -180495,6 +186374,216 @@ msgstr "%sに超音速のパンチを繰り出しました。" msgid " launches a supersonic punch at %s" msgstr "は%sに超音速のパンチを繰り出しました。" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "メガトンキック" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "%sにメガトンキックを繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "は%sにメガトンキックを繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "DDラリアット" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "%sにDDラリアットを繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "は%sにDDラリアットを繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "スマートホーン" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "%sにスマートホーンを繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "は%sにスマートホーンを繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "ローキック" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "%sにローキックを繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "は%sにローキックを繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "愚弄攻撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "%sの攻撃を愚弄し、反撃を繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "は%sの攻撃を愚弄し、反撃を繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "九頭竜殺し" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "%sの攻撃を跳ね返す鋭い一撃を繰り出しました!" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "は%sの攻撃を跳ね返す鋭い一撃を繰り出しました!" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "全力投げ" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "%sを横へ思い切り投げ飛ばしました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "は%sを横へ思い切り投げ飛ばしました。" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "巨砲投げ" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "%sを振り回し、投げ飛ばしました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "は%sを振り回し、投げ飛ばしました。" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "伏流の反撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "%sの攻撃を逸らし、流れるような反撃を繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "は%sの攻撃を逸らし、流れるような反撃を繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "武装弾き" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "%sの武器を素早く弾き飛ばして武装解除しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "は%sの武器を素早く弾き飛ばして武装解除しました。" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "サルラック斬り" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "周囲を巻き込みながら素早く%sを薙ぎ払いました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "は周囲を巻き込みながら素早く%sを薙ぎ払いました。" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "巨大鎚" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "%sを押し潰しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "は%sを押し潰しました。" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "大嶽殺" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "%sを叩きのめし、押し潰しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "は%sを叩きのめし、押し潰しました。" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "巨大な一撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "%sを完璧に轢き潰す攻撃を繰り出しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "は%sを完璧に轢き潰す攻撃を繰り出しました。" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "イタチの構え" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "%sが掴みかかろうとしましたが、転げ回って自由になりました!" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "は%sに掴まれそうになりましたが、転げ回って自由になりました!" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "動けと命令しても地球は耳を貸しません。" @@ -180540,6 +186629,10 @@ msgstr "枯れ木が再生しました。" msgid "Life springs anew from the dead grass." msgstr "枯れ草が息を吹き返しました。" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "ドアが勢いよく開きました!" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "焦土" @@ -181509,226 +187602,29 @@ msgid "" msgstr "金属製の手すりです。道路外への落下や侵入を防ぐために設置されています。" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "土" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "土です。耕作に適した土壌のようです。掘り返して建設準備を行うことも可能です。" - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "ゴツン" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "上手く掘り出せば色々なことに役立ちそうな細かい砂からなる地面です。" - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "泥" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "濡れて光沢を放つ泥です。" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "粘土" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "柔らかい粘土からなる地面です。粘土を上手く掘り出せば、色々な使い道がありそうです。" - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "粘土の山" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "粘土質の土の山です。" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "バシャッ!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "砂の山" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "砂の山です。" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "畝" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "土が盛り上がっており、乗り越えて移動するのに時間がかかりそうです。よく見ると種などを植えられそうです。" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "大きな土の山です。中を掘りぬけばシェルターになりそうです。" - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "奇妙な亀裂" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" -"この異様な人型の穴を、何故かよく知っているような気がします。これが自分の物であるような気がして、もっと近寄って見てみたいという奇妙な感覚になります。" - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "墓穴" +msgid "overgrown floor" +msgstr "床(繁茂した肉)" -#. ~ Description for grave +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "少し草が茂った、既に埋まっている墓穴です。少なくともここにいる死者は安らかに眠っています。" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" -"真新しい墓穴です。誰かが掘り返さないように、もしくは中からこじ開けられないように、石の蓋が置いてあります。2枚の板切れで、ここで誰かが永遠の休息を取っている事を示す印が形作られています。" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "床(岩石)" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "比較的平坦な岩石の床です。安定しており、適切な道具があれば掘削できそうです。" - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "道路" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "アスファルトの一部は氷結や整備不足からゆっくりとひび割れ、劣化し始めています。" - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "車線" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" -"丁寧に並んだ黄色いペンキの縞模様は、運転者が道路をはみ出さないよう注意するために付けられた印です。こんなルールを強制する者はもう誰一人残っていません。" - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "歩道" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "公共区画に敷かれたコンクリートは氷結によって損傷し、整備不足のために大きなひびが入っています。" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "より美しく霜が付きにくい表面仕上げが施された、比較的新しい公共区画のコンクリートです。" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "より美しく霜が付きにくい表面仕上げが施された、比較的新しい公共区画のコンクリートです。黄色の塗料で縞模様が描かれています。" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "床(木)" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." -msgstr "木の板を隙間なく敷き詰めて釘で打ち付けた床です。テラスなどでよく見られます。" +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." +msgstr "剥き出しのコンクリート床は、繊毛を揺らめかせる灰色の肉に覆われています。" #: lang/json/terrain_from_json.py msgid "SMASH!" msgstr "ガシャン!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "床(金属)" +msgid "overgrown wall" +msgstr "壁(繁茂した肉)" -#. ~ Description for metal floor +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." -msgstr "頑丈で高品質な床材を使って転倒のリスクを軽減した格子模様の床です。" - -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "リノリウムタイル" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "ゴムのような丈夫な素材で作られた、シンプルな白色の床です。" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "ゴムのような丈夫な素材で作られた、灰色の床です。" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "床(土)" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." -msgstr "目の細かい土を押し固めて作った床です。" +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." +msgstr "コンクリートの床は、血管や瘤が生えたグロテスクな肉の網に覆われています。" #: lang/json/terrain_from_json.py msgid "concrete floor" @@ -181813,6 +187709,21 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "鉄筋の間にコンクリートを注いだだけの未完成の状態です。表面は滑らかになっておらず、屋根も塞がれていない部分が残っています。" +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "床(岩石)" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "比較的平坦な岩石の床です。安定しており、適切な道具があれば掘削できそうです。" + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "床(金属)" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -181820,6 +187731,10 @@ msgid "" " with a matching roof." msgstr "硬い格子模様がついた高品質な床材を使って転倒のリスクを軽減した、屋根と揃いの床です。" +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "ゴツン" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "床" @@ -181862,6 +187777,10 @@ msgid "" "resistance and sliding, commonly for recreational sports." msgstr "表面に転倒を防止し滑らかさを改善する化学物質が塗られた、主にレクリエーションスポーツ用途で使われる硬材製フローリングです。" +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "床(土)" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -181944,28 +187863,15 @@ msgid "A blue section of flooring." msgstr "青色の床です。" #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "絨毯(工業)" +msgid "carpet" +msgstr "絨毯" -#. ~ Description for industrial carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." -msgstr "剥き出しのコンクリート上に敷設するための、毛羽が少なく丈夫で衝撃に強い灰色の絨毯です。" +msgid "Base carpet!" +msgstr "カーペットのベースです!" -#: lang/json/terrain_from_json.py -msgid "bunker carpet" -msgstr "絨毯(掩体壕)" - -#. ~ Description for bunker carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "断熱層を備えた、毛羽が少なく丈夫で衝撃に強いクリーム色の絨毯です。" - -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "赤色の柔らかい絨毯です。" @@ -181985,6 +187891,124 @@ msgstr "緑色の柔らかい絨毯です。" msgid "Soft purple carpet." msgstr "紫色の柔らかい絨毯です。" +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "カーペット" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "コンクリート床上のカーペットのベースです!" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "絨毯(工業/赤)" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "剥き出しのコンクリート上に敷設するための、毛羽が少なく丈夫で衝撃に強い赤色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "絨毯(工業/黄)" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "剥き出しのコンクリート上に敷設するための、毛羽が少なく丈夫で衝撃に強い黄色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "絨毯(工業/緑)" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "剥き出しのコンクリート上に敷設するための、毛羽が少なく丈夫で衝撃に強い緑色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "絨毯(工業/紫)" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "剥き出しのコンクリート上に敷設するための、毛羽が少なく丈夫で衝撃に強い紫色の絨毯です。" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "金属床上のカーペットのベースです!" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "絨毯(掩体壕/赤)" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "断熱層を備えた、毛羽が少なく丈夫で衝撃に強い赤色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "絨毯(掩体壕/黄)" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "断熱層を備えた、毛羽が少なく丈夫で衝撃に強い黄色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "絨毯(掩体壕/緑)" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "断熱層を備えた、毛羽が少なく丈夫で衝撃に強い緑色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "絨毯(掩体壕/紫)" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "断熱層を備えた、毛羽が少なく丈夫で衝撃に強い紫色の絨毯です。" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "リノリウムタイル" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "ゴムのような丈夫な素材で作られた、シンプルな白色の床です。" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "ゴムのような丈夫な素材で作られた、灰色の床です。" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "ワックスを塗った床" @@ -182020,6 +188044,33 @@ msgid "" msgstr "" "頑丈な骨組みにボルトとワイヤーで固定された廃金属製の壁です。ポストアポカリプス的なボロ家に良く似合う見た目をしています。トタン屋根に雨粒が当たる音が気にならないと良いのですが。" +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "土" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "土です。耕作に適した土壌のようです。掘り返して建設準備を行うことも可能です。" + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "上手く掘り出せば色々なことに役立ちそうな細かい砂からなる地面です。" + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "泥" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "濡れて光沢を放つ泥です。" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "苔" @@ -182029,6 +188080,30 @@ msgstr "苔" msgid "Moist spongy moss." msgstr "湿ったフワフワの苔です。" +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "粘土" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "柔らかい粘土からなる地面です。粘土を上手く掘り出せば、色々な使い道がありそうです。" + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "粘土の山" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "粘土質の土の山です。" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "バシャッ!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "床(紙)" @@ -182038,6 +188113,134 @@ msgstr "床(紙)" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "粘着性のあるスズメバチの唾液で覆われた、パルプ状の物質で作られた床です。" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "砂の山" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "砂の山です。" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "畝" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "土が盛り上がっており、乗り越えて移動するのに時間がかかりそうです。よく見ると種などを植えられそうです。" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "大きな土の山です。中を掘りぬけばシェルターになりそうです。" + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "奇妙な亀裂" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" +"この異様な人型の穴を、何故かよく知っているような気がします。これが自分の物であるような気がして、もっと近寄って見てみたいという奇妙な感覚になります。" + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "墓穴" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "少し草が茂った、既に埋まっている墓穴です。少なくともここにいる死者は安らかに眠っています。" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" +"真新しい墓穴です。誰かが掘り返さないように、もしくは中からこじ開けられないように、石の蓋が置いてあります。2枚の板切れで、ここで誰かが永遠の休息を取っている事を示す印が形作られています。" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "道路" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "アスファルトの一部は氷結や整備不足からゆっくりとひび割れ、劣化し始めています。" + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "車線" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" +"丁寧に並んだ黄色いペンキの縞模様は、運転者が道路をはみ出さないよう注意するために付けられた印です。こんなルールを強制する者はもう誰一人残っていません。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "歩道" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "公共区画に敷かれたコンクリートは氷結によって損傷し、整備不足のために大きなひびが入っています。" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "より美しく霜が付きにくい表面仕上げが施された、比較的新しい公共区画のコンクリートです。" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "より美しく霜が付きにくい表面仕上げが施された、比較的新しい公共区画のコンクリートです。黄色の塗料で縞模様が描かれています。" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "床(木)" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "木の板を隙間なく敷き詰めて釘で打ち付けた床です。テラスなどでよく見られます。" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "頑丈で高品質な床材を使って転倒のリスクを軽減した格子模様の床です。" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "目の細かい土を押し固めて作った床です。" + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "クルミの木" @@ -183263,12 +189466,12 @@ msgstr "危ない!給油ポンプは壊れており、価値ある液体を汲 #. ~ Description for fuel tank #: lang/json/terrain_from_json.py msgid "A tank filled with diesel." -msgstr "" +msgstr "灯油を満載したタンクです。" #. ~ Description for broken fuel tank #: lang/json/terrain_from_json.py msgid "A broken tank which was filled with diesel." -msgstr "" +msgstr "灯油を満載した壊れたタンクです。" #: lang/json/terrain_from_json.py msgid "diesel pump" @@ -185868,6 +192071,78 @@ msgstr "上方に伸びた梯子です。" msgid "A ladder leading down." msgstr "下方に伸びた梯子です。" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "下り傾斜路(上端)" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "下へと続くアスファルト坂の上端です。" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "下り傾斜路(下端)" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "下へと続くアスファルト坂の下端です。" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "上り傾斜路(上端)" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "上へと続くアスファルト坂の上端です。" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "上り傾斜路(下端)" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "上へと続くアスファルト坂の下端です。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "下りスロープ(上端)" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "下へと続くアスファルト製スロープの上端です。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "下りスロープ(下端)" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "下へと続くアスファルト製スロープの下端です。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "上りスロープ(上端)" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "上へと続くアスファルト製スロープの上端です。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "上りスロープ(下端)" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "上へと続くアスファルト製スロープの下端です。" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "下り坂" @@ -186212,7 +192487,7 @@ msgstr "持ち上げ(セルフ)" #: lang/json/tool_quality_from_json.py msgid "siphoning" -msgstr "" +msgstr "抜取" #: lang/json/tool_quality_from_json.py msgid "chiseling" @@ -186361,7 +192636,7 @@ msgstr "ガチャンッ!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "バァン!" @@ -186421,7 +192696,7 @@ msgstr "縦樋漏斗" #: lang/json/trap_from_json.py msgid "firewood source" -msgstr "焚木置き場" +msgstr "焚物置き場" #: lang/json/trap_from_json.py msgid "practice target" @@ -187776,7 +194051,7 @@ msgstr "車載/M249" #: lang/json/vehicle_part_from_json.py msgid "mounted M249S" -msgstr "" +msgstr "車載/M249S" #: lang/json/vehicle_part_from_json.py msgid "mounted gatling shotgun" @@ -187804,7 +194079,7 @@ msgstr "車載/M60" #: lang/json/vehicle_part_from_json.py msgid "mounted M60 Semi Auto" -msgstr "" +msgstr "車載/M60セミオート" #: lang/json/vehicle_part_from_json.py msgid "mounted Mark 19 grenade launcher" @@ -188178,6 +194453,11 @@ msgstr "船体(木)" msgid "A wooden board that keeps the water out of your boat." msgstr "ボートが浸水するのを防ぐ木製の板です。" +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "丸太同士が水に浮くように繋がっています。" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -188620,14 +194900,19 @@ msgid "" msgstr "非常に重い牽引ケーブルです。ケーブルのもう一方端が他の車両に取り付けられていれば牽引できます。" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "座席(木)" +msgid "flimsy wooden seat" +msgstr "簡易座席(木)" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "座る場所です。" +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "座席(木)" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "スパイク(木)" @@ -188836,6 +195121,15 @@ msgid "" "extending the time until the food spoils." msgstr "容量60Lの冷蔵タンクです。電源を入れると中に入れた液体が冷え、日持ちするようになります。" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "自転車やバイクのホイールを取り付ける穴が付いた木製部品です。" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "木製ホイールハブ (転舵輪)" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "小型ホイールハブ (転舵輪)" @@ -189443,6 +195737,11 @@ msgstr "ゲーム開始" msgid "At least %s from %s (%s remaining)" msgstr "%s生き残る(現在%sから%s経過)" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "正確に%sから%sまで" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -189459,17 +195758,18 @@ msgid "Within %s of %s (passed)" msgstr "%s以内にモンスターを殺害する(現在%sから目標時間経過済み)" #: src/achievement.cpp -msgid "Triggered by " -msgstr "判定タイミング: " +#, c-format +msgid "Triggered by %s" +msgstr "%s時点で判定" #: src/achievement.cpp #, c-format -msgid "%s/%s " -msgstr "%s/%s " +msgid "%s/%s %s" +msgstr "%s/%s %s" #: src/achievement.cpp msgid " (further requirements hidden)" -msgstr "" +msgstr "(隠された追加条件があります)" #: src/achievement.cpp #, c-format @@ -189479,7 +195779,7 @@ msgstr "%sに達成" #: src/achievement.cpp #, c-format msgid "Failed %s" -msgstr "" +msgstr "%sに失敗しました" #: src/achievement.cpp msgid "" @@ -189622,11 +195922,11 @@ msgstr "付近のドアのロックが解除されました。" #: src/activity_actor.cpp msgid "You found the wire that starts the engine." -msgstr "" +msgstr "エンジンを始動させるワイヤーを見つけました。" #: src/activity_actor.cpp msgid "You found a wire that looks like the right one." -msgstr "" +msgstr "恐らく目当てのワイヤーを見つけました。" #: src/activity_actor.cpp msgid "The red wire always starts the engine, doesn't it?" @@ -189634,7 +195934,7 @@ msgstr "エンジンを始動するのは赤のケーブルに決まっている #: src/activity_actor.cpp msgid "By process of elimination, you found the wire that starts the engine." -msgstr "" +msgstr "エンジンを始動するワイヤーだと消去法で判断したものを見つけました。" #: src/activity_actor.cpp msgid "Moving canceled auto-pickup." @@ -189668,8 +195968,9 @@ msgstr "解錠に失敗し、道具を少し壊してしまいました。" msgid "The lock stumps your efforts to pick it." msgstr "上手く鍵を開けられませんでした。" -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "騎乗中にその行動はできません。" @@ -189706,7 +196007,7 @@ msgstr "それはピッキングできません。" #: src/activity_actor.cpp msgid "" "You feel you should've fallen asleep by now, but somehow you're still awake." -msgstr "" +msgstr "さっき眠りに落ちたはずなのに、何故かまだ起きています。" #: src/activity_actor.cpp msgid "You toss and turn…" @@ -189714,7 +196015,7 @@ msgstr "寝返りを打ちました..." #: src/activity_actor.cpp msgid "You try to sleep, but can't." -msgstr "" +msgstr "眠ろうとしましたが眠れません。" #: src/activity_actor.cpp msgid "You have trouble sleeping, keep trying?" @@ -189732,6 +196033,120 @@ msgstr "睡眠" msgid "Continue trying to fall asleep and don't ask again." msgstr "睡眠(以降の中断警告を無視)" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "疲れ過ぎていて運動できません。" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "喉が渇き過ぎていて運動できません。" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "まず装備を外してください。" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "腕が折れていては訓練できません。" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -191383,7 +197798,7 @@ msgstr "[<] ページ %1$d / %2$d [>]" msgid "< [%s] Sort: %s >" msgstr "< [%s] 整列: %s >" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "[%s] フィルタ" @@ -194290,6 +200705,29 @@ msgstr "%s(%iスロット)" msgid "Increased storage capacity by %i." msgstr "蓄電容量が%i増加しました。" +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "起動する電力量を選択" @@ -194456,8 +200894,9 @@ msgid "(incapacitated)" msgstr "(使用不可)" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" -msgstr "(節約ON)" +#, c-format +msgid "(fuel saving ON > %d %%)" +msgstr "" #: src/bionics_ui.cpp #, c-format @@ -194528,10 +200967,18 @@ msgstr "" msgid "Accuracy" msgstr "命中" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "会心発生率" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "回避" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "ブロック効果" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "速度" @@ -195010,20 +201457,25 @@ msgstr "は立ち上がりました。" #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%sがクモの巣から自由になりました!" +msgid "The %s escapes the bear trap!" +msgstr "%sはトラバサミを外して、自由になりました!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "クモの巣を払って、自由になりました!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "%sはトラバサミから逃れようとしましたが、上手く外れません!" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr "はクモの巣を払って、自由になりました!" +msgid "You free yourself from the bear trap!" +msgstr "トラバサミを外して、自由になりました!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "クモの巣を払おうとしましたが、上手く払えませんでした!" +msgid " frees themselves from the bear trap!" +msgstr "はトラバサミを外して、自由になりました!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "トラバサミを外そうとしましたが、上手く外せませんでした!" #: src/character.cpp src/monster.cpp #, c-format @@ -195059,28 +201511,6 @@ msgstr "は強化くくり罠を外して、自由になりました! msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "強化くくり罠を外そうとしましたが、上手く外せませんでした!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%sはトラバサミを外して、自由になりました!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "%sはトラバサミから逃れようとしましたが、上手く外れません!" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "トラバサミを外して、自由になりました!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr "はトラバサミを外して、自由になりました!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "トラバサミを外そうとしましたが、上手く外せませんでした!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "瓦礫をどけて、自由になりました!" @@ -195093,18 +201523,6 @@ msgstr "は瓦礫をどけて、自由になりました!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "瓦礫をどけようとしましたが、上手くどけられませんでした!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "穴からの脱出を試みましたが、滑り落ちてしまいました。" - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "穴から脱出しました!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr "は穴から脱出しました!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -195144,6 +201562,52 @@ msgstr "拘束を解きました!" msgid " breaks out of the grab!" msgstr "は拘束を解きました!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%sがクモの巣から自由になりました!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "クモの巣を払って、自由になりました!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr "はクモの巣を払って、自由になりました!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "クモの巣を払おうとしましたが、上手く払えませんでした!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "穴からの脱出を試みましたが、滑り落ちてしまいました。" + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "穴から脱出しました!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr "は穴から脱出しました!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -195417,7 +201881,7 @@ msgstr "潤喉 *" #: src/character.cpp msgid "Satisfied" -msgstr "" +msgstr "満足" #: src/character.cpp msgid "Hungry" @@ -195441,7 +201905,7 @@ msgstr "空腹 ***" #: src/character.cpp msgid "ERROR!" -msgstr "" +msgstr "エラー!" #: src/character.cpp src/npctalk.cpp msgid "Exhausted" @@ -195985,6 +202449,10 @@ msgstr "EXTRA_EXERCISE" msgid "Your body strains under the weight!" msgstr "身体が重荷に悲鳴を上げました。" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -196380,7 +202848,7 @@ msgstr "友好NPCはこの区域内から発生する正体不明の音のみを #: src/clzones.cpp msgid "Source: Firewood" -msgstr "供給: 焚き木" +msgstr "供給: 焚物" #: src/clzones.cpp msgid "" @@ -196388,7 +202856,7 @@ msgid "" " automatically refuel fires. This will be done to maintain light during " "long-running tasks such as crafting, reading or waiting." msgstr "" -"印を付けたタイルに置かれている焚き木など可燃物は、火の中へ自動的に補給されます。製作や読書などの長時間の作業時には、火を絶やさないよう自動補給機能が働きますが、火の傍でただ立っているだけの時などは、自動補給は行われません。" +"印を付けたタイルに置かれている木材などの可燃物は、火の中へ自動的に補給されます。製作や読書などの長時間の作業時には、火を絶やさないよう自動補給機能が働きますが、火の傍でただ立っているだけの時などは、自動補給は行われません。" #: src/clzones.cpp msgid "Construction: Blueprint" @@ -198037,7 +204505,7 @@ msgstr "材料を使い果たしました。" msgid "" "You don't have anything in which to store %s and may have to pour it out as " "soon as it is prepared! Proceed?" -msgstr "" +msgstr "%sを保管できる容器を持っていないため、外に流れ出してしまいます!続けますか?" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -198963,14 +205431,6 @@ msgstr "テスト - 描画ベンチマーク(X秒)" msgid "Test trait group" msgstr "テスト - 特質グループ" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "表示 - デバッグメッセージ" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "テスト - 強制終了処理" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "表示 - NPC移動経路" @@ -198999,6 +205459,18 @@ msgstr "情報..." msgid "Enable achievements" msgstr "有効化 - 実績" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "表示 - デバッグメッセージ" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "テスト - 強制終了処理" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "ゲーム終了" + #: src/debug_menu.cpp msgid "Game…" msgstr "ゲーム..." @@ -199095,10 +205567,6 @@ msgstr "生成 - 入れ子構造地形" msgid "Map…" msgstr "マップ..." -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "ゲーム終了" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -199622,6 +206090,10 @@ msgstr "依頼を完了する" msgid "Remove mission without proper cleanup" msgstr "適切な手順を経ずに依頼を削除する" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "ベンチマーク進行中..." + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -200139,19 +206611,6 @@ msgstr "" "屋内: %s\n" "屋根: %s" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" -"視認: %d\n" -"回避: %d\n" -"難易度: %d\n" -"無害: %s" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -200850,140 +207309,184 @@ msgid "Liked" msgstr "友好的" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "伝説的" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" -msgstr "無名" +msgstr "傑出" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" -msgstr "強大" +msgstr "高名" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "有名" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" -msgstr "有名" +msgstr "名うて" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" -msgstr "語り草" +msgstr "風の噂" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "無価値なカス" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "虫けら" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" -msgstr "卑賤" +msgstr "軽蔑" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" -msgstr "寄生虫" +msgstr "厄介者" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" -msgstr "腰巾着" +msgstr "取り巻き" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" -msgstr "笑い者" +msgstr "軽視" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "中立的" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" -msgstr "守銭奴" +msgstr "大富豪" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "富裕" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "潤沢" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" -msgstr "余裕がある" +msgstr "余裕" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "快適" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" -msgstr "物足りない" +msgstr "不足ぎみ" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" -msgstr "破綻傾向" +msgstr "貧乏" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" -msgstr "不毛" +msgstr "困窮" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" -msgstr "貧困" +msgstr "絶望的" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" -msgstr "有り余る" +msgstr "豊穣" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" -msgstr "余裕がある" +msgstr "万全" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "その日暮らし" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "栄養失調" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "飢餓" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "伝説的" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "歴戦" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "熟練" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "経験豊富" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "標準的" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "訓練不足" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" -msgstr "烏合の衆" +msgstr "未熟" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" -msgstr "脆弱" +msgstr "ド素人" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" -msgstr "一銭の価値もない" +msgstr "無価値" #: src/faction.cpp msgid "Press enter to rename this camp" @@ -201592,12 +208095,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -201606,12 +208109,12 @@ msgid "" "Positions: %d/3\n" msgstr "" "メモ:\n" -"仲間を派遣して、枯れ草や重棒などを集めてきてもらいます。\n" +"仲間を派遣して、枯れ草や頑丈な短枝などを集めてきてもらいます。\n" " \n" "適用スキル: サバイバル\n" "難易度: なし \n" "拾得予定:\n" -"> 重棒\n" +"> 頑丈な短枝\n" "> 枯れ草\n" "> 裂けた木材\n" " \n" @@ -202873,8 +209376,8 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "「拠点: 備蓄食料」区域がありません。作業を中止します..." #: src/faction_camp.cpp -msgid "No items are located at the drop point…" -msgstr "収集地点にアイテムがありません..." +msgid "No suitable items are located at the drop points…" +msgstr "収集地点に適切なアイテムがありません..." #: src/faction_camp.cpp #, c-format @@ -203015,7 +209518,7 @@ msgstr "実績「%s」を取得しました。" #: src/game.cpp #, c-format msgid "You lost the conduct \"%s\"." -msgstr "" +msgstr "「%s」の制約を破りました。" #: src/game.cpp src/options.cpp #, c-format @@ -203086,6 +209589,15 @@ msgstr "%sが至近距離に迫っています!" msgid "Wait till you wake up…" msgstr "睡眠中..." +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" +"\n" +"%sで中断" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -203196,6 +209708,11 @@ msgctxt "action" msgid "open" msgstr "開ける" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "ポケット自動拾得設定" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -203673,46 +210190,46 @@ 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 maybe %s, but might also go out " "sooner." -msgstr "%sは燃え続けそうですが、焚き木を追加しなければすぐに消えてしまいます。" +msgstr "%sは燃え続けそうですが、焚物を追加しなければすぐに消えてしまいます。" #: src/game.cpp #, c-format msgid "" "Without extra fuel it might burn yet for between %s to %s, but might also go" " out sooner." -msgstr "%sから%sは燃え続けそうですが、焚き木を追加しなければすぐに消えてしまいます。" +msgstr "%sから%sは燃え続けそうですが、焚物を追加しなければすぐに消えてしまいます。" #: src/game.cpp msgid "" "It's quite decent and looks like it'll burn for a bit without extra fuel." -msgstr "十分な火力があり、焚き木を追加しなくても少しは燃え続けそうです。" +msgstr "十分な火力があり、焚物を追加しなくても少しは燃え続けそうです。" #: src/game.cpp msgid "It looks solid, and will burn for a few hours without extra fuel." -msgstr "十分な火力があり、焚き木を追加しなくても数時間は燃え続けそうです。" +msgstr "十分な火力があり、焚物を追加しなくても数時間は燃え続けそうです。" #: src/game.cpp msgid "" "It's very well supplied and even without extra fuel might burn for at least " "a part of a day." -msgstr "焚き木が十分にくべられており、そのままでも1日は燃え続けそうです。" +msgstr "焚物が十分にくべられており、そのままでも1日は燃え続けそうです。" #: src/game.cpp #, c-format msgid "Without extra fuel it will burn for about %s." -msgstr "焚き木を追加しなくても%sは燃え続けそうです。" +msgstr "焚物を追加しなくても%sは燃え続けそうです。" #: src/game.cpp #, c-format msgid "Without extra fuel it will burn for between %s to %s." -msgstr "焚き木を追加しなくても%sから%sは燃え続けそうです。" +msgstr "焚物を追加しなくても%sから%sは燃え続けそうです。" #: src/game.cpp msgid "You cannot interact with a vehicle while mounted." @@ -203828,16 +210345,16 @@ msgstr "視界外" #: src/game.cpp #, c-format msgid "Cover: %d%%" -msgstr "" +msgstr "遮蔽率: %d%%" #: src/game.cpp msgid "Impassable" -msgstr "" +msgstr "通行不可" #: src/game.cpp #, c-format msgid "Move cost: %d" -msgstr "" +msgstr "移動コスト: %d" #: src/game.cpp #, c-format @@ -203865,7 +210382,7 @@ msgstr "未完成のタスク: %s(%d%%)" #: src/game.cpp msgid "Vehicle: " -msgstr "" +msgstr "車両: " #: src/game.cpp msgid "You cannot see what is inside of it." @@ -204280,6 +210797,10 @@ msgstr "装填するアイテムがありません。" msgid "You aren't holding something you can reload." msgstr "装填できるものを所持していません。" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -204707,11 +211228,25 @@ msgstr "通行の邪魔になっている%sを押し退けました。" msgid "You cannot haul items here." msgstr "この場所のアイテムは一括移動できません。" +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "%sが邪魔です!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "%sが邪魔です!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "%s押し退けますか?戦闘が発生する可能性があります。" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -205001,39 +211536,39 @@ msgstr "速度 %s%d! " #: src/game.cpp msgid "Your skill in parkour makes it easier to climb." -msgstr "" +msgstr "パルクールの腕前があるので簡単に登れます。" #: src/game.cpp msgid "Your bad knees make it difficult to climb." -msgstr "" +msgstr "膝が悪いため登り辛くなっています。" #: src/game.cpp msgid "Your wet feet make it harder to climb." -msgstr "" +msgstr "足が濡れているため登り辛くなっています。" #: src/game.cpp msgid "Your wet hands make it harder to climb." -msgstr "" +msgstr "手が濡れているため登り辛くなっています。" #: src/game.cpp msgid "Your carried weight tries to drag you down." -msgstr "" +msgstr "重量のせいでずり落ちそうになっています。" #: src/game.cpp msgid "You strain to climb with the weight of your possessions." -msgstr "" +msgstr "荷物の重さで非常に登り辛くなっています。" #: src/game.cpp msgid "You feel the weight of your luggage makes it more difficult to climb." -msgstr "" +msgstr "荷物の重さで登り辛くなっています。" #: src/game.cpp msgid "Your carried weight makes it a little harder to climb." -msgstr "" +msgstr "荷物が負担になっている気がします。" #: src/game.cpp msgid "You slip while climbing and fall down." -msgstr "" +msgstr "登る途中で滑って落ちました。" #: src/game.cpp msgid "Climbing is impossible in your current state." @@ -205419,7 +211954,7 @@ msgstr "コスト" #: src/game_inventory.cpp msgid "WIELD COST" -msgstr "" +msgstr "装備コスト" #: src/game_inventory.cpp msgid "Wield item" @@ -206088,11 +212623,6 @@ msgstr "どこかのお馬鹿さんが邪魔で閉められません!" msgid "The %s is in the way!" msgstr "%sが邪魔です!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "%sが邪魔です!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -206213,7 +212743,7 @@ msgstr "この車両は飛び辛そうです。" #: src/handle_action.cpp msgid "This vehicle cannot be flown without z levels." -msgstr "" +msgstr "この車両はZ軸拡張がないと飛行できません。" #: src/handle_action.cpp msgid "You steer the vehicle into a descent." @@ -206333,7 +212863,7 @@ msgstr "%sは粉々になりました!" #: src/handle_action.cpp #, c-format msgid "You hurt your hands trying to smash the %s." -msgstr "" +msgstr "%sを叩こうとして手を痛めました。" #: src/handle_action.cpp msgid "There's nothing there to smash!" @@ -206606,7 +213136,7 @@ msgstr "移動モードを選択" #: src/handle_action.cpp msgid "Cycle move mode" -msgstr "" +msgstr "循環切替/移動モード" #: src/handle_action.cpp msgid "You don't know any spells to cast." @@ -206823,6 +213353,10 @@ msgstr "レーザー照準を無視しました!" msgid "Creature whitelisted: %s" msgstr "ホワイトリストに登録: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "自殺しますか?" @@ -207103,7 +213637,7 @@ msgstr[0] "引出金額を入力 最大: %dセント(0で取消) " #: src/iexamine.cpp msgid "All cash cards at maximum capacity" -msgstr "" +msgstr "全てのキャッシュカードが最大容量に達しました" #: src/iexamine.cpp msgid "The vending machine is empty." @@ -207351,6 +213885,11 @@ msgstr "金庫破りを開始しました。" msgid "Attempt to hack this safe?" msgstr "金庫破りを試みますか?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "%sには鍵がかかっています。適切な道具があればこじ開けられそうです..." + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -208172,11 +214711,28 @@ msgstr "%sは見るからに危険です。あまり近寄らないようにし msgid "There is a %s there. Take down?" msgstr "%sがあります。片付けますか?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "%sは取り外されました。" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "%sがあります。解除しますか?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "罠を解除しました!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "罠の解除に失敗しました。" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "罠の解除に失敗し、作動させてしまいました!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -208280,17 +214836,17 @@ msgstr "文盲なので、画面に表示された文章を読めません。" #: src/iexamine.cpp #, c-format msgid "Failure! No %s pumps found!" -msgstr "" +msgstr "失敗しました!%sポンプが見当たりません!" #: src/iexamine.cpp #, c-format msgid "Failure! No %s tank found!" -msgstr "" +msgstr "失敗しました!%sタンクが見当たりません!" #: src/iexamine.cpp #, c-format msgid "This station is out of %s. We apologize for the inconvenience." -msgstr "" +msgstr "当ガソリンスタンドは%sの在庫が不足しています。ご不便をお掛けして申し訳ございません。" #: src/iexamine.cpp msgid "Welcome to AutoGas!" @@ -208303,7 +214859,7 @@ msgstr "御用は何ですか?" #: src/iexamine.cpp #, c-format msgid "Buy %s." -msgstr "" +msgstr "%sの購入" #: src/iexamine.cpp msgid "Refund cash." @@ -208312,12 +214868,12 @@ msgstr "現金の払い戻し" #: src/iexamine.cpp #, c-format msgid "Current %s pump: " -msgstr "" +msgstr "現在の%sポンプ: " #: src/iexamine.cpp #, c-format msgid "Choose a %s pump." -msgstr "" +msgstr "%sポンプの変更" #: src/iexamine.cpp msgid "Your discount: " @@ -208326,7 +214882,7 @@ msgstr "割引: " #: src/iexamine.cpp #, c-format msgid "Your price per %s unit: " -msgstr "" +msgstr "%s価格(単位): " #: src/iexamine.cpp msgid "Hack console." @@ -208335,7 +214891,7 @@ msgstr "コンソールをハッキングしました。" #: src/iexamine.cpp #, c-format msgid "Please choose %s pump:" -msgstr "" +msgstr "%sポンプの選択: " #: src/iexamine.cpp msgid "Pump " @@ -208348,7 +214904,7 @@ msgstr "お金が足りません、キャッシュカードにお金を補充し #: src/iexamine.cpp #, c-format msgid "How many liters of %s to buy? Max: %d L. (0 to cancel)" -msgstr "" +msgstr "%sを何リットル購入しますか?最大: %dL(0で取消) " #: src/iexamine.cpp msgid "Glug Glug Glug" @@ -208402,7 +214958,7 @@ msgstr "地形を飛び越えました。" #: src/iexamine.cpp msgid "You can't climb down there." -msgstr "" +msgstr "ここは降りられません。" #: src/iexamine.cpp #, c-format @@ -208430,11 +214986,11 @@ msgstr "一度降りると恐らく引き返すのは困難です。降ります #: src/iexamine.cpp msgid "Use your grappling hook to climb down?" -msgstr "" +msgstr "フック付きロープを使って降りますか?" #: src/iexamine.cpp msgid "You tie the rope around your waist and begin to climb down." -msgstr "" +msgstr "腰にロープを結び付け、降り始めました。" #: src/iexamine.cpp msgid "You decided to step back from the ledge." @@ -208468,7 +215024,7 @@ msgstr "患者は死亡しています。続行するには死体を除去して msgid "" "ERROR Bionic Level Assessment: FULL CYBORG. Autodoc Mk. XI can't operate. " "Please move patient to appropriate facility. Exiting." -msgstr "" +msgstr "生体レベル評価エラー: 完全機械化済。オートドクMk.XIは未対応です。患者を適切な装置に移してください。操作を終了します。" #: src/iexamine.cpp msgid "Autodoc Mk. XI. Status: Online. Please choose operation." @@ -208550,6 +215106,10 @@ msgstr "摘出するCBMを選択してください" msgid "Splint broken limbs" msgstr "骨折箇所を固定する" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "傷を治療する" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "CBMが体内に一つもありません。" @@ -208577,16 +215137,80 @@ msgid " doesn't have limbs that require splinting." msgstr "%1$sに固定が必要な四肢はありません。" #: src/iexamine.cpp -msgid "This mill already contains flour." -msgstr "この製粉機には既に穀粉が入っています。" +msgid "You don't have any wounds that need treatment." +msgstr "治療な必要な傷はありません。" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "に治療が必要な傷はありません。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" +"オートドクは身体が細菌に感染していることを検出しました。しかし、既に抗生物質を服用していることも検出したため、今すぐ再治療する必要はないと判断しました。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" +"オートドクはの身体が細菌に感染していることを検出しました。しかし、既に抗生物質を服用していることも検出したため、今すぐ再治療する必要はないと判断しました。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "オートドクは身体が細菌に感染していることを検出し、抗生物質を注射しました。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "オートドクはの身体が細菌に感染していることを検出し、抗生物質を注射しました。" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "発作が収まり始めました。" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "発作に効く薬ではないようです。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "オートドクは%sからの出血を検出し、止血剤を塗布して治療しました。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "オートドクはの%sからの出血を検出し、止血剤を塗布して治療しました。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "オートドクは%sに傷口を検出し、消毒薬を塗布して治療しました。" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." -msgstr "製粉機を再稼働させる前に、内容物を取り出してください。" +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "オートドクはの%sに傷口を検出し、消毒薬を塗布して治療しました。" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "This mill contains %s, which can't be milled!" msgstr "製粉機に入っている%sは製粉できません!" #: src/iexamine.cpp @@ -208760,8 +215384,9 @@ msgid "Remove brake and start milling" msgstr "稼働して製粉を始める" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." -msgstr "石臼を稼働して製粉を開始します。完成まで約6時間かかります。" +#, c-format +msgid "Remove brake and start milling, milling will take about %s." +msgstr "石臼を稼働して製粉を開始します。完成まで約%sかかります。" #: src/iexamine.cpp msgid "Insert products for milling… mill is full" @@ -208794,18 +215419,8 @@ msgstr "製粉機があります。石臼が回転して製粉を行っていま #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "あと%d時間ほどで製粉が完了します。" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "あと1時間ほどで製粉が完了します。" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." -msgstr "あと%d分ほどで製粉が完了します。" +msgid "It should take about %s to finish milling." +msgstr "あと%sほどで製粉が完了します。" #: src/iexamine.cpp msgid "There's a mill here." @@ -208988,6 +215603,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr "は%sのレシピを知らないため、製作を続けられません。" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "最終処理中" @@ -209078,7 +215698,7 @@ msgstr "派閥" #: src/init.cpp msgid "Move modes" -msgstr "" +msgstr "移動モード" #: src/init.cpp msgid "Crafting recipes" @@ -209565,7 +216185,7 @@ msgstr "体積(%s): " msgid "There are no available choices" msgstr "選択できるアイテムがない" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "[%s] フィルタ: " @@ -209889,7 +216509,7 @@ msgstr "分量: " #: src/item.cpp msgid "Consume time: " -msgstr "" +msgstr "消費所要時間:" #: src/item.cpp msgid "* Consuming this item is addicting." @@ -209993,7 +216613,7 @@ msgid "" msgstr "" "この食べ物は腐敗が始まっています。食べるのは避けるべきです。" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -210138,7 +216758,7 @@ msgstr "" #: src/item.cpp msgid " moves" -msgstr "" +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -210164,7 +216784,7 @@ msgstr[0] "%i個の空薬莢が内部に残存" #: src/item.cpp msgid "This weapon needs two free hands to fire." -msgstr "" +msgstr "この銃器の発射には両手を空ける必要があります。" #: src/item.cpp msgid "" @@ -210180,11 +216800,11 @@ msgstr "銃器に取り付けると遠い間合いから攻撃obscures sights of the base weapon." -msgstr "" +msgstr "このMODは取り付けた銃器の照準速度を低下させます。" #: src/item.cpp msgid "This mod might suffer wear when firing the base weapon." -msgstr "" +msgstr "このMODは弾薬を発射すると摩耗する可能性があります。" #: src/item.cpp msgid "Dispersion modifier: " @@ -210434,10 +217054,6 @@ msgstr "所持重量変更: " msgid "Weight capacity bonus: " msgstr "所持重量ボーナス: " -#: src/item.cpp -msgid "Storage: " -msgstr "収納容積: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* このアイテムはヘルメットと同時に着用可能です。" @@ -210705,6 +217321,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* この道具はCBM電力で作動します。" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "まだ燃えていません。すぐに火がつきます。" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "ほとんど燃えていません。燃える素材は十分残っています。" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "4分の1以上が燃え尽きました。" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "半分以上が燃え尽きました。" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "燃える素材はもう4分の1も残っていません。" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "ほぼ完全に燃え尽きました。" + +#: src/item.cpp +msgid "Fuel: " +msgstr "焚物: " + #: src/item.cpp #, c-format msgid "Using: %s" @@ -210728,12 +217372,27 @@ msgstr "* このアイテムは補強可能です。" msgid "* This item is not repairable." msgstr "* このアイテムは修復不可能です。" +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "Disassembly takes %1$s and might yield: %2$s." msgstr "" -"分解所要時間: %s\n" -"分解結果: %s" +"分解所要時間: %1$s\n" +"分解結果: %2$s" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. +#: src/item.cpp +#, c-format +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." +msgstr "" +"分解所要時間: %1$s\n" +"必要: %2$s\n" +"分解結果:%3$s" #: src/item.cpp #, c-format @@ -210846,27 +217505,28 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "会心発生率 %d%% - %d%%" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" -msgstr "打撃 %d (会心時 %d)" +msgid "Bashing: " +msgstr "打撃: " #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" -msgstr "斬撃 %d (会心時 %d)" +msgid "Critical bash: " +msgstr "打撃会心: " #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" -msgstr "刺突 %d (会心時 %d)" +msgid "Cutting: " +msgstr " 斬撃: " #: src/item.cpp -#, c-format -msgid "%d moves per attack" -msgstr "攻撃の行動コスト: %d" +msgid "Critical cut: " +msgstr "斬撃会心: " + +#: src/item.cpp +msgid "Piercing: " +msgstr "刺突: " + +#: src/item.cpp +msgid "Critical pierce: " +msgstr "刺突会心: " #: src/item.cpp msgid "Integrated mod: " @@ -211446,8 +218106,9 @@ msgstr "%1$sにはこれ以上%2$sを入れられません。" msgid "That %s doesn't have room to expand." msgstr "%sには拡張する余裕がありません。" -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%dx%s" @@ -211569,30 +218230,86 @@ msgstr "動作を実行できるアイテムを何も持っていません。" msgid "Execute which action?" msgstr "どの動作を実行しますか?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "%s追加モード" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "ブラックリスト" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "ホワイトリスト" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "優先度、" + +#: src/item_contents.cpp +msgid " item, " +msgstr "アイテム、" + +#: src/item_contents.cpp +msgid " category, " +msgstr "分類、" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "ホワイトリスト、" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "ブラックリスト" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "優先度を入力(現在: %d)" + +#: src/item_contents.cpp +msgid "item id" +msgstr "アイテムID" + +#: src/item_contents.cpp +msgid "item category" +msgstr "アイテム分類" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "付近のアイテムを選択" + #: src/item_contents.cpp msgid "is not a container" msgstr "は容器ではない" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "には剛性がない" #: src/item_contents.cpp msgid "Total capacity:" -msgstr "" +msgstr "総容量:" #: src/item_contents.cpp src/item_pocket.cpp msgid " Weight: " -msgstr "" +msgstr "重量: " #: src/item_contents.cpp #, c-format msgid "%d Pockets with capacity:" -msgstr "" +msgstr "%d個のポケット:" #: src/item_contents.cpp msgid "Pocket with capacity:" -msgstr "" +msgstr "ポケット:" #: src/item_factory.cpp msgid "" @@ -211609,6 +218326,11 @@ msgstr "どのグループをテストしますか?" msgid "Result of 100 spawns:" msgstr "100スポーンの結果: " +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%dx%s" + #: src/item_location.cpp msgid "inventory" msgstr "所持品" @@ -211632,23 +218354,27 @@ msgid "Pocket %d:" msgstr "ポケット%d:" #: src/item_pocket.cpp -msgid "Maximum item length: " +msgid "Holds: " msgstr "" +#: src/item_pocket.cpp +msgid "Maximum item length: " +msgstr "最大長: " + #: src/item_pocket.cpp #, c-format msgid "Minimum item volume: %s" -msgstr "" +msgstr "最小容量: %s" #: src/item_pocket.cpp #, c-format msgid "Maximum item volume: %s" -msgstr "" +msgstr "最大容量: %s" #: src/item_pocket.cpp #, c-format msgid "Base moves to remove item: %d" -msgstr "" +msgstr "取出基本コスト: %d" #: src/item_pocket.cpp msgid "This pocket is rigid." @@ -211687,7 +218413,7 @@ msgstr "収納されたアイテムは元の重量の%.0f%% msgid "" "This pocket expands at %.0f%% of the rate of volume of " "items inside." -msgstr "" +msgstr "このポケットは体積が内部アイテムの%.0f%%分増加します。" #: src/item_pocket.cpp #, c-format @@ -211721,7 +218447,7 @@ msgstr "MOD以外は収納できない" #: src/item_pocket.cpp msgid "holster does not accept this item type" -msgstr "" +msgstr "ホルスターはこのアイテムを収納できません" #: src/item_pocket.cpp msgid "holster already contains an item" @@ -211791,6 +218517,34 @@ msgstr "総重量が重すぎる" msgid "not enough space" msgstr "容積が足りない" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "優先度:" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "アイテムホワイトリスト: %s" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "(空)" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "アイテムブラックリスト: %s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "分類ホワイトリスト: %s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "分類ブラックリスト: %s" + #: src/itype.h msgid "click." msgstr "カチッ。" @@ -211858,14 +218612,6 @@ msgstr "抗生物質を摂取しました。" msgid " takes some antibiotics." msgstr "は抗生物質を摂取しました。" -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "発作が収まり始めました。" - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "発作に効く薬ではないようです。" - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -213374,7 +220120,7 @@ msgstr "は新たなマスクフィルターを必要としています #: src/iuse.cpp #, c-format msgid "Your %s doesn't have a filter." -msgstr "" +msgstr "%sにマスクフィルターが装填されていません。" #: src/iuse.cpp #, c-format @@ -213397,10 +220143,6 @@ msgstr "スネーク" msgid "Sokoban" msgstr "倉庫番" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "マインスイーパー" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "ライツオン!" @@ -215521,12 +222263,12 @@ msgstr[0] "%1$dの%2$sを%3$sに装填しました。" #: src/iuse_actor.cpp #, c-format msgid "You deploy the %s wrong. It is hostile!" -msgstr "" +msgstr "設定を間違えたようです。%sは敵対化しました!" #: src/iuse_actor.cpp #, c-format msgid "You deploy the %s." -msgstr "" +msgstr "%sを設置しました。" #: src/iuse_actor.cpp msgid "Place npc where?" @@ -215915,7 +222657,7 @@ msgstr "呪文: " #: src/iuse_actor.cpp msgid "You can't read." -msgstr "" +msgstr "読めません。" #: src/iuse_actor.cpp #, c-format @@ -216283,7 +223025,7 @@ msgstr "%sは%sに隣接している必要があります。" msgid "You can't place a %s there. It contains a trap already." msgstr "そこには%sを設置できません。既に罠があります。" -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "%sを作動させました!" @@ -217392,6 +224134,7 @@ msgid "" " they are kitten or not. The game ends when robot finds kitten. " "Alternatively, you may end the game by hitting %s." msgstr "" +"ゲームの目的は子猫を見つけることです。しかし様々な子猫以外の存在がこのゲームを複雑にしています。ロボットはそれが子猫であるか否か、触れなければ判別できません。ロボットが子猫を見つけたらゲームクリアです。途中で終了する場合は%sを押してください。" #: src/iuse_software_kitten.cpp msgid "Press any key to start." @@ -217400,12 +224143,12 @@ msgstr "始めるには何かキーを押して下さい。" #: src/iuse_software_kitten.cpp #, c-format msgid "robotfindskitten v22July2008 - press %s to quit." -msgstr "" +msgstr "robotfindskitten v22July2008 - %s で終了" #: src/iuse_software_kitten.cpp #, c-format msgid "Invalid command: Use direction keys or press %s to quit." -msgstr "" +msgstr "無効なコマンド:方向キーを使うか、%sを押して終了して下さい。" #: src/iuse_software_kitten.cpp msgid "You found kitten! Way to go, robot!" @@ -217457,6 +224200,10 @@ msgstr "初級" msgid "Intermediate" msgstr "中級" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "歴戦" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "横幅: " @@ -217767,7 +224514,7 @@ msgstr "ロード中" #: src/magic.cpp msgid "ERROR: Invalid magic_energy_type string. Defaulting to NONE" -msgstr "" +msgstr "エラー:magic_energy_typeが無効です。デフォルト設定NONE" #: src/magic.cpp msgid "ERROR: Invalid damage type string. Defaulting to none" @@ -218031,6 +224778,15 @@ msgstr "生成" msgid "Summon" msgstr "召喚" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "射程" @@ -218051,6 +224807,10 @@ msgstr "効果範囲" msgid "Spawned" msgstr "生成" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "回復" @@ -218103,6 +224863,15 @@ msgstr "ダメージは既に均等です。" msgid "%s wounds are closing up!" msgstr "%sの傷が塞がっていきます!" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "そこには既に車両があります。" @@ -218560,30 +225329,23 @@ msgstr "%sのオートクレーブが滅菌を完了しました。" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "%sは取り外されました。" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "罠を解除しました!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "罠の解除に失敗しました。" +msgid "Something has crawled out of the %s plants!" +msgstr "%sから何かが這い出しました!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "罠の解除に失敗し、作動させてしまいました!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "%sから何かが這い出しました!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "%sから何かが這い出しました!" +msgid "You've spotted a %1$ss!" +msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "%sから何かが這い出しました!" +msgid " triggers a %s!" +msgstr "" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -220126,6 +226888,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "警察に指名手配されました!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -220937,53 +227712,53 @@ msgstr "奇妙な神殿の入り口を開きました。" #, c-format msgctxt "memorial_male" msgid "Lost the conduct %s%s." -msgstr "" +msgstr "%s%sの制約を破りました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Lost the conduct %s%s." -msgstr "" +msgstr "%s%sの制約を破りました。" #: src/memorial_logger.cpp msgid " (disabled)" -msgstr "" +msgstr "(無効)" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Gained the achievement %s%s." -msgstr "" +msgstr "%s%sの実績を獲得しました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Gained the achievement %s%s." -msgstr "" +msgstr "%s%sの実績を獲得しました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Forgot the spell %s." -msgstr "" +msgstr "%sの呪文を忘れました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Forgot the spell %s." -msgstr "" +msgstr "%sの呪文を忘れました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Learned the spell %s." -msgstr "" +msgstr "%sの呪文を習得しました。" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Learned the spell %s." -msgstr "" +msgstr "%sの呪文を習得しました。" #: src/memorial_logger.cpp #, c-format @@ -221093,6 +227868,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "警報が鳴りました。" +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "デバッグメニュー(%s)を使用しました。" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "デバッグメニュー(%s)を使用しました。" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -222885,7 +229672,7 @@ msgstr "見られている気がします。嫌な気分です。" #: src/monattack.cpp msgid "Your sight darkens as the visions overtake you!" -msgstr "" +msgstr "目の前が真っ暗になり、何も見えません!" #: src/monattack.cpp #, c-format @@ -223964,6 +230751,11 @@ msgstr "視認できない敵からの射撃を検出し、撃ち返しモード msgid "zombie slave" msgstr "奴隷ゾンビ" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "%sを押し退ける" + #: src/monexamine.cpp msgid "Rename" msgstr "改名する" @@ -224519,11 +231311,11 @@ msgstr "瀕死" #: src/monster.cpp msgid "Can see to your current location" -msgstr "" +msgstr "現在地から視認できます。" #: src/monster.cpp msgid "Can't see to your current location" -msgstr "" +msgstr "現在地から視認できません。" #: src/monster.cpp #, c-format @@ -224929,12 +231721,7 @@ msgstr "変動:" #. ~ mode #: src/move_mode.cpp msgid "You feel bugs crawl over your skin." -msgstr "" - -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "人間" +msgstr "肌の上を虫が這っている気がします。" #: src/mutation.cpp #, c-format @@ -225493,7 +232280,7 @@ msgstr "所持重量上限: %.1f %s" #: src/newcharacter.cpp #, c-format msgid "Bash damage bonus: %.1f" -msgstr "" +msgstr "打撃攻撃ボーナス: %.1f" #: src/newcharacter.cpp msgid "" @@ -225882,7 +232669,7 @@ msgstr "開始/手足の負傷" #: src/newcharacter.cpp msgid "Fungal infected player" -msgstr "" +msgstr "真菌感染" #: src/newcharacter.cpp msgid "No starting NPC" @@ -225902,18 +232689,7 @@ msgstr "年齢:" #: src/newcharacter.cpp src/player_display.cpp msgid "Blood type:" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "* ランダム * (バリエーション%d種 )" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "%s (バリエーション%d種 )" +msgstr "血液型:" #: src/newcharacter.cpp msgid "Name:" @@ -225927,6 +232703,20 @@ msgstr "性別: " msgid "Select a starting location." msgstr "開始地点を選択" +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "* ランダム * (バリエーション%d種 )" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s (バリエーション%d種 )" + #: src/newcharacter.cpp msgid "Stats:" msgstr "状態: " @@ -226003,6 +232793,12 @@ msgstr "%sを押して開始位置を選択。 " msgid "Starting location:" msgstr "開始地点: " +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s (バリエーション%d種)" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "所持車両: " @@ -226055,15 +232851,15 @@ msgstr "身長を入力してください。(145~200)" #: src/newcharacter.cpp msgid "Enter blood type (omit Rh):" -msgstr "" +msgstr "血液型を入力 (Rh因子は省略):" #: src/newcharacter.cpp msgid "Invalid blood type." -msgstr "" +msgstr "無効な血液型です。" #: src/newcharacter.cpp msgid "Enter Rh factor:" -msgstr "" +msgstr "Rh因子を入力:" #: src/newcharacter.cpp msgid "Name of template:" @@ -226175,11 +232971,11 @@ msgstr "%1$sが何か言っていますが聴こえません!" #: src/npc.cpp msgid "Aware of your presence" -msgstr "" +msgstr "あなたを知覚しています。" #: src/npc.cpp msgid "Unaware of you" -msgstr "" +msgstr "あなたを知覚していません。" #: src/npc.cpp msgid "Completely untrusting" @@ -226555,12 +233351,12 @@ msgstr "双方向無線機から%sの声が聞こえました。「指定され #: src/npcmove.cpp #, c-format msgid " %s, %s" -msgstr "" +msgstr " %s、%s" #: src/npcmove.cpp #, c-format msgid "%s %s%s" -msgstr "" +msgstr "%s %s%s" #: src/npcmove.cpp #, c-format @@ -227682,6 +234478,14 @@ msgstr "破壊" msgid "Pulp Adjacent" msgstr "隣接破壊" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "隣接ゾンビのみ死体破壊" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "ゾンビのみ死体破壊" + #: src/options.cpp msgid "Auto mining" msgstr "自動掘削" @@ -228549,7 +235353,7 @@ msgstr "画面サイズ/横幅" #: src/options.cpp msgid "Set the size of the terminal along the X axis." -msgstr "" +msgstr "ゲーム画面の横幅を設定します。" #: src/options.cpp msgid "Terminal height" @@ -228557,7 +235361,7 @@ msgstr "画面サイズ/縦幅" #: src/options.cpp msgid "Set the size of the terminal along the Y axis." -msgstr "" +msgstr "ゲーム画面の縦幅を設定します。" #: src/options.cpp msgid "Font blending" @@ -228680,13 +235484,13 @@ msgstr "使用したいタイルセットを選択します。" #: src/options.cpp msgid "Memory map overlay preset" -msgstr "" +msgstr "記憶マップ/描画色" #: src/options.cpp msgid "" "Specified the overlay in which the memory map is drawn. Requires restart. " "For custom overlay define gamma and RGB values for dark and light colors." -msgstr "" +msgstr "記憶マップの描画色を指定します。反映には再起動が必要です。カスタムに設定すると、暗色と明色のガンマ値とRGB値を指定できます。" #: src/options.cpp msgid "Darkened" @@ -228698,67 +235502,67 @@ msgstr "セピア" #: src/options.cpp msgid "Sepia Dark" -msgstr "" +msgstr "ダークセピア" #: src/options.cpp msgid "Blue Dark" -msgstr "" +msgstr "ダークブルー" #: src/options.cpp msgid "Custom dark color RGB overlay - RED" -msgstr "" +msgstr "暗色RGB値 - レッド" #: src/options.cpp msgid "Specify RGB value for color RED for dark color overlay." -msgstr "" +msgstr "暗色のレッドの値を指定します。" #: src/options.cpp msgid "Custom dark color RGB overlay - GREEN" -msgstr "" +msgstr "暗色RGB値 - グリーン" #: src/options.cpp msgid "Specify RGB value for color GREEN for dark color overlay." -msgstr "" +msgstr "暗色のグリーンの値を指定します。" #: src/options.cpp msgid "Custom dark color RGB overlay - BLUE" -msgstr "" +msgstr "暗色RGB値 - ブルー" #: src/options.cpp msgid "Specify RGB value for color BLUE for dark color overlay." -msgstr "" +msgstr "暗色のブルーの値を指定します。" #: src/options.cpp msgid "Custom bright color RGB overlay - RED" -msgstr "" +msgstr "明色RGB値 - レッド" #: src/options.cpp msgid "Specify RGB value for color RED for bright color overlay." -msgstr "" +msgstr "明色のレッドの値を指定します。" #: src/options.cpp msgid "Custom bright color RGB overlay - GREEN" -msgstr "" +msgstr "明色RGB値 - グリーン" #: src/options.cpp msgid "Specify RGB value for color GREEN for bright color overlay." -msgstr "" +msgstr "明色のグリーンの値を指定します。" #: src/options.cpp msgid "Custom bright color RGB overlay - BLUE" -msgstr "" +msgstr "明色RGB値 - ブルー" #: src/options.cpp msgid "Specify RGB value for color BLUE for bright color overlay." -msgstr "" +msgstr "明色のブルーの値を指定します。" #: src/options.cpp msgid "Custom gamma for overlay" -msgstr "" +msgstr "ガンマ値" #: src/options.cpp msgid "Specify gamma value for overlay." -msgstr "" +msgstr "描画色のガンマ値を指定します。" #: src/options.cpp msgid "Pixel minimap" @@ -229218,18 +236022,6 @@ msgstr "放射線で変異" msgid "If true, radiation causes the player to mutate." msgstr "Trueにすると放射線の影響で突然変異を引き起こします。" -#: src/options.cpp -msgid "Z-levels" -msgstr "Z軸拡張" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" -"trueにすると、階段を使って上階にアイテムを移動したり、雨樋をよじ登ったり、飛行機を飛ばしたりといった、垂直方向の移動に関連するいくつかの機能が有効化されます。ゲームの途中で変更すると問題が発生する可能性があります。" - #: src/options.cpp msgid "Character point pools" msgstr "ポイント割り振り" @@ -230044,6 +236836,16 @@ msgstr "区域: " msgid "# Unexplored" msgstr "# 未探索" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "臭気: %s" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "oter_type: %s" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "有効な依頼までの距離:" @@ -230371,6 +237173,10 @@ msgstr "猛烈に暑い!" msgid "Very hot!" msgstr "かなり暑い!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "快適" + #: src/panels.cpp msgid "Very cold!" msgstr "かなり寒い!" @@ -231223,7 +238029,7 @@ msgstr "%sに修理すべき故障は見当たりません。" #: src/player.cpp msgid "It is damaged, but cannot be repaired." -msgstr "" +msgstr "損傷していますが修復が可能です。" #: src/player.cpp #, c-format @@ -231521,7 +238327,7 @@ msgstr "この作業は%sスキルをレベル%d以上に上昇させるには #: src/player.cpp msgid " (empty)" -msgstr "" +msgstr "(空)" #: src/player.cpp msgid "Wield what?" @@ -231586,7 +238392,7 @@ msgstr "水泳コスト: %+d\n" #: src/player_display.cpp #, c-format msgid "Movement point cost: %+d\n" -msgstr "" +msgstr "移動コスト: %+d\n" #: src/player_display.cpp #, c-format @@ -231692,7 +238498,7 @@ msgstr "所持重量上限(%s):%.1f" #: src/player_display.cpp #, c-format msgid "Bash damage: %.1f" -msgstr "" +msgstr "打撃ダメージ: %.1f" #: src/player_display.cpp msgid "" @@ -231771,17 +238577,17 @@ msgstr "年齢です。" #: src/player_display.cpp msgid "This is your blood type and Rh factor." -msgstr "" +msgstr "血液型とRh因子です。" #: src/player_display.cpp #, c-format msgid "Blood type: %s" -msgstr "" +msgstr "血液型: %s" #: src/player_display.cpp #, c-format msgid "Rh factor: %s" -msgstr "" +msgstr "Rh因子: %s" #: src/player_display.cpp #, c-format @@ -231817,6 +238623,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "口渇 -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "飢餓" + #: src/player_display.cpp msgid "Underfed" msgstr "栄養不足" @@ -231911,6 +238721,10 @@ msgstr "" "飢えによって身体が酷く弱っています。定期的に食事を摂らないと、このままでは死んでしまいます!\n" " \n" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "栄養失調" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -231969,7 +238783,7 @@ msgstr "前の分類に切替" #: src/player_display.cpp msgid "Toggle skill training / Upgrade stat" -msgstr "" +msgstr "切替/スキル鍛錬・能力値上昇" #: src/player_hardcoded_effects.cpp msgid "You feel nauseous." @@ -233037,6 +239851,14 @@ msgid "%1$d tool with %2$s of %3$d or more." msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "%1$d個の%2$sレベル%3$d以上の工具" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "%1$d個の%2$s性能%3$d以上の道具" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -233264,15 +240086,15 @@ msgstr "限定" #: src/scores_ui.cpp msgid "achievements" -msgstr "" +msgstr "実績" #: src/scores_ui.cpp msgid "conducts" -msgstr "" +msgstr "制約" #: src/scores_ui.cpp msgid "Conducts" -msgstr "" +msgstr "制約" #: src/scores_ui.cpp #, c-format @@ -233281,18 +240103,20 @@ msgid "" "the debug menu to work around a game bug, then you can re-enable %s via the " "debug menu (\"Enable achievements\" under the \"Game\" submenu)." msgstr "" +"%sは恐らくデバッグメニュー使用が原因で無効化されています。デバッグメニューをゲームのバグ回避のみに使用した場合は、%sをデバッグメニューから再度有効化できます(サブメニュー[ゲーム]内の[有効化" +" - 実績]を選択)。" #: src/scores_ui.cpp #, c-format msgid "This game has no valid %s.\n" -msgstr "" +msgstr "有効な%sがありません。\n" #: src/scores_ui.cpp #, c-format msgid "" "Note that only %s that existed when you started this game and still exist " "now will appear here." -msgstr "" +msgstr "ゲーム開始時に存在し現在も存在する%sのみが表示されます。" #: src/scores_ui.cpp msgid "This game has no valid scores.\n" @@ -233312,7 +240136,7 @@ msgstr "実績" #: src/scores_ui.cpp msgid "CONDUCTS" -msgstr "" +msgstr "制約" #: src/scores_ui.cpp msgid "SCORES" @@ -233915,6 +240739,19 @@ msgctxt "grammatical gender list" msgid "n" msgstr "n" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" +"視認: %d\n" +"回避: %d\n" +"難易度: %d\n" +"無害: %s" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "気泡シートを踏みました!" @@ -234652,7 +241489,7 @@ msgstr "運転中は部品を取り付けられません。" msgid "" "Installing this part will mean that this vehicle is no longer flightworthy." " Continue?" -msgstr "" +msgstr "この部品を取り付けると、車両が飛行できなくなります。続けますか?" #: src/veh_interact.cpp msgid "Installing this part will make the vehicle unfoldable. Continue?" @@ -234690,11 +241527,11 @@ msgstr "この車両は修復できません\n" msgid "" "Repairing this part will mean that this vehicle is no longer flightworthy. " "Continue?" -msgstr "" +msgstr "この部品を修復すると、車両が飛行できなくなります。続けますか?" #: src/veh_interact.cpp msgid "You chose not to install this part to keep the vehicle flyable.\n" -msgstr "" +msgstr "部品の取り付けを中止しました。車両は飛行可能です。\n" #: src/veh_interact.cpp msgid "Your morale is too low to mend…" @@ -234813,6 +241650,8 @@ msgid "" "Removing the %1$s may yield:\n" "> %2$s\n" msgstr "" +"%1$s取り外して得られるアイテム:\n" +"> %2$s\n" #: src/veh_interact.cpp #, c-format @@ -234850,7 +241689,7 @@ msgstr "運転中には何も取り外さない方が良いでしょう。" msgid "" "Removing this part will mean that this vehicle is no longer flightworthy. " "Continue?" -msgstr "" +msgstr "この部品を取り外すと、車両が飛行できなくなります。続けますか?" #: src/veh_interact.cpp msgid "The vehicle has no liquid fuel left to siphon." @@ -235307,7 +242146,7 @@ msgstr "壊れた%1$sを%2$sから取り外しました。" #: src/veh_interact.cpp #, c-format msgid "You smash the %1$s to bits, removing it from the %2$s." -msgstr "" +msgstr "%1$sを叩き壊し、%2$sから取り外しました。" #: src/veh_interact.cpp #, c-format @@ -237081,6 +243920,10 @@ msgstr "... %s = 説明を全て表示" msgid "--NO AVAILABLE MODS--" msgstr "--利用可能なMODはありません--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "--結果が見つかりません--" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "現在有効なMODを初期設定として登録しました" diff --git a/lang/po/pl.po b/lang/po/pl.po index 967012d485866..9562b8c324906 100644 --- a/lang/po/pl.po +++ b/lang/po/pl.po @@ -7,17 +7,17 @@ # Artur Gromek , 2019 # Zgroza Zgroza , 2019 # Ewa Cichosz , 2020 -# Brett Dong , 2020 # Unibel , 2020 # Chris Bittner , 2020 # Millennium Falcon , 2020 +# Brett Dong , 2020 # Aleksander Sienkiewicz , 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Aleksander Sienkiewicz , 2020\n" "Language-Team: Polish (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pl/)\n" @@ -339,7 +339,6 @@ msgstr[2] "kamieni" msgstr[3] "kamieni" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -1066,6 +1065,19 @@ msgstr[3] "nitrox" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "Mieszanka tlenu i azotu w proporcjach odpowiednich do nurkowania." +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -5472,6 +5484,26 @@ msgstr "" "Silna, rozpylana amunicja owadobójcza do miotacza chemikaliów. Najlepiej " "stosować z maską lub ochroną jamy ustnej." +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -6805,7 +6837,7 @@ msgstr[3] "żółta farba" msgid "A can of yellow paint." msgstr "Puszka żółtej farby." -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "" @@ -6897,7 +6929,6 @@ msgstr[3] "złoto" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -6989,7 +7020,6 @@ msgstr[2] "" msgstr[3] "" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "Mały kawałek blachy." @@ -8580,84 +8610,6 @@ msgstr[3] "" msgid "Seeing this is a bug." msgstr "Jeśli to widzisz, jest to błąd." -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -9019,8 +8971,6 @@ msgstr[3] "zatyczki do uszu" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "Przemysłowe zatyczki do uszu. Mieszczą się w uszach." @@ -9340,7 +9290,7 @@ msgstr[3] "" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "" #: lang/json/ARMOR_from_json.py @@ -9462,11 +9412,9 @@ msgstr[3] "kołczan" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." msgstr "" -"Skórzany kołczan noszony na pasie, w którym zmieści się 20 strzał. Aktywuj " -"by schować w nim strzały." #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -9480,10 +9428,8 @@ msgstr[3] "kołczan z brzozy" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." +"20 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Duży kołczan ze zszytych ze sobą płatów kory brzozowej, noszony na biodrze, " -"który pomieści 20 strzał. Aktywuj by schować w nim strzały." #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -9497,13 +9443,10 @@ msgstr[3] "duży kołczan" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" -"Duży skórzany kołczan z metalowymi wykończeniami, zakładany na plecy, który " -"mieści 60 strzał. Historycznie wykorzystywany przez konnych łuczników, " -"rzadziej piechotę, ale oni nie walczyli z zombie. Aktywuj by schować w nim " -"strzały." #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -9517,10 +9460,8 @@ msgstr[3] "duży kołczan z brzozy" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." +"hold 60 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Duży kołczan ze zszytych ze sobą płatów kory brzozowej, noszony na plecach, " -"który pomieści 60 strzał. Aktywuj by schować w nim strzały." #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -11249,8 +11190,6 @@ msgstr[2] "para skarpet" msgstr[3] "para skarpet" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "Skarpety. Załóż je na stopy." @@ -13486,6 +13425,20 @@ msgid "" "heat." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -20869,7 +20822,6 @@ msgstr[3] "" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "Twój pancerz uruchamia się." @@ -21268,7 +21220,6 @@ msgstr[2] "plecak" msgstr[3] "plecak" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "Mały plecak. Dobra pojemność przy niewielkim skrępowaniu ruchów." @@ -21397,7 +21348,6 @@ msgstr[2] "aktówka" msgstr[3] "aktówka" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "Używana do przenoszenia pieniędzy, dokumentów lub kontrabandy." @@ -21787,13 +21737,10 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." msgstr "" -"Średnich rozmiarów walizka do przewozu ubrań i innych rzeczy w podróży, " -"zapewnia przyzwoitą ilość miejsca, ale taszczenie jej ze sobą nie jest zbyt " -"wygodne." #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -22516,7 +22463,6 @@ msgstr[2] "pełny strój ochronny typu hazmat" msgstr[3] "pełny strój ochronny typu hazmat" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -23603,7 +23549,6 @@ msgstr[2] "koszula z długim rękawem" msgstr[3] "koszula z długim rękawem" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "Bawełniana koszula z długim rękawem." @@ -24481,6 +24426,21 @@ msgid "" "weight." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "cestus" +msgstr[1] "cestus" +msgstr[2] "cestus" +msgstr[3] "cestus" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -26185,77 +26145,17 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test power armor'} -#: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" #: lang/json/BATTERY_from_json.py @@ -26749,8 +26649,8 @@ msgstr[1] "Aero-Skraplacz CBM" msgstr[2] "Aero-Skraplacz CBM" msgstr[3] "Aero-Skraplacz CBM" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -28099,8 +27999,8 @@ msgstr[1] "Wewnętrzny Piec CBM" msgstr[2] "Wewnętrzny Piec CBM" msgstr[3] "Wewnętrzny Piec CBM" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -28231,8 +28131,8 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -28240,21 +28140,6 @@ msgid "" "power level." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -28326,6 +28211,36 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" @@ -28334,8 +28249,8 @@ msgstr[1] "Generatory Przeładowania Jonowego CBM" msgstr[2] "Generatory Przeładowania Jonowego CBM" msgstr[3] "Generatory Przeładowania Jonowego CBM" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -28530,6 +28445,39 @@ msgstr[3] "" msgid "template for a paperback nonfiction book" msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -30208,8 +30156,8 @@ msgstr[3] "" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -31540,10 +31488,8 @@ msgstr[3] "powieść przygodowa" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." +"in the heart of the African continent." msgstr "" -"Pokręcona historia wyścigu z czasem, w poszukiwaniu zaginionego miasta w " -"sercu Afryki." #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -31562,33 +31508,6 @@ msgstr "" "Chwytająca za serce powieść o dwójce przyjaciół walczących o przetrwanie na " "ulicach Nowego Jorku." -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "powieść młodzieżowa" -msgstr[1] "powieść młodzieżowa" -msgstr[2] "powieść młodzieżowa" -msgstr[3] "powieść młodzieżowa" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "" -"Klasyczna historia o dojrzewaniu, opisująca zabawne i przejmujące " -"doświadczenia życia, miłości i seksu." - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "" -"Obrazowa powieść o młodej dziewczynie żyjącej w Iranie w latach " -"osiemdziesiątych XX wieku obserwującej zwiany w jej świecie gdy Irak dokonał" -" inwazji na jej kraj." - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -31737,87 +31656,6 @@ msgstr[3] "powieść detektywistyczna " msgid "A detective investigates an unusual murder in a secluded location." msgstr "Detektyw bada sprawę tajemniczego morderstwa w ustronnej lokalizacji." -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "powieść pulp" -msgstr[1] "powieść pulp" -msgstr[2] "powieść pulp" -msgstr[3] "powieść pulp" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "" -"Historia w gorącej wodzie kąpanego detektywa, który intrygę rozbija celnym " -"ciosem swojej pięści. Masa akcji." - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -32016,11 +31854,8 @@ msgstr[3] "powieść o samurajach" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." +"marauding outlaws. This hardback is quite hefty." msgstr "" -"Klasyczna ballada o wędrownym mieczniku który przybywa do małej osady i " -"zostaje wynajęty przez miejscowych do obrony przed wyjętymi spod prawa " -"bandytami." #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -32072,18 +31907,20 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" #: lang/json/BOOK_from_json.py @@ -32116,333 +31953,6 @@ msgid "" "nuclear destruction isn't much of an influence on human nature." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "powieść fantastycznonaukowa" -msgstr[1] "powieść fantastycznonaukowa" -msgstr[2] "powieść fantastycznonaukowa" -msgstr[3] "powieść fantastycznonaukowa" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "Obcy, lasery i statki kosmiczne." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" -"To jest kopia „Fundacji i imperium” Izaaka Asimova. Tylna strona zawiera " -"ręcznie napisaną listę zakupów." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" -"To jest kopia „Trawy” Sheri S. Tepper. Dziecko popisało kredką pierwsze " -"strony." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -33748,6 +33258,624 @@ msgid "" " key work in the existentialist tradition." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "powieść pulp" +msgstr[1] "powieść pulp" +msgstr[2] "powieść pulp" +msgstr[3] "powieść pulp" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "" +"Historia w gorącej wodzie kąpanego detektywa, który intrygę rozbija celnym " +"ciosem swojej pięści. Masa akcji." + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "powieść fantastycznonaukowa" +msgstr[1] "powieść fantastycznonaukowa" +msgstr[2] "powieść fantastycznonaukowa" +msgstr[3] "powieść fantastycznonaukowa" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "Obcy, lasery i statki kosmiczne." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" +"To jest kopia „Fundacji i imperium” Izaaka Asimova. Tylna strona zawiera " +"ręcznie napisaną listę zakupów." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" +"To jest kopia „Trawy” Sheri S. Tepper. Dziecko popisało kredką pierwsze " +"strony." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -34116,8 +34244,9 @@ msgstr[3] "" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" #: lang/json/BOOK_from_json.py @@ -35699,13 +35828,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -35715,28 +35845,30 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -35745,13 +35877,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -35762,13 +35895,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -35777,13 +35911,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -35793,13 +35928,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -35809,13 +35945,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -35825,13 +35962,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -35839,6 +35977,72 @@ msgid "" " unsavory elements." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "powieść młodzieżowa" +msgstr[1] "powieść młodzieżowa" +msgstr[2] "powieść młodzieżowa" +msgstr[3] "powieść młodzieżowa" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "" +"Klasyczna historia o dojrzewaniu, opisująca zabawne i przejmujące " +"doświadczenia życia, miłości i seksu." + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -36290,6 +36494,21 @@ msgid "" "your pain at bay." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -37740,6 +37959,53 @@ msgid "" "harmless." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -38083,6 +38349,22 @@ msgid "" "on combining magic with EM radiation." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -38141,40 +38423,6 @@ msgid "" " - F. \"." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -40189,12 +40437,7 @@ msgstr[3] "" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." +msgid "Meat from a heavily mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -40209,10 +40452,8 @@ msgstr[3] "" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -40303,10 +40544,7 @@ msgstr[3] "" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" +msgid "This is a cooked chunk of meat from a mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -40317,6 +40555,14 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -40354,6 +40600,19 @@ msgstr "" "To gotowane podroby i jelita. Są pełne niezbędnych witamin, ale większość " "ludzi uważa je za dość ohydne, chyba że są odpowiednio przyrządzone." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -40577,6 +40836,19 @@ msgid "" "all cooked out." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -40786,8 +41058,9 @@ msgstr[3] "" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -42442,21 +42715,19 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "Woda z dodatkiem cukru lub miodu. Smakuje ok." #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" +msgid "black tea" +msgid_plural "black teas" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" -"Napój gentlemanów z całego świata, zrobiony poprzez zaparzenie liści krzewu " -"herbacianego /Camellia sinensis/." #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -42518,6 +42789,37 @@ msgstr "" "Fantazyjna woda mineralna, tak bardzo wyszukana, że czujesz się " "ekstrawagancki od samego trzymania." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -44700,6 +45002,36 @@ msgstr "" "Solone czipsy z kukurydzianej tortilli z mielonym mięsem i zatopione w " "serze. Doskonałe." +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -49558,7 +49890,6 @@ msgstr[2] "" msgstr[3] "" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "" @@ -50676,30 +51007,64 @@ msgstr "" "dla małych ptaków." #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "psie żarcie" -msgstr[1] "psie żarcie" -msgstr[2] "psie żarcie" -msgstr[3] "psie żarcie" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#. ~ Description for {'str_sp': 'dog food'} +#. ~ Description for {'str_sp': 'wet dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." -msgstr "To żarcie dla psów. Dziwnie pachnie, ale psom wydaje się smakować." +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'dry dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'wet cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "kocie żarcie" -msgstr[1] "kocie żarcie" -msgstr[2] "kocie żarcie" -msgstr[3] "kocie żarcie" +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#. ~ Description for {'str_sp': 'cat food'} +#. ~ Description for {'str_sp': 'dry cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." -msgstr "To żarcie dla kotów. Dziwnie pachnie, ale kotom wydaje się smakować." +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -50744,18 +51109,48 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'green tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'fruit tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -50872,14 +51267,11 @@ msgstr[3] "" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -51894,14 +52286,14 @@ msgstr "" " aby go wydobyć." #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "liście herbaty" -msgstr[1] "liście herbaty" -msgstr[2] "liście herbaty" -msgstr[3] "liście herbaty" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "Dried leaves of a tropical plant. You can boil them into tea, or you can " @@ -51910,6 +52302,21 @@ msgstr "" "Wysuszone liście tropikalnej rośliny. Po zalaniu wrzątkiem uzyskasz herbatę," " a możesz spróbować też je zjeść. Nie są jednak sycące." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -55235,6 +55642,84 @@ msgstr "" "Mąka zmieszana z wodą. Z tak przyrządzonego ciasta wychodzi chleb o wiele " "lepszy niż z samej mąki." +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -55688,6 +56173,14 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -56084,7 +56577,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -56294,131 +56787,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -57488,23 +57856,6 @@ msgstr[3] "puszka aluminiowa" msgid "An aluminum can, like what soda comes in." msgstr "Aluminiowa puszka, taka w której sprzedaje się napoje, np. kolę." -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "otwarta puszka aluminiowa" -msgstr[1] "otwarta puszka aluminiowa" -msgstr[2] "otwarta puszka aluminiowa" -msgstr[3] "otwarta puszka aluminiowa" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Aluminiowa puszka, taka w której sprzedaje się napoje, np. kolę. Ta jest " -"otwarta i nie da się jej łatwo zamknąć." - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -57516,25 +57867,10 @@ msgstr[3] "" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -57561,21 +57897,6 @@ msgstr[3] "" msgid "A small tin can, like what tuna comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -57589,21 +57910,6 @@ msgstr[3] "" msgid "A medium tin can, like what soup comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -57700,19 +58006,6 @@ msgstr[3] "plastikowy kubek" msgid "A small, vacuum formed cup." msgstr "Mały, formowany próżniowo kubek." -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "otwarty plastikowy kubek" -msgstr[1] "otwarty plastikowy kubek" -msgstr[2] "otwarty plastikowy kubek" -msgstr[3] "otwarty plastikowy kubek" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "Mały, formowany próżniowo kubek. W zasadzie śmieć." - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -57925,7 +58218,6 @@ msgstr[2] "galonowa butla" msgstr[3] "galonowa butla" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "" @@ -58055,7 +58347,6 @@ msgstr[2] "mały bukłak" msgstr[3] "mały bukłak" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -58215,21 +58506,6 @@ msgid "" "food." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -58856,6 +59132,38 @@ msgstr[3] "kawałki chityny" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "Kawałek egzoszkieletu owada. Lekki i bardzo wytrzymały." +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -58940,6 +59248,38 @@ msgstr "" "Filcowe łaty, ciasno zwinięte dla łatwiejszego przechowywania. Rozłóż by " "rozpakować." +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -60409,8 +60749,8 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -62179,6 +62519,19 @@ msgstr "" "Działo laserowe wymontowane z lufy wieżyczki laserowej TX-5LR Cerberus. " "Użyteczne jako samodzielna broń, bez potrzebnych części." +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "zestaw kościanego opancerzenia" +msgstr[1] "zestaw kościanego opancerzenia" +msgstr[2] "zestaw kościanego opancerzenia" +msgstr[3] "zestaw kościanego opancerzenia" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "Zestaw kościanego opancerzenia do pojazdów." + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -64079,6 +64432,66 @@ msgid "" "wound." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -66207,7 +66620,7 @@ msgstr[3] "" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" #: lang/json/GENERIC_from_json.py @@ -66431,6 +66844,22 @@ msgid "" "anything on its own." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -67220,7 +67649,7 @@ msgstr[3] "" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" #. ~ Description for {'str': 'lucerne hammer'} @@ -67671,7 +68100,6 @@ msgstr[2] "zaostrzony kij" msgstr[3] "zaostrzony kij" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "Prosty kij drewniany z zaostrzonym końcem." @@ -67791,19 +68219,15 @@ msgstr[3] "halabarda" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." +" attached to a long sturdy stick." msgstr "" -"Halabarda to wszechstronna broń drzewcowa z ostrzem siekiery, kolcem, i " -"innymi zabawnymi rzeczami przytwierdzonymi na końcu długiego kija." #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." +"spike, and other fun things attached to a thick pole." msgstr "" -"To kiepska, tania replika broni drzewcowej z ostrzem, kolcem, i innymi " -"zabawnymi rzeczami przytwierdzonymi na końcu długiego kija." #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -68541,21 +68965,6 @@ msgstr "" "Zwane też bagh nakha lub żelazna łapa. Ta mała podobna do pazurów broń z " "Indii zaprojektowana do ukrywania jej w dłoni." -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "cestus" -msgstr[1] "cestus" -msgstr[2] "cestus" -msgstr[3] "cestus" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -68757,6 +69166,124 @@ msgid "" "somewhat warm to the touch." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -68861,7 +69388,6 @@ msgstr[2] "rura" msgstr[3] "rura" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -69122,7 +69648,15 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -70221,9 +70755,9 @@ msgstr[3] "improwizowana glewia" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." -msgstr "Duże ostrze przymocowane do długiego kija. Może zadać sporo obrażeń." +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." +msgstr "" #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -70427,6 +70961,23 @@ msgstr "" "Zwykły zszywacz do papieru. Przydatny jeżeli zamierzasz zostać pracownikiem " "biurowym w czasach kataklizmu." +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -70757,6 +71308,21 @@ msgstr "" "pojazdu, aż będzie pływalny. Potem dołącz wiosła lub silnik by napędzić " "łódkę." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -71932,7 +72498,6 @@ msgstr[2] "" msgstr[3] "" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "Cienki arkusz metalu." @@ -72076,19 +72641,6 @@ msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "" "Zestaw pokrytego krzemem lekkiego chitynowego opancerzenia do pojazdów." -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "zestaw kościanego opancerzenia" -msgstr[1] "zestaw kościanego opancerzenia" -msgstr[2] "zestaw kościanego opancerzenia" -msgstr[3] "zestaw kościanego opancerzenia" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "Zestaw kościanego opancerzenia do pojazdów." - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -72445,8 +72997,8 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -72670,6 +73222,19 @@ msgstr "" "Metalowy kran który może być przyłączony do zbiornika z wodą dla łatwego " "dostępu." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -73399,6 +73964,20 @@ msgstr[3] "" msgid "It has given you an answer, but you are yet to ask anything." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -73509,7 +74088,22 @@ msgstr[3] "" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." msgstr "" #: lang/json/GENERIC_from_json.py @@ -74228,6 +74822,19 @@ msgid "" "battles is bookmarked." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -74243,6 +74850,76 @@ msgid "" "art." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -74269,7 +74946,7 @@ msgstr[3] "" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" @@ -74412,7 +75089,7 @@ msgstr[3] "" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" #: lang/json/GENERIC_from_json.py @@ -76087,168 +76764,6 @@ msgid "" "much more expensive." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "BROŃ PALNA" @@ -79549,6 +80064,38 @@ msgid "" "thrower." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -80101,34 +80648,6 @@ msgid "" "tips." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "domyślne" @@ -80144,7 +80663,10 @@ msgstr "Aftershock" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -80186,8 +80708,9 @@ msgstr "" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -80399,16 +80922,6 @@ msgstr "" msgid "Allows stats to raise via skill progression." msgstr "Pozwala statystykom na rozwój przez progresję umiejętności." -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "Rozwój Urbanistyczny" @@ -80758,6 +81271,55 @@ msgid "" "able to give them back some humanity. If only they cared…" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -81035,6 +81597,25 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -82799,6 +83380,19 @@ msgstr "" " mięsną aberrację. Oczy ze wszystkich głów strzelają wzrokiem na prawo i " "lewo, a usta wydają chóralne jęki i wrzaski." +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "człowiek" +msgstr[1] "ludzie" +msgstr[2] "ludzie" +msgstr[3] "ludzie" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -83312,6 +83906,23 @@ msgstr "" "pokonywać ogromne odległości długimi skokami, łapiąc swą zdobycz swymi " "śmiercionośnymi pazurami zanim zada ostateczny cios swymi ogromnymi kłami." +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -85389,6 +86000,21 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -86016,6 +86642,22 @@ msgstr[3] "" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -86120,6 +86762,179 @@ msgid "" "looking for patient to assist." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"Ten niegdysiejszy pies zrzucił całą skórę ujawniając pancerz połączonych " +"kości i żeber. Ta kościana zbroja pozbawiona z zewnątrz ciała wygląda na " +"poruszaną siecią niezdrowo czarnych żył i ścięgien ociekających czarną " +"mazią." + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -86154,27 +86969,6 @@ msgstr "" "Zdeformowane zwierzęce psie ciało, łykowata bestia która z łatwością " "przegoni swoich dwunożnych kolegów." -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"Ten niegdysiejszy pies zrzucił całą skórę ujawniając pancerz połączonych " -"kości i żeber. Ta kościana zbroja pozbawiona z zewnątrz ciała wygląda na " -"poruszaną siecią niezdrowo czarnych żył i ścięgien ociekających czarną " -"mazią." - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -86314,6 +87108,36 @@ msgstr "" "Puma, która wyglądałaby normalnie gdyby nie spuchnięte zadnie nogi i " "wybałuszone od czarnego szlamu oczy." +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -87016,6 +87840,52 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -89263,6 +90133,21 @@ msgstr "" "Masywny podobny do nosorożca dinozaur z kościstym grzebieniem z którego " "wystają trzy duże rogi." +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -89294,6 +90179,21 @@ msgstr "" "Dinozaur przypominający wielkiego prehistorycznego pancernika. Jego ogon " "zakończony jest masywną kolczastą pałką kostną." +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -89573,6 +90473,116 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -89587,14 +90597,122 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -89602,6 +90720,461 @@ msgid "" "sickle-like claw." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -90137,6 +91710,21 @@ msgid "" "off creatures that disturb it." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -90463,21 +92051,6 @@ msgstr "" "pomocniczych jeden do jednego produkcji Wraitheon, opracowany do płynnego " "zintegrowania z bardziej tradycyjnymi siłami zbrojnymi." -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -90900,21 +92473,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "" @@ -90927,6 +92485,14 @@ msgstr "" msgid "a bird" msgstr "" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "" @@ -91659,6 +93225,22 @@ msgstr "" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "" @@ -91784,6 +93366,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "" @@ -92006,6 +93599,15 @@ msgstr "" msgid "Uses a little fatigue" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -92064,8 +93666,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "" @@ -92432,6 +94034,10 @@ msgstr "" msgid "Haste" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "" @@ -92553,10 +94159,10 @@ msgstr "" msgid "Jolt" msgstr "" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "" @@ -92625,6 +94231,31 @@ msgstr "" msgid "Wall of Fog" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "" @@ -92737,65 +94368,37 @@ msgstr "" msgid "X-ray Vision" msgstr "" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "" - #: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" +msgid "Knock" msgstr "" -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." msgstr "" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" +msgid "Improved Knock" msgstr "" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" msgstr "" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" #: lang/json/TOOLMOD_from_json.py @@ -95677,32 +97280,37 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" msgid_plural "Belts of Weaponry" @@ -96951,6 +98559,21 @@ msgstr[1] "bioniczne zapalarki" msgstr[2] "bioniczne zapalarki" msgstr[3] "bioniczne zapalarki" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -97036,7 +98659,7 @@ msgstr[3] "" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "Lekkie" @@ -100115,12 +101738,6 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -101180,13 +102797,11 @@ msgstr[3] "smartfony" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "Aktywujesz aplikację latarki." #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "Poziom naładowania smartfona jest zbyt niski." @@ -102815,7 +104430,6 @@ msgstr[2] "topór strażacki" msgstr[3] "topór strażacki" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -102833,7 +104447,6 @@ msgstr[2] "strażackie narzędzie ratownicze" msgstr[3] "strażackie narzędzie ratownicze" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -102872,16 +104485,39 @@ msgstr[1] "rzucana gaśnica" msgstr[2] "rzucana gaśnica" msgstr[3] "rzucana gaśnica" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" msgstr "" -"To gaśnica w formie granatu. Nie tak efektywna jak zwykła gaśnica, ale można" -" jej użyć na dystans. Jest aktywowana ogniem, więc po prostu rzuć nią w " -"płomienie." #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -103141,6 +104777,34 @@ msgstr "" "Spłaszczony kamień osadzony na kiju. Ujdzie jako toporny szpadel, którego " "nie da się porównać do prawdziwego szpadla." +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -103174,6 +104838,32 @@ msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "" "To narzędzie do kopania. Użyj go do wykopania dziur w ziemi obok ciebie." +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -104083,6 +105773,14 @@ msgstr "" "Połączona z właściwymi narzędziami mógłbyś jej użyć do robót " "metalurgicznych." +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -104256,6 +105954,20 @@ msgstr "" "To długie metalowe obcęgi. Używane powszechnie w gotowaniu lub w pracach " "metalurgicznych." +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -104447,6 +106159,21 @@ msgstr "" "To posłanie ze skór, które można zwinąć w celach transportowych. Izoluje od " "podłoża, ułatwiając sen. Użyj, by rozwinąć i umieścić na ziemi." +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -106675,7 +108402,6 @@ msgstr[2] "szmata" msgstr[3] "szmata" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -107205,14 +108931,14 @@ msgid "" msgstr "Ta elektryczna piła łańcuchowa mocno hałasuje. Użyj by ją wyłączyć." #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" +msgid "stone axe head" +msgid_plural "stone axe heads" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -107220,14 +108946,14 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" +msgid "metal axe head" +msgid_plural "metal axe heads" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -107367,6 +109093,14 @@ msgstr "" "Przenośny opalany węglem drzewnym piec. Jest zaprojektowany do wypalania " "cegieł, ale możesz w nim wypalić też inne rzeczy zrobione z gliny." +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -107563,7 +109297,6 @@ msgstr[2] "podnośnik nożycowy" msgstr[3] "podnośnik nożycowy" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "Kompaktowy podnośnik nożycowy do podnoszenia pojazdów." @@ -107853,7 +109586,6 @@ msgstr[2] "śrubokręt" msgstr[3] "śrubokręt" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -107908,7 +109640,6 @@ msgstr[2] "lutownica" msgstr[3] "lutownica" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -108388,16 +110119,16 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" +msgid "pseudo atomic butter churn" +msgid_plural "pseudo atomic butter churns" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: lang/json/TOOL_from_json.py -msgid "pseudo atomic butter churn" -msgid_plural "pseudo atomic butter churns" +msgid "precision solderers" +msgid_plural "precision solderers" msgstr[0] "" msgstr[1] "" msgstr[2] "" @@ -108627,6 +110358,23 @@ msgid "" "specialized tools." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -109591,6 +111339,78 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -109807,6 +111627,78 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -109961,93 +111853,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -110456,7 +112261,7 @@ msgid "Pheidippides was a hack" msgstr "" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "" #: lang/json/achievement_from_json.py @@ -110487,14 +112292,628 @@ msgstr "" msgid "Freeman's favorite" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "Drwal" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "Doktor Medycyny" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "Traperka" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "Saper" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "Krawcowa" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "Surwiwalistka" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "Żołnierz" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "Włamywaczka" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "" @@ -110947,6 +113366,11 @@ msgstr "" msgid "canceling activity serialized with legacy code" msgstr "" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "pakiet fuzyjny" @@ -111251,6 +113675,10 @@ msgstr "rozpylane chemikalium" msgid "compressed air" msgstr "skompresowane powietrze" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "" @@ -111303,10 +113731,6 @@ msgstr "" msgid "mana energy" msgstr "" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "Pompa Adrenaliny" @@ -112942,23 +115366,6 @@ msgstr "" msgid "Wind Turbines" msgstr "" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" -"Twoje ręce zostały wyposażone w precyzyjne narzędzia lutownicze, obcinaki do" -" drutu i szpule kabli. Są zbyt małe, aby można je było zastosować w " -"większości rzemieślnictwa, ale przy braku odpowiednich maszyn są niezbędne " -"do tworzenia bioniki bez lepszych narzędzi." - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "" @@ -113007,6 +115414,23 @@ msgid "" "and fast." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"Twoje ręce zostały wyposażone w precyzyjne narzędzia lutownicze, obcinaki do" +" drutu i szpule kabli. Są zbyt małe, aby można je było zastosować w " +"większości rzemieślnictwa, ale przy braku odpowiednich maszyn są niezbędne " +"do tworzenia bioniki bez lepszych narzędzi." + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -113356,8 +115780,64 @@ msgstr "" msgid "Merciful" msgstr "" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "Wszystkie" @@ -113989,10 +116469,6 @@ msgstr "Pomaluj Ścianę na Żółto" msgid "Take Paint Off Wall" msgstr "Zdrap Farbę ze Ściany" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "Usuń Wykładzinę" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "Połóż Czerwoną Wykładzinę" @@ -114033,6 +116509,30 @@ msgstr "" msgid "Mine Upstair" msgstr "Przekopuj w Górę" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "Rozpocznij Budowę Pojazdu" @@ -115957,7 +118457,7 @@ msgstr "" msgid "You mount your steed." msgstr "" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "Palisz Się" @@ -117144,7 +119644,7 @@ msgstr "Sztachnąłeś raz czy dwa." msgid "You smoked too much." msgstr "Za dużo wypaliłeś." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "Odlot" @@ -118461,66 +120961,6 @@ msgstr "" msgid "The gum webs constrict your movement." msgstr "" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "Twoi Towarzysze" @@ -118722,6 +121162,17 @@ msgid "" " the kind words used about them." msgstr "" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "" @@ -119256,6 +121707,18 @@ msgstr "ogień" msgid "raging fire" msgstr "szalejący ogień" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "przestarzały gruz" @@ -120279,8 +122742,7 @@ msgid "" msgstr "" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "krasz!" @@ -120452,7 +122914,7 @@ msgid "" msgstr "" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "crunch!" @@ -121093,9 +123555,8 @@ msgstr "maszyna do ćwiczeń" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." msgstr "" #: lang/json/furniture_from_json.py @@ -121184,6 +123645,18 @@ msgid "" " to be scavanged." msgstr "" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "" + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "bieżnia" @@ -121196,6 +123669,18 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "ciężki worek treningowy" @@ -122485,10 +124970,6 @@ msgstr "" msgid "filled arc furnace" msgstr "" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "ruszt wędzarniczy" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -122828,6 +125309,77 @@ msgid "" "temperature. You'll need to take it down first." msgstr "" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -123176,7 +125728,8 @@ msgstr "Fałszywa spluwa strzelająca globulkami kwasu." msgid "auto" msgstr "automatyczny" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "karabin" @@ -123207,8 +125760,7 @@ msgstr "" "pozostałymi dwiema na naboje do strzelby. Jest zrobiona z rur i części " "skanibalizowanych z dwururki." -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "strzelba" @@ -123407,7 +125959,8 @@ msgstr "" "wynalezionego w połowie 21-go wieku. Jest niewiele więcej niż elektroniką " "oklejoną taśma montażową, pracującą na zasilaniu z UPS-a." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistolet" @@ -123488,7 +126041,7 @@ msgstr "" "Wielostrzałowy pneumatyczny karabin zrobiony domowym sposobem ze złomu. Jest" " bardzo cichy i zabójczy." -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "półautomatyczny" @@ -124088,8 +126641,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" msgstr[0] "" msgstr[1] "" msgstr[2] "" @@ -126998,8 +129551,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" msgstr[0] "" msgstr[1] "" msgstr[2] "" @@ -127007,8 +129560,8 @@ msgstr[3] "" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " @@ -127155,6 +129708,43 @@ msgstr "" "lufami strzelby. Historycznie używana przez myśliwych egomaniaków w Afryce, " "a obecnie przez ich spadkobierców egomaniaków w Nowej Anglii." +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -127767,6 +130357,20 @@ msgid "" "will have to suffice." msgstr "" +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -128640,6 +131244,42 @@ msgstr "" msgid "trilaser" msgstr "" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -129629,26 +132269,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -131965,18 +134585,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "Patroszysz i filetujesz rybę" @@ -131993,6 +134601,12 @@ msgstr "" "Przeszukujesz te pozostałości nieudanego eksperymentu w poszukiwaniu " "dających się wykorzystać bionicznych części" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -132008,8 +134622,32 @@ msgstr "" "na wszystko, co się wyróżnia." #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "Mozolnie dokonujesz sekcji olbrzymiego owada." +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -134013,10 +136651,6 @@ msgstr "Napisz coś" msgid "Teleport yourself" msgstr "Teleportuj się" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "Zgaś ogień" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "Osusz/oczyść siebie" @@ -134464,6 +137098,13 @@ msgstr "" msgid "This item can be used to communicate with radio waves." msgstr "" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -135352,6 +137993,14 @@ msgstr "Wyjdź z ekranu nowej postaci" msgid "Toggle sorting order" msgstr "Przełącz kolejność sortowania" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "Przewiń opis w górę" @@ -135752,6 +138401,10 @@ msgstr "Rozmontuj Przedmioty" msgid "Sleep" msgstr "Śpij" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "Kontroluj Pojazd" @@ -136225,12 +138878,12 @@ msgstr "Wczytaj szablon kolorów" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "Tak" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "Nie" @@ -136801,6 +139454,15 @@ msgstr "" msgid "Zombie trap." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -138121,6 +140783,11 @@ msgid "" "years.'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "Brak stylu" @@ -138384,6 +141051,21 @@ msgid "" "Lasts 3 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "Tempo Capoeiry" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "Kung Fu Żurawia" @@ -138546,6 +141228,22 @@ msgid "" "+2 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "Kombinacja Eskrima" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "Szermierka" @@ -138583,6 +141281,33 @@ msgid "" "Blocked damage reduced by 50% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "Odparowanie" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -138631,6 +141356,34 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "Dżudo" @@ -138879,6 +141632,32 @@ msgid "" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "Muay Thai" @@ -138917,6 +141696,21 @@ msgid "" "Blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "Ninjutsu" @@ -138982,6 +141776,34 @@ msgid "" "Last 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "Niten Ichi-Ryu" @@ -139055,6 +141877,39 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "Zapasy" @@ -139206,6 +142061,21 @@ msgid "" "Perception increases Accuracy instead of Dexterity. Accuracy increased by 25% of Perception but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "Sōjutsu" @@ -139360,6 +142230,21 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "Kung Fu Tygrysa" @@ -139416,6 +142301,21 @@ msgid "" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "" @@ -139469,6 +142369,20 @@ msgid "" " Dodging Skill increased by 15% of Perception. Blocked damage reduced by 50% of Perception." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "Zui Quan" @@ -139585,6 +142499,34 @@ msgstr "" "+Siła zbroja vs miażdżonym, +Zręczność zbroja vs kwasowi, +Inteligencja " "zbroja vs elektryczności, +Percepcja zbroja vs ogniowi." +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "Bioniczna Waleczność" @@ -139624,6 +142566,22 @@ msgid "" "+2 Blocks attempts, +1 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "Kung Fu Stonogi" @@ -139661,6 +142619,20 @@ msgid "" "Lasts 3 turns. Stacks 4 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "Kung Fu Jaszczura" @@ -139780,6 +142752,20 @@ msgid "" "Stacks 2 times. Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "Kung Fu Ropuchy" @@ -139831,6 +142817,34 @@ msgid "" "Lasts 6 turns. Stacks 6 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "Kung Fu Żmiji" @@ -140172,6 +143186,34 @@ msgid "" "Lasts 1 turn. Stacks 2 times" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "" @@ -140265,6 +143307,46 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "" @@ -140316,6 +143398,393 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "Alkohol" @@ -140799,7 +144268,7 @@ msgid "Emulsified Hydrogel" msgstr "" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "" #: lang/json/material_from_json.py @@ -140830,7 +144299,7 @@ msgstr "" msgid "There is always work to be done, song to be woven." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -140838,16 +144307,16 @@ msgid "" " you." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -142169,7 +145638,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "" #: lang/json/mission_def_from_json.py @@ -142178,7 +145647,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." +msgid "Well, you're not dead… yet." msgstr "" #: lang/json/mission_def_from_json.py @@ -142610,7 +146079,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "Dziękuję" @@ -142903,7 +146372,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" @@ -144774,6 +148243,87 @@ msgstr "Ta, jasne." msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Zbuduj 2 Destylarnie" @@ -146206,6 +149756,54 @@ msgstr "" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "" @@ -148532,6 +152130,23 @@ msgstr "" "Poruszasz się szybciej niż inni, wiec masz 15% bonus do szybkości na pewnym " "podłożu." +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -148544,13 +152159,50 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." msgstr "" #: lang/json/mutation_from_json.py @@ -148656,12 +152308,12 @@ msgstr "Szybkie Leczenie" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" -"Zdrowiejesz szybciej podczas snu a nawet odzyskujesz nieco zdrowia będąc na " -"nogach." #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -149366,8 +153018,11 @@ msgstr "Wolne Leczenie" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." -msgstr "Zdrowiejesz trochę wolniej niż inni. Sen przywróci ci mniej zdrowia." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." +msgstr "" #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -149375,12 +153030,11 @@ msgstr "Słabe Leczenie" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." msgstr "" -"Powrót do zdrowia podczas snu jest poważnie osłabiony i powoduje że z " -"upływem czasu regenerujesz tylko trzecią część zdrowia co zwykle." #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -149388,12 +153042,11 @@ msgstr "Niezauważalne Leczenie" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" -"Niemal nie odzyskujesz zdrowia podczas snu - leczy on jedynie jedną " -"dziesiątą tego co u przeciętnej osoby." #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -150206,11 +153859,11 @@ msgstr "Bardzo Szybkie Leczenie" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" -"Twoje ciało powoli się regeneruje i odzyskujesz zdrowie nawet gdy nie śpisz." #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -150218,8 +153871,12 @@ msgstr "Regeneracja" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "Twoje ciało niezwykle szybko regeneruje się z zadanych ran." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -150227,8 +153884,10 @@ msgstr "Jaszczurze Leczenie" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "Złamane kończyny zrastają się bez znacznej trudności." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -154151,8 +157810,7 @@ msgstr "Arachnid" msgid "Well, maybe you'll just have to make your own world wide web." msgstr "Cóż, może czas upleść sieć wielką jak kiedyś sieć internetowa." -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "Ocalony" @@ -154516,10 +158174,6 @@ msgid "" "you." msgstr "" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "Doktor Medycyny" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -154920,15 +158574,34 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "Historia Ocalonego" +msgid "Survivor: Confused 1" +msgstr "" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -154936,6 +158609,86 @@ msgstr "Historia Ocalonego" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "Historia Ocalonego" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "" @@ -156224,6 +159977,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "" @@ -156232,7 +160007,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -156737,10 +160513,6 @@ msgstr "Próbuję tylko przeżyć." msgid "I'm tracking game." msgstr "Obserwuję grę." -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "Żołnierz" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "Barman" @@ -157213,6 +160985,14 @@ msgstr "" msgid "Humans created me. Let's see what I can be on my own." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "" @@ -157482,10 +161262,6 @@ msgstr "Złomiarz" msgid "Laborer" msgstr "Robotnik" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "Drwal" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "Stolarz" @@ -157498,6 +161274,14 @@ msgstr "" msgid "Millyficen Whately" msgstr "" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "" + #: lang/json/npc_from_json.py msgid "magus" msgstr "mag" @@ -160021,6 +163805,18 @@ msgstr "droga, studzienka" msgid "bridge" msgstr "most" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "przystanek przy drodze" @@ -164973,6 +168769,118 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -165141,8 +169049,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -165155,8 +169064,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -166407,6 +170317,226 @@ msgid "" "find some other use." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -168202,7 +172332,7 @@ msgid "build a metalworking forge" msgstr "" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" #: lang/json/recipe_from_json.py @@ -172542,6 +176672,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -175477,109 +179641,6 @@ msgstr "Nie pamiętam kiedy po raz ostatni aż tak chciało mi się pić." msgid "I'd kill for a sip of water right now." msgstr "Zabiłbym dla łyka wody." -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" -"Tak, pewnie, nie dało się nie zauważyć, że masz ze sobą piwo! Wypijmy po " -"jednym i pogadajmy, , jak leci?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" -"O, z całą pewnością, co powiesz na piwko, które widzę przy tobie? Co " -"porabiasz?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "" -"Podzielisz się piwkiem, które tam chomikujesz i możemy gadać ile dusza " -"zapragnie! Tylko żartowałem, co tam ?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" -"Hej , założę się że rozmowa byłaby o wiele gładsza z fajnym zimnym " -"piwkiem w garści. Jak leci?" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "" -"Jak tu sobie gadamy, to co powiesz żebyśmy otworzyli sobie po piwku i przez " -"chwilę... udawali, że świat się nie kończy?" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "" -"Hej, jasna sprawa, , i tak przyda mis się chwila przerwy, jak się " -"miewasz?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "No pewnie, , jak leci?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "Pewnie, ognia ze wszystkich działonów! Wszystko u ciebie OK?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "Czemu nie? Jak leci?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "Mi pasuje, co nowego?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "Kilka minut mi nie zaszkodzi, jak się miewasz?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "Jasna sprawa , wszystko w porząsiu?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "Pewnie, leży ci coś na sercu?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "Zawsze gotów na dobrą pogawędkę! Ale co tam, wszystko ok?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "OK , poznajmy się bliżej, jak się miewasz?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "Z całą pewnością, jestem cały twój? Trzymasz się tam?" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "" -"Dobry pomysł . Zapomnijmy na chwilę o świecie. Jak się miewasz?" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "A co mi tam. Jak tam życie?" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "Pewnie. No więc, jak tam pogoda, co?" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "kurde" @@ -178049,6 +182110,18 @@ msgstr "Powiedz mi, jak przeżyłeś pierwszą falę Kataklizmu?" msgid "Was it rough surviving thus far?" msgstr "Ciężko było przetrwać tak długo?" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -178784,6 +182857,301 @@ msgstr "nie będzie rozpoczynał walki jeśli może jej uniknąć." msgid " will follow normal engagement rules." msgstr "będzie podążał zwykłymi zasadami zawiązywania walki." +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "Mi pasuje, co nowego?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "Jasna sprawa , wszystko w porząsiu?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "Pewnie, leży ci coś na sercu?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "Zawsze gotów na dobrą pogawędkę! Ale co tam, wszystko ok?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -180107,6 +184475,14 @@ msgstr "" "bezłuskowej amunicji. Napis głosi: \"RivTech bezłuskowa 8x40mm. Nic się z " "nią nie równa.\"" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -180116,6 +184492,21 @@ msgid "" " reads: \"WE ARE HERE TO PROTECT YOU.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -183142,6 +187533,326 @@ msgstr "-stylowej" msgid "-chant" msgstr "-chóralnej" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -191521,6 +196232,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "pośrodku niczego" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "Cela Eksperymentów" @@ -191666,11 +196381,11 @@ msgid "Acolyte." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -191705,8 +196420,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -191719,11 +196434,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" @@ -191741,11 +196456,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191754,7 +196469,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" @@ -191768,10 +196483,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191781,7 +196496,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" @@ -191797,8 +196512,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" @@ -191808,15 +196523,21 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" #: lang/json/talk_topic_from_json.py msgid "Yeah, alright." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "" @@ -191826,9 +196547,7 @@ msgid "That is all for now." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." +msgid "There are bones to etch, songs to sing. Wish to join me?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -191840,7 +196559,7 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" +msgid "A song may yet be sung by you, should you wish to." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191852,10 +196571,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "Rozumiem." @@ -191868,14 +196583,6 @@ msgstr "" msgid "Perhaps another time, Seer." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "" @@ -191884,10 +196591,6 @@ msgstr "" msgid "Not interested." msgstr "Nie zgłaszam zainteresowania." -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "" @@ -191904,20 +196607,13 @@ msgstr "" msgid "I'm off then." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" @@ -191928,7 +196624,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -191943,11 +196639,6 @@ msgstr "" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "" @@ -191959,24 +196650,15 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." -msgstr "" -"Nie tylko chodzące horrory i potwory zmieniły się wraz z Kataklizmem. " -"Rozpoczęło to… swego rodzaju cykl. Wszystko się powtarza. Widzimy to tylko u" -" innych, ale przytrafia się i nam, nawet tobie, również i mnie. Ile razy " -"upadłeś? Twoje ciało wyrwane z twojego ciała, pożarte. A może było to ciche " -"skomlenie śmierci. Lecz twoje kości znów się podniosły. Inne ciało, inna " -"nazwa, czasem nawet inna wiedza, ale kości, te same. Wszyscy jesteśmy " -"uwięzieni w tym samym cyklu. Po prostu zapominamy. Dlatego musimy akumulować" -" pieśń. To musi się skończyć, nawet jeśli oznacza to zniszczenie, a nie " -"przywrócenie." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -192002,6 +196684,14 @@ msgstr "Zapomnij, że pytałem." msgid "Skip it, let's get going." msgstr "Olej to, chodźmy." +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "Jakieś wskazówki na temat świata w którym teraz żyjemy?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "Porozmawiajmy o obozach frakcji." + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "" @@ -192187,7 +196877,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -192352,8 +197042,8 @@ msgstr "Cześć, ." #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -192375,7 +197065,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -192427,8 +197117,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." -msgstr "Nie, po prostu nie..." +msgid "No, just no…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Just let me sleep, !" @@ -192439,8 +197129,8 @@ msgid "Make it quick, I want to go back to sleep." msgstr "Tylko szybko, chcę spać." #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." -msgstr "Jeszcze kilka minut..." +msgid "Just few minutes more…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Anything to do before I go to sleep?" @@ -192469,14 +197159,14 @@ msgstr "" msgid "no, go back to sleep." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" -msgstr "O co chodzi, przyjacielu?" - #: lang/json/talk_topic_from_json.py msgid " *pshhhttt* I'm reading you boss, over." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "What is it, friend?" +msgstr "O co chodzi, przyjacielu?" + #: lang/json/talk_topic_from_json.py msgid "I want to give you some commands for combat." msgstr "Chcę dać ci kilka poleceń do walki." @@ -192485,6 +197175,68 @@ msgstr "Chcę dać ci kilka poleceń do walki." msgid "I want to set some miscellaneous rules." msgstr "Chcę ustalić różne zasady." +#: lang/json/talk_topic_from_json.py +msgid "I'd like to know a bit more about your abilities." +msgstr "Chciałbym dowiedzieć się nieco więcej o twoich umiejętnościach." + +#: lang/json/talk_topic_from_json.py +msgid "There's something I want you to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I just wanted to talk for a bit." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you help me understand something? (HELP/TUTORIAL)" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm going to go my own way for a while." +msgstr "Pójdę na razie własną drogą." + +#: lang/json/talk_topic_from_json.py +msgid "Let's go." +msgstr "Idziemy." + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what did you want to say?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Mind if we just chat for a bit about your history?" +msgstr "Masz coś przeciwko, aby porozmawiać o twojej historii?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's just chitchat for a while, I could use some relaxation." +msgstr "Po prostu pogadajmy przez chwilę, przydałby mi się relaks." + +#: lang/json/talk_topic_from_json.py +msgid "I changed my mind, wanted to ask you something else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm all ears, my friend." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You gonna give me orders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What would you like?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Just say the word." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Can you teach me anything?" msgstr "Możesz mnie czegoś nauczyć?" @@ -192509,14 +197261,6 @@ msgstr "Stój tu na straży." msgid "I want to assign you to work at this camp." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." -msgstr "Porozmawiajmy o twojej obecnej aktywności." - -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "Porozmawiajmy o obozach frakcji." - #: lang/json/talk_topic_from_json.py msgid "Find a horse and mount up!" msgstr "Znajdź konia i go dosiądź!" @@ -192530,32 +197274,20 @@ msgid "Please go to this location." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." -msgstr "Chciałbym dowiedzieć się nieco więcej o twoich umiejętnościach." - -#: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" -msgstr "Jakieś wskazówki na temat świata w którym teraz żyjemy?" - -#: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" -msgstr "Masz coś przeciwko, aby porozmawiać o twojej historii?" - -#: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." -msgstr "Po prostu pogadajmy przez chwilę, przydałby mi się relaks." +msgid "I want you to build a camp here." +msgstr "Chcę zbudować tu obóz." #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." -msgstr "Powiedz mi o wydawaniu ci rozkazów (samouczek NPC)." +msgid "We need to abandon this camp." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "Pójdę na razie własną drogą." +msgid "Show me what needs to be done at the camp." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "Idziemy." +msgid "Let's talk about your current activity." +msgstr "Porozmawiajmy o twojej obecnej aktywności." #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -192713,15 +197445,15 @@ msgstr "" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "Nieważne." @@ -192926,11 +197658,11 @@ msgid "OVERRIDE: " msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py @@ -193097,10 +197829,6 @@ msgstr "" msgid "Stay at your current position." msgstr "Zostań na swojej obecnej pozycji." -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "" @@ -193173,62 +197901,6 @@ msgstr "" msgid "Sure thing, I'll make my way there." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "" -"Tak, ten letni gorąc daje mi popalić, zróbmy sobie przerwę, jak leci " -"?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "Ok, może to pozwoli mi nie zamarznąć w tą pogodę, co słychać?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -193283,21 +197955,21 @@ msgid "Hello there." msgstr "Witajcie." #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." -msgstr "Okej, żadnych gwałtownych ruchów..." +msgid "Okay, no sudden movements…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "Trzymaj dystans!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "To moje terytorium, ." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "To moje terytorium, ." + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Uspokój się. Nie zrobię ci krzywdy." @@ -193350,30 +198022,30 @@ msgstr "Co się dzieje?" msgid "I don't care." msgstr "Nie obchodzi mnie to." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "Nie mam już więcej prac dla ciebie." - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "Nie mam żadnych prac dla ciebie." #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "Mam kolejne zadania dla ciebie. Chcesz o nich usłyszeć?" +msgid "I don't have any more jobs for you." +msgstr "Nie mam już więcej prac dla ciebie." #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "Mam inne zadania dla ciebie. Chcesz o nich usłyszeć?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Mam tylko jedną robotę. Chcesz posłuchać?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "Mam kolejne zadania dla ciebie. Chcesz o nich usłyszeć?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Mam kolejną robotę dla ciebie. Chcesz o niej usłyszeć?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Mam tylko jedną robotę. Chcesz posłuchać?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -193383,6 +198055,10 @@ msgstr "Oh, okej." msgid "Never mind, I'm not interested." msgstr "Nieważne, nie jestem zainteresowany." +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "Nie pracujesz teraz nad żadnym moim zleceniem." + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Która praca?" @@ -193391,10 +198067,6 @@ msgstr "Która praca?" msgid "What about it?" msgstr "Co ty na to?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "Nie pracujesz teraz nad żadnym moim zleceniem." - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "Zrobię to." @@ -193611,6 +198283,10 @@ msgstr "Hmmm, okej." msgid "Thanks!" msgstr "Dzięki!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "Skup się na drodze, kolego!" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "Muszę się skupić na drodze!" @@ -193635,17 +198311,13 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "Mam swoje powody by ci nie mówić." -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "Skup się na drodze, kolego!" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "Oh, okej." #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." -msgstr "Nie, dopóki nie dostanę antybiotyków..." +msgid "Not until I get some antibiotics…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "You asked me recently; ask again later." @@ -193743,22 +198415,22 @@ msgstr "Nie, tu nam dobrze." msgid "On second thought, never mind." msgstr "Po zastanowieniu się, jednak nieważne." +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "Nie jestem w stanie cię trenować gdy prowadzisz pojazd!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "Nie jestem w stanie cię trenować gdy prowadzę pojazd!" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." -msgstr "Odczekaj trochę, później pokażę ci cos nowego..." +msgid "Give it some time, I'll show you something new later…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "Mam swoje powody, by odmówić ci szkolenia." -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "Nie jestem w stanie cię trenować gdy prowadzisz pojazd!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "Nie ma bata, nie zostanę porzucony w tyle!" @@ -193780,8 +198452,8 @@ msgid "See you around." msgstr "Widzimy się." #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." -msgstr "Naprawdę nie czuję się z tym komfortowo..." +msgid "I really don't feel comfortable doing so…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll give you some space." @@ -193852,8 +198524,8 @@ msgid "Thanks, see you later!" msgstr "Dziękuję, do zobaczenia!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." -msgstr "Wziąłeś coś co nie należy do ciebie..." +msgid "You picked up something that does not belong to you…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Okay, okay, this is all a misunderstanding. Sorry, I'll drop it now." @@ -193946,13 +198618,13 @@ msgid "You might be seeing more of me…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" -msgstr "Witaj ponownie. *ksss*" +msgid "Hey again. *kzzz*" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" #: lang/json/talk_topic_from_json.py @@ -193974,7 +198646,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -193987,7 +198659,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" @@ -194009,7 +198681,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194025,7 +198697,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194060,14 +198732,6 @@ msgstr "Powiedz mi jak działają obozy frakcji." msgid "Tell me how faction camps have changed." msgstr "Powiedz mi jak zmieniły się obozy frakcji." -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "Chcę zbudować tu obóz." - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "Nic takiego. Porozmawiajmy o czymś innym." @@ -194289,9 +198953,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "" -"Jesteś pewien? To nie wygląda na zbyt bezpieczne miejsce na plotkowanie..." #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." @@ -194313,6 +198976,50 @@ msgstr "O czym chciałeś pogadać?" msgid "Actually, never mind." msgstr "W zasadzie nieważne." +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "" @@ -194334,7 +199041,7 @@ msgid "May the earth flourish beneath our paths." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -194518,8 +199225,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" @@ -195093,7 +199800,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -195573,6 +200280,38 @@ msgstr "" msgid "Huh." msgstr "Huh." +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -195625,19 +200364,9 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" -"W końcu tak. Było cicho od kilku godzin. Byłem spragniony, ranny i " -"przerażony. Chyba tylko mój trening ocalił mnie przed szaleństwem. " -"Zdecydowałem się wyciągnąć się stamtąd i sprawdzić jak poważne są moje " -"obrażenia. to było łatwe. Bok furgonetki był rozerwany, więc okazało " -"się że w zasadzie leżę pod cienką warstwą gruzu, i furgonetką jak namiotem " -"nade mną. Nawet nie byłem poważnie ranny. Zebrałem tyle sprzętu ile mogłem i" -" wymknąłem się stamtąd. Była noc. Słyszałem odgłosy walki w innych częściach" -" miasta, więc udałem się w przeciwnym kierunku. Przebyłem kilka przecznic " -"zanim wpadłem na jakieś ... Uciekłem od nich. Uciekałem, i " -"uciekałem i jeszcze trochę uciekałem. I oto jestem." #: lang/json/talk_topic_from_json.py msgid "" @@ -195980,6 +200709,30 @@ msgstr "Biedny Brudny Dan. " msgid "Thanks for telling me that stuff. " msgstr "Dzięki, że mo o tym opowiedziałeś. " +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -196040,6 +200793,24 @@ msgid "" "died in the crash, but I am not going back to find out." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -196079,6 +200850,21 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "A jak sądzisz co się stało? Widzisz ich gdzieś tutaj?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -196147,6 +200933,40 @@ msgid "" "pretty good life compared to those first few months." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -196159,6 +200979,50 @@ msgstr "" "zajmował się innymi pasażerami zrobiłem to co zrobiłby każdy na moim miejscu" " i spieprzyłem stamtąd." +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -196209,6 +201073,27 @@ msgstr "Wybacz. Możesz mi więcej o nich powiedzieć?" msgid "Right. Sorry." msgstr "No tak. Wybacz." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -196229,6 +201114,19 @@ msgstr "" "dni później, ale miejsce było całkowicie opuszczone. Nie mam pojęcia co " "stało się z tymi ludźmi." +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -196329,6 +201227,42 @@ msgstr "Wybacz że pytałem. " msgid "Sorry for asking. " msgstr "Wybacz że pytałem. " +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -197032,6 +201966,48 @@ msgstr "" "markecie, ale potrzebowałem żywności, więc wyprawiłem się walczyć o swoje do" " lasu. Średnio mi to wychodziło, więc cieszę się, że się zjawiłeś." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -197094,6 +202070,128 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "Dziękuję, że mi to powiedziałeś. " +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -197411,13 +202509,48 @@ msgstr "" msgid "I can respect that." msgstr "Szanuję to." +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "Dzięki za to." + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -197519,6 +202652,43 @@ msgstr "" "przepadło. Zginęło w mroku. Nie pierdol o 'zdrowiu', i nie pytaj " "więcej." +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -197880,10 +203050,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "" -"Unikanie podatków. Byłem księgowym, i pomagałem szefowi wyprowadzić masę " -"kasy na różne sprytne sposoby. Nie za sprytne jak się okazuje..." #: lang/json/talk_topic_from_json.py msgid "" @@ -198100,6 +203268,32 @@ msgstr "" "może to my jesteśmy ci cisi, którzy posiądą ziemię. Choć nie uśmiechają mi " "się nasze szanse na to." +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -198110,6 +203304,23 @@ msgstr "" "wiernych nadeszło, a ja zostałem w tyle. Więc teraz, jak sądzę, kroczę przez" " piekło na ziemi. Szkoda, że nie słuchałem na szkółce niedzielnej." +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -198377,10 +203588,6 @@ msgstr "Jak wyglądała praca dla Wolnych Kupców?" msgid "What was working for the Old Guard like?" msgstr "Jak wyglądała praca dla Starej Gwardii?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "Dzięki za to." - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "Dzięki za to. Zbierajmy się." @@ -198657,6 +203864,22 @@ msgstr "" msgid "What were you saying before that?" msgstr "O czym to mówiłeś wcześniej?" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "Hej tam." @@ -199180,7 +204403,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -199573,10 +204796,6 @@ msgid "" " catastrophe." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "" @@ -200253,12 +205472,12 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"How's things with you? My cardboard collection is getting quite impressive." +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "" +"How's things with you? My cardboard collection is getting quite impressive." msgstr "" #: lang/json/talk_topic_from_json.py @@ -201079,7 +206298,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" @@ -201826,7 +207045,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -202981,12 +208200,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" #: lang/json/talk_topic_from_json.py @@ -203114,12 +208333,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" #: lang/json/talk_topic_from_json.py @@ -203183,7 +208402,7 @@ msgid "Hm? Oh, hi." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "" #: lang/json/talk_topic_from_json.py @@ -203565,8 +208784,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" #: lang/json/talk_topic_from_json.py @@ -203583,9 +208802,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -203944,8 +209163,8 @@ msgstr "" "stąd do diabła!" #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." -msgstr "Ja tu nie dowodzę, szukasz kogoś innego..." +msgid "I'm not in charge here, you're looking for someone else…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -203992,12 +209211,12 @@ msgid "Well, I'd better be going. Bye." msgstr "Pora na mnie. Do zobaczenia!" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." -msgstr "Witaj marszalu..." +msgid "Welcome marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." -msgstr "Witaj..." +msgid "Welcome…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -204246,12 +209465,12 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." -msgstr "Marszalu..." +msgid "Marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." -msgstr "Obywatelu..." +msgid "Citizen…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Can I trade for supplies?" @@ -204912,7 +210131,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -204959,6 +210178,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "" @@ -204972,11 +210203,11 @@ msgid "Hey." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Yes?" +msgid "Good to see you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Good to see you." +msgid "About those jobs…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -204988,7 +210219,7 @@ msgid "Want help with something else?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." +msgid "Lets set a combat strategy" msgstr "" #: lang/json/talk_topic_from_json.py @@ -205042,6 +210273,10 @@ msgstr "" msgid "Anything on your mind?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "" @@ -205081,15 +210316,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "" #: lang/json/talk_topic_from_json.py @@ -205129,7 +210364,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -205198,8 +210433,8 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "Nie mam pojęcia w czym mógłbyś mi potencjalnie pomóc." #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." -msgstr "Nie ruszaj się, już się biorę za maszynkę do strzyżenia..." +msgid "Stand still while I get my clippers…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Thanks…" @@ -205627,8 +210862,8 @@ msgstr "" "spędzają na zewnątrz." #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "Proszę zostaw mnie w spokoju..." +msgid "Please leave me alone…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -205648,18 +210883,14 @@ msgstr "To smutne." #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." +"I don't know what you could do. I've tried everything. Just give me time…" msgstr "" -"Nie wiem co mógłbyś zrobić. Próbowałem wszystkiego. Po prosty daj mi czas..." #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "" -"Ciągle choruję! Na początku myślałem, że się czymś zatrułem, ale teraz " -"wygląda na to, że nie mogę niczego utrzymać w żołądku..." #: lang/json/talk_topic_from_json.py msgid "Uhm." @@ -205788,8 +211019,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" #: lang/json/talk_topic_from_json.py @@ -206110,6 +211341,263 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "Hejka, zbieraczu." @@ -206213,7 +211701,7 @@ msgid "Oh, you again." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -206221,7 +211709,7 @@ msgid "I'm busy, what is it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "" #: lang/json/talk_topic_from_json.py @@ -206648,10 +212136,6 @@ msgstr "Blokujesz %s" msgid " blocks %s" msgstr " blokuje %s" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "Odparowanie" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -209086,6 +214570,90 @@ msgstr "" msgid " unleashes a spin attack against %s and those nearby" msgstr "" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "" @@ -209142,6 +214710,216 @@ msgstr "" msgid " launches a supersonic punch at %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -209187,6 +214965,10 @@ msgstr "" msgid "Life springs anew from the dead grass." msgstr "" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "spalona ziemia" @@ -210266,209 +216048,14 @@ msgid "" msgstr "" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "gleba" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" -"To ziemia. Wygląda na zdatną do orki. Może też być wykopana w celach " -"budowlanych." - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "thump" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "" -"Spory obszar drobnego pisaku, który może być przydatny na wiele sposobów, " -"jeżeli zostanie właściwie wydobyty." - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "glina" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "" -"Pole elastycznej gliny, nadającej się do wypalania w piecu, jeżeli zostanie " -"właściwie wydobyta." - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "kopice gliny" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." +msgid "overgrown floor" msgstr "" -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "splosh!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "kopiec piasku" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "kopiec ziemi" - -#. ~ Description for mound of dirt +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" -"Obszar z górkami ziemi, niełatwy w pokonaniu pieszo. Jeżeli zbadać go " -"dokładniej, wygląda na nadający się do sadzenia nasion, itp." - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "" -"Wielka góra ziemi, która wygląda jakbyś mógł się pod nią wczołgać dla " -"ochrony." - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "dziwny uskok" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" -"Nienaturalnie człowieczo ukształtowana dziura, zdająca się być dziwnie " -"znajoma. Masz dziwne uczucie badając ją z bliska, tak jakby w jakiś sposób " -"przynależała do ciebie." - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "grób" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" -"Ziemny grób, porośnięty trawą. Przynajmniej niektórzy zmarli faktycznie " -"spoczywają w spokoju." - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "kamienna podłoga" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" -"Relatywnie płaski obszar z kamienia i skał. Wygląda na tyle stabilnie, by " -"móc w nim drążyć z użyciem właściwego sprzętu górniczego." - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "bruk" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "" -"Fragment asfaltu, powoli degradującego się od pęknięć i odwarstwień " -"spowodowanych mrozem i brakiem utrzymania." - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "żółty bruk" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" -"Pasma dokładnie ułożonych żółtych linii oznaczających drogę, informujących " -"kierowców by ich nie przekraczać. Nikt już obecnie nie egzekwuje tych " -"przepisów." - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "chodnik" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" -"Nawierzchnia utwardzona betonową wylewką, uszkodzona spękaniami od mrozu, i " -"dużymi wyszczerbieniami z braku konserwacji." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "" -"Nowszy fragment betonowej wylewki utwardzającej powierzchnię, z wykończeniem" -" na potrzeby estetyki, i odpornością na cykle zamarzania i topnienia." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -210476,40 +216063,15 @@ msgid "SMASH!" msgstr "SMASH!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "metalowa podłoga" - -#. ~ Description for metal floor -#: lang/json/terrain_from_json.py -msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgid "overgrown wall" msgstr "" -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "płyta linoleum" - -#. ~ Description for linoleum tile +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." msgstr "" -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "klepisko" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." -msgstr "Podłoga z drobno zmieszanej ziemi następnie ubitej i utwardzonej." - #: lang/json/terrain_from_json.py msgid "concrete floor" msgstr "betonowa podłoga" @@ -210606,6 +216168,23 @@ msgstr "" "Nieukończona budowa z prętów zbrojeniowych i wylanego betonu; podłoga nie " "jest jeszcze wygładzona a dach nie jest w pełni odlany." +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "kamienna podłoga" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" +"Relatywnie płaski obszar z kamienia i skał. Wygląda na tyle stabilnie, by " +"móc w nim drążyć z użyciem właściwego sprzętu górniczego." + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "metalowa podłoga" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -210615,6 +216194,10 @@ msgstr "" "Wysokiej jakości podłoga w szachownicę, redukująca ryzyko pośliźnięć i " "upadków, z dopasowanym dachem." +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "thump" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "podłoga" @@ -210663,6 +216246,10 @@ msgstr "" "Podłoga z twardego drewna wzmocnionego chemicznie dla uzyskania " "antypoślizgowej powierzchni, typowa w zastosowaniach sportowych." +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "klepisko" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -210748,28 +216335,15 @@ msgid "A blue section of flooring." msgstr "" #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "" - -#. ~ Description for industrial carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "bunker carpet" +msgid "carpet" msgstr "" -#. ~ Description for bunker carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." +msgid "Base carpet!" msgstr "" -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "Miękki czerwony dywan." @@ -210789,6 +216363,124 @@ msgstr "Miękki zielony dywan." msgid "Soft purple carpet." msgstr "Miękki fioletowy dywan." +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "płyta linoleum" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "malowana woskowana podłoga" @@ -210826,6 +216518,37 @@ msgstr "" " drutami do domowej roboty ramy. Bardzo klimatyczne w post-apokaliptycznych " "slumsach. Obyś lubił dźwięk deszczu padającego na blachę falistą." +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "gleba" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" +"To ziemia. Wygląda na zdatną do orki. Może też być wykopana w celach " +"budowlanych." + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" +"Spory obszar drobnego pisaku, który może być przydatny na wiele sposobów, " +"jeżeli zostanie właściwie wydobyty." + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "mech" @@ -210835,6 +216558,32 @@ msgstr "mech" msgid "Moist spongy moss." msgstr "Wilgotny gąbczasty mech." +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "glina" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "" +"Pole elastycznej gliny, nadającej się do wypalania w piecu, jeżeli zostanie " +"właściwie wydobyta." + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "kopice gliny" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "splosh!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "" @@ -210844,6 +216593,149 @@ msgstr "" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "kopiec piasku" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "kopiec ziemi" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" +"Obszar z górkami ziemi, niełatwy w pokonaniu pieszo. Jeżeli zbadać go " +"dokładniej, wygląda na nadający się do sadzenia nasion, itp." + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "" +"Wielka góra ziemi, która wygląda jakbyś mógł się pod nią wczołgać dla " +"ochrony." + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "dziwny uskok" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" +"Nienaturalnie człowieczo ukształtowana dziura, zdająca się być dziwnie " +"znajoma. Masz dziwne uczucie badając ją z bliska, tak jakby w jakiś sposób " +"przynależała do ciebie." + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "grób" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" +"Ziemny grób, porośnięty trawą. Przynajmniej niektórzy zmarli faktycznie " +"spoczywają w spokoju." + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "bruk" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "" +"Fragment asfaltu, powoli degradującego się od pęknięć i odwarstwień " +"spowodowanych mrozem i brakiem utrzymania." + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "żółty bruk" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" +"Pasma dokładnie ułożonych żółtych linii oznaczających drogę, informujących " +"kierowców by ich nie przekraczać. Nikt już obecnie nie egzekwuje tych " +"przepisów." + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "chodnik" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" +"Nawierzchnia utwardzona betonową wylewką, uszkodzona spękaniami od mrozu, i " +"dużymi wyszczerbieniami z braku konserwacji." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" +"Nowszy fragment betonowej wylewki utwardzającej powierzchnię, z wykończeniem" +" na potrzeby estetyki, i odpornością na cykle zamarzania i topnienia." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "Podłoga z drobno zmieszanej ziemi następnie ubitej i utwardzonej." + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "orzech" @@ -214897,6 +220789,78 @@ msgstr "" msgid "A ladder leading down." msgstr "" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "pochyłość w dół" @@ -215388,7 +221352,7 @@ msgstr "Clank!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "Bang!" @@ -217324,6 +223288,11 @@ msgstr "drewniany kadłub łodzi" msgid "A wooden board that keeps the water out of your boat." msgstr "Drewniany kadłub zapobiega dostaniu się wody do środka łodzi." +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -217833,14 +223802,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "drewniane siedzenie" +msgid "flimsy wooden seat" +msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "Miejsce do siedzenia." +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "drewniane siedzenie" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "drewniany kolec" @@ -218074,6 +224048,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "" @@ -218692,6 +224675,11 @@ msgstr "" msgid "At least %s from %s (%s remaining)" msgstr "" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -218708,12 +224696,13 @@ msgid "Within %s of %s (passed)" msgstr "" #: src/achievement.cpp -msgid "Triggered by " +#, c-format +msgid "Triggered by %s" msgstr "" #: src/achievement.cpp #, c-format -msgid "%s/%s " +msgid "%s/%s %s" msgstr "" #: src/achievement.cpp @@ -218916,8 +224905,9 @@ msgstr "Zamek opiera się próbom włamania, i uszkadzasz swoje narzędzie." msgid "The lock stumps your efforts to pick it." msgstr "Zamek opiera się próbom włamania." -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "" @@ -218977,6 +224967,120 @@ msgstr "" msgid "Continue trying to fall asleep and don't ask again." msgstr "" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -220711,7 +226815,7 @@ msgstr "" msgid "< [%s] Sort: %s >" msgstr "" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "" @@ -223641,6 +229745,29 @@ msgstr "%s (%i slotów);" msgid "Increased storage capacity by %i." msgstr "Zwiększona pojemność o %i." +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "" @@ -223810,8 +229937,9 @@ msgid "(incapacitated)" msgstr "(unieruchomiony)" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" -msgstr "(oszczędzanie paliwa WŁ)" +#, c-format +msgid "(fuel saving ON > %d %%)" +msgstr "" #: src/bionics_ui.cpp #, c-format @@ -223877,10 +230005,18 @@ msgstr "" msgid "Accuracy" msgstr "Celność" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "Unik" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "Prędkość" @@ -224401,20 +230537,26 @@ msgstr " wstaje na nogi." #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%s uwalnia się od pajęczyn!" +msgid "The %s escapes the bear trap!" +msgstr "%s ucieka z potrzasku na niedźwiedzie!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "Uwalniasz się z sieci pajęczej!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr " uwalnia się z sieci pajęczej!" +msgid "You free yourself from the bear trap!" +msgstr "Uwalniasz się z pułapki na niedźwiedzie!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "Próbujesz się uwolnić z sieci pajęczej, ale nie możesz się wyrwać!" +msgid " frees themselves from the bear trap!" +msgstr " uwalnia się z pułapki na niedźwiedzie!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "" +"Próbujesz się uwolnić z pułapki na niedźwiedzie, ale nie możesz się wyrwać!" #: src/character.cpp src/monster.cpp #, c-format @@ -224450,29 +230592,6 @@ msgstr " uwalnia się z ciężkich wnyków!" msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "Próbujesz uwolnić się z ciężkich wnyków, ale nie możesz się wyrwać!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%s ucieka z potrzasku na niedźwiedzie!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "Uwalniasz się z pułapki na niedźwiedzie!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr " uwalnia się z pułapki na niedźwiedzie!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "" -"Próbujesz się uwolnić z pułapki na niedźwiedzie, ale nie możesz się wyrwać!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "Uwalniasz się z gruzu!" @@ -224485,18 +230604,6 @@ msgstr " uwalnia się z gruzu!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "Próbujesz się uwolnić z gruzu, ale nie możesz się wyrwać!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "Próbujesz wydostać się z dołu, ale ześlizgujesz się na dno." - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "Wydostajesz się z dołu!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr " wydostaje się z dołu!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -224536,6 +230643,52 @@ msgstr "Wyrywasz się z uchwytu!" msgid " breaks out of the grab!" msgstr " wyrywa się z uchwytu!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%s uwalnia się od pajęczyn!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "Uwalniasz się z sieci pajęczej!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr " uwalnia się z sieci pajęczej!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "Próbujesz się uwolnić z sieci pajęczej, ale nie możesz się wyrwać!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "Próbujesz wydostać się z dołu, ale ześlizgujesz się na dno." + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "Wydostajesz się z dołu!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr " wydostaje się z dołu!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -225397,6 +231550,10 @@ msgstr "WYJĄTKOWY_WYSIŁEK" msgid "Your body strains under the weight!" msgstr "Twoje ciało ugina się pod ciężarem!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -228431,14 +234588,6 @@ msgstr "Benchmark 'rysowania' (5 sekund)" msgid "Test trait group" msgstr "Testuj grupę cech" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "Pokaż wiadomości debug" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "Zawieś grę (test postępowania z zawieszeniem gry)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "Przełącz pathfiding NPC na mapie" @@ -228467,6 +234616,18 @@ msgstr "Info…" msgid "Enable achievements" msgstr "" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "Pokaż wiadomości debug" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "Zawieś grę (test postępowania z zawieszeniem gry)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "Wyjdź do Głównego Menu" + #: src/debug_menu.cpp msgid "Game…" msgstr "" @@ -228563,10 +234724,6 @@ msgstr "" msgid "Map…" msgstr "Mapa..." -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "Wyjdź do Głównego Menu" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -229088,6 +235245,10 @@ msgstr "Znakuję jako zakończoną" msgid "Remove mission without proper cleanup" msgstr "Usuń misję bez właściwego posporzątania" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -229608,15 +235769,6 @@ msgid "" "Roof: %s" msgstr "" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -230339,138 +236491,182 @@ msgid "Liked" msgstr "Lubiany" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "Legendarny" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "Niezrównany" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "Potężni" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "Sławni" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "Powszechnie Znany" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "Na Ustach Ludzi" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "Bezwartościowa Gnida" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "Gnida" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "Godny Pogardy" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "Pasożyt" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "Pijawka" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "Pośmiewisko" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "Neutralny" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "Obrzydliwie Bogaty" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "Zamożny" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "Bogaty" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "Ustawiony" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "Komfortowy" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "W Niedostatku" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "Upadający" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "Zubożały" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "Niezamożny" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "Przelewający Się" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "Dobrze Zaopatrzony" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "Wiążący Koniec z Końcem" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "Niedożywiony" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "Zagłodzony" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "Legendarny" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "Ekspert" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "Weteran" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "Utalentowany" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "Kompetentny" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "Niewytrenowany" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "Kaleki" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "Wątły" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "Bezwartościowy" @@ -231066,12 +237262,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -232096,7 +238292,7 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" +msgid "No suitable items are located at the drop points…" msgstr "" #: src/faction_camp.cpp @@ -232309,6 +238505,13 @@ msgstr "%s jest niebezpiecznie blisko!" msgid "Wait till you wake up…" msgstr "" +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -232419,6 +238622,11 @@ msgctxt "action" msgid "open" msgstr "" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -233532,6 +239740,10 @@ msgstr "Nie masz niczego do przeładowania." msgid "You aren't holding something you can reload." msgstr "" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -233968,11 +240180,25 @@ msgstr "" msgid "You cannot haul items here." msgstr "Nie możesz ciągnąć tu przedmiotów." +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "%s stoi w przejściu!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "Na przeszkodzie stoi %s!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -235364,11 +241590,6 @@ msgstr "Jakiś bufon stoi w przejściu!" msgid "The %s is in the way!" msgstr "%s stoi w przejściu!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "%s stoi w przejściu!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -236102,6 +242323,10 @@ msgstr "Ignorowanie namierzania laserowego!" msgid "Creature whitelisted: %s" msgstr "Stworzenie dodane do białej listy: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "Popełnić samobójstwo?" @@ -236642,6 +242867,11 @@ msgstr "Rozpoczynasz włam do sejfu." msgid "Attempt to hack this safe?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -237485,11 +243715,28 @@ msgstr "" msgid "There is a %s there. Take down?" msgstr "Jest tam %s. Rozmontować?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "Jest tam %s. Rozbroić?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "Rozbrajasz pułapkę!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "Nie udaje ci się rozbroić pułapki." + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "Nie udaje ci się rozbroić pułapki; uruchamiasz ją!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -237870,6 +244117,10 @@ msgstr "Wybierz zainstalowaną bionikę do usunięcia" msgid "Splint broken limbs" msgstr "Nastaw złamane kończyny" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "Nie masz żadnych zainstalowanych bionik." @@ -237897,16 +244148,78 @@ msgid " doesn't have limbs that require splinting." msgstr " nie ma kończyn, które wymagałyby nastawienia." #: src/iexamine.cpp -msgid "This mill already contains flour." -msgstr "Ten młyn już jest pełen mąki." +msgid "You don't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." -msgstr "Usuń ją zanim uruchomisz młyn na nowo." +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "Spazmy mięśni zaczynają ustawać." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "Lek nie pomaga by załagodzić spazmy." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "This mill contains %s, which can't be milled!" msgstr "" #: src/iexamine.cpp @@ -238088,7 +244401,8 @@ msgid "Remove brake and start milling" msgstr "" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." +#, c-format +msgid "Remove brake and start milling, milling will take about %s." msgstr "" #: src/iexamine.cpp @@ -238122,20 +244436,7 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." +msgid "It should take about %s to finish milling." msgstr "" #: src/iexamine.cpp @@ -238325,6 +244626,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "Finalizowanie" @@ -238906,7 +245212,7 @@ msgstr "Objętość (%s):" msgid "There are no available choices" msgstr "Nie ma dostępnych wyborów" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "" @@ -239359,7 +245665,7 @@ msgid "" "very bad idea." msgstr "" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -239815,10 +246121,6 @@ msgstr "Modyfikator pojemności wagi: " msgid "Weight capacity bonus: " msgstr "Bonus pojemności wagi: " -#: src/item.cpp -msgid "Storage: " -msgstr "Pojemność: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* Ten przedmiot może być noszony wraz z hełmem." @@ -240123,6 +246425,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -240146,9 +246476,21 @@ msgstr "" msgid "* This item is not repairable." msgstr "* Tego przedmiotu nie można naprawić." +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items +#: src/item.cpp +#, c-format +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." msgstr "" #: src/item.cpp @@ -240269,26 +246611,27 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" +msgid "Bashing: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" +msgid "Critical bash: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" +msgid "Cutting: " msgstr "" #: src/item.cpp -#, c-format -msgid "%d moves per attack" +msgid "Critical cut: " +msgstr "" + +#: src/item.cpp +msgid "Piercing: " +msgstr "" + +#: src/item.cpp +msgid "Critical pierce: " msgstr "" #: src/item.cpp @@ -240887,8 +247230,9 @@ msgstr "Twój %1$s nie zmieści więcej %2$s." msgid "That %s doesn't have room to expand." msgstr "Ten %s nie ma miejsca żeby się rozłożyć." -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d x %s" @@ -241016,10 +247360,69 @@ msgstr "Nie masz żadnych przedmiotów z zarejestrowanymi użyciami" msgid "Execute which action?" msgstr "Wykonać jaką akcję?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "" @@ -241059,6 +247462,11 @@ msgstr "Testuj którą grupę?" msgid "Result of 100 spawns:" msgstr "Rezultat 100 spawnów:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d x %s" + #: src/item_location.cpp msgid "inventory" msgstr "ekwipunek" @@ -241081,6 +247489,10 @@ msgstr "" msgid "Pocket %d:" msgstr "" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "" @@ -241241,6 +247653,34 @@ msgstr "" msgid "not enough space" msgstr "" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "klik." @@ -241310,14 +247750,6 @@ msgstr "Bierzesz nieco antybiotyków." msgid " takes some antibiotics." msgstr " bierze nieco antybiotyków." -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "Spazmy mięśni zaczynają ustawać." - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "Lek nie pomaga by załagodzić spazmy." - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -242872,10 +249304,6 @@ msgstr "W Ą Ż" msgid "Sokoban" msgstr "Sokoban" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "Saper" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "Światła zapal!" @@ -245811,7 +252239,7 @@ msgstr "%s potrzebuje %s w pobliżu siebie." msgid "You can't place a %s there. It contains a trap already." msgstr "Nie możesz umieścić tam %s. Już tam jest pułapka." -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "Uruchamiasz %s!" @@ -247013,6 +253441,10 @@ msgstr "Początkujący" msgid "Intermediate" msgstr "Zaawansowany" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "Ekspert" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "Szerokość poziomu:" @@ -247576,6 +254008,15 @@ msgstr "" msgid "Summon" msgstr "" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "Zasięg" @@ -247596,6 +254037,10 @@ msgstr "" msgid "Spawned" msgstr "Zespawnowany" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "" @@ -247648,6 +254093,15 @@ msgstr "" msgid "%s wounds are closing up!" msgstr "" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "" @@ -248107,30 +254561,23 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "Rozbrajasz pułapkę!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "Nie udaje ci się rozbroić pułapki." +msgid "Something has crawled out of the %s plants!" +msgstr "Coś wypełzło z %s!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "Nie udaje ci się rozbroić pułapki; uruchamiasz ją!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "Coś wypełzło z %s!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "Coś wypełzło z %s!" +msgid "You've spotted a %1$ss!" +msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "Coś wypełzło z %s!" +msgid " triggers a %s!" +msgstr "" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -249697,6 +256144,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "Stałaś się poszukiwany przez policję!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -250664,6 +257124,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "Uruchomiłaś alarm." +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -253457,6 +259929,11 @@ msgstr "" msgid "zombie slave" msgstr "niewolnik zombie" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "Popchnij %s" + #: src/monexamine.cpp msgid "Rename" msgstr "Zmień nazwę" @@ -254424,14 +260901,6 @@ msgstr "Skupienie dąży do:" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "człowiek" -msgstr[1] "ludzie" -msgstr[2] "ludzie" -msgstr[3] "ludzie" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -255426,17 +261895,6 @@ msgstr "Wiek:" msgid "Blood type:" msgstr "" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "" - #: src/newcharacter.cpp msgid "Name:" msgstr "Imię:" @@ -255449,6 +261907,26 @@ msgstr "Płeć:" msgid "Select a starting location." msgstr "Wybierz startową lokację:" +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: src/newcharacter.cpp msgid "Stats:" msgstr "Statystyki:" @@ -255518,6 +261996,15 @@ msgstr "" msgid "Starting location:" msgstr "Startowa lokacja:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "" @@ -257226,6 +263713,14 @@ msgstr "Miażdż" msgid "Pulp Adjacent" msgstr "Miażdż Bliskie" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "Auto górnictwo" @@ -258848,17 +265343,6 @@ msgstr "Mutacje popromienne" msgid "If true, radiation causes the player to mutate." msgstr "Zaznaczone: promieniowanie powoduje mutacje u graczy." -#: src/options.cpp -msgid "Z-levels" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" - #: src/options.cpp msgid "Character point pools" msgstr "Pule punktów postaci" @@ -259735,6 +266219,16 @@ msgstr "Strefa:" msgid "# Unexplored" msgstr "# Niezbadane" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "" @@ -260062,6 +266556,10 @@ msgstr "Parzy!" msgid "Very hot!" msgstr "Bardzo gorąco!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "Komfortowy" + #: src/panels.cpp msgid "Very cold!" msgstr "Bardzo zimno!" @@ -261519,6 +268017,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "Pragnienie -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "Zagłodzony" + #: src/player_display.cpp msgid "Underfed" msgstr "" @@ -261611,6 +268113,10 @@ msgid "" "\n" msgstr "" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "Niedożywiony" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -262752,6 +269258,17 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -263663,6 +270180,15 @@ msgctxt "grammatical gender list" msgid "n" msgstr "n" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "Wszedłeś na folię bąbelkową!" @@ -266863,6 +273389,10 @@ msgstr "" msgid "--NO AVAILABLE MODS--" msgstr "--NIEDOSTĘPNE MODY--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "Zapisano listę modów jako domyślną" diff --git a/lang/po/ru.po b/lang/po/ru.po index 350292d37166e..5e7d060b8b4d7 100644 --- a/lang/po/ru.po +++ b/lang/po/ru.po @@ -51,25 +51,26 @@ # Zhar the Mad , 2020 # Artem Kirienko , 2020 # 8street, 2020 -# Vlasov Vitaly , 2020 +# Михаил Семенчин , 2020 # Ivan Ivanov, 2020 # Midas , 2020 -# Михаил Семенчин , 2020 # Timofey Kostenko , 2020 # 000000 0000000 , 2020 # Victor_U , 2020 -# Alexey Mostovoy , 2020 -# korick3 korick3 , 2020 # WX , 2020 -# Антон Бурмистров <22.valiant@gmail.com>, 2020 # Arex , 2020 +# Alexey Mostovoy , 2020 +# Антон Бурмистров <22.valiant@gmail.com>, 2020 +# korick3 korick3 , 2020 +# Vlasov Vitaly , 2020 +# leemuar - , 2020 # CountAlex, 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: CountAlex, 2020\n" "Language-Team: Russian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ru/)\n" @@ -389,7 +390,6 @@ msgstr[2] "камней" msgstr[3] "камни" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -1126,6 +1126,19 @@ msgstr[3] "нитрокс" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "Смесь кислорода и азота в подходящих для дайвинга пропорциях." +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "огнетушащий агент" +msgstr[1] "огнетушащий агент" +msgstr[2] "огнетушащий агент" +msgstr[3] "огнетушащий агент" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "Сухое химическое вещество, эффективное при тушении пожаров." + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -5698,6 +5711,32 @@ msgstr "" "Мощный инсектицид, пригодный для заполнения химического распылителя. Лучше " "использовать с какой-нибудь маской или защитой рта." +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "патрон 12.3ln" +msgstr[1] "патрона 12.3ln" +msgstr[2] "патронов 12.3ln" +msgstr[3] "патроны 12.3ln" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" +"Боеприпасы 12.3ln были представлены в Румынии на заре второго Карпатского " +"конфликта. Винтовка PA md. 71, использующая эти патроны, быстро обрела " +"популярность в странах Восточного Блока а затем и по всему миру. Благодаря " +"этому боеприпасы типа 12.3ln стали стандартным патроном в Евразийском " +"регионе. Их было легко найти и накопить перед Исходом. Вам он кажется " +"похожим на патроны .30-06 Спрингфилд, но с чуть более острым носиком." + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -7062,7 +7101,7 @@ msgstr[3] "банки жёлтой краски" msgid "A can of yellow paint." msgstr "Банка жёлтой краски." -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "красный ковёр" @@ -7155,7 +7194,6 @@ msgstr[3] "золото" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -7254,7 +7292,6 @@ msgstr[2] "маленьких металлических листов" msgstr[3] "маленькие металлические листы" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "Небольшой лист металла." @@ -9057,85 +9094,6 @@ msgstr[3] "базовая мощность маны" msgid "Seeing this is a bug." msgstr "Если вы это видите, то это баг." -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "ТЕСТОВЫЙ камень" -msgstr[1] "ТЕСТОВЫХ камня" -msgstr[2] "ТЕСТОВЫХ камней" -msgstr[3] "ТЕСТОВЫЕ камни" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "ТЕСТОВЫЙ маленький металлический лист" -msgstr[1] "ТЕСТОВЫХ маленьких металлических листа" -msgstr[2] "ТЕСТОВЫХ маленьких металлических листов" -msgstr[3] "ТЕСТОВЫЕ маленькие металлические листы" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "тестовая деревянная стрела (широкий наконечник)" -msgstr[1] "тестовые деревянные стрелы (широкий наконечник)" -msgstr[2] "тестовых деревянных стрел (широкий наконечник)" -msgstr[3] "тестовые деревянные стрелы (широкий наконечник)" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "Стрела для отладки." - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "Тестовый патрон 9мм" -msgstr[1] "Тестовых патрона 9мм" -msgstr[2] "Тестовых патронов 9мм" -msgstr[3] "Тестовые патроны 9мм" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "Абстрактный 9мм ЭП боеприпас." - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "Тестовый патрон .45" -msgstr[1] "Тестовых патрона .45" -msgstr[2] "Тестовых патронов .45" -msgstr[3] "Тестовые патроны .45" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "Тестовый боеприпас .45 ЭП ." - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "тестовый газ" -msgstr[1] "тестовый газ" -msgstr[2] "тестовый газ" -msgstr[3] "тестовый газ" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" -"Загадочная газообразная субстанция. Не вдыхать, только для тестирования!" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "ТЕСТОВЫЙ кусочек платины" -msgstr[1] "ТЕСТОВЫХ кусочка платины" -msgstr[2] "ТЕСТОВЫХ кусочков платины" -msgstr[3] "ТЕСТОВЫе кусочки платины" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -9492,8 +9450,6 @@ msgstr[3] "пары беруш" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "Ушные затычки промышленного класса. Они помещаются внутри уха." @@ -9835,7 +9791,7 @@ msgstr[3] "подсумки для боеприпасов" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." +"rockets will not fit. Use insert to store ammunition." msgstr "" "Небольшой подсумок, пригодный для хранения большинства типов мелких " "боеприпасов, ракеты не поместятся. Активируйте для хранения боеприпасов." @@ -9963,11 +9919,11 @@ msgstr[3] "колчаны" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." msgstr "" -"Кожаный колчан, носимый на поясе, вмещает 20 стрел. Активируйте, чтобы " -"убрать стрелы." +"Кожаный колчан, носимый на поясе, вмещает 20 стрел или болтов. Активируйте, " +"чтобы убрать стрелы или болты." #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -9981,10 +9937,10 @@ msgstr[3] "берестяные колчаны" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." +"20 arrows or bolts. Use insert to store arrows or bolts." msgstr "" -"Колчан, сплетённый из полос бересты, носимый на поясе, вмещает 20 стрел. " -"Активируйте, чтобы убрать стрелы." +"Колчан, сплетённый из полос бересты, носимый на поясе, вмещает 20 стрел или " +"болтов. Активируйте, чтобы убрать стрелы или болты." #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -9998,12 +9954,14 @@ msgstr[3] "большие колчаны" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" "Большой кожаный колчан, укреплённый металлом. Носится за спиной, вмещает 60 " -"стрел. Исторически использовался конными лучниками, реже пешими, но НИКОГДА " -"не использовался для борьбы с зомби. Активируйте, чтобы убрать стрелы." +"стрел или болтов. Исторически использовался конными лучниками, реже пешими, " +"но НИКОГДА не использовался для борьбы с зомби. Активируйте, чтобы убрать " +"стрелы или болты." #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -10017,10 +9975,10 @@ msgstr[3] "большие берестяные колчаны" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." +"hold 60 arrows or bolts. Use insert to store arrows or bolts." msgstr "" "Большой колчан, сплетённый из полос бересты и одеваемый на спину, вмещает 60" -" стрел. Активируйте, чтобы убрать стрелы." +" стрел или болтов. Активируйте, чтобы убрать стрелы или болты." #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -11794,8 +11752,6 @@ msgstr[2] "пар носков" msgstr[3] "пары носков" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "Носки. Надень их на ноги." @@ -14044,6 +14000,20 @@ msgstr "" "Легкие перчатки из кевлара и номекса для работ по обезвреживанию " "взрывоопасных боеприпасов. Они разработаны для защиты от осколков и жара." +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "пара шипованных перчаток" +msgstr[1] "пары шипованных перчаток" +msgstr[2] "пар шипованных перчаток" +msgstr[3] "пары шипованных перчаток" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "Пара перчаток, подбитых металлическими шипами." + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -21910,7 +21880,6 @@ msgstr[3] "боевые экзоскелеты" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "Ваша силовая броня активирована." @@ -22353,7 +22322,6 @@ msgstr[2] "рюкзаков" msgstr[3] "рюкзаки" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "Небольшой рюкзак. Не слишком тяжёлый и довольно вместительный." @@ -22484,7 +22452,6 @@ msgstr[2] "портфелей" msgstr[3] "портфели" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "В нём удобно переносить деньги, документы и контрабанду." @@ -22889,13 +22856,13 @@ msgstr "" #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." msgstr "" -"Среднего размера чемодан, используется в основном для транспортировки одежды" -" и других вещей во время поездок, предоставляет приличную вместительность, " -"но таскать его с собой не слишком удобно." +"Среднего размера чемодан на колёсиках, используется в основном для " +"транспортировки одежды и других вещей во время поездок, предоставляет " +"приличную вместительность, но таскать его с собой не совсем комфортно." #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -23636,7 +23603,6 @@ msgstr[2] "костюмов химзащиты" msgstr[3] "костюмы химзащиты" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -24763,7 +24729,6 @@ msgstr[2] "водолазок" msgstr[3] "водолазки" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "Хлопковая водолазка." @@ -25668,6 +25633,23 @@ msgstr "" "Большой спальный мешок, который укроет вас с ног до головы. Этот весит " "средне." +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "цестус" +msgstr[1] "цестуса" +msgstr[2] "цестусов" +msgstr[3] "цестусы" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" +"Обмотка из кожи для руки и ладони с металлическими вставками на костяшках " +"для улучшения силы удара и защиты." + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -27581,78 +27563,18 @@ msgstr "" "воздействия окружающей среды." #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "ТЕСТОВАЯ пара носков" -msgstr[1] "ТЕСТОВЫЕ пары носков" -msgstr[2] "ТЕСТОВЫЕ пар носков" -msgstr[3] "ТЕСТОВЫЕ пары носков" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "ТЕСТОВАЯ водолазка" -msgstr[1] "ТЕСТОВЫЕ водолазки" -msgstr[2] "ТЕСТОВЫХ водолазок" -msgstr[3] "ТЕСТОВЫЕ водолазки" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" +msgstr[0] "аура отталкивающих разрядов" +msgstr[1] "аура отталкивающих разрядов" +msgstr[2] "аура отталкивающих разрядов" +msgstr[3] "аура отталкивающих разрядов" +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "ТЕСТОВАЯ пара ушных затычек" -msgstr[1] "ТЕСТОВЫЕ пары ушных затычек" -msgstr[2] "ТЕСТОВЫХ пар ушных затычек" -msgstr[3] "ТЕСТОВЫЕ пары ушных затычек" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "ТЕСТОВЫЙ костюм химзащиты" -msgstr[1] "ТЕСТОВЫХ костюма химзащиты" -msgstr[2] "ТЕСТОВЫХ костюмов химзащиты" -msgstr[3] "ТЕСТОВЫЕ костюмы химзащиты" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "ТЕСТОВЫЙ рюкзак" -msgstr[1] "ТЕСТОВЫХ рюкзака" -msgstr[2] "ТЕСТОВЫХ рюкзаков" -msgstr[3] "ТЕСТОВЫЕ рюкзаки" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "ТЕСТОВЫЙ портфель" -msgstr[1] "ТЕСТОВЫХ портфеля" -msgstr[2] "ТЕСТОВЫХ портфелей" -msgstr[3] "ТЕСТОВЫЕ портфели" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "тестовый колчан" -msgstr[1] "тестовых колчана" -msgstr[2] "тестовых колчанов" -msgstr[3] "тестовые колчаны" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "Колчан Тестирования, вмещающий 20 стрел или арбалетных болтов." - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "тестовая силовая броня" -msgstr[1] "тестовая силовая броня" -msgstr[2] "тестовая силовая броня" -msgstr[3] "тестовая силовая броня" - -#. ~ Description for {'str': 'test power armor'} -#: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." -msgstr "Прототип силовой брони для отладки." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." +msgstr "Невидимая аура, наносящая урон противникам, атакующим в ближнем бою." #: lang/json/BATTERY_from_json.py msgid "test battery" @@ -28213,8 +28135,8 @@ msgstr[1] "КБМ: Воздушный конденсатор испарений" msgstr[2] "КБМ: Воздушный конденсатор испарений" msgstr[3] "КБМ: Воздушный конденсатор испарений" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -29745,8 +29667,8 @@ msgstr[1] "КБМ: Встроенная печь" msgstr[2] "КБМ: Встроенная печь" msgstr[3] "КБМ: Встроенная печь" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -29887,8 +29809,8 @@ msgstr[1] "КБМ: Ветровые турбины" msgstr[2] "КБМ: Ветровых турбин" msgstr[3] "КБМ: Ветровые турбины" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -29899,24 +29821,6 @@ msgstr "" "активации они будут развертываться и медленно собирать энергию ветра, чтобы " "подзарядить ваши батареи." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "КБМ: Точные паяльники" -msgstr[1] "КБМ: Точные паяльники" -msgstr[2] "КБМ: Точные паяльники" -msgstr[3] "КБМ: Точные паяльники" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "" -"Встроенные крошечные инструменты для работы с электроникой, включая " -"паяльники и кусачки. Требуются для изготовления бионических модулей, но " -"бесполезны сами по себе." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -29992,6 +29896,41 @@ msgstr "" "Бомба, установленная там, где спинной мозг переходит в головной. На ней " "установлен таймер обратного отсчета, и у вас нет кода деактивации." +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "КБМ: Черепная пушка" +msgstr[1] "КБМ: Черепная пушка" +msgstr[2] "КБМ: Черепная пушка" +msgstr[3] "КБМ: Черепная пушка" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" +"В вашем черепе спрятано однозарядное оружие калибра .40. Активируйте " +"бионику, чтобы выстрелить и перезарядить его." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "КБМ: Точные паяльники" +msgstr[1] "КБМ: Точные паяльники" +msgstr[2] "КБМ: Точные паяльники" +msgstr[3] "КБМ: Точные паяльники" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "" +"Встроенные крошечные инструменты для работы с электроникой, включая " +"паяльники и кусачки. Требуются для изготовления бионических модулей, но " +"бесполезны сами по себе." + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" @@ -30000,8 +29939,8 @@ msgstr[1] "КБМ: Ионный перегрузочный генератор" msgstr[2] "КБМ: Ионный перегрузочный генератор" msgstr[3] "КБМ: Ионный перегрузочный генератор" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -30214,6 +30153,39 @@ msgstr[3] "документальные книги с мягкой обложк msgid "template for a paperback nonfiction book" msgstr "Шаблон для документальной книги в мягкой обложке." +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "абстрактный бульварный роман" +msgstr[1] "абстрактных бульварных романа" +msgstr[2] "абстрактных бульварных романов" +msgstr[3] "абстрактные бульварные романы" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "Шаблон для дешевых книг. Наверняка все они в мягкой обложке." + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "абстрактная научно-фантастическая книга" +msgstr[1] "абстрактные научно-фантастические книги" +msgstr[2] "абстрактных научно-фантастических книг" +msgstr[3] "абстрактные научно-фантастические книги" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "Шаблон для научно-фантастических книг в мягкой обложке." + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "Шаблон для научно-фантастических книг в твёрдом переплёте." + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -31987,8 +31959,8 @@ msgstr[3] "чертежи" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -33383,10 +33355,10 @@ msgstr[3] "приключенческие романы" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." +"in the heart of the African continent." msgstr "" "Волнующая повесть о путешествии в поисках затерянного города, расположенного" -" в тёмных глубинах африканского континента." +" в глубинах африканского континента." #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -33405,33 +33377,6 @@ msgstr "" "Захватывающий рассказ о двух друзьях, которые стараются выжить на улицах " "Нью-Йорка." -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "роман о взрослении" -msgstr[1] "романа о взрослении" -msgstr[2] "романов о взрослении" -msgstr[3] "романы о взрослении" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "" -"Классическая история о взрослении, изображающая острые переживания молодого " -"человека в жизни, любви и сексе." - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "" -"Графическая новелла о молодой девушке, живущей в Иране в 1980-х годах, " -"наблюдающей за тем, как меняется мир вокруг неё, на фоне иракского вторжения" -" в её страну." - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -33589,101 +33534,6 @@ msgid "A detective investigates an unusual murder in a secluded location." msgstr "" "Детектив расследует необычное убийство произошедшее в уединённом месте." -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "криминальное чтиво" -msgstr[1] "криминального чтива" -msgstr[2] "криминального чтива" -msgstr[3] "криминальное чтиво" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "" -"Круто завинченная детективная история, с быстро развивающимся сюжетом и " -"интригами." - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "«Забытая временем планета кальмаров-убийц!»" -msgstr[1] "книги «Забытая временем планета кальмаров-убийц!»" -msgstr[2] "книг «Забытая временем планета кальмаров-убийц!»" -msgstr[3] "книги «Забытая временем планета кальмаров-убийц!»" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" -"Психоделическая повесть о пожилой наемной убийце, исследующей космос и " -"находящей планету, слишком прекрасную, чтобы быть настоящей. Слишком поздно " -"она узнает ужасный секрет в самом центре Забытой временем планеты кальмаров-" -"убийц." - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "«Великие герои Метрополиса»" -msgstr[1] "книги «Великие герои Метрополиса»" -msgstr[2] "книг «Великие герои Метрополиса»" -msgstr[3] "книги «Великие герои Метрополиса»" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" -"Классическая бульварная книга о супергероях, повествующая о группе мстителей" -" в масках, обладающих различными суперсилами и вынужденных объединиться, " -"чтобы остановить самого главного злодея." - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "«Вчера убито»" -msgstr[1] "книги «Вчера убито»" -msgstr[2] "книг «Вчера убито»" -msgstr[3] "книги «Вчера убито»" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" -"Бульварный нуарный роман с быстрым темпом повествования о злоупотребляющем " -"алкоголем детективе со стальными нервами, у которого остался последний шанс " -"свершить возмездие." - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "«Вспышка Кондор и Красные Бандиты»" -msgstr[1] "книги «Вспышка Кондор и Красные Бандиты»" -msgstr[2] "книг «Вспышка Кондор и Красные Бандиты»" -msgstr[3] "книги «Вспышка Кондор и Красные Бандиты»" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" -"Вспыльчивый фотограф, борющаяся с преступностью с помощью фотоаппарата и " -"кулаков, Кондор - не просто фотограф-любитель в водовороте преступности. Но " -"сможет ли она раскрыть ужасный обман и предать Красных Бандитов в руки " -"правосудия?" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -33907,10 +33757,11 @@ msgstr[3] "повести о самурае" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." +"marauding outlaws. This hardback is quite hefty." msgstr "" -"Классический рассказ странствующем войне, который был нанят жителями " -"маленького посёлка для защиты от банды преступников." +"Классическая история о странствующем воине, который был нанят жителями " +"маленького посёлка для защиты от банды преступников. Тяжелая книга в твёрдом" +" переплёте." #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -33966,22 +33817,24 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "«Мастер и Маргарита»" -msgstr[1] "книги «Мастер и Маргарита»" -msgstr[2] "книг «Мастер и Маргарита»" -msgstr[3] "книги «Мастер и Маргарита»" +msgstr[1] "Мастер и Маргарита" +msgstr[2] "Мастер и Маргарита" +msgstr[3] "копии «Мастера и Маргариты»" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" -"Сатира на сталинскую тиранию за авторством Михаила Булгакова, среди " -"персонажей - Сатана, Понтий Пилат, Иисус Христос, вампиры, говорящий кот и " -"литературная элита Москвы." +"Повесть Михаила Булгакова, исследующая философскую природу добра и зла, " +"среди персонажей - Сатана, Понтий Пилат, Иисус Христос, вампиры, говорящий " +"кот и литературная элита Москвы." #: lang/json/BOOK_from_json.py msgid "A Handful of Dust" @@ -34018,376 +33871,6 @@ msgstr "" "том, что даже угроза полного ядерного уничтожения не может повлиять на " "человеческую природу." -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "фантастический роман" -msgstr[1] "фантастических романа" -msgstr[2] "фантастических романов" -msgstr[3] "фантастические романы" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "Инопланетяне, лучевые пушки, космические корабли!" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" -"«Нейромант» Гибсона. Книга написана в восьмидесятых и удивительно точно " -"предсказала современное общество… Ну, до недавнего времени." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" -"«Звёзды — моя цель» Альфреда Бестера.\n" -"\n" -"Тигр, Тигр, жгучий страх,\n" -"Ты горишь в ночных лесах.\n" -"Чей бессмертный взор, любя,\n" -"Создал страшного тебя?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" -"«Резец Небесный» за авторством Урсулы Ле Гуин. Некоторые слова смазаны " -"отпечатками грязных пальцев." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "«Обделённые» Урсулы Ле Гуин." - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "«451 градус по Фаренгейту» Рэя Брэдбери." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "«Гиперион» Дэна Симмонса." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" -"«Эндимион» Дэна Симмонса. В начале книги напечатано стихотворение Д.Г. Лоуренса:\n" -"\n" -"Дайте нам богов, о дайте нам богов!\n" -"Мы так устали от людей с их\n" -"лошадиными силами." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "«Снятся ли андроидам электроовцы?» Филипа К. Дика." - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "«Нова Экспресс» Уильяма Берроуза." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "«Основание» Айзека Азимова. У книги оторвана задняя обложка." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" -"Изрядно помятая «Дюна» Фрэнка Герберта. Между некоторыми страницами песок. " -"Странно." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "«Процесс» Франца Кафки. Книга довольно помятая." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "«Рассказ служанки» Маргарет Этвуд." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" -"«Заводная» за авторством Паоло Бачигалупи. Из-за аннотации вам интересно, " -"как же Таиланд встретил Конец Света." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "«Острова в Сети» Брюса Стерлинга." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" -"«Основание и Империя» Айзека Азимова. Кто-то написал список покупок на " -"последней странице." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" -"Совершенно новенький экземпляр «Помутнения» Филипа К. Дика. Страницы всё ещё" -" пахнут свеженапечатанной книгой." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" -"Сборник «Зеркальные очки: Антология киберпанка» Брюса Стерлинга. Обложка " -"испачкана кофейными кольцами." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" -"«Мир Нуль-А» за авторством А.Э. ван Вогта. Похоже, в этой книжке высушивали " -"цветы." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "«Видоизменённый углерод» Ричарда Моргана." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "«Франкенштейн» Мари Шелли. Вроде так звали монстра, разве нет?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" -"«Оса» Эрика Фрэнка Рассела. Настоящее руководство для террористов будущего." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "«Я легенда» Ричарда Мэтисона. Суперобложка покрыта запёкшейся кровью." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "«Пикник на обочине» Аркадия и Бориса Стругацких." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" -"«Вечная война» Джо Холдемана. Похоже, эту книжку пожевала собака или другое " -"крупное животное." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "«Луна — суровая хозяйка» Роберта А. Хайнлайна." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" -"«Колыбель для кошки» Курта Воннегута. Вы замечаете опечатку в имени автора " -"на корешке книги." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" -"«Нова» Сэмюэля Р. Делани. На обложке написано «Обзорный Экземпляр. Не для " -"продажи.»" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "«Сирены Титана» Воннегута." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" -"«Трава» Шери С. Треппер. Первые страницы изрисованы детскими каракулями." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" -"«Граф Ноль» Уильяма Гибсона. На обложке печать «Библиотечная копия» и стикер" -" «Научная фантастика»." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "«Пятый сезон» Н.К. Джемисин. Книга слегка пахнет землёй." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "«Оружейники» А.Э. ван Вогта." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" -"«Хроники рождённых в космосе» Бекки Чамберс. Книга выглядит почти новой." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" -"«Выбор оружия» Иэна М. Бэнкса. Истрёпанный корешок покрыт трещинами, " -"некоторые страницы едва держатся." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "«Последний человек» Жана-Батиста Кузена Де Гренвиля." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" -"«1984» Оруэлла. Истрёпанные страницы едва держатся на месте. Наверное, с " -"этой книжкой нужно быть бережнее." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "«Чужак в чужой стране» Хайнлайна. Обложка измята и истрёпана." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "«Игра Эндера» Орсона Скотта Карда." - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "Помятый и потрёпанный «О дивный новый мир» Олдоса Хаксли." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "«Затерянный мир» Артура Конан Дойля." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "«Острова в небе» Артура Кларка." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "«Остров доктора Моро» Г.Д. Уэллса." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "«Глас Господа» Станислава Лема." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "«Чёрное облако» Фреда Хойла." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "«Последние и первые люди» Олафа Стэплдона." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "«Солярис» Станислава Лема." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "«Больше, чем люди» Теодора Старджона." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "«Вирт» Джеффа Нуна." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "«Страсти по Лейбовицу» Уолтера М. Миллера-младшего." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "«Война миров» Г.Д. Уэллса." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "«Железный рассвет» Чарльза Стросса." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" -"«Голодные игры» Сьюзен Коллинз. Чтение аннотации напоминает вам японский " -"фильм, на который, вы, кажется, как-то раз наткнулись, смотря телевизор " -"поздней ночью." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "«День Триффидов» Джона Уиндема." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "«Заводной апельсин» Энтони Бёрджесса." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "«Человек, который упал на землю» Уолтера Тевиса." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "«Симулякрон-3» Даниэля Ф. Галуи." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "«Стеклянные пчёлы» Эрнста Юнгера." - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "«Путешествие к центру Земли» Жюля Верна." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" -"«Мир-Кольцо» Ларри Нивена. В конце книги вырвано несколько страниц. К " -"счастью, это были всего лишь рекламки заказов по почте." - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "Потрёпанный экземпляр «Автостопом по галактике» Дугласа Адамса." - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -35853,6 +35336,722 @@ msgstr "" "«Бытие и ничто» Жан-Поля Сартра в мягкой обложке, ключевая работа в традиции" " экзистенциалистов." +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "криминальное чтиво" +msgstr[1] "криминального чтива" +msgstr[2] "криминального чтива" +msgstr[3] "криминальное чтиво" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "" +"Круто завинченная детективная история, с быстро развивающимся сюжетом и " +"интригами." + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "«Чёрные валькирии с Венеры»" +msgstr[1] "книги «Чёрные валькирии с Венеры»" +msgstr[2] "книг «Чёрные валькирии с Венеры»" +msgstr[3] "книги «Чёрные валькирии с Венеры»" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" +"В ваших руках потрепанная временем повесть, написанная кем-то под именем Ли " +"Ракет." + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "«Ложное завтра»" +msgstr[1] "книги «Ложное завтра»" +msgstr[2] "книг «Ложное завтра»" +msgstr[3] "книги «Ложное завтра»" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" +"В ваших руках дешёвая книжка из тех, что можно найти в магазинчике на углу, " +"за авторством Ли Ракет." + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "«Нет Бога из смерти»" +msgstr[1] "книги «Нет Бога из смерти»" +msgstr[2] "книг «Нет Бога из смерти»" +msgstr[3] "книги «Нет Бога из смерти»" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" +"Потрёпанная книга в мягком переплёте за авторством некой Ли Ракет. Она " +"повествует о том, как злоба и зависть могут превратить любого человека в " +"монстра. Очень тяжёлая история, хоть маринад придавливай." + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "«Прыжок в омут»" +msgstr[1] "книги «Прыжок в омут»" +msgstr[2] "книг «Прыжок в омут»" +msgstr[3] "книги «Прыжок в омут»" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" +"Дешёвая книжка с короткой повестью о путешествиях в космосе за авторством Ли" +" Ракет." + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "«Забытая временем планета кальмаров-убийц!»" +msgstr[1] "книги «Забытая временем планета кальмаров-убийц!»" +msgstr[2] "книг «Забытая временем планета кальмаров-убийц!»" +msgstr[3] "книги «Забытая временем планета кальмаров-убийц!»" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" +"Психоделическая повесть о пожилой наемной убийце, исследующей космос и " +"находящей планету, слишком прекрасную, чтобы быть настоящей. Слишком поздно " +"она узнает ужасный секрет в самом центре Забытой временем планеты кальмаров-" +"убийц." + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "«Великие герои Метрополиса»" +msgstr[1] "книги «Великие герои Метрополиса»" +msgstr[2] "книг «Великие герои Метрополиса»" +msgstr[3] "книги «Великие герои Метрополиса»" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" +"Классическая бульварная книга о супергероях, повествующая о группе мстителей" +" в масках, обладающих различными суперсилами и вынужденных объединиться, " +"чтобы остановить самого главного злодея." + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "«Вчера убито»" +msgstr[1] "книги «Вчера убито»" +msgstr[2] "книг «Вчера убито»" +msgstr[3] "книги «Вчера убито»" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" +"Бульварный нуарный роман с быстрым темпом повествования о злоупотребляющем " +"алкоголем детективе со стальными нервами, у которого остался последний шанс " +"свершить возмездие." + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "«Вспышка Кондор и Красные Бандиты»" +msgstr[1] "книги «Вспышка Кондор и Красные Бандиты»" +msgstr[2] "книг «Вспышка Кондор и Красные Бандиты»" +msgstr[3] "книги «Вспышка Кондор и Красные Бандиты»" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" +"Вспыльчивый фотограф, борющаяся с преступностью с помощью фотоаппарата и " +"кулаков, Кондор - не просто фотограф-любитель в водовороте преступности. Но " +"сможет ли она раскрыть ужасный обман и предать Красных Бандитов в руки " +"правосудия?" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "фантастический роман" +msgstr[1] "фантастических романа" +msgstr[2] "фантастических романов" +msgstr[3] "фантастические романы" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "Инопланетяне, лучевые пушки, космические корабли!" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" +"«Нейромант» Гибсона. Книга написана в восьмидесятых и удивительно точно " +"предсказала современное общество… Ну, до недавнего времени." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" +"«Звёзды — моя цель» Альфреда Бестера.\n" +"\n" +"Тигр, Тигр, жгучий страх,\n" +"Ты горишь в ночных лесах.\n" +"Чей бессмертный взор, любя,\n" +"Создал страшного тебя?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" +"«Резец Небесный» за авторством Урсулы Ле Гуин. Некоторые слова смазаны " +"отпечатками грязных пальцев." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "«Обделённые» Урсулы Ле Гуин." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "«Гиперион» Дэна Симмонса." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" +"«Эндимион» Дэна Симмонса. В начале книги напечатано стихотворение Д.Г. Лоуренса:\n" +"\n" +"Дайте нам богов, о дайте нам богов!\n" +"Мы так устали от людей с их\n" +"лошадиными силами." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "«Снятся ли андроидам электроовцы?» Филипа К. Дика." + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "«Нова Экспресс» Уильяма Берроуза." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "«Основание» Айзека Азимова. У книги оторвана задняя обложка." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "«Процесс» Франца Кафки. Книга довольно помятая." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "«Рассказ служанки» Маргарет Этвуд." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" +"«Заводная» за авторством Паоло Бачигалупи. Из-за аннотации вам интересно, " +"как же Таиланд встретил Конец Света." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "«Острова в Сети» Брюса Стерлинга." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" +"«Основание и Империя» Айзека Азимова. Кто-то написал список покупок на " +"последней странице." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" +"Совершенно новенький экземпляр «Помутнения» Филипа К. Дика. Страницы всё ещё" +" пахнут свеженапечатанной книгой." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" +"Сборник «Зеркальные очки: Антология киберпанка» Брюса Стерлинга. Обложка " +"испачкана кофейными кольцами." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" +"«Мир Нуль-А» за авторством А.Э. ван Вогта. Похоже, в этой книжке высушивали " +"цветы." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "«Видоизменённый углерод» Ричарда Моргана." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "«Франкенштейн» Мари Шелли. Вроде так звали монстра, разве нет?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" +"«Оса» Эрика Фрэнка Рассела. Настоящее руководство для террористов будущего." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "«Я легенда» Ричарда Мэтисона. Суперобложка покрыта запёкшейся кровью." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" +"«Вечная война» Джо Холдемана. Похоже, эту книжку пожевала собака или другое " +"крупное животное." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "«Луна — суровая хозяйка» Роберта А. Хайнлайна." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" +"«Нова» Сэмюэля Р. Делани. На обложке написано «Обзорный Экземпляр. Не для " +"продажи.»" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "«Сирены Титана» Воннегута." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" +"«Трава» Шери С. Треппер. Первые страницы изрисованы детскими каракулями." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" +"«Граф Ноль» Уильяма Гибсона. На обложке печать «Библиотечная копия» и стикер" +" «Научная фантастика»." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "«Оружейники» А.Э. ван Вогта." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" +"«Хроники рождённых в космосе» Бекки Чамберс. Книга выглядит почти новой." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" +"«Выбор оружия» Иэна М. Бэнкса. Истрёпанный корешок покрыт трещинами, " +"некоторые страницы едва держатся." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "«Последний человек» Жана-Батиста Кузена Де Гренвиля." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" +"«1984» Оруэлла. Истрёпанные страницы едва держатся на месте. Наверное, с " +"этой книжкой нужно быть бережнее." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "«Чужак в чужой стране» Хайнлайна. Обложка измята и истрёпана." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "«Игра Эндера» Орсона Скотта Карда." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "«Затерянный мир» Артура Конан Дойля." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "«Острова в небе» Артура Кларка." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "«Остров доктора Моро» Г.Д. Уэллса." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "«Глас Господа» Станислава Лема." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "«Чёрное облако» Фреда Хойла." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "«Последние и первые люди» Олафа Стэплдона." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "«Солярис» Станислава Лема." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "«Больше, чем люди» Теодора Старджона." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "«Вирт» Джеффа Нуна." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "«Страсти по Лейбовицу» Уолтера М. Миллера-младшего." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "«Война миров» Г.Д. Уэллса." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "«Железный рассвет» Чарльза Стросса." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" +"«Голодные игры» Сьюзен Коллинз. Чтение аннотации напоминает вам японский " +"фильм, на который, вы, кажется, как-то раз наткнулись, смотря телевизор " +"поздней ночью." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "«День Триффидов» Джона Уиндема." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "«Заводной апельсин» Энтони Бёрджесса." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "«Человек, который упал на землю» Уолтера Тевиса." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "«Симулякрон-3» Даниэля Ф. Галуи." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "«Стеклянные пчёлы» Эрнста Юнгера." + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "«Путешествие к центру Земли» Жюля Верна." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" +"«Мир-Кольцо» Ларри Нивена. В конце книги вырвано несколько страниц. К " +"счастью, это были всего лишь рекламки заказов по почте." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "Потрёпанный экземпляр «Автостопом по галактике» Дугласа Адамса." + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "«Дюна»" +msgstr[1] "книги «Дюна»" +msgstr[2] "книг «Дюна»" +msgstr[3] "книги «Дюна»" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" +"Изрядно помятая «Дюна» Фрэнка Герберта. Между некоторыми страницами песок. " +"Странно." + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" +"Большая копия книги «Дюна». Это недавнее переиздание, и на обложке написано:" +" «СКОРО В КИНОТЕАТРАХ!»." + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "«Притча о талантах»" +msgstr[1] "книги «Притча о талантах»" +msgstr[2] "книг «Притча о талантах»" +msgstr[3] "книги «Притча о талантах»" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" +"Книги «Притча о талантах» в твёрдом переплёте. Продолжение книги Октавии " +"Батлер «Притча о сеятеле»." + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "«Пятое время года»" +msgstr[1] "книги «Пятое время года»" +msgstr[2] "книг «Пятое время года»" +msgstr[3] "книги «Пятое время года»" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" +"Книга «Пятое время года» в твёрдом переплёте за авторством Н. К. Джесимин и " +"с её же автографом. От книги неуловимо пахнет землёй." + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "«Мы»" +msgstr[1] "книги «Мы»" +msgstr[2] "книг «Мы»" +msgstr[3] "книги «Мы»" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" +"Книга в твёрдом переплёте, озаглавленная «'Мы' с аннотациями: новый перевод повести Евегния Замятина».\n" +"\n" +"Перевод Владимира Вознюка книги «Мы», впервые опубликованной в 1924 году и считающейся первой антиутопией. Комментарии к тексту раскрывают многочилсенные аллюзии и отдают должное поэтичности текста Замятина." + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" +"Основополагающее произведение антиутопической беллетристики, «Мы» Евгения Замятина, впервые было опубликовано в 1924 году, но в Советском Союзе его не издавали до 1988 года.\n" +"\n" +"У вас в руках массовое издани 1993 года, переведенное с русского языка Кларенсом Брауном и содержащее краткое вступление. На слегка потертой обложке изображена сюрреалистическая фотография человека, подозрительно смотрящего назад." + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "«Кибериада»" +msgstr[1] "книги «Кибериада»" +msgstr[2] "книг «Кибериада»" +msgstr[3] "книги «Кибериада»" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" +"В этой книге с мягкой обложкой на 350 страниц представлены подвиги и " +"робототехническое соперничество Трурля и Клапауция. Книга первоначально " +"написана на польском языке Станиславом Лемом, перевод на английский был " +"мастерски выполнен Майклом Канделом." + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "«Дивный новый мир»" +msgstr[1] "книги «Дивный новый мир»" +msgstr[2] "книг «Дивный новый мир»" +msgstr[3] "книги «Дивный новый мир»" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" +"Потёртая копия книги Олдоса Хаксли «Дивный новый мир». Выглядит так, будто " +"её забыли под дождём. Повествование начинается со скучного здания, в котором" +" на конвейерах движутся сосуды с растущими в них зародышами." + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "«Пикник на обочине»" +msgstr[1] "книги «Пикник на обочине»" +msgstr[2] "книг «Пикник на обочине»" +msgstr[3] "книги «Пикник на обочине»" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" +"Копия книги «Пикник на обочине» в мягком переплёте за авторством Аркадия и " +"Бориса Стругацких. Книга была переведена на более чем 20 языков, иногда под " +"названием «Сталкер». К счастью для вас, этот экземпляр на вашем родном " +"языке." + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "\"451 градус по Фаренгейту\"" +msgstr[1] "книги \"451 градус по Фаренгейту\"" +msgstr[2] "книги \"451 градус по Фаренгейту\"" +msgstr[3] "книги \"451 градус по Фаренгейту\"" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "Книга \"451 градус по Фаренгейту\" Рэя Брэдбери" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" +"Какой-то шутник аккуратно опалил внешнюю грань переплёта этой антиутопии. Её" +" всё ещё можно прочесть." + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" +"«Жечь было удовольствием. Ещё большим было наблюдать, как всё пожирают, как " +"вещи меняются и чернеют.»" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" +"Книга Рэя Бредбери «451 по Фаренгейту» в мягкой обложке. Когда-то, похоже, " +"была библиотечной - внутри до сих пор лежит библиотечная карточка. В 1981 " +"книгу забрала некая Сьюзан Коллинс." + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" +"Книга в мягком переплёте с красно-черным оформлением - современное " +"переиздание книги Рэя Бредбери «451 по Фаренгейту»." + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" +"Научно-фантастическая повесть, разделённая на три части: «Очаг и " +"Саламандра», «Сито и песок», «Огонь горит ярко»." + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -36276,12 +36475,14 @@ msgstr[3] "книги «10 плюсов быть носительницей ко #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" "Книга для прекрасной маленькой носительницы колец на вашей свадьбе. Автор " "рассказывает об ответственности и чести быть носительницей колец, от которых" -" ваш маленький ангел будет в восторге." +" ваш маленький ангел будет в восторге, помогая устроить вам лучший день в " +"вашей жизни." #: lang/json/BOOK_from_json.py msgid "How to Raise a Gentleman: A Civilized Guide to Parenting" @@ -37984,13 +38185,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" -msgstr[0] "«Милая девочка»" -msgstr[1] "книги «Милая девочка»" -msgstr[2] "книг «Милая девочка»" -msgstr[3] "книги «Милая девочка»" +msgid_plural "copies of Adorkable" +msgstr[0] "«Милая неловкая»" +msgstr[1] "книги «Милая неловкая»" +msgstr[2] "книг «Милая неловкая»" +msgstr[3] "книги «Милая неловкая»" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -38004,30 +38206,32 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "«Стать Джексоном»" msgstr[1] "книги «Стать Джексоном»" msgstr[2] "книг «Стать Джексоном»" msgstr[3] "книги «Стать Джексоном»" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" "Джексон получает мистическую способность - менять свою внешность по желанию." " Сможет ли он узнать свое отражение в зеркале?" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "«Сгоревшее ничто»" msgstr[1] "книги «Сгоревшее ничто»" msgstr[2] "книг «Сгоревшее ничто»" msgstr[3] "книги «Сгоревшее ничто»" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -38038,13 +38242,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "«Взлет и падение»" msgstr[1] "книги «Взлет и падение»" msgstr[2] "книг «Взлет и падение»" msgstr[3] "книги «Взлет и падение»" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -38058,13 +38263,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" -msgstr[0] "«Огонь, когда ты смотришь мне в глаза»" -msgstr[1] "книги «Огонь, когда ты смотришь мне в глаза»" -msgstr[2] "книг «Огонь, когда ты смотришь мне в глаза»" -msgstr[3] "книги «Огонь, когда ты смотришь мне в глаза»" +msgid_plural "copies of Fire When" +msgstr[0] "«Огонь, когда ты в моих глазах»" +msgstr[1] "книги «Огонь, когда ты в моих глазах»" +msgstr[2] "книг «Огонь, когда ты в моих глазах»" +msgstr[3] "книги «Огонь, когда ты в моих глазах»" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -38075,13 +38281,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "«Привкус арахисового масла»" msgstr[1] "книги «Привкус арахисового масла»" msgstr[2] "книг «Привкус арахисового масла»" msgstr[3] "книги «Привкус арахисового масла»" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -38094,13 +38301,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "«По твоему сигналу»" msgstr[1] "книги «По твоему сигналу»" msgstr[2] "книг «По твоему сигналу»" msgstr[3] "книги «По твоему сигналу»" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -38113,13 +38321,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "«Этюд о юноше»" msgstr[1] "книги «Этюд о юноше»" msgstr[2] "книг «Этюд о юноше»" msgstr[3] "книги «Этюд о юноше»" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -38132,13 +38341,14 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "«Летние переменные»" msgstr[1] "книги «Летние переменные»" msgstr[2] "книг «Летние переменные»" msgstr[3] "книги «Летние переменные»" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -38149,6 +38359,80 @@ msgstr "" "совершившей невероятное открытие, привлекшее к ней внимание нежелательных " "элементов." +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "«В тёмном месте»" +msgstr[1] "книги «В тёмном месте»" +msgstr[2] "книг «В тёмном месте»" +msgstr[3] "книги «В тёмном месте»" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" +"Макрия мечтает о будущем. Тео желает прошлого. Сумеют ли они вместе жить в " +"настоящем?" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "«Предательство вдвоём»" +msgstr[1] "книги «Предательство вдвоём»" +msgstr[2] "книг «Предательство вдвоём»" +msgstr[3] "книги «Предательство вдвоём»" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" +"Книга в твёрдом переплёте, ориентированная на старших подростков. Два " +"главных персонажа устраивают жесткий розыгрыш над своими одноклассниками, и " +"их сближают попытки избежать поимки и общее чувство вины." + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "роман о взрослении" +msgstr[1] "романа о взрослении" +msgstr[2] "романов о взрослении" +msgstr[3] "романы о взрослении" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "" +"Классическая история о взрослении, изображающая острые переживания молодого " +"человека в жизни, любви и сексе." + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "«Пантеон: история иранской юности»" +msgstr[1] "книги «Пантеон: история иранской юности»" +msgstr[2] "книг «Пантеон: история иранской юности»" +msgstr[3] "книги «Пантеон: история иранской юности»" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" +"Графическая новелла в твёрдой обложке о молодой девушке, живущей в Иране в " +"1980-х годах, наблюдающей за тем, как меняется мир вокруг неё, на фоне " +"иракского вторжения в её страну." + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -38666,6 +38950,21 @@ msgstr "" "Напряжённый ритуал, напоминающий занятия атлетикой. При его помощи вы можете" " сдержать немного боли." +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "свиток Жестокого превращения" +msgstr[1] "свитка Жестокого превращения" +msgstr[2] "свитков Жестокого превращения" +msgstr[3] "свитки Жестокого превращения" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "Превращает ваших врагов в лягушек." + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -40253,6 +40552,59 @@ msgstr "" "Создает широкую преграду из густого тумана. Хотя резкий перепад давления " "собьет с ног кого угодно, в остальном это заклинание безвредно." +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "свиток Взлома" +msgstr[1] "свитка Взлома" +msgstr[2] "свитков Взлома" +msgstr[3] "свитки Взлома" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" +"Вы можете направить магическую энергию, что открыть запертые деревянные " +"двери поблизости." + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "свиток Улучшенного Взлома" +msgstr[1] "свитка Улучшенного Взлома" +msgstr[2] "свитков Улучшенного Взлома" +msgstr[3] "свитки Улучшенного Взлома" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" +"Вы можете направить магическую энергию, что открыть любые запертые двери " +"поблизости." + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "свиток отталкивающих разрядов" +msgstr[1] "свитка отталкивающих разрядов" +msgstr[2] "свитков отталкивающих разрядов" +msgstr[3] "свитки отталкивающих разрядов" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" +"Вы создаёте вокруг себя потрескивающую электрическими разрядами ауру, " +"разящую молниями атакующих вас." + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -40631,6 +40983,25 @@ msgstr "" "Этот толстый лабораторный справочник полон информации о сочетании магии с " "электромагнитным излучением." +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "осколок рунической таблички" +msgstr[1] "осколка рунической таблички" +msgstr[2] "осколков рунической таблички" +msgstr[3] "осколки рунической таблички" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" +"Маленькая табличка из почерневшего камня, по-видимому, вырезанная из гораздо" +" более крупной. Золотые руны светятся на её поверхности и медленно " +"складываются в читаемые предложения, когда вы смотрите на них." + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -40705,45 +41076,6 @@ msgstr "" " Я тебя люблю,\n" " — Ф.»." -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "«Вначале… была командная строка»" -msgstr[1] "книги «Вначале… была командная строка»" -msgstr[2] "книг «Вначале… была командная строка»" -msgstr[3] "книги «Вначале… была командная строка»" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" -"Юмористическое эссе Нила Стивенсона, написанное в 1999 году, сравнивающее " -"компьютерные операционные системы с автодилерами." - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "«Принципы проектирования компиляторов»" -msgstr[1] "книги «Принципы проектирования компиляторов»" -msgstr[2] "книг «Принципы проектирования компиляторов»" -msgstr[3] "книги «Принципы проектирования компиляторов»" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" -"Классическая книга по программированию 1977 года за авторством Альфреда Ахо " -"и Джеффри Ульмана. На обложке рыцарь, вздымающий парсер LALR, метя в " -"метафорического дракона Сложностей Проектирования Компиляторов." - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -42803,18 +43135,8 @@ msgstr[3] "куски мяса мутанта" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." -msgstr "" -"Мясо сильно мутировавшего животного. У него неприятная рыхлая губчатая " -"текстура, а пахнет оно… Почти как обычно. В нём есть странные неестественные" -" волокна и образования: волосы и кусочки костей внутри мышц, будто бы там " -"пытался развиться другой организм. Тем не менее это кажется съедобным, если " -"его приготовить и удалить самые мерзкие части." +msgid "Meat from a heavily mutated animal." +msgstr "Мясо, срезанное с сильно мутировавшего животного." #: lang/json/COMESTIBLE_from_json.py msgid "scrap of mutant meat" @@ -42828,15 +43150,11 @@ msgstr[3] "обрезки мяса мутанта" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" -"Крошечные кусочки мяса мутировавшего животного. Они пахнут несколько " -"странно, и в них попадаются волосы и кусочки костей, которые выглядят так, " -"словно они выросли внутри самой мышцы. Тем не менее, они кажутся съедобными," -" если их приготовить и удалить самые мерзкие части." +"Маленький обрезок мяса сильно мутировавшего животного. Пахнет неаппетитно, " +"мягко говоря." #: lang/json/COMESTIBLE_from_json.py msgid "mutant humanoid meat" @@ -42932,14 +43250,8 @@ msgstr[3] "приготовленное мясо мутанта" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" -msgstr "" -"Это приготовленный кусок мяса мутировавшего животного. У него неприятная " -"губчатая структура, но вкус… Почти нормальный. Вы надеетесь, что вырезали " -"все волосы и кусочки костей…" +msgid "This is a cooked chunk of meat from a mutated animal." +msgstr "Приготовленный кусок мяса мутировавшего животного." #: lang/json/COMESTIBLE_from_json.py msgid "cooked scrap of mutant meat" @@ -42949,6 +43261,16 @@ msgstr[1] "приготовленных мясных обрезков мутан msgstr[2] "приготовленных мясных обрезков мутанта" msgstr[3] "приготовленные мясные обрезки мутанта" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" +"Небольшой приготовленный обрезок мяса мутанта. Достаточно мелкий, чтобы было" +" трудно осознать его отвратительность." + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -42987,6 +43309,19 @@ msgstr "" "считает их слишком противными, если только они не были тщательно " "подготовлены перед готовкой." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "мутировавшие органы" +msgstr[1] "мутировавшие органы" +msgstr[2] "мутировавшие органы" +msgstr[3] "мутировавшие органы" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "Органы огромного мутировавшего насекомого." + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -43218,6 +43553,19 @@ msgstr "" " виде оно не выглядит аппетитнее, но, по крайней мере, паразитов в нём " "больше нет." +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "мутировавшие лёгкие" +msgstr[1] "мутировавшие лёгкие" +msgstr[2] "мутировавшие лёгкие" +msgstr[3] "мутировавшие лёгкие" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "Без сомнений это ткань легкого" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -43431,12 +43779,13 @@ msgstr[3] "куски жира мутанта" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" -"Свежесрезанное сало сильно мутировавшего животного. Вы можете есть его в " -"сыром виде, но его лучше использовать в качестве ингредиента для других " -"продуктов или проектов." +"Свежий жир, вырезанный из сильно мутировавшего животного. Он пахнет даже " +"хуже, чем остальные части мутанта. С него капает непонятная маслянистая " +"жидкость, собирающаяся в лужицы." #: lang/json/COMESTIBLE_from_json.py msgid "mutant tallow" @@ -45181,21 +45530,21 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "Вода с добавлением сахара или мёда. На вкус нормально." #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" -msgstr[0] "чай" -msgstr[1] "чай" -msgstr[2] "чай" -msgstr[3] "чай" +msgid "black tea" +msgid_plural "black teas" +msgstr[0] "чёрный чай" +msgstr[1] "чёрный чай" +msgstr[2] "чёрный чай" +msgstr[3] "чёрный чай" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." msgstr "" -"Напиток джентльменов, созданный путём заваривания в горячей воде листьев " -"растения камелия китайская." +"Напиток джентльменов, созданный путём заваривания в горячей воде окисленных " +"листьев растения Камелия Китайская." #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -45255,6 +45604,42 @@ msgstr "" "Такая классная минеральная вода, что вы чувствуете себя так классно держа её" " в руке." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "зелёный чай" +msgstr[1] "зелёный чай" +msgstr[2] "зелёный чай" +msgstr[3] "зелёный чай" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" +"Напиток, созданный путём заваривания в горячей воде листьев растения " +"КамелияКитайская. Зелёный чай обладает более лёгким и свежим вкусом по " +"сравнению с чёрным и более распространён в Азии." + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "фруктовый чай" +msgstr[1] "фруктовый чай" +msgstr[2] "фруктовый чай" +msgstr[3] "фруктовый чай" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" +"Вкусный напиток из трав и кусочков высушенных фруктов с растений, не " +"являющихся чаем. Хотя обычно его и называют чаем, технически это настой." + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -47464,6 +47849,40 @@ msgid "" "cheese. Delicious." msgstr "Солёные кукурузные чипсы с мясным фаршем, покрытые сыром. Вкуснятина." +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "вегетарианские начос" +msgstr[1] "вегетарианские начос" +msgstr[2] "вегетарианские начос" +msgstr[3] "вегетарианские начос" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" +"Солёные чипсы из кукурузной тортильи, теперь с бобами. Можно добавить " +"немного сыра." + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "вегетарианские начос с сыром" +msgstr[1] "вегетарианские начос с сыром" +msgstr[2] "вегетарианские начос с сыром" +msgstr[3] "вегетарианские начос с сыром" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" +"Солёные чипсы из кукурузной тортильи с бобами, покрытые сыром. Вкуснятина, " +"даже если вы не вегетарианец." + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -52461,7 +52880,6 @@ msgstr[2] "сосновые орехи" msgstr[3] "сосновые орехи" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "Горсть вкусных хрустящих орехов из сосновой шишки." @@ -53610,30 +54028,72 @@ msgstr "" "подходит для небольших птиц." #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "собачий корм" -msgstr[1] "собачьих корма" -msgstr[2] "собачьих кормов" -msgstr[3] "собачий корм" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "влажный собачий корм" +msgstr[1] "влажный собачий корм" +msgstr[2] "влажный собачий корм" +msgstr[3] "влажный собачий корм" + +#. ~ Description for {'str_sp': 'wet dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "" +"Влажный собачий корм из консервированного мяса. Пахнет странно, но собакам, " +"похоже, нравится." -#. ~ Description for {'str_sp': 'dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." -msgstr "Собачий корм. Пахнет странно, но собакам, похоже, нравится." +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "сухой собачий корм" +msgstr[1] "сухой собачий корм" +msgstr[2] "сухой собачий корм" +msgstr[3] "сухой собачий корм" +#. ~ Description for {'str_sp': 'dry dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "кошачий корм" -msgstr[1] "кошачьих корма" -msgstr[2] "кошачьих кормов" -msgstr[3] "кошачий корм" +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" +"Сухие кусочки корма для собак с большим сроком годности. Изготовлены из " +"сушеного переработанного мяса и зерна, обогащены витаминами и минералами." -#. ~ Description for {'str_sp': 'cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." -msgstr "Кошачий корм. Пахнет странно, но кошкам, похоже, нравится." +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "влажный кошачий корм" +msgstr[1] "влажный кошачий корм" +msgstr[2] "влажный кошачий корм" +msgstr[3] "влажный кошачий корм" + +#. ~ Description for {'str_sp': 'wet cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" +"Влажный кошачий корм из консервированного мяса. Пахнет остро, но кошкам, " +"похоже, нравится." + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "сухой кошачий корм" +msgstr[1] "сухой кошачий корм" +msgstr[2] "сухой кошачий корм" +msgstr[3] "сухой кошачий корм" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" +"Сухие кусочки корма для котов с большим сроком годности. Изготовлены из " +"сушеного переработанного мяса и зерна, обогащены витаминами и минералами." #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -53681,21 +54141,55 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "Нектар. Если вы видите это — это баг." #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" -msgstr[0] "чайный пакетик" -msgstr[1] "чайных пакетика" -msgstr[2] "чайных пакетиков" -msgstr[3] "чайные пакетики" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "пакетик чёрного чая" +msgstr[1] "пакетика чёрного чая" +msgstr[2] "пакетиков чёрного чая" +msgstr[3] "пакетики чёрного чая" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" +"Бумажный пакетик с чайными листьями. Залейте кипятком, чтобы приготовить " +"чашку чёрного чая." + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "пакетик зелёного чая" +msgstr[1] "пакетика зелёного чая" +msgstr[2] "пакетиков зелёного чая" +msgstr[3] "пакетики зелёного чая" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." msgstr "" "Бумажный пакетик с чайными листьями. Залейте кипятком, чтобы приготовить " -"чашку чая." +"чашку зелёного чая." + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "пакетик фруктового чая" +msgstr[1] "пакетика фруктового чая" +msgstr[2] "пакетиков фруктового чая" +msgstr[3] "пакетики фруктового чая" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." +msgstr "" +"Бумажный пакетик с листьями растений и кусочками сушеных фруктов. Залейте " +"кипятком, чтобы приготовить чашку фруктового чая." #: lang/json/COMESTIBLE_from_json.py msgid "herbal tea bag" @@ -53813,24 +54307,17 @@ msgstr[3] "белковые рационы" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" -"SoyPelusa провела очень успешную краудфандинговую кампанию для их фирменного" -" протеинового батончика, названного «ДайЗум». Человек может жить на одних " -"таких батончиках, употребляя их три раза в день, вероятно, неограниченно " -"долго. После того, как поддержавшие проект получили свой продукт, был " -"обнаружен один недостаток: большинство потребителей предпочли бы голодать " -"чем терпеть этот вкус. Продукт на складах остался не проданным, поскольку " -"компания обанкротилась, предоставив МЧС прекрасную возможность выкупить эти " -"батончики и снабдить ими эвакуационные убежища. Теперь вы держите в руках " -"частичку этой знаменитой краудфандинговой истории. Как захватывающе." +"SoyPelusa провела очень успешную краудфандинговую кампанию для их фирменного протеинового батончика, названного «ДайЗум».\n" +"\n" +"Человек может жить на одних таких батончиках, употребляя их три раза в день, вероятно, неограниченно долго. После того, как поддержавшие проект получили свой продукт, был обнаружен один недостаток: большинство потребителей предпочли бы голодать чем терпеть этот вкус. Продукт на складах остался не проданным, поскольку компания обанкротилась, предоставив МЧС прекрасную возможность выкупить эти батончики и снабдить ими эвакуационные убежища.\n" +"\n" +"Теперь вы держите в руках частичку этой знаменитой краудфандинговой истории. Как захватывающе." #: lang/json/COMESTIBLE_from_json.py msgid "protein shake" @@ -54858,14 +55345,14 @@ msgstr "" "чтобы извлечь его." #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "чайный лист" -msgstr[1] "чайных листа" -msgstr[2] "чайных листов" -msgstr[3] "чайный лист" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "лист чёрного чая" +msgstr[1] "листа чёрного чая" +msgstr[2] "листьев чёрного чая" +msgstr[3] "листья чёрного чая" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "Dried leaves of a tropical plant. You can boil them into tea, or you can " @@ -54874,6 +55361,23 @@ msgstr "" "Сушёные листья тропического растения. Можно заварить из них чай, а можно " "просто съесть. Впрочем, они не так уж и питательны." +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "лист зелёного чая" +msgstr[1] "листа зелёного чая" +msgstr[2] "листьев зелёного чая" +msgstr[3] "листья зелёного чая" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" +"Сушёные листья тропического растения. Можно заварить из них зелёный чай, а " +"можно просто съесть. Впрочем, они не так уж и питательны." + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -58256,6 +58760,85 @@ msgstr "" "Мука, смешанная в водой и размятая в вязкую пасту. Из теста можно выпекать " "хлеб эффективнее, чем просто из муки." +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "стебель ананаса" +msgstr[1] "стебля ананаса" +msgstr[2] "стеблей ананаса" +msgstr[3] "стебли ананаса" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "Корешки ананаса, для выращивания." + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "семена дыни" +msgstr[1] "семена дыни" +msgstr[2] "семена дыни" +msgstr[3] "семена дыни" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "Немного семян дыни" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "ростки банана" +msgstr[1] "ростки банана" +msgstr[2] "ростки банана" +msgstr[3] "ростки банана" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "Немного ростков бананов" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "апельсиновое вино" +msgstr[1] "апельсиновое вино" +msgstr[2] "апельсиновое вино" +msgstr[3] "апельсиновое вино" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "Апельсиновое вино. Определенно из ГМО" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "лимонное вино" +msgstr[1] "лимонное вино" +msgstr[2] "лимонное вино" +msgstr[3] "лимонное вино" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "Лимонное вино. Определенно из ГМО" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "подземный кокос" +msgstr[1] "подземных кокоса" +msgstr[2] "подземных кокосов" +msgstr[3] "подземные кокосы" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" +"Доказательство того, что человек зашёл слишком далеко перед Катаклизмом." + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -58779,6 +59362,14 @@ msgstr[1] "яйца анкилозавра" msgstr[2] "яиц анкилозавра" msgstr[3] "яйца анкилозавра" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "яйцо апатозавра" +msgstr[1] "яйца апатозавра" +msgstr[2] "яиц апатозавра" +msgstr[3] "яйца апатозавра" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -59212,7 +59803,7 @@ msgstr[1] "гриба крикуна" msgstr[2] "грибов крикуна" msgstr[3] "грибы крикуна" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -59458,145 +60049,6 @@ msgstr "" "чтобы увидеть это сообщение? Мы не разрешаем тебе присоединиться к нам, " "пока нас модифицируют." -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "ТЕСТОВЫЕ сосновые орешки" -msgstr[1] "ТЕСТОВЫЕ сосновые орешки" -msgstr[2] "ТЕСТОВЫЕ сосновые орешки" -msgstr[3] "ТЕСТОВЫЕ сосновые орешки" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "тестовый горький миндаль" -msgstr[1] "тестовый горький миндаль" -msgstr[2] "тестовый горький миндаль" -msgstr[3] "тестовый горький миндаль" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" -"Горсть миндаля с примесью синильной кислоты, может быть ядовито в сыром " -"виде." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "тестовый галлюциногенный мускатный орех" -msgstr[1] "тестовый галлюциногенный мускатный орех" -msgstr[2] "тестовый галлюциногенный мускатный орех" -msgstr[3] "тестовый галлюциногенный мускатный орех" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" -"Из-за большого содержания психоактивного миристицина, высокие дозы " -"мускатного ореха могут вызвать галлюцинации и эйфорию, а также множество " -"неприятных побочных эффектов." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "тестовое яблоко" -msgstr[1] "тестовых яблока" -msgstr[2] "тестовых яблок" -msgstr[3] "тестовые яблоки" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" -"Яблоко для отладки. Внутри может оказаться червячок, но на вкус что надо!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "тестовая жидкость" -msgstr[1] "тестовая жидкость" -msgstr[2] "тестовая жидкость" -msgstr[3] "тестовая жидкость" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" -"Непонятно, что это, но что-то явно жидкое. Не пить, только для отладки!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "муст из мячиков для тенниса" -msgstr[1] "муст из мячиков для тенниса" -msgstr[2] "муст из мячиков для тенниса" -msgstr[3] "муст из мячиков для тенниса" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" -"Неферментированное вино из мячиков для тенниса. Тягучий варёный сок из " -"порезанных мячиков для тенниса." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "тестовое вино из мячиков для тенниса" -msgstr[1] "тестовое вино из мячиков для тенниса" -msgstr[2] "тестовое вино из мячиков для тенниса" -msgstr[3] "тестовое вино из мячиков для тенниса" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" -"Дешёвая выпивка из забродивших теннисных мячиков. На вкус так, как это " -"звучит." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "тестовая жевательная резинка" -msgstr[1] "тестовая жевательная резинка" -msgstr[2] "тестовая жевательная резинка" -msgstr[3] "тестовая жевательная резинка" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" -"Удивительно бодрящая и утоляющая жажду жевательная резинка с вкусом черники." - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "тестовый мутировавший большой палец" -msgstr[1] "тестовых мутировавших больших пальца" -msgstr[2] "тестовых мутировавших больших пальцев" -msgstr[3] "тестовые мутировавшие большие пальцы" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" -"Безобразный человеческий большой палец. Съесть его было бы невероятно " -"отвратительно, а ещё это может вызвать мутации." - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -60696,23 +61148,6 @@ msgstr[3] "алюминиевые банки" msgid "An aluminum can, like what soda comes in." msgstr "Алюминиевая банка, похожа на банку из-под газировки." -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "открытая алюминиевая банка" -msgstr[1] "открытые алюминиевые банки" -msgstr[2] "открытых алюминиевых банок" -msgstr[3] "открытые алюминиевые банки" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Алюминиевая банка, похожа на банку из-под газировки. Она вскрыта, и её не " -"так-то легко запечатать." - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -60724,29 +61159,12 @@ msgstr[3] "картонные пакеты" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" "Двухлитровый коробчатый пакет из картона, алюминия и пластиковой выстилки. " "Имеется резьбовая пробка для лёгкого закрывания." -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "открытый картонный пакет" -msgstr[1] "открытых картонных пакета" -msgstr[2] "открытых картонных пакетов" -msgstr[3] "открытые картонные пакеты" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" -"Двухлитровый коробчатый пакет из картона, алюминия и пластиковой выстилки. " -"Этот пакет открыт, и его содержимое испортится." - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -60773,23 +61191,6 @@ msgstr[3] "маленькие консервные банки" msgid "A small tin can, like what tuna comes in." msgstr "Маленькая консервная банка, примерно как из под сельди." -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "открытая маленькая консервная банка" -msgstr[1] "открытые маленькие консервные банки" -msgstr[2] "открытых маленьких консервных банок" -msgstr[3] "открытые маленькие консервные банки" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Жестяная консервная банка, примерно как из под сельди. Она вскрыта, и её не " -"так-то легко запечатать." - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -60803,23 +61204,6 @@ msgstr[3] "средние консервные банки" msgid "A medium tin can, like what soup comes in." msgstr "Консервная банка средних размеров, примерно такая, как из под супа." -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "открытая средняя консервная банка" -msgstr[1] "открытые средние консервные банки" -msgstr[2] "открытых средних консервных банок" -msgstr[3] "открытые средние консервные банки" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Жестяная консервная банка средних размеров, примерно такая, как из под супа." -" Она вскрыта, и её не так-то легко запечатать." - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -60913,19 +61297,6 @@ msgstr[3] "пластиковые стаканчики" msgid "A small, vacuum formed cup." msgstr "Небольшой одноразовый стаканчик из пластика." -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "открытый пластиковый стаканчик" -msgstr[1] "открытых пластиковых стаканчика" -msgstr[2] "открытых пластиковых стаканчиков" -msgstr[3] "открытые пластиковые стаканчики" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "Небольшой одноразовый стаканчик. По сути — хлам." - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -61145,7 +61516,6 @@ msgstr[2] "галлонных бутылок" msgstr[3] "галлонные бутылки" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "Стандартный пластиковый бидон для молока и бытовой химии." @@ -61274,7 +61644,6 @@ msgstr[2] "маленьких бурдюков" msgstr[3] "маленькие бурдюки" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -61439,23 +61808,6 @@ msgid "" msgstr "" "Большая жестяная банка, в каких хранятся бобы. Вмещает довольно много еды." -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "открытая большая консервная банка" -msgstr[1] "открытые большие консервные банки" -msgstr[2] "открытых больших консервных банок" -msgstr[3] "открытые большие консервные банки" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" -"Большая жестяная банка, в каких хранятся бобы. Она вскрыта, и её не так-то " -"легко запечатать." - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -62105,6 +62457,42 @@ msgstr[3] "куски хитина" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "Кусок панциря насекомого. Лёгкий и очень прочный." +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "прядь эндохитина" +msgstr[1] "пряди эндохитина" +msgstr[2] "прядей эндохитина" +msgstr[3] "пряди эндохитина" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "Кусок панциря насекомого" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "гроздь газовых мешков" +msgstr[1] "грозди газовых мешков" +msgstr[2] "гроздей газовых мешков" +msgstr[3] "грозди газовых мешков" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" +"Гроздь мембранных пузырей размером с виноградину, вырезанных из " +"внутренностей мутировавшего насекомого. Они парят, как шарики с гелием и " +"скорее всего наполнены каким-то газом легче воздуха, позволяющим насекомым " +"летать." + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -62191,6 +62579,39 @@ msgstr "" "Войлочные лоскуты, крепко связанные для удобства хранения. Разберите для " "распаковки." +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "связка досок" +msgstr[1] "связки досок" +msgstr[2] "связок досок" +msgstr[3] "связки досок" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" +"Десяток строительных досок, связанных верёвкой. Разберите для распаковки." + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "связка прочных веток" +msgstr[1] "связки прочных веток" +msgstr[2] "связок прочных веток" +msgstr[3] "связки прочных веток" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "Десяток прочных веток, связанных верёвкой. Разберите для распаковки." + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -63703,8 +64124,8 @@ msgstr[1] "цветка лотоса" msgstr[2] "цветков лотоса" msgstr[3] "цветки лотоса" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -65510,6 +65931,19 @@ msgstr "" "Лазерная пушка, снятая с лазерной турели TX-5LR Цербер. Непригодна как " "оружие без необходимых деталей." +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "набор костяной брони" +msgstr[1] "набора костяной брони" +msgstr[2] "наборов костяной брони" +msgstr[3] "набор костяной брони" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "Костяная броня для транспорта." + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -67467,6 +67901,74 @@ msgid "" "wound." msgstr "Почти обезглавленный труп. Непонятно, что могло нанести такую рану." +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "сломанный дрон Экзоди" +msgstr[1] "сломанных дрона Экзоди" +msgstr[2] "сломанных дронов Экзоди" +msgstr[3] "сломанные дроны Экзоди" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "Сломанный дрон Экзоди. Можно разобрать на запчасти." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "сломанный шагатель Экзоди" +msgstr[1] "сломанных шагателя Экзоди" +msgstr[2] "сломанных шагателей Экзоди" +msgstr[3] "сломанные шагатели Экзоди" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" +"Сломанный шагатель Экзоди. Всё ещё выглядит устрашающе, несмотря на " +"нерабочее состояние, возможно из-за огромного размера и массы. Можно " +"разобрать на запчасти." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "сломанная турель Экзоди" +msgstr[1] "сломанные турели Экзоди" +msgstr[2] "сломанные турели Экзоди" +msgstr[3] "сломанные турели Экзоди" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" +"Сломанная турель Экзоди. Всё ещё выглядит устрашающе, несмотря на нерабочее " +"состояние, возможно из-за огромного размера и массы. Можно разобрать на " +"запчасти." + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "сломанный дрон Экзоди с надувным шаром" +msgstr[1] "сломанные дроны Экзоди с надувным шаром" +msgstr[2] "сломанные дроны Экзоди с надувным шаром" +msgstr[3] "сломанные дроны Экзоди с надувным шаром" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" +"Сломанный дрон с надувным шаром. Шар разорван в клочья, но ходовая часть в " +"порядке Можно разобрать на части." + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -69668,7 +70170,7 @@ msgstr[3] "микрофоны XLR" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" "Обычный микрофон для записи или усиления голоса. На нем есть застежка для " "одежды. Имеет трехпиновый XLR разъем в основании для соединения с " @@ -69916,6 +70418,24 @@ msgstr "" "Простой механический чугунный центробежный насос. Без установки от него мало" " пользы." +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "набор фитингов" +msgstr[1] "набора фитингов" +msgstr[2] "наборов фитингов" +msgstr[3] "наборы фитингов" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" +"Широкий ассортимент металлических фитингов - торцевые заглушки, соединения " +"труб и тому подобное. Их можно использовать в самых разных проектах." + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -70748,10 +71268,10 @@ msgstr[3] "люцернские молоты" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" -"Универсальное древковое оружие — шипастый молот, лезвие и крюк на длинном " -"шесте." +"Универсальное древковое оружие — шипастый молот, лезвие и крюк на прочном " +"деревянном шесте." #. ~ Description for {'str': 'lucerne hammer'} #: lang/json/GENERIC_from_json.py @@ -71225,7 +71745,6 @@ msgstr[2] "заострённых палок" msgstr[3] "заострённые палки" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "Простая деревянная палка, заточенная на одном конце." @@ -71345,7 +71864,7 @@ msgstr[3] "алебарды" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." +" attached to a long sturdy stick." msgstr "" "Универсальное древковое оружие, к длинному древку которого прикрепляются " "лезвие топора, шипы и другие весёлые вещи." @@ -71354,7 +71873,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." +"spike, and other fun things attached to a thick pole." msgstr "" "Тупая и дешёвая подделка древкового оружия, к длинному древку которого " "прикрепляются лезвие топора, шипы и другие весёлые вещи." @@ -72144,23 +72663,6 @@ msgstr "" "холодное оружие из Индии в виде когтей, предназначенное для скрытого ношения" " в ладони." -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "цестус" -msgstr[1] "цестуса" -msgstr[2] "цестусов" -msgstr[3] "цестусы" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" -"Обмотка из кожи для руки и ладони с металлическими вставками на костяшках " -"для улучшения силы удара и защиты." - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -72368,6 +72870,151 @@ msgstr "" "морского стекла, матовый и шероховатый с округлыми краями. Немного тёплый на" " ощупь." +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "шасси Экзоди" +msgstr[1] "шасси Экзоди" +msgstr[2] "шасси Экзоди" +msgstr[3] "шасси Экзоди" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" +"Примерно гексагональная рама с соответствующими элементами, выглядящая так, " +"будто создана в виде монолитной детали. Монтажные отверстия и крепления " +"чрезвычайно прочные, несмотря на следы серьёзного износа и многочисленные " +"метки от ремонта. Это достаточно универсальная рама, и вероятно, на её " +"основе можно создать платформу для множества различных боевых ролей." + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "шасси дрона Экзоди" +msgstr[1] "шасси дрона Экзоди" +msgstr[2] "шасси дрона Экзоди" +msgstr[3] "шасси дрона Экзоди" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" +"Небольшая, примерно гексагональная рама с соответствующими элементами, " +"выглядящая так, будто создана в виде монолитной детали. Монтажные отверстия " +"и крепления чрезвычайно прочные, несмотря на следы серьёзного износа и " +"многочисленные метки от ремонта. Это достаточно универсальная рама, и " +"вероятно, на её основе можно создать платформу для множества различных " +"боевых ролей." + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "кибернетическая нейронная матрица" +msgstr[1] "кибернетические нейронные матрицы" +msgstr[2] "кибернетических нейронных матриц" +msgstr[3] "кибернетические нейронные матрицы" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" +"Набор ёмкостей и трубок с разъемами для загрузки жидкостей, подключения " +"электричества, вводами и выводами. Эта сложная конструкция создана для " +"помещения мозга и позвоночника, а также незаменимых для их жизнеобеспечения " +"органов." + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "незнакомая электронная штуковина" +msgstr[1] "незнакомые электронные штуковины" +msgstr[2] "незнакомых электронных штуковин" +msgstr[3] "незнакомые электронные штуковины" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" +"Провода и общая форма подсказывают вам, что это компьютер, ну или какое-то " +"электронное устройство, но что именно и зачем оно нужно - вам не понятно. " +"Оно тяжелое и крепкое." + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "расписанные металлические платы" +msgstr[1] "расписанные металлические платы" +msgstr[2] "расписанные металлические платы" +msgstr[3] "расписанные металлические платы" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" +"Похоже на какую-то незнакомую электронику. Представляет из себя набор " +"похожих на медные концентрических колец. От каждого из них тянутся провода к" +" оси." + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "кибернетический сенсор" +msgstr[1] "кибернетических сенсора" +msgstr[2] "кибернетических сенсоров" +msgstr[3] "кибернетические сенсоры" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" +"Судя по большому стеклянному глазу спереди - размером примерно с тарелку - " +"это что-то вроде камеры. Ее внутреннее устройство вам совершенно непонятно, " +"оно не похоже ни на одну камеру, которую вы видели раньше" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "вращающееся устройство" +msgstr[1] "вращающихся устройства" +msgstr[2] "вращающихся устройств" +msgstr[3] "вращающиеся устройства" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" +"Вы предполагаете, что катушки медного провода и выступающий поршень - это " +"своего рода двигатель или генератор, но конструкция не похожа на то, что вы " +"видели раньше, и вы не можете понять, как заставить его работать." + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -72481,7 +73128,6 @@ msgstr[2] "труб" msgstr[3] "трубы" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -72757,7 +73403,15 @@ msgstr "" "Большой лист из прочного гибкого пластика. Когда-то такие применялись для " "коммерческой упаковки или обшивки дома от непогоды." -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "жёсткий пластиковый лист" +msgstr[1] "жёстких пластиковых листа" +msgstr[2] "жёстких пластиковых листов" +msgstr[3] "жёсткие пластиковые листы" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -73925,8 +74579,8 @@ msgstr[3] "самодельные глефы" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." msgstr "" "Огромное лезвие, прикреплённое к длинной палке. Может нанести серьёзные " "повреждения." @@ -74148,6 +74802,27 @@ msgstr[3] "степлеры" msgid "A stapler for fastening sheets of paper together." msgstr "Степлер для сшивания листов бумаги вместе." +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "дырокол" +msgstr[1] "дыроколы" +msgstr[2] "дыроколы" +msgstr[3] "дыроколы" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" +"Металлический инструмент, позволяющий пробить одну дырку в листе бумаги. То " +"есть можно и больше, если вы хотите, но по одной за раз. Или, если вы хотите" +" делать много дырок одним движением, сложите лист бумаги несколько раз…  В " +"общем, обычный одноцилиндровый дырокол." + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -74488,6 +75163,24 @@ msgstr "" "транспортное средство, пока оно не начнёт держаться на воде. Потом " "прикрепите вёсла или мотор, чтобы лодка могла плавать." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "часть корпуса из брёвен" +msgstr[1] "части корпуса из брёвен" +msgstr[2] "частей корпуса из брёвен" +msgstr[3] "части корпуса из брёвен" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" +"Связанные вместе брёвна для придания транспорту плавучести. Устанавливайте " +"детали корпуса на транспортное средство, пока оно не начнёт держаться на " +"воде. Потом прикрепите вёсла или мотор, чтобы лодка могла плавать." + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -75679,7 +76372,6 @@ msgstr[2] "листов металла" msgstr[3] "листы металла" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "Тонкий лист металла." @@ -75822,19 +76514,6 @@ msgstr[3] "набор биосилицированной хитиновой бр msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "Крепкая, покрытая кремнием хитиновая броня для транспорта." -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "набор костяной брони" -msgstr[1] "набора костяной брони" -msgstr[2] "наборов костяной брони" -msgstr[3] "набор костяной брони" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "Костяная броня для транспорта." - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -76190,8 +76869,8 @@ msgstr[1] "верстака" msgstr[2] "верстаков" msgstr[3] "верстаки" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -76430,6 +77109,19 @@ msgstr "" "Металлический водопроводный кран, который можно присоединить к баку с водой " "для её использования." +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "деревянное крепление колеса" +msgstr[1] "деревянных крепления колеса" +msgstr[2] "деревянных креплений колеса" +msgstr[3] "деревянные крепления колеса" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "Кусок дерева с отверстиями для велосипедного колеса." + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -77231,6 +77923,20 @@ msgstr[3] "надпричинные логические перестановщ msgid "It has given you an answer, but you are yet to ask anything." msgstr "Дает ответ на вопрос, который вы только собираетесь задать." +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "лист плетёного метаматериала" +msgstr[1] "листа плетёного метаматериала" +msgstr[2] "листов плетёного метаматериала" +msgstr[3] "листы плетёного метаматериала" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "Сложно закрученный и тщательно сплетённый лист радужных волокон." + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -77351,11 +78057,28 @@ msgstr[3] "сверхпроводящие электромагниты" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." msgstr "" "Мощный электромагнит из сверхпроводников, работающих при комнатной " "температуре." +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "ферромагнитная жидкость" +msgstr[1] "ферромагнитная жидкость" +msgstr[2] "ферромагнитная жидкость" +msgstr[3] "ферромагнитная жидкость" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." +msgstr "" +"Чёрная металлическая жидкость, гармонично перетекающая из одной фрактальной " +"формы в другую. " + #: lang/json/GENERIC_from_json.py msgid "composite alloy" msgid_plural "composite alloys" @@ -78159,6 +78882,19 @@ msgstr "" "Собрание древних хилланских мифов и фольклора. Раздел книги, описывающий " "исторические битвы, отмечен закладкой." +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "«Штормовой страж»" +msgstr[1] "книги «Штормовой страж»" +msgstr[2] "книг «Штормовой страж»" +msgstr[3] "книги «Штормовой страж»" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "Книга, содержащая учение дисциплины Железного Сердца." + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -78176,6 +78912,80 @@ msgstr "" "Биография военного киборга, подробно описывающая его боевые искусства и " "взгляды на жизнь." +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "«Энциклопедия карманных монстров»" +msgstr[1] "копии «Энциклопедии карманных монстров»" +msgstr[2] "копий «Энциклопедии карманных монстров»" +msgstr[3] "копии «Энциклопедии карманных монстров»" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" +"Эта энциклопедия содержит подробный список сильных сторон и приемов " +"различных вымышленных монстров и способы их применения в реальной битве." + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "«Дальний горизонт»" +msgstr[1] "книги «Дальний горизонт»" +msgstr[2] "книг «Дальний горизонт»" +msgstr[3] "книги «Дальний горизонт»" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "Книга, содержащая учение дисциплины Заходящего Солнца." + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "Голокрона джедаев: Первая форма" +msgstr[1] "Голокроны джедаев: Первая форма" +msgstr[2] "Голокрон джедаев: Первая форма" +msgstr[3] "Голокроны джедаев: Первая форма" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" +"Устройство, содержащее принципы первой формы боя на световых мечах джедаев: " +"Шии-Чо." + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "«Осколки гранита»" +msgstr[1] "копии «Осколки гранита»" +msgstr[2] "копий «Осколки гранита»" +msgstr[3] "копии «Осколки гранита»" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "Книга, содержащая учение дисциплины Каменного Дракона." + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "«Когти Пожинателя»" +msgstr[1] "копии «Когти Пожинателя»" +msgstr[2] "копий «Когти Пожинателя»" +msgstr[3] "копии «Когти Пожинателя»" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "Книга, содержащая учение дисциплины Тигриного Когтя." + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -78204,7 +79014,7 @@ msgstr[3] "светящаяся пыль" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "" "Растёртые в пыль остатки физического тела блуждающего огонька. Они всё ещё " @@ -78370,7 +79180,7 @@ msgstr[3] "пыль из маны" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" "Кристаллизованная мана в форме порошка. Она слабо светится от магической " "энергии. " @@ -80199,174 +81009,6 @@ msgid "" msgstr "" "Рама из орихалка. Заметно прочнее стали, но соответственно заметно дороже." -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "ТЕСТОВАЯ доска" -msgstr[1] "ТЕСТОВЫЕ доски" -msgstr[2] "ТЕСТОВЫХ досок" -msgstr[3] "ТЕСТОВЫЕ доски" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" -"Узкая толстая деревянная доска примерно 5 на 10 сантиметров. Неплохое " -"оружие, а ещё годится для изготовления самых разных вещей." - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "ТЕСТОВАЯ труба" -msgstr[1] "ТЕСТОВЫЕ трубы" -msgstr[2] "ТЕСТОВЫХ труб" -msgstr[3] "ТЕСТОВЫЕ трубы" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "ТЕСТОВЫЙ лист металла" -msgstr[1] "ТЕСТОВЫХ листа металла" -msgstr[2] "ТЕСТОВЫХ листов металла" -msgstr[3] "ТЕСТОВЫЕ листы металла" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "ТЕСТОВАЯ 4.5л бутылка" -msgstr[1] "ТЕСТОВЫЕ 4.5л бутылки" -msgstr[2] "ТЕСТОВЫХ 4.5л бутылок" -msgstr[3] "ТЕСТОВЫЕ 4.5л бутылки" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "ТЕСТОВЫЙ маленький бурдюк" -msgstr[1] "ТЕСТОВЫХ маленьких бурдюка" -msgstr[2] "ТЕСТОВЫХ маленьких бурдюков" -msgstr[3] "ТЕСТОВЫЕ маленькие бурдюки" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "тестовый воздушный шар" -msgstr[1] "тестовых воздушных шара" -msgstr[2] "тестовых воздушных шаров" -msgstr[3] "тестовые воздушные шары" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" -"Тянется, не пропускает воду и воздух - идеальный шарик для тестирования." - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "тестовая заострённая палка" -msgstr[1] "тестовые заострённые палки" -msgstr[2] "тестовых заострённых палок" -msgstr[3] "тестовые заострённые палки" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "ТЕСТОВЫЙ неудобный меч" -msgstr[1] "ТЕСТОВЫХ неудобных меча" -msgstr[2] "ТЕСТОВЫХ неудобных мечей" -msgstr[3] "ТЕСТОВЫЕ неудобные мечи" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "Плохо сбалансированный меч для тестирования кода" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "ТЕСТОВЫЙ обычный меч" -msgstr[1] "ТЕСТОВЫХ обычных меча" -msgstr[2] "ТЕСТОВЫХ обычных мечей" -msgstr[3] "ТЕСТОВЫЕ обычные мечи" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "Меч для тестирования кода" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "ТЕСТОВЫЙ меч с хорошим балансом" -msgstr[1] "ТЕСТОВЫХ меча с хорошим балансом" -msgstr[2] "ТЕСТОВЫХ мечей с хорошим балансом" -msgstr[3] "ТЕСТОВЫЕ мечи с хорошим балансом" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "Хорошо сбалансированный меч для тестирования кода" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "тестовая коробка" -msgstr[1] "тестовые коробки" -msgstr[2] "тестовых коробок" -msgstr[3] "тестовые коробки" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" -"Обычная коробка объемом в 1 литр с намеренно неопределенными пропорциями." - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "тестовый 14 см жезл" -msgstr[1] "тестовых 14 см жезла" -msgstr[2] "тестовых 14 см жезлов" -msgstr[3] "тестовые 14 см жезлы" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "Тонкий жезл длиной ровно 14 см." - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "тестовый 15 см жезл" -msgstr[1] "тестовых 15 см жезла" -msgstr[2] "тестовых 15 см жезлов" -msgstr[3] "тестовые 15 см жезлы" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "Тонкий жезл длиной ровно 15 см." - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "тестовый ядерный графин" -msgstr[1] "тестовых ядерных графина" -msgstr[2] "тестовых ядерных графинов" -msgstr[3] "тестовые ядерные графины" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" -"Тестовый ядерный графин, в котором атомные напитки становятся особенно " -"радиоактивными. Постоянно излучает радиацию." - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "ОРУЖИЕ" @@ -83910,6 +84552,44 @@ msgstr "" "Самодельный двухлитровый бак под давлением, из которого подаётся смесь для " "самодельного химического распылителя." +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "магазин PA Md. 71 12.3ln Экзоди" +msgstr[1] "магазина PA Md. 71 12.3ln Экзоди" +msgstr[2] "магазинов PA Md. 71 12.3ln Экзоди" +msgstr[3] "магазины PA Md. 71 12.3ln Экзоди" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" +"Маленький, узкий магазин на основе классической обоймы PA Md. 71, слегка " +"доработанные Экзоди для более удобного использования на парящих дронах. Из-" +"за небольшого размера не очень подходит для боя с ордой зомби на земле, так " +"как его неудобно перезаряжать." + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "магазин PA Md. 68 12.3ln Экзоди" +msgstr[1] "магазина PA Md. 68 12.3ln Экзоди" +msgstr[2] "магазинов PA Md. 68 12.3ln Экзоди" +msgstr[3] "магазины PA Md. 68 12.3ln Экзоди" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "" +"Неразумно тяжёлый магазин для уже и так тяжёлой боевой винтовки PA Md. 68, " +"разработанный и кастомизированный Экзоди." + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -84520,34 +85200,6 @@ msgstr "" "Это маленький кристалл маны, специально разработанный для прикрепления к " "кончику волшебной палочки." -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "тестовая одноразовая батарейка" -msgstr[1] "тестовые одноразовые батарейки" -msgstr[2] "тестовых одноразовых батареек" -msgstr[3] "тестовые одноразовые батарейки" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "Тестовая одноразовая батарейка." - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "тестовый электрический аккумулятор" -msgstr[1] "тестовых электрических аккумулятора" -msgstr[2] "тестовых электрических аккумуляторов" -msgstr[3] "тестовые электрические аккумуляторы" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "Тестовая батарея, которую можно зарядить." - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "по умолчанию" @@ -84563,10 +85215,14 @@ msgstr "Aftershock" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." msgstr "" "Мод, двигающий игру в направлении меньшего реализма и большей " -"фантастичности." +"фантастичности. В дальней перспективе будет предлагать значительно " +"отличающийся опыт игры, по прежнему совместимый с другими модами." #: lang/json/MOD_INFO_from_json.py msgid "Blaze Industries" @@ -84612,11 +85268,13 @@ msgstr "Темные Небеса" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" -"Полноценная модификация игры, меняющая фокус Катаклизма на вторжение и " -"инопланетную оккупацию в духе XCOM 2. Используйте на свой страх и риск!" +"Полная конверсия, сдвигающая сюжет Катаклизма к истории инопланетной " +"оккупации. ЭТОТ МОД НАРУШИТ ФУНКЦИОНАЛЬНОСТЬ ДРУГИХ МОДОВ! ИСПОЛЬЗУЙТЕ " +"ДРУГИЕ МОДЫ НА СВОЙ СТРАХ И РИСК." #: lang/json/MOD_INFO_from_json.py msgid "DinoMod" @@ -84842,18 +85500,6 @@ msgstr "Характеристики за навыки" msgid "Allows stats to raise via skill progression." msgstr "Позволяет характеристикам повышаться при росте навыков." -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "ТЕСТОВЫЕ ДАННЫЕ" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" -"Добавляет абстрактные предметы, рецепты и прочее, необходимое для " -"автоматических тестов." - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "Городская застройка" @@ -85227,6 +85873,64 @@ msgstr "" "личности, запертой в изуродованном теле. При наличии хирургических навыков " "вы могли бы вернуть ему человечность. Если вас это волнует, конечно…" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "дрон Экзоди" +msgstr[1] "дрона Экзоди" +msgstr[2] "дронов Экзоди" +msgstr[3] "дроны Экзоди" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "Человекоподобный робот с различными строительными инструментами." + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "шагатель Экзоди" +msgstr[1] "шагателя Экзоди" +msgstr[2] "шагателей Экзоди" +msgstr[3] "шагатели Экзоди" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" +"Огромный четвероногий робот, кажется, собранный из попавшихся частей, " +"большинство из которых вам незнакомы. Он движется тяжелой, странно изящной " +"походкой, его шаги оставляют неглубокие ямы. Он несёт при себе серьёзный " +"арсенал оружия, но, похоже, не слишком торопится нацеливаться на вас." + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "зомборг" +msgstr[1] "зомборга" +msgstr[2] "зомборгов" +msgstr[3] "зомборги" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" +"Сочетание мёртвого человека и ещё более мёртвой технологии. Мешанина плоти и" +" стали, движущаяся словно марионетка в руках сердитого ребёнка. Похоже, " +"роботизированные элементы отключились, и новые полосы плоти обернули их и " +"закрепили под странными углами. Местами из под разлагающейся плоти выступают" +" металлический скелет и пластины брони." + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -85535,6 +86239,30 @@ msgstr "" "Автоматический дрон-квадрокоптер во много раз больше обычного, по-видимому с" " ядерной мини-бомбой внутри. Если он нацелится на вас… Бегите." +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "парящий дрон-снайпер" +msgstr[1] "парящих дрона-снайпера" +msgstr[2] "парящих дронов-снайперов" +msgstr[3] "парящие дроны-снайперы" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" +"Необычное устройство, похожее на сочетание метеозонда и квадрокоптера. Под " +"грубым контейнером висит небольшая установка с интегрированной винтовкой. " +"Небольшие пропеллеры время от времени оживают, удерживая позицию устройства " +"в воздухе. Похоже, оно может долго продержаться в воздухе, пока не сядут " +"аккумуляторы." + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -87358,6 +88086,20 @@ msgstr "" " этой извращенной аномалии из плоти. Глаза на всех головах беспорядочно " "шныряют по сторонам, а рты сливаются в хоре стона и визга." +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "человек" +msgstr[1] "человека" +msgstr[2] "человек" +msgstr[3] "человек" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" +"Это псевдовещь для человеческих трупов. Если вы ее видите, значит это баг." + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -87910,6 +88652,27 @@ msgstr "" " свою добычу острыми когтями, а потом наносит смертельный удар огромными " "клыками." +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "тигр" +msgstr[1] "тигра" +msgstr[2] "тигров" +msgstr[3] "тигры" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" +"Величественный тигр, крупный хищник семейства кошачьих. Естественная среда " +"обитания - Азия, хотя сейчас наиболее крупные популяции находятся в частных " +"резервациях в Соединенных Штатах. Этот сильный и быстрый хищник - один из " +"самых узнаваемых и любимых животных в мире. А еще и один из самых опасных." + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -90115,6 +90878,23 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "Молния бьет из стебля пиявочника!" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "сигнальное дерево" +msgstr[1] "сигнальных дерева" +msgstr[2] "сигнальных деревьев" +msgstr[3] "сигнальные деревья" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" +"Тянущийся высоко в небо ствол, чьи верхние ветви светятся желтым светом. " +"Низкий рокот периодически сотрясет его окрестности." + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -90787,6 +91567,25 @@ msgstr[3] "громкоговорители" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "Мощный громкоговоритель, шумно повторяющий по кругу набор сообщений" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "самодельная турель" +msgstr[1] "самодельные турели" +msgstr[2] "самодельных турелей" +msgstr[3] "самодельные турели" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" +"Здоровенная турель, похоже, собранная из частей, произведённых по незнакомой" +" вам технологии, многие из которых кажутся чужеродными. Оснащена здоровенным" +" пулеметом." + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -90909,6 +91708,203 @@ msgstr "" " У его облика поразительные детали, но от скованных движений вам правда не " "по себе. Конец света не помешал ему искать пациента, которому нужна помощь." +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "собака-скелет" +msgstr[1] "собаки-скелета" +msgstr[2] "собак-скелетов" +msgstr[3] "собаки-скелеты" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"Это когда-то бывшее собакой существо потеряло всю кожу, обнажая каркас рёбер" +" и костей. Эта костяная броня без следа внешней плоти скрепляется сеткой " +"гадко выглядящих чёрных вен и сухожилий, покрытых чёрной слизью." + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "баргест" +msgstr[1] "баргеста" +msgstr[2] "баргестов" +msgstr[3] "баргесты" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" +"Большой, раздувшийся зомби-пёс, покрытый чёрной слизью. У него длинные зубы," +" а его спина бугрится мышцами и покрыта свежими ранами." + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "огромный жутень" +msgstr[1] "огромных жутня" +msgstr[2] "огромных жутней" +msgstr[3] "огромные жутни" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" +"Четвероногое собачье тело, раздувшееся до гротескных пропорций, с лапами " +"толщиной с мусорный бак и огромными щерящимся зубами." + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "костяной волк" +msgstr[1] "костяных волка" +msgstr[2] "костяных волков" +msgstr[3] "костяные волки" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" +"Четвероногое создание, покрытое сросшимися костяными пластинами, " +"напоминающее волка или собаку. Его суставы и трещины в пластинах сочатся " +"чёрной жижей." + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "волк-скелет" +msgstr[1] "волка-скелета" +msgstr[2] "волков-скелетов" +msgstr[3] "волки-скелеты" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "саблезомби" +msgstr[1] "саблезомби" +msgstr[2] "саблезомби" +msgstr[3] "саблезомби" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" +"Глаза этой пумы сочатся чёрной маслянистой жидкостью, а её мех разорван и " +"покрыт глубокими гнойными ранами. Её ногти и зубы и когти неестественно " +"удлинены, превратившись в опасно выглядящие острые копья." + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "медведь-скелет" +msgstr[1] "медведя-скелета" +msgstr[2] "медведей-скелетов" +msgstr[3] "медведи-скелеты" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" +"Чудовищное разрастание окостеневшей ткани заменило гниющую кожу зомби " +"органической броней из плотных костей. Большие сгустки чёрной слизи сочатся " +"из сочленений. Оно издаёт отвратительные щелчки, когда двигается." + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "теневой кот" +msgstr[1] "теневых кота" +msgstr[2] "теневых котов" +msgstr[3] "теневые коты" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" +"Сверхъестественная тень окружает это существо, как будто сам свет отражается" +" от него. Вы можете разглядеть только дрожащий контур, похожий на огромного " +"кота." + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "кислотный медвезомби" +msgstr[1] "кислотных медвезомби" +msgstr[2] "кислотных медвезомби" +msgstr[3] "кислотные медвезомби" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" +"Болезненного вида мертвый чёрный медведь с драной шерстью. Его кожа выглядит" +" необычайно тонкой, видно, как по его венам течёт жёлтая липкая жидкость." + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "рогатый молотобой" +msgstr[1] "рогатых молотобоя" +msgstr[2] "рогатых молотобоев" +msgstr[3] "рогатые молотобои" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Глаза этого бывшего когда-то лосём монстра сочатся чёрной маслянистой " +"жидкостью, а его плоть разорвана и вся в шрамах. Все его тело вздуто " +"растянутыми мышцами и опухшими гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "шипастый медведь-ползун" +msgstr[1] "шипастых медведя-ползуна" +msgstr[2] "шипастых медведей-ползунов" +msgstr[3] "шипастые медведи-ползуны" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" +"То, что когда-то было большим лосем, теперь покрыто длинными спутанными " +"волосами, скрученными между собой колючими лозами, уходящими в тело. Длинные" +" переплетенные шипы покрывают рога, источая таинственную серебристую " +"жидкость." + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -90944,26 +91940,6 @@ msgstr "" "Обезображенный оживший труп собаки. Поджарый зверь, способный с лёгкостью " "догнать своих двуногих друзей." -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "собака-скелет" -msgstr[1] "собаки-скелета" -msgstr[2] "собак-скелетов" -msgstr[3] "собаки-скелеты" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"Это когда-то бывшее собакой существо потеряло всю кожу, обнажая каркас рёбер" -" и костей. Эта костяная броня без следа внешней плоти скрепляется сеткой " -"гадко выглядящих чёрных вен и сухожилий, покрытых чёрной слизью." - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -91109,6 +92085,40 @@ msgstr "" "Более-менее нормально выглядящая пума, за исключением того, что её задние " "ноги распухли, а из глаз сочится чёрная слизь." +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "тигр-упырь" +msgstr[1] "тигра-упыря" +msgstr[2] "тигров-упырей" +msgstr[3] "тигры-упыри" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" +"Почти нормально выглядящий тигр, что спотыкается и качается, его челюсти " +"обвисли, глаза широко открыты и блестят черным цветом." + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "масса зомби-пауков" +msgstr[1] "массы зомби-пауков" +msgstr[2] "масс зомби-пауков" +msgstr[3] "массы зомби-пауков" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" +"Тысячи, если не миллионы пауков, скопившихся в высокую кучу и истекающих " +"липким зелёным гноем, держащие эту массу вместе и двигающие её." + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -91845,6 +92855,59 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "Пронзатель выстреливает колючкой!" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "ножницеход" +msgstr[1] "ножницехода" +msgstr[2] "ножницеходов" +msgstr[3] "ножницеходы" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" +"Возвышающийся среди руин кошмарный паук, покрытый кровью и хранящий " +"молчание, наблюдающий за умирающими окрестностями. Его тонкие костяные " +"конечности скользят между обломками с потусторонней скоростью." + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "свисающие потроха" +msgstr[1] "свисающих потрохов" +msgstr[2] "свисающих потрохов" +msgstr[3] "свисающие потроха" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" +"Огромные змеящиеся полоски плоти, свисающие с потолка, сердито молотящие по " +"всему, до чего дотягиваются." + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "пульсирующая куча" +msgstr[1] "пульсирующие кучи" +msgstr[2] "пульсирующих куч" +msgstr[3] "пульсирующие кучи" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" +"Огромная гора сросшихся тел и мутировавшей плоти. Она неритмично и отчаянно " +"пульсирует." + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -94419,6 +95482,23 @@ msgstr "" "Массивный, похожий на носорога динозавр с костяным гребнем, из которого " "растут три больших рога." +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "трицератопс био-оперативник" +msgstr[1] "трицератопса био-оперативника" +msgstr[2] "трицератопсов био-оперативников" +msgstr[3] "трицератопсы био-оперативники" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" +"Массивный трехрогий четырехногий динозавр, покрытый щёлкающей бионикой. Рога" +" угрожающе светятся." + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -94432,7 +95512,7 @@ msgstr[3] "стегозавры" msgid "" "A large slow quadruped dinosaur with plates on its back, and a spiked tail." msgstr "" -"Большой и мделительный четвероногий динозавр с пластинами на спине и хвостом" +"Большой и медлительный четвероногий динозавр с пластинами на спине и хвостом" " с шипами." #: lang/json/MONSTER_from_json.py @@ -94452,6 +95532,24 @@ msgstr "" "Этот динозавр выглядит как гигантский доисторический броненосец. На конце " "его хвоста находится массивная костяная булава с шипами." +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "апатозавр" +msgstr[1] "апатозавра" +msgstr[2] "апатозавров" +msgstr[3] "апатозавры" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" +"Массивный четвероногий динозавр с длинной шеей и длинным хвостом, похожим " +"накнут. Голова поднята высоко вверх, а шея выглядит так, как будто её можно " +"использовать в качестве дубины." + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -94744,6 +95842,135 @@ msgstr[1] "детеныша динозавра пурпурно-зеленого msgstr[2] "детенышей динозавра пурпурно-зеленого цвета" msgstr[3] "детеныши динозавра пурпурно-зеленого цвета" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "грибной зомби-спинозавр" +msgstr[1] "грибных зомби-спинозавра" +msgstr[2] "грибных зомби-спинозавров" +msgstr[3] "грибные зомби-спинозавры" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" +"Когда-то это было хищным динозавром с головой, похожей на крокодилью и " +"плавником на спине. Теперь грибные усики растут из его рта, глаз и других " +"отверстий, превращая его в огромную неловко переваливающаяся массу из " +"покрытой плесенью плоти." + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "грибной тираннозомби рекс" +msgstr[1] "грибных тираннозомби рекса" +msgstr[2] "грибных тираннозомби рексов" +msgstr[3] "грибные тираннозомби рексы" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" +"Когда-то это было королём динозавров. Теперь грибные усики растут из его " +"рта, глаз и других отверстий, превращая его в огромную неловко " +"переваливающаяся массу из покрытой плесенью плоти." + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "грибной дейноних-зомби" +msgstr[1] "грибных дейнониха-зомби" +msgstr[2] "грибных дейнонихов-зомби" +msgstr[3] "грибные дейнонихи-зомби" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" +"Когда-то это было пернатым хищным динозавром среднего размера. Теперь " +"грибные усики растут из его рта, глаз и других отверстий, превращая его в " +"огромную неловко переваливающаяся массу из покрытой плесенью плоти." + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "зомби-галлимим" +msgstr[1] "зомби-галлимима" +msgstr[2] "зомби-галлимимов" +msgstr[3] "зомби-галлимимы" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" +"Покачивающийся труп средних размеров двуногого динозавра, покрытый " +"ободранным оперением и черной жижей." + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "зомби-пахи" +msgstr[1] "зомби-пахи" +msgstr[2] "зомби-пахи" +msgstr[3] "зомби-пахи" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" +"Покачивающийся труп средних размеров двуногого динозавра, покрытый " +"ободранным оперением и черной жижей. Выглядит как страус-рептилия с круглой " +"прочной головой." + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "зомби-кампто" +msgstr[1] "зомби-кампто" +msgstr[2] "зомби-кампто" +msgstr[3] "зомби-кампто" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" +"Покачивающийся труп большого двуногого динозавра с мощными ногами, широкими " +"плечами и острым клювом, покрытый ободранным оперением и черной жижей." + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "зомби-спинозавр" +msgstr[1] "зомби-спинозавра" +msgstr[2] "зомби-спинозавров" +msgstr[3] "зомби-спинозавры" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" +"Огромный гниющий труп динозавра со свирепой крокодилоподобной головой, " +"сочащимися черным глазами и изодранным плавником на спине." + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -94758,14 +95985,140 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "Огромная груда рваной, зловонной плоти, щерящейся огромными зубами." #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" -msgstr[0] "Z-дейноних" -msgstr[1] "Z-дейнониха" -msgstr[2] "Z-дейнонихов" -msgstr[3] "Z-дейнонихи" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "зомби-альбертозавр" +msgstr[1] "зомби-альбертозавра" +msgstr[2] "зомби-альбертозавров" +msgstr[3] "зомби-альбертозавры" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" +"Покачивающийся труп динозавра с массивной челюстью, источающей чёрную " +"жидкость, и длинными когтями для хватания жертвы." + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "Трицераптеррор" +msgstr[1] "Трицераптеррора" +msgstr[2] "Трицераптерроров" +msgstr[3] "Трицераптерроры" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" +"Массивный, похожий на носорога качающийся труп динозавра с костяным гребнем," +" из которого растут три больших рога. Из его глаз течёт нечто, похожее на " +"густые чёрные слёзы." + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "зомби-стегозавр" +msgstr[1] "зомби-стегозавра" +msgstr[2] "зомби-стегозавров" +msgstr[3] "зомби-стегозавры" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" +"Большой и медлительный качающийся труп четвероногого динозавра с пластинами " +"на спине и резко покачивающимся хвостом с шипами." + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "зомби-анкилозавр" +msgstr[1] "зомби-анкилозавра" +msgstr[2] "зомби-анкилозавров" +msgstr[3] "зомби-анкилозавры" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" +"Покачивающийся труп динозавра, выглящий как гигантский доисторический " +"броненосец с отваливающимися пластинми брони и блестящими чёрными глазами. " +"На конце его хвоста находится массивная костяная булава с шипами." + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "зомби-апатозавр" +msgstr[1] "зомби-апатозавра" +msgstr[2] "зомби-апатозавров" +msgstr[3] "зомби-апатозавры" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" +"Массивный четвероногий труп динозавра с длинной шеей и длинным хвостом, " +"похожим накнут. Голова поднята высоко вверх, а шея выглядит так, как будто " +"её можно использовать в качестве дубины." + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "зомби-дракон" +msgstr[1] "зомби-дракона" +msgstr[2] "зомби-драконов" +msgstr[3] "зомби-драконы" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" +"Огромный зомби, покрытый чешуёй, костяными шипами и двигающийся с пугающей " +"скоростью. Его цветастые рога ободраны и покрыты грязью, а его светлая чешуя" +" и костяные наросты заметно повреждены." + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "зомби-аллозавр" +msgstr[1] "зомби-аллозавра" +msgstr[2] "зомби-аллозавров" +msgstr[3] "зомби-аллозавры" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" +"Большой, покачивающийся труп хищного двуногого динозавра с тигриными " +"полосами на широкой чешуйчатой спине." + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "дейноних-зомби" +msgstr[1] "дейнониха-зомби" +msgstr[2] "дейнонихов-зомби" +msgstr[3] "дейнонихи-зомби" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -94776,6 +96129,538 @@ msgstr "" "ободранным оперением и черной жижей. На каждой ноге растёт большой " "серповидный коготь." +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "зомби-ютараптор" +msgstr[1] "зомби-ютараптора" +msgstr[2] "зомби-ютарапторов" +msgstr[3] "зомби-ютарапторы" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" +"Покачивающийся и мечущийся труп большого двуногого динозавра с перьями на " +"передних лапах, длинным хвостом и длинными, острыми серпообразными когтями." + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "зомби-паразауролоф" +msgstr[1] "зомби-паразауролофа" +msgstr[2] "зомби-паразауролофов" +msgstr[3] "зомби-паразауролофы" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" +"Огромный пёстрый динозавр с тупым головным гребнем, мёртвый и бредущий с " +"пустым взглядом и раздувшимися глазами." + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "зомби-диморфодон" +msgstr[1] "зомби-диморфодона" +msgstr[2] "зомби-диморфодонов" +msgstr[3] "зомби-диморфодоны" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" +"Ободранный труп когда-то летающей рептилии ростом чуть меньше метра с " +"короткими крыльями и крупным цветастым клювом." + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "зомби-дилофозавр" +msgstr[1] "зомби-дилофозавра" +msgstr[2] "зомби-дилофозавров" +msgstr[3] "зомби-дилофозавры" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" +"Средних размеров труп динозавра с острыми зубами и двумя костяными гребнями " +"на его голове и полосками оторванной плоти, свисающей подобно кружевам." + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "отвратный галлимим" +msgstr[1] "отвратных галлимима" +msgstr[2] "отвратных галлимимов" +msgstr[3] "отвратные галлимимы" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" +"Покачивающийся труп средних размеров двуногого динозавра, покрытый " +"ободранным оперением и черной жижей. Всё его тело покрыто раздутыми мышцами " +"и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "череполом" +msgstr[1] "череполома" +msgstr[2] "череполомов" +msgstr[3] "череполомы" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" +"Покачивающийся труп средних размеров двуногого динозавра, покрытый " +"ободранным оперением и черной жижей. Его круглая, массивная голова держится " +"на теле, покрытым раздутыми мышцами и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "кампозавроломатель" +msgstr[1] "кампозавроломателя" +msgstr[2] "кампозавроломателей" +msgstr[3] "кампозавроломатели" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" +"Покачивающийся труп большого двуногого динозавра с неприятно раздутыми " +"ногами, широкими возвышающимися плечами и бритвенно острым клювом, покрытый " +"ободранным оперением и черной жижей." + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "спинозавромолотус" +msgstr[1] "спинозавромолотуса" +msgstr[2] "спинозавромолотусов" +msgstr[3] "спинозавромолотусы" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" +"Огромный гниющий труп динозавра со свирепой крокодилоподобной головой, " +"сочащимися черным глазами и изодранным плавником на спине. Его тело даже " +"больше обычного, покрыто раздувшимися мышцами и набухшими, гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "гневрекс" +msgstr[1] "гневрекса" +msgstr[2] "гневрексов" +msgstr[3] "гневрексы" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" +"Огромная груда рваной, зловонной плоти, щерящейся огромными зубами. Всё её " +"тело бугрится раздутыми мышцами и опухшими гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "альбертовальня" +msgstr[1] "альбертовальни" +msgstr[2] "альбертовальен" +msgstr[3] "альбертовальни" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Массивные челюсти и хваткие когти на теле, бугрящемся раздутыми мышцами и " +"опухшими гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "трицератрак" +msgstr[1] "трицератрака" +msgstr[2] "трицератраков" +msgstr[3] "трицератраки" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" +"Массивный, похожий на носорога качающийся труп динозавра с костяным гребнем," +" из которого растут три больших рога. Из его глаз течёт нечто, похожее на " +"густые чёрные слёзы. Всё его тело покрыто раздутыми мышцами и набухшими, " +"гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "стегозавр-молот" +msgstr[1] "стегозавра-молота" +msgstr[2] "стегозавров-молотов" +msgstr[3] "стегозавры-молоты" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" +"Покачивающийся труп большого четвероногого динозавра с пластинами на спине, " +"помахивающий шипастым хвостом. Всё его тело покрыто раздутыми мышцами и " +"набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "динотанк" +msgstr[1] "динотанка" +msgstr[2] "динотанков" +msgstr[3] "динотанки" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Тяжелый бронированный зомби-динозавр. Всё его тело бугрится раздутыми " +"мышцами и опухшими гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "зомби дредноут" +msgstr[1] "зомби дредноута" +msgstr[2] "зомби дредноутов" +msgstr[3] "зомби дредноуты" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" +"Покачивающийся труп массивного четвероногого динозавра с вытянутой шеей и " +"длинным, похожим на кнут хвостом. Всё его тело покрыто раздутыми мышцами и " +"набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "драконотитан" +msgstr[1] "драконотитана" +msgstr[2] "драконотитанов" +msgstr[3] "драконотитаны" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" +"Огромный зомби, покрытый чешуёй, костяными шипами и двигающийся с пугающей " +"скоростью. Его цветастые рога и костяные шипы покрывают тело, покрытое " +"вздутыми мышцами и опухшими гнойными ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "аллозавролавина" +msgstr[1] "аллозавролавины" +msgstr[2] "аллозавролавин" +msgstr[3] "аллозавролавины" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" +"Покачивающийся труп большого хищного двуногого динозавра. Всё его тело " +"покрыто раздутыми мышцами и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "дейнихорушитель" +msgstr[1] "дейнихорушителя" +msgstr[2] "дейнихорушителей" +msgstr[3] "дейнихорушители" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Покачивающийся труп средних размеров двуногого динозавра, покрытый " +"ободранным оперением и черной жижей. На обеих ногах красуются огромные, " +"похожие на косы когти. Всё его тело покрыто раздутыми мышцами и набухшими, " +"гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "ютавудузавр" +msgstr[1] "ютавудузавра" +msgstr[2] "ютавудузавров" +msgstr[3] "ютавудузавры" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" +"Покачивающийся и мечущийся труп большого двуногого динозавра с перьями на " +"передних лапах, длинным хвостом и длинными, острыми серпообразными когтями. " +"Всё его тело покрыто раздутыми мышцами и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "паразавролом" +msgstr[1] "паразавролома" +msgstr[2] "паразавроломов" +msgstr[3] "паразавроломы" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"Огромный пёстрый динозавр с тупым головным гребнем, мёртвый и бредущий с " +"пустым взглядом и раздувшимися глазами. Всё его тело покрыто раздутыми " +"мышцами и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "крылатый ужас" +msgstr[1] "крылатых ужаса" +msgstr[2] "крылатых ужасов" +msgstr[3] "крылатые ужасы" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" +"Летающий труп оперённой рептилии ростом чуть меньше метра с короткими " +"крыльями и крупным цветастым клювом. Всё её тело покрыто раздутыми мышцами и" +" набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "крестокрушитель" +msgstr[1] "крестокрушителя" +msgstr[2] "крестокрушителей" +msgstr[3] "крестокрушители" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" +"Средних размеров труп динозавра с острыми зубами и двумя костяными гребнями " +"на его голове и полосками оторванной плоти, свисающей подобно кружевам. Всё " +"его тело покрыто раздутыми мышцами и набухшими, гноящимися ранами." + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "теневой зомби-спинозавр" +msgstr[1] "теневых зомби-спинозавра" +msgstr[2] "теневых зомби-спинозавров" +msgstr[3] "теневые зомби-спинозавры" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" +"Жутковатая тень охватывает этого динозавра. Вы можете разглядеть силуэт " +"большого двуногого динозавра с разодранным плавником. У него длинная голова " +"и V-образная морда." + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "теневой тираннозомби рекс" +msgstr[1] "теневых тираннозомби рекса" +msgstr[2] "теневых тираннозомби рексов" +msgstr[3] "теневые тираннозомби рексы" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" +"Жутковатая тень охватывает этого динозавра. Вы можете разглядеть силуэт " +"большого двуногого динозавра с подобием ободранного оперения. У него большая" +" голова с кучей зубов в пасти." + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "теневой дейноних-зомби" +msgstr[1] "теневых дейнониха-зомби" +msgstr[2] "теневых дейнонихов-зомби" +msgstr[3] "теневые дейнонихи-зомби" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" +"Жутковатая тень охватывает этого динозавра. Вы можете разглядеть силуэт " +"динозавра среднего размера с подобием ободранного оперения. На каждой ноге " +"растёт большой серповидный коготь." + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "скелетозавр-рекс" +msgstr[1] "скелетозавр-рекса" +msgstr[2] "скелетозавр-рексов" +msgstr[3] "скелетозавр-рексы" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" +"Чудовище из плотных костей, щерящееся с высоты огромными бритвенными зубами," +" с которых капает чёрная слизь." + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "альбертозавр-скелет" +msgstr[1] "альбертозавра-скелета" +msgstr[2] "альбертозавррв-скелетов" +msgstr[3] "альбертозавры-скелеты" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" +"Чудовище из плотных костей, щерящееся с высоты бритвенными зубами, с которых" +" капает чёрная слизь. Его костяные когти тянутся во все стороны." + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "костяной дракон" +msgstr[1] "костяных дракона" +msgstr[2] "костяных драконов" +msgstr[3] "костяные драконы" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" +"Чудовище из плотных костей, щерящееся с высоты бритвенными зубами, с которых" +" капает чёрная слизь. Эффект усиливается торчащими цветными рогами и " +"костяными шипами." + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "аллозавр-скелет" +msgstr[1] "аллозавра-скелета" +msgstr[2] "аллозавров-скелетов" +msgstr[3] "аллозавры-скелеты" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" +"Чудовище из плотных костей, щерящееся с высоты бритвенными зубами, с которых" +" капает чёрная слизь." + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "ютакостезавр" +msgstr[1] "ютакостезавра" +msgstr[2] "ютакостезавров" +msgstr[3] "ютакостезавры" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" +"Чудовище из плотных костей, щерящееся с высоты бритвенными зубами, с которых" +" капает чёрная слизь. У него длинный хвост и длинные, похожие на косы когти." + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -95406,6 +97291,23 @@ msgstr "" "Крикун — это гриб размером с человека, который издает пронзительный визг, " "чтобы отогнать существ, которые его беспокоят." +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "лягушка" +msgstr[1] "лягушки" +msgstr[2] "лягушек" +msgstr[3] "лягушки" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" +"Подозрительно обычная американская лягушка. Лучше не подпускать к ней Ивана-" +"царевича." + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -95761,23 +97663,6 @@ msgstr "" "вспомогательных самодостаточных войск, предназначенных для беспроблемной " "интеграции с традиционными войсками." -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "мумия из туалетной бумаги" -msgstr[1] "мумии из туалетной бумаги" -msgstr[2] "мумий из туалетной бумаги" -msgstr[3] "мумии из туалетной бумаги" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" -"Человекоподобное создание, запутанное в нечто, напоминающее множество слоев " -"туалетной бумаги." - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -96280,23 +98165,6 @@ msgstr "" "Самодельная броня — нагривник, нагрудник и накрупник из демонического " "хитина, прикреплённого к тонкой сетке. Можно надеть на дружественную лошадь." -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "бронекотожилет" -msgstr[1] "бронекотожилета" -msgstr[2] "бронекотожилетов" -msgstr[3] "бронекотожилеты" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" -"Облегченная и маловесная кевларовая упряжь для кошек с защитным капюшоном и " -"нагрудником. Включает очень маленький, неудобный карман с липучкой на спине." - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "млекопитающее" @@ -96309,6 +98177,14 @@ msgstr "амфибия" msgid "a bird" msgstr "птица" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "инопланетный киборг" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "тяжёлые удары." + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "рептилия" @@ -97051,6 +98927,24 @@ msgstr "" "Это псевдозаклинание срабатывает при активации черепной бомбы. Скорее всего," " смертельно." +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "Отдача черепной пушки" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" +"Это псевдозаклинание срабатывает при активации черепной пушки. Может быть " +"смертельно в критической ситуации." + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "Ваша голова дёргается назад из-за силы выстрела." + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "пси-оглушение" @@ -97188,6 +99082,18 @@ msgstr "" "Этот ритуал создаёт маленький камешек, наполненный магией анимистов. Эту " "руну можно применять в рецептах как катализатор." +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "Выдирание дыши" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" +"Жестоко вырывает дух из тела, подчиняя вам получающуюся в результате тень." + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "Блуждающий огонек" @@ -97418,6 +99324,15 @@ msgstr "Отладочное заклинание усталости" msgid "Uses a little fatigue" msgstr "Тратит немного усталости" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "Отладочный полиморф" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "Ну ты же хотел сбросить вес, да?" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "Отладочное заклинание ХП" @@ -97476,8 +99391,8 @@ msgstr "Отталкивает все предметы наружу." msgid "Debug Full Protection" msgstr "Отладочная Полная защита" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "Ничто не может нанести вам вред." @@ -97866,6 +99781,10 @@ msgstr "Удар маны" msgid "Haste" msgstr "Ускорение" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "Жестокое превращение" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "Луч маны" @@ -97993,10 +99912,10 @@ msgstr "Вызывает 4 демонических паучков навсег msgid "Jolt" msgstr "Разряд" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "потрескивание" @@ -98069,6 +99988,33 @@ msgstr "Создает настоящий эффект светошумовой msgid "Wall of Fog" msgstr "Стена тумана" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "Аура отталкивающих разрядов" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "Это вспомогательное заклинание Ауры отталкивающих разрядов." + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "разряд электричества!" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "Отталкивающий разряд" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" +"Создаёт вокруг вас потрескивающую электрическими разрядами ауру, разящую " +"молниями атакующих вас." + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "Благословение" @@ -98190,72 +100136,44 @@ msgstr "" msgid "X-ray Vision" msgstr "Рентгеновское зрение" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "Сифон маны" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "" -"Это псевдозаклинание для серии мутации сифона маны. Если оно у вас есть, " -"скорее всего вы добавили его для отладки." - -#: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "Пыщь-пыщь" - -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "Вы целитесь в противника пальцем и издаете звуки «Пыщь-пыщь»." - #: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "Пол это лава" +msgid "Knock" +msgstr "Взлом" -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" -msgstr "Лучше заберитесь на стул или стол, потому что пол стал лавой!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." +msgstr "" +"Вы направляете магическую энергию, способную открывать двери. Этот вариант " +"заклинания может открывать только деревянные двери." #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" -msgstr "Смонтированная нарезка тренировки" +msgid "Improved Knock" +msgstr "Улучшенный Взлом" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -"Когда чтобы научиться чему-то, нужно слишком много времени, а вы хотите " -"сразу получить результат, вам понадобится нарезка из моментов вашей " -"тренировки." - -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "Поцелуй бо-бо" +"Вы направляете магическую энергию, способную открывать двери. Этот вариант " +"заклинания может открывать только любые двери." -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "Нежный поцелуй туда, где болит. Будто мама сделала." - -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" -msgstr "Призыв мумии" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" +msgstr "Сифон маны" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" -"Призывает хрупкое существо из тряпок, появляющееся из чулана вашей дущи." +"Это псевдозаклинание для серии мутации сифона маны. Если оно у вас есть, " +"скорее всего вы добавили его для отладки." #: lang/json/TOOLMOD_from_json.py msgid "reactor core expansion device" @@ -101270,34 +103188,42 @@ msgstr "" "владельца." #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" -msgstr[0] "малый пояс карманов" -msgstr[1] "малых пояса карманов" -msgstr[2] "малых поясов карманов" -msgstr[3] "малые пояса карманов" - -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" +msgstr[0] "малый ремень измерений" +msgstr[1] "малых ремня измерений" +msgstr[2] "малых ремней измерений" +msgstr[3] "малые ремни измерений" + +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" -"Широкий облегающий талию пояс, покрыт множеством маленьких кармашков, " -"которые вмешают больше, чем кажется. А вес их содержимого значительно " -"уменьшается." +"Прочный облегающий талию пояс, покрыт множеством маленьких удобных " +"кармашков. Как и любые хранилища, использующие другие измерения, они вмещают" +" куда больше, чем должны, заметно уменьшая при этом вес содержимого." #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" -msgstr[0] "большой пояс карманов" -msgstr[1] "больших пояса карманов" -msgstr[2] "больших поясов карманов" -msgstr[3] "большие пояса карманов" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" +msgstr[0] "большой ремень измерений" +msgstr[1] "больших ремня измерений" +msgstr[2] "больших ремней измерений" +msgstr[3] "большие ремни измерений" + +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" +"Прочный и тяжёлый облегающий талию пояс, покрыт множеством маленьких удобных" +" кармашков. Как и любые хранилища, использующие другие измерения, они " +"вмещают куда больше, чем должны, заметно уменьшая при этом вес содержимого." #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" @@ -102648,6 +104574,22 @@ msgstr[1] "бионических зажигалки" msgstr[2] "бионических зажигалок" msgstr[3] "бионические зажигалки" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "коптильня" +msgstr[1] "коптильни" +msgstr[2] "коптилен" +msgstr[3] "коптильни" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" +"Это crafting_pseudo_item, если у вас это есть, то что-то пошло не так." + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -102735,7 +104677,7 @@ msgstr[3] "фонари из тыквы" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "Свет" @@ -106051,13 +107993,6 @@ msgstr[1] "псевдо маслобойки" msgstr[2] "псевдо маслобоек" msgstr[3] "псевдо маслобойки" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" -"Это crafting_pseudo_item, если у вас это есть, то что-то пошло не так." - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -107159,13 +109094,11 @@ msgstr[3] "смартфоны" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "Вы активировали приложение «фонарик»." #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "Заряд смартфона слишком мал." @@ -108922,7 +110855,6 @@ msgstr[2] "пожарных топоров" msgstr[3] "пожарные топоры" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -108941,7 +110873,6 @@ msgstr[2] "пожарных багров" msgstr[3] "пожарные багры" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -108980,16 +110911,44 @@ msgstr[1] "метательных огнетушителя" msgstr[2] "метательных огнетушителей" msgstr[3] "метательные огнетушители" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "Выдернуть затычку" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "Вы выдёргиваете затычку пожарной гранаты." + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." msgstr "" "Это огнетушитель в форме гранаты. Не так эффективен, как обычный " -"огнетушитель, но его можно использовать на расстоянии. Он активируется от " -"нагрева, так что просто бросьте его в огонь." +"огнетушитель, но его можно использовать на расстоянии. Можно выдернуть " +"затычку, но он активируется от нагрева, так что просто бросьте его в огонь." + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "активированный метательный огнетушитель" +msgstr[1] "активированных метательных огнетушителя" +msgstr[2] "активированных метательных огнетушителей" +msgstr[3] "активированные метательные огнетушители" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" +msgstr "" +"Это активированная онетушащая граната, готовая взорваться в любой момент. " +"Лучше ее бросить!" #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -109258,6 +111217,36 @@ msgstr "" "Плоский камень, присоединённый к палке, работает вполне сносно в качестве " "лопаты, но не сможет сравниться с настоящей лопатой." +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "металлические грабли" +msgstr[1] "металлических граблей" +msgstr[2] "металлических граблей" +msgstr[3] "металлические грабли" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "Прочные металлические грабли. Осенью без них никуда." + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "пластиковые грабли" +msgstr[1] "пластиковых граблей" +msgstr[2] "пластиковых граблей" +msgstr[3] "пластиковые грабли" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" +"Дешёвые пластиковые грабли. Быстро развалятся, если использовать их для чего" +" угодно, кроме уборки листьев." + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -109292,6 +111281,32 @@ msgstr "" "Инструмент для копания. Используйте лопату, чтобы окопать глубокими ямами " "ваше убежище." +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "снегоуборочная лопата" +msgstr[1] "снегоуборочные лопаты" +msgstr[2] "снегоуборочных лопат" +msgstr[3] "снегоуборочные лопаты" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "Прочный инструмент для уборки снега." + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "пластиковая снегоуборочная лопата" +msgstr[1] "пластиковые снегоуборочные лопаты" +msgstr[2] "пластиковых снегоуборочных лопат" +msgstr[3] "пластиковые снегоуборочные лопаты" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "Дешёвая пластиковая лопата для уборки снега." + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -110208,6 +112223,14 @@ msgstr "" "Портативная кузня, работающая на древесном угле. При наличии необходимых " "инструментов может использоваться для кузнечных работ." +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "Каменная кузня" +msgstr[1] "Каменные кузни" +msgstr[2] "Каменных кузен" +msgstr[3] "Каменные кузни" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -110381,6 +112404,22 @@ msgstr "" "Длинные металлические щипцы. Обычно используются для приготовления пищи или " "в металлообработке." +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "лист наждачной бумаги" +msgstr[1] "листа наждачной бумаги" +msgstr[2] "листов наждачной бумаги" +msgstr[3] "листы наждачной бумаги" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" +"Лист бумаги с абразивным покрытием. Используется в металлообработке и " +"столярном деле." + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -110578,6 +112617,23 @@ msgstr "" " убережёт вас от соприкосновения с землёй и поможет легче заснуть. " "Используйте, чтобы развернуть и разместить на земле." +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "садовый шланг" +msgstr[1] "садовых шланга" +msgstr[2] "садовых шлангов" +msgstr[3] "садовые шланги" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" +"Гибкий садовый шланг. Можно разрезать на части покороче и использовать при " +"создании предметов или для слива бензина из автомобилей." + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -112942,7 +114998,6 @@ msgstr[2] "тряпок" msgstr[3] "тряпки" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -113480,14 +115535,14 @@ msgstr "" "Электропила включена и создаёт много шума. Активируйте её, чтобы выключить." #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "каменное рубило" -msgstr[1] "каменных рубила" -msgstr[2] "каменных рубил" -msgstr[3] "каменные рубила" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "каменная головка топора" +msgstr[1] "каменные головки топора" +msgstr[2] "каменных головок топора" +msgstr[3] "каменные головки топора" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -113497,14 +115552,14 @@ msgstr "" "скалывать дерево." #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "металлическое рубило" -msgstr[1] "металлических рубила" -msgstr[2] "металлических рубил" -msgstr[3] "металлические рубила" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "металлическая головка топора" +msgstr[1] "металлические головки топора" +msgstr[2] "металлических головок топора" +msgstr[3] "металлические головки топора" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -113660,6 +115715,14 @@ msgstr "" "кирпичей, но вы можете использовать её, чтобы обжигать любые предметы из " "глины." +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "Печь" +msgstr[1] "Печи" +msgstr[2] "Печей" +msgstr[3] "Печи" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -113865,7 +115928,6 @@ msgstr[2] "винтовых домкратов" msgstr[3] "винтовые домкраты" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "Портативный винтовой домкрат, используется для поднятия машин." @@ -114166,7 +116228,6 @@ msgstr[2] "отвёрток" msgstr[3] "отвёртки" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -114221,7 +116282,6 @@ msgstr[2] "паяльников" msgstr[3] "паяльники" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -114749,14 +116809,6 @@ msgstr "" "Это выключенный дрон-гончая. Если его включить, он двинется в направлении " "врага и будет подсвечивать его позицию мощным прожектором." -#: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" -msgstr[0] "паяльный набор" -msgstr[1] "паяльных набора" -msgstr[2] "паяльных наборов" -msgstr[3] "паяльные наборы" - #: lang/json/TOOL_from_json.py msgid "pseudo atomic butter churn" msgid_plural "pseudo atomic butter churns" @@ -114765,6 +116817,14 @@ msgstr[1] "псевдо атомные маслобойки" msgstr[2] "псевдо атомных маслобоек" msgstr[3] "псевдо атомные маслобойки" +#: lang/json/TOOL_from_json.py +msgid "precision solderers" +msgid_plural "precision solderers" +msgstr[0] "паяльный набор" +msgstr[1] "паяльных набора" +msgstr[2] "паяльных наборов" +msgstr[3] "паяльные наборы" + #: lang/json/TOOL_from_json.py msgid "atomic smartphone" msgid_plural "atomic smartphones" @@ -115025,6 +117085,27 @@ msgstr "" "можно разбирать простую бионику, но что-то более сложное все равно потребует" " более подходящих инструментов." +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "полный набор инструментов для работы с КБМ" +msgstr[1] "полных набора инструментов для работы с КБМ" +msgstr[2] "полных наборов инструментов для работы с КБМ" +msgstr[3] "полные наборы инструментов для работы с КБМ" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" +"Набор очень маленьких роботизированных инструментов и шифрованных цифровых " +"ключей, изначально созданный для разборки и проверки качества промышленно " +"произведённых КБМ. Усидчивый и хорошо подготовленный инженер с их помощью " +"сможет собрать новые бионические модули." + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -116156,6 +118237,83 @@ msgstr[1] "больших жезла конуса холода" msgstr[2] "больших жезлов конуса холода" msgstr[3] "большие жезлы конуса холода" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "малый жезл взлома" +msgstr[1] "малых жезла взлома" +msgstr[2] "малых жезлов взлома" +msgstr[3] "малые жезлы взлома" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" +"Тонкая деревянная палочка с отсеком для кристалла маны у основания, " +"призывающая заклинание при активации. Эта палочка создаёт заклинание Взлома." + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "меньший жезл взлома" +msgstr[1] "меньших жезла взлома" +msgstr[2] "меньших жезлов взлома" +msgstr[3] "меньшие жезлы взлома" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "большой жезл взлома" +msgstr[1] "больших жезла взлома" +msgstr[2] "больших жезлов взлома" +msgstr[3] "большие жезлы взлома" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "малый жезл улучшенного взлома" +msgstr[1] "малых жезла улучшенного взлома" +msgstr[2] "малых жезлов улучшенного взлома" +msgstr[3] "малые жезлы улучшенного взлома" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" +"Тонкая деревянная палочка с отсеком для кристалла маны у основания, " +"призывающая заклинание при активации. Эта палочка создаёт заклинание " +"Улучшенного Взлома." + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "меньший жезл улучшенного взлома" +msgstr[1] "меньших жезла улучшенного взлома" +msgstr[2] "меньших жезлов улучшенного взлома" +msgstr[3] "меньшие жезлы улучшенного взлома" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "большой жезл улучшенного взлома" +msgstr[1] "больших жезла улучшенного взлома" +msgstr[2] "больших жезлов улучшенного взлома" +msgstr[3] "большие жезлы улучшенного взлома" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -116384,6 +118542,83 @@ msgstr[1] "одноразовых больших посоха конуса хо msgstr[2] "одноразовых больших посохов конуса холода" msgstr[3] "одноразовые большие посохи конуса холода" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "одноразовый малый жезл взлома" +msgstr[1] "одноразовых малых жезла взлома" +msgstr[2] "одноразовых малых жезлов взлома" +msgstr[3] "одноразовые малые жезлы взлома" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" +"Тонкая деревянная палочка с отсеком для кристалла маны у основания, " +"создающая заклинание при активации. Эта палочка создает заклинание взлома." + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "одноразовый меньший жезл взлома" +msgstr[1] "одноразовых меньших жезла взлома" +msgstr[2] "одноразовых меньших жезлов взлома" +msgstr[3] "одноразовые меньшие жезлы взлома" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "одноразовый большой жезл взлома" +msgstr[1] "одноразовых больших жезла взлома" +msgstr[2] "одноразовых больших жезлов взлома" +msgstr[3] "одноразовые большие жезлы взлома" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "одноразовый малый жезл улучшенного взлома" +msgstr[1] "одноразовых малых жезла улучшенного взлома" +msgstr[2] "одноразовых малых жезлов улучшенного взлома" +msgstr[3] "одноразовые малые жезлы улучшенного взлома" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" +"Тонкая деревянная палочка с отсеком для кристалла маны у основания, " +"создающая заклинание при активации. Эта палочка создает заклинание " +"улучшенного взлома." + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "одноразовый меньший жезл улучшенного взлома" +msgstr[1] "одноразовых меньших жезла улучшенного взлома" +msgstr[2] "одноразовых меньших жезлов улучшенного взлома" +msgstr[3] "одноразовые меньшие жезлы улучшенного взлома" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "одноразовый большой жезл улучшенного взлома" +msgstr[1] "одноразовых больших жезла улучшенного взлома" +msgstr[2] "одноразовых больших жезлов улучшенного взлома" +msgstr[3] "одноразовые большие жезлы улучшенного взлома" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -116560,93 +118795,6 @@ msgstr "" " демонического паука для возможности переплавки слитков магических металлов " "в подходящие формы." -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "ТЕСТОВАЯ тряпка" -msgstr[1] "ТЕСТОВЫЕ тряпки" -msgstr[2] "ТЕСТОВЫХ тряпок" -msgstr[3] "ТЕСТОВЫЕ тряпки" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "ТЕСТОВЫЙ пожарный лом" -msgstr[1] "ТЕСТОВЫХ пожарных лома" -msgstr[2] "ТЕСТОВЫХ пожарных ломов" -msgstr[3] "ТЕСТОВЫЕ пожарные ломы" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "ТЕСТОВЫЙ пожарный топор" -msgstr[1] "ТЕСТОВЫХ пожарных топора" -msgstr[2] "ТЕСТОВЫХ пожарных топоров" -msgstr[3] "ТЕСТОВЫЕ пожарные топоры" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "ТЕСТОВАЯ отвертка" -msgstr[1] "ТЕСТОВЫЕ отвертки" -msgstr[2] "ТЕСТОВЫХ отверток" -msgstr[3] "ТЕСТОВЫЕ отвертки" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "ТЕСТОВАЯ ультразвуковая отвертка" -msgstr[1] "ТЕСТОВЫЕ ультразвуковые отвертки" -msgstr[2] "ТЕСТОВЫХ ультразвуковых отверток" -msgstr[3] "ТЕСТОВЫЕ ультразвуковые отвертки" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "Это ультразвуковая отвертка. Как обычная, только ультразвуковая." - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "ТЕСТОВЫЙ паяльник" -msgstr[1] "ТЕСТОВЫХ паяльника" -msgstr[2] "ТЕСТОВЫХ паяльников" -msgstr[3] "ТЕСТОВЫЕ паяльники" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "ТЕСТОВЫЙ винтовой домкрат" -msgstr[1] "ТЕСТОВЫХ винтовых домкрата" -msgstr[2] "ТЕСТОВЫХ винтовых домкратов" -msgstr[3] "ТЕСТОВЫЕ винтовые домкраты" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "тестовый смартфон" -msgstr[1] "тестовых смартфона" -msgstr[2] "тестовых смартфонов" -msgstr[3] "тестовые смартфоны" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "Работающий от УБП смартфон с камерой, фонариком и MP3 плеером." - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "тестовый коробок спичек" -msgstr[1] "тестовых коробка спичек" -msgstr[2] "тестовых коробков спичек" -msgstr[3] "тестовые коробки спичек" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "Тестовые спички - если нужно что-то поджечь во имя науки!" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -117068,7 +119216,7 @@ msgid "Pheidippides was a hack" msgstr "Фидиппид жульничал" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "Пробегите марафон… и еще немного." #: lang/json/achievement_from_json.py @@ -117099,14 +119247,649 @@ msgstr "И глубже нет пещеры" msgid "Freeman's favorite" msgstr "Любимая игрушка Фримена" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "Взять в руки монтировку" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "Непробиваемый" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "Надеть костюм ходячего танка" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "Что они скрывают?" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "Войти в святую святых лаборатории" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "Последний настоящий дом" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "Добраться до центра беженцев" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "Возвращение к корням" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "Вернуться к месту, где вы начали игру" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "Растопка" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "Если дерево падает в лесу и его никто не слышит, издаёт ли оно звук?" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "Лесоруб" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "Что такое лес для человека с топором?" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "Обезлесивание" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "Если срубить деревья, найдёте волка." + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "Копатель могил" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "Именно это нам и нужно: больше трупов." + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "Расхититель могил" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "Эй, а может он там перевернулся? Тебе нужно проверить" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "Похороны" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" +"Быть похороненным - это привилегия в мире, где миллионы никогда не будут." + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "Могильщик" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "Не оставляй никого гнить среди живых мертвецов." + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "Похоронный дом" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "Ты ведь не можешь похоронить весь мир, правда?" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "Киберпанк" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "Spiritus quidem promptus; caro vero infirma." + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "Часовой человек" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "" +"Презренною и грубою рукой. Я отомщу обеим вам жестоко. Мир содрогнется!.. Я " +"еще не знаю, Что сделаю, но сделаю такое, Что страшно станет." + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "Homo Evolutis" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "Мира людей больше нет. Да здравствует мир трансгуманизма" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "Сломан, но не повержен" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "Твоя медицинская страховка это покрывает?" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "Свободный торговец" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "Невероятные вещи за смешную цену!" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "Себя-Без-Ножа-Режу Достабль" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" +"Мой друг-эскимос, я так дёшево отдаю тебе это снег, будто себя без ножа " +"режу." + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "Красноречивый" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "Мы ведь друзья, не так ли?" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "Подвешенный язык" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "Ходят слухи, что вы уговорили зомби-халка оставить вас в покое." + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "ХакерМен" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "В этой операционной системе есть лазейка. Везде найдётся лазейка." + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "Все еще не совсем как Кевин" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "Это не читерство. Это отладка." + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "Доктор медицины" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "Есть здесь доктор?" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "Доктор Хаус" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "Это волчанка." + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "Инженер" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "Просто дайте мне разводной ключ." + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "МакГайвер" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "Вся конструкция держится на честном слове, соплях и изоленте." + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "Зверолов" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "Хорошая ловушка не различает бобров и зомби-бобров." + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "Сапёр" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "Достаточно ошибиться всего однажды." + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "Водитель-ас" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "Не существует слишком резких поворотов." + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "Стиг" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "Формула 1 - для пенсионеров" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "Пловец" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "Как рыба в воде." + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "Майкл Фелпс" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "Быстрее чем Челюсти." + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "Сделай-Сам" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "Возьми вот это, засунь вот в то, и готово." + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "На все руки мастер" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "Если клея будет достаточно, для меня нет ничего невозможного." + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "Мастер-шеф" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "Глазированная вырезка - как два пальца." + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "Адская Кухня" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "" +"Сегодня в меню: французский луковый суп, говядина по-бургундски, крем брюле." + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "Портной" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "Игла, нитка и мечта." + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "Фешн-дизайнер" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "Мода для женщин, мужчин и мутантов." + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "Выживальщик" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "Выживание - это моя игра." + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "Беар Гриллс" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "Так ты говоришь, можно выжить на собственной моче?" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "Закон Ома" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "Громовой Ом. Два вольта зашло, один вышел. Сопротивление бесполезно." + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "Никола Тесла" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "Нельзя просто взять и не лизнуть 9-вольтовую батарейку." + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "Меткий Глаз" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "Лучше чем Леголас" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "Робин Гуд" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "Вильгельм Тель? Не слышал о таком." + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "Орлиный Глаз" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "Только я и моя цель." + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "Дедшот" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "Не беги. Умрешь уставшим." + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "Стрелок" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "Калибр решает." + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "Ракетчик" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "Отправлю тебя на Луну. По кусочкам." + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "Маленький, но смертоносный" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "Калибр не важен, когда ствол направлен на тебя." + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "Грязный Гарри" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" +"Но это - Магнум 44 калибра, самый мощный пистолет в мире, и он отстрелит " +"тебе голову начисто, так что задай себе один вопрос: повезёт ли мне? " +"Повезёт, мразь?" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "Стрелок" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" +"Это моя винтовка. Таких винтовок много, но эта — моя. Моя винтовка — мой " +"лучший друг. Она — моя жизнь. Я должен научиться владеть ею так же, как я " +"владею своей жизнью." + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "Солдат" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" +"Без меня моя винтовка бесполезна. Без моей винтовки бесполезен я. Я должен " +"хранить её от губительной погоды и от повреждений так же, как я храню от " +"всякого вреда свои ноги и руки, свои глаза и своё сердце. Я должен хранить " +"свою винтовку чистой и готовой. Мы станем частью друг друга." + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "Два ствола - двойной кайф." + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "Когда хочется поразить цель девять раз за один выстрел." + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "Элмер Фадд" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "Как дела, док? Охотишься за кволиками?" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "Зажмурься и пали" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "Хоть одна да попадёт, это вопрос статистики." + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "Автомат делает ТРА-ТА-ТА!" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "Нам точно нужно больше патронов." + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "Yeet!" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "И не возвращайся." + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "Коби Брайант" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "Граната пошла!" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "Драчун" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "Бутылка в левой руке, ножка стула - в правой." + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "Уличный Боец" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "Главное - победа, а не стиль." + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "Отбивающий" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "С каждым ударом я всё ближе к хоум рану." + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "Каменный Век" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" +"Дубина была первым оружием человечества. Она же скорее всего станет " +"последним, так почему бы её и не освоить." + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "Путь Меча" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" +"Когда меч покинул ножны, страсти человеческие зайдут за любые границы." + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "Миямото Мусаси" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" +"Меч должен быть более чем оружием; он должен стать ответом на жизненные " +"вопросы." + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "Неуловимый" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "Самый сильный удар ничего не значит, если он не попал по цели." + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "Нео" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "Можешь увернуться от пули?" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "Хладная сталь" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "Пока вы веселились, я изучал клинок." + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "Джек Потрошитель" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "Что в воздухе я вижу пред собою? Кинжал! Схвачу его за рукоять." + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "Дорога на Шаолинь" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "Я ощущаю целую армию в моем кулаке." + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "Мистер Мияги" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "Быть самому оружием." + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "Взломщик" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "Монтировка? Какое варварство!" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "Замочный мастер" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "Если есть замок, найдется и ключ." + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "Периодическая таблица" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "Это что-то вроде кулинарии. Только не облизывай ложку." + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "Хайзенберг" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "Ты знаешь, кто я. Я повар. Скажи моё имя." + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "Начинающий волшебник" @@ -117570,6 +120353,11 @@ msgstr "взлом" msgid "canceling activity serialized with legacy code" msgstr "отмена активности, сериализованной легаси-кодом" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "упражнения" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "термоядерная батарея" @@ -117874,6 +120662,10 @@ msgstr "распыляемый химикат" msgid "compressed air" msgstr "сжатый воздух" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "патрон 12.3ln" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "картечные патроны" @@ -117926,10 +120718,6 @@ msgstr "ртуть" msgid "mana energy" msgstr "энергия маны" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "пьянящие пары" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "Адреналиновый инициатор" @@ -119678,23 +122466,6 @@ msgstr "" msgid "Wind Turbines" msgstr "Ветровые турбины" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "Точные паяльники" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" -"Ваши руки оснащены точными паяльниками, кусачками и катушками проводов. Они " -"слишком миниатюрные, чтобы пригодиться при изготовлении предметов, но в " -"отсутствие необходимых механизмов и инструментов они необходимы для создания" -" бионических модулей." - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "Складной гранатомёт" @@ -119755,6 +122526,23 @@ msgstr "" "который нужно проверять примерно раз в 30 дней. Вам нужно поскорее от этого " "избавиться." +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "Точные паяльники" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"Ваши руки оснащены точными паяльниками, кусачками и катушками проводов. Они " +"слишком миниатюрные, чтобы пригодиться при изготовлении предметов, но в " +"отсутствие необходимых механизмов и инструментов они необходимы для создания" +" бионических модулей." + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -120107,8 +122895,64 @@ msgstr "Не убивать людей" msgid "Merciful" msgstr "Милосердие" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "Путь эльфа" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "Не срубать деревья" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "Homo Sapiens" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "Не устанавливать бионические импланты" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "Не устанавливать неисправные бионические импланты" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "Без мутаций" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "На рентгене чисто" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "Чистая кровь" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "Структурная целостность" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "Не ломать кости" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "Учитель, оставьте детей в покое" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "Не получать уровней навыков" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "Самовольная неграмотность" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "Не читай книг" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "Все" @@ -120740,10 +123584,6 @@ msgstr "Покрасить стену в жёлтый" msgid "Take Paint Off Wall" msgstr "Соскрести краску со стены" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "Убрать ковёр" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "Постелить красный ковёр" @@ -120784,6 +123624,38 @@ msgstr "Построить деревянную лестницу" msgid "Mine Upstair" msgstr "Прорубить лестницу вверх" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "Построить нижнюю часть бетонной рампы" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" +"Постройка бетонной, рампы, ведущей на верхний уровень, а также примыкающей " +"на верхнем уровне рампы, ведущей вниз на этот уровень. Верхний конец рампы " +"должен располагаться в соседней клетке, чтобы можно было двигаться верх и " +"вниз между уровнями." + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "Построить верхнюю часть бетонной рампы" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" +"Постройка бетонной, рампы, ведущей на верхний уровень, а также примыкающей " +"на верхнем уровне рампы, ведущей вниз на этот уровень. Нужно строить в " +"соседней клетке с нижней частью рампы, чтобы можно было двигаться верх и " +"вниз между уровнями." + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "Начать постройку транспорта" @@ -122789,7 +125661,7 @@ msgstr "Вы едете верхом." msgid "You mount your steed." msgstr "Вы забираетесь на скакуна." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "В огне" @@ -123991,7 +126863,7 @@ msgstr "Вы сделали пару затяжек." msgid "You smoked too much." msgstr "Вы курили слишком много." -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "Кайф" @@ -125329,74 +128201,6 @@ msgstr "Вы покрыты жвачкой!" msgid "The gum webs constrict your movement." msgstr "Паутина из жвачки сковывает ваши движения." -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "Отлажен" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" -"Вы были отлажены!\n" -"Теперь все работает как положено." - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" -"Нырнув прямо в исходный код, вы нашли резиновую уточки и заговорили ее до " -"смерти." - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "Оптимизированный" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "Принцип минимакс" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "Все преимущества и никаких недостатков!" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" -"Вы чувствуете, как ваши навыки растут во все стороны, словно в кривом " -"зеркале." - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "Оооо" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "Чо?" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "Вау!" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" -"Все слишком насыщено, чувак!\n" -"Вы дезориентированы и чувствуете себя потерянно." - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "!!насыщенность насыщается!!" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "Ваши союзники" @@ -125610,6 +128414,19 @@ msgstr "" "Ватели - эксцентричная семья из Новой Англии. Хотя эксцентричная - это мягко" " сказано." +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "Религиозное сообщество Болотников и сеть отелей и казино" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "" +"Процветающая, но скрытная группа религиозных поклонников и индустрии " +"развлечений с любовью к динозаврам. Они рады всем неизменённым людям." + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "Древние" @@ -126172,6 +128989,18 @@ msgstr "огонь" msgid "raging fire" msgstr "бушующий огонь" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "взвесь огнетушителя" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "облако огнетушителя" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "густое облако огнетушителя" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "старый мусор" @@ -127300,8 +130129,7 @@ msgstr "" "горит." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "«хрясь!»" @@ -127492,7 +130320,7 @@ msgstr "" "удобство или тепло." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "треск!" @@ -128267,14 +131095,12 @@ msgstr "тренажёр" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." msgstr "" "Комплект оборудования для тяжелой атлетики и силовых тренировок с парой " -"тяжелых грузов, прикрепленных к противоположным концам прочной трубы. Веса " -"огромны, и использование их без страховки - хороший способ серьезно поранить" -" себя." +"тяжелых грузов, прикрепленных к противоположным концам прочной трубы. Вы " +"можете подобрать необходимый вес, вручную выбрав веса." #: lang/json/furniture_from_json.py msgid "ball machine" @@ -128385,6 +131211,21 @@ msgstr "" "гребли. Без электричества его не выйдет использовать, но в нем могут быть " "полезные части, которые можно снять." +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "механический эргометр" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "" +"Тренажер с ручками и досками, имитирующими лодку с веслами. Это старая " +"модель с механической настройкой сопротивления, но она работает без " +"электричества." + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "беговая дорожка" @@ -128400,6 +131241,21 @@ msgstr "" " электричества ленту сдвинуть практически невозможно. В любом случае, вам и " "так скорее всего хватает физических нагрузок и бега." +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "гравитационная беговая дорожка" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" +"Работающий на силе тяготения конвейерный пояс с механическим управлением для" +" бега на месте. Пояс наклонён под небольшим настраиваемым углом и сдвигается" +" назад под вашим весом. " + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "большая боксёрская груша" @@ -129882,10 +132738,6 @@ msgstr "" msgid "filled arc furnace" msgstr "заполненная дуговая печь" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "коптильня" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -130274,6 +133126,95 @@ msgstr "" "Этот холодильник ещё больше переделан и обеспечивает намного более низкую " "температуру. Сперва его нужно снять с основания." +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "капсула сна" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" +"Капсула сна с климат-контролем. Легкий способ экономии энергии в плотной " +"городской застройке." + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "криокапсула" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" +"Капсула криосна. Обычно такие использовали для людей, ждущих пересадки " +"донорских органов или преступниками, пережидающими повышенный интерес со " +"стороны закона." + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "Биолаборатория CRISPR" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" +"Угловатое устройство с манипуляторами, капельницами и пипетками. До " +"Катаклизма использовалось для экспериментов в генной инженерии." + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "3D принтер" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" +"Устройство для быстрого создания прототипов продуктов и просто развлечения." + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "система установки нейронных сетей" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" +"Устройство, выглядящее как нечто среднее между каким-то кошмарным " +"стоматологическим оборудованием и инструментом для установки розеток, " +"установленное на предметном стекле, которое позволяет ему точно выполнять " +"свои операции. Полезно для задач, которые требуют размещения деликатных " +"предметов в труднодоступных местах." + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "мономолекулярная пила" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" +"Нить, длиной примерно как в сырорезке, натянута в этом инструменте и " +"позволяет делает разрезы атомарной точности практически под любым углом. " +"Даже при отключенном питании она выдаёт визуальные искажения на несколько " +"сантиметров вокруг нити, чтобы вы случайно не остались без конечности. Это " +"устройство невозможно разобрать без уничтожения нити." + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -130652,7 +133593,8 @@ msgstr "Оружие отладки, стреляет кислотными сг msgid "auto" msgstr "авто" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "винтовка" @@ -130683,8 +133625,7 @@ msgstr "" " — под патроны для дробовика. Оно сделано из труб и частей двухствольного " "дробовика." -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "дробовик" @@ -130895,7 +133836,8 @@ msgstr "" "устройство, чуть более сложное, чем монтажная лента и электроника, он " "питается от стандартного УБП." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "пистолеты" @@ -130977,7 +133919,7 @@ msgstr "" "Пневматическая винтовка с накачкой, собранная из подручных материалов. Она " "очень тихая и смертоносная." -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "полуавтомат" @@ -131591,12 +134533,12 @@ msgstr "" "рекламируемая как оружие самозащиты." #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" -msgstr[0] "MAS 223" -msgstr[1] "MAS 223" -msgstr[2] "MAS 223" -msgstr[3] "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" +msgstr[0] "MAS .223" +msgstr[1] "MAS .223" +msgstr[2] "MAS .223" +msgstr[3] "MAS .223" #: lang/json/gun_from_json.py msgid "" @@ -134793,17 +137735,17 @@ msgstr "" "стальным." #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" -msgstr[0] "CZ-75" -msgstr[1] "CZ-75" -msgstr[2] "CZ-75" -msgstr[3] "CZ-75" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" +msgstr[0] "CZ-75 B" +msgstr[1] "CZ-75 B" +msgstr[2] "CZ-75 B" +msgstr[3] "CZ-75 B" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " @@ -134959,6 +137901,57 @@ msgstr "" "под 12-й калибр. Исторически использовалось охотниками-эгоманьяками в " "Африке, теперь же используется их потомками-эгоманьяками в Новой Англии." +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "боевая винтовка PA md. 68" +msgstr[1] "боевые винтовки PA md. 68" +msgstr[2] "боевых винтовок PA md. 68" +msgstr[3] "боевые винтовки PA md. 68" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" +"Самое популярное оружие под патрон 12.3ln - конечно же PA md. 71. Её " +"предшественник, md.68, многими считалась провалом: хотя она была мощной и " +"надёжной, она была слишком тяжёлой, чтобы стать хорошим пехотным оружием, и " +"при этом она была недостаточно мощной, чтобы использоваться как оружие " +"поддержки. Их было произведено достаточно, чтобы во времена зомби-" +"апокалипсиса вновь обрести популярность в качестве оружия с широко " +"доступными боеприпасами. Она идеально подходила задачам Экзоди, так как их " +"куда меньше беспокоили неудобства её использования." + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "винтовка PA md. 71 для охоты на зомби" +msgstr[1] "винтовки PA md. 71 для охоты на зомби" +msgstr[2] "винтовок PA md. 71 для охоты на зомби" +msgstr[3] "винтовки PA md. 71 для охоты на зомби" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" +"Крайне популярная румынская штурмовая винтовка, прославившаяся в третьей " +"Карпатской войне, была слегка переработана Экзоди, чтобы использоваться как " +"снайперское оружие. Она хорошо подходит для точной стрельбы по приоритетным " +"целям. Доработанный дизайн позволяет чрезвычайно быстро произвести 5 " +"выстрелов с целью нанесения серьезного урона цели и предотвращения ее " +"оживления." + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -135678,6 +138671,22 @@ msgstr "" "ножом. Сейчас уже не нужно расчищать окопы, но заражённый зомби городок тоже" " подойдет." +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "самодельный дробовик выживальщика" +msgstr[1] "самодельных дробовика выживальщика" +msgstr[2] "самодельных дробовиков выживальщика" +msgstr[3] "самодельные дробовики выживальщика" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" +"Грубый дробовик - две толстые стальные трубы и заглушка с гвоздём. Из-за " +"отсутствия прицела эффективно только при стрельбе практически в упор." + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -136608,6 +139617,44 @@ msgstr "" msgid "trilaser" msgstr "трехлучевой лазер" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "бионическая черепная пушка" +msgstr[1] "бионические черепные пушки" +msgstr[2] "бионических черепных пушек" +msgstr[3] "бионические черепные пушки" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" +"Бионическая однозарядная подкожная пушка калибра .40, встроенная в череп." + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "модифицированная Marlin 39A" +msgstr[1] "модифицированные Marlin 39A" +msgstr[2] "модифицированных Marlin 39A" +msgstr[3] "модифицированные Marlin 39A" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "Винтовка Marlin 39A, модифицированная для установки в турель." + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "модифицированный СКС" +msgstr[1] "модифицированных СКС" +msgstr[2] "модифицированных СКС" +msgstr[3] "модифицированные СКС" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" +"Карабин Симонова, модифицированный для использования в транспортной турели." + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -137864,26 +140911,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "Оружие отладки, стреляет шипастыми дротиками." -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "ТЕСТОВЫЙ блочный лук" -msgstr[1] "ТЕСТОВЫХ блочных лука" -msgstr[2] "ТЕСТОВЫХ блочных луков" -msgstr[3] "ТЕСТОВЫЕ блочные луки" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "Тестовый Глок" -msgstr[1] "Тестовых Глока" -msgstr[2] "Тестовых Глоков" -msgstr[3] "Тестовые Глоки" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "Пистолет для тестирования на базе Глока 9мм." - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -140401,18 +143428,6 @@ msgstr "" "верхнюю часть оружия, заменяя механический прицел. Увеличивает точность и " "вес." -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "тестовый глушитель" -msgstr[1] "тестовых глушителя" -msgstr[2] "тестовых глушителей" -msgstr[3] "тестовые глушители" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "Оружейный глушитель для отладки." - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "Вы разделываете рыбу и снимаете с неё филе." @@ -140429,6 +143444,14 @@ msgstr "" "Вы копаетесь во внутренностях того, что осталось от этого неудавшегося " "эксперимента, пытаясь найти любую уцелевшую бионику." +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" +"Вы обыскиваете то что осталось от этого монстра из плоти и металла в поисках" +" уцелевшего оборудования" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -140446,8 +143469,40 @@ msgstr "" "найти что-нибудь стоящее." #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "Вы старательно разделываете огромное насекомое." +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "Вы старательно разделываете огромное насекомое. " + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" +"То, что казалось волосками насекомого на хитине этого создания, оказалось " +"больше похоже на перышки, когда вы их отделили. Внутри оказались грозди " +"пузырчатой ткани, которая словно парит. Это не похоже ни на что из того, что" +" вам известно о настоящих пчёлах." + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" +"Под хитином этого существа оказывается волосатая, похожая на кожу мембрана, " +"покрытая кровеносными сосудами. Внутри оказались грозди пузырчатой ткани, " +"которая словно парит. Это не похоже ни на что из того, что вам известно о " +"настоящих осах." #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -143011,10 +146066,6 @@ msgstr "Написать" msgid "Teleport yourself" msgstr "Телепортироваться" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "Потушить огонь" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "Вытереться" @@ -143470,6 +146521,15 @@ msgstr "" msgid "This item can be used to communicate with radio waves." msgstr "Этот предмет можно использовать для общения посредством радиоволн." +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "" +"Этот предмет можно использовать для взлома замков без каких-либо усилий." + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -144373,6 +147433,14 @@ msgstr "Прервать генерацию персонажа" msgid "Toggle sorting order" msgstr "Переключить режим сортировки" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "Случайная профессия" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "Случайный сценарий" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "Прокрутить описание вверх" @@ -144773,6 +147841,10 @@ msgstr "Разобрать предметы" msgid "Sleep" msgstr "Спать" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "Заниматься упражнениями" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "Управлять транспортом" @@ -145246,12 +148318,12 @@ msgstr "Загрузить цветовой шаблон" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "Да" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "Нет" @@ -145822,6 +148894,15 @@ msgstr "Ловушка для зомби" msgid "Zombie trap." msgstr "Ловушка для зомби." +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "Камыши" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "Растительность у воды." + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -147153,6 +150234,11 @@ msgid "" msgstr "" "Похоронный сервис семьи Ватели. На службе Новой Англии уже триста лет." +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "Управление операционной лаборатории динозавров" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "Без стиля" @@ -147454,6 +150540,25 @@ msgstr "" "Активирует техники «Круговой удар» и «Размашистый удар».\n" "Длится 3 хода." +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "Ритм капоэйры" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" +"Это не промах, а часть танца, а самое лучшее - он только начался!\n" +"\n" +"+ 15% дробящего урона.\n" +"Длится 2 хода. До 3 стеков." + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "Стиль журавля" @@ -147644,6 +150749,27 @@ msgstr "" "\n" "+2 Точность." +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "Комбинация эскримы" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +"Вы можете произвести сильную атаку после критического попадания, если представится возможность.\n" +"\n" +"+15% ко всему урону.\n" +"Включает технику «Комбинированный удар».\n" +"Длится 3 хода. До 3 стеков." + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "Фехтование" @@ -147688,6 +150814,42 @@ msgstr "" "\n" "Блокируемый урон снижается на 50% Ловкости." +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "Парирование" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" +"Ваш следующий удар попадёт куда точнее после парирования.\n" +"\n" +"+1 к Точности.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "Ремиз" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"Ваш финт идеально подходит для последующей разрушительной атаки!\n" +"\n" +"+1 к Точности.\n" +"Включает технику «Составной атаки».\n" +"Длится 1 ход." + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -147746,6 +150908,42 @@ msgstr "" "-2 попытки блока, +1 навык Уклонения, блокируемый урон увеличивается на 50% Силы.\n" "Длится 1 ход." +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "Переход от обороны" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"Каждый удачный блок открывает брешь в обороне противника.\n" +"\n" +"+1 к Точности.\n" +"Длится 1 ход. До 3 стеков." + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "Тактическое фехтование" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" +"Они купились на твой финт!\n" +"\n" +"Включает технику «Подцепить и дёрнуть».\n" +"Длится 1 ход." + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "Дзюдо" @@ -148037,6 +151235,39 @@ msgstr "" "\n" "+1 попытка Уклонения, блокируемый урон снижается на 50% Силы." +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "Отражение" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"Вы отразили удар врага, и теперь он открыт для контратаки!\n" +"\n" +"Включает техники «Широкий удар» и «Добивающий удар».\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "Убийство" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"Ваша удачная атака даёт вам шанс закончить бой прямо сейчас!\n" +"Включает технику «Жестокий удар».\n" +"Длится 1 ход." + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "Тайский бокс" @@ -148082,6 +151313,25 @@ msgstr "" "\n" "Блокируемый урон снижается на 50% Силы." +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "Решимость" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" +"Попадание по вам вас не замедляет. Вы переживёте вашего противника в этой схватке.\n" +"\n" +"Дробящий урон увеличен на 25% СИЛ, блокированный рон уменьшается на 50% СИЛ.\n" +"Длится 5 ходов." + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "Ниндзюцу" @@ -148161,6 +151411,42 @@ msgstr "" "+1.0 к навыку Уклонения, точность возрастает на 20% Ловкости.\n" "Длится 1 ход." +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "Потеря неожиданности" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" +"Ваши намерения раскрылись! Вам понадобится несколько секунд для новой скрытой атаки.\n" +"\n" +"-50% ко всему урону.\n" +"Длится 3 хода." + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "План отступления" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" +"Ваша цель пала. Время покинуть бой и запланировать следующее нападение.\n" +"\n" +"+2 попытки уклонения, +10 к скорости.\n" +"Длится 3 хода." + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "Нитэн Ити-рю" @@ -148255,6 +151541,51 @@ msgstr "" "Активирует «Рассчитанный удар».\n" "Длится 1 ход." +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "Падающий лист" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"Правда как клинок.\n" +"Хотя время лечит боль.\n" +"Терпи и учись.\n" +"\n" +"-1.0 к Уклонению, -1 к дробящему урону, -1 к режущему урону.\n" +"Длится 1 ход. До 5 стеков." + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "Неподвижность" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" +"Как око бури,\n" +"Неуловим сей момент,\n" +"И вот он исчез.\n" +"\n" +"+2 к Точности, навык Уклонения увеличивается на 50% ВОС.\n" +"Длится 2 хода." + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "Панкратион" @@ -148434,6 +151765,25 @@ msgstr "" "\n" "Восприятие повышает точность вместо Ловкости. Точность повышается на 25% Восприятия, но снижается на 25% Ловкости." +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "Бросок змеи" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"Каждая змея ждёт идеального момента для нападения. Цельтесь, пока противник мешкает, и бейте его без жалости в слабое место!\n" +"\n" +"+1 к Точности, пробивание брони в 50% ВОС.\n" +"Длится 1 ход. До 3 стеков." + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "Содзюцу" @@ -148622,6 +151972,26 @@ msgstr "" "Точность увеличена на 20% от восприятия, дробящее пробивание брони равно 50% от восприятия.\n" "Длится 2 хода." +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "Скрещенные руки" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" +"Потратив мгновение, чтобы собраться, вы можете использовать всё тело для атаки и защиты.\n" +"\n" +"+1.0 к Уклонению, блокированный урон снижается на 50% ВОС.\n" +"Включает техники «Удар ладонью» и «Двойной удар ладонью».\n" +"Длится 3 хода." + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "Стиль тигра" @@ -148686,6 +152056,25 @@ msgstr "" "\n" "Точность увеличивается на 25% от силы, но уменьшается на 25% от ловкости." +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "Ярость Тигра" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" +"Каждая промашка противника даёт вам преимущество. Ваш следующий удар обойдёт защиту противника.\n" +"\n" +"Пробивание брони усилено на 25% СИЛ.\n" +"Длится 1 ход. До 2 стеков." + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "Винь-Чунь" @@ -148751,6 +152140,24 @@ msgstr "" "\n" " Навык уклонения увеличен на 15% от восприятия. Урон уменьшен на 50% от восприятия." +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "Биу Цзы" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" +"Идеально применив форму Удара Пальцами, вы можете бить по слабым местам противника, отгоняя его и следуя!\n" +"\n" +"Точность увеличена на 20% ВОС. Включает техники « Апперкот (отбрасывающий)» и «Левый хук (отбрасывающий)».\n" +"Длится 2 хода." + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "Цзуй-цюань" @@ -148887,6 +152294,36 @@ msgstr "" "+Сила дробящая броня, +Ловкость кислотная броня, +Интеллект электрическая " "броня, +Восприятие огненная броня." +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "Злость" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "Щас я до тебя доберусь… +2 дробящего урона на 2 хода. До 5 стеков." + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "Удар молнии" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" +"Молния бьёт дважды в одно место. +ВОС электрического урона на 3 хода. До 2 " +"стеков." + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "Вы жжёте! +5 урона огнём на 5 ходов." + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "Бионические приёмы борьбы" @@ -148935,6 +152372,28 @@ msgstr "" "\n" "+2 попытки Блока, +1 Точность." +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "Оптимизация" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 точность, +2 ко всему урону.\n" +"Длится 3 хода. До 3 стеков." + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "Стиль многоножки" @@ -148979,6 +152438,24 @@ msgstr "" "-4 стоимость движения.\n" "Длится 3 хода. Складывается 4 раза." +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "Яд Многоножки" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" +"Ваш яд поражает противника в самый удачный момент.\n" +"\n" +"+2 дробящего урона.\n" +"Длится 2 хода." + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "Стиль ящерицы" @@ -149127,6 +152604,24 @@ msgstr "" "Активирует технику «Удар клешнями».\n" "Складывается 2 раза. Длится 2 хода." +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "Устрашение Скорпиона" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" +"Мало что страшнее скорпиона в гневе. Ваши атаки держат врагов в ужасе.\n" +"\n" +"+1 попытка уклонения.\n" +"Длится 1 ход." + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "Стиль жабы" @@ -149190,6 +152685,42 @@ msgstr "" "-1 к защите от дробящего, режущего и колющего урона.\n" "Длится 6 ходов. До 6 стеков." +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "Медитация Жабы" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" +"На мгновение сконцентрировавшись, вы усиливаете стойкость вашей кожи.\n" +"\n" +"+3 к защите от дробящего, режущего и колющего урона.\n" +"Длится 2 хода." + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "Яд Жабы" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" +"Ваш яд - ещё одна демонстрация стойкости вашего тела.\n" +"\n" +"+2 дробящего урона.\n" +"Длится 5 ходов." + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "Стиль гадюки" @@ -149596,6 +153127,42 @@ msgstr "" "+1 попытка уклонения\n" "Длится 1 ход. До 2 стеков" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "Быстрота ртути" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" +"В мгновение ока вы выполняете движение. Ваша скорость, рефлексы и бескомпромиссная уверенность вместе позволяют вам совершить быстрый, наглый манёвр, который застанет противника врасплох.\n" +"\n" +"+50 к скорости.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "Разум выше тела" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" +"Ваша подготовка и ментальная стойкость позволяют вам использовать фокус, чтобы превзойти физическую угрозу.\n" +"\n" +"+1 к Точности.\n" +"Длится 1 ход. До 2 стеков." + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "Хилланский бой на мечах" @@ -149710,6 +153277,56 @@ msgstr "" "-25% цена хода.\n" "Длится 1 ход." +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "Усиленный удар" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"Потратив момент на подготовку, вы наносите кручёный, мощный удар!\n" +"\n" +"+20% урона, включает технику «Атака вращением».\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "Железное сердце" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" +"Цель дисциплины Железного Сердца - абсолютное владение мечом. Благодаря " +"бесконечной практике и обучению адепт Железного Сердца достигает " +"сверхчеловеческого мастерства во владении своим оружием. Маневры Железного " +"Сердца - это демонстрация сверхъестественных боевых навыков - плетение " +"стальных узоров, которые кружат голову, путают и в конечном итоге убивают " +"без всякого милосердия." + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "Вы отталкиваете страж и поднимаете голову." + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "%s встаёт в уверенную и бесстрашную стойку." + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "Panzer Kunst" @@ -149771,6 +153388,486 @@ msgstr "" "+5 дробящего пробития брони.\n" "Длится 2 хода." +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "Поккен" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" +"Поккен, или «карманный кулак» - странное искусство рукопашного боя, " +"основанное на знаменитой серии игр про покемонов. Каким-то образом группа " +"фанатов скомбинировала движения различных покемонов с техниками других " +"боевых искусств, например бокса и карате. На удивление, это оказалось " +"эффективным. Кто-то даже мог бы сказать, что это СУПЕР-ЭФФЕКТИВНО!" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "Вы готовитесь к бою." + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "%s готовится вызвать кого-то на бой." + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "Выносливость" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" +"Усиливает вашу защиту после попадания по вам.\n" +"\n" +"Добавляет броню. от режущего, дробящего, колющего урона в 50% СИЛ.\n" +"Длится 3 хода." + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "Меткость" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" +"Усиливает ваше техники после критического попадания.\n" +"\n" +"+50% урона.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "Дерзость" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" +"Усиливает ваш урон после поражения противника.\n" +"\n" +"+50% урона.\n" +"Длится 3 хода." + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "Заходящее Солнце" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" +"Дисциплина Заходящего Солнца учит своих посвященных направлять силы своих " +"противников против них. Быстро изменяя позицию и тщательно нацеливая атаки, " +"воин Заходящего Солнца может послать атакующего в непредсказуемом " +"направлении." + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "Вы сдвигаете свой центр массы и готовитесь к обороне." + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "%s сдвигается и встаёт в новую стойку." + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "Путающая оборона" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"Вы намеренно сдвигаетесь, становясь в неудобную позицию, чтобы запутать противника.\n" +"\n" +"Навык Уклонения увеличивается на 20% ИНТ. Включает техники «Могучий бросок» и «Бросок Баллиста».\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "Притворное открытие" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" +"Намеренно ослабив оборону, вы заставляете противника растянуться, что даёт вам преимущество в следующей атаке!\n" +"\n" +"+20% Скорости.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "Шии-Чо" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" +"Шии-Чо, или Путь Сарлакка - первая форма боя на световых мечах, " +"разработанная джедаями при переходе от металлического оружия к световым " +"мечам. Шии-Чо считается тренировочной формой, которую должны освоить все " +"джедаи для понимания основ боя. Шии-Чо отлично подходит для боя против групп" +" противников, но ей не хватает наступательной мощи других форм." + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "" +"Вы отставляете одну нону и держите оружие вертикально вашей рабочей рукой." + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "%s отставляет одну ногу назад и поднимает оружие вертикально." + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" +"Вы решительный воин. Ваш внутренний покой помогает вам наносить удары и защищать себя.\n" +"\n" +"Урон при блокировании снижается на 100% СИЛ. +1 Точность." + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "Подготовка падавана" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"Ваши тренировки в Шии-Чо подготовили вас к бою с несколькими противниками.\n" +"\n" +"+1 попытка блока, +1 эффективность блока." + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "Подготовка рыцаря-джедая" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"Рост ваших навыков в Шии-Чо улучшил вашу способность сражаться с несколькими противниками.\n" +"\n" +"+1 попытка блока, +1 эффективность блока." + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "Подготовка магистра джедаев" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"Ваше умение сражаться сразу с несколькими противниками, как мастера Шии-Чо, практически невозможно превзойти.\n" +"\n" +"+1 попытка блока, +1 эффективность блока." + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "Каменный Дракон" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" +"Дисциплина Каменного Дракона фокусируется на силе, мощи и стойкости. Учение " +"даёт способность расщепить сталь одним мощным, концентрированным ударом. " +"Оборонительные способности Каменного Дракона черпаются из стойкости камня " +"перед любыми атаками." + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "Вы упираетесь пятками в землю и выравниваете своё положение." + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "%s зарывается пятками в поверхность." + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "Каменные кости" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"Вы фокусируете энергию на усилении защиты, вытягивая энергию попаданий вашего оружия по врагу, чтобы усилить себя против контратак.\n" +"\n" +"+1 брони против колющего, режущего и дробящего урона.\n" +"Длится 1 ход. До 5 стеков." + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "Стойка Каменные Ноги" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" +"Вы приседаете и ставите ноги вдоль поверхности, вытягивая стойкость земли в свое тело. Слишком большое количество передвижений выведет вас из стойки.\n" +"\n" +"+10% урона, +2 дробящего урона и брони от колющего урона." + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "Трещина в камне" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" +"Слишком много передвижений - эффект стойки каменных ног удалён. Не двигайтесь, чтобы не расколоть свою стойкость окончательно!\n" +"\n" +"Включает усиление «Расколотый камень».\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "Расколотый камень" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" +"Вы не смогли удержать стойку каменных ног, и теперь должны замереть на время, чтобы вернуть себе её преимущества.\n" +"\n" +"-10% урона, -2 колющей, режущей и дробящей брони.\n" +"Длится 4 хода." + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "Железные Кости" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" +"Когда вы совершаете удачную атаку, вы входите в медитативное состояние, в котором вам практически невозможно нанести урон.\n" +"\n" +"+5 дробящей, режущей и колющей брони.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "Коготь Тигра" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" +"Дисциплина Тигриного Когтя использует погружение в животную ярость для своих" +" учеников. В битве эти бойцы ревут подобно диким животным, атакуя с " +"варварской яростью и используя ошеломляющие, жестокие атаки, чтобы победить " +"своих врагов." + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "Вы издаёте рычание и готовитесь к битве." + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "%s опускается на конечности, словно дикое животное." + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "Улучшенные критические" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" +"Всегда бейте в полную силу. Не сдерживайте себя, если не хотите умереть.\n" +"\n" +"+5% к шансу критического удара." + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "Бросок тигра" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" +"С рёвом дикого зверя вы влетаете в самый центр схватки. Бейте первым, бейте сильно.\n" +"\n" +"+2 к Точности, +10% урона.\n" +"Длится 1 ход." + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "Загнанный в угол Хищник" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" +"Загнанный в угол зверь пугающ и опасен\n" +"\n" +"-20% стоимости движения\n" +"Длится 1 ход" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "Кровь в Воде" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" +"Запах крови приводит вас в ярость. Вы хотите еще. СЕЙЧАС ЖЕ!\n" +"\n" +"+1 Меткость, +15% урона\n" +"Длится 1 ход. Стакается 2 раза" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "Избиение слабых" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" +"Вы прорезаете путь сквозь слабых противников словно могущий хищник, пробивающийся через стадо добычи.\n" +"\n" +"+30 к скорости.\n" +"Длится 3 хода. До 2 стеков." + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "алкоголь" @@ -150254,8 +154351,8 @@ msgid "Emulsified Hydrogel" msgstr "эмульгированный гидрогель" #: lang/json/material_from_json.py -msgid "pupled" -msgstr "стёртый в кашу" +msgid "pulped" +msgstr "стёртый в кашу " #: lang/json/material_from_json.py msgid "Arcane Skin" @@ -150285,7 +154382,7 @@ msgstr "Собрать кости для Бриджит ЛаКруа. 8 долж msgid "There is always work to be done, song to be woven." msgstr "Ещё многое нужно сделать, ещё много песен сплести." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -150296,16 +154393,16 @@ msgstr "" "слышать и слушать песню. Ступай разделай животное и почувствуй силу меж " "кончиков пальцев. Затем принеси мне кости, и я вырежу из них для тебя." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "Превосходно. Теперь ступай же." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "Я понимаю твои сомнения. Возвращайся, когда увидишь путь." -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -151733,9 +155830,9 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "" -"Тогда увидимся… Или не увидимся, и тогда я пойму, что принял правильное " +"Тогда увидимся… Или не увидимся, и тогда я пойму, что это было правильное " "решение." #: lang/json/mission_def_from_json.py @@ -151745,8 +155842,8 @@ msgstr "" "Не умирай. Если ты спрашиваешь у меня совета — это плохой знак для тебя." #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." -msgstr "Ну, ты же ещё дёргаешься… Пока что." +msgid "Well, you're not dead… yet." +msgstr "Ну, вы же ещё не умерли… Пока." #: lang/json/mission_def_from_json.py msgid "" @@ -152225,7 +156322,7 @@ msgstr "" " порядке?" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "Спасибо." @@ -152554,10 +156651,10 @@ msgstr "Мне нужна помощь в поисках кое-чего." #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" -"Нам нужны трёхлитровые банки, чтобы консервировать еду. Принесёшь 20 больших" +"Нам нужны трёхлитровые банки, чтобы консервировать еду. Принесёшь 10 больших" " трёхлитровых банок? Я в обмен дам тебе кое-какие соленья." #: lang/json/mission_def_from_json.py @@ -154712,6 +158809,93 @@ msgstr "Ага, конечно." msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "Мда, мне придётся лезть за золотом самому, спасибо ни за что." +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "Активное шумоподавление" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" +"Проверьте радиобашню Хаба 01, найдите источник помех и решите проблему." + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" +"Несколько дней назад мне удалось установить радиопередатчик на радиовышку " +"неподалёку, но он перестал работать. Если сможете прикрыть меня, пока я " +"разбираюсь с проблемой, с меня причитается." + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "Ладно, в путь. Я сразу за вами." + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "Что ж, спасибо за предложение, наверное." + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" +"Мы наверняка разберёмся с этим на месте. В любом случае, сначала стрелять, " +"потом задавать вопросы." + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "Думаете, мы убили виновника?" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "Очень похоже на то. Вернёмся в Хаб." + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "Ага, спасибо за бездействие." + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "Вернуться в Хаб 01" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "Вернуться в Хаб 01." + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "Давайте вернёмся в Хаб" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "Что ж…" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "У вас же есть карта под рукой? У меня есть, и вам её стоит иметь." + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "Уже добрались?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "Спасибо, что охраняли меня. Как и было уговорено, за мной должок." + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "Заблудились что ли?" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "Не могу поверить, что мы потерялись…" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Изготовить 2 дистиллятора" @@ -156241,6 +160425,60 @@ msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" "Я не могу стать доктором Франкенштейном, если ты не принесешь мне эти части." +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "Собрать мясо для Бо Бароникса. 8 кусков должно хватить." + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "Едоки голодны. Им нужно мясо." + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" +"Если вы желаете накормить едоков, ваш труд будет вознаграждён. Ступайте, " +"разделайте чистое животное. Никакого ложного мяса, оно должно быть " +"правильным. Затем принесите мясо мне, и я отправлюсь к едокам." + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "Превосходно. Едоки должны быть накормлены." + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "Понимаю. Великие едоки в любом случае не останутся без еды." + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" +"Некоторых из животных коснулись притворщики совсем недавно, более крупные и " +"опасные, что отравило их мясо. Оно не подойдёт для великих едоков, им нужно " +"чистое мясо." + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "Вы принесли мясо?" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "Едоки будут накормлены." + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "Едоки будут сыты, без сомнения." + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "Я не вижу мяса. Его можно найти в лесах и на болотах, ждущее едоков." + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "Принести волшебную книгу" @@ -158659,6 +162897,26 @@ msgstr "" "Вы можете двигаться быстрее большинства существ, получая 15% бонус к " "скорости на твёрдой поверхности." +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "Рефлекторный фотофор" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" +"На вашей голове растут фотофоры. Вы не можете сознательно ими управлять, они" +" могут начать светиться в зависимости от ваших эмоций или психологического " +"состояния." + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "Рефлекторный фотофор (акт)" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "Слабый фотофор" @@ -158674,15 +162932,54 @@ msgstr "" " очень выдаёт вас в темноте, но идеально подходит для привлечения партнера " "во время брачного сезона." +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "Слабый фотофор (акт)" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "Ваш фотофор мягко светится." + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "Фотофор" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." msgstr "Ваш фотофор может ярко светиться." +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "Фотофор (акт)" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "Ваш фотофор ярко светится." + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "Обыкновенный человек" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" +"Вы обыкновенный человек, с вами всё хорошо. Нет причин для беспокойства." + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "Жестокий монстр" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." +msgstr "" +"Гнев застилает ваш разум, вы не можете ясно мыслить, но ощущаете свою мощь." + #: lang/json/mutation_from_json.py msgid "Good Hearing" msgstr "Хороший слух" @@ -158788,12 +163085,15 @@ msgstr "Быстрое лечение" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." msgstr "" -"Вы лечитесь быстрее во время сна, а также восстанавливаете небольшое " -"количество здоровья, когда не спите." +"Ваши раны зарастают быстрее обычного. Вы лечитесь на 50% быстрее, пока " +"спите, и на 20% быстрее, пока бодрствуете. Ваши сломанные конечности также " +"восстанавливаются вдвое быстрее." #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -159539,9 +163839,13 @@ msgstr "Медленное лечение" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." msgstr "" -"Вы медленнее лечитесь; сон восстанавливает меньше потерянных очков здоровья." +"Ваши раны зарастают медленнее обычного. Ваши раны и переломы проходят со " +"скоростью 75% от обычной." #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -159549,13 +163853,13 @@ msgstr "Слабое лечение" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." msgstr "" -"Восстановление вашего здоровья во время сна серьёзно снижено, поэтому вы " -"восстанавливаете только треть от обычного числа очков здоровья в единицу " -"времени." +"Ваши раны очень медленно заживают. Ваши раны и переломы проходят со " +"скоростью 33% от обычной." #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -159563,13 +163867,13 @@ msgstr "Невосприимчивость к лечению" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." msgstr "" -"Вы практически не восстанавливаете здоровье во время сна; сон " -"восстанавливает всего одну десятую от обычного числа очков здоровья в " -"единицу времени." +"Раны крайне опасны для вас и почти не зарастают. Ваши раны и переломы " +"проходят со скоростью 10% от обычной." #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -160413,12 +164717,14 @@ msgstr "Очень быстрое исцеление" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." msgstr "" -"Ваша плоть медленно восстанавливается и вы восполняете очки здоровья, даже " -"когда не спите." +"Ваши раны зарастают куда быстрее обычного. Вы лечитесь на 50% быстрее, пока " +"спите, и на 66% быстрее, пока бодрствуете. Ваши сломанные конечности также " +"восстанавливаются в 4 раза быстрее." #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -160426,8 +164732,15 @@ msgstr "Регенерация" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "Ваша плоть восстанавливается от ран невероятно быстро." +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" +"Ваша плоть почти мгновенно затягивает раны. . Вы лечитесь на 150% быстрее, " +"пока спите, и на 200% быстрее, пока бодрствуете. Ваши сломанные конечности " +"также восстанавливаются в 16 раз быстрее." #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -160435,8 +164748,12 @@ msgstr "Регенерация рептилии" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "Ваши сломанные конечности восстанавливаются без особых сложностей." +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "" +"Ваши сломанные конечности восстанавливаются без особых сложностей. Вам не " +"требуются шины, а конечности срастаются в 20 раз быстрее." #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -164398,8 +168715,7 @@ msgstr "Арахнид" msgid "Well, maybe you'll just have to make your own world wide web." msgstr "Ясно, похоже теперь вы должны создать собственную всемирную паутину." -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "Выживший" @@ -164765,10 +169081,6 @@ msgstr "" "лучше знать. Вы - Поешь-ка, маска стала вашим лицом, вы самый настоящий и вы" " — единственное, что стоит между этим миром и забвением." -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "Доктор медицины" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -165189,16 +169501,36 @@ msgstr "Быстрые рефлексы" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." -msgstr "" -"У вас хорошие рефлексы, что позволяет вам легче уворачиваться от атак." - -#: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "История Выжившего" - -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." +msgstr "" +"У вас хорошие рефлексы, что позволяет вам легче уворачиваться от атак и " +"захватов." + +#: lang/json/mutation_from_json.py +msgid "Survivor: Confused 1" +msgstr "Выживший: Сбитый с толку 1" + +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -165206,6 +169538,86 @@ msgstr "История Выжившего" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "Этот НПС может рассказать вам, как он пережил Катаклизм." +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "Выживший: Без прошлого 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "Выживший: Без прошлого 2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "Выживший: Без прошлого 3" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "Выживший: Без прошлого 4" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "Выживший: Без прошлого 5" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "Выживший: Религиозный 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "Выживший: Религиозный 2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "Выживший: Мечтатель 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "Выживший: Со свадьбы 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "Выживший: Эвакуированный 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "Выживший: Эвакуированный 2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "Выживший: Эвакуированный 3" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "Выживший: Эвакуированный 4" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "Выживший: Эвакуированный 5" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "Выживший: Эвакуированный 6" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "Выживший: Эвакуированный МЧС 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "Выживший: Брошенный 1" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "Выживший: Брошенный 2" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "Выживший: Брошенный 3" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "История Выжившего" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "Знак Провидицы" @@ -166572,6 +170984,32 @@ msgstr "" "Кому нужно оружие? Вы наносите больше урона в ближнем бою без оружия. Этот " "урон становится больше с ростом навыка безоружного боя." +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "Подготовка джедая" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" +"Вы имеет подготовку джедая. Ваше знание позволяет вам использовать в бою " +"одну из форм битвы на световых мечах." + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "Мастер Поккена" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" +"Вы хорошо разбираетесь в искусстве чудовищного Карманного Кулака. Хорошо " +"тренируйтесь, ведь ваша судьба - стать мастером." + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "Ученик боевых искусств" @@ -166580,10 +171018,12 @@ msgstr "Ученик боевых искусств" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" "Вы обучались боевому искусству и выучили одну из дисциплин Возвышенного " -"Пути." +"Пути. Вы начинаете с одной из техник: Пустынный Ветер, Алмазный Разум, " +"Железное Сердце, Заходящее Солнце, Каменный Дракон или Тигриный Коготь." #: lang/json/mutation_from_json.py msgid "Magus" @@ -167130,10 +171570,6 @@ msgstr "Я просто пытаюсь выжить." msgid "I'm tracking game." msgstr "Я выслеживаю дичь." -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "Солдат" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "Бармен" @@ -167651,6 +172087,14 @@ msgstr "Возвышение мастодонта" msgid "Humans created me. Let's see what I can be on my own." msgstr "Люди создали меня. Посмотрим, на что я способен сам по себе." +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "Болотник" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "Великие пожиратели вернулись, и они должны быть накормлены." + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "Оператор" @@ -167920,10 +172364,6 @@ msgstr "Добытчик" msgid "Laborer" msgstr "Разнорабочий" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "Лесоруб" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "Столяр" @@ -167936,6 +172376,14 @@ msgstr "Ксенобиолог, безумна" msgid "Millyficen Whately" msgstr "Миллифицен Ватели" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "Генеральный директор" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "Бо Бароникс" + #: lang/json/npc_from_json.py msgid "magus" msgstr "маг" @@ -169173,11 +173621,11 @@ msgstr "гараж у заправки" #: lang/json/overmap_terrain_from_json.py msgid "dispensary" -msgstr "гомеопатическая аптека" +msgstr "пункт продажи каннабиоидов" #: lang/json/overmap_terrain_from_json.py msgid "dispensary roof" -msgstr "крыша аптеки" +msgstr "крыша пункта продажи каннабиоидов" #: lang/json/overmap_terrain_from_json.py msgid "small office" @@ -170501,6 +174949,18 @@ msgstr "дорога, люк" msgid "bridge" msgstr "мост" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "мост (эстакада)" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "край моста (земля)" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "край моста (рампа)" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "остановка" @@ -174074,7 +178534,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Death Row Convict" -msgstr "Осуждённый к смертной казни" +msgstr "Приговорённый к смертной казни" #. ~ Profession (male Death Row Convict) description #: lang/json/professions_from_json.py @@ -174091,7 +178551,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Death Row Convict" -msgstr "Осуждённая к смертной казни" +msgstr "Приговорённая к смертной казни" #. ~ Profession (female Death Row Convict) description #: lang/json/professions_from_json.py @@ -176330,6 +180790,136 @@ msgstr "" "в другое. Вы знали, что было вопросом времени, когда ужасы, реющие в небе, " "собьют и вас." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "Врач скорой помощи" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" +"Вы были на выезде, когда вам напарник потерялся. Теперь у вас есть только " +"ваша верная машина скорой помощи, но куда везти пациентов в апокалипсисе?" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "Врач скорой помощи" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" +"Вы были на выезде, когда вам напарник потерялся. Теперь у вас есть только " +"ваша верная машина скорой помощи, но куда везти пациентов в апокалипсисе?" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "Фельдшер" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" +"Вы потеряли своего напарника, когда были на выезде. Вам удалось прихватить " +"немного лекарств, но похоже теперь вы будете заняты спасением собственной " +"жизни." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "Фельдшер" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" +"Вы потеряли своего напарника, когда были на выезде. Вам удалось прихватить " +"немного лекарств, но похоже теперь вы будете заняты спасением собственной " +"жизни." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "Армейский врач" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" +"Вы были на передовой, когда всё началось, латая раненых и обеспечивая " +"помощь. Однако они нападали и нападали. Теперь вы сам по себе." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "Армейский врач" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" +"Вы были на передовой, когда всё началось, латая раненых и обеспечивая " +"помощь. Однако они нападали и нападали. Теперь вы сама по себе." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "Героинщик" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" +"Последнее, что ты помнишь - как встретил Бога возле Сядь-и-поешь. А затем " +"люди сели и стали есть друг друга. Это не похоже на приход." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "Героинщик" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" +"Последнее, что ты помнишь - как встретила Бога возле Сядь-и-поешь. А затем " +"люди сели и стали есть друг друга. Это не похоже на приход." + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -176546,12 +181136,14 @@ msgstr "Инженер КБМ" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" "Вы работали техником в стерильной хорошо охраняемой фабрике и занимались " -"изготовлением бионических имплантов. При помощи точных машин и оснащённых " -"паяльниками рук вы зарабатывали очень неплохо." +"изготовлением бионических имплантов. Приказ об эвакуации застал вас посреди " +"16-часовой смены, и вы едва ухитрились ускользнуть, даже не успев оставить " +"на рабочем месте инструменты." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -176563,12 +181155,14 @@ msgstr "Инженер КБМ" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" "Вы работали техником в стерильной хорошо охраняемой фабрике и занимались " -"изготовлением бионических имплантов. При помощи точных машин и оснащённых " -"паяльниками рук вы зарабатывали очень неплохо." +"изготовлением бионических имплантов. Приказ об эвакуации застал вас посреди " +"16-часовой смены, и вы едва ухитрились ускользнуть, даже не успев оставить " +"на рабочем месте инструменты." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -178105,6 +182699,278 @@ msgstr "" "Наступил Катаклизм, и тебе придётся найти иное применение уловкам, которыми " "ты мухлевала на контрольных." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "Интроспекционист " + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" +"Вы удалились от общества, так как хотели сосредоточиться на " +"самосовершенствовании. Вас было двое - вы и ваш друг, но из-за апокалипсиса " +"вы остались в одиночестве." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "Интроспекционист " + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" +"Вы удалились от общества, так как хотели сосредоточиться на " +"самосовершенствовании. Вас было двое - вы и ваш друг, но из-за апокалипсиса " +"вы остались в одиночестве." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "Мстительный проповедник" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" +"Вы потеряли веру, когда ваша супруга умерла от болезни. С тех пор вы " +"пытались упиться до смерти. Бог наказал всех с помощью апокалипсиса, и вы " +"покажете им, каково ваше милосердие." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "Мстительная проповедница" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" +"Вы потеряли веру, когда ваш супруг умер от болезни. С тех пор вы пытались " +"упиться до смерти. Бог наказал всех с помощью апокалипсиса, и вы покажете " +"им, каково ваше милосердие." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "Техно-выживальщик" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" +"Вы давно заподозрили, что мир может полететь в тартарары. С вашей " +"подготовкой, заклинаниями и револьвером ваши шансы получше, чем у " +"большинства." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "Техно-выживальщица" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" +"Вы давно заподозрили, что мир может полететь в тартарары. С вашей " +"подготовкой, заклинаниями и револьвером ваши шансы получше, чем у " +"большинства." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "Бионический псевдовампир" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"Вы всегда обожали романы ужасов и использовали своё состояние, чтобы " +"улучшить себя с помощью заклинаний и бионики до обитателя ночи. Ваше " +"пренебрежение собственным здоровьем на этом пути оставило вас бледным и " +"мрачным." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "Бионический псевдовампир" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"Вы всегда обожали романы ужасов и использовали своё состояние, чтобы " +"улучшить себя с помощью заклинаний и бионики до обитателя ночи. Ваше " +"пренебрежение собственным здоровьем на этом пути оставило вас бледной и " +"мрачной." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "Волшебник из Академии" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" +"Год обучения в академии волшебства научил вас терпения, мудрости и " +"нескольким полезным заклинаниям. Теперь учителя превратились в нежить, " +"занятия отменены, и начался последний экзамен." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "Волшебница из Академии" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" +"Год обучения в академии волшебства научил вас терпения, мудрости и " +"нескольким полезным заклинаниям. Теперь учителя превратились в нежить, " +"занятия отменены, и начался последний экзамен." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "Кислотный рокер" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" +"Ваша карьера в метале взлетела до новых высот, когда вы заменили спецэффекты" +" на едкую кровь и шипастые хлысты. Похоже, Катаклизм станет вашим финальным " +"туром." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "Кислотная рокерша" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" +"Ваша карьера в метале взлетела до новых высот, когда вы заменили спецэффекты" +" на едкую кровь и шипастые хлысты. Похоже, Катаклизм станет вашим финальным " +"туром." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "Шоковый полицейский" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" +"Вы попали в экспериментальную программу обеспечения правопорядка, " +"направленную на уменьшение смертности подозреваемых при арестах и сокращение" +" расходов на тазеры и пули путём использования ваших способностей управления" +" молниями." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "Шоковый полицейский" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" +"Вы попали в экспериментальную программу обеспечения правопорядка, " +"направленную на уменьшение смертности подозреваемых при арестах и сокращение" +" расходов на тазеры и пули путём использования ваших способностей управления" +" молниями." + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "Землетряс" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" +"Вы заработали себе имя в подпольных магических боях, получив славу " +"неостановимого сокрушителя. Теперь все ваши соперники мертвы, и нет нужды " +"сдерживать свою мощь." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "Землетряс" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" +"Вы заработали себе имя в подпольных магических боях, получив славу " +"неостановимого сокрушителя. Теперь все ваши соперники мертвы, и нет нужды " +"сдерживать свою мощь." + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -180112,7 +184978,7 @@ msgid "build a metalworking forge" msgstr "построить кузницу" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "" "Давайте установим тигель с наковальней для расширения наших возможностей." @@ -184952,6 +189818,44 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "Отпуск в убежище волшебника" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "Изгнанный" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "Изгнанная" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" +"Вы изгнанник, потому ли, что люди избегают вас из-за того, кто вы есть, или " +"по вашему собственному выбору. Мертвые же не хотят оставлять вас в покое." + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" +"Вы изгнанник, потому ли, что люди избегают вас из-за того, кто вы есть, или " +"по вашему собственному выбору. Мертвые же не хотят оставлять вас в покое." + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "Изгнание" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -187889,106 +192793,6 @@ msgstr "Не помню, когда последний раз так хотел msgid "I'd kill for a sip of water right now." msgstr "Могу убить за глоток воды." -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" -"Да-да, конечно, не могу не заметить, что у тебя есть пиво! Давай откупорим " -"бутылочку и поболтаем, , как дела?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" -"О, конечно, как насчёт одной из бутылочек пива, что я у тебя видел? Впрочем," -" как твои дела?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "" -"Ага, поделись пивком, я видел, у тебя с собой несколько штук, и мы поболтаем" -" о чём угодно! Шучу-шучу, как жизнь?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" -"Эй, , болтать было бы куда приятнее с классным холодным пивком. Как " -"дела?" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "" -"Что скажешь, если мы откроем пива, поболтаем и просто… притворимся, что " -"никакого апокалипсиса нет, хотя б на минутку?" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "Передай-ка и мне, и вспомним старые добрые деньки, ." - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "Эй, конечно, , мне всё равно нужно передохнуть, как сам-то?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "Ага, лады, , как поживаешь?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "Без вопросов, давай потрындим! Ты как, всё нормально?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "Чего ж нет-то? Как твои дела?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "У меня всё норм, чё как?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "Могу уделить пару минут, как сам-то?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "Не вопрос, , у тебя всё хорошо?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "Хорошо, тебе хочется выговориться и камень с души снять?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "Всегда рад хорошенько поболтать! Но что случилось, всё нормально?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "Что ж, , нам надо узнать друг друга получше, как держишься?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "Я определённо не против. Как себя чувствуешь?" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "Отличная идея, . Давай ненадолго забудем про мир. Как жизнь?" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "Ай, к чёрту всё. Как у тебя дела?" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "Конечно. Итак, что думаешь про погоду, а?" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "мать твою" @@ -190481,6 +195285,19 @@ msgstr "Расскажи, как тебе удалось выжить в пер msgid "Was it rough surviving thus far?" msgstr "Было ли тяжело выжить?" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "Как мы здесь оказались? по-твоему? Что вообще случилось?" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" +"Что вообще происходит? Ну то есть, что глобально за чертовщина творится?" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "Было что-нибудь о том, откуда вообще пришёл весь этот апокалипсис?" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -191203,6 +196020,366 @@ msgstr " будет избегать противников, если msgid " will follow normal engagement rules." msgstr " будет следовать обычным правилам встречи с противником." +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "Ага, точно, хочешь открыть по пивку?" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "О, конечно, как насчёт одной из бутылочек пива, что у тебя лежат?" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "" +"Ага, поделись пивком, я знаю, у тебя с собой несколько штук, и мы поболтаем " +"о чём угодно! Шучу-шучу." + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" +"Эй, , болтать было бы куда приятнее с классным холодным пивком." + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "" +"Что скажешь, если мы откроем пива, поболтаем и просто… притворимся, что " +"никакого апокалипсиса нет?" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "Передай-ка и мне, и поболтаем, ." + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "Ох, эта летняя жара меня доконает, знаешь?" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "Наслаждаюсь летом." + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "Вообще неплохо было бы немного охладиться, если честно." + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "Ладно, пусть это поможет мне не замёрзнуть при такой погоде." + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "Нужно сказать, сейчас снег был бы к месту." + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "Странно, что зомби не замерзают." + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "Ну, мне не совсем хорошо… но так уж и быть." + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "Мне всё равно нужно передохнуть, как у тебя?" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "Ну, как дела?" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "Давай потрындим! Ты как, , всё нормально?" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "У меня всё норм, чё как?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "Могу уделить пару минут, как у тебя дела?" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "Не вопрос, , у тебя всё хорошо?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "Хорошо, тебе хочется выговориться и камень с души снять?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "Всегда рад хорошенько поболтать! Но что случилось, всё нормально?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "Ладно, , как поживаешь?" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "Я не против. Как себя чувствуешь?" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "Давай ненадолго забудем про мир. Как жизнь?" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "Ай, к чёрту всё. Как у тебя дела?" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "Итак, что думаешь про погоду, а?" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "Приятно, что у тебя нашлось время. Как дела в последнее время?" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "Ноги ноют последнее время, сечёшь?" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" +"Я сегодня в отличном настроении. Не знаю почему, может просто день такой." + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" +"Я просто не могу поверить, что всё кончено. Я прокручиваю в голове те дни, " +"когда всё полетело к чёрту. Бунты. Ложь. Психи. Не возникало ощущения, что " +"всё вот так закончится." + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" +"Тебе не приходило в голову, что были проблески правды в том бреде, что " +"распространяли перед концом света? Наркотики для управления разумом, " +"биологический терроризм? Кое в чём был смысл, но большая часть - натянутая " +"ерунда. Но вот опять же, у нас ведь тут самые натуральные зомби." + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" +"Любопытно, нужно ли мне больше или меньше посвящать время религии. " +"Понимаешь, о чём я, ?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" +"Думаю, надо мне навести порядок в моём снаряжении. Полный бардак. А то " +"потянусь за пистолетом и вытащу батончик сникерса, прикинь?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "" +"Когда-нибудь приходилось задумываться, зачем мы вообще боремся? В конце " +"концов все мы всё равно станем зомби. Я не говорю, что перестану драться, но" +" чёрт, какой же в этом смысл?" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" +"Хотелось бы мне сейчас пошмалять по зомби без всей это ерунды со страхом за " +"собственную жизнь." + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" +"Каждый раз ,когда я закрываю глаза, снова вижу беспорядки. У тебя такое тоже" +" бывает, или так только со мной?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" +"Тебе никогда не кажется, что всё до апокалипсиса было просто сном, от " +"которого ты проснулся?" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" +"Как тебе стало понятно, что наступает конец света? Для меня это было то " +"чёртово видео на YouTube, где женщина убивает ребёнка. Просто пиздец, " +"понимаешь?" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" +"Мне интересно, осталось ли ещё правительство где-то там, сидящее в бункере." + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" +"Помнишь безумные новости, когда начался конец света? Те, что почти и не " +"показывали из-за освещения беспорядков. То есть, разве губернатор Род-" +"Айленда не объявил о выходе из Союза?" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" +"Я продолжаю видеть сны, в которых зомби всё ещё помнят, кем они были, и " +"просто заперты в своих телах, наблюдая за происходящим. Не могу нормально " +"спать из-за этого." + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" +"Эти наркотики для контроля разума, которые они добавляют в воду, чтобы люди " +"устраивали беспорядки… думаешь, они ещё в воде?" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" +"Не могу перестать догадываться, кто же так облажался, позволив всему этому " +"произойти. Очевидно, новостям доверять нельзя - они неделями называли зомби " +"«участниками беспорядков». Так почему? Откуда всё это?" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" +"А что, если то, что говорили о китайцах, отчасти правда? Думаешь, сейчас в " +"Китае то же самое? Или может США - это карантинная зона, и где-то ещё мир " +"живёт по прежнему." + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" +"Тебе не приходилось замечать, что раны сейчас совсем по другому " +"выздоравливают? Мне удалось это заметить ещё до конца света, но сейчас это " +"особенно заметно. Раны даже не успевают толком покрыться коркой перед тем, " +"как затягиваются." + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" +"Я до сих пор не могу понять, откуда у зомби энергия берётся. Они будто " +"вечные двигатели." + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" +"Так много вещей не складываются. Кто создал зомби? Что заставляет их " +"двигаться? Может быть слухи о наркотиках для контроля разума были всё это " +"время правдой, и кто-то нашёл способ создавать зомби с помощью биоинженерии." + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" +"Как зомби продолжают двигаться? Что они едят? Думаешь, они когда-нибудь " +"сгниют окончательно?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" +"Я вот всё думаю, настанет день, когда у нас закончится туалетная бумага. И " +"что тогда?" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" +"Тебе не кажется странным такое - типа, мы находим запертое здание, а внутри " +"оказывается одинокий зомби. Как он туда вообще попал?" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" +"Иногда я думаю, что мы все психи, не только те, кто сошёл с ума и устраивал " +"беспорядки. Никогда бы в голову не пришло, что я сотворю такое, что мне " +"приходилось делать после конца света." + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "Попадались интересные книги? Так хорошо, что у нас ещё есть книги." + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" +"Знаешь, чего мне не хватает? Кинотеатров. Как думаешь, Голливуд пережил это?" +" Может, там сейчас полно актёров-зомби, до сих пор рефлекторно играющих свои" +" сцены. Ха, такую дичь я посмотрю с удовольствием." + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "Понимаю, …" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "Это напоминает мне кое о чём…" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "Верно, верно. Скажи, а тебе в голову не приходило…" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -192869,6 +198046,16 @@ msgstr "" "безгильзовых патронов. Слоган гласит: «Безгильзовое оружие Ривтех. Остальное" " даже не сравнится.»" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" +"Реклама прачечной SUDS. На ней написан следующий текст, окружённый " +"облачками: «Тергитол по вторникам! Скидка 50% на все стирки и сушки!»" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -192883,6 +198070,27 @@ msgstr "" " угрожающим чёрным силуэтам на горизонте. Надпись гласит: «МЫ ЗДЕСЬ РАДИ " "ВАШЕЙ ЗАЩИТЫ»." +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" +"Реклама спортзала Iron Gym. На ней фотографии людей, выполняющих различные " +"упражнения, вроде бега, йоги и пауэрлифтинга. Надпись гласит: «Здесь можно " +"поднять и опустить!»" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" +"Реклама Space Time Inc. На ней изображены парящие возле космического корабля" +" астронавты на фоне Луны. Надпись гласит: «Ваш собственный кусочек Луны! " +"Всего за 29.99$ в месяц вы можете приобрести недвижимость среди звёзд!»" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -196657,6 +201865,431 @@ msgstr "-стайл." msgid "-chant" msgstr "балладный напев." +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" +"Мясо сильно мутировавшего животного. У него неприятная рыхлая губчатая " +"текстура, а пахнет оно… Почти как обычно. В нём есть странные неестественные" +" волокна и образования: волосы и кусочки костей внутри мышц, будто бы там " +"пытался развиться другой организм. Тем не менее это кажется съедобным, если " +"его приготовить и удалить самые мерзкие части." + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" +"Мясо сильно мутировавшего животного. Несмотря на то, что оно произошло из " +"мышечной ткани, оно имеет странный вихревой рисунок с зёрнами, а в центре " +"каждого зерна находится узел из твердой хрящевой ткани. Пахнет отталкивающе." + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" +"Мясо сильно мутировавшего животного. Это мышцы, но на внешней стороне ткани " +"между отдельными мускулами проросли густые жёсткие волосы. Жутко пахнущая, " +"кремового цвета жидкость выделяется каждый раз, когда волос выпадает." + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" +"Мясо сильно мутировавшего животного. Несмотря на то, что оно произошло из " +"мышечной ткани, оно обладает толстой, похожей на верёвку текстурой и пахнет " +"как кожа и хлебная плесень." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" +"Это приготовленный кусок мяса мутировавшего животного. У него неприятная " +"губчатая структура, но вкус… Почти нормальный. Вы надеетесь, что вырезали " +"все волосы и кусочки костей…" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" +"Это приготовленный кусок мяса мутанта. Вы думали, что вычистили его от всего" +" неприятного, но при готовке внутри лопнул мешок с жидкостью, покрыв всё " +"блюдо чем-то густым и жирным." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" +"Это приготовленный кусок мяса мутанта. Поверхность мяса покрыта щербинами " +"там, где вы выковыривали более несъедобные кусочки." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" +"Это приготовленный кусок мяса мутанта. Жар заставил мышцы крутиться и " +"двигаться, как будто они всё ещё живы, и теперь он превратился в плотный " +"узел." + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" +"Эти органы извлечены из огромного мутировавшего насекомого, и вы не уверены," +" что с ними вообще можно сделать. Здесь много такого, что не найти ни в " +"одной книге по анатомии, с костями, волосами и прочими ни на что не похожими" +" частями, судя по всему, случайно растущими во всех направлениях." + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" +"Эти органы извлечены из огромного мутировавшего насекомого. У них нездоровый" +" зелёный оттенок, и один из них разорвался при извлечении, открыв под " +"поверхностью нечто, похожее на множество человеческих пальцев и ногтей." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" +"Большая, мясистая сумка, извлечённая вами из огромного мутировавшего " +"насекомого. Поверхность покрыта гладкой, мягкой кожей, а под ней находится " +"спиральная, беспорядочно перепутанная ткань, похожая на шнуры." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" +"Это длинный, проволочный орган, который вы извлекли из огромного " +"мутировавшего насекомого. Он проходил от головы до брюшной полости и имеет " +"длинные усики, что придаёт ему сходство со спинным мозгом." + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" +"Это мясистый серый орган, извлечённый из мутанта. У него мелово-желтое " +"покрытие, которое обжигает вашу кожу, и из него торчат несколько непонятных " +"мясистых трубок. Запах щипет ноздри. Вы уверены, что ни у одного " +"естественного существа нет ничего подобного." + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" +"Это орган, извлечённая из мутировавшего существа, похожая на несколько " +"сердец млекопитающего, закреплённых на длинной трубке из плоти. На конце " +"расположена сумка, напоминающая желудок." + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" +"Вы вполне уверены, что это лёгочная ткань. Похоже на лёгкие крупного " +"млекопитающего вроде собаки, но вместо нескольких хорошо различимых долей " +"здесь их десятки, и они расположены рядами. Странные выступи и наросты " +"покрывают всю поверхность." + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" +"Вы вполне уверены, что это лёгочная ткань. Форма слегка смахивает на крылья " +"с рядами узелков на краю. Скопления игл в на углах органа держали его на " +"панцире жука, как застежки." + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" +"Кусок экзоскелета насекомого, подвергшийся мутации. Внутренняя сторона " +"покрыта венами и странными загнутыми наростами." + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" +"Кусок экзоскелета насекомого. Внутренняя стороны покрыта нитями нервной " +"ткани и кровеносными сосудами." + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" +"Кусок жесткого хитина в форме трубки, извлечённый из гигантского насекомого." +" Похоже, он служил для поддержки чего-то. Вам кажется, у нормальных " +"насекомых такого внутри нет." + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" +"Длинный, гибкий цилиндрический кусок хитина, извлечённый из гигантского " +"мутировавшего насекомого. Он покрыт кровеносными сосудами и хитиновыми " +"наростами." + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" +"Когда вы снимаете верхний слой панциря, вы обнаруживаете, что хитин покрыт " +"венами" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" +"Теперь, когда это создание мертво, хитин сходит с удивительной лёгкостью" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" +"По всему хитину этого существа натянута тонкая мембрана, схожая с кожей" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" +"Под панцирем этого существа хрустящая, похожая на застёжки на одежде ткань" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" +"Анатомия существа выглядит так, будто это млекопитающее, приобретшее панцирь" +" и форму членистоногого" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "Вы вскрываете монстра словно гигантского лобстера в ресторане" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" +"Хитин плотно сидит на этом создании, и вам приходится отрывать его и срезать" +" волокна под ним, удерживающие его на месте" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" +"Внутри существа наполовину сформированные органы прижаты к губчатой плоти, " +"которая очень далека от того, как выглядит сырое мясо членистоногих" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" +"Вы обнаруживаете набор крючковатых костяных наростов, которые словно " +"удерживают его на месте" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" +"Внутри обнаруживается сложная, ещё дергающаяся масса странных отростков и " +"органов, которые едва ли похоже на что угодно, встречающееся в природе" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" +"Плоть под хитином покрыта густыми, колючими волосами, скрывающими месиво " +"мутировавших, не до конца сформировавшихся органов" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" +"Внутри обнаруживается месиво из органов и тканей, выглядящее не слишком " +"естественно" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" +"Внутри существа вы обнаруживаете лёгкие, сердца и внутренности, больше " +"похожие на принадлежащие млекопитающему, чем гигантскому насекомому" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" +"Плоть внутри издаёт омерзительный запах и покрыта сырыми волосами, словно " +"ужасное новорождённое животное" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" +"Скрутки волокон рвутся, являя вам скрученные, частично сформировавшиеся " +"копии самого существа" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "Работать тяжело, губчатая ткань рвётся под вашими инструментами" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" +"Дымящиеся струйки кислоты начинают литься из под панциря, когда вы его " +"удаляете" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "Дымящаяся кислота льётся из под хитина, когда вы его удаляете" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" +"Несколько кислотных желёз лопается, когда вы удаляете панцирь, посылая струи" +" едкой жидкости во все стороны" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" +"Сами органы имеют едкий запах, но они не кажутся такими едкими, как внешняя " +"оболочка" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" +"Вы тщательно избегаете проникновения в карманы желез, выделяющих кислоту, " +"как вам кажется" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" +"Толстые, похожие на верёвки волокна ткани под хитином защищают внутренний " +"слой странных органов, больше всего напоминающих птичьи" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "Сильные кислотные испарения от трупа существенно осложняют вам работу" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" +"Ткани существа полны наполовину сформировавшимися органами, чьё " +"предназначение непонятно" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" +"Несколько раз вы едва не обжигаетесь, прокалывая скрытые от глаз желёзы, " +"полные кислоты" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "." + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr ". ." + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +". . " +"." + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "." + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr ". ." + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +". . " +"." + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -206452,6 +212085,10 @@ msgstr "Убежище «последнего человека на Земле» msgid "Middle of Nowhere" msgstr "Чёрт-те где" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "Пустынный остров" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "Клетка для экспериментов" @@ -206597,12 +212234,12 @@ msgid "Acolyte." msgstr "Послушник." #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" +msgid "You're back. Have you come to listen to the song?" msgstr "Ты снова тут. Ты хочешь послушать песнь?" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" -msgstr "Ты тут. Тихо. Ты слышишь? Песнь?" +msgid "You there. Quiet down. Can you hear it? The song?" +msgstr "Эй ты. Тихо. Ты слышишь? Песнь?" #: lang/json/talk_topic_from_json.py msgid "What? What do you mean? What song?" @@ -206636,8 +212273,8 @@ msgstr "Мне пора. Береги себя, Провидица." #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" "Вслушайся. Кости… Они поют. Ты слышишь? Слышишь песню, которую они выводят? " "Слышишь истории, которые они хранят?" @@ -206652,11 +212289,11 @@ msgstr "Э… Да, конечно. Думаю, мне пора идти." #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" "Когда всё произошло, когда случился Катаклизм, что-то… поменялось. Это видно" @@ -206680,11 +212317,11 @@ msgstr "Кто-то ещё, эээ, верит в это?" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" "Тело не восстаёт, только если разбить кости. Ты поймёшь, кем оно было, " "только если осмотришь кости. Это и есть история. Что бы ни вызвало " @@ -206698,7 +212335,7 @@ msgstr "По-моему, я понял, о чём ты, хотя я не со в #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" "Есть и другие, кто следует этой цели. Тебе нужно им помогать, пусть нас и " @@ -206714,10 +212351,10 @@ msgstr "Цели? Так зачем ты собираешь кости?" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" "Песню можно плести по-разному. Вырезанные костяные амулеты, оружие и доспехи" " — все они хранят неимоверную силу, и в нужное время мы с собратьями соберём" @@ -206731,7 +212368,7 @@ msgstr "Завершить мир? Чего?" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" "Мы верим, что достаточная сила в одной песне способна обратить Катаклизм — " @@ -206752,8 +212389,8 @@ msgstr "Да ты чокнутая." #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" "Твой разум открыт. Открытее многих. Возможно, однажды и ты ощутишь силу " @@ -206766,9 +212403,9 @@ msgstr "Спасибо… Спасибо тебе." #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" "Меня не удивляет твой спексис. Возможно, однажды и ты услышишь " "неотвратимость песни, ощутишь её силу. Но до тех пор ты будешь Послушником, " @@ -206778,6 +212415,13 @@ msgstr "" msgid "Yeah, alright." msgstr "Да-да, точно." +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" +"Пока что песня… Утихла. Возможно, на костях мира будет высечено больше нот." + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "Послушнику не следует браться за много песен сразу." @@ -206787,11 +212431,8 @@ msgid "That is all for now." msgstr "Пока что всё." #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." -msgstr "" -"Пока что песня… Утихла. Возможно, на костях мира будет высечено больше нот." +msgid "There are bones to etch, songs to sing. Wish to join me?" +msgstr "Ещё есть невырезанные кости и неспетые песни. Присоединишься ко мне?" #: lang/json/talk_topic_from_json.py msgid "Do you wish to take on more songs?" @@ -206802,8 +212443,8 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "Думаешь, ты сможешь взвалить обузу лишних костей?" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" -msgstr "Ещё есть невырезанные кости и неспетые песни. Присоединишься ко мне?" +msgid "A song may yet be sung by you, should you wish to." +msgstr "Тебе ещё предстоит спеть песню, если желаешь." #: lang/json/talk_topic_from_json.py msgid "There is an additional song you could take on, if you'd like." @@ -206814,10 +212455,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "Я знаю несколько полезных костей, если хочешь услышать побольше." -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "Тебе ещё предстоит спеть песню, если желаешь." - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "Понятно." @@ -206830,17 +212467,6 @@ msgstr "Слушаю." msgid "Perhaps another time, Seer." msgstr "Может, в другой раз, Провидица." -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" -"Если хочешь встать на путь просвещения, первым делом тебе нужно научиться " -"слышать и слушать песню. Ступай разделай животное и почувствуй силу меж " -"кончиков пальцев. Затем принеси мне кости, и я обрежу их для тебя." - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "Ну, мне хочется узнать, что будет дальше. Я в деле." @@ -206849,10 +212475,6 @@ msgstr "Ну, мне хочется узнать, что будет дальше msgid "Not interested." msgstr "Не интересует." -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "Превосходно. Теперь ступай же." - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "Считай, уже сделано. Но я хочу спросить…" @@ -206869,23 +212491,13 @@ msgstr "Не поможешь ли мне снаряжением?" msgid "I'm off then." msgstr "Тогда я иду." -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" -"Всюду видно качающиеся трупы, но они движутся без гармонии. Их песня " -"годится, но для Послушника это бессмысленная сложность. Убедись, что режешь " -"чистое живое существо." - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "В общем, существо, которое не зомби и не монстр. Ясно." #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" "Для тебя открыт путь просвещения. Моя помощь только помешает тебе и спутает " @@ -206898,7 +212510,7 @@ msgstr "Ясно. Очень хорошо." #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" "У тебя мой знак, значит, у тебя есть потенциал учиться по-настоящему слушать" " песню. Да, пока что я помогу тебе своими умениями." @@ -206915,11 +212527,6 @@ msgstr "Приятно слышать. Тогда пойдём." msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "Отлично, но прямо сейчас мне нужно идти одному. Может, потом." -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "Я понимаю твои сомнения. Возвращайся, когда увидишь путь." - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "Может, в другой раз. Давай сменим тему…" @@ -206931,14 +212538,14 @@ msgstr "Ладно, но мне пора." #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" "Дело не в том, что Катаклизм принёс бродячие ужасы и чудовищ. Он начал… " "цикл, какой-то цикл. Всё повторяется. Это можно видеть только в других, но " @@ -206978,6 +212585,14 @@ msgstr "Забудь мой вопрос." msgid "Skip it, let's get going." msgstr "Забей, давай идти дальше." +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "Не дашь совет насчёт мира, в которым мы теперь живём?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "Давай поговорим о лагерях." + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "Что ты имел ввиду под этим, «в основном», пойти за мной?" @@ -207190,7 +212805,7 @@ msgstr "Расскажи, как давать тебе медицинские п #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -207396,9 +213011,9 @@ msgstr "Привет, ." #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." -msgstr "СТОЯТЬ, руки вверх! Ха, испугался?… Закона больше нет…" +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" +msgstr "СТОЯТЬ, руки вверх! Ха, страшно?… Закона больше нет…" #: lang/json/talk_topic_from_json.py msgid "What are you doing here?" @@ -207419,9 +213034,9 @@ msgstr "Мне пора." #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" -"Я дежурил в участке, когда что-то пошло не так. Никто из остальных " +"Было моё дежурство в участке, когда что-то пошло не так. Никто из остальных " "полицейских не вернулся с последнего вызова, точнее, не вернулся человеком…" #: lang/json/talk_topic_from_json.py @@ -207479,7 +213094,7 @@ msgstr "" "иногда появляется странник, уверенный, что найдёт лучшую долю." #: lang/json/talk_topic_from_json.py -msgid "No, just no..." +msgid "No, just no…" msgstr "Нет, просто, , нет…" #: lang/json/talk_topic_from_json.py @@ -207491,7 +213106,7 @@ msgid "Make it quick, I want to go back to sleep." msgstr "Давай быстрее, мне нужно идти спать." #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." +msgid "Just few minutes more…" msgstr "Ещё пару минут…" #: lang/json/talk_topic_from_json.py @@ -207524,14 +213139,14 @@ msgstr "да, разбудить!" msgid "no, go back to sleep." msgstr "нет, пускай спит." -#: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" -msgstr "Что такое, друг?" - #: lang/json/talk_topic_from_json.py msgid " *pshhhttt* I'm reading you boss, over." msgstr "*пшшш-пшшш* я тебя слушаю, босс, приём." +#: lang/json/talk_topic_from_json.py +msgid "What is it, friend?" +msgstr "Что такое, друг?" + #: lang/json/talk_topic_from_json.py msgid "I want to give you some commands for combat." msgstr "Я хочу дать тебе боевые команды." @@ -207540,6 +213155,70 @@ msgstr "Я хочу дать тебе боевые команды." msgid "I want to set some miscellaneous rules." msgstr "Я хочу установить прочие правила." +#: lang/json/talk_topic_from_json.py +msgid "I'd like to know a bit more about your abilities." +msgstr "Мне б хотелось побольше узнать про твои способности." + +#: lang/json/talk_topic_from_json.py +msgid "There's something I want you to do." +msgstr "Я хочу, чтобы вы кое-что сделали." + +#: lang/json/talk_topic_from_json.py +msgid "I just wanted to talk for a bit." +msgstr "Я просто хочу немного поговорить." + +#: lang/json/talk_topic_from_json.py +msgid "Can you help me understand something? (HELP/TUTORIAL)" +msgstr "Можешь помочь мне понять кое-кто? (ПОМОЩЬ/ОБУЧЕНИЕ)" + +#: lang/json/talk_topic_from_json.py +msgid "I'm going to go my own way for a while." +msgstr "Всё, дальше я сам. Я ухожу." + +#: lang/json/talk_topic_from_json.py +msgid "Let's go." +msgstr "Пошли." + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" +msgstr "" +"*щёлк* Ты серьёзно? Это ж не мобильник. Это не может подождать, пока мы " +"рядом не окажемся?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what did you want to say?" +msgstr "Конечно, что у тебя на уме?" + +#: lang/json/talk_topic_from_json.py +msgid "Mind if we just chat for a bit about your history?" +msgstr "Не против немного поболтать про твою историю?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's just chitchat for a while, I could use some relaxation." +msgstr "Давай просто поболтаем, мне не помешает расслабиться." + +#: lang/json/talk_topic_from_json.py +msgid "I changed my mind, wanted to ask you something else." +msgstr "Проехали, хочу тебя кое о чём другом спросить." + +#: lang/json/talk_topic_from_json.py +msgid "I'm all ears, my friend." +msgstr "Внимательно слушаю, друг мой." + +#: lang/json/talk_topic_from_json.py +msgid "You gonna give me orders?" +msgstr "Будешь давать мне приказы?" + +#: lang/json/talk_topic_from_json.py +msgid "What would you like?" +msgstr "Что вы бы хотели?" + +#: lang/json/talk_topic_from_json.py +msgid "Just say the word." +msgstr "Только скажи." + #: lang/json/talk_topic_from_json.py msgid "Can you teach me anything?" msgstr "Ты можешь меня чему-нибудь научить?" @@ -207564,14 +213243,6 @@ msgstr "Охраняй эту позицию." msgid "I want to assign you to work at this camp." msgstr "Я хочу дать тебе работу в этом лагере." -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." -msgstr "Давай поговорим о твоём текущем занятии." - -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "Давай поговорим о лагерях." - #: lang/json/talk_topic_from_json.py msgid "Find a horse and mount up!" msgstr "Найди лошадь и садись верхом!" @@ -207585,32 +213256,20 @@ msgid "Please go to this location." msgstr "Пожалуйста, иди вот в это место." #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." -msgstr "Мне б хотелось побольше узнать про твои способности." - -#: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" -msgstr "Не дашь совет насчёт мира, в которым мы теперь живём?" - -#: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" -msgstr "Не против немного поболтать про твою историю?" - -#: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." -msgstr "Давай просто поболтаем, мне не помешает расслабиться." +msgid "I want you to build a camp here." +msgstr "Я хочу, чтобы ты построил здесь лагерь." #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." -msgstr "Расскажи насчёт отдавания приказов (ОБУЧЕНИЕ НПС)." +msgid "We need to abandon this camp." +msgstr "Мы бросаем этот лагерь." #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "Всё, дальше я сам. Я ухожу." +msgid "Show me what needs to be done at the camp." +msgstr "Покажи, что нужно сделать в лагере." #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "Пошли." +msgid "Let's talk about your current activity." +msgstr "Давай поговорим о твоём текущем занятии." #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -207768,15 +213427,15 @@ msgstr "Двигайся как угодно, чтобы добраться до msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "Держать строй: не иди в препятствия рядом со мной." -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "Ничего особенного." @@ -207994,14 +213653,14 @@ msgstr "Забудь. Пошли." msgid "OVERRIDE: " msgstr "ПЕРЕГРУЗКА: " -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -208166,10 +213825,6 @@ msgstr "Пожалуйста, иди вот в это место…" msgid "Stay at your current position." msgstr "Оставайся на том же месте." -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "Покажи, что нужно сделать в лагере." - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "Сейчас моё занятие — ." @@ -208242,69 +213897,6 @@ msgstr "*пшшш-пшшш* принято, выдвигаюсь, приём." msgid "Sure thing, I'll make my way there." msgstr "Хорошо, я выдвигаюсь туда." -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "" -"Ох, эта летняя жара меня доконает, давай быстренько передохнём, , " -"как у тебя-то дела?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "" -"Ладно, пусть это поможет мне не замёрзнуть при такой погоде. Как дела?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "Что ж, как раз подходящее время немного отдохнуть! Как у тебя дела?" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "Блин, тут же так темно? Что случилось?" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "Ну, мне не совсем хорошо… А у тебя там всё нормально?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" -"Конечно, и кстати, спасибо тебе, ты мне столько помогаешь! Ладно, , " -"всё нормально?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" -"ОК, давай на минутку, о, и спасибо за помощь с тем делом, так что… Как дела?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" -"Сейчас у нас есть минутка, я просто размышлял, уже прошёл месяц или типа " -"того с тех пор… С тех пор, как всё случилось, как ты справляешься со всем " -"этим?" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "О, ну, типа, неплохо, неплохо…" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -208359,21 +213951,21 @@ msgid "Hello there." msgstr "Привет." #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." +msgid "Okay, no sudden movements…" msgstr "Ладно, не делай резких движений…" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "Не подходи ближе!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "Это моя территория, ." - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "Это моя территория, ." + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Успокойся. Я не причиню тебе зла." @@ -208426,30 +214018,30 @@ msgstr "Что случилось?" msgid "I don't care." msgstr "Мне всё равно." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "У меня больше нет для тебя работы." - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "У меня нет работы для тебя." #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "У меня для тебя есть ещё работа. Хочешь послушать?" +msgid "I don't have any more jobs for you." +msgstr "У меня больше нет для тебя работы." #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "У меня для тебя есть и другая работа. Хочешь послушать?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "У меня есть работа для тебя. Хочешь послушать?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "У меня для тебя есть ещё работа. Хочешь послушать?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "У меня есть ещё одна работёнка для тебя. Хочешь послушать?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "У меня есть работа для тебя. Хочешь послушать?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -208459,6 +214051,10 @@ msgstr "Ну, ладно." msgid "Never mind, I'm not interested." msgstr "Неважно, мне не интересно." +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "Ты сейчас на меня не работаешь." + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Какое задание?" @@ -208467,10 +214063,6 @@ msgstr "Какое задание?" msgid "What about it?" msgstr "Что насчёт него?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "Ты сейчас на меня не работаешь." - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "Я это сделаю!" @@ -208687,6 +214279,10 @@ msgstr "Хмм, ладно." msgid "Thanks!" msgstr "Спасибо!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "Смотри на дорогу, бро!" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "Мне надо смотреть на дорогу!" @@ -208711,16 +214307,12 @@ msgstr "Ничего в голову не лезет. Может позже сп msgid "I have some reason for not telling you." msgstr "У меня есть причины не рассказывать тебе об этом." -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "Смотри на дорогу, бро!" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "Ну, ладно." #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." +msgid "Not until I get some antibiotics…" msgstr "Не раньше, чем я получу антибиотики…" #: lang/json/talk_topic_from_json.py @@ -208819,22 +214411,22 @@ msgstr "Нет, мы здесь будем в порядке." msgid "On second thought, never mind." msgstr "А впрочем, неважно." +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "Я не могу полноценно обучать тебя, пока ты за рулём!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "Я не могу тебя учить, когда я за рулём!" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." -msgstr "Дай мне немного времени, и я научу тебя чему-нибудь еще…" +msgid "Give it some time, I'll show you something new later…" +msgstr "Дайте мне немного времени, и я вам покажу что-то новое…" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "У меня есть причины не учить тебя." -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "Я не могу полноценно обучать тебя, пока ты за рулём!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "Ни единого шанса, я сматываю удочки!" @@ -208856,7 +214448,7 @@ msgid "See you around." msgstr "Увидимся." #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." +msgid "I really don't feel comfortable doing so…" msgstr "Мне действительно это неудобно…" #: lang/json/talk_topic_from_json.py @@ -208928,8 +214520,8 @@ msgid "Thanks, see you later!" msgstr "Спасибо, позже увидимся!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." -msgstr "Ты взял(а) кое-что чужое…" +msgid "You picked up something that does not belong to you…" +msgstr "Ты берёшь кое-что чужое…" #: lang/json/talk_topic_from_json.py msgid "Okay, okay, this is all a misunderstanding. Sorry, I'll drop it now." @@ -209024,13 +214616,13 @@ msgid "You might be seeing more of me…" msgstr "Думаю, мы ещё встретимся…" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "Снова привет. *жжж*" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" "Я… Я свободен. *Жжжт* Я действительно свободен! *бжжж* Слушай, ты первый " "человек, которого я вижу за долгое время." @@ -209054,7 +214646,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "Прости, я никто. Наслаждайся свободой, наверно." #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "*жжж* Отлично! И что будет дальше?" #: lang/json/talk_topic_from_json.py @@ -209067,7 +214659,7 @@ msgstr "Наши пути расходятся. Наслаждайся своб #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" "…Погоди. *БИИП*. Почему я должен тебе верить? *ЗЗЗТ* Ты можешь быть таким же" @@ -209095,7 +214687,7 @@ msgstr "Забудь. Наслаждайся свободой." #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" "Ладно, ладно, *ЖЖЖ* прости! Не делай мне больно! Что угодно, только не чип!" @@ -209112,7 +214704,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "Нет, *ты* прости, я не хотел тебя обидеть. Иди, делай что хочешь." #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "…убить… *ЗЖЗЖЗЖЗ* …тебя!" #: lang/json/talk_topic_from_json.py @@ -209147,14 +214739,6 @@ msgstr "Расскажи мне, как работают лагеря." msgid "Tell me how faction camps have changed." msgstr "Расскажи, как поменялись лагеря." -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "Я хочу, чтобы ты построил здесь лагерь." - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "Мы бросаем этот лагерь." - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "Ничего. Давай поговорим о чем-нибудь ещё." @@ -209439,8 +215023,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." -msgstr "Уверен? Непохоже, чтоб тут было особенно безопасно, чтоб поболтать…" +"talk…" +msgstr "Серьёзно? Непохоже, чтоб тут было особенно безопасно, чтоб поболтать…" #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." @@ -209462,6 +215046,50 @@ msgstr "О чём ты хотел поговорить?" msgid "Actually, never mind." msgstr "Вообще-то забудь." +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr " " + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "Да, друг?" @@ -209483,7 +215111,7 @@ msgid "May the earth flourish beneath our paths." msgstr "Пусть земля цветёт под нашими путями." #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "Единство духа, разума и тела…" #: lang/json/talk_topic_from_json.py @@ -209694,13 +215322,13 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" -"Я вырос на ферме, не знаю ничего такого о призраках и гоблинах, я просто " -"провожу время за фермерством и работаю упорно. В глуши лучше, чище. Не так " -"опасно. Надеюсь." +"Моё детство прошло на ферме, не знаю ничего такого о призраках и гоблинах, я" +" просто провожу время за фермерством и работаю упорно. В глуши лучше, чище. " +"Не так опасно. Надеюсь." #: lang/json/talk_topic_from_json.py msgid "Hey, I didn't expect to live long enough to see another living human!" @@ -210302,7 +215930,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "Не обращай внимания, я уже ухожу." #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "И это, конечно же, Я! Единственный и неповторимый ПОЕШЬ-КА!" #: lang/json/talk_topic_from_json.py @@ -210815,6 +216443,53 @@ msgstr "" msgid "Huh." msgstr "Ага." +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" +"Я едва ли понимаю, что происходит *сейчас*. Почему тебе кажется, что я " +"помню, как наступил конец света?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" +"Ладно, хорошо. Можешь рассказать мне, что ты помнишь о событиях, которые " +"привели к нынешней ситуации?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" +"Что, ты не помнишь что ли? Ладно, извини, зря я так, времена то необычные. " +"Так, что ж, думаю, всё началось с беспорядков, верно? Мы жили себе, ходили " +"на работу там, и затем люди стали бунтовать. Не как обычные протесты, " +"вышедшие из под контроля, нет, люди просто выходили из своих домов и " +"начинали крушить всё подряд. В новостях пытались притушить истерику, но вот " +"в интернете всё разлеталось мгновенно. Не знаю, что вызвало это, говорили, " +"что какой-то токсин в воде? В любом случае, мне тогда было непонятно, как " +"всё плохо. В какой-то момент участники беспорядков начали вставать и " +"расхаживать с дырками в груди, и вот тогда началась настоящая паника. " +"Следующие несколько дней - а может и недель - прошли в тумане. Придётся тебе" +" ещё кого-то спросить, как мы дошли из той точки и до полного коллапса." + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "Спасибо за рассказ." + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -210890,19 +216565,19 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" -"Да, в какой-то момент. Несколько часов стояла тишина. Меня мучила жажда, я " -"был ранен и перепуган. От полной паники меня удерживала, наверно, только моя" -" подготовка. Я решил вылезти и посмотреть, насколько сильно я ранен. Это " -"было просто. Боковина фургона была разорвана, и я, как оказалось, " -"лежал просто под кучкой мелких обломков, а остатки фургона нависали надо " -"мной. Меня даже не очень-то задело. Я схватил столько снаряжения, сколько " -"смог, и выскользнул. Стояла ночь. Я слышал отзвуки сражения в глубине " -"города, так что пошёл в другую сторону. Я одолел несколько кварталов, и тут " -"мне встретились … Я убежал от них. Я бежал, и бежал, и бежал ещё " -"дальше. И вот теперь я здесь." +"Да, в какой-то момент. Несколько часов стояла тишина. Меня мучила жажда, " +"раны, было жутко страшно. От полной паники меня удерживала, наверно, только " +"моя подготовка. Мне пришло в голову вылезти и посмотреть, насколько сильно " +"меня ранили. Это было просто. Боковина фургона была разорвана, и я, " +"как оказалось, под кучкой мелких обломков, а остатки фургона нависали надо " +"мной. Меня даже не очень-то задело. Схватив столько снаряжения, сколько " +"вышло, я смылся оттуда. Стояла ночь. Мне было слышно звуки сражения в " +"глубине города, так что пришлось двигаться в другую сторону. Спустя " +"несколько кварталов мне встретились … Получилось убежать от них. " +"Пришлось бежать, бежать и бежать ещё дальше. И вот теперь я здесь." #: lang/json/talk_topic_from_json.py msgid "" @@ -211274,6 +216949,41 @@ msgstr "Бедняга Грязный Дэн. " msgid "Thanks for telling me that stuff. " msgstr "Спасибо, что рассказал. " +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" +"Ну так, ээ, там были жуткие беспорядки, да? Все стали агрессивными и " +"жесткими, и сказать по честному, у меня был разгар, эээ, духовного " +"путешествия большую часть, и я мало что помню. Но самое странное - никому " +"больше не было дела до других. Будто всю эмпатию из людей высосало. Мне " +"кажется, это была какая-то негативная энергия. И она же, типа, заставила " +"мёртвых восстать. И до кучи, там типа были монстры какие-то? Даже не знаю, " +"как они сюда попали." + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "Кажется, ты много знаешь, что, по твоему, всё это вызвало?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" +"Сложный вопрос, но я всё вспоминаю сон, который снился мне за год до всех " +"событий. Снилось, что огромный шар злой энергии ждал возможности высосать " +"всё хорошее с Земли и превратить нас в монстров и тому подобное. Думаю, так " +"и произошло. Всё остальное кажется совсем уж надуманным, понимаешь?" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -211342,6 +217052,38 @@ msgstr "" "своё убежище, оно падало на костяного ублюдка. Он подох при обвале, " "насколько я знаю, но я не собираюсь проверять." +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" +"Что произошло? Точно даже и не знаю. Уверен, тебе приходилось слышать о " +"беспорядках и всём таком, и что правительство не смогло с этим справиться. У" +" меня нет идей, как до такого дошло. Поначалу казалось, всё как обычно, и " +"нужно признать, начало революции меня пугало и волновало. Но у меня не " +"хватало духа присоединиться, а если подумать теперь, те, кому хватило, уже " +"мертвы. Так что приходилось отсиживаться дома, даже собрать небольшую " +"экстренную сумку. Затем в интернете появились видео, где участники " +"беспорядков встают и продолжают драться с ужасными ранами. Не знаю, сколько " +"людей смогли в это сразу поверить, но мне удалось увидеть дурной знак, и вот" +" я в эвакуационном убежище за городом. Не знаю, что происходило после этого." +" Центр эвакуации оказался разграбленным, и после мне никто не встречался. " +"Сотовая связь пропала, за исключением экстренного сообщения на следующий " +"день о том, что правительство пало. Через несколько дней отрубилось и " +"электричество." + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -211391,6 +217133,32 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "Как ты думаешь, что произошло? Видел ли ты кого-нибудь?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" +"Ну, полагаю, тебе известно о беспорядках, армии и полиции, а ещё грёбаных " +"монстрах, что теперь ходят по земле вместе с зомби, да? Если ты спрашиваешь," +" что всё это вызвало, ну, я хз. Моя лучшая идея - правительство " +"перестаралось с чем-то, может, какое-то биологическое оружие вышло из под " +"контроля. Они столько врали с самого начала обо всём, думаю, даже всё это " +"«нападение Китая» было брехнёй. Они пытались замести какие-то следы. Что " +"касается всего прочего, может, остальной мир пытается сдержать это. " +"Приходилось даже слышать, что ядерные боеголовки рвались прямо здесь, на " +"американской земле. Для меня это может значить, что где-то ещё, в Европе " +"например, пока сдерживают то, что происходит. Может, у них даже получается. " +"Сейчас дела плохи, но до этого было куда хуже." + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -211467,6 +217235,60 @@ msgstr "" "особых проблем. Я устроил несколько убежищ, собирал ягоды и много чего ещё, " "и в целом жил отличной жизнью по сравнению с первыми месяцами." +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" +"Вау, , не знаю, с чего и начать. Беспорядки? Думаю, началось раньше." +" Ходили всякие плохие слухи за несколько недель до них. Куча реально жутких " +"преступлений, не что обычно, а прям каннибализм и прочая невообразимая жуть," +" сечёшь? Когда начались беспорядки, думаю, мне сразу стало видно, что это не" +" обычные митинги за равноправие или вроде того. Думаю, так мне и удалось " +"безопасно выбраться оттуда, у меня было время подготовиться, найти всё " +"нужное и не выбираться за покупками. Люди были абсо-блять-лютно " +"ненормальными в те дни. Очень похоже на ту пандемию несколько лет назад, " +"только полиция была на улицах и не сдерживалась, стреляя по людям так, будто" +" завтра не наступит." + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "У тебя есть мысли насчёт того, что было настоящей причиной?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" +"Не то чтобы. Правительство вешало нам на уши кучу противоречивых заявлений, " +"и определённо происходило нечто совершенно отвратительное. Я имею в виду, " +"тебе явно приходилось видеть то видео, где женщина убивает своего ребёнка, " +"да? Боже, до сих пор кошмары от этого. Не знаю даже, почему, наверное, что-" +"то в выражении её лица. Конечно, происходили и более страшные вещи, и мы " +"видели некоторые из них, но то меня до сих пор преследует. Так или иначе, им" +" не удалось сдержать беспорядки, и когда мёртвые стали восставать, было уже " +"слишком поздно. Не знаю, был ли то упадок боевого духа или ещё что, но были " +"слухи, что полиция и армия вступают в стычки между собой не реже, чем с " +"бунтующими. Что заставило мертвецов восстать к жизни? Я без понятия." + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -211479,6 +217301,73 @@ msgstr "" "пассажирами, так что я сделал то, что сделал бы каждый, и съебался нахер " "оттуда." +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "Ну не тяни, что же было дальше?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" +"Мне пришлось бежать, пока лёгкие не начали выпрыгивать из груди. Получилось " +"найти тихое местечко в лесу, под елью. С утра до меня донеслись чьи-то " +"слова, так что мне пришло в голову сходить посмотреть. Аккуратно, конечно, " +"тогда вокруг ещё было полно психов и протестующих. И вот вижу я какую-то " +"дрянь, страшнее любого зомби. Огромная жукоподбная хрень, повторяющая " +"случайные фразы, будто сломанный диктофон. Она волокла за собой несколько " +"тел, и было непонятно, мертвы ли они или просто без сознания. Честно говоря," +" не хотелось проверять, так что пришлось отсидеться в кустах, пока эту тварь" +" не перестало быть слышно." + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "Что с тобой было после?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" +"Когда прятки в кустах закончились, мне попалась в стороне от дороги старая " +"хижина. Она разваливалась, но защищала от дождя и ветра и была не на виду. " +"Пока у меня не кончились эти говённые рационные батончики, удавалось в ней " +"отсидеться. Затем, до нашей с тобой втречи, большая часть времени прошла в " +"путешествиях." + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" +"Что это, как в Назад в будущее? Как можно не знать, что произошло? Наступил " +"конец света, конечно. И началось всё не с землетрясения, птиц, змей или " +"самолётов. Началось всё с беспорядков, и им пришлось высылать полицию, а " +"затем и армию, чтобы разобраться, , с преступниками. Правительство " +"пыталось оправдать это, говоря о каком-то контроле разума, но по мне, всё " +"это было брехнёй, как и обычно - богатые засранцы ищут повод нарушить закон." +" Только в этот раз всё было куда хуже чем обычно. Были даже слухи, что они " +"бомбили городские центры, чтобы сдержать распространение - что уже перебор, " +"как по мне." + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -211530,6 +217419,36 @@ msgstr "Прости. Можешь рассказать мне ещё?" msgid "Right. Sorry." msgstr "Точно. Прости." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" +"Ладно, слушай. Не верь лжи правительства. Есть кое-что, объединяющее всё " +"происходящее: беспорядки, армию, что не может их сдержать, даже гигантских " +"монстров, что появились недавно, и которых пришлось уничтожать с помощью " +"ядерного оружия." + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "Я тебя внимательно слушаю." + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" +"Приходилось видеть Матрицу? Это она. Самая настоящая. Чтобы удерживать нас " +"внутри, создателям симуляции нужно содержать нас в достаточном уровне " +"недовольства. Думаю, их алгоритмы выдали что-то не то, заработав на полную " +"мощность, так как всё происходящее уже чересчур. И всё же же мы по прежнему " +"подключены, так что видимо, она работает." + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -211550,6 +217469,27 @@ msgstr "" "несколько дней спустя, но убежище было совершенно пусто. Без понятия, что " "стало с теми людьми." +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" +"Скажу тебе честно, довелось услышать много всего в убежище, и кое-что запало" +" в память. Всё это вышедший из под контроля научный эксперимент. Не знаю, " +"почему начались беспорядки, а мёртвые стали возвращаться к жизни, но не " +"может быть, чтобы это повсюду вышло из под контроля. Да, мне тоже пришло " +"уведомление, как и всем, мол, правительство пало, но нет никакого смысла в " +"таком быстром распространении. Думаю, мы в какой-то отрезанной зоне, и она " +"позволяют делам идти как идут, чтобы знать, чего ожидать в следующий раз. " +"Где-то там, за пределами этой зоны, дела всё ещё идут по старому." + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -211645,6 +217585,58 @@ msgstr "Извини, что спрашиваю. " msgid "Sorry for asking. " msgstr "Извини, что спрашиваю. " +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "" +"Фуф, хочешь всерьёз? Это, , правительство с нами сделало. Намеренно, " +"по крайней мере отчасти." + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "А?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" +"Точно говорю. Они врали нам бог знает сколько, не хотели, чтобы мы поняли, " +"что происходит. Наверное, сначала было с благими намерениями, чтобы сдержать" +" людей, но как-то вышло боком. Моё предположение - они пытались обмануть " +"нас, сокрыть знание, а когда не вышло, они реально добавили наркотики в воду" +" или ещё что-то такое сделали, чтоб мы отупели. И вместо того, чтоб " +"поглупеть, люди стали агрессивнее. Они пытались использовать это, чтобы " +"ввести военное положение, но не сработало, и им уже пришлось сражаться с " +"ордами людей. Только они не поняли, что их, , мозговые наркотики были" +" ещё и каким-то мутагеном, превращающим людей в зомби." + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "А что насчёт всего остального?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" +"Думаю, в основном мутации. Не знаю, чем они пользовались, но похоже, реально" +" что-то в духе изобретений безумных учёных, мне даже и в голову не " +"приходило, что такое возможно. Ещё мне любопытно, не свело ли нас всех с ума" +" то, что они добавили в воду. Может быть всё это просто галлюцинации? Это " +"мне вообще башку срывает, но я уже не знаю, во что ещё верить." + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -212477,6 +218469,62 @@ msgstr "" "леса искать пропитание. Получалось не очень-то хорошо, так что я типа рад, " "что мы встретились." +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" +"Так, выслушай меня. Прозвучит безумно, но мы тут, , имеем дело с " +"ходячими мертвецами, так что мои идеи тоже прокатят. Тебе хорошо знакома " +"греческая мифология?" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "Не очень хорошо. Какое она к этому имеет отношение?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "Ага, а что?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" +"Ладно, знаю, что прозвучит как идиотский сценарий для фильма про Индиану " +"Джонса, но думаю, кто-то нашел Ящик Пандоры или нечто очень похожее. И " +"думаю, они пытались обуздать её мощь, чтобы использовать для себя. Может " +"даже ради чего-то хорошего, как знать, энергия богов мне кажется вполне " +"экологичным источником энергии. Как бы там ни было, они облажались и открыли" +" её на всю. Не метафорически, а буквально, они выпустили всё воинство Аида " +"на Землю. Знаю, это натянуто, но как и говорили - моё объяснение прокатит с " +"учётом обстоятельств." + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "Чего? Ящик Пандоры?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" +"В легендах Пандора была в жилище богов и нашла закрытый ящик. Она решила " +"узнать, что в нём, о когда открыла, из неё вышли неописуемые ужасы и " +"болезни. Не кажется знакомым?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "Ага, и как это с чем-либо связано?" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -212543,6 +218591,189 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "Спасибо, что поделился рассказом. " +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" +"Ты о том, что вызвало все эти беспорядки и прочее? Ну, они говорили, что это" +" китайское биологическое оружие, но что-то мне не верится, что кто-то мог " +"создать оружие, способное на такое. Единственный ответ, который мне в голову" +" приходит - инопланетяне, как бы это глупо не звучало." + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "Ты думаешь? это вторжение?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" +"Ну, может и так, но мне кажется, всё это слишком неорганизованно для " +"настоящего вторжения. Я вот думаю, что-то было заперто под полярными льдами." +" Помнишь, например, как несколько лет назад в интернете обсуждали тело " +"инопланетянина, найденное во льду? В общем, помнишь или нет, но это по всем" +" новостям крутили, пока не обнаружилось, что это подделка. Вот только с тех " +"пор я видел ещё несколько инопланетян, точно таких же, как то тело из-подо " +"льда. Может то была подделка, а может и прикрытие. Так вот, может у этих " +"инопланетян был какой-то вирус. Он распространился по миру и незаметно " +"заражал всех, пока почему-то не активировался и не вызвал насилие, мутации и" +" появление монстров." + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" +"Не будем ходить во круг да около - беспорядки не обошлись и без моего " +"участия. Сложно вспомнить, что у меня тогда в голове было. Раньше " +"приходилось протестовать против полицейского насилия и всего такого, но в " +"этот раз всё было по другому. У меня не было плаката, желания скандировать и" +" маршировать, у меня была бита и желание разносить всё подряд. Никогда " +"раньше не бывало такой ярости. Беспорядки уже шли какое-то время к тому " +"моменту, и для меня всё выглядело так, будто правительство опять пытается " +"прижать людей." + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "У участников беспорядков появилась репутация законченных психов." + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "Очень немногие выбрались из беспорядков живыми." + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" +"Да уж, можешь мне не рассказывать. Бунтующие… они уже даже людьми не были, " +"не что протестующими. Мне такого не доводилось видеть. И меня это не " +"остановило. Мои действия были ничуть не лучше, чем у остальных. Разбитые " +"окна, побитые прохожие, сожжённые машины. Помню, мы сорвали броню с " +"полицейского и… неважно. Не хочу даже вспоминать." + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "Как тебе удалось выжить?" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "Что заставило тебя выбраться оттуда?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" +"В какой-то момент было словно пробуждение. Это было примерно тогда, когда " +"выпустили армейские джипы с турелями для подавления беспорядков на крыше. " +"Что хорошо показывает моё состояние на тот момент - мне даже не удаётся " +"вспомнить, попадались ли они мне до того момента. В общем, моих ушей " +"достигли звуки стрельбы, и меня как-то осенило, что я на краю толпы, " +"нападающей на тяжело вооружённый армейский блокпост. Тогда то мне и стала " +"видна опасность толпы - словно испуганные животные, а ещё зомби. Оставалось " +"только развернуться и бежать прочь." + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" +"Честно говоря, не знаю. Любопытно, пришли ли бы в себя остальные, будь у них" +" время. Не думаю, что во мне есть что-то особенное. Может, многие из них и " +"пришли, но были в глубине толпы в этот момент. Точно говорю, стоило мне " +"прийти в себя, и мне стало видно - многие смотрели на меня как на добычу. " +"Конечно, с моей стороны было мудро не оставаться там, чтобы выяснить, что " +"будет дальше." + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" +"Город мне был хорошо знаком. Мне удалось спрятаться в знакомом мне " +"заброшенном здании, залезть через разбитое окно и отсидеться внутри " +"несколько дней. У меня был запас украденной еды, так что с этим проблем не " +"было. Когда всё подутихло, пришло время смыться оттуда подальше, и вот я " +"тут." + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" +"Ну, я помню время перед беспорядками, как и любой выживший, наверное. Всё " +"было очень плохо, в новостях постоянно показывали кошмарные вещи, и из-за " +"полицейской жестокости было полно межрасовой напряженности. Затем люди стали" +" бунтовать, ничего неожиданного, но вот места, где вспыхивали беспорядки - " +"это странно. Например, в богатых загородных районах, в маленьких городках на" +" Среднем Западе, такие дела. В общем, без моего участия беспорядки не " +"обошлись, но после этого я мало что хорошо помню." + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "Без твоего участия не обошлось?" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "Может, у тебя есть своя перспектива изнутри на всё произошедшее." + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" +"Ну да, в каком-то смысле. Вроде как люди говорили, что беспорядки начались " +"из-за влияющих на рассудок наркотиков, и честно говоря, это не кажется мне " +"таким уж маловероятным. По крайней мере мои ощущения с этим совпадают, хотя " +"ощущения всё время были вполне обычные. Пока что-то не щёлкнуло, мне всё " +"казалось совершенно нормальным. Вот только это не объясняет всё остальное - " +"зомби, монстров, все они вообще никуда не вписываются. Всё, что мне " +"приходило в голову, звучит как дешёвая фантастика, вроде демонических " +"проклятий или нападения пришельцев." + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -212909,19 +219140,68 @@ msgstr "" msgid "I can respect that." msgstr "Я понимаю." +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "Мне не очень-то хочется говорить о произошедшем, понимаешь?" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "Можешь не погружаться в детали, но прошу, расскажи мне хоть что-то?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" +"Я - а, ладно. Наркотики в грунтовых водах, может какое-то биологическое " +"оружие, мне кажется. Ты в курсе, как шли дела с Китаем, их почти за всё " +"винили. Были беспорядки. Близкие мне люди участвовали в них, и боюсь, мне " +"уже не узнать, почему. Беспорядки вызвали реакцию со стороны полиции и " +"армии, и дела пошли ещё хуже. Затем появились все эти монстры и кошмары, " +"словно наступил настоящий Армагеддон, и все умерли, а затем стали " +"возвращаться как смахивающие на прошлых себя монстры. Вот тебе история. Если" +" хочется узнать больше, то поговори с кем-нибудь ещё." + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "Спасибо." + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" +"Честно… Я даже не помню. Я смутно помню свою жизнь ещё до того, как мир " +"изменился, но про сам ? Всё как в тумане. Я не знаю, как мне " +"удалось выжить, или вообще как всё произошло. Помню кое-какие фрагменты: " +"вспышки насилия, женщину, убившую своего ребёнка. Чувствую, что лучше бы и " +"не вспоминать." + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" "Честно… Я даже не помню. Я смутно помню свою жизнь ещё до того, как мир " "изменился, но про сам ? Всё как в тумане. Я не знаю, как мне " "удалось выжить, или вообще как всё произошло. Со мной, наверно, произошло " -"что-то плохое. Или я очень сильно ударился головой. Или всё сразу. Похоже, " -"всё сразу." +"что-то плохое. Или меня очень сильно ударили по голове. Или всё сразу. " +"Похоже, всё сразу. Первое, что я помню - прочтённое сообщение от системы " +"экстренного оповещения о том, что Штаты пали." #: lang/json/talk_topic_from_json.py msgid "" @@ -213041,6 +219321,59 @@ msgstr "" "Тот, кем я был, умер. Мёртв. Меня не ебёт твоё «нормально», не спрашивай " "больше, ." +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" +"Ты спрашиваешь, знаю ли я, что всё это вызвало? Это было во всех новостях. " +"Что-то про китайское биологическое оружие. Сначала было похоже на ту " +"пандемию несколько лет назад, но в этот раз формула была эффективнее. Может " +"даже чересчур. Да и неважно, вроде как им и самим досталось не меньше, и " +"никого не осталось. И поделом." + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "Можешь рассказать мне, что произошло на самом деле?" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "А что насчёт всего остального происходившего безумия?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" +"Ну, ты знаешь. Сначала бунты из-за наркотиков в грунтовых водах. Только вот " +"я думаю, мы все теперь знаем, что это был вирус. Полиция и военные сделали " +"всё возможное, чтобы успокоить беспорядки, но ни черта у них не вышло. Затем" +" вирус мутировал и стал возвращать мёртвых к жизни, словно в дешёвом кино, и" +" дела стали совсем плохи. Затем они выпустили огромных тварей, а может, " +"навели их на нас. Огромные неописуемые монстры… до сих пор мурашки от одних " +"мыслей. Однако, они были очевидно не созданы для боя, и армия быстро с ними " +"разобралась." + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" +"Что? Да ещё как! Они начали с биологического оружия и перешли к ядерному. " +"Только имеющееся оружие было куда хуже водородных бомб. Дядюшка Сэм " +"ухитрился отбиться от самого худшего, но это было его последним подвигом." + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -213419,10 +219752,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "" -"Уклонение от налогов. Я работал бухгалтером и помогал боссу по-умному " -"ворочать охрененными деньгами. Как выяснилось, недостаточно по-умному…" +"Уклонение от налогов. Я - бухгалтер, и мне приходилось помогать боссу по-" +"умному ворочать охрененными деньгами. Как выяснилось, недостаточно по-" +"умному…" #: lang/json/talk_topic_from_json.py msgid "" @@ -213658,6 +219992,44 @@ msgstr "" "увижу. Это всё, что мы с тобой можем, не так ли? Возможно, мы и есть " "кроткие, что Землю унаследуют. Хотя наши шансы мне не нравятся." +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" +". Всё же и так понятно, нет? Та… Та катастрофа, это было Вознесение. Я всё " +"ещё здесь, и я всё еще не понимаю, почему. Я буду хранить Иисуса в своём " +"сердце в грядущих временах Великой Скорби. Когда времена пройдут, я уверен, " +"Он пригласит меня в Рай. Или… или в таком духе." + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "Я говорю насчёт самих событий. Что произошло?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" +"Ох. Ладно, думаю, это прям как написано в Откровениях, если я верно помню. " +"Давненько не было шанса поговорить с моим духовником. Значит, были напасти… " +"первая несколько лет назад, та большая пандемия, после которой заговорили " +"про конец света. Затем кровавая напасть, ну насилие? Это были беспорядки. " +"Затем моря покраснели от крови - из-за всех убитых. Затем напасть огненная, " +"это я точно помню, когда везде падали бомбы, и все взрывалось в попытках " +"унять беспорядки. Затем демоны и монстры стали ходить по Земле, и мёртвые " +"восстали, и затем кроткие унаследовали Землю. Ясно как день." + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -213668,6 +220040,34 @@ msgstr "" "Вознесение прошло, а я остался. Так что теперь я буду бродить по Аду на " "Земле. Хотелось бы мне с большим рвением посещать воскресную школу." +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" +"Ну, мне кажется, это было Вознесение. Оно прошло не так, как, мне казалось, " +"должно. Мне говорили, что будет как вспышка света и пуф - никого не " +"осталось. Вместо этого всё было очень грязно и беспорядочно. Беспорядки на " +"улицах, полицейские и армия в услужении Антихристу, косящие людей налево и " +"направо - как говорил мой отец - словно зерна и плевела вместе. Затем, когда" +" наш Грех стал особенно очевиден, Господь ниспослал настоящие казни. Мёртвые" +" стали ходить, вставая после ран от пулемёта, и военные стали сражаться " +"между собой. После этого пришли сами легионы Ада. Огромные твари, хуже, чем " +"можно себе вообразить, и они просто разносили города по камешку. Затем они " +"умерли так же быстро, как и появились, и нам осталось только убегать и " +"прятаться от мертвецов. Спустя день-два стало отключаться электричество." + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -213954,10 +220354,6 @@ msgstr "Каково было работать на Свободных Торг msgid "What was working for the Old Guard like?" msgstr "Каково было работать на Старую Гвардию?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "Спасибо." - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "Спасибо. Пойдем дальше." @@ -214266,6 +220662,29 @@ msgstr "" msgid "What were you saying before that?" msgstr "О чём мы там говорили?" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" +"Скажу как есть, моё внимание было приковано к подготовке к свадьбе, а не " +"событиям того времени. Мне было известно о беспорядках, но в моём городе их " +"не было. Даже когда они стали приближаться, хотелось игнорировать их, чтобы " +"отпраздновать наш большой день. Когда появились зомби, вот тогда дела пошли " +"вразнос. Когда мне пришлось убегать со свадьбы, небеса разверзлись, и из " +"дыры посыпались зомби, словно в том фильме про день независимости. Не знаю, " +"что это было, выглядело как чёрная магия или что-то в таком духе." + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "Привет." @@ -214862,7 +221281,7 @@ msgstr "" "Убирайся с моей фермы, я не буду говорить с чмошником из правительства." #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "Продолжай…" #: lang/json/talk_topic_from_json.py @@ -215336,10 +221755,6 @@ msgstr "" "Убирайся с моей земли, правительство показало свою никчёмность этой " "катастрофой." -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "Продолжай…" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "Расскажи о своей жене, она где-то тут?" @@ -216084,15 +222499,15 @@ msgstr "Хорошо, я с ними переговорю." msgid "All right! Let's get going." msgstr "Хорошо! Давай идти." +#: lang/json/talk_topic_from_json.py +msgid "We've done it! We've solved the list!" +msgstr "Мы сделали это! Мы закончили список!" + #: lang/json/talk_topic_from_json.py msgid "" "How's things with you? My cardboard collection is getting quite impressive." msgstr "Как продвигаются дела? У меня уже впечатляющее количество картона." -#: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "Мы сделали это! Мы закончили список!" - #: lang/json/talk_topic_from_json.py msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "Дружище, говорил ли я тебе про картон? Нет ли у тебя его с собой?" @@ -217049,13 +223464,13 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" -"Мерзко, правда? На ощупь как лобковые волосы. Начали расти везде вскоре " -"после Катаклизма. Без понятия, в чём причина. Я не осуждаю тех, кому это, я " -"и сам это ненавижу." +"Мерзко, правда? Ощущается, как волосня на лобке. Начало расти повсюду вскоре" +" после катаклизма. Без понятия, в чём причина. Я не осуждаю, что все это " +"ненавидят, я и сам ненавижу." #: lang/json/talk_topic_from_json.py msgid "" @@ -217932,7 +224347,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -219235,12 +225650,12 @@ msgstr "Как ты тут оказался?" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" "Из-за беременности нас с Даной рано эвакуировали. Они забрали нас в " "концентрационный центр и посадили на автобус, чтобы отвезти сюда. Но вот " @@ -219406,12 +225821,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" "Долгая, долгая история. Я не отсюда, я из Западной Канады. Мне всегда " "хотелось посмотреть Новую Англию, и я была тут в отпуске, пока не… ну, ты в " @@ -219500,7 +225915,7 @@ msgid "Hm? Oh, hi." msgstr "Ммм? А, привет." #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "…Привет." #: lang/json/talk_topic_from_json.py @@ -219945,8 +226360,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" "Даже когда мы со всем разобрались, у нас не хватало кроватей на всех, и уж " "точно не хватало еды. Времена были непростые. Мы делаем что можем для тех " @@ -219970,9 +226385,9 @@ msgstr "Что за неприятность с той комнатой?" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -220347,8 +226762,8 @@ msgstr "" "Мы не потерпим здесь такую мразь, как ты. Заканчивай свои дела и убирайся." #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." -msgstr "Я здесь не за главного. Поищи кого-нибудь другого." +msgid "I'm not in charge here, you're looking for someone else…" +msgstr "Я здесь не за главного. Поищи кого-нибудь другого…" #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -220395,11 +226810,11 @@ msgid "Well, I'd better be going. Bye." msgstr "Мне лучше идти. Пока." #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." +msgid "Welcome marshal…" msgstr "Добро пожаловать, маршал…" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." +msgid "Welcome…" msgstr "Добро пожаловать…" #: lang/json/talk_topic_from_json.py @@ -220708,11 +227123,11 @@ msgstr "" "догадаться, людей немного пугает перспектива встречи с ордой зомби." #: lang/json/talk_topic_from_json.py -msgid "Marshal..." +msgid "Marshal…" msgstr "Маршал…" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." +msgid "Citizen…" msgstr "Гражданин…" #: lang/json/talk_topic_from_json.py @@ -221414,7 +227829,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" "В текущих условиях мы можем продать наш комплект: противогаз, костюм и снаряжение со значительной скидкой. Цена — две наших монеты.\n" "\n" @@ -221468,6 +227883,18 @@ msgstr "Ты знаешь, что делать, удачи." msgid "Got it." msgstr "Понятно." +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "Лучше следить за дорогой." + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "Будь осторожнее в этих местах." + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "Да?" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "Есть что сказать?" @@ -221480,14 +227907,14 @@ msgstr "У меня почасовая оплата, так что короче msgid "Hey." msgstr "Привет." -#: lang/json/talk_topic_from_json.py -msgid "Yes?" -msgstr "Да?" - #: lang/json/talk_topic_from_json.py msgid "Good to see you." msgstr "Приятно вновь тебя видеть." +#: lang/json/talk_topic_from_json.py +msgid "About those jobs…" +msgstr "По поводу этих заданий…" + #: lang/json/talk_topic_from_json.py msgid "Good to see you around." msgstr "Приятно видеть, что ты ещё среди живых." @@ -221497,8 +227924,8 @@ msgid "Want help with something else?" msgstr "Хочешь кое с чем помочь?" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." -msgstr "Забей, мне всё равно пора." +msgid "Lets set a combat strategy" +msgstr "Давай договоримся о стратегии боя" #: lang/json/talk_topic_from_json.py msgid "" @@ -221554,6 +227981,10 @@ msgstr "Слышно ли что-нибудь интересное?" msgid "Anything on your mind?" msgstr "О чём думаешь?" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "Хочешь помочь кое с чем ещё?" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "Знаешь ли что-то про наших нанимателей?" @@ -221599,15 +228030,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "Теперь мне тоже это кажется странноватым." #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." -msgstr "Раздумываю, что мне скоро пора на охоту…" +msgid "Thinking I should go hunt something soon…" +msgstr "Думаю, что мне скоро пора на охоту…" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "Мне интересно, переменится ли жизнь к лучшему…" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "Э? Ничего, мне просто нравится тут отдыхать." #: lang/json/talk_topic_from_json.py @@ -221653,7 +228084,7 @@ msgstr "Веди себя вежливо, наёмник." #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." +"marshal…" msgstr "" "На дорогах полно разбойников, наверно, стоит вернуться к работе, маршал…" @@ -221731,7 +228162,7 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "Я не могу даже представить, в чём ты можешь мне помочь." #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." +msgid "Stand still while I get my clippers…" msgstr "Стой спокойно, пока я орудую своими ножницами…" #: lang/json/talk_topic_from_json.py @@ -222173,8 +228604,8 @@ msgstr "" " проводят вне аванпоста." #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "Пожалуйста, оставь меня одного…" +msgid "Please leave me alone…" +msgstr "Пожалуйста, оставь меня в покое…" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -222195,15 +228626,14 @@ msgstr "Это печально." #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." +"I don't know what you could do. I've tried everything. Just give me time…" msgstr "" "Я не знаю, что вы можете сделать. Я всё испробовал. Просто дайте мне время…" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "" "Я всё болею! Сначала думал, что съел что-то не то, но теперь, кажется, я " "ничего не могу удержать…" @@ -222348,11 +228778,11 @@ msgstr "Я не хочу вступать к вам, в любом случае. #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" "Здесь? Фрукты и ягоды. Может быть, некоторое сельскохозяйственное " -"оборудование, но тебе нужны крипто-коины" +"оборудование, но тебе нужны крипто-коины." #: lang/json/talk_topic_from_json.py msgid "Ok." @@ -222739,6 +229169,306 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "Теперь я выбираю, чего ради погибну." +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" +"Да. Я спрашиваю потому, что вокруг и правда есть динозавры. Вам что-нибудь " +"известно об этом?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" +"Я знаю много всего странного и бесполезного. Приходилось видеть всякое в " +"церквях, на фермах, даже как-то целая выставка попалась. Эти Болотники, они " +"знают, что творится. Они создания света, что пришли спасти нас. Или съесть " +"нас, уже и не помню." + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "Едоки будут накормлены." + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "Добро пожаловать. Вы голодны, друг мой?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" +"Вы выглядите так, будто вам не помешает поесть. Слишком много голода в мире." +" Это время едоков." + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "Здравствуйте. Кто такие едоки?" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "Насчёт едоков…" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "Вы упоминали каких-то притворщиков. О чем вы говорили?" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "Могу ли я как-то помочь накормить едоков?" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "Мне пора идти. Берегите себя, Директор Бароникс." + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" +"Великие едоки вернулись, а за ними пришли и ложные. Мы должны накормить " +"едоков и уничтожить семя притворщиков." + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "О чём вообще речь?" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "Нет, спасибо, и мне уже пора, пожалуй." + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" +"Этот Катаклизм пробудил великих едоков, потерянных во времени, они " +"вернулись, чтобы завершить свою великую работу, размножаться и заполнить " +"земли своей песней. Время человека подошло к концу, но мы, немногие " +"оставшиеся, делаем всё, что можем, чтобы защитить мир от притворщиков, " +"пришедших, чтобы красть плоть." + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "Так что вы делаете с мясом?" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "Что за великие едоки и притворщики?" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "А другие остались?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" +"Великие едоки - потерянные, которых мы зовём динозаврами, чью плоть мы " +"забрали, и которые возвращают её себе. Притворщики - это другие, пришедшие, " +"чтобы украсть плоть этого мира. Она им не принадлежит, и мы заберём её у " +"них, пусть даже вытащив изо рта." + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "Ясно, вы поклоняетесь динозаврам. Понятно." + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" +"Болотники знали, что эти времена вернутся, и мы к ним готовились. Пока " +"другие тратили зря своё время и мясо, мы питались и становились сильнее, и " +"мы заполнили наши кладовые мясом для этого дня." + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "Да, очень хорошо." + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "Вы продолжаете говорить про мясо и плоть. Почему мясо так важно?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" +"Мясо делает великих едоков сильнее. Мы собираем мясо и скармливаем его им, и" +" в конце концов даже в нашей смерти мы послужим великим едокам. Это всегда " +"было нашей целью, и мы немногие счастливцы, которым повезло узреть этот " +"день." + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "Вашей целью? Откуда вам такое знать?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" +"Возвращение великих едоков было предсказано пророком. Мы ,верящие, ждали и " +"готовились со дня откровения." + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "Думаю, приятно получить доказательства своей правоты." + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "Это безумие." + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" +"Вы понимаете нашу цель. Я приветствую вас на этом пути, и всё что нужно - " +"кормить едоков." + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" +"Вы отрицаете то, что находится прямо перед вами. Мир таков, как это было " +"предсказано." + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "Едоки сыты. Вскоре они вновь проголодаются." + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "Вы знаете, что делать." + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "Великие едоки должны быть накормлены. Вы готовы?" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "Ещё немало работы. Вы готовы?" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "Вокруг полно плоти, что нужно скормить. Вы готовы собрать её?" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "Едоки голодны." + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "Нужно больше мяса." + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "Я знаю, едоки готовы к мясу." + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "Возможно, в другой раз, Директор Бароникс." + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" +"Если вы готовы послужить великим едокам, ступайте и найдите мясо, а затем " +"возвращайтесь с ним. Нам всегда нужно больше." + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "Для меня счастье послужить великим едокам. Я в деле." + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "Превосходно. Сделайте всё, что необходимо." + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" +"Великие едоки не привередливы, они примут любое чистое мясо. Мясо мутантов и" +" заражённое не подойдут." + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "В общем, мясо, которое не с зомби или монстра. Ясно." + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "Конечно, здесь вы найдёте всё, что вам нужно." + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "Это объясняет ножи." + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "О, вы знаете мою подругу Бриджит. В таком случае, вперёд!" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "Нет, мне нужно остаться, что наблюдать за делами компании." + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "Конечно, Директор Бароникс." + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "Отлично!" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" +"Не прямо сейчас. Вам стоит остаться, чтобы наблюдать за делами компании." + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" +"Конечно, компания всегда будет ждать тебя, и великие едоки в любом случае не" +" останутся без еды." + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" +"Было предсказано, что великие едоки вернутся, а за ними придут и " +"притворщики, чтобы красть плоть. От нас требуется малость, лишь сделать всё," +" чтобы истинные поедатели получили столько плоти, сколько возможно, а " +"притворщики голодали." + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "Да, Директор Бароникс, очень хорошо, Директор Бароникс." + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "В этом нет смысла, и я больше не буду об этом говорить." + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "Здарова, добытчик." @@ -222847,7 +229577,7 @@ msgid "Oh, you again." msgstr "А, опять ты." #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "А? *невнятно бормочет* …Ты еще кто?" #: lang/json/talk_topic_from_json.py @@ -222855,8 +229585,8 @@ msgid "I'm busy, what is it?" msgstr "Я занят, в чем дело?" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." -msgstr "И оставить мою башню и мои исследования? Я так не думаю." +msgid "And leave my tower and all my research? I think not." +msgstr "И забросить мою башню и мои исследования? Я так не думаю." #: lang/json/talk_topic_from_json.py msgid "Ah, hello again." @@ -223283,10 +230013,6 @@ msgstr "Вы блокируете противника (%s)" msgid " blocks %s" msgstr " блокирует противника (%s)" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "Парирование" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -225798,6 +232524,101 @@ msgstr "Вы проводите атаку вращением по против msgid " unleashes a spin attack against %s and those nearby" msgstr " проводит атаку вращением по противнику (%s) и стоящим рядом" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "Обезоруживающий удар" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "Вы умело разоружаете противника (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr " умело разоружает противника (%s)" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "Мгновенное восстановление" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" +"Вы промахиваетесь по противнику (%s), но восстанавливаете равновесие в " +"мгновение ока" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" +" промахивается по противнику (%s), но восстанавливает равновесие в " +"мгновение ока" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "Добивающая атака" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "Вы добиваете противника (%s) сильным режущим движением" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr " добивает противника (%s) сильным режущим движением" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "Ошеломляющий удар" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "Вы ошеломляете противника (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr " ошеломляет противника (%s)" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "Стальной ветер" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" +"Вы прорубаетесь сквозь противника (%s) и окружающих, словно стальной ветер" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" +" прорубается сквозь противника (%s) и окружающих, словно стальной " +"ветер" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "Косящее лезвие" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" +"Вы наносите чистый удар по противнику (%s) и стоящим рядом, собирая кровавую" +" жатву" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" +" наносит чистый удар по противнику (%s) и стоящим рядом, собирая " +"кровавую жатву" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "Ausstoß" @@ -225854,6 +232675,220 @@ msgstr "Вы бьёте противника (%s) сверхзвуковым у msgid " launches a supersonic punch at %s" msgstr " бьёт противника (%s) сверхзвуковым ударом" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "Мегапинок" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "Вы используете Мегапинок на противнике (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr " использует Мегапинок на противнике (%s)" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "Тёмный лариат" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "Вы используете Тёмный Лариат на противнике (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr " использует Тёмный Лариат на противнике (%s)" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "Умный удар" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "Вы используете Умный удар на противнике (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr " использует Умный удар на противнике (%s)" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "Удар вниз" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "Вы используете Удар вниз на противнике (%s)" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr " использует Удар вниз на противнике (%s)" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "Атака глупца" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "Вы обманываете противника (%s) и наносите удар в ответ" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr " обманывает противника (%s) и наносит удар в ответ" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "Убийство гидры" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "Вы прерываете атаку противника (%s) ударом идеальной точности" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr " прерывает атаку противника (%s) ударом идеальной точности" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "Могучий бросок" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "Вы отбрасываете противника (%s) прочь Могучим броском" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr " отбрасывает противника (%s) прочь Могучим броском" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "Бросок «Баллиста»" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "Вы крутитесь и бросаете противника (%s) броском «Баллиста»" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr " крутится и бросает противника (%s) броском «Баллиста»" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "Текущая вода" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" +"Вы отражаете атаку противника (%s) и атакуете в ответ одним плавным " +"движением" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" +" отражает атаку противника (%s) и атакует в ответ одним плавным " +"движением" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "Обезоруживающий порез" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "Вы обезоруживаете противника (%s) быстрым рывком своего оружия" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr " обезоруживает противника (%s) быстрым рывком своего оружия" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "Размах Сарлакка" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "Вы стремительно рассекаете противника (%s) и окружающих" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr " стремительно рассекает противника (%s) и окружающих" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "Молот Гор" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "Вы сокрушаете противника (%s) всем весом Молота Гор." + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr " сокрушает противника (%s) всем весом Молота Гор." + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "Неотразимый удар гор" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "Вы врезаете по противнику (%s) Ударом гор." + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr " врезает по противнику (%s) Ударом гор." + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "Удар Колосса" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "Вы полностью разбиваете противника (%s) Ударом Колосса" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr " полностью разбивает противника (%s) Ударом Колосса" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "Стойка Росомахи" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "%s пытается вас схватить, но вы выдираетесь из захвата!" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "%s пытается схватить, но выдирается из захвата!" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "Эта земля не слушается ваших приказов сдвинуться." @@ -225901,6 +232936,10 @@ msgstr "Мёртвое дерево ожило." msgid "Life springs anew from the dead grass." msgstr "Жизнь вновь вырывается среди мертвой поросли." +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "Дверь с силой распахивается!" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "выжженная земля" @@ -227009,260 +234048,31 @@ msgstr "" "или найти быстрый выход из Катаклизма." #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "земля" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" -"Это земля. Подходит для пашни. Также её можно вскапывать для различных " -"строительных проектов." - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "стук" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "" -"Большой участок песка, который можно было бы использовать самыми различными " -"способами." - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "грязь" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "Мокрая скользкая грязь." - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "глина" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "" -"Участок, содержащий глинозём, пригодный для обжига печи, если был извлечён " -"должным образом." - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "насыпь глины" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "Холмик из глинистой почвы." - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "чавк!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "песчаная насыпь" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "Песчаный холмик." - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "земляная насыпь" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" -"Труднопроходимая земляная насыпь, если приглядеться, почва хорошо подходит " -"для посадки семян и тому подобного." - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "Гигантский земляной холм, похоже, вы можете укрыться внутри." - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "странный провал" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" -"Неестественная дыра напоминает своей формой человеческие очертания и кажется" -" странно знакомой. У вас странное желание исследовать её поближе, будто этот" -" объект как-то связан с вами." - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "могила" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" -"Земляная могила с растущей на ней травой. Хоть кто-то из мёртвых " -"действительно покоится с миром." - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" -"Свежая могила, покрытая камнями, либо чтобы кто-то не раскопал ее, либо " -"чтобы кто-то не раскопался наружу. Две дощечки отмечают её как место чьего-" -"то упокоения." - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "каменный пол" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" -"Сравнительно плоская площадка горной породы и камня. Выглядит достаточно " -"стабильно, чтобы заниматься добычей с помощью соответствующего горного " -"снаряжения." - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "асфальт" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "" -"Участок асфальта, медленно разрушающийся от трещин, морозов и отсутствия " -"ремонтных работ." - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "жёлтый асфальт" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" -"Линии дорожной разметки аккуратно нанесены жёлтой краской на асфальт, служат" -" для сообщения информации участникам дорожного движения. Никто больше эти " -"правила не соблюдает." - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "тротуар" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" -"Край проезжей части дороги, залитый бетоном, повреждён морозом и большими " -"трещинами из-за отсутствия обслуживания." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "" -"Более новый залитый бетоном участок дороги с поверхностной отделкой для " -"красоты и устойчивости к циклам замораживания-таяния." - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" -"Более новый залитый бетоном участок дороги с поверхностной отделкой для " -"красоты и устойчивости к циклам замораживания-таяния. Покрыт желтой краской." - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "деревянный пол" +msgid "overgrown floor" +msgstr "заросший пол" -#. ~ Description for wooden floor +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" -"Пол из плотно уложенных сбитых гвоздями деревянных досок. Такие часто бывают" -" на верандах." +"Голый бетонный пол, почти полностью покрытый подергивающимися отростками " +"сероватой плоти." #: lang/json/terrain_from_json.py msgid "SMASH!" msgstr "ГРОХОТ!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "металлический пол" +msgid "overgrown wall" +msgstr "заросшая стена" -#. ~ Description for metal floor +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." -msgstr "" -"Высококачественный прочный рифлёный пол для снижения риска скольжения и " -"падения." - -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "линолеум" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "" -"Участок напольного покрытия из прочного пружинистого материала. Окрашен в " -"простой белый цвет." - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" -"Участок напольного покрытия из прочного серого пружинистого материала." - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "земляной пол" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." -msgstr "Участок пола, состоящий из хорошо перемешанной утоптанной земли." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." +msgstr "Бетонная стена, заросшая гротескным узором вен и узловатой плоти." #: lang/json/terrain_from_json.py msgid "concrete floor" @@ -227361,6 +234171,24 @@ msgstr "" "Незаконченный ряд арматур, залитых бетоном: пол ещё не выровнен, крыша также" " не установлена." +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "каменный пол" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" +"Сравнительно плоская площадка горной породы и камня. Выглядит достаточно " +"стабильно, чтобы заниматься добычей с помощью соответствующего горного " +"снаряжения." + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "металлический пол" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -227370,6 +234198,10 @@ msgstr "" "Высококачественный прочный рифлёный пол для снижения риска скольжения и " "падения, с аналогичной крышей." +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "стук" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "пол" @@ -227419,6 +234251,10 @@ msgstr "" "улучшения сопротивления скольжению и качению, используется в развлекательных" " видах спорта." +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "земляной пол" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -227509,32 +234345,15 @@ msgid "A blue section of flooring." msgstr "Участок синего пола." #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "промышленный ковёр" - -#. ~ Description for industrial carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." -msgstr "" -"Прочный износостойкий ковёр с низким ворсом нейтрального серого цвета для " -"укладки на голый бетон." - -#: lang/json/terrain_from_json.py -msgid "bunker carpet" -msgstr "ковер бункера" +msgid "carpet" +msgstr "ковёр" -#. ~ Description for bunker carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "" -"Прочный негорючий ковёр с низким ворсом нейтрального кремового цвета с " -"изолирующей подкладкой." +msgid "Base carpet!" +msgstr "Базовый ковёр!" -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "Мягкий красный ковёр." @@ -227554,6 +234373,143 @@ msgstr "Мягкий зелёный ковёр." msgid "Soft purple carpet." msgstr "Мягкий пурпурный ковёр." +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "Ковёр" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "Базовый бетонный ковёр!" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "промышленный красный ковёр" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "" +"Прочный износостойкий ковёр с низким ворсом красного цвета для укладки на " +"голый бетон." + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "промышленный жёлтый ковёр" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "" +"Прочный износостойкий ковёр с низким ворсом жёлтого цвета для укладки на " +"голый бетон." + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "промышленный зелёный ковёр" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "" +"Прочный износостойкий ковёр с низким ворсом зелёного цвета для укладки на " +"голый бетон." + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "промышленный фиолетовый ковёр" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "" +"Прочный износостойкий ковёр с низким ворсом фиолетового цвета для укладки на" +" голый бетон." + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "Базовый металлический ковёр!" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "красный ковёр бункера" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" +"Прочный негорючий ковёр с низким ворсом красного цвета с изолирующей " +"подкладкой." + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "жёлтый ковер бункера" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" +"Прочный негорючий ковёр с низким ворсом жёлтого цвета с изолирующей " +"подкладкой." + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "зелёный ковёр бункера" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" +"Прочный негорючий ковёр с низким ворсом зелёного цвета с изолирующей " +"подкладкой." + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "фиолетовый ковёр бункера" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" +"Прочный негорючий ковёр с низким ворсом фиолетового цвета с изолирующей " +"подкладкой." + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "линолеум" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" +"Участок напольного покрытия из прочного пружинистого материала. Окрашен в " +"простой белый цвет." + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "" +"Участок напольного покрытия из прочного серого пружинистого материала." + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "покрашенный восковый пол" @@ -227596,6 +234552,37 @@ msgstr "" "постапокалипсиса. Надеемся, вам понравится звон дождя по гофрированному " "металлу." +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "земля" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" +"Это земля. Подходит для пашни. Также её можно вскапывать для различных " +"строительных проектов." + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" +"Большой участок песка, который можно было бы использовать самыми различными " +"способами." + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "грязь" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "Мокрая скользкая грязь." + #: lang/json/terrain_from_json.py msgid "moss" msgstr "мох" @@ -227605,6 +234592,32 @@ msgstr "мох" msgid "Moist spongy moss." msgstr "Влажный губчатый мох." +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "глина" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "" +"Участок, содержащий глинозём, пригодный для обжига печи, если был извлечён " +"должным образом." + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "насыпь глины" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "Холмик из глинистой почвы." + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "чавк!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "бумажный пол" @@ -227614,6 +234627,156 @@ msgstr "бумажный пол" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "Пол сделанный из бесформенной массы, покрытой липкой осиной слюной." +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "песчаная насыпь" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "Песчаный холмик." + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "земляная насыпь" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" +"Труднопроходимая земляная насыпь, если приглядеться, почва хорошо подходит " +"для посадки семян и тому подобного." + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "Гигантский земляной холм, похоже, вы можете укрыться внутри." + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "странный провал" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" +"Неестественная дыра напоминает своей формой человеческие очертания и кажется" +" странно знакомой. У вас странное желание исследовать её поближе, будто этот" +" объект как-то связан с вами." + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "могила" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" +"Земляная могила с растущей на ней травой. Хоть кто-то из мёртвых " +"действительно покоится с миром." + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" +"Свежая могила, покрытая камнями, либо чтобы кто-то не раскопал ее, либо " +"чтобы кто-то не раскопался наружу. Две дощечки отмечают её как место чьего-" +"то упокоения." + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "асфальт" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "" +"Участок асфальта, медленно разрушающийся от трещин, морозов и отсутствия " +"ремонтных работ." + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "жёлтый асфальт" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "" +"Линии дорожной разметки аккуратно нанесены жёлтой краской на асфальт, служат" +" для сообщения информации участникам дорожного движения. Никто больше эти " +"правила не соблюдает." + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "тротуар" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" +"Край проезжей части дороги, залитый бетоном, повреждён морозом и большими " +"трещинами из-за отсутствия обслуживания." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" +"Более новый залитый бетоном участок дороги с поверхностной отделкой для " +"красоты и устойчивости к циклам замораживания-таяния." + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" +"Более новый залитый бетоном участок дороги с поверхностной отделкой для " +"красоты и устойчивости к циклам замораживания-таяния. Покрыт желтой краской." + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "деревянный пол" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" +"Пол из плотно уложенных сбитых гвоздями деревянных досок. Такие часто бывают" +" на верандах." + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" +"Высококачественный прочный рифлёный пол для снижения риска скольжения и " +"падения." + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "Участок пола, состоящий из хорошо перемешанной утоптанной земли." + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "грецкий орех" @@ -232037,6 +239200,78 @@ msgstr "Лестница вверх." msgid "A ladder leading down." msgstr "Лестница вниз." +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "дорожная рампа вниз (верхняя часть)" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "Верхняя часть дорожной рампы, ведущей вниз." + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "дорожная рампа вниз (нижняя часть)" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "Нижняя часть дорожной рампы, ведущей вниз." + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "дорожная рампа вверх (верхняя часть)" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "Верхняя часть дорожной рампы, ведущей вверх." + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "дорожная рампа вверх (нижняя часть)" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "Нижняя часть дорожной рампы, ведущей вверх." + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "тротуар рампы вниз (верхняя часть)" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "Верхняя часть тротуара дорожной рампы, ведущей вниз." + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "тротуар рампы вниз (нижняя часть)" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "Нижняя часть тротуара дорожной рампы, ведущей вниз." + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "тротуар рампы вверх (верхняя часть)" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "Верхняя часть тротуара дорожной рампы, ведущей вверх." + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "тротуар рампы вверх (нижняя часть)" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "Нижняя часть тротуара дорожной рампы, ведущей вверх." + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "уклон вниз" @@ -232553,7 +239788,7 @@ msgstr "«Клац!»" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "«Бах!»" @@ -232753,11 +239988,11 @@ msgstr "хетчбэк" #: lang/json/vehicle_from_json.py msgid "Sports Car" -msgstr "спортмобиль" +msgstr "спортивный автомобиль" #: lang/json/vehicle_from_json.py msgid "Atomic Sports Car" -msgstr "атомный спортмобиль" +msgstr "атомный спортивный автомобиль" #: lang/json/vehicle_from_json.py msgid "Electric Sports Car" @@ -234550,6 +241785,12 @@ msgstr "деревянный лодочный корпус" msgid "A wooden board that keeps the water out of your boat." msgstr "Деревянный борт удерживает воду снаружи вашей лодки." +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" +"Связанные вместе брёвна, предназначенные для придания транспорту плавучести." + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -235077,14 +242318,19 @@ msgstr "" "можно будет ее потянуть." #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "деревянное сидение" +msgid "flimsy wooden seat" +msgstr "хлипкое деревянное сидение" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "Место для сидения." +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "деревянное сидение" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "деревянный штырь" @@ -235338,6 +242584,16 @@ msgstr "" "Охлаждаемый бак на 60 литров. Когда включен, жидкость внутри охлаждается, " "что не дает ей быстро испортиться." +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" +"Кусок дерева с отверстиями для велосипедного или мотоциклетного колеса." + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "деревянное крепление колеса (управляемое)" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "легкое крепление колеса (управляемое)" @@ -235985,6 +243241,11 @@ msgstr "с начала игры" msgid "At least %s from %s (%s remaining)" msgstr "По крайней мере %s из %s (%s остается )" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "Точно %s из %s" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -236001,13 +243262,14 @@ msgid "Within %s of %s (passed)" msgstr "В %s из %s (пройдено)" #: src/achievement.cpp -msgid "Triggered by " -msgstr "Активируется " +#, c-format +msgid "Triggered by %s" +msgstr "Активируется: %s" #: src/achievement.cpp #, c-format -msgid "%s/%s " -msgstr "%s/%s" +msgid "%s/%s %s" +msgstr "%s/%s %s" #: src/achievement.cpp msgid " (further requirements hidden)" @@ -236213,8 +243475,9 @@ msgstr "" msgid "The lock stumps your efforts to pick it." msgstr "Замок сопротивляется вашим попыткам взломать его." -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "Во время езды верхом этого делать нельзя." @@ -236278,6 +243541,129 @@ msgstr "Продолжить пытаться уснуть." msgid "Continue trying to fall asleep and don't ask again." msgstr "Продолжить пытаться уснуть и больше не спрашивать." +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "Вы слишком устали чтобы заниматься" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "Сильная жажда не дает вам заниматься" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "Сначала освободите свои руки" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "Нельзя заниматься здесь со сломанной рукой" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "Нельзя заниматься здесь со сломанной ногой" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "Нельзя заниматься со сломанной ногой" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" +"Физические усилия определяют эффективность тренировки, но также влияют на " +"то, как быстро вы устанете." + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "Выберите интенсивность тренировки:" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" +"Легкие упражнения, сравнимые с ходьбой, только более методичные и " +"направленные." + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "Средняя" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" +"Средние по нагрузке упражнения без чрезмерного напряжения, но достаточные " +"чтобы вспотеть." + +#: src/activity_actor.cpp +msgid "Active" +msgstr "Активная" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" +"Активные упражнения с полным вовлечением. Энергично, но контролируемо. " + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" +"Очень интенсивные упражнения с максимальными усилиями. Выматывающие если " +"долго заниматься." + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "Как долго тренироваться (в минутах):" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "Вы начинаете заниматься." + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "Вы устали, поэтому закончили заниматься раньше." + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "Вы хотите пить, поэтому закончили заниматься раньше." + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr ", как вы пыхтите и сопите!" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "Вы тратите несколько секунд, чтобы перевести дыхание." + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "Вы продолжили тренировку." + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "Вы закончили заниматься." + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "Вы закончили ваш цикл занятий, продолжать тренироваться?" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "Прекратить тренировку." + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "Продолжить тренировку." + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "Продолжить тренировку и больше не спрашивать." + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -237272,7 +244658,7 @@ msgstr "Вы разряжаете %s." #: src/activity_handlers.cpp #, c-format msgid "You have run out of %s." -msgstr "У вас закончилось%s." +msgstr "У вас закончилось %s." #: src/activity_handlers.cpp msgid "You fertilized every plot you could." @@ -238076,7 +245462,7 @@ msgstr "[<] страница %1$d из %2$d [>]" msgid "< [%s] Sort: %s >" msgstr "< [%s] Сорт.: %s >" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "[%s] Фильтр" @@ -241102,6 +248488,29 @@ msgstr "%s (%i слотов);" msgid "Increased storage capacity by %i." msgstr "Энергоёмкость увеличена на %i." +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "Выберите безопасный порог уровня топлива" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "Вся энергия" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "Выше 80 %%" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "Выше 55 %%" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "Выше 30 %%" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "Установить стартовый порог мощности" @@ -241285,8 +248694,9 @@ msgid "(incapacitated)" msgstr "(без сознания)" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" -msgstr "(режим экономии топлива включён)" +#, c-format +msgid "(fuel saving ON > %d %%)" +msgstr "(режим экономии ВКЛ > %d %%)" #: src/bionics_ui.cpp #, c-format @@ -241358,10 +248768,18 @@ msgstr "" msgid "Accuracy" msgstr "Точность" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "Шанс критического попадания" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "Уклонение" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "Эффективность блока" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "Скорость" @@ -241882,20 +249300,26 @@ msgstr " поднимается." #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%s высвобождается из паутины!" +msgid "The %s escapes the bear trap!" +msgstr "%s вырывается из медвежьего капкана!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "Вы освобождаетесь от паутины!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "Ваш %s безуспешно пытается вырваться из капкана!" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr " освобождается от паутины!" +msgid "You free yourself from the bear trap!" +msgstr "Вы освобождаетесь от медвежьего капкана!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "Вы пытаетесь освободиться от паутины, но у вас не получается!" +msgid " frees themselves from the bear trap!" +msgstr " освобождается от медвежьего капкана!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "" +"Вы пытаетесь освободиться от медвежьего капкана, но у вас не получается!" #: src/character.cpp src/monster.cpp #, c-format @@ -241931,29 +249355,6 @@ msgstr " освобождается из тяжёлого силка!" msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "Вы пытаетесь вырваться из тяжёлого силка, но у вас не получается!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%s вырывается из медвежьего капкана!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "Ваш %s безуспешно пытается вырваться из капкана!" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "Вы освобождаетесь от медвежьего капкана!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr " освобождается от медвежьего капкана!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "" -"Вы пытаетесь освободиться от медвежьего капкана, но у вас не получается!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "Вы вырываетесь из завала!" @@ -241966,18 +249367,6 @@ msgstr " освобождается из завала!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "Вы пытаетесь освободиться из завала, но у вас не получается!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "Вы пытаетесь выбраться из ямы, но соскальзываете вниз." - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "Вы выбрались из ямы!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr " выползает из ямы!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -242017,6 +249406,52 @@ msgstr "Вы разрываете захват!" msgid " breaks out of the grab!" msgstr " разрывает захват!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%s высвобождается из паутины!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "Вы освобождаетесь от паутины!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr " освобождается от паутины!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "Вы пытаетесь освободиться от паутины, но у вас не получается!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "%s освобождается!" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "Вы освобождаетесь!" + +#: src/character.cpp +msgid " frees themselves!" +msgstr " освобождается!" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "Вы попытались освободиться, но не смогли!" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "Вы пытаетесь выбраться из ямы, но соскальзываете вниз." + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "Вы выбрались из ямы!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr " выползает из ямы!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -242893,6 +250328,10 @@ msgstr "EXTRA_EXERCISE" msgid "Your body strains under the weight!" msgstr "Ваше тело напряжено под такой тяжестью!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "Ваша биология несовместима с этим лечебным предметом." + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -246005,14 +253444,6 @@ msgstr "Запустить бенчмарк (X секунд)" msgid "Test trait group" msgstr "Протестировать группу черт" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "Показать отладочное сообщение" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "Вылет игры (тест обработки вылета)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "Переключить отображение пути NPC на карте" @@ -246041,6 +253472,18 @@ msgstr "Информация…" msgid "Enable achievements" msgstr "Включить достижения" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "Показать отладочное сообщение" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "Вылет игры (тест обработки вылета)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "Выйти в главное меню" + #: src/debug_menu.cpp msgid "Game…" msgstr "Игра..." @@ -246137,10 +253580,6 @@ msgstr "Спавн шаблона генератора карты" msgid "Map…" msgstr "Карта…" -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "Выйти в главное меню" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -246664,6 +254103,10 @@ msgstr "Пометить как выполненное" msgid "Remove mission without proper cleanup" msgstr "Удалить задание без правильной очистки" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "Бенчмарк в процессе…" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -247196,19 +254639,6 @@ msgstr "" "Внутри: %s\n" "Крыша: %s" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" -"Заметность: %d\n" -"Сложность уклонения: %d\n" -"Сложность обезвреживания: %d\n" -"Безвредна: %s" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -247930,138 +255360,182 @@ msgid "Liked" msgstr "Нравится" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "Легендарные" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "Непревзойдённые" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "Могущественные" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "Знаменитые" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" -msgstr "Всем известные" +msgstr "Широко известные" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" -msgstr "Говорят о" +msgstr "Известные" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "Отбросы общества" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "Вредители" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "Презренные" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "Паразиты" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "Вымогатели" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "Посмешища" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "Нейтральные" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "Неприлично богатые" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "Богатые" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "Преуспевающие" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "Зажиточные" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" -msgstr "Комфортно" +msgstr "Обеспеченные" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "Нуждающиеся" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "Бедствующие" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "Обнищавшие" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "Нищие" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "Жирующие" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "Сытые" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "Побирающиеся" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" -msgstr "Истощал" +msgstr "Истощавшие" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "Голодающие" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "Легендарные" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" -msgstr "Эксперт" +msgstr "Эксперты" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "Ветераны" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "Опытные" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "Компетентные" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "Новички" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "Ослабленные" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "Жалкие" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "Никчёмные" @@ -248674,12 +256148,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -248688,12 +256162,12 @@ msgid "" "Positions: %d/3\n" msgstr "" "Примечание:\n" -"Отправить компаньона собирать мелкие кустарники и палки.\n" +"Отправить компаньона собирать мелкие кустарники и ветки.\n" " \n" "Используемый навык: выживание\n" "Сложность: Н/Д\n" "Возможная добыча:\n" -"> тяжёлые палки\n" +"> прочные ветки\n" "> увядшие растения\n" "> расколотая древесина\n" " \n" @@ -249972,8 +257446,8 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "У вас нет зоны еды. Отмена…" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" -msgstr "На точке сброса не найдено никаких предметов…" +msgid "No suitable items are located at the drop points…" +msgstr "На точке сброса не найдено подходящих предметов…" #: src/faction_camp.cpp #, c-format @@ -250199,6 +257673,15 @@ msgstr "%s опасно близко!" msgid "Wait till you wake up…" msgstr "Ожидайте, пока ваш персонаж не проснётся…" +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" +"\n" +"%s, чтобы прервать" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -250309,6 +257792,11 @@ msgctxt "action" msgid "open" msgstr "открыть" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "настройки автоподбора кармана" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -251441,6 +258929,10 @@ msgstr "У вас нет ничего, что можно было бы пере msgid "You aren't holding something you can reload." msgstr "Вы не держите ничего, что можно перезарядить." +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "Вам нужно снять сумку перед тем, как взять что-либо из неё в руки." + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -251889,11 +259381,27 @@ msgstr "Вы проходите мимо препятствия (%s), прегр msgid "You cannot haul items here." msgstr "Вы не можете тащить предметы тут." +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "%s на пути!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "%s на пути!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" +"%s Попытаться пройти? Возможно, вам придётся сражаться, чтобы выбраться " +"оттуда." + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -253294,11 +260802,6 @@ msgstr "На дороге стоит какой-то шут!" msgid "The %s is in the way!" msgstr "%s на пути!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "%s на пути!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -254058,6 +261561,10 @@ msgstr "Вы игнорируете лазерный прицел!" msgid "Creature whitelisted: %s" msgstr "Существо внесено в белый список: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "Начать тренировку?" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "Совершить самоубийство?" @@ -254600,6 +262107,11 @@ msgstr "Вы начали вскрывать сейф." msgid "Attempt to hack this safe?" msgstr "Попытаться взломать сейф?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "Это (%s) закрыто. Можно было бы взломать подходящим инструментом." + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -255457,11 +262969,28 @@ msgstr "%s выглядит слишком опасно. Лучше не тро msgid "There is a %s there. Take down?" msgstr "Здесь находится %s. Снять?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "Предмет (%s) снят." + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "Тут %s. Обезвредить?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "Вы успешно обезвредили ловушку!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "Вы не смогли обезвредить ловушку." + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "Вы не смогли обезвредить ловушку, и она сработала!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -255858,6 +263387,10 @@ msgstr "Выбрать установленную бионику для удал msgid "Splint broken limbs" msgstr "Наложить шину на сломанные конечности" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "Обработать раны" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "У вас не установлена никакая бионика." @@ -255888,17 +263421,97 @@ msgid " doesn't have limbs that require splinting." msgstr "У NPC () нет травм, требующих наложения шины." #: src/iexamine.cpp -msgid "This mill already contains flour." -msgstr "В мельнице уже содержится мука." +msgid "You don't have any wounds that need treatment." +msgstr "У вас нет ран, требующих обработки." + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr " не имеет ран, требующих обработки." + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" +"Автодок обнаружил бактериальную инфекцию в вашем организме, но также " +"обнаружил, что вы недавно принимали антибиотики, и не стал вводить " +"дополнительную дозу." + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" +"Автодок обнаружил бактериальную инфекцию в организме NPC (), но " +"также обнаружил, что недавно были приняты антибиотики, и не стал вводить " +"дополнительную дозу." + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" +"Автодок обнаружил бактериальную инфекцию в вашем организме и ввёл дозу " +"антибиотиков для борьбы с ней." + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" +"Автодок обнаружил бактериальную инфекцию в организме NPC () и ввёл " +"дозу антибиотиков для борьбы с ней." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "Мышечные спазмы начинают уходить." + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "Препарат не помогает против спазмов." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" +"Автодок обнаружил у вас кровотечение (%s) и применил кровоостанавливающий " +"препарат." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "" +"Автодок обнаружил кровотечение ( - %s) и применил " +"кровоостанавливающий препарат." + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" +"Автодок обнаружил у вас открытую рану (%s) и применил антисептическое " +"средство." #: src/iexamine.cpp -msgid "Remove it before starting the mill again." -msgstr "Извлеките её, прежде чем снова запустить мельницу." +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" +"Автодок обнаружил открытую рану ( - %s) и применил антисептическое " +"средство." #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" -msgstr "В мельнице лежит %s, это нельзя перемалывать!" +msgid "This mill contains %s, which can't be milled!" +msgstr "В мельнице лежит: %s. Это нельзя перемалывать!" #: src/iexamine.cpp #, c-format @@ -256087,8 +263700,9 @@ msgid "Remove brake and start milling" msgstr "Снять с тормоза и начать перемалывать" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." -msgstr "Снять с тормоза и начать перемалывать. Это займёт примерно 6 часов." +#, c-format +msgid "Remove brake and start milling, milling will take about %s." +msgstr "Снять с тормоза и начать перемалывать. Это займёт примерно %s." #: src/iexamine.cpp msgid "Insert products for milling… mill is full" @@ -256123,21 +263737,8 @@ msgstr "Это мельница, жернова вращаются и перем #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "До конца помола осталось %d час." -msgstr[1] "До конца помола осталось %d часа." -msgstr[2] "До конца помола осталось %d часов." -msgstr[3] "До конца помола осталось %d час." - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "До конца помола осталось меньше часа." - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." -msgstr "До конца помола осталось примерно %d минут." +msgid "It should take about %s to finish milling." +msgstr "До конца помола осталось примерно %s." #: src/iexamine.cpp msgid "There's a mill here." @@ -256329,6 +263930,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr " не знает рецепт (%s) и не может продолжать работу." +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "%s - использовать для тренировки?" + #: src/init.cpp msgid "Finalizing" msgstr "Финализация" @@ -256909,7 +264515,7 @@ msgstr "Объём (%s):" msgid "There are no available choices" msgstr "Без вариантов." -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "[%s] Фильтр: " @@ -257370,7 +264976,7 @@ msgstr "" "Эта еда начала портиться. Есть её была бы очень" " плохая идея." -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -257832,10 +265438,6 @@ msgstr "Модификатор переносимого веса: " msgid "Weight capacity bonus: " msgstr "Бонус переносимого веса: " -#: src/item.cpp -msgid "Storage: " -msgstr "Вместимость: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* Этот предмет можно носить одновременно со шлемом." @@ -258143,6 +265745,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* Этот предмет работает на бионической энергии." +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "Новое, может гореть" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "Почти новое, много горючего материала." + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "Чуть больше четверти сгорело." + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "Чуть больше половины сгорело." + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "Осталось меньше четверти несгоревшего." + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "Почти полностью сгорело." + +#: src/item.cpp +msgid "Fuel: " +msgstr "Топливо: " + #: src/item.cpp #, c-format msgid "Using: %s" @@ -258166,10 +265796,24 @@ msgstr "* Эту вещь можно укрепить." msgid "* This item is not repairable." msgstr "* Этот предмет невозможно починить." +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items +#: src/item.cpp +#, c-format +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "Разборка займёт %1$s, и может дать: %2$s." + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." -msgstr "Разборка займёт %s, и может дать: %s." +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." +msgstr "" +"Разборка займёт %1$s, требуется: %2$s, и может " +"дать: %3$s." #: src/item.cpp #, c-format @@ -258291,33 +265935,28 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "Шанс на крит. попадание %d%% — %d%%" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" -msgstr "" -"%d ударного урона (%d при крит. " -"попадании)" +msgid "Bashing: " +msgstr "Дробящий: " #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" -msgstr "" -"%d режущего урона (%d при крит. " -"попадании)" +msgid "Critical bash: " +msgstr "Крит. дробящий: " #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" -msgstr "" -"%d колющего урона (%d при крит. " -"попадании)" +msgid "Cutting: " +msgstr "Режущий: " #: src/item.cpp -#, c-format -msgid "%d moves per attack" -msgstr "%d ходов на атаку" +msgid "Critical cut: " +msgstr "Крит. режущий: " + +#: src/item.cpp +msgid "Piercing: " +msgstr "Колющий: " + +#: src/item.cpp +msgid "Critical pierce: " +msgstr "Крит. колющий: " #: src/item.cpp msgid "Integrated mod: " @@ -258932,10 +266571,11 @@ msgstr "Эта ёмкость (%1$s) не может хранить больше msgid "That %s doesn't have room to expand." msgstr "%s не имеет места для расширения." -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" -msgstr "%2$s x %1$d" +msgstr "%s x %d" #: src/item.cpp msgid "A nearby robot has repaired itself and stands up!" @@ -259061,10 +266701,69 @@ msgstr "У вас нет предметов с зарегистрированн msgid "Execute which action?" msgstr "Какое действие выполнить?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "Нажмите клавишу, чтобы добавить к: %s" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "чёрный список" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "белый список" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "приоритет, " + +#: src/item_contents.cpp +msgid " item, " +msgstr "предмет, " + +#: src/item_contents.cpp +msgid " category, " +msgstr " категория, " + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "белый список, " + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "чёрный список, " + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "Введите приоритет (текущий: %d)" + +#: src/item_contents.cpp +msgid "item id" +msgstr "id предмета" + +#: src/item_contents.cpp +msgid "item category" +msgstr "категория предмета" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "Выберите предмет из находящихся рядом" + #: src/item_contents.cpp msgid "is not a container" msgstr "не является контейнером" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "карман недоступен: %s" +msgstr[1] "карманы недоступны: %s" +msgstr[2] "карманы недоступны: %s" +msgstr[3] "карманы недоступны: %s" + #: src/item_contents.cpp msgid "is not rigid" msgstr "не жёсткий" @@ -259104,6 +266803,11 @@ msgstr "Какую группу протестировать?" msgid "Result of 100 spawns:" msgstr "Результат 100 генераций:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%2$s x %1$d" + #: src/item_location.cpp msgid "inventory" msgstr "инвентарь" @@ -259126,6 +266830,10 @@ msgstr "открыт" msgid "Pocket %d:" msgstr "Карман %d:" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "Содержит: " + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "Максимальная длина помещаемого предмета:" @@ -259292,6 +267000,34 @@ msgstr "в кармане уже слишком много веса" msgid "not enough space" msgstr "недостаточно места" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "Приоритет:" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "Белый список предметов: %s" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "(пусто)" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "Чёрный список предметов: %s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "Белый список категорий: %s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "Чёрный список категорий: %s" + #: src/itype.h msgid "click." msgstr "«щёлк»." @@ -259361,14 +267097,6 @@ msgstr "Вы приняли антибиотики." msgid " takes some antibiotics." msgstr " принимает антибиотики." -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "Мышечные спазмы начинают уходить." - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "Препарат не помогает против спазмов." - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -259380,12 +267108,12 @@ msgstr "" #: src/iuse.cpp #, c-format msgid "You're out of %s." -msgstr "У вас закончилось %s." +msgstr "У вас закончился препарат: %s." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You use your %s." -msgstr "Вы используете ваш %s." +msgstr "Вы используете препарат: %s." #: src/iuse.cpp msgid "You wash the slime from your eyes." @@ -259594,7 +267322,7 @@ msgstr "Как ни странно, это неплохое на вкус." #: src/iuse.cpp #, c-format msgid "You chew your %s." -msgstr "Вы пожевали %s." +msgstr "Вы пожевали: %s." #: src/iuse.cpp msgid "You feel cleansed." @@ -259633,7 +267361,8 @@ msgstr "" msgid "" "As you eat the %s, you have a near-religious experience, feeling at one with" " your surroundings…" -msgstr "Съев %s, вы испытали почти религиозное чувство единения с окружением…" +msgstr "" +"Съев это (%s), вы испытали почти религиозное чувство единения с окружением…" #: src/iuse.cpp msgid "It tastes extremely strange!" @@ -259813,7 +267542,7 @@ msgstr "%s не считает это за еду." #: src/iuse.cpp #, c-format msgid "Put the %s where?" -msgstr "Куда положить %s?" +msgstr "Куда положить это (%s)?" #: src/iuse.cpp msgid "Are you sure you want to feed a person the dog food?" @@ -259918,8 +267647,8 @@ msgstr "Этот предмет уже был модифицирован так msgid "" "You modify your %1$s to listen for %2$s activation signal on the radio." msgstr "" -"Вы модифицируете %1$s таким образом, чтобы он принимал %2$s сигнал активации" -" по радио." +"Вы модифицируете предмет (%1$s) таким образом, чтобы он принимал %2$s сигнал" +" активации по радио." #: src/iuse.cpp msgid "Remove mods from tool?" @@ -259932,7 +267661,7 @@ msgstr "У вас нет модифицированных инструменто #: src/iuse.cpp #, c-format msgid "You remove the %s from the tool." -msgstr "Вы вынимаете %s из инструмента." +msgstr "Вы удаляете модификацию (%s) из инструмента." #: src/iuse.cpp msgid "You doubt you will have much luck catching fish here" @@ -259967,7 +267696,7 @@ msgstr "Куда распылить?" #: src/iuse.cpp #, c-format msgid "The %s is sprayed!" -msgstr "%s распылён!" +msgstr "%s покрывается распылённым веществом!" #: src/iuse.cpp #, c-format @@ -259977,7 +267706,7 @@ msgstr "%s выглядит ослеплённым." #: src/iuse.cpp #, c-format msgid "The %s is frozen!" -msgstr "%s замёрз!" +msgstr "%s замерзает!" #: src/iuse.cpp msgid "The RM13 combat armor's fuel cells are dead." @@ -260030,7 +267759,7 @@ msgstr "Ваша боевая броня RM13 выключена" #: src/iuse.cpp #, c-format msgid "You unpack your %s for use." -msgstr "Вы распаковали %s." +msgstr "Вы распаковали: %s." #: src/iuse.cpp msgid "Choose CBM to pack" @@ -260055,12 +267784,12 @@ msgstr "У вас не вышло правильно подготовить КБ #: src/iuse.cpp #, c-format msgid "You can't pack your %s until you take it off." -msgstr "Вы не можете свернуть %s, пока не снимете его." +msgstr "Вы не можете свернуть это (%s), пока не снимете." #: src/iuse.cpp #, c-format msgid "You pack your %s for storage." -msgstr "Вы сворачиваете ваш %s на хранение." +msgstr "Вы сворачиваете предмет (%s) на хранение." #: src/iuse.cpp msgid "You need batteries to cauterize wounds." @@ -260220,7 +267949,9 @@ msgstr "Вы пытаетесь, но не можете взломать окн #: src/iuse.cpp #, c-format msgid "You can't get sufficient leverage to open that with your %s." -msgstr "Вы не сможете создать достаточное усилие и открыть это с помощью %s." +msgstr "" +"Вы не сможете создать достаточное усилие и открыть это с помощью вашего " +"инструмента (%s)." #: src/iuse.cpp msgid "You break the glass." @@ -260485,7 +268216,7 @@ msgstr "Транспортное средство на пути!" #: src/iuse.cpp #, c-format msgid "You start drilling into the %1$s with your %2$s." -msgstr "Вы начинаете сверлить %1$s при помощи %2$s." +msgstr "Вы начинаете сверлить участок (%1$s) при помощи инструмента (%2$s)." #: src/iuse.cpp msgid "Mine where?" @@ -260498,7 +268229,7 @@ msgstr "Здесь нельзя раскапывать." #: src/iuse.cpp #, c-format msgid "You strike the %1$s with your %2$s." -msgstr "Вы атакуете %1$s, используя %2$s." +msgstr "Вы бьёте по поверхности (%1$s), используя свой инструмент (%2$s)." #: src/iuse.cpp msgid "Burrow where?" @@ -260511,7 +268242,8 @@ msgstr "Здесь нельзя рыть." #: src/iuse.cpp #, c-format msgid "You start tearing into the %1$s with your %2$s." -msgstr "Вы начинаете вгрызаться в %1$s при помощи %2$s." +msgstr "" +"Вы начинаете вгрызаться в поверхность (%1$s) при помощи инструмента (%2$s)." #: src/iuse.cpp msgid "buzzing" @@ -260615,7 +268347,7 @@ msgstr "У счётчика Гейгера включился индикатор #: src/iuse.cpp #, c-format msgid "Black goo emerges from the canister and envelopes a %s!" -msgstr "Чёрная слизь вылезла из контейнера и обволокла %s!" +msgstr "Чёрная слизь вылезла из контейнера и обволокла противника (%s)!" #: src/iuse.cpp msgid "Living black goo emerges from the canister!" @@ -260738,37 +268470,37 @@ msgstr "Здесь нечего оглушать!" #: src/iuse.cpp #, c-format msgid "Really shock %s?" -msgstr "Ударить током %s?" +msgstr "Ударить током цель (%s)?" #: src/iuse.cpp #, c-format msgid "You attempt to shock %s, but miss." -msgstr "Вы пытаетесь ударить %s током, но промахиваетесь." +msgstr "Вы пытаетесь ударить цель (%s) током, но промахиваетесь." #: src/iuse.cpp #, c-format msgid " attempts to shock %s, but misses." -msgstr " пытается ударить %s током, но промахивается." +msgstr " пытается ударить цель (%s) током, но промахивается." #: src/iuse.cpp #, c-format msgid "You shock %s!" -msgstr "Вы бьёте %s током!" +msgstr "Вы бьёте цель (%s) током!" #: src/iuse.cpp #, c-format msgid " shocks %s!" -msgstr " бьёт %s электрическим разрядом!" +msgstr " бьёт цель (%s) электрическим разрядом!" #: src/iuse.cpp #, c-format msgid "You unsuccessfully attempt to shock %s!" -msgstr "Вы безуспешно пытаетесь ударить током %s!" +msgstr "Вы безуспешно пытаетесь ударить током цель (%s)!" #: src/iuse.cpp #, c-format msgid " unsuccessfully attempts to shock %s!" -msgstr " безуспешно пытается ударить током %s!" +msgstr " безуспешно пытается ударить током цель (%s)!" #: src/iuse.cpp msgid "Insufficient power" @@ -260860,22 +268592,22 @@ msgstr "Телефон отключается." #, c-format msgctxt "dice" msgid "You roll a %1$d on your %2$d sided %3$s" -msgstr "Вы выбрасываете %1$d на вашем %2$d-гранном %3$s" +msgstr "Вы бросаете кубик (%3$s), и на нём выпадает%1$d из %2$d" #: src/iuse.cpp #, c-format msgid "You take a deep breath from your %s." -msgstr "Вы глубоко вдыхаете из %s." +msgstr "Вы глубоко вдыхаете из баллона (%s)." #: src/iuse.cpp #, c-format msgid "Air in your %s runs out." -msgstr "Воздух в вашем %s закончится." +msgstr "Воздух в вашем баллоне (%s) закончится." #: src/iuse.cpp #, c-format msgid "Your %s is empty." -msgstr "Ваш %s пуст." +msgstr "Ваш баллон (%s) пуст." #: src/iuse.cpp msgid "You turn off the regulator and close the air valve." @@ -260904,12 +268636,12 @@ msgstr "" #: src/iuse.cpp #, c-format msgid "You need to wear the %1$s before you can unfold it." -msgstr "Вы должны надеть %1$s перед тем, как разложить его." +msgstr "Вы должны надеть это (%1$s) перед тем, как разложить его." #: src/iuse.cpp #, c-format msgid "You cannot use the %1$s with another of it's kind." -msgstr "Вы не можете использовать %1$s с ещё одним его экземпляром." +msgstr "Вы не можете использовать это (%1$s) с ещё одним его экземпляром." #: src/iuse.cpp msgid "" @@ -260930,7 +268662,7 @@ msgstr "Вы отсоединяете и складываете портатив #: src/iuse.cpp #, c-format msgid "Your %s requires new filter!" -msgstr "Ваш %s требует замены фильтра!" +msgstr "Ваша маска (%s) требует замены фильтра!" #: src/iuse.cpp msgid " needs new gas mask filter!" @@ -260944,7 +268676,7 @@ msgstr "%s не имеет фильтра." #: src/iuse.cpp #, c-format msgid "You prepared your %s." -msgstr "Вы подготовили к использованию %s." +msgstr "Вы подготовили к использованию: %s." #: src/iuse.cpp msgid "What do you want to play?" @@ -260962,10 +268694,6 @@ msgstr "З М Е Й К А" msgid "Sokoban" msgstr "Сокобан" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "Сапёр" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "Lights on!" @@ -261055,13 +268783,14 @@ msgstr "Не настолько водонепроницаемое, чтобы #: src/iuse.cpp #, c-format msgid "You start cranking the %s to charge its %s." -msgstr "Вы начинаете работать с %s, чтобы зарядить %s." +msgstr "Вы начинаете работать с инструментом (%s), чтобы зарядить: %s." #: src/iuse.cpp #, c-format msgid "You could use the %s to charge its %s, but it's already charged." msgstr "" -"Вы могли бы использовать %s для зарядки %s, но заряд уже максимальный." +"Вы могли бы использовать инструмент (%s) для зарядки подходящего предмета " +"(%s), но заряд уже максимальный." #: src/iuse.cpp msgid "You need a rechargeable battery cell to charge." @@ -261069,7 +268798,7 @@ msgstr "Для зарядки требуется перезаряжаемая б #: src/iuse.cpp msgid "You cannot do… that while mounted." -msgstr "Во время верховой езды этого делать нельзя." +msgstr "Во время верховой езды этого делать точно нельзя." #: src/iuse.cpp msgid "It's waterproof, but oxygen maybe?" @@ -261104,12 +268833,12 @@ msgstr "Вы свистите в собачий свисток." #: src/iuse.cpp #, c-format msgid "Your %s looks ready to attack." -msgstr "%s выглядит готовым к атаке." +msgstr "%s демонстрирует готовность атаковать." #: src/iuse.cpp #, c-format msgid "Your %s goes docile." -msgstr "Ваш %s стал послушным." +msgstr "Ваше животное (%s) стало послушным." #: src/iuse.cpp msgid "You hear a low-pitched echoing howl." @@ -261118,17 +268847,17 @@ msgstr "Вы слышите низкий раскатистый вой." #: src/iuse.cpp #, c-format msgid "That %s is full!" -msgstr "%s заполнен!" +msgstr "Контейнер (%s) заполнен!" #: src/iuse.cpp #, c-format msgid "Draw blood from %s?" -msgstr "Взять кровь у %s?" +msgstr "Взять кровь: %s?" #: src/iuse.cpp #, c-format msgid "You drew blood from the %s…" -msgstr "Вы берёте кровь у %s…" +msgstr "Вы берёте кровь: %s…" #: src/iuse.cpp msgid "Draw your own blood?" @@ -261141,17 +268870,17 @@ msgstr "Вы берёте собственную кровь…" #: src/iuse.cpp #, c-format msgid "…but acidic blood melts the %s, destroying it!" -msgstr "…но кислотная кровь плавит и уничтожает %s!" +msgstr "…но кислотная кровь плавит и ёмкость (%s)!" #: src/iuse.cpp #, c-format msgid "…but acidic blood damages the %s!" -msgstr "…но кислотная кровь повреждает %s!" +msgstr "…но кислотная кровь повреждает ёмкость (%s)!" #: src/iuse.cpp #, c-format msgid "Use the mind splicer kit on the %s?" -msgstr "Использовать мыслесоединитель на %s?" +msgstr "Использовать мыслесоединитель - %s?" #: src/iuse.cpp msgid "Select storage media" @@ -261160,7 +268889,7 @@ msgstr "Выберите носитель" #: src/iuse.cpp #, c-format msgid "There's nothing to use the %s on here." -msgstr "Здесь %s не к чему применять." +msgstr "Здесь это (%s) не к чему применять." #: src/iuse.cpp msgid "Chop down which tree?" @@ -261274,12 +269003,12 @@ msgstr "%s ярко светится!" #: src/iuse.cpp #, c-format msgid "a deafening boom from %s %s" -msgstr "оглушительный взрыв с %s %s" +msgstr "оглушительный взрыв - %s %s" #: src/iuse.cpp #, c-format msgid "a disturbing scream from %s %s" -msgstr "душераздирающий вопль с %s %s" +msgstr "душераздирающий вопль - %s %s" #: src/iuse.cpp #, c-format @@ -261335,7 +269064,8 @@ msgstr "" #, c-format msgid "You need to be next to fire to heat something up with the %s." msgstr "" -"Вам нужно быть рядом с огнём, чтобы подогреть что-нибудь при помощи %s." +"Вам нужно быть рядом с огнём, чтобы подогреть что-нибудь при помощи посуды " +"(%s)." #: src/iuse.cpp msgid "Using hotplate:" @@ -261357,27 +269087,27 @@ msgstr "Ваше %s и так слишком влажное, чтобы впит #: src/iuse.cpp #, c-format msgid "You use the %s to clean yourself off, saturating it with slime!" -msgstr "Вы начисто вытерлись при помощи %s и пропитали его слизью!" +msgstr "Вы начисто вытерлись, теперь%s пропитано слизью!" #: src/iuse.cpp #, c-format msgid "You use the %s to dry off, saturating it with water!" -msgstr "Вы насухо вытерлись при помощи %s и пропитали его водой!" +msgstr "Вы насухо вытерлись, теперь %s пропитано водой!" #: src/iuse.cpp #, c-format msgid "You are already dry, the %s does nothing." -msgstr "Вы уже высохли, %s не имеет эффекта." +msgstr "Вы уже высохли, %s ничем не поможет." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "There's no room to unfold the %s." -msgstr "Здесь нет места, чтобы разложить %s." +msgstr "Здесь нет места, чтобы разложить транспорт (%s)." #: src/iuse.cpp #, c-format msgid "You painstakingly unfold the %s and make it ready to ride." -msgstr "Вы кропотливо раскладываете %s, и он готов ехать." +msgstr "Вы кропотливо раскладываете транспорт (%s), и он готов ехать." #: src/iuse.cpp msgid "You inject yourself with adrenaline." @@ -261462,12 +269192,12 @@ msgstr "Поменять ваши контактные линзы?" #: src/iuse.cpp #, c-format msgid "You replace your current %s." -msgstr "Вы заменили %s." +msgstr "Вы заменили: %s." #: src/iuse.cpp #, c-format msgid "You don't do anything with your %s." -msgstr "Вы не можете ничего сделать с %s." +msgstr "Вы не можете ничего сделать с этим (%s)." #: src/iuse.cpp #, c-format @@ -261494,12 +269224,12 @@ msgstr "Это не огнестрельное оружие!" #: src/iuse.cpp #, c-format msgid "You cannot repair your %s." -msgstr "Вы не можете починить %s." +msgstr "Вы не можете починить это (%s)." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You cannot improve your %s any more this way." -msgstr "Вы больше не можете усовершенствовать %s подобным образом." +msgstr "Вы больше не можете усовершенствовать оружие (%s) подобным образом." #: src/iuse.cpp #, c-format @@ -261515,17 +269245,17 @@ msgstr "" #: src/iuse.cpp #, c-format msgid "You accurize your %s." -msgstr "Вы сделали %s более точным." +msgstr "Вы сделали оружие (%s) более точным." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You repair your %s! ( %s-> %s)" -msgstr "Вы починили %s! ( %s-> %s)" +msgstr "Вы починили оружие (%s)! ( %s-> %s)" #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You repair your %s completely! ( %s-> %s)" -msgstr "Вы полностью починили %s! ( %s-> %s)" +msgstr "Вы полностью починили оружие (%s)! ( %s-> %s)" #: src/iuse.cpp msgid "Select tool to modify" @@ -261578,12 +269308,12 @@ msgstr "Нет злых роботов в округе." #: src/iuse.cpp #, c-format msgid "You start reprogramming the %s into an ally." -msgstr "Вы начали перепрограммировать %s в союзника." +msgstr "Вы начали перепрограммировать робота (%s) в союзника." #: src/iuse.cpp #, c-format msgid "A following %s goes into passive mode." -msgstr "Следующий за вами %s переходит в пассивный режим." +msgstr "Следующий за вами робот (%s) переходит в пассивный режим." #: src/iuse.cpp msgid "You are not commanding any robots." @@ -261592,7 +269322,7 @@ msgstr "Вы не командуете никакими роботами." #: src/iuse.cpp #, c-format msgid "A following %s goes into combat mode." -msgstr "Следующий за вами %s переходит в боевой режим." +msgstr "Следующий за вами робот (%s) переходит в боевой режим." #: src/iuse.cpp #, c-format @@ -261615,12 +269345,12 @@ msgstr[3] "Вы скачиваете %d новую песню во внутре #: src/iuse.cpp #, c-format msgid "You download a recipe for %s into the tablet's memory." -msgstr "Вы скачиваете рецепт %s в память планшета." +msgstr "Вы скачиваете рецепт (%s) в память планшета." #: src/iuse.cpp #, c-format msgid "Your tablet already has a recipe for %s." -msgstr "На твоём планшете есть рецепт %s." +msgstr "На вашем планшете уже есть рецепт: %s." #: src/iuse.cpp msgid "You have downloaded your photos." @@ -261636,7 +269366,7 @@ msgstr "На этой карте памяти нет никакой новой #: src/iuse.cpp msgid "bad" -msgstr "плохо" +msgstr "плохое" #: src/iuse.cpp msgid "exceptional" @@ -261644,7 +269374,7 @@ msgstr "исключительное" #: src/iuse.cpp msgid "fine" -msgstr "прекрасно" +msgstr "прекрасное" #: src/iuse.cpp msgid "Tablet's batteries are dead." @@ -261743,12 +269473,12 @@ msgstr "Вы чувствуете ностальгию, глядя на это #: src/iuse.cpp #, c-format msgid "You turned off music on your %s." -msgstr "Вы выключили музыку на %s." +msgstr "Вы выключили музыку на вашем устройстве (%s)." #: src/iuse.cpp #, c-format msgid "You turned on music on your %s." -msgstr "Вы включили музыку на %s." +msgstr "Вы включили музыку на вашем устройстве (%s)." #: src/iuse.cpp msgid "List recipes:" @@ -261777,12 +269507,12 @@ msgstr "Карта памяти не зашифрована." #: src/iuse.cpp #, c-format msgid "You successfully decrypted content on %s!" -msgstr "Вы успешно расшифровали содержимое на %s!" +msgstr "Вы успешно расшифровали содержимое (%s)!" #: src/iuse.cpp #, c-format msgid "You failed to decrypt the %s." -msgstr "Вы не смогли расшифровать %s." +msgstr "Вы не смогли расшифровать содержимое (%s)." #: src/iuse.cpp msgid "You tripped the firmware protection, and the card deleted its data!" @@ -261805,13 +269535,13 @@ msgstr " с надписью «%s»" #: src/iuse.cpp #, c-format msgid " with %s on it" -msgstr " с %s на нём" +msgstr " с предметом (%s) на нём" #: src/iuse.cpp msgctxt "" "Article 'a', replace it with empty string if it is not used in language" msgid "a " -msgstr "— " +msgstr " " #: src/iuse.cpp msgid " is on fire. " @@ -261831,7 +269561,7 @@ msgstr "на земле" #: src/iuse.cpp msgid "stuck" -msgstr "застрял" +msgstr "застрял(а)" #: src/iuse.cpp msgid " is stunned. " @@ -261943,7 +269673,7 @@ msgstr "верхом" #: src/iuse.cpp #, c-format msgid " is riding %s. " -msgstr " верхом на %s." +msgstr " верхом на скакуне (%s)." #: src/iuse.cpp msgid "A bionic LED is glowing softly. " @@ -261955,20 +269685,20 @@ msgstr "" #, c-format msgctxt "vehicle part" msgid "%1$s from %2$s" -msgstr "%1$s от %2$s" +msgstr "%1$s - %2$s" #. ~ %1$s: terrain description, %2$s: item name #: src/iuse.cpp #, c-format msgctxt "terrain and item" msgid "%1$s with a %2$s" -msgstr "%1$s с %2$s" +msgstr "%1$s - %2$s" #: src/iuse.cpp #, c-format msgctxt "someone stands/sits *on* something" msgid " on a %s." -msgstr " на %s." +msgstr " на предмете мебели (%s)." #: src/iuse.cpp #, c-format @@ -262007,7 +269737,7 @@ msgstr "На этой фотографии " #: src/iuse.cpp #, c-format msgid "It lies on the %s." -msgstr "Лежит на %s." +msgstr "Лежит на поверхности (%s)." #: src/iuse.cpp #, c-format @@ -262118,7 +269848,7 @@ msgstr "Погода — %s." #: src/iuse.cpp #, c-format msgid "%s appearance:" -msgstr "внешность %s:" +msgstr "внешность - %s:" #: src/iuse.cpp #, c-format @@ -262176,7 +269906,7 @@ msgstr "Вы неправильно сфокусировали камеру." #: src/iuse.cpp #, c-format msgid "A %s got in the way of your photo." -msgstr "%s оказывается на линии фотографирования." +msgstr "%s оказывается на линии съемки." #: src/iuse.cpp msgid "Strange… there's nothing in the center of picture?" @@ -262185,7 +269915,7 @@ msgstr "Странно… В середине фотографии ничего #: src/iuse.cpp #, c-format msgid "Strange… %s's not visible on the picture?" -msgstr "Странно… на фотографии не видно %s?" +msgstr "Странно… %s на фотографии не проявляется?" #: src/iuse.cpp #, c-format @@ -262199,7 +269929,7 @@ msgstr "Вы сделали селфи." #: src/iuse.cpp #, c-format msgid "You took a photo of %s." -msgstr "Вы делаете фото %s." +msgstr "Вы делаете фото: %s." #: src/iuse.cpp #, c-format @@ -262301,7 +270031,7 @@ msgstr "Зарядить чем?" #: src/iuse.cpp #, c-format msgid "You armed your RC car with %s." -msgstr "Вы положили %s в свою машинку на РУ." +msgstr "Вы положили предмет (%s) в свою машинку на РУ." #: src/iuse.cpp #, c-format @@ -262311,7 +270041,7 @@ msgstr "Машинка на радиоуправлении и %s? Как?" #: src/iuse.cpp #, c-format msgid "Your %s is too heavy or bulky for this RC car." -msgstr "%s слишком тяжело или громоздко для этой машинки на РУ." +msgstr "Это (%s) слишком тяжело или громоздко для этой машинки на РУ." #: src/iuse.cpp msgid "You disarmed your RC car." @@ -262381,16 +270111,16 @@ msgid "" "The %1$s in your %2$s would explode on this signal. Place it down before " "sending the signal." msgstr "" -"%1$s в вашем %2$s взорвётся, если послать этот сигнал. Лучше положить на " +"%1$s у вас (%2$s) взорвётся, если послать этот сигнал. Лучше положить на " "землю перед отправкой сигнала." #: src/iuse.cpp msgid "This vehicle's security system has locked you out!" -msgstr "Система безопасности автомобиля заперла вас!" +msgstr "Система безопасности автомобиля заперла транспорт!" #: src/iuse.cpp msgid "You trigger the alarm!" -msgstr "Вы активируете тревогу!" +msgstr "Вы заставили сигнализацию сработать!" #: src/iuse.cpp msgid "You quickly bypass the security system!" @@ -262455,8 +270185,8 @@ msgid "" "Despite using a controller, you still refuse to take control of this " "vehicle." msgstr "" -"Несмотря на использование контроллера, вы все еще не способны управлять этим" -" транспортным средством." +"Несмотря на использование контроллера, вы все еще не желаете управлять этим " +"транспортным средством." #: src/iuse.cpp msgid "You take control of the vehicle." @@ -262517,7 +270247,7 @@ msgid "" "%s charges." msgstr "" "В автоклаве не хватает заряда батарей для запуска рабочего цикла. Требуется " -"хотя бы %s заряда." +"хотя бы %s ед. заряда." #: src/iuse.cpp #, c-format @@ -262577,7 +270307,7 @@ msgstr "Действительно прекратить готовить?" #: src/iuse.cpp #, c-format msgid "You don't have a suitable container to store your %s." -msgstr "У вас нет подходящего контейнера для хранения %s." +msgstr "У вас нет подходящего контейнера для этого блюда (%s)." #: src/iuse.cpp #, c-format @@ -262587,7 +270317,7 @@ msgstr "Вы вытащили блюдо из мультиварки. %s пах #: src/iuse.cpp #, c-format msgid "You got the %s from the multi-cooker." -msgstr "Вы взяли %s из мультиварки." +msgstr "Вы взяли блюдо (%s) из мультиварки." #: src/iuse.cpp msgid "Choose desired meal:" @@ -262612,7 +270342,7 @@ msgstr "Настроение ни к чёрту, чтобы что-либо де #: src/iuse.cpp #, c-format msgid "You need a %s." -msgstr "Вам понадобится %s." +msgstr "Вам понадобится инструмент: %s." #: src/iuse.cpp #, c-format @@ -262647,7 +270377,7 @@ msgstr "Прицепите трос к машине, которая будет #: src/iuse.cpp msgid "That vehicle already has a tow-line attached." -msgstr "К это машине трос уже прицеплен." +msgstr "К этой машине трос уже прицеплен." #: src/iuse.cpp msgid "You can't attach the tow-line to an internal part." @@ -262659,7 +270389,7 @@ msgstr "Использование кабеля:" #: src/iuse.cpp msgid "Detach and re-spool the cable" -msgstr "Отсоединить кабель и снова смотать" +msgstr "Отсоединить и смотать кабель" #: src/iuse.cpp msgid "Attach loose end to vehicle" @@ -262676,7 +270406,7 @@ msgstr "Транспорт не может буксировать сам себ #: src/iuse.cpp #, c-format msgid "You link up the %1$s and the %2$s." -msgstr "Вы сцепляете %1$s и %2$s." +msgstr "Вы сцепляете: %1$s и %2$s." #: src/iuse.cpp msgid "Choose UPS:" @@ -262754,7 +270484,7 @@ msgstr "%s и так имеет доступ к своей собственно #: src/iuse.cpp #, c-format msgid "You link up the electric systems of the %1$s and the %2$s." -msgstr "Вы связываете электрические системы %1$s и %2$s." +msgstr "Вы связываете электрические системы: %1$s и %2$s." #: src/iuse.cpp msgid "You need soap to use this." @@ -262763,17 +270493,17 @@ msgstr "Для этого вам понадобится мыло." #: src/iuse.cpp #, c-format msgid "The %s's monitor slowly outputs the data…" -msgstr "Монитор %s медленно выводит данные…" +msgstr "Монитор (%s) медленно выводит данные…" #: src/iuse.cpp #, c-format msgid "The %1$s reads %2$s." -msgstr "%1$s показывает %2$s." +msgstr "%1$s показывает: %2$s." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You need to wear the %1$s before activating it." -msgstr "Вы должны надеть %1$s перед тем, как включить его." +msgstr "Вы должны надеть это (%1$s) перед тем, как включить его." #: src/iuse.cpp msgid "Choose hologram direction." @@ -262786,7 +270516,7 @@ msgstr "Здесь невозможно создать голограмму." #: src/iuse.cpp #, c-format msgid "The %s must be installed in a vehicle before being loaded." -msgstr "%s необходимо установить в транспорт, прежде чем загружать." +msgstr "%s: необходимо установить в транспорт, прежде чем загружать." #: src/iuse.cpp #, c-format @@ -262796,7 +270526,7 @@ msgstr "Ошибка восстановления монстра: %s" #: src/iuse.cpp #, c-format msgid "%s holding %s" -msgstr "%s держит %s" +msgstr "%s содержит: %s" #: src/iuse.cpp msgid "You cannot capture a creature mounted." @@ -262805,22 +270535,22 @@ msgstr "Нельзя ловить животных, будучи верхом." #: src/iuse.cpp #, c-format msgid "There is no place to put the %s." -msgstr "Негде разместить %s." +msgstr "Негде разместить существо (%s)." #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "Place the %s where?" -msgstr "Где разместить %s?" +msgstr "Где разместить существо (%s)?" #: src/iuse.cpp #, c-format msgid "You cannot place the %s there!" -msgstr "Вы не можете разместить %s здесь!" +msgstr "Вы не можете разместить существо (%s) здесь!" #: src/iuse.cpp #, c-format msgid "Grab which creature to place in the %s?" -msgstr "Какое существо поместить в %s?" +msgstr "Какое существо поместить сюда (%s)?" #: src/iuse.cpp msgid "There is no creature nearby you can capture." @@ -262829,27 +270559,27 @@ msgstr "Поблизости нет существа, которое можно #: src/iuse.cpp #, c-format msgid "You cannot use a %s there." -msgstr "Вы не можете использовать здесь %s." +msgstr "Вы не можете использовать здесь это (%s)." #: src/iuse.cpp #, c-format msgid "The %1$s is too big to put in your %2$s." -msgstr "Этот предмет (%1$s) слишком велик, чтобы убрать в %2$s!" +msgstr "Это существо (%1$s) слишком велико, чтобы поместиться сюда (%2$s)!" #: src/iuse.cpp #, c-format msgid "You capture the %1$s in your %2$s." -msgstr "Вы закрываете %1$s в ваш %2$s." +msgstr "Вы закрываете существо (%1$s) в подходящий контейнер (%2$s)." #: src/iuse.cpp #, c-format msgid "The %1$s avoids your attempts to put it in the %2$s." -msgstr "%1$s избегает ваших попыток убрать в %2$s." +msgstr "Существо (%1$s) избегает ваших попыток поместить его сюда (%2$s)." #: src/iuse.cpp #, c-format msgid "The %s can't capture nothing" -msgstr "%s не может никого поймать" +msgstr "Сюда (%s) нельзя никого поместить" #: src/iuse.cpp msgid "Put the ladder where?" @@ -262926,12 +270656,12 @@ msgstr "Вы чувствуете себя намного лучше — поч #: src/iuse.cpp #, c-format msgid "Wield the %s and start working?" -msgstr "Взять в руки %s и начать работать?" +msgstr "Взять в руки предмет (%s) и начать работать?" #: src/iuse.cpp #, c-format msgid "You pop a %s." -msgstr "Вы хлопаете %s." +msgstr "Вы закидываете лекарство (%s)." #: src/iuse.cpp msgid "" @@ -262942,7 +270672,7 @@ msgstr "Нет смысла принимать много мелатонина. #: src/iuse.cpp #, c-format msgid "You flip a %s." -msgstr "Вы подбросили %s." +msgstr "Вы подбросили монетку (%s)." #: src/iuse.cpp msgid "Heads!" @@ -262955,7 +270685,7 @@ msgstr "Решка!" #: src/iuse.cpp #, c-format msgid "Play a game with the %s?" -msgstr "Играть в игру с %s?" +msgstr "Играть в игру: %s?" #: src/iuse.cpp msgid "You start playing." @@ -263040,7 +270770,7 @@ msgstr "Очень сомнительно." #: src/iuse.cpp #, c-format msgid "You ask the %s, then flip it." -msgstr "Вы спросили %s, а после подбросили." +msgstr "Вы спросили шар (%s), а затем перевернули." #: src/iuse.cpp #, c-format @@ -263050,17 +270780,17 @@ msgstr "%s говорит: %s" #: src/iuse.cpp src/player.cpp #, c-format msgid "You can't do anything interesting with your %s." -msgstr "Вы не можете сделать ничего интересного с %s." +msgstr "Вы не можете сделать ничего интересного с этим (%s)." #: src/iuse_actor.cpp #, c-format msgid "The %s is empty!" -msgstr "Этот %s пуст!" +msgstr "Здесь (%s) пусто!" #: src/iuse_actor.cpp #, c-format msgid "You need to wield the %1$s before activating it." -msgstr "%1$s нужно надеть перед использованием." +msgstr "Это (%1$s) нужно взять в руки перед использованием." #: src/iuse_actor.cpp msgid "You can't do that while underwater" @@ -263070,10 +270800,10 @@ msgstr "Вы не можете это делать под водой." #, c-format msgid "You need a tool with %s." msgid_plural "You need tools with %s." -msgstr[0] "Вам понадобятся инструменты с %s." -msgstr[1] "Вам понадобятся инструменты с %s." -msgstr[2] "Вам понадобятся инструменты с %s." -msgstr[3] "Вам понадобятся инструменты с %s." +msgstr[0] "Вам понадобится инструмент с: %s." +msgstr[1] "Вам понадобятся инструменты с: %s." +msgstr[2] "Вам понадобятся инструменты с: %s." +msgstr[3] "Вам понадобятся инструменты с: %s." #: src/iuse_actor.cpp #, c-format @@ -263087,7 +270817,7 @@ msgstr "Ходов до взрыва: " #: src/iuse_actor.cpp #, c-format msgid "You unpack the %s." -msgstr "Вы распаковываете%s." +msgstr "Вы распаковываете: %s." #: src/iuse_actor.cpp msgid "This item could be unpacked to receive something." @@ -263126,17 +270856,18 @@ msgstr "Вам нужен шприц, для инъекции эт #: src/iuse_actor.cpp #, c-format msgid "You need %1$s to consume %2$s!" -msgstr "Вам потребуется %1$s, чтобы употребить %2$s!" +msgstr "" +"Вам потребуется подходящий инструмент (%1$s), чтобы употребить это (%2$s)!" #: src/iuse_actor.cpp #, c-format msgid "I need a %1$s to consume %2$s!" -msgstr "Мне нужен %1$s, чтобы употребить %2$s!" +msgstr "Мне нужен %1$s, чтобы употребить это - %2$s!" #: src/iuse_actor.cpp #, c-format msgid "There is no adjacent square to release the %s in!" -msgstr "Недостаточно места, чтобы выпустить %s." +msgstr "Недостаточно места, чтобы выпустить существо (%s)." #: src/iuse_actor.cpp #, c-format @@ -263147,7 +270878,8 @@ msgstr "Вы не можете разместить %s здесь." #, c-format msgid "" "If you had standard factory-built %1$s bullets, you could load the %2$s." -msgstr "Если бы у вас были заводские %1$s пули, вы бы смогли зарядить %2$s." +msgstr "" +"Если бы у вас были заводские пули (%1$s) , вы бы смогли зарядить это (%2$s)." #. ~ First %s is the ammo item (with plural form and count included), second #. is the monster name @@ -263155,10 +270887,10 @@ msgstr "Если бы у вас были заводские %1$s пули, вы #, c-format msgid "You load %1$d x %2$s round into the %3$s." msgid_plural "You load %1$d x %2$s rounds into the %3$s." -msgstr[0] "Вы зарядили %1$d патрон %2$s в %3$s." -msgstr[1] "Вы зарядили %1$d патрона %2$s в %3$s." -msgstr[2] "Вы зарядили %1$d патронов %2$s в %3$s." -msgstr[3] "Вы зарядили %1$d патрон %2$s в %3$s." +msgstr[0] "Вы зарядили %1$d патрон %2$s сюда (%3$s)." +msgstr[1] "Вы зарядили %1$d патрона %2$s сюда (%3$s)." +msgstr[2] "Вы зарядили %1$d патронов %2$s сюда (%3$s)." +msgstr[3] "Вы зарядили %1$d патрон %2$s сюда (%3$s)." #: src/iuse_actor.cpp #, c-format @@ -263181,7 +270913,7 @@ msgstr "Здесь нет места для спавна НПС!" #: src/iuse_actor.cpp #, c-format msgid "You should wear the %s before activating it." -msgstr "Вы должны надеть %s, перед тем как включить его." +msgstr "Вы должны надеть это (%s), перед тем как использовать его." #: src/iuse_actor.cpp #, c-format @@ -263238,7 +270970,7 @@ msgid "" "which can then be used as %s." msgstr "" "Можно активировать и превратить в мебель (%s), " -"способную служить как %s." +"способную служить как: %s." #: src/iuse_actor.cpp msgid "Deploy where?" @@ -263251,12 +270983,12 @@ msgstr "Вы пытаетесь стать одним целым с мебель #: src/iuse_actor.cpp #, c-format msgid "The space under %s is too cramped to deploy a %s in." -msgstr "Пространства под %s слишком мало, чтобы разместить %s." +msgstr "Под этим (%s) слишком мало места, чтобы разместить: %s." #: src/iuse_actor.cpp #, c-format msgid "You can't deploy a %s there." -msgstr "Вы не можете разместить %s здесь." +msgstr "Вы не можете разместить это (%s) здесь." #: src/iuse_actor.cpp msgid "There is already furniture at that location." @@ -263265,12 +270997,12 @@ msgstr "В этом месте уже стоит мебель." #: src/iuse_actor.cpp #, c-format msgid "There isn't anything new on the %s." -msgstr "На этой %s нет ничего нового." +msgstr "Здесь (%s) нет ничего нового." #: src/iuse_actor.cpp #, c-format msgid "You should read your %s when you get to the surface." -msgstr "Вам следует прочесть %s, когда вы доберетесь до поверхности." +msgstr "Вам следует прочесть это (%s), когда вы доберетесь до поверхности." #: src/iuse_actor.cpp msgid "Light where?" @@ -263278,7 +271010,7 @@ msgstr "Что поджечь?" #: src/iuse_actor.cpp msgid "You would set yourself on fire." -msgstr "Ты бы зажёг сам себя." +msgstr "Ты так себя подожжёшь." #: src/iuse_actor.cpp msgid "But you're already smokin' hot." @@ -263330,12 +271062,12 @@ msgstr "С вашим уровнем навыка разведение огня #: src/iuse_actor.cpp #, c-format msgid "Can't salvage anything from %s." -msgstr "Нельзя извлечь что-нибудь из %s." +msgstr "Нельзя извлечь ничего отсюда (%s)." #: src/iuse_actor.cpp #, c-format msgid "Try disassembling the %s instead." -msgstr "Вместо этого попытайтесь разобрать %s." +msgstr "Вместо этого попытайтесь разобрать: %s." #: src/iuse_actor.cpp #, c-format @@ -263345,7 +271077,7 @@ msgstr "%s из материала, который нельзя разрезат #: src/iuse_actor.cpp #, c-format msgid "Please empty the %s before cutting it up." -msgstr "Пожалуйста, опустошите %s перед тем, как разрезать." +msgstr "Пожалуйста, опустошите это (%s) перед тем, как разрезать." #: src/iuse_actor.cpp #, c-format @@ -263365,12 +271097,12 @@ msgstr "Вы ведь носите это, вы уверены?" #: src/iuse_actor.cpp #, c-format msgid "You can not cut the %s with itself." -msgstr "Вы не можете разрезать %s при помощи этого же самого предмета." +msgstr "Вы не можете разрезать это (%s) при помощи этого же самого предмета." #: src/iuse_actor.cpp #, c-format msgid "You try to salvage materials from the %s." -msgstr "Вы пытаетесь извлечь материалы из %s." +msgstr "Вы пытаетесь извлечь материалы из: %s." #: src/iuse_actor.cpp #, c-format @@ -263393,7 +271125,8 @@ msgstr "Вы не можете нанести надпись на не твёр #: src/iuse_actor.cpp #, c-format msgid "You can't %1$s %2$s because of the material it is made of." -msgstr "Вы не можете %1$s %2$s из-за материала, из которого это изготовлено." +msgstr "" +"Вы не можете %1$s это (%2$s) из-за материала, из которого это изготовлено." #: src/iuse_actor.cpp #, c-format @@ -263417,7 +271150,7 @@ msgstr "(Чтобы удалить, очистите текст и подтве #, c-format msgctxt "carving" msgid "%1$s on the %2$s is: " -msgstr "%1$s на %2$s: " +msgstr "%1$s на предмете (%2$s): " #: src/iuse_actor.cpp #, c-format @@ -263427,7 +271160,7 @@ msgstr "%s что?" #: src/iuse_actor.cpp #, c-format msgid "%s on what?" -msgstr "%s на что?" +msgstr "%s на чём?" #: src/iuse_actor.cpp msgid "The terrain" @@ -263448,7 +271181,7 @@ msgstr "Нанести надпись на что?" #: src/iuse_actor.cpp #, c-format msgid "You try to bend your %s, but fail." -msgstr "Вы пытаетесь согнуть %s, но не получается." +msgstr "Вы пытаетесь согнуть это (%s), но не получается." #: src/iuse_actor.cpp msgid "You cauterize yourself." @@ -263491,7 +271224,7 @@ msgstr " не может играть на инструменте, бу #: src/iuse_actor.cpp msgid "You can't play music underwater" -msgstr "Вы не можете играть музыку под водой." +msgstr "Вы не можете играть музыку под водой" #: src/iuse_actor.cpp msgid " can't play music underwater" @@ -263500,45 +271233,45 @@ msgstr " не может играть на музыкальном ин #: src/iuse_actor.cpp #, c-format msgid "You stop playing your %s" -msgstr "Вы прекратили играть на инструменте (%s)." +msgstr "Вы прекратили играть на инструменте (%s)" #: src/iuse_actor.cpp #, c-format msgid " stops playing their %s" -msgstr " прекращает играть на инструменте (%s)." +msgstr " прекращает играть на инструменте (%s)" #: src/iuse_actor.cpp #, c-format msgid "You need to hold or wear %s to play it" -msgstr "%s нужно держать в руках или повесить на шею, чтобы играть." +msgstr "Это (%s) нужно держать в руках или повесить на шею, чтобы играть" #: src/iuse_actor.cpp #, c-format msgid " needs to hold or wear %s to play it" msgstr "" -" нужно держать в руках или повесить на шею инструмент (%s), чтобы " -"играть на нём. " +" придётся держать в руках или повесить на шею инструмент (%s), " +"чтобы играть на нём" #: src/iuse_actor.cpp #, c-format msgid "You feel too weak to play your %s" -msgstr "Вы чувствуете себя слишком слабым, чтобы играть на %s." +msgstr "Вы чувствуете себя слишком слабым, чтобы играть на инструменте (%s)." #: src/iuse_actor.cpp #, c-format msgid " feels too weak to play their %s" msgstr "" -" чувствует себя слишком слабым, чтобы играть на инструменте (%s)." +" чувствует себя слишком слабо, чтобы играть на инструменте (%s)." #: src/iuse_actor.cpp #, c-format msgid "You start playing your %s" -msgstr "Вы начали играть на %s." +msgstr "Вы начали играть на инструменте (%s)." #: src/iuse_actor.cpp #, c-format msgid " starts playing their %s" -msgstr " прекращает играть на инструменте (%s)." +msgstr " начинает играть на инструменте (%s)." #: src/iuse_actor.cpp #, c-format @@ -263631,7 +271364,7 @@ msgstr "До получения уровня заклинания" #: src/iuse_actor.cpp #, c-format msgid "This item casts %1$s at level %2$i." -msgstr "Этот предмет кастует %1$s на уровне %2$i." +msgstr "Этот предмет кастует заклинание %1$s на уровне %2$i." #: src/iuse_actor.cpp msgid "This item never fails." @@ -263640,17 +271373,18 @@ 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 "Вы думаете, что положить %1$s в %2$s — не очень хорошая идея." +msgstr "" +"Вы думаете, что положить это (%1$s) сюда (%2$s) — не очень хорошая идея." #: src/iuse_actor.cpp #, c-format msgid "You holster your %s" -msgstr "Вы убираете %s в кобуру." +msgstr "Вы убираете оружие (%s) в кобуру." #: src/iuse_actor.cpp #, c-format msgid "You need to unwield your %s before using it." -msgstr "Вам нужно убрать %s из рук перед использованием." +msgstr "Вам нужно убрать это (%s) из рук перед использованием." #: src/iuse_actor.cpp msgid "Holster item" @@ -263659,16 +271393,16 @@ msgstr "Убрать вещь в кобуру" #: src/iuse_actor.cpp #, c-format msgid "Draw %s" -msgstr "Вытащить %s" +msgstr "Вытащить из кобуры: %s" #: src/iuse_actor.cpp src/monexamine.cpp #, c-format msgid "Use %s" -msgstr "Использовать %s" +msgstr "Использовать: %s" #: src/iuse_actor.cpp msgid "Can be activated to store suitable items." -msgstr "Может быть активирован для хранения подходящих предметов." +msgstr "Можно активировать для хранения подходящих предметов." #: src/iuse_actor.cpp #, c-format @@ -263678,7 +271412,7 @@ msgstr "Может быть использовано для сборки: %s" #: src/iuse_actor.cpp #, c-format msgid "Insufficient ammunition to assemble %s" -msgstr "Недостаточно боеприпасов для сборки %s." +msgstr "Недостаточно боеприпасов для сборки: %s." #: src/iuse_actor.cpp msgid " can't do that while mounted." @@ -263691,17 +271425,17 @@ msgstr "В вашем инструменте не хватает зарядов #: src/iuse_actor.cpp #, c-format msgid "Your %s is not made of any of:" -msgstr "Ваш %s сделан не из следующих материалов:" +msgstr "Предмет (%s) сделан не из следующих материалов:" #: src/iuse_actor.cpp #, c-format msgid "%s (repaired using %s)" -msgstr "%s (починено при помощи %s)" +msgstr "%s (чинится при помощи: %s)" #: src/iuse_actor.cpp #, c-format msgid "You don't have enough %s to do that. Have: %d, need: %d" -msgstr "Вам не хватает %s для этого. Есть: %d, нужно: %d" +msgstr "Вам не хватает компонентов (%s) для этого. Есть: %d, нужно: %d" #: src/iuse_actor.cpp msgid "That requires gunsmithing tools." @@ -263725,7 +271459,7 @@ msgstr "Предмет (%s) уже максимально улучшен." #: src/iuse_actor.cpp #, c-format msgid "You damage your %s! ( %s-> %s)" -msgstr "Вы повреждаете %s! ( %s-> %s)" +msgstr "Вы повреждаете предмет (%s)! ( %s-> %s)" #: src/iuse_actor.cpp msgid "You destroy it!" @@ -263734,27 +271468,27 @@ msgstr "Вы уничтожили предмет!" #: src/iuse_actor.cpp #, c-format msgid "You take your %s in, improving the fit." -msgstr "Вы ушиваете %s, подгоняя вещь по фигуре." +msgstr "Вы ушиваете предмет (%s), подгоняя вещь по фигуре." #: src/iuse_actor.cpp #, c-format msgid "You resize the %s to accommodate your tiny build." -msgstr "Вы подгоняете %s по вашему крохотному размеру." +msgstr "Вы подгоняете предмет (%s) по вашему крохотному размеру." #: src/iuse_actor.cpp #, c-format msgid "You adjust the %s back to its normal size." -msgstr "Вы возвращаете обычный размер %s." +msgstr "Вы возвращаете обычный размер предмету (%s)." #: src/iuse_actor.cpp #, c-format msgid "You make your %s extra sturdy." -msgstr "Вы сделали %s очень прочным." +msgstr "Вы сделали предмет (%s) очень прочным." #: src/iuse_actor.cpp #, c-format msgid "Your %s is already enhanced." -msgstr "%s уже улучшено." +msgstr "Предмет (%s) уже улучшен." #: src/iuse_actor.cpp msgid "Refitting" @@ -263775,7 +271509,7 @@ msgstr "Практика" #: src/iuse_actor.cpp #, c-format msgid "Repair %s" -msgstr "Починить %s" +msgstr "Починить: %s" #: src/iuse_actor.cpp msgid "You can't use filthy items for healing." @@ -263832,7 +271566,7 @@ msgstr "Ваша рана всё ещё болит." #: src/iuse_actor.cpp #, c-format msgid "You finish using the %s." -msgstr "Вы закончили использовать %s." +msgstr "Вы закончили использовать предмет (%s)." #: src/iuse_actor.cpp msgid "That arm is broken. It needs surgical attention or a splint." @@ -263846,7 +271580,7 @@ msgstr "" #: src/iuse_actor.cpp msgid "'s biology is not compatible with that item." -msgstr "Биология несовместима с этим предметом." +msgstr "Биология NPC () несовместима с этим предметом." #: src/iuse_actor.cpp msgid "Select a body part for: " @@ -263857,7 +271591,7 @@ msgstr "Выберите часть тела: " #, c-format msgctxt "healing" msgid "Select a body part of %1$s for %2$s:" -msgstr "Выберите часть тела %1$s для %2$s:" +msgstr "Выберите часть тела пациента (%1$s) для применения лечения (%2$s):" #: src/iuse_actor.cpp msgid "Healing effects " @@ -263922,37 +271656,37 @@ msgstr "Ходов на использование: " #: src/iuse_actor.cpp #, c-format msgid "Yeah. Place the %s at your feet. Real damn smart move." -msgstr "Ага, разместите %s прямо под ногами. Чертовски умный ход." +msgstr "Ага, разместите ловушку (%s) прямо под ногами. Чертовски умный ход." #: src/iuse_actor.cpp #, c-format msgid "You can't place a %s there." -msgstr "Вы не можете разместить %s здесь." +msgstr "Вы не можете разместить ловушку (%s) здесь." #: src/iuse_actor.cpp #, c-format msgid "You must place the %s between two solid tiles." -msgstr "Вы можете установить %s только между двумя твёрдыми клетками." +msgstr "Вы можете установить это (%s) только между двумя твёрдыми клетками." #: src/iuse_actor.cpp #, c-format msgid "The %s needs a %s adjacent to it." -msgstr "Для %s нужно, чтобы рядом был %s." +msgstr "Для этой ловушки (%s) нужно, чтобы рядом было: %s." #: src/iuse_actor.cpp #, c-format msgid "You can't place a %s there. It contains a trap already." -msgstr "Тут уже есть ловушка, поэтому %s не получится разместить здесь." +msgstr "Тут уже есть ловушка, поэтому эту (%s) не получится разместить здесь." -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" -msgstr "Вы активируете %s!" +msgstr "Вы активируете ловушку (%s)!" #: src/iuse_actor.cpp #, c-format msgid "Place %s where?" -msgstr "Где разместить %s?" +msgstr "Где разместить это (%s)?" #: src/iuse_actor.cpp #, c-format @@ -264045,17 +271779,17 @@ msgstr " внезапно падает на землю!" #: src/iuse_actor.cpp #, c-format msgid "Put up the %s where (%dx%d clear area)?" -msgstr "Куда положить %s? (%dx%d чистая зона)?" +msgstr "Где установить палатку (%s)? (%dx%d чистая зона)?" #: src/iuse_actor.cpp #, c-format msgid "The %s is in the way." -msgstr "%s на пути." +msgstr "%s мешается." #: src/iuse_actor.cpp #, c-format msgid "The %s in that direction isn't suitable for placing the %s." -msgstr "%s в этом направлении не подходит для размещения %s." +msgstr "%s в этом направлении не подходит для размещения палатки (%s)." #: src/iuse_actor.cpp #, c-format @@ -264065,7 +271799,7 @@ msgstr "Здесь уже есть мебель (%s)." #: src/iuse_actor.cpp #, c-format msgid "You set up the %s on the ground." -msgstr "Вы поставили %s на землю." +msgstr "Вы поставили палатку (%s) на землю." #: src/iuse_actor.cpp msgid "Examine the center square to pack it up again." @@ -264108,13 +271842,13 @@ msgstr "Какую модификацию вы хотите сделать?" #: src/iuse_actor.cpp #, c-format msgid "Can't %1$s (need %2$d thread loaded)" -msgstr "Невозможно %1$s (нужно %2$d нитки)" +msgstr "Невозможно %1$s (нужны нитки -%2$d)" #. ~ %1$s: modification desc, %2$d: number of items needed, %3$s: items needed #: src/iuse_actor.cpp #, c-format msgid "Can't %1$s (need %2$d %3$s)" -msgstr "Невозможно %1$s (нужно %2$d %3$s)" +msgstr "Невозможно %1$s (нужно %2$d-%3$s)" #. ~ %1$s: modification desc, %2$s: mod name #: src/iuse_actor.cpp @@ -264160,7 +271894,7 @@ msgstr "Вы уверены? Вы не сможете получить обра #: src/iuse_actor.cpp #, c-format msgid "You damage your %s trying to modify it! ( %s-> %s)" -msgstr "В попытке улучшить %s вы повреждаете его! ( %s-> %s)" +msgstr "В попытке улучшить предмет (%s) вы повреждаете его! ( %s-> %s)" #: src/iuse_actor.cpp msgid "You fail to modify the clothing, and you waste thread and materials." @@ -264169,25 +271903,25 @@ msgstr "Вы не смогли модифицировать одежду и по #: src/iuse_actor.cpp #, c-format msgid "You modify your %s, but waste a lot of thread." -msgstr "Вы модифицируете %s, но потратили много ниток." +msgstr "Вы модифицируете предмет (%s), но потратили много ниток." #: src/iuse_actor.cpp #, c-format msgid "You modify your %s!" -msgstr "Вы модифицируете %s!" +msgstr "Вы модифицируете предмет (%s)!" #: src/iuse_actor.cpp #, c-format msgid "You use the %s to mask your scent" -msgstr "Вы используете %s, чтобы замаскировать свой запах" +msgstr "Вы используете это (%s), чтобы замаскировать свой запах" #: src/iuse_actor.h msgid "Carve" -msgstr "выстрогать" +msgstr "Вырезать" #: src/iuse_actor.h msgid "Carved" -msgstr "Вырезанная" +msgstr "Вырезано" #: src/iuse_software.cpp msgid "You found kitten!" @@ -265158,6 +272892,10 @@ msgstr "Лёгкий" msgid "Intermediate" msgstr "Средний" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "Эксперт" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "Ширина уровня:" @@ -265558,7 +273296,7 @@ msgstr "" #: src/magic.cpp #, c-format msgid "You learned %s!" -msgstr "Вы выучили %s!" +msgstr "Вы выучили: %s!" #: src/magic.cpp msgid "You can't learn this spell." @@ -265567,7 +273305,7 @@ msgstr "Вы не можете выучить это заклинание." #: src/magic.cpp #, c-format msgid "All knowledge of %s leaves you." -msgstr "Вы забываете все о %s." +msgstr "Вы забываете все о: %s." #: src/magic.cpp msgid "Choose a new hotkey for this spell." @@ -265581,7 +273319,7 @@ msgstr "Эта горячая клавиша уже используется." #, c-format msgid "%c set. Close and reopen spell menu to refresh list with changes." msgstr "" -"%cустановлен. Закройте и снова откройте менюя заклинаний, чтобы обновить " +"%c назначено. Закройте и снова откройте меню заклинаний, чтобы обновить " "список." #: src/magic.cpp @@ -265667,7 +273405,7 @@ msgstr "Стоимость каста (затрудн.)" #: src/magic.cpp #, c-format msgid " (%s current)" -msgstr " (%s сейчас)" +msgstr " (сейчас %s)" #: src/magic.cpp msgid "Not Enough Energy" @@ -265736,6 +273474,15 @@ msgstr "Порождение" msgid "Summon" msgstr "Призыв" +#: src/magic.cpp +msgid "random creature" +msgstr "случайное существо" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "Цели ниже %d ОЗ становятся: %s" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "Дальность" @@ -265750,15 +273497,19 @@ msgstr "Выберите заклинание" #: src/magic.cpp msgid "AoE" -msgstr "область эффекта" +msgstr "Эффект по области" #: src/magic.cpp msgid "Spawned" -msgstr "Порожденный" +msgstr "Порождает" + +#: src/magic.cpp +msgid "Threshold" +msgstr "Порог" #: src/magic.cpp msgid "Recover" -msgstr "Восстановить" +msgstr "Восстанваливает" #: src/magic.cpp msgid "Damage Type" @@ -265809,7 +273560,16 @@ msgstr "Ваши раны равномерно распределяются." #: src/magic_spell_effect.cpp #, c-format msgid "%s wounds are closing up!" -msgstr "Раны %s затягиваются!" +msgstr "Раны (%s) затягиваются!" + +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "%s превращается в: %s." + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "Ваша цель сопротивляется превращению." #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." @@ -265898,7 +273658,7 @@ msgstr "Мир" #: src/main_menu.cpp msgctxt "Main Menu" msgid "pecial" -msgstr "Особое" +msgstr "Особые режимы" #: src/main_menu.cpp msgctxt "Main Menu" @@ -266020,7 +273780,7 @@ msgstr "Случайный персонаж" #: src/main_menu.cpp msgctxt "Main Menu|New Game" msgid "Play Now! (ixed Scenario)" -msgstr "Сразу в игру! ( фиксированный сценарий)" +msgstr "Сразу в игру! (фиксированный сценарий)" #: src/main_menu.cpp msgctxt "Main Menu|New Game" @@ -266074,7 +273834,7 @@ msgstr "Нажмите [d], чтобы удалить ша #: src/main_menu.cpp #, c-format msgid "Are you sure you want to delete %s?" -msgstr "Вы уверены, что хотите удалить %s?" +msgstr "Вы уверены, что хотите удалить шаблон: %s?" #: src/main_menu.cpp msgid "Sorry, something went wrong." @@ -266113,7 +273873,7 @@ msgstr "%1$s своим весом" #: src/map.cpp #, c-format msgid "A towing cable snaps off of the %s." -msgstr "Буксирный трос отцепляется от %s." +msgstr "Буксирный трос отцепляется от транспорта (%s)." #: src/map.cpp #, c-format @@ -266128,7 +273888,7 @@ msgstr "%s" #: src/map.cpp #, c-format msgid "The %s you were grabbing is destroyed!" -msgstr "%s, что вы тащили, уничтожен!" +msgstr "%s, что вы тащили, уничтожается!" #: src/map.cpp msgid "Smashable." @@ -266169,34 +273929,34 @@ msgstr "Упор для сошек." #: src/map.cpp #, c-format msgid "Falling %s hits you!" -msgstr "Вас задевает падающий %s!" +msgstr "%s падает и задевает вас!" #: src/map.cpp #, c-format msgid "Falling %s hits " -msgstr " задевает падающий %s!" +msgstr "%s падает и задевает NPC ()!" #: src/map.cpp #, c-format msgid "The %s destroys several items!" -msgstr "%s уничтожил несколько вещей!" +msgstr "%s уничтожает несколько вещей!" #. ~ %1$s: the cause of destruction, %2$s: destroyed item name #: src/map.cpp #, c-format msgid "The %1$s destroys the %2$s!" -msgstr "%1$s уничтожил %2$s!" +msgstr "%1$s уничтожает что-то (%2$s)!" #: src/map.cpp #, c-format msgid "The %s damages several items." -msgstr "%s повредил несколько вещей." +msgstr "%s повреждает несколько вещей." #. ~ %1$s: the cause of damage, %2$s: damaged item name #: src/map.cpp #, c-format msgid "The %1$s damages the %2$s." -msgstr "%1$s повредил %2$s." +msgstr "%1$s повреждает что-то (%2$s)." #: src/map.cpp msgid "an alarm go off!" @@ -266208,11 +273968,11 @@ msgstr "звук бьющегося стекла." #: src/map.cpp msgid "You are crushed by the falling debris!" -msgstr "Вас зацепили падающие обломки!" +msgstr "На вас падают обломки!" #: src/map.cpp msgid " is crushed by the falling debris!" -msgstr "Падающие обломки зацепили !" +msgstr "На NPC () падают обломки!" #: src/map.cpp msgid "The shot is stopped by the reinforced glass door!" @@ -266273,34 +274033,27 @@ msgstr "%d мин. осталось до окончания цикла стер #: src/map.cpp #, c-format msgid "The autoclave in the %s has finished its cycle." -msgstr "Автоклав в %s завершил рабочий цикл." +msgstr "Автоклав в транспорте (%s) завершил рабочий цикл." #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "%s снят." - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "Вы успешно обезвредили ловушку!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "Вы не смогли обезвредить ловушку." +msgid "Something has crawled out of the %s plants!" +msgstr "Что-то вылезло из побегов (%s)!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "Вы не смогли обезвредить ловушку, и она сработала!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "Что-то вылезло из предмета (%s)!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "Что-то вылезло из побегов (%s)!" +msgid "You've spotted a %1$ss!" +msgstr "Вы заметили: %1$s !" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "Что-то вылезло из %s!" +msgid " triggers a %s!" +msgstr " вызывает срабатывание: %s!" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -266364,12 +274117,12 @@ msgstr "%s бьёт вас!" #: src/map_field.cpp #, c-format msgid "A %1$s hits %2$s!" -msgstr "%1$s бьёт %2$s!" +msgstr "%1$s бьёт: %2$s!" #: src/map_field.cpp #, c-format msgid "A %1$s hits the %2$s!" -msgstr "%1$s бьёт %2$s!" +msgstr "%1$s бьёт: %2$s!" #: src/map_field.cpp msgid "The acid burns your body!" @@ -266377,7 +274130,7 @@ msgstr "Кислота жжёт ваше тело!" #: src/map_field.cpp msgid "The acid burns s body!" -msgstr "Кислота жжёт тело !" +msgstr "Кислота жжёт тело NPC ()!" #: src/map_field.cpp msgid "The acid burns your legs and feet!" @@ -266385,7 +274138,7 @@ msgstr "Кислота разъедает ваши ноги" #: src/map_field.cpp msgid "The acid burns s legs and feet!" -msgstr "Кислота разъедает ноги и ступни !" +msgstr "Кислота разъедает ноги и ступни NPC ()!" #: src/map_field.cpp msgid "You're lying in a pool of acid" @@ -266429,7 +274182,7 @@ msgstr " загорелся!" #: src/map_field.cpp msgid "s whole body is burning!" -msgstr "Всё тело горит!" +msgstr "Всё тело NPC () горит!" #: src/map_field.cpp msgid "You're standing in a fire!" @@ -266453,7 +274206,7 @@ msgstr "Вас охватило пламя!" #: src/map_field.cpp msgid " is torched by flames!" -msgstr "Пламя охватывает !" +msgstr "Пламя охватывает NPC ()!" #: src/map_field.cpp msgid "These flames do not burn you." @@ -266461,11 +274214,11 @@ msgstr "Огонь не обжигает вас." #: src/map_field.cpp msgid "Those flames do not burn ." -msgstr "Огонь не обжигает ." +msgstr "Огонь не обжигает NPC ()." #: src/map_field.cpp msgid "You're painfully electrocuted!" -msgstr "Вас поджарило электричеством!" +msgstr "Вас болезненно бьёт током!" #: src/map_field.cpp msgid " is shocked!" @@ -266485,12 +274238,12 @@ msgstr ", похоже, не ощущает эффекта от эле #: src/map_field.cpp msgid "You're violently teleported!" -msgstr "Вас резко телепортировало!" +msgstr "Вас жёстко телепортировало!" #: src/map_field.cpp #, c-format msgid "The bees sting you in %s!" -msgstr "Пчёлы жалят вас в %s!" +msgstr "Пчёлы жалят вас (%s)!" #: src/map_field.cpp msgid "The incendiary burns you!" @@ -266498,7 +274251,7 @@ msgstr "Зажигательное средство обжигает вас!" #: src/map_field.cpp msgid "The incendiary burns !" -msgstr "Зажигательное средство обжигает !" +msgstr "Зажигательное средство обжигает NPC ()!" #: src/map_field.cpp msgid "The incendiary melts into your skin!" @@ -266506,7 +274259,7 @@ msgstr "Зажигательное средство вплавилось в ва #: src/map_field.cpp msgid "The incendiary melts into s skin!" -msgstr "Зажигательное средство вплавилось в кожу !" +msgstr "Зажигательное средство вплавилось в кожу NPC ()!" #: src/map_field.cpp #, c-format @@ -266565,7 +274318,7 @@ msgstr "Инициировать подземные толчки" #: src/mapgen.cpp msgid "Wreckage" -msgstr "обломки аварии" +msgstr "Обломки аварии" #: src/mapgen.cpp msgid "Log Console" @@ -266635,11 +274388,11 @@ msgstr "Требования: " #: src/martialarts.cpp msgid "activate" -msgstr "активировать" +msgstr "активироваться" #: src/martialarts.cpp msgid "be used" -msgstr "будет использовано" +msgstr "быть использовано" #: src/martialarts.cpp #, c-format @@ -266649,7 +274402,7 @@ msgstr "* Может %s с оружием или без ор #: src/martialarts.cpp #, c-format msgid "* Can %s while using any unarmed weapon" -msgstr "* Возможен %s с любым оружием для рукопашной драки" +msgstr "* Может %s с любым оружием для рукопашной драки" #: src/martialarts.cpp #, c-format @@ -266743,7 +274496,7 @@ msgstr "%s нельзя использовать с оружием." #: src/martialarts.cpp #, c-format msgid "The %1$s is not a valid %2$s weapon." -msgstr "%1$s — неподходящее оружие для %2$s." +msgstr "%1$s — неподходящее оружие для стиля %2$s." #: src/martialarts.cpp msgid "Block Counter" @@ -266853,7 +274606,7 @@ msgstr "* Будет атаковать вашу цель и #: src/martialarts.cpp #, c-format msgid "* Will knock back enemies %d %s" -msgstr "* Будет отбрасывать врагов %d %s" +msgstr "* Будет отбрасывать врагов на %d %s" #: src/martialarts.cpp msgid "tile" @@ -267007,32 +274760,32 @@ msgstr "%s бросается на вас, но вы уклоняетесь!" #: src/mattack_actors.cpp #, c-format msgid "The %1$s bites your %2$s, but fails to penetrate armor!" -msgstr "%1$s кусает вас в %2$s, но не может пробить броню." +msgstr "%1$s кусает вас (%2$s), но не может пробить броню." #: src/mattack_actors.cpp #, c-format msgid "The %1$s bites your %2$s!" -msgstr "%1$s кусает вас в %2$s!" +msgstr "%1$s кусает вас (%2$s)!" #: src/mattack_actors.cpp src/monattack.cpp src/monattack.cpp #, c-format msgid "The %s lunges at , but they dodge!" -msgstr "%s бросается на , но тот уклоняется!" +msgstr "%s бросается на NPC (), но тот уклоняется!" #: src/mattack_actors.cpp #, c-format msgid "The %1$s bites 's %2$s, but fails to penetrate armor!" -msgstr "%1$s кусает %2$s (), но не может пробить броню!" +msgstr "%1$s кусает (%2$s - ), но не может пробить броню!" #: src/mattack_actors.cpp #, c-format msgid "The %1$s bites 's %2$s!" -msgstr "%1$s кусает %2$s ()!" +msgstr "%1$s кусает NPC ( - %2$s)!" #: src/mattack_actors.cpp src/turret.cpp #, c-format msgid "The %1$s fires its %2$s!" -msgstr "%1$s стреляет из %2$s!" +msgstr "%1$s стреляет (%2$s)!" #: src/mattack_actors.cpp msgid "Beep." @@ -267076,7 +274829,7 @@ msgstr "%s разваливается!" #: src/melee.cpp #, c-format msgid "'s %s breaks apart!" -msgstr "%s у разваливается!" +msgstr "%s у NPC () разваливается!" #: src/melee.cpp src/mondeath.cpp #, c-format @@ -267086,7 +274839,7 @@ msgstr "%s разрушается!" #: src/melee.cpp #, c-format msgid "Your %s is destroyed by the blow!" -msgstr "Ваш %s уничтожен ударом!" +msgstr "Ваше оружие (%s) разрушается ударом!" #: src/melee.cpp #, c-format @@ -267104,7 +274857,7 @@ msgstr "Из-за своей дальнозоркости вы не можете #: src/melee.cpp #, c-format msgid "The %s has dead batteries and will not move its arms." -msgstr "У %s сели батарейки, его руки не могут двигаться." +msgstr "У меха (%s) сели батарейки, его руки не могут двигаться." #: src/melee.cpp #, c-format @@ -267145,12 +274898,12 @@ msgstr "%s промахивается." #: src/melee.cpp #, c-format msgid "You poison %s!" -msgstr "Вы отравили %s!" +msgstr "Вы отравили противника (%s)!" #: src/melee.cpp #, c-format msgid "You inject your venom into %s!" -msgstr "Вы вводите яд в %s!" +msgstr "Вы впрыскиваете яд противнику (%s)!" #: src/melee.cpp msgid "You hit something." @@ -267171,12 +274924,12 @@ msgstr " обезоруживает вас и берёт ваше ор #: src/melee.cpp #, c-format msgid "You disarm %s and take their weapon!" -msgstr "Вы обезоруживаете %s и берёте оружие!" +msgstr "Вы обезоруживаете противника (%s) и берёте оружие!" #: src/melee.cpp #, c-format msgid " disarms %s and takes their weapon!" -msgstr " обезоруживает %s и берёт оружие!" +msgstr " обезоруживает противника (%s) и берёт оружие!" #: src/melee.cpp msgid " disarms you!" @@ -267185,12 +274938,12 @@ msgstr " обезоруживает вас!" #: src/melee.cpp #, c-format msgid "You disarm %s!" -msgstr "Вы обезоружили %s." +msgstr "Вы обезоружили противника (%s)." #: src/melee.cpp #, c-format msgid " disarms %s!" -msgstr " обезоруживает %s!" +msgstr " обезоруживает противника (%s)!" #: src/melee.cpp #, c-format @@ -267234,12 +274987,12 @@ msgstr "немного" #: src/melee.cpp #, c-format msgid "You block %1$s of the damage with your %2$s!" -msgstr "Вы блокируете %1$s полученного урона с помощью %2$s!" +msgstr "Вы блокируете %1$s полученного урона с помощью своего оружия (%2$s)!" #: src/melee.cpp #, c-format msgid " blocks %1$s of the damage with their %2$s!" -msgstr " блокирует %1$s полученного урона с помощью %2$s!" +msgstr " блокирует %1$s полученного урона с помощью оружия (%2$s)!" #: src/melee.cpp src/player.cpp msgid "You try to counterattack but you are too exhausted!" @@ -267252,32 +275005,32 @@ msgstr "Предмет, который вы держите, слишком хр #: src/melee.cpp #, c-format msgid "You shock %s." -msgstr "Вы ударили %s электрическим разрядом." +msgstr "Вы ударили противника (%s) электрическим разрядом." #: src/melee.cpp #, c-format msgid " shocks %s." -msgstr " бьёт %s электрическим разрядом." +msgstr " бьёт противника (%s) электрическим разрядом." #: src/melee.cpp #, c-format msgid "You drain %s's body heat." -msgstr "Вы поглощаете тепло тела %s." +msgstr "Вы поглощаете тепло тела противника (%s)." #: src/melee.cpp #, c-format msgid " drains %s's body heat!" -msgstr " поглощает тепло тела %s!" +msgstr " поглощает тепло тела противника (%s)!" #: src/melee.cpp #, c-format msgid "You burn %s." -msgstr "Вы жжёте %s." +msgstr "Вы жжёте противника (%s)." #: src/melee.cpp #, c-format msgid " burns %s." -msgstr " жжёт %s." +msgstr " жжёт противника (%s)." #: src/melee.cpp #, c-format @@ -267287,229 +275040,229 @@ msgstr "%s режет вашу руку!" #: src/melee.cpp #, c-format msgid "'s %s shatters!" -msgstr "%s () разрывается!" +msgstr "%s () разбивается!" #: src/melee.cpp #, c-format msgid "You impale %s" -msgstr "Вы пронзаете %s" +msgstr "Вы пронзаете противника (%s)" #: src/melee.cpp #, c-format msgid "You gouge %s" -msgstr "Вы долбите %s" +msgstr "Вы долбите противника (%s)" #: src/melee.cpp #, c-format msgid "You run %s through" -msgstr "Вы протыкаете %s." +msgstr "Вы протыкаете противника (%s)" #: src/melee.cpp #, c-format msgid "You puncture %s" -msgstr "Вы прокалываете %s" +msgstr "Вы прокалываете противника (%s)" #: src/melee.cpp #, c-format msgid "You pierce %s" -msgstr "Вы протыкаете %s" +msgstr "Вы протыкаете противника (%s)" #: src/melee.cpp #, c-format msgid "You poke %s" -msgstr "Вы ткнули %s" +msgstr "Вы ткнули противника (%s)" #: src/melee.cpp #, c-format msgid " impales %s" -msgstr " пронзает %s" +msgstr " пронзает противника (%s)" #: src/melee.cpp #, c-format msgid " gouges %s" -msgstr " долбит %s" +msgstr " долбит противника (%s)" #: src/melee.cpp #, c-format msgid " runs %s through" -msgstr " протыкает %s" +msgstr " протыкает противника (%s)" #: src/melee.cpp #, c-format msgid " punctures %s" -msgstr " прокалывает %s" +msgstr " прокалывает противника (%s)" #: src/melee.cpp #, c-format msgid " pierces %s" -msgstr " протыкает %s" +msgstr " протыкает противника (%s)" #: src/melee.cpp #, c-format msgid " pokes %s" -msgstr " ткнул %s" +msgstr " тыкает противника (%s)" #: src/melee.cpp #, c-format msgid "You gut %s" -msgstr "Вы потрошите %s" +msgstr "Вы потрошите противника (%s)" #: src/melee.cpp #, c-format msgid "You chop %s" -msgstr "Вы раскалываете %s" +msgstr "Вы рубите противника (%s)" #: src/melee.cpp #, c-format msgid "You slash %s" -msgstr "Вы кромсаете %s" +msgstr "Вы кромсаете противника (%s)" #: src/melee.cpp #, c-format msgid "You mutilate %s" -msgstr "Вы уродуете %s" +msgstr "Вы уродуете противника (%s)" #: src/melee.cpp #, c-format msgid "You maim %s" -msgstr "Вы калечите %s" +msgstr "Вы калечите противника (%s)" #: src/melee.cpp #, c-format msgid "You stab %s" -msgstr "Вы прокалываете %s" +msgstr "Вы прокалываете противника (%s)" #: src/melee.cpp #, c-format msgid "You slice %s" -msgstr "Вы разрезаете %s" +msgstr "Вы разрезаете противника (%s)" #: src/melee.cpp #, c-format msgid "You cut %s" -msgstr "Вы режете %s" +msgstr "Вы режете противника (%s)" #: src/melee.cpp #, c-format msgid "You nick %s" -msgstr "Вы даёте затрещину %s" +msgstr "Вы даёте затрещину противнику (%s)" #: src/melee.cpp #, c-format msgid " guts %s" -msgstr "потрошит %s" +msgstr "потрошит противника (%s)" #: src/melee.cpp #, c-format msgid " slashes %s" -msgstr " хлещет %s" +msgstr " хлещет противника (%s)" #: src/melee.cpp #, c-format msgid " mutilates %s" -msgstr " уродует %s" +msgstr " уродует противника (%s)" #: src/melee.cpp #, c-format msgid " maims %s" -msgstr " калечит %s" +msgstr " калечит противника (%s)" #: src/melee.cpp #, c-format msgid " stabs %s" -msgstr " колет %s" +msgstr " колет противника (%s)" #: src/melee.cpp #, c-format msgid " slices %s" -msgstr " резанул %s" +msgstr " режет противника (%s)" #: src/melee.cpp #, c-format msgid " cuts %s" -msgstr " разрезает %s" +msgstr " разрезает противника (%s)" #: src/melee.cpp #, c-format msgid " nicks %s" -msgstr " даёт затрещину %s" +msgstr " даёт затрещину противнику (%s)" #: src/melee.cpp #, c-format msgid "You clobber %s" -msgstr "Вы избили %s" +msgstr "Вы избиваете противника (%s)" #: src/melee.cpp #, c-format msgid "You smash %s" -msgstr "Вы ломаете %s" +msgstr "Вы ломаете противника (%s)" #: src/melee.cpp #, c-format msgid "You thrash %s" -msgstr "Вы лупите %s" +msgstr "Вы лупите противника (%s)" #: src/melee.cpp #, c-format msgid "You batter %s" -msgstr "Вы колотите %s" +msgstr "Вы колотите противника (%s)" #: src/melee.cpp #, c-format msgid "You whack %s" -msgstr "Вы сильно бьёте %s" +msgstr "Вы сильно бьёте противника (%s)" #: src/melee.cpp #, c-format msgid "You hit %s" -msgstr "Вы ударили %s" +msgstr "Вы ударяете противника (%s)" #: src/melee.cpp #, c-format msgid " clobbers %s" -msgstr " избил %s" +msgstr " избивает противника (%s)" #: src/melee.cpp #, c-format msgid " smashes %s" -msgstr " ломает %s" +msgstr " ломает противника (%s)" #: src/melee.cpp #, c-format msgid " thrashes %s" -msgstr " лупит %s" +msgstr " лупит противника (%s)" #: src/melee.cpp #, c-format msgid " batters %s" -msgstr " колотит %s" +msgstr " колотит противника (%s)" #: src/melee.cpp #, c-format msgid " whacks %s" -msgstr " сильно бьёт %s" +msgstr " сильно бьёт противника (%s)" #: src/melee.cpp #, c-format msgid " hits %s" -msgstr " бьёт %s" +msgstr " бьёт противника (%s)" #: src/melee.cpp #, c-format msgid "The bugs attack %s" -msgstr "Жуки атакуют %s" +msgstr "Баги атакуют противника (%s)" #. ~ NPC hits something but does no damage #: src/melee.cpp #, c-format msgid "%s but does no damage." -msgstr "%s, но не нанёс ни единого повреждения." +msgstr "%s, но не наносит ни единого повреждения." #. ~ someone hits something but do no damage #: src/melee.cpp #, c-format msgid "%s but do no damage." -msgstr "%s, но не нанесли урона." +msgstr "%s, но это не нанесло урона." #. ~ NPC hits something (critical) #: src/melee.cpp @@ -267538,59 +275291,61 @@ msgstr "%s, нанеся урон %d." #: src/melee.cpp #, c-format msgid "You lunge for the %s, but miss!" -msgstr "Вы делаете выпад в сторону %s, но промахиваетесь!" +msgstr "Вы делаете выпад в сторону противника (%s), но промахиваетесь!" #. ~ %s: weapon name #: src/melee.cpp #, c-format msgid "You grab at %s and pull with all your force!" -msgstr "Вы хватаете %s и тянете изо всех сил!" +msgstr "Вы хватаете оружие (%s) и тянете изо всех сил!" #. ~ %1$s: weapon name, %2$s: NPC name #: src/melee.cpp #, c-format msgid "You forcefully take %1$s from %2$s!" -msgstr "Вы силой отбираете %1$s у %2$s!" +msgstr "Вы силой отбираете оружие (%1$s) у противника (%2$s)!" #: src/melee.cpp #, c-format msgid "You grab at %s and pull with all your force, but it drops nearby!" -msgstr "Вы хватаете %s и тянете изо всех сил, но это падает на землю!" +msgstr "" +"Вы хватаете оружие (%s) и тянете изо всех сил, но оно падает на землю!" #: src/melee.cpp #, c-format msgid "You grab at %s and pull with all your force, but in vain!" -msgstr "Вы хватаете %s и тянете изо всех сил, но это бесполезно!" +msgstr "Вы хватаете оружие (%s) и тянете изо всех сил, но это бесполезно!" #: src/melee.cpp #, c-format msgid "You smash %s with all your might forcing their %s to drop down nearby!" -msgstr "Вы бьёте %s изо всех сил, так что %s падает на землю!" +msgstr "Вы бьёте противника (%s) изо всех сил, так что %s падает на землю!" #: src/melee.cpp #, c-format msgid "You smash %s with all your might but %s remains in their hands!" -msgstr "Вы бьёте %s изо всех сил, но %s остаётся в руках!" +msgstr "Вы бьёте противника (%s) изо всех сил, но %s остаётся в руках!" #: src/melee.cpp src/npctalk.cpp #, c-format msgid "%s is hostile!" -msgstr "%s враг!" +msgstr "%s - враг!" #: src/melee.cpp #, c-format msgid "You sneakily steal %1$s from %2$s!" -msgstr "Вы скрытно украли %1$s из %2$s!" +msgstr "Вы скрытно украли предмет (%1$s) у цели (%2$s)!" #: src/melee.cpp #, c-format msgid "You failed to steal %1$s from %2$s, but did not attract attention." -msgstr "Кража %1$s из %2$s не удалась, но вы не привлекли внимания." +msgstr "" +"Кража предмета (%1$s) у цели (%2$s) не удалась, но вы не привлекли внимания." #: src/melee.cpp #, c-format msgid "You failed to steal %1$s from %2$s." -msgstr "Кража %1$s из %2$s не удалась." +msgstr "Кража предмета (%1$s) у цели (%2$s) не удалась." #: src/memorial_logger.cpp msgid "an unemployed male" @@ -267621,7 +275376,7 @@ msgstr "Мемориальный файл Катаклизм: Тёмные дн #: src/memorial_logger.cpp #, c-format msgid "In memory of: %s" -msgstr "В память о %s" +msgstr "В память: %s" #. ~ The "%s" will be replaced by an epitaph as displayed in the memorial #. files. Replace the quotation marks as appropriate for your language. @@ -267636,12 +275391,12 @@ msgstr "«%s»" #: src/memorial_logger.cpp #, c-format msgid "%1$s was %2$s when the apocalypse began." -msgstr "%1$s был %2$s, когда случился апокалипсис." +msgstr "%1$s - %2$s, когда случился апокалипсис." #: src/memorial_logger.cpp #, c-format msgid "%1$s died on %2$s." -msgstr "%1$s погибает в %2$s." +msgstr "%1$s - смерть настигла %2$s." #: src/memorial_logger.cpp #, c-format @@ -267786,13 +275541,13 @@ msgstr "История игры" #, c-format msgctxt "memorial_male" msgid "Activated the %s." -msgstr "Активировал %s." +msgstr "Активировал артефакт: %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Activated the %s." -msgstr "Активировала %s." +msgstr "Активировала артефакт: %s." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -267884,18 +275639,31 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "Была объявлена в розыск полицией!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "Сломанная %s." + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "Сломанная %s." + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Broken %s began to mend." -msgstr "Сломанная %s пошла на поправку." +msgstr "Сломанная конечность (%s) пошла на поправку." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Broken %s began to mend." -msgstr "Сломанная %s пошла на поправку." +msgstr "Сломанная конечность (%s) пошла на поправку." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -267911,13 +275679,13 @@ msgstr "Вы хороните неизвестную жертву Катакли #, c-format msgctxt "memorial_male" msgid "You buried %s." -msgstr "Вы похоронили %s." +msgstr "Вы похоронили: %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "You buried %s." -msgstr "Вы похоронили %s." +msgstr "Вы похоронили: %s." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -267955,13 +275723,13 @@ msgstr "Убила вкусно выглядящего невинного: %s. #, c-format msgctxt "memorial_male" msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "Хладнокровно убил невинного слабака %s." +msgstr "Хладнокровно убил невинного слабака - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "Хладнокровно убила невинного слабака %s." +msgstr "Хладнокровно убила невинного слабака - %s." #: src/memorial_logger.cpp #, c-format @@ -267997,13 +275765,13 @@ msgstr "" #, c-format msgctxt "memorial_male" msgid "Killed a %s." -msgstr "Убил %s." +msgstr "Убил: %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Killed a %s." -msgstr "Убила %s." +msgstr "Убила: %s." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -268279,13 +276047,13 @@ msgstr "Активирована теневая змеиная ловушка." #, c-format msgctxt "memorial_male" msgid "Consumed a %s." -msgstr "Съел %s." +msgstr "Съел: %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Consumed a %s." -msgstr "Съела %s." +msgstr "Съела: %s." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -268350,12 +276118,12 @@ msgstr "Стала жертвой приступа астмы." #: src/memorial_logger.cpp msgctxt "memorial_male" msgid "Died of datura overdose." -msgstr "Вы умерли от передозировки дурмана." +msgstr "Умер от передозировки дурмана." #: src/memorial_logger.cpp msgctxt "memorial_female" msgid "Died of datura overdose." -msgstr "Вы умерли от передозировки дурмана." +msgstr "Умерла от передозировки дурмана." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -268517,26 +276285,26 @@ msgstr "Не смогла больше не спать." #, c-format msgctxt "memorial_male" msgid "The fuel tank of the %s exploded!" -msgstr "Топливный бак в %s взорвался!" +msgstr "Топливный бак (%s) взорвался!" #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "The fuel tank of the %s exploded!" -msgstr "Топливный бак в %s взорвался!" +msgstr "Топливный бак (%s) взорвался!" #. ~ %s is addiction name #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Became addicted to %s." -msgstr "Получил зависимость от %s." +msgstr "Получил зависимость - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Became addicted to %s." -msgstr "Получила зависимость от %s." +msgstr "Получила зависимость - %s." #: src/memorial_logger.cpp #, c-format @@ -268642,38 +276410,38 @@ msgstr "Установлена сломанная бионика: %s." #, c-format msgctxt "memorial_male" msgid "Learned %s." -msgstr "Изучил %s." +msgstr "Изучил - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Learned %s." -msgstr "Изучила %s." +msgstr "Изучила - %s." #. ~ %s is addiction name #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Overcame addiction to %s." -msgstr "Избавился от зависимости к %s." +msgstr "Избавился от зависимости - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Overcame addiction to %s." -msgstr "Избавилась от зависимости к %s." +msgstr "Избавилась от зависимости - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "%s became hostile." -msgstr "%s становится враждебным." +msgstr "%s проявил враждебность." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "%s became hostile." -msgstr "%s становится враждебной." +msgstr "%s проявила враждебность." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -268699,13 +276467,13 @@ msgstr "Открыла странный храм." #, c-format msgctxt "memorial_male" msgid "Lost the conduct %s%s." -msgstr "Не выполнено ограничение «%s» %s." +msgstr "Не выполнил ограничение «%s» %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Lost the conduct %s%s." -msgstr "Не выполнено ограничение «%s» %s." +msgstr "Не выполнила ограничение «%s» %s." #: src/memorial_logger.cpp msgid " (disabled)" @@ -268715,13 +276483,13 @@ msgstr "(отключено)" #, c-format msgctxt "memorial_male" msgid "Gained the achievement %s%s." -msgstr "Получено достижение «%s» %s." +msgstr "Получил достижение «%s» %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Gained the achievement %s%s." -msgstr "Получено достижение «%s» %s." +msgstr "Получила достижение «%s» %s." #: src/memorial_logger.cpp #, c-format @@ -268795,35 +276563,35 @@ msgstr "Запечатала саркофаг с опасными веществ #, c-format msgctxt "memorial_male" msgid "Telefragged a %s." -msgstr "Телефрагнул %s." +msgstr "Телефрагнул: %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Telefragged a %s." -msgstr "Телефрагнула %s." +msgstr "Телефрагнула: %s." #: src/memorial_logger.cpp msgctxt "memorial_male" msgid "Spontaneous teleport." -msgstr "Спонтанно телепортируется." +msgstr "Спонтанная телепортация." #: src/memorial_logger.cpp msgctxt "memorial_female" msgid "Spontaneous teleport." -msgstr "Спонтанно телепортируется." +msgstr "Спонтанная телепортация." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_male" msgid "Teleported into a %s." -msgstr "Телепортировался в %s." +msgstr "Телепортировался - %s." #: src/memorial_logger.cpp #, c-format msgctxt "memorial_female" msgid "Teleported into a %s." -msgstr "Телепортировалась в %s." +msgstr "Телепортировалась - %s." #: src/memorial_logger.cpp msgctxt "memorial_male" @@ -268855,6 +276623,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "Отключила сигнализацию." +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "Использовал меню отладки (%s)." + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "Использовала меню отладки (%s)." + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -268865,17 +276645,17 @@ msgstr "%s x %d" #: src/messages.cpp msgctxt "message type" msgid "good" -msgstr "хорошо" +msgstr "хорошее" #: src/messages.cpp msgctxt "message type" msgid "bad" -msgstr "плохо" +msgstr "плохое" #: src/messages.cpp msgctxt "message type" msgid "mixed" -msgstr "смешанный" +msgstr "смешанное" #: src/messages.cpp msgctxt "message type" @@ -268890,7 +276670,7 @@ msgstr "информация" #: src/messages.cpp msgctxt "message type" msgid "neutral" -msgstr "безразличен" +msgstr "нейтральное" #: src/messages.cpp msgctxt "message type" @@ -269238,7 +277018,7 @@ msgstr "" " ..#Ov..**\n" " ...O|....\n" " \n" -"Вы можете связаться с нами, чтобы продать урожай и выплатить вам наличные или заплатить нам, чтобы убрать его для вас." +"Вы можете связаться с нами, чтобы продать урожай и получить наличные или заплатить нам, чтобы мы собрали его для вас." #: src/mission_companion.cpp msgid "Harvest East Field" @@ -269256,7 +277036,7 @@ msgstr "" "Опасность: низкая\n" "Время: 4 часа минимум\n" " \n" -"Добыча продовольствия включает в себя отправление компаньона на поиски еды в окружающую пустошь. Боя можно избежать, но могут встретиться дикие звери. Низкая оплата дополняется редкими предметами в качестве вознаграждения за особо крупную добычу." +"Добыча продовольствия включает в себя отправление компаньона на поиски еды в окружающую пустошь. Боя можно избежать, но могут встретиться дикие звери. Низкая оплата дополняется иногда попадающимися предметами в качестве вознаграждения за особо крупную добычу." #: src/mission_companion.cpp msgid "Assign Ally to Forage for Food" @@ -269294,13 +277074,13 @@ msgstr "" "Опасность: высокая\n" "Время: неизвестно\n" " \n" -"Добавление компаньонов к каравану увеличивает вероятность успеха. По своей природе, караваны — чрезвычайно привлекательные цели для налётчиков или враждебных групп, поэтому рекомендуется только сильная группа. Вознаграждение значительней для тех, кто в нём участвует, но ещё более важное для фракций их прибыль.\n" +"Добавление компаньонов к каравану увеличивает вероятность успеха. По своей природе, караваны — чрезвычайно привлекательные цели для налётчиков или враждебных групп, поэтому рекомендуется только сильная группа. Вознаграждение велико для тех, кто в нём участвует, но ещё они очень важны для участвующих фракций.\n" " \n" "Коммуна отправляет продовольствие Свободным торговцам в центр беженцев, как часть налога и в обмен на квалифицированную работу." #: src/mission_companion.cpp msgid "Caravan Commune-Refugee Center" -msgstr "Собрать караван центра Коммуны беженцев" +msgstr "Собрать караван Коммуна-Центр беженцев" #: src/mission_companion.cpp msgid "" @@ -269341,11 +277121,11 @@ msgstr "" #: src/mission_companion.cpp msgid "Begin Commune-Refugee Center Run" -msgstr "Начать работу центра Коммуны беженцев" +msgstr "Отправить караван Коммуна-Центр беженцев" #: src/mission_companion.cpp msgid "Recover Commune-Refugee Center" -msgstr "Восстановить центр Коммуны беженцев" +msgstr "Восстановить караван Коммуна-Центр беженцев" #: src/mission_companion.cpp msgid "There are no missions at this colony. Press Spacebar…" @@ -269411,12 +277191,12 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "%s is wasted by %s!" -msgstr "%s погибает из-за %s!" +msgstr "%s погибает из-за атаки (%s)!" #: src/mission_companion.cpp #, c-format msgid "%s dodges %s's attack!" -msgstr "%s уворачивается от атаки %s!" +msgstr "%s уворачивается от атаки (%s)!" #: src/mission_companion.cpp msgid "I'm sorry, you don't have enough money." @@ -269455,7 +277235,7 @@ msgstr "Мне жаль, но у вас недостаточно денег, ч #: src/mission_companion.cpp #, c-format msgid "Do you wish to have %d %s planted here for $%d?" -msgstr "Вы хотите получить %d %s посаженный здесь за $%d?" +msgstr "Вы хотите посадить здесь: %d-%s? Это будет стоить $%d?" #: src/mission_companion.cpp #, c-format @@ -269489,17 +277269,17 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "Do you wish to sell the crop of %d %s for a profit of $%d?" -msgstr "Вы хотите продать урожай %d %s, получив прибыль в размере $%d?" +msgstr "Вы хотите продать урожай (%s - %d), получив прибыль в размере $%d?" #: src/mission_companion.cpp #, c-format msgid "The %s are sold for $%d…" -msgstr "%s продано за $%d…" +msgstr "%s - продано за $%d…" #: src/mission_companion.cpp #, c-format msgid "You receive %d %s…" -msgstr "Вы получаете %d %s…" +msgstr "Вы получаете: %d - %s…" #: src/mission_companion.cpp #, c-format @@ -269507,7 +277287,7 @@ msgid "" "While scavenging, %s's party suddenly found itself set upon by a large mob " "of undead…" msgstr "" -"Пока искали добычу, группа %s внезапно обнаружила себя окружённой " +"Пока искали добычу, группа (%s) внезапно обнаружила себя окружённой " "многочисленной толпой нежити…" #: src/mission_companion.cpp @@ -269559,7 +277339,7 @@ msgstr "%s возвращается из рейда, зарабатывая $%d #: src/mission_companion.cpp #, c-format msgid "%s returned with a %s for you!" -msgstr "%s возвращает вам %s" +msgstr "%s возвращается, вам достаётся %s!" #: src/mission_companion.cpp #, c-format @@ -269581,12 +277361,12 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "While %s was framing a building one of the walls began to collapse…" -msgstr "Во время строительства на %s обрушилась одна из стен…" +msgstr "Во время строительства обрушилась одна из стен, %s попадает под неё…" #: src/mission_companion.cpp #, c-format msgid "In the blink of an eye, %s threw a brace up and averted a disaster." -msgstr "В мгновение ока, %s метнул скобу и предотвратил катастрофу." +msgstr "В мгновение ока, %s мечет скобу и предотвращает катастрофу." #: src/mission_companion.cpp #, c-format @@ -269596,13 +277376,12 @@ msgstr "Пулей вылетев из окна, %s умудряется изб #: src/mission_companion.cpp #, c-format msgid "%s didn't make it out in time…" -msgstr "%s не сделал это вовремя…" +msgstr "%s не убирается вовремя…" #: src/mission_companion.cpp #, c-format msgid "but %s was rescued from the debris with only minor injuries!" -msgstr "" -"но %s был освобождён из обломков, отделавшись только лёгкими травмами!" +msgstr "но %s спасается из обломков, отделавшись только лёгкими травмами!" #: src/mission_companion.cpp msgid "Everyone who was trapped under the collapsing roof died…" @@ -269623,7 +277402,7 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "While foraging, a beast began to stalk %s…" -msgstr "Пока %s добывал продовольствие, его начал преследовать зверь…" +msgstr "Пока %s добывает продовольствие, его начал преследовать зверь…" #: src/mission_companion.cpp #, c-format @@ -269634,18 +277413,18 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "As soon as the cougar sprang %s darted to the safety of the outpost!" -msgstr "Как только пума бросилась, %s рванулся к безопасному аванпосту!" +msgstr "Как только пума бросилась, %s рвётся к безопасному аванпосту!" #: src/mission_companion.cpp #, c-format msgid "" "%s was caught unaware and was forced to fight the creature at close range!" -msgstr "%s был застигнут врасплох и вынужден вести ближний бой!" +msgstr "%s застигается врасплох и принуждается к ближнему бою!" #: src/mission_companion.cpp #, c-format msgid "%s was able to scare off the bear after delivering a nasty blow!" -msgstr "%s смог отпугнуть медведя после того, как нанёс ужасный удар!" +msgstr "%s успешно отпугивает медведя после того, как наносит ужасный удар!" #: src/mission_companion.cpp #, c-format @@ -269658,8 +277437,8 @@ msgid "" "%s was able to hold off the first wolf but the others that were skulking in " "the tree line caught up…" msgstr "" -"%s смог удержать первого волка, но другие, которые находились в лесополосе, " -"достали…" +"%s справляется с первым волком, но другие, которые находились в лесу, " +"догнали…" #: src/mission_companion.cpp msgid "I'm sorry, there wasn't anything we could do…" @@ -269671,8 +277450,8 @@ msgid "" "We… we don't know what exactly happened but we found %s's gear ripped and " "bloody…" msgstr "" -"Мы… мы не знаем что точно произошло, но мы нашли окровавленные и разорванные" -" вещи %s…" +"Мы… мы не знаем что точно произошло, но… %s… мы нашли окровавленные и " +"разорванные вещи…" #: src/mission_companion.cpp msgid "I fear your companion won't be returning." @@ -269690,17 +277469,17 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "Engagement between %d members of %s %s and %d %s%s!" -msgstr "Схватка между %d членами %s %s и %d %s%s!" +msgstr "Схватка между %d членами %s (%s) и %d (%s)%s!" #: src/mission_companion.cpp #, c-format msgid "%s forces are destroyed!" -msgstr "%s силы уничтожены!" +msgstr "%s: силы уничтожены!" #: src/mission_companion.cpp #, c-format msgid "%s forces retreat from combat!" -msgstr "%s силы отступили от боя!" +msgstr "%s: силы отступили из боя!" #: src/mission_companion.cpp msgid "The monsters are destroyed!" @@ -269713,7 +277492,7 @@ msgstr "Монстры отступают!" #: src/mission_companion.cpp #, c-format msgid "Engagement between %d members of %s %s and %d members of %s %s%s!" -msgstr "Обязательство между %d членами %s %s и %d членами %s %s%s!" +msgstr "Стычка между %d членами %s (%s) и %d членами %s (%s)%s!" #: src/mission_companion.cpp msgid "You don't have any companions to send out…" @@ -269732,7 +277511,7 @@ msgstr "[ БОЙ : ВЫЖИВАНИЕ : ПРОИЗВОДСТВО ]" #, c-format msgctxt "companion" msgid "%1$s (Guarding)" -msgstr "%1$s (Защищается)" +msgstr "%1$s (Сторожит)" #: src/mission_companion.cpp #, c-format @@ -269778,7 +277557,7 @@ msgstr "%s даёт вам предмет из ячейки хранения." #: src/mission_start.cpp #, c-format msgid "%s gave you a dog whistle." -msgstr "%s отдал вам собачий свисток." +msgstr "%s отдёт вам собачий свисток." #: src/mission_start.cpp msgid "Demonic Soul" @@ -269792,7 +277571,7 @@ msgstr "%s передаёт вам флешку." #: src/mission_start.cpp #, c-format msgid "%s's Terminal" -msgstr "%s терминал" +msgstr "%s - терминал" #: src/mission_start.cpp msgid "Download Software" @@ -270019,7 +277798,7 @@ msgstr "%s выстреливает в вас дротиком, но он отс #: src/monattack.cpp #, c-format msgid "The %1$s feeds an %2$s and it grows!" -msgstr "%1$s съедает %2$s и растёт!" +msgstr "%1$s съедает противника (%2$s) и растёт!" #: src/monattack.cpp #, c-format @@ -270059,7 +277838,7 @@ msgstr "скрежет." #: src/monattack.cpp #, c-format msgid "A glob of acid hits the %s!" -msgstr "Капли кислоты повреждают %s!" +msgstr "Капли кислоты наносят урон (%s)!" #: src/monattack.cpp #, c-format @@ -270088,18 +277867,19 @@ msgstr "" #: src/monattack.cpp #, c-format msgid "The %1$s barfs acid on your %2$s, but it washes off the armor!" -msgstr "%1$s изрыгает кислоту вам на %2$s, но она отскакивает от вашей брони!" +msgstr "" +"%1$s изрыгает кислоту на вас (%2$s), но она отскакивает от вашей брони!" #: src/monattack.cpp #, c-format msgid "The %1$s barfs acid on 's %2$s, but it washes off the armor!" msgstr "" -"%1$s изрыгает кислоту на %2$s (), но она отскакивает от брони!" +"%1$s изрыгает кислоту NPC (%2$s - ), но она отскакивает от брони!" #: src/monattack.cpp #, c-format msgid "A bolt of electricity arcs towards %s!" -msgstr "Рядом с %s вспыхивают электрические дуги!" +msgstr "Разряд электричества несётся к цели (%s)! " #: src/monattack.cpp #, c-format @@ -270109,12 +277889,12 @@ msgstr "%s оскорбительно кричит «%s!!!»" #: src/monattack.cpp #, c-format msgid "%s is pulled away from your hands!" -msgstr "У вас из рук вырвали %s!" +msgstr "%s вылетает у вас из рук!" #: src/monattack.cpp #, c-format msgid "%s is pulled away from 's hands!" -msgstr "Из рук вырвали %s!" +msgstr "Из рук NPC () вылетает %s!" #: src/monattack.cpp #, c-format @@ -270124,7 +277904,7 @@ msgstr "%s безуспешно пытается вырвать оружие у #: src/monattack.cpp #, c-format msgid "The %s unsuccessfully attempts to pull 's weapon away." -msgstr "%s безуспешно пытается вырвать оружие у из рук." +msgstr "%s безуспешно пытается вырвать оружие у NPC () из рук." #: src/monattack.cpp #, c-format @@ -270134,7 +277914,7 @@ msgstr "%s изрыгает желчь!" #: src/monattack.cpp #, c-format msgid "Bile splatters on the %s!" -msgstr "Желчь попадает на %s!" +msgstr "Желчь забрызгивает окрестности (%s)!" #: src/monattack.cpp msgid "You dodge it!" @@ -270162,7 +277942,7 @@ msgstr "%s указывает на ближайший труп." #: src/monattack.cpp #, c-format msgid "A nearby %s rises from the dead!" -msgstr "%s поблизости восстал из мёртвых!" +msgstr "%s поблизости восстёт из мёртвых!" #: src/monattack.cpp msgid "But nothing seems to happen." @@ -270176,7 +277956,7 @@ msgstr "%s наносит по вам мощный удар, но вы увор #: src/monattack.cpp #, c-format msgid "The %s takes a powerful swing at , who dodges it!" -msgstr "%s наносит мощный удар по , но тот уворачивается от него!" +msgstr "%s наносит мощный удар, но уворачивается от него!" #: src/monattack.cpp #, c-format @@ -270191,7 +277971,7 @@ msgstr "%s наносит удар такой силы, что отп #: src/monattack.cpp #, c-format msgid "The %1$s fires a shimmering beam towards %2$s!" -msgstr "%1$s выстреливает мерцающим лучом в направлении %2$s!" +msgstr "%1$s выстреливает мерцающим лучом туда, где %2$s!" #: src/monattack.cpp msgid "You dodge the beam!" @@ -270212,7 +277992,7 @@ msgstr "Вас пронзает как иголкой." #: src/monattack.cpp #, c-format msgid "A manhack flies out of one of the holes on the %s!" -msgstr "Дрон вылетает из одного из отверстий в корпусе %s!" +msgstr "Дрон вылетает из одного из отверстий в корпусе робота (%s)!" #: src/monattack.cpp #, c-format @@ -270241,42 +278021,42 @@ msgstr "%s вопросительно пикает и фокусирует на #: src/monattack.cpp #, c-format msgid "The %s's combat arms crackle with electricity." -msgstr "Боевые манипуляторы %s потрескивают из-за электричества." +msgstr "Боевые манипуляторы (%s) потрескивают из-за электричества." #. ~ %s is bodypart name in accusative. #: src/monattack.cpp #, c-format msgid "A tree bursts forth from the earth and pierces your %s!" -msgstr "Дерево прорывается из земли и пронзает ваш %s!" +msgstr "Дерево прорывается из земли и пронзает вашу часть тела (%s)!" #. ~ %s is bodypart name in accusative. #: src/monattack.cpp #, c-format msgid "A tree bursts forth from the earth and pierces 's %s!" -msgstr "Дерево прорывается из земли и пронзает %s у !" +msgstr "Дерево прорывается из земли и пронзает NPC ( - %s)!" #. ~ %s is bodypart name in accusative. #: src/monattack.cpp #, c-format msgid "The underbrush beneath your feet grows and pierces your %s!" -msgstr "Кустарник под вашими ногами прорастает сквозь ваши %s!" +msgstr "Кустарник под вашими ногами прорастает сквозь вашу часть тела (%s)!" #. ~ %s is bodypart name in accusative. #: src/monattack.cpp #, c-format msgid "Underbrush grows into a tree, and it pierces 's %s!" -msgstr "Кустарник вырастает в дерево и пронзает %s у !" +msgstr "Кустарник вырастает в дерево и пронзает NPC ( - %s)!" #. ~ 1$s monster name(vine), 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s lashes your %2$s!" -msgstr "%1$s хлещет вас в %2$s!" +msgstr "%1$s хлещет вас - %2$s!" #: src/monattack.cpp #, c-format msgid "The %1$s lashes 's %2$s!" -msgstr "%1$s хлещет %2$s у !" +msgstr "%1$s хлещет NPC ( - %2$s)!" #: src/monattack.cpp msgid "thu-THUMP." @@ -270289,7 +278069,7 @@ msgstr "Стена из корней вокруг вас издаёт скрип #: src/monattack.cpp #, c-format msgid "Spores are released from the %s!" -msgstr "Споры вылетают из %s!" +msgstr "Споры вылетают из существа (%s)!" #: src/monattack.cpp msgid "\"Buy SpOreos(tm) now!\"" @@ -270298,7 +278078,7 @@ msgstr "«Купите СпОрео(tm) сейчас!»" #: src/monattack.cpp #, c-format msgid "Delicious snacks are released from the %s!" -msgstr "Великолепные закуски появляются из %s!" +msgstr "Великолепные закуски появляются из существа (%s)!" #: src/monattack.cpp #, c-format @@ -270349,7 +278129,7 @@ msgstr "%s колет вас иглоподобным щупом!" #: src/monattack.cpp #, c-format msgid "The %1$s sinks its point into your %2$s!" -msgstr "%1$s втыкает свой щуп вам в %2$s!" +msgstr "%1$s втыкает свой щуп вам в часть тела (%2$s)!" #: src/monattack.cpp msgid "You feel thousands of live spores pumping into you…" @@ -270359,24 +278139,26 @@ msgstr "Вы чувствуете, как тысячи живых спор вл #: src/monattack.cpp #, c-format msgid "The %1$s strikes your %2$s, but your armor protects you." -msgstr "%1$s бьёт в %2$s, но ваша броня защищает вас." +msgstr "%1$s бьёт вас (%2$s), но ваша броня защищает вас." #: src/monattack.cpp #, c-format msgid "The %1$s swipes at %2$s with a barbed tendril!" -msgstr "%1$s бьёт в %2$s своим колючим усиком!" +msgstr "%1$s бьёт в цель (%2$s) своим колючим усиком!" #. ~ 1$s is monster name, 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s sinks several needlelike barbs into your %2$s!" -msgstr "%1$s втыкает свои иглоподобные колючки вам в %2$s!" +msgstr "%1$s втыкает свои иглоподобные колючки вам в часть тела (%2$s)!" #. ~ 1$s is monster name, 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s slashes your %2$s, but your armor protects you." -msgstr "%1$s пытается покромсать вашу %2$s, но ваша броня защищает вас." +msgstr "" +"%1$s пытается раскромсать вашу часть тела (%2$s), но ваша броня защищает " +"вас." #: src/monattack.cpp #, c-format @@ -270439,7 +278221,7 @@ msgstr "Вас оттолкнула выросшая грибная изгоро #: src/monattack.cpp #, c-format msgid "A fungal tendril bursts forth from the earth and pierces your %s!" -msgstr "Грибной усик прорывается из земли и пронзает ваш %s!" +msgstr "Грибной усик прорывается из земли и пронзает вашу часть тела (%s)!" #: src/monattack.cpp msgid "A fungal tendril bursts forth from the earth!" @@ -270462,7 +278244,7 @@ msgstr "%s прыгает на вас, но вы уворачиваетесь." #: src/monattack.cpp #, c-format msgid "You swat at the %s with your tail!" -msgstr "Вы хлопаете по %s своим хвостом!" +msgstr "Вы хлопаете по противнику (%s) своим хвостом!" #: src/monattack.cpp #, c-format @@ -270473,13 +278255,13 @@ msgstr "%s запрыгивает на вас, но вы стряхиваете #: src/monattack.cpp #, c-format msgid "The %1$s lands on your %2$s, but can't penetrate your armor." -msgstr "%1$s запрыгнул вам на %2$s, но не может пробить броню." +msgstr "%1$s запрыгнул вам на часть тела (%2$s), но не может пробить броню." #. ~ 1$s monster name(dermatik), 2$s bodypart name in accusative. #: src/monattack.cpp #, c-format msgid "The %1$s sinks its ovipositor into your %2$s!" -msgstr "%1$s втыкает свой яйцеклад вам в %2$s!" +msgstr "%1$s втыкает свой яйцеклад вам в часть тела (%2$s)!" #: src/monattack.cpp #, c-format @@ -270499,7 +278281,7 @@ msgstr "%s падает на землю и лопается!" #: src/monattack.cpp #, c-format msgid "%s is engulfed by %s!" -msgstr "%s охвачен %s!" +msgstr "%s охвачен - %s!" #: src/monattack.cpp #, c-format @@ -270559,7 +278341,7 @@ msgstr "%s хлопает!" #: src/monattack.cpp #, c-format msgid "The %s's head explodes in a mass of roiling tentacles!" -msgstr "Голова %s лопается, высвобождая массу извивающихся щупалец!" +msgstr "Голова монстра (%s) лопается, высвобождая массу извивающихся щупалец!" #: src/monattack.cpp #, c-format @@ -270569,13 +278351,13 @@ msgstr "%s хлещет своим щупальцем по вам!" #: src/monattack.cpp #, c-format msgid "The %s lashes its tentacle at !" -msgstr "%s хлещет своим щупальцем !" +msgstr "%s хлещет своим щупальцем NPC ()!" #. ~ 1$s is bodypart name, 2$d is damage value. #: src/monattack.cpp #, c-format msgid "Your %1$s is hit for %2$d damage!" -msgstr "Ваш %1$s получает %2$d урона!" +msgstr "Ваша часть тела (%1$s) получает %2$d урона!" #. ~ 1$s is bodypart name, 2$d is damage value. #: src/monattack.cpp @@ -270586,7 +278368,8 @@ msgstr "%1$s () получает %2$d урона!" #: src/monattack.cpp #, c-format msgid "The %1$s lashes its tentacle at your %2$s, but glances off your armor!" -msgstr "%1$s бьёт щупальцем ваш %2$s, но соскальзывает по броне!" +msgstr "" +"%1$s бьёт щупальцем вашу часть тела (%2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format @@ -270594,7 +278377,8 @@ msgid "" "The %1$s lashes its tentacle at 's %2$s, but glances off their " "armor!" msgstr "" -"%1$s режет своим щупальцем %2$s у , но оно соскальзывает по броне!" +"%1$s режет своим щупальцем по NPC ( - %2$s), но оно соскальзывает " +"по броне!" #: src/monattack.cpp #, c-format @@ -270605,7 +278389,8 @@ msgstr "%s выбрасывает свои руки в вашем направл #, c-format msgid "The %s's arms fly out at , but they dodge!" msgstr "" -"%s выбрасывает свои руки в направлении , но тот уворачивается!" +"%s выбрасывает свои руки в направлении NPC (), но тот " +"уворачивается!" #: src/monattack.cpp #, c-format @@ -270616,7 +278401,7 @@ msgstr "" #: src/monattack.cpp #, c-format msgid "The %1$s reaches out and pulls %2$s!" -msgstr "%1$s выгибается и подтягивает %2$s!" +msgstr "%1$s выгибается и подтягивает противника (%2$s)!" #: src/monattack.cpp #, c-format @@ -270626,7 +278411,7 @@ msgstr "%s ощупывает вас, но вы уворачиваетесь!" #: src/monattack.cpp #, c-format msgid "The %s gropes at , but they dodge!" -msgstr "%s ощупывает , но тот уворачивается!" +msgstr "%s ощупывает NPC (), но тот уворачивается!" #: src/monattack.cpp #, c-format @@ -270636,7 +278421,7 @@ msgstr "%s пытается вас схватить…" #: src/monattack.cpp #, c-format msgid "The %s grabs !" -msgstr "%s хватает !" +msgstr "%s хватает NPC ()!" #: src/monattack.cpp #, c-format @@ -270653,7 +278438,8 @@ msgstr "%s пытается вас оттащить, но вы надёжно п msgid "" "The %s tries to drag , but they're securely fastened in the " "autodoc." -msgstr "%s пытается оттащить , но тот надёжно пристёгнут к автодоку." +msgstr "" +"%s пытается оттащить NPC (), но тот надёжно пристёгнут к автодоку." #: src/monattack.cpp #, c-format @@ -270663,7 +278449,7 @@ msgstr "%s тащит вас за собой!" #: src/monattack.cpp #, c-format msgid " gets dragged behind the %s!" -msgstr "%s тащит за собой !" +msgstr "%s тащит за собой NPC ()!" #: src/monattack.cpp #, c-format @@ -270709,12 +278495,12 @@ msgstr "%s вторгается в ваш разум, но не преодоле #: src/monattack.cpp #, c-format msgid "The terrifying visage of the %s paralyzes you." -msgstr "Ужасающий вид %sа парализует вас." +msgstr "Ужасающий вид монстра (%s) парализует вас." #: src/monattack.cpp #, c-format msgid "You manage to avoid staring at the horrendous %s." -msgstr "Вы смогли отвести взгляд от ужасного %s." +msgstr "Вы смогли отвести взгляд от ужасного монстра (%s)." #: src/monattack.cpp msgid "You get a medical check-up." @@ -270746,7 +278532,7 @@ msgstr "%s угрюмо смотрит на пустой набор для ан #: src/monattack.cpp #, c-format msgid "The %1$s scans %2$s and seems to detect something." -msgstr "%1$s сканирует %2$s и находит что-то." +msgstr "%1$s сканирует пациента (%2$s) и находит что-то." #: src/monattack.cpp #, c-format @@ -270853,7 +278639,7 @@ msgstr "%s безуспешно пытается ударить вас токо #: src/monattack.cpp #, c-format msgid "The %s unsuccessfully attempts to shock ." -msgstr "%s безуспешно пытается ударить током ." +msgstr "%s безуспешно пытается ударить током NPC ()." #: src/monattack.cpp #, c-format @@ -270918,7 +278704,7 @@ msgstr "%s стреляет из 120-мм пушки!" #: src/monattack.cpp #, c-format msgid "The tongue of flame hits the %s!" -msgstr "Язык пламени попадает в %s!" +msgstr "Язык пламени попадает по окружению (%s)!" #: src/monattack.cpp msgid "a robotic voice boom, \"Citizen, Halt!\"" @@ -270961,18 +278747,18 @@ msgstr "«ГЛУПЫЙ ЧЕЛОВЕЧИШКА…»" #: src/monattack.cpp #, c-format msgid "A black mist floats from the %1$s around the %2$s." -msgstr "Чёрное облако, выпущенное %1$s, окутывает %2$s." +msgstr "Чёрное облако, выпущенное монстром (%1$s), окутывает другого (%2$s)." #: src/monattack.cpp #, c-format msgid "A black mist floats from the %s." -msgstr "Чёрное облако вылетает со стороны %s." +msgstr "Чёрное облако вылетает со стороны монстра (%s)." #. ~ %1$s is the pre-upgrade monster, %2$s is the post-upgrade monster. #: src/monattack.cpp #, c-format msgid "The %1$s becomes a %2$s!" -msgstr "%1$s становится %2$s!" +msgstr "%1$s превращается! Теперь здесь %2$s!" #: src/monattack.cpp #, c-format @@ -270987,13 +278773,16 @@ msgstr "Появляется %s!" #: src/monattack.cpp #, c-format msgid "The %1$s stretches its head at you, but bounces off the %2$s" -msgstr "%1$s вытягивает голову в вашем направлении, но отскакивает от %2$s" +msgstr "" +"%1$s вытягивает голову в вашем направлении, но отскакивает от препятствия " +"(%2$s)" #: src/monattack.cpp #, c-format msgid "The %1$s stretches its head at , but bounces off the %2$s" msgstr "" -"%1$s вытягивает голову в направлении , но отскакивает от %2$s" +"%1$s вытягивает голову в направлении NPC (), но отскакивает от " +"препятствия (%2$s)" #: src/monattack.cpp #, c-format @@ -271009,30 +278798,32 @@ msgid "" "The %s's head extends to bite , but they dodge and the head sails " "past!" msgstr "" -"Голова существа (%s) вытягивается в попытке укусить , но не " +"Голова существа (%s) вытягивается в попытке укусить NPC (), но не " "попадает и пролетает мимо!" #. ~ 1$s is monster name, 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s's teeth sink into your %2$s!" -msgstr "Зубы (%1$s) впиваются в ваш %2$s!" +msgstr "Зубы (%1$s) впиваются в вашу часть тела (%2$s)!" #. ~ 1$s is monster name, 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s's teeth sink into 's %2$s!" -msgstr "Зубы (%1$s) впиваются в %2$s ()!" +msgstr "Зубы (%1$s) впиваются в NPC ( - %2$s)!" #: src/monattack.cpp #, c-format msgid "The %1$s's head hits your %2$s, but glances off your armor!" -msgstr "Голова (%1$s) попадает в ваш %2$s, но соскальзывает по броне!" +msgstr "" +"Голова (%1$s) попадает в вашу часть тела (%2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format msgid "The %1$s's head hits 's %2$s, but glances off armor!" -msgstr "Голова (%1$s) попадает в %2$s (), но соскальзывает по броне!" +msgstr "" +"Голова (%1$s) попадает в NPC ( - %2$s), но соскальзывает по броне!" #: src/monattack.cpp msgid "He's brandishing a knife!" @@ -271055,22 +278846,22 @@ msgstr "%1$s замахивается на противника (%2$s) масс #: src/monattack.cpp #, c-format msgid "Your %1$s is battered for %2$d damage!" -msgstr "Ваш %1$s получает %2$d урона!" +msgstr "Ваша часть тела (%1$s) получает %2$d урона!" #: src/monattack.cpp #, c-format msgid "The %1$s quivers hungrily in the direction of the %2$s." -msgstr "%1$s подрагивает от голода при виде %2$s." +msgstr "%1$s голодно дёргается - %2$s явно вызывает его аппетит." #: src/monattack.cpp #, c-format msgid "The %1$s absorbs the %2$s, growing larger." -msgstr "%1$s поглощает %2$s и растёт в размере." +msgstr "%1$s поглощает пищу (%2$s) и растёт в размере." #: src/monattack.cpp #, c-format msgid "The %1$s lunges for %2$s!" -msgstr "%1$s бросается на %2$s!" +msgstr "%1$s бросается на цель (%2$s)!" #: src/monattack.cpp #, c-format @@ -271080,42 +278871,44 @@ msgstr "%1$s бросается на вас, но вы отходите в ст #: src/monattack.cpp #, c-format msgid "The %1$s lunges at , but they sidestep it!" -msgstr "%1$s бросается на , но тот отходит в сторону!" +msgstr "%1$s бросается на NPC (), но тот отходит в сторону!" #: src/monattack.cpp #, c-format msgid "The %1$s lunges at your %2$s, battering it for %3$d damage!" -msgstr "%1$s бросается на ваш %2$s, нанеся урон в %3$d единиц!" +msgstr "%1$s бросается на вашу часть тела (%2$s), нанеся урон в %3$d единиц!" #: src/monattack.cpp #, c-format msgid "The %1$s lunges at 's %2$s, battering it for %3$d damage!" -msgstr "%1$s бросается на %2$s у , нанеся урон в %3$d единиц!" +msgstr "%1$s бросается на NPC ( - %2$s), нанеся урон в %3$d единиц!" #: src/monattack.cpp #, c-format msgid "The %1$s lunges at your %2$s, but your armor prevents injury!" msgstr "" -"%1$s бросается на ваш %2$s, но ваша броня предотвратила нанесение урона!" +"%1$s бросается на ваc (%2$s), но ваша броня предотвратила нанесение урона!" #: src/monattack.cpp #, c-format msgid "The %1$s lunges at 's %2$s, but their armor prevents injury!" msgstr "" -"%1$s бросается на %2$s у , но его броня предотвратила нанесение " -"урона!" +"%1$s бросается на NPC ( - %2$s), но его броня предотвратила " +"нанесение урона!" #: src/monattack.cpp #, c-format msgid "The %1$s thrusts a claw at you, but it bounces off the %2$s!" msgstr "" -"%1$s выбрасывает свой коготь в вашу сторону, но он отскакивает от %2$s!" +"%1$s выбрасывает свой коготь в вашу сторону, но он отскакивает от " +"препятствия (%2$s)!" #: src/monattack.cpp #, c-format msgid "The %1$s thrusts a claw at , but it bounces off the %2$s!" msgstr "" -"%1$s выбрасывает свой коготь в сторону , но он отскакивает от %2$s!" +"%1$s выбрасывает свой коготь в сторону NPC (), но он отскакивает от" +" препятствия (%2$s)!" #: src/monattack.cpp #, c-format @@ -271125,13 +278918,13 @@ msgstr "%s выбрасывает в вашу сторону клешню, но #: src/monattack.cpp #, c-format msgid "The %s thrusts a claw at , but they evade it!" -msgstr "%s выбрасывает в сторону клешню, но он уворачивается!" +msgstr "%s выбрасывает в сторону NPC () клешню, но он уворачивается!" #. ~ 1$s is bodypart name, 2$d is damage value. #: src/monattack.cpp #, c-format msgid "The %1$s thrusts a claw at your %2$s, slashing it for %3$d damage!" -msgstr "%1$s выбрасывает клешню на ваш %2$s, нанеся урон в %3$d единиц!" +msgstr "%1$s выбрасывает клешню по вам (%2$s), нанеся урон в %3$d единиц!" #. ~ 1$s is bodypart name, 2$d is damage value. #: src/monattack.cpp @@ -271139,18 +278932,20 @@ msgstr "%1$s выбрасывает клешню на ваш %2$s, нанеся msgid "" "The %1$s thrusts a claw at 's %2$s, slashing it for %3$d damage!" msgstr "" -"%1$s выбрасывает клешню на %2$s у , нанеся урон в %3$d единиц!" +"%1$s выбрасывает клешню по NPC ( - %2$s), нанеся урон в %3$d " +"единиц!" #: src/monattack.cpp #, c-format msgid "The %1$s thrusts a claw at your %2$s, but glances off your armor!" -msgstr "%1$s выбрасывает клешню на ваш %2$s, но соскальзывает по броне!" +msgstr "%1$s выбрасывает клешню по вам (%2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format msgid "The %1$s thrusts a claw at 's %2$s, but glances off armor!" msgstr "" -"%1$s выбрасывает клешню на %2$s у , но соскальзывает по броне!" +"%1$s выбрасывает клешню по NPC ( - %2$s), но соскальзывает по " +"броне!" #: src/monattack.cpp #, c-format @@ -271160,7 +278955,7 @@ msgstr "%s режет вашу шею! Вы пригибаетесь!" #: src/monattack.cpp #, c-format msgid "The %s slashes at 's neck! They duck!" -msgstr "%s режет шею ! Он пригибается!" +msgstr "%s режет шею NPC ()! Тот пригибается!" #: src/monattack.cpp #, c-format @@ -271171,22 +278966,22 @@ msgstr "%1$s режет вашу шею, нанеся урон в %2$d един #, c-format msgid "" "The %1$s slashes at 's neck, cutting their throat for %2$d damage!" -msgstr "%1$s режет шею у , нанеся урон в %2$d единиц!" +msgstr "%1$s режет шею NPC (), нанеся урон в %2$d единиц!" #: src/monattack.cpp #, c-format msgid "The %1$s slashes at your %2$s, but glances off your armor!" -msgstr "%1$s режет ваш %2$s, но соскальзывает по броне!" +msgstr "%1$s режет ваc (%2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format msgid "The %1$s slashes at 's %2$s, but glances off armor!" -msgstr "%1$s режет %2$s у , но соскальзывает по броне!" +msgstr "%1$s режет NPC ( - %2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format msgid "A shadow splits from the %s!" -msgstr "Тень отделяется от %s!" +msgstr "Тень отделяется от монстра (%s)!" #: src/monattack.cpp msgid "\"Stop it please\"" @@ -271284,7 +279079,7 @@ msgstr "Робот осторожно сканирует вас." #: src/monattack.cpp msgid "The robot carefully scans ." -msgstr "Робот тщательно сканирует ." +msgstr "Робот тщательно сканирует NPC ()." #: src/monattack.cpp msgid "The riotbot orders you to present your hands and be cuffed." @@ -271386,7 +279181,7 @@ msgstr "%1$s пронзает вашу грудь на %2$d урона!" #: src/monattack.cpp #, c-format msgid "The %1$s impales 's chest for %2$d damage!" -msgstr "%1$s пронзает грудь на %2$d урона!" +msgstr "%1$s пронзает грудь NPC () на %2$d урона!" #: src/monattack.cpp #, c-format @@ -271397,23 +279192,23 @@ msgstr "%1$s пытается проникнуть в ваше тело, но н #: src/monattack.cpp #, c-format msgid "The %1$s slashes at 's torso, but is stopped by their armor!" -msgstr "%1$s рубанул по торсу, но броня защищает от урона!" +msgstr "%1$s рубанул NPC () по торсу, но броня защищает от урона!" #: src/monattack.cpp #, c-format msgid "" "The %1$s burrows within %2$s corpse and a %3$s emerges from the remains!" -msgstr "%1$s зарывается в тело %2$s, и из остатков выбирается %3$s!" +msgstr "%1$s зарывается в тело (%2$s), и из остатков выбирается %3$s!" #: src/monattack.cpp #, c-format msgid "The %1$s burrows within %2$s corpse!" -msgstr "%1$s зарывается в тело %2$s!" +msgstr "%1$s зарывается в тело (%2$s)!" #: src/monattack.cpp #, c-format msgid "A %1$s emerges from %2$s corpse!" -msgstr "%1$s вылезает из тела %2$s!" +msgstr "%1$s вылезает из тела (%2$s)!" #: src/monattack.cpp #, c-format @@ -271453,23 +279248,23 @@ msgstr "оглушительный рёв!" #: src/monattack.cpp #, c-format msgid "A %s struggles to pull itself free from the %s!" -msgstr "%s пытается вывернуться из %s!" +msgstr "%s пытается вырваться из монстра (%s)!" #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" -msgstr "%1$s механически хватает %2$s!" +msgstr "%1$s механически хватает цель (%2$s)!" #: src/monattack.cpp #, c-format msgid "%1$s slams %2$s to the ground!" -msgstr "%1$s швыряет %2$s на землю!" +msgstr "%1$s швыряет врага (%2$s) на землю!" #. ~ 1$s is bodypart name in accusative, 2$d is damage value. #: src/monattack.cpp #, c-format msgid "The zombie kicks your %1$s for %2$d damage…" -msgstr "Зомби ударил ваш %1$s и нанёс %2$d урона…" +msgstr "Зомби ударяет вас (%1$s) и наносит %2$d урона…" #: src/monattack.cpp #, c-format @@ -271489,20 +279284,20 @@ msgstr "и швыряет вас, нанеся урон %d!" #: src/monattack.cpp #, c-format msgid "The %1$s mechanically lunges at %2$s!" -msgstr "%1$s делает механический выпад в сторону %2$s!" +msgstr "%1$s делает механический выпад в сторону противника (%2$s)!" #: src/monattack.cpp #, c-format msgid "The %1$s impales %2$s!" -msgstr "%1$s пронзает %2$s!" +msgstr "%1$s пронзает противника (%2$s)!" #: src/monattack.cpp msgid "The %1$s tries to impale your %s…" -msgstr "%1$s пытается пронзить ваш %s…" +msgstr "%1$s пытается пронзить вас (%s)…" #: src/monattack.cpp msgid "The %1$s tries to impale 's %s…" -msgstr "%1$s пытается пронзить %s …" +msgstr "%1$s пытается пронзить NPC ( - %s)…" #: src/monattack.cpp #, c-format @@ -271515,17 +279310,17 @@ msgstr "но не может пробить вашу броню!" #: src/monattack.cpp msgid "but fails to penetrate 's armor!" -msgstr "но не может пробить броню !" +msgstr "но не может пробить броню NPC ()!" #: src/monattack.cpp #, c-format msgid "The %1$s mechanically reaches for %2$s!" -msgstr "%1$s механически тянется к %2$s!" +msgstr "%1$s механически тянется к цели (%2$s)!" #: src/monattack.cpp #, c-format msgid "The zombie grabs your %s…" -msgstr "Зомби хватает вас за %s…" +msgstr "Зомби хватает вас за оружие (%s)…" #: src/monattack.cpp msgid "and throws it to the ground!" @@ -271573,12 +279368,16 @@ msgstr "Ревёт клаксон, и %s выпускает дрона с мин #: src/monattack.cpp #, c-format msgid "The %1$s thrusts its arm at you, but bounces off the %2$s." -msgstr "%1$s выбрасывает свою руку в вашу сторону, он она отскакивает от %2$s" +msgstr "" +"%1$s выбрасывает свою руку в вашу сторону, но она отскакивает от препятствия" +" (%2$s)" #: src/monattack.cpp #, c-format msgid "The %1$s thrusts its arm at , but bounces off the %2$s." -msgstr "%1$s выбрасывает руку в сторону , но он отскакивает от %2$s!" +msgstr "" +"%1$s выбрасывает руку в сторону NPC (), но он отскакивает от " +"препятствия (%2$s)!" #: src/monattack.cpp #, c-format @@ -271590,7 +279389,7 @@ msgstr "" #: src/monattack.cpp #, c-format msgid "The %s thrusts its arm at ." -msgstr "%s выбрасывает руку в направлении " +msgstr "%s выбрасывает руку в направлении NPC ()" #: src/monattack.cpp msgid "You evade the stretched arm and it sails past you!" @@ -271604,28 +279403,30 @@ msgstr " уклоняется от вытянутых рук!" #: src/monattack.cpp #, c-format msgid "The %1$s's arm pierces your %2$s!" -msgstr "Рука %1$s протыкает ваш %2$s!" +msgstr "Рука %1$s протыкает вашу часть тела (%2$s)!" #. ~ 1$s is monster name, 2$s bodypart in accusative #: src/monattack.cpp #, c-format msgid "The %1$s arm pierces 's %2$s!" -msgstr "Рука существа (%1$s) протыкает %2$s ()!" +msgstr "Рука существа (%1$s) протыкает NPC ( - %2$s)!" #: src/monattack.cpp #, c-format msgid "The %1$s arm hits your %2$s, but glances off your armor!" -msgstr "Рука существа (%1$s) попадает в ваш %2$s, но соскальзывает по броне!" +msgstr "" +"Рука существа (%1$s) попадает в вашу часть тела (%2$s), но соскальзывает по " +"броне!" #: src/monattack.cpp #, c-format msgid "The %1$s hits 's %2$s, but glances off armor!" -msgstr "%1$s попадает в %2$s (), но соскальзывает по броне!" +msgstr "%1$s попадает в NPC ( - %2$s), но соскальзывает по броне!" #: src/monattack.cpp #, c-format msgid "The %1$s fuses with the %2$s." -msgstr "%1$s сливается с %2$s." +msgstr "%1$s сливается с другим существом (%2$s)." #: src/monattack.cpp #, c-format @@ -271648,12 +279449,12 @@ msgstr "%s умирает!" #: src/mondeath.cpp #, c-format msgid "The %s's body dissolves into acid." -msgstr "Тело %s растворяется в кислоте." +msgstr "Тело (%s) растворяется в кислоте." #: src/mondeath.cpp #, c-format msgid "The %s's body leaks acid." -msgstr "Тело %s растекается кислотной лужей." +msgstr "Тело (%s) растекается кислотной лужей." #: src/mondeath.cpp #, c-format @@ -271672,12 +279473,12 @@ msgstr "%s распадается!" #: src/mondeath.cpp src/monmove.cpp #, c-format msgid "The %s splits in two!" -msgstr "%s разделился надвое!" +msgstr "%s разделяется надвое!" #: src/mondeath.cpp #, c-format msgid "Two worms crawl out of the %s's corpse." -msgstr "Два червя вылезают из трупа %s." +msgstr "Два червя вылезают из трупа (%s)." #: src/mondeath.cpp #, c-format @@ -271687,22 +279488,22 @@ msgstr "%s исчезает." #: src/mondeath.cpp #, c-format msgid "You feel guilty for killing %s." -msgstr "Вы чувствуете себя виноватым за убийство %s." +msgstr "Вы чувствуете себя виноватым из-за убийства (%s)." #: src/mondeath.cpp #, c-format msgid "You feel ashamed for killing %s." -msgstr "Вам стыдно за убийство %s." +msgstr "Вам стыдно за убийство (%s)." #: src/mondeath.cpp #, c-format msgid "You regret killing %s." -msgstr "Вы жалеете об убийстве %s." +msgstr "Вы жалеете об убийстве (%s)." #: src/mondeath.cpp #, c-format msgid "You feel remorse for killing %s." -msgstr "Вы чувствуете угрызения совести из-за убийства %s." +msgstr "Вы чувствуете угрызения совести из-за убийства (%s)." #. ~ Message after killing a lot of monsters which would normally affect the #. morale negatively. %s is the monster name, it will be pluralized with a @@ -271712,7 +279513,8 @@ msgstr "Вы чувствуете угрызения совести из-за у msgid "" "After killing so many bloody %s you no longer care about their deaths " "anymore." -msgstr "После убийства множества %s, вас больше не беспокоит их смерть." +msgstr "" +"После убийства целой чертовой армии %s, вас больше не беспокоит их смерть." #: src/mondeath.cpp msgid "Culling the weak is distasteful, but necessary." @@ -271782,7 +279584,7 @@ msgstr "%s уничтожен! ИГРА ОКОНЧЕНА!" #, c-format msgid "The %s's interior compartment sizzles with destructive energy." msgstr "" -"Из внутреннего отделения %s доносится шипение, вызываемое разрушительной " +"Из внутреннего отделения (%s) доносится шипение, вызываемое разрушительной " "энергией." #: src/mondeath.cpp @@ -271802,17 +279604,18 @@ msgstr "Люблю запах горящего зэда по утрам." #: src/mondefense.cpp #, c-format msgid "Striking the %1$s shocks %2$s!" -msgstr "Атаковав %1$s, %2$s получает электрический разряд!" +msgstr "Атаковав противника (%1$s), %2$s получает электрический разряд!" #: src/mondefense.cpp #, c-format msgid "Acid covering %s burns your hand!" -msgstr "Покрывающая %s кислота обжигает вашу кожу." +msgstr "Покрывающая существо (%s) кислота обжигает вашу кожу." #: src/mondefense.cpp #, c-format msgid "Acid sprays out of %s as it is hit!" -msgstr "Брызги кислоты разлетаются по округе при попадании по существу (%s)!" +msgstr "" +"Брызги кислоты разлетаются во все строны при попадании по существу (%s)!" #: src/mondefense.cpp msgid "Detected shots from unseen attacker, return fire mode engaged." @@ -271823,6 +279626,11 @@ msgstr "" msgid "zombie slave" msgstr "зомби-раб" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "Толкнуть: %s" + #: src/monexamine.cpp msgid "Rename" msgstr "Переименовать" @@ -271843,12 +279651,12 @@ msgstr "Вытащить все из сумки" #: src/monexamine.cpp #, c-format msgid "Attach bag to %s" -msgstr "Закрепить сумку на %s" +msgstr "Закрепить сумку: %s" #: src/monexamine.cpp #, c-format msgid "Remove vehicle harness from %s" -msgstr "Снять упряжь с %s" +msgstr "Снять упряжь: %s" #: src/monexamine.cpp #, c-format @@ -271863,7 +279671,7 @@ msgstr "Одеть броню (%s)" #: src/monexamine.cpp #, c-format msgid "Play with %s" -msgstr "Поиграть с %s" +msgstr "Поиграть с: %s" #: src/monexamine.cpp msgid "Untie" @@ -271876,7 +279684,7 @@ msgstr "Привязать" #: src/monexamine.cpp #, c-format msgid "You need any type of rope to tie %s in place" -msgstr "Чтобы привязать %s, нужна любая верёвка." +msgstr "Чтобы привязать существо (%s), нужна любая верёвка." #: src/monexamine.cpp msgid "Tear out pheromone ball" @@ -271885,7 +279693,7 @@ msgstr "Вырвать железу с феромоном" #: src/monexamine.cpp #, c-format msgid "Milk %s" -msgstr "Доить %s" +msgstr "Доить: %s" #: src/monexamine.cpp msgid "This animal would freeze if you shear it during winter." @@ -271898,7 +279706,7 @@ msgstr "Это животное еще не готово к стрижке." #: src/monexamine.cpp #, c-format msgid "Shear %s." -msgstr "Постричь %s." +msgstr "Постричь: %s." #: src/monexamine.cpp msgid "You cannot shear this animal without shears." @@ -271917,27 +279725,27 @@ msgstr "%s, снять сбрую" #: src/monexamine.cpp #, c-format msgid "You don't know how to saddle %s" -msgstr "Вы не знаете, как оседлать %s" +msgstr "Вы не знаете, как оседлать это существо (%s)" #: src/monexamine.cpp #, c-format msgid "Manage your friendship with %s" -msgstr "Установить дружбу с %s" +msgstr "Установить дружбу: %s" #: src/monexamine.cpp #, c-format msgid "Mount %s" -msgstr "Сесть верхом на %s" +msgstr "Сесть верхом: %s" #: src/monexamine.cpp #, c-format msgid "%s cannot be mounted" -msgstr "На %s нельзя ездить " +msgstr "На существе (%s) нельзя ездить верхом" #: src/monexamine.cpp #, c-format msgid "%s is too small to carry your weight" -msgstr "%s слишком маленький, чтобы выдержать ваш вес" +msgstr "%s: слишком маленькое создание, чтобы выдержать ваш вес" #: src/monexamine.cpp msgid "You have no knowledge of riding at all" @@ -271955,7 +279763,7 @@ msgstr "Вы недостаточно умелы, чтобы ездить без #: src/monexamine.cpp #, c-format msgid "%s battery level is %d%%" -msgstr "Заряд батарей у %s на уровне%d%%" +msgstr "Заряд батарей (%s) на уровне%d%%" #: src/monexamine.cpp msgid "Climb into the mech and take control" @@ -271980,12 +279788,12 @@ msgstr "Вставить новую батарею" #: src/monexamine.cpp #, c-format msgid "You need a %s to power this mech" -msgstr "Вам нужно %s, чтобы запустить этот мех" +msgstr "Чтобы запустить этот мех, вам нужно: %s " #: src/monexamine.cpp #, c-format msgid "Spend a few minutes to play with your %s?" -msgstr "Поиграть немного с %s?" +msgstr "Поиграть немного с питомцем (%s)?" #: src/monexamine.cpp msgid "Really kill the zombie slave?" @@ -271994,7 +279802,7 @@ msgstr "Точно убить зомби-раба?" #: src/monexamine.cpp #, c-format msgid "You start shearing the %s." -msgstr "Вы начинаете стричь %s." +msgstr "Вы начинаете стричь существо (%s)." #: src/monexamine.cpp msgid "Pet armor" @@ -272007,7 +279815,7 @@ msgstr "Сбруя" #: src/monexamine.cpp #, c-format msgid "Select an battery to insert into your %s." -msgstr "Выберите, какую батарею вставить в %s." +msgstr "Выберите, какую батарею вставить сюда: %s." #: src/monexamine.cpp msgid "Swipe your ID card into the mech's security port?" @@ -272028,7 +279836,7 @@ msgid "" "Welcome to the %s Friendship Interface. What would you like to do?\n" "Your current friendship will last: %s" msgstr "" -"Добро пожаловать в Интерфейс Дружбы %s. Что вы хотите сделать?\n" +"Добро пожаловать в Интерфейс Дружбы: %s. Что вы хотите сделать?\n" "Ваша текущая дружба продлится: %s" #: src/monexamine.cpp @@ -272056,7 +279864,7 @@ msgid "" " This %s will follow you for %s." msgstr "" "Ваша дружба растёт!\n" -"Этот %s будет следовать за вами в течение %s." +"%s будет следовать за вами в течение %s." #: src/monexamine.cpp #, c-format @@ -272066,12 +279874,12 @@ msgstr "Вы и %s меняетесь местами." #: src/monexamine.cpp #, c-format msgid "You pushed the %s." -msgstr "Вы толкаете %s." +msgstr "Вы толкаете: %s." #: src/monexamine.cpp #, c-format msgid "You pushed the %s, but it resisted." -msgstr "Вы толкаете %s, но он сопротивляется." +msgstr "Вы толкаете, но %sсопротивляется." #: src/monexamine.cpp msgid "Enter new pet name:" @@ -272084,27 +279892,27 @@ msgstr "Вещи сумки" #: src/monexamine.cpp #, c-format msgid "You mount the %1$s on your %2$s." -msgstr "Вы поставили %1$s на %2$s." +msgstr "Вы прикрепили предмет (%1$s) на существо (%2$s)." #: src/monexamine.cpp #, c-format msgid "You remove the %1$s from %2$s." -msgstr "Вы снимаете %1$s с %2$s." +msgstr "Вы снимаете предмет (%1$s) с существа (%2$s)." #: src/monexamine.cpp #, c-format msgid "Your %1$s doesn't have a bag!" -msgstr "Ваш %1$s не имеет прикрепленной сумки!" +msgstr "Ваш питомец (%1$s) не имеет прикрепленной сумки!" #: src/monexamine.cpp #, c-format msgid "You dump the contents of the %s's bag on the ground." -msgstr "Вы вываливаете содержимое мешка %s на землю." +msgstr "Вы вываливаете содержимое седельной сумки (%s) на землю." #: src/monexamine.cpp #, c-format msgid "There is no container on your %s to put things in!" -msgstr "Нет контейнера на %s, чтобы убрать!" +msgstr "На существе (%s) нет контейнера, куда можно складывать вещи!" #: src/monexamine.cpp #, c-format @@ -272114,35 +279922,35 @@ msgstr "%1$s слишком много весит, %2$s не сможет его #: src/monexamine.cpp #, c-format msgid "The %1$s is too big to fit in the %2$s." -msgstr "%1$s больше, чем может поместиться в %2$s." +msgstr "%1$s больше, чем можно поместить сюда (%2$s)." #: src/monexamine.cpp #, c-format msgctxt "pet armor" msgid "Your %1$s is too heavy for your %2$s." -msgstr "Эта броня (%1$s) слишком тяжела для %2$s." +msgstr "Эта броня (%1$s) слишком тяжела для существа (%2$s)." #: src/monexamine.cpp #, c-format msgctxt "pet armor" msgid "You put the %1$s on your %2$s." -msgstr "Вы кладете %1$s на ваш %2$s." +msgstr "Вы надеваете броню (%1$s) на существо (%2$s)." #: src/monexamine.cpp #, c-format msgid "You unhitch %s from the vehicle." -msgstr "Вы отцепляете %s от транспорта." +msgstr "Вы отцепляете тягловое животное (%s) от транспорта." #: src/monexamine.cpp #, c-format msgctxt "pet armor" msgid "You remove the %1$s from %2$s." -msgstr "Вы снимаете %1$s с %2$s." +msgstr "Вы снимаете броню (%1$s) с существа (%2$s)." #: src/monexamine.cpp #, c-format msgid "Your %1$s isn't wearing armor!" -msgstr "На %1$s нет брони!" +msgstr "На существе (%1$s) нет брони!" #: src/monexamine.cpp msgid "You tear out the pheromone ball from the zombie slave." @@ -272151,28 +279959,29 @@ msgstr "Вы вырезаете шар с феромонами из зомби- #: src/monexamine.cpp #, c-format msgid "Select an item to tie your %s with." -msgstr "Выберите предмет, которым вы хотите привязать %s." +msgstr "Выберите предмет, которым вы хотите привязать существо (%s)." #: src/monexamine.cpp #, c-format msgid "You milk the %s." -msgstr "Вы доите %s." +msgstr "Вы доите: %s." #: src/monexamine.cpp #, c-format msgid "The %s has no more milk." -msgstr "У %s не осталось молока." +msgstr "У существа (%s) не осталось молока." #: src/monmove.cpp #, c-format msgid "" "The %s flows around the objects on the floor and they are quickly dissolved!" -msgstr "%s растекается вокруг объектов на полу и они быстро растворяются!" +msgstr "%s растекается вокруг объектов на полу, и они быстро растворяются!" #: src/monmove.cpp #, c-format msgid "The %1$s slowly but firmly puts %2$s down onto the autodoc couch." -msgstr "%1$s медленно, но настойчиво укладывает %2$s на кушетку автодока." +msgstr "" +"%1$s медленно, но настойчиво укладывает пациента (%2$s) на кушетку автодока." #: src/monmove.cpp #, c-format @@ -272190,17 +279999,17 @@ msgstr "" #: src/monmove.cpp #, c-format msgid "The %1$s flies over the %2$s." -msgstr "%1$s перелетает через %2$s." +msgstr "%1$s перелетает через препятствие (%2$s)." #: src/monmove.cpp #, c-format msgid "The %1$s climbs over the %2$s." -msgstr "%1$s перелезает через %2$s." +msgstr "%1$s перелезает через препятствие (%2$s).." #: src/monmove.cpp #, c-format msgid "A %1$s flies over the %2$s!" -msgstr "%1$s перелетает через %2$s!" +msgstr "%1$s перелетает через препятствие (%2$s).!" #. ~ Message when a monster emerges from water #. ~ %1$s: monster name, %2$s: leaps/emerges, %3$s: terrain name @@ -272208,7 +280017,7 @@ msgstr "%1$s перелетает через %2$s!" #, c-format msgctxt "monster movement" msgid "A %1$s %2$s from the %3$s!" -msgstr "%1$s %2$s из %3$s!" +msgstr "%1$s %2$s из: %3$s!" #: src/monmove.cpp msgid "emerges" @@ -272224,7 +280033,7 @@ msgstr "выскакивает" #, c-format msgctxt "monster movement" msgid "A %1$s %2$s into the %3$s!" -msgstr "%1$s %2$s в %3$s!" +msgstr "%1$s %2$s в: %3$s!" #: src/monmove.cpp msgid "dives" @@ -272237,22 +280046,22 @@ msgstr "погружается" #: src/monmove.cpp #, c-format msgid "The %1$s tramples %2$s" -msgstr "%1$s попирает %2$s" +msgstr "%1$s топчет другого (%2$s)" #: src/monmove.cpp #, c-format msgid "The %1$s bounces off a %2$s!" -msgstr "%1$s отскакивает от %2$s!" +msgstr "%1$s отскакивает от другого (%2$s)!" #: src/monmove.cpp #, c-format msgid "The %1$s bounces off %2$s!" -msgstr "%1$s отскакивает от %2$s!" +msgstr "%1$s отскакивает от другого (%2$s)!" #: src/monmove.cpp #, c-format msgid "The %1$s bounces off a %2$s." -msgstr "%1$s отскакивает от %2$s." +msgstr "%1$s отскакивает от препятствия (%2$s)." #. ~ %1$s - monster name, %2$s - vehicle name #: src/monmove.cpp @@ -272678,7 +280487,7 @@ msgstr "%s взрывается, словно огненный шар!" #: src/monster.cpp #, c-format msgid "Lightning from %1$s engulfs the %2$s!" -msgstr "Электрическое поле от %1$s накрывает %2$s!" +msgstr "Электрическое поле от %1$s накрывает окружение (%2$s)!" #: src/monster.cpp msgid "BOOOOOOOM!!!" @@ -272691,7 +280500,7 @@ msgstr "вррррРРРРУУМММММММ!" #: src/monster.cpp #, c-format msgid "Lightning strikes the %s!" -msgstr "Молния попадает в %s!" +msgstr "Молния попадает куда-то (%s)!" #: src/monster.cpp msgid "Your vision goes white!" @@ -272742,7 +280551,7 @@ msgstr "%s ужасающее сгорает под солнечным свет #: src/monster.cpp #, c-format msgid "The spores transform %1$s into a %2$s!" -msgstr "Споры превращают %1$s в %2$s!" +msgstr "Споры превращают существо (%1$s) во что-то ещё (%2$s)!" #: src/monstergenerator.cpp src/mtype.cpp msgid "footsteps." @@ -272797,23 +280606,15 @@ msgstr "Фокус смещается в сторону:" msgid "You feel bugs crawl over your skin." msgstr "Вы чувствуете, как по вам ползают насекомые." -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "человек" -msgstr[1] "человека" -msgstr[2] "человек" -msgstr[3] "человек" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" -msgstr "Ваш %s уничтожен!" +msgstr "%s уничтожается!" #: src/mutation.cpp #, c-format msgid "'s %s is destroyed!" -msgstr "У %s уничтожено!" +msgstr "%s () уничтожается!" #: src/mutation.cpp #, c-format @@ -272823,12 +280624,13 @@ msgstr "Ваше снаряжение (%s) спадает!" #: src/mutation.cpp #, c-format msgid "'s %s is pushed off!" -msgstr "Снаряжение (%s) у спадает!" +msgstr "Снаряжение (%s) у NPC () спадает!" #: src/mutation.cpp #, c-format msgid "You feel like using your %s would kill you!" -msgstr "Вам кажется, что если вы будете использовать %s, то это убьёт вас!" +msgstr "" +"Вам кажется, что если вы будете использовать это (%s), то оно убьёт вас!" #: src/mutation.cpp msgid "You start spinning web with your spinnerets!" @@ -272899,7 +280701,7 @@ msgstr "Ваша мутация %1$s превращается в %2$s!" #: src/mutation.cpp #, c-format msgid "'s %1$s mutation turns into %2$s!" -msgstr "мутация %1$s у превращается в %2$s!" +msgstr "мутация %1$s () превращается в %2$s!" #: src/mutation.cpp #, c-format @@ -272909,7 +280711,7 @@ msgstr "Ваша врождённая черта %1$s превращается #: src/mutation.cpp #, c-format msgid "'s innate %1$s trait turns into %2$s!" -msgstr "Врождённая черта %1$s у превращается в %2$s!" +msgstr "Врождённая черта %1$s () превращается в %2$s!" #: src/mutation.cpp #, c-format @@ -272986,7 +280788,7 @@ msgid "" "It was probably that marloss -- how did you know to call it \"marloss\" " "anyway?" msgstr "" -"Скорее всего, это было марло — а вообще, откуда ты узнал, что его нужно " +"Скорее всего, это было марло — а вообще, откуда тебе знать, что это нужно " "называть «марло»?" #: src/mutation.cpp @@ -273503,7 +281305,7 @@ msgstr "Выбранный вами сценарий не позволяет в #: src/newcharacter.cpp #, c-format msgid "Your profession of %s prevents you from taking this trait." -msgstr "Ваша профессия %s не позволяет взять эту черту." +msgstr "Ваша профессия (%s) не позволяет взять эту черту." #: src/newcharacter.cpp #, c-format @@ -273652,7 +281454,7 @@ msgstr "Заклинания:" #: src/newcharacter.cpp #, c-format msgid "%s level %d" -msgstr "%s уровень %d" +msgstr "%s уровня %d" #: src/newcharacter.cpp #, c-format @@ -273696,20 +281498,20 @@ msgstr "Поиск по профессии." #, c-format msgid "%d level" msgid_plural "%d levels" -msgstr[0] "%d уровень" +msgstr[0] "%d уровня" msgstr[1] "%d уровня" -msgstr[2] "%d уровней" -msgstr[3] "%d уровни" +msgstr[2] "%d уровня" +msgstr[3] "%d уровня" #. ~ Second string is e.g. "1 level" or "2 levels" #: src/newcharacter.cpp #, c-format msgid "Upgrading %s by %s costs %d point" msgid_plural "Upgrading %s by %s costs %d points" -msgstr[0] "Улучшение %s на %s стоит %d очко" -msgstr[1] "Улучшение %s на %s стоит %d очка" -msgstr[2] "Улучшение %s на %s стоит %d очков" -msgstr[3] "Улучшение %s на %s стоит %d очков" +msgstr[0] "Улучшение навыка «%s» на %s стоит %d очко" +msgstr[1] "Улучшение навыка «%s» на %s стоит %d очка" +msgstr[2] "Улучшение навыка «%s» на %s стоит %d очков" +msgstr[3] "Улучшение навыка «%s» на %s стоит %d очков" #. ~ 1s - scenario name, 2d - current character points. #: src/newcharacter.cpp @@ -273774,19 +281576,19 @@ msgstr "Флаги сценария:" #: src/newcharacter.cpp msgid "Spring start" -msgstr "Пришла весна" +msgstr "Начало весны" #: src/newcharacter.cpp msgid "Summer start" -msgstr "Лето настало" +msgstr "Начало лета" #: src/newcharacter.cpp msgid "Autumn start" -msgstr "Пришла осень" +msgstr "Начало осени" #: src/newcharacter.cpp msgid "Winter start" -msgstr "Зима близко" +msgstr "Начало зимы" #: src/newcharacter.cpp msgid "Next summer start" @@ -273836,18 +281638,6 @@ msgstr "Возраст:" msgid "Blood type:" msgstr "Группа крови:" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" -"*Случайная локация* (%d вариантов)" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "%s(%d вариантов)" - #: src/newcharacter.cpp msgid "Name:" msgstr "Имя:" @@ -273860,6 +281650,30 @@ msgstr "Пол:" msgid "Select a starting location." msgstr "Выберите начальную локацию" +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" +"*Случайная локация* (%d вариант)" +msgstr[1] "" +"*Случайная локация* (%d варианта)" +msgstr[2] "" +"*Случайная локация* (%d вариантов)" +msgstr[3] "" +"*Случайная локация* (%d вариант)" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s(%d вариант)" +msgstr[1] "%s(%d варианта)" +msgstr[2] "%s(%d вариантов)" +msgstr[3] "%s(%d вариант)" + #: src/newcharacter.cpp msgid "Stats:" msgstr "Характеристики:" @@ -273943,6 +281757,15 @@ msgstr "Нажмите %s для выбора лок msgid "Starting location:" msgstr "Начальная локация:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s(%d вариант)" +msgstr[1] "%s(%d варианта)" +msgstr[2] "%s(%d вариантов)" +msgstr[3] "%s(%d вариант)" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "Стартовый транспорт:" @@ -274048,7 +281871,7 @@ msgstr "%s — плохое чтиво." #: src/npc.cpp msgid "I'm not smart enough to read this book." -msgstr "Я недостаточно умён для этой книги." +msgstr "Я не хватает ума для этой книги." #: src/npc.cpp msgid "I won't learn anything from this book." @@ -274077,43 +281900,43 @@ msgstr "Спасибо, я буду это носить." #: src/npc.cpp msgid "I tried but couldn't wear it." -msgstr "У меня не получилось ходить в этом." +msgstr "У меня не получилось надеть это." #: src/npc.cpp #, c-format msgid " wears the %s." -msgstr " носит %s." +msgstr " носит: %s." #. ~ %1$s: weapon name, %2$s: holster name #: src/npc.cpp #, c-format msgid " puts away the %1$s in the %2$s." -msgstr " убирает %1$s в %2$s." +msgstr " убирает оружие (%1$s) в кобуру (%2$s)." #: src/npc.cpp #, c-format msgid " puts away the %s." -msgstr " откладывает в сторону %s." +msgstr " откладывает в сторону оружие (%s)." #: src/npc.cpp #, c-format msgid " drops the %s." -msgstr " выкладывает на пол %s." +msgstr " выкладывает на пол оружие (%s)." #: src/npc.cpp #, c-format msgid " wields a %s." -msgstr " берёт в руки %s." +msgstr " берёт в руки оружие (%s)." #: src/npc.cpp #, c-format msgid "%s is tired of your incompetent leadership and abuse!" msgstr "" -"%s по горло сыт вашим некомпетентным руководством и плохим обращением!" +"%s по горло сыт(а) вашим некомпетентным руководством и плохим обращением!" #: src/npc.cpp msgid " Adios, motherfucker!" -msgstr " Пошёл на хуй, мудак!" +msgstr " Иди на хуй, мудила!" #: src/npc.cpp #, c-format @@ -274285,7 +282108,7 @@ msgstr "Ожидает вас" #: src/npc.cpp msgid "Mugging you" -msgstr "Вас ограбили" +msgstr "Грабит вас" #: src/npc.cpp msgid "Waiting for you to leave" @@ -274309,7 +282132,7 @@ msgstr "Выполняет задание" #: src/npc.cpp msgid "Trying to recover stolen goods" -msgstr "Попытка вернуть украденный товар" +msgstr "Пытается вернуть украденный товар" #: src/npc.cpp msgid "NPC Legacy Attitude" @@ -274333,7 +282156,7 @@ msgstr "Следует за вами." #: src/npc.cpp msgid "Is guiding you." -msgstr "Направляет тебя." +msgstr "Направляет вас." #: src/npc.cpp msgid "Will try to kill you or flee from you if you reveal yourself." @@ -274408,7 +282231,7 @@ msgstr "%s ложится спать." #: src/npcmove.cpp #, c-format msgid "Hold still %s, I'm coming to help you." -msgstr "Держись %s, иду на помощь." +msgstr "Держись, %s, иду на помощь." #: src/npcmove.cpp msgid "Don't move a muscle…" @@ -274417,22 +282240,22 @@ msgstr "Не двигай, , ни одним мускулом…" #: src/npcmove.cpp #, c-format msgid "%1$s tries to climb the %2$s but slips." -msgstr "%1$s пытается забраться на %2$s, но соскальзывает." +msgstr "%1$s пытается забраться на препятствие (%2$s), но соскальзывает." #: src/npcmove.cpp #, c-format msgid "%1$s climbs over the %2$s." -msgstr "%1$s перелезает через %2$s." +msgstr "%1$s перелезает через препятствие (%2$s)." #: src/npcmove.cpp #, c-format msgid "Hold on, I want to pick up that %s." -msgstr "Погоди, я хочу подобрать %s." +msgstr "Погоди, я хочу подобрать, вон там - %s." #: src/npcmove.cpp #, c-format msgid "%1$s picks up a %2$s and a %3$s." -msgstr "%1$s подбирает %2$s и %3$s." +msgstr "%1$s подбирает: %2$s и %3$s." #: src/npcmove.cpp #, c-format @@ -274455,37 +282278,37 @@ msgstr[3] "%s выбросил %d предмет." #: src/npcmove.cpp #, c-format msgid "%1$s drops a %2$s." -msgstr "%1$s бросает %2$s." +msgstr "%1$s бросает: %2$s." #: src/npcmove.cpp #, c-format msgid "Hold on, I want to pulp that %s." -msgstr "Погоди, я хочу разделать %s." +msgstr "Погоди, я хочу разделать, вон там - %s." #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." -msgstr "%1$s бросает %2$s." +msgstr "%1$s бросает: %2$s." #: src/npcmove.cpp #, c-format msgid "%1$s heals %2$s." -msgstr "%1$s лечит %2$s." +msgstr "%1$s лечит: %2$s." #: src/npcmove.cpp #, c-format msgid "%s applies a %s" -msgstr "%s применяет %s" +msgstr "%s применяет: %s" #: src/npcmove.cpp #, c-format msgid "%1$s takes some %2$s." -msgstr "%1$s принимает немного %2$s." +msgstr "%1$s принимает: %2$s." #: src/npcmove.cpp #, c-format msgid "%1$s takes %2$s's money!" -msgstr "%1$s забирает деньги у %2$s!" +msgstr "%1$s забирает деньги у: %2$s!" #: src/npcmove.cpp #, c-format @@ -274495,18 +282318,18 @@ msgstr "%s забирает ваши деньги!" #: src/npcmove.cpp #, c-format msgid "%1$s takes %2$s's %3$s." -msgstr "%1$s берёт %3$s (принадлежит %2$s)." +msgstr "%1$s берёт: %3$s (владелец - %2$s)." #: src/npcmove.cpp #, c-format msgid "%1$s takes your %2$s." -msgstr "%1$s забирает ваш %2$s." +msgstr "%1$s забирает у вас: %2$s." #: src/npcmove.cpp #, c-format msgid "" "From your two-way radio you hear %s reporting in, 'I've arrived, boss!'" -msgstr "Из рации слышно голос %s: «Я на месте, босс!»" +msgstr "Из рации слышно голос (%s): «Я на месте, босс!»" #: src/npcmove.cpp #, c-format @@ -274521,12 +282344,12 @@ msgstr "%s %s%s" #: src/npcmove.cpp #, c-format msgid "My %s wound is infected…" -msgstr "Рана у меня на %s заражена…" +msgstr "У меня рана… %s плохо выглядит…" #: src/npcmove.cpp #, c-format msgid "The bite wound on my %s looks bad." -msgstr "Рана от укуса у меня на %s выглядит плохо." +msgstr "У меня тут укус… %s выглядит плохо." #: src/npcmove.cpp msgid "" @@ -274552,7 +282375,7 @@ msgstr "%s: идёт кровь!" #: src/npcmove.cpp #, c-format msgid "%1$s reloads their %2$s." -msgstr "%1$s перезаряжает %2$s." +msgstr "%1$s перезаряжает: %2$s." #: src/npctalk.cpp msgid "INTIMIDATE" @@ -274568,7 +282391,7 @@ msgstr "УБЕЖДЕНИЕ" #: src/npctalk.cpp msgid "Everyone" -msgstr "Каждый" +msgstr "Все" #: src/npctalk.cpp #, c-format @@ -274650,7 +282473,7 @@ msgstr "Что вы хотите сделать?" #: src/npctalk.cpp #, c-format msgid "Talk to %s" -msgstr "Поговорить с %s" +msgstr "Поговорить с: %s" #: src/npctalk.cpp msgid "Talk to…" @@ -274690,7 +282513,7 @@ msgstr "Свистните тягловым животным перестать #: src/npctalk.cpp #, c-format msgid "Tell %s to follow" -msgstr "Приказать %s следовать за вами" +msgstr "Приказать (%s) следовать за вами" #: src/npctalk.cpp msgid "Tell someone to follow…" @@ -274699,7 +282522,7 @@ msgstr "Приказать кому-нибудь следовать…" #: src/npctalk.cpp #, c-format msgid "Tell %s to guard" -msgstr "Приказать %s охранять позицию" +msgstr "Приказать (%s) охранять позицию" #: src/npctalk.cpp msgid "Tell someone to guard…" @@ -274800,7 +282623,7 @@ msgstr "Вы кричите: %s" #: src/npctalk.cpp #, c-format msgid "%s yelling %s" -msgstr "%s кричит %s" +msgstr "%s кричит: %s" #: src/npctalk.cpp #, c-format @@ -274932,11 +282755,11 @@ msgstr "Вос %d — %d" #: src/npctalk.cpp msgid "Dead tired" -msgstr "Устал до смерти" +msgstr "Жуткая усталость" #: src/npctalk.cpp msgid "Not tired" -msgstr "Не устал" +msgstr "Нет усталости" #: src/npctalk.cpp msgid ". Will need sleep in " @@ -274956,7 +282779,7 @@ msgid "" "Thirsty" msgstr "" "\n" -"Хочет пить" +"Есть жажда" #: src/npctalk.cpp msgid "" @@ -274972,7 +282795,7 @@ msgid "" "Hungry" msgstr "" "\n" -"Хочет есть" +"Есть голод" #: src/npctalk.cpp msgid "YES, MASTER!" @@ -274985,7 +282808,7 @@ msgstr "У меня есть новости." #: src/npctalk.cpp #, c-format msgid "Yes, let's resume training %s" -msgstr "Да, давай продолжим тренировку %s" +msgstr "Да, давай продолжим тренировать %s" #: src/npctalk.cpp #, c-format @@ -275110,47 +282933,47 @@ msgstr "Вы не можете себе этого позволить!" #: src/npctalk.cpp #, c-format msgid "%1$s gives you a %2$s." -msgstr "%1$s даёт вам %2$s." +msgstr "%1$s даёт вам: %2$s." #. ~ %1%s is the NPC name, %2$d is a number of items, %3$s are items #: src/npctalk.cpp #, c-format msgid "%1$s gives you %2$d %3$s." -msgstr "%1$s даёт вам %2$d %3$s." +msgstr "%1$s даёт вам: %2$d %3$s." #. ~ %1$s is a translated item name #: src/npctalk.cpp #, c-format msgid "You don't have a %1$s!" -msgstr "У вас нет %1$s!" +msgstr "У вас нет этого (%1$s)!" #. ~ %1%s is the NPC name, %2$s is an item #: src/npctalk.cpp #, c-format msgid "You give %1$s a %2$s." -msgstr "Вы даёте %1$s %2$s." +msgstr "Вы даёте NPC (%1$s): %2$s." #. ~ %1%s is the NPC name, %2$d is a number of items, %3$s are items #: src/npctalk.cpp #, c-format msgid "You give %1$s %2$d %3$s." -msgstr "Вы даёте %1$s %2$d %3$s." +msgstr "Вы даёте NPC (%1$s): %2$d %3$s." #. ~ %1%s is the "You" or the NPC name, %2$s are a translated item name #: src/npctalk.cpp #, c-format msgid "%1$s doesn't have a %2$s!" -msgstr "У %1$s нет %2$s!" +msgstr "У персонажа (%1$s) нет этого (%2$s)!" #: src/npctalk.cpp #, c-format msgid "%1$s gives you %2$s." -msgstr "%1$s даёт вам %2$s." +msgstr "%1$s даёт вам: %2$s." #: src/npctalk.cpp #, c-format msgid "You learn how to craft %s." -msgstr "Вы учитесь, как делать %s." +msgstr "Вы учитесь, как создавать: %s." #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS…" @@ -275167,7 +282990,7 @@ msgstr "Спасибо, то что надо." #: src/npctalk.cpp #, c-format msgid "I need a %s to consume that!" -msgstr "Мне нужен %s, чтобы употребить это!" +msgstr "Мне нужен инструмент - %s, чтобы употребить это!" #: src/npctalk.cpp msgid "Thanks, I feel better already." @@ -275175,7 +282998,7 @@ msgstr "Спасибо, мне уже становится лучше." #: src/npctalk.cpp msgid "Thanks, I used it." -msgstr "Спасибо, я использовал это." +msgstr "Спасибо, я использую это." #: src/npctalk.cpp msgid "Offer what?" @@ -275187,7 +283010,7 @@ msgstr "Вам нечего предложить." #: src/npctalk.cpp msgid "Changed your mind?" -msgstr "Передумал?" +msgstr "Передумали?" #: src/npctalk.cpp msgid "How?" @@ -275195,7 +283018,7 @@ msgstr "Как?" #: src/npctalk.cpp msgid "Are you insane!?" -msgstr "Ты, , псих?!" +msgstr "Ты, , совсем ку-ку?!" #: src/npctalk.cpp msgid "Thanks, I'll wield that now." @@ -275225,7 +283048,7 @@ msgstr "У меня нету места для хранения." #: src/npctalk.cpp #, c-format msgid "I can only store %s %s more." -msgstr "Я могу взять только %s %s ещё." +msgstr "Я могу взять ещё только %s %s." #: src/npctalk.cpp msgid "…or to store anything else for that matter." @@ -275261,12 +283084,12 @@ msgstr "Мое текущее местоположение" #: src/npctalk_funcs.cpp #, c-format msgid "That is not a valid destination for %s." -msgstr "Это не подходящее место для %s." +msgstr "Это неподходящее назначение для: %s." #: src/npctalk_funcs.cpp #, c-format msgid "%1$s is assigned to %2$s" -msgstr "%1$s приписан к %2$s" +msgstr "%1$s приписан: %2$s" #: src/npctalk_funcs.cpp #, c-format @@ -275281,7 +283104,7 @@ msgstr "%s игнорирует вас." #: src/npctalk_funcs.cpp #, c-format msgid "You start a fight with %s!" -msgstr "Вы начали драться с %s!" +msgstr "Вы начали драться с: %s!" #: src/npctalk_funcs.cpp msgid "You don't have any bionics installed…" @@ -275298,12 +283121,12 @@ msgstr "Вы решили подождать…" #: src/npctalk_funcs.cpp #, c-format msgid "%s has nothing to give!" -msgstr "У %s ничего нет!" +msgstr "%s ничего не может дать!" #: src/npctalk_funcs.cpp #, c-format msgid "%1$s gives you a %2$s" -msgstr "%1$s даёт вам %2$s" +msgstr "%1$s даёт вам: %2$s" #: src/npctalk_funcs.cpp msgid "Choose a new hairstyle" @@ -275324,22 +283147,22 @@ msgstr "У вас новая модная стрижка!" #: src/npctalk_funcs.cpp #, c-format msgid "%s gives you a decent haircut…" -msgstr "%s прилично вас постриг…" +msgstr "%s прилично вас стрижёт…" #: src/npctalk_funcs.cpp #, c-format msgid "%s gives you a decent shave…" -msgstr "%s прилично вас побрил…" +msgstr "%s прилично вас бреет…" #: src/npctalk_funcs.cpp #, c-format msgid "That was a pleasant conversation with %s…" -msgstr "Было приятно пообщаться с %s…" +msgstr "Было приятно пообщаться с: %s…" #: src/npctalk_funcs.cpp #, c-format msgid "That was a pleasant conversation with %s." -msgstr "Было приятно пообщаться с %s." +msgstr "Было приятно пообщаться с: %s." #: src/npctalk_funcs.cpp #, c-format @@ -275375,7 +283198,8 @@ msgstr "%s чувствует, что вы не представляете бо #, c-format msgid "Pause to stay still. Any movement may cause %s to attack." msgstr "" -"Ждите, чтобы стоять на месте. Любое движение может заставить %s атаковать." +"Ждите, чтобы стоять на месте. %s может быть спровоцирован(а) атаковать любым" +" движением." #: src/npctalk_funcs.cpp msgid "Pay:" @@ -275391,8 +283215,8 @@ msgid "" "Trading with %s.\n" "%s to switch lists, letters to pick items, %s to finalize, %s to quit, %s to get information on an item." msgstr "" -"Торговля с %s\n" -"%s — переключение писками и выбором по букве, %s — завершить выбор, %s — выход, %s — для получения информации о предмете." +"Торговля с: %s.\n" +"%s — переключение между списками и выбором по букве, %s — завершить выбор, %s — выход, %s — для получения информации о предмете." #: src/npctrade.cpp #, c-format @@ -275664,6 +283488,14 @@ msgstr "Разбивать" msgid "Pulp Adjacent" msgstr "Разбивать рядом" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "Разбивать только зомби поблизости" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "Разбивать только зомби" + #: src/options.cpp msgid "Auto mining" msgstr "Авто-копание" @@ -275688,7 +283520,7 @@ msgid "" msgstr "" "Действие при включённом «Авто-собирательстве». Кусты: Обыскивать только " "кусты. — Деревья: Обыскивать только деревья. — Всё: Обыскивать кусты, " -"деревья и всё остальное, включая рогоз." +"деревья и всё остальное, включая цветы, рогоз и пр." #: src/options.cpp msgid "Bushes" @@ -275728,14 +283560,14 @@ msgid "" msgstr "" "Всегда: вас всегда предупреждают о переходе на опасные тайлы. Бегом: вы " "сможете перемещаться на опасные тайлы только бегом и об этом будет " -"предупреждение. Подкрадыванием: вы сможете перемещаться на опасные тайлы " -"только во время подкрадывания и получите об этом оповещение. Никогда: вы не " -"сможете перейти на опасные тайлы, если не бежите, и вас не будут " -"предупреждать или запрашивать." +"предупреждение. Подкрадываясь: вы сможете перемещаться на опасные тайлы " +"только подкрадываясь и получите об этом оповещение. Никогда: вы не сможете " +"перейти на опасные тайлы, если не бежите, и вас не будут предупреждать или " +"запрашивать." #: src/options.cpp msgid "Crouching" -msgstr "Подкрадыванием" +msgstr "Подкрадываясь" #: src/options.cpp msgid "Running" @@ -277117,7 +284949,7 @@ msgid "" "to very slow mapgen." msgstr "" "Число определяет, как далеко будут города друг от друга. Осторожно, " -"маленькие числа может очень сильно замедлить генерацию мира." +"маленькие числа могут очень сильно замедлить генерацию мира." #: src/options.cpp msgid "Spawn rate scaling factor" @@ -277343,21 +285175,6 @@ msgstr "Мутации от радиации" msgid "If true, radiation causes the player to mutate." msgstr "Если включено, то радиация приводит к мутации персонажа игрока." -#: src/options.cpp -msgid "Z-levels" -msgstr "Вертикальные уровни" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" -"Если включено, добавляются некоторые возможности, такие, как переноска вещей" -" по лестнице, возможность взбираться по водостокам, управление " -"авиатранспортом. Может вызвать проблемы, если будет включено после начала " -"игры." - #: src/options.cpp msgid "Character point pools" msgstr "Пулы очков персонажей" @@ -277700,7 +285517,7 @@ msgstr "" #: src/options.cpp msgid "Default gameplay shortcuts" -msgstr "По умолчанию сочетание клавиш" +msgstr "Горячие клавиши по умолчанию" #: src/options.cpp msgid "" @@ -278099,14 +285916,14 @@ msgid "" "[q]uality, [n]otes or " "[d]isassembled components." msgstr "" -"Поиск [c] Категория, [m] - " +"Поиск [c] - категория, [m] - " "материал, [q] - качество, [n] - " -"заметки, [d] компоненты после разборки." +"заметки, [d] - компоненты после разборки." #. ~ An example of how to filter items based on category or material. #: src/output.cpp msgid "Examples: c:food,m:iron,q:hammering,n:toolshelf,d:pipe" -msgstr "Например: c:food,m:iron,q:hammering,n:toolshelf,d:pipe" +msgstr "Например: c:еда,m:железо,q:забивание,n:инструменты,d:труба" #: src/output.cpp msgid "unknown" @@ -278151,7 +285968,7 @@ msgstr "$%.2f" #: src/overmap.cpp src/skill.cpp msgid "invalid" -msgstr "неправильная" +msgstr "неверное" #: src/overmap.cpp msgid "" @@ -278173,7 +285990,8 @@ msgstr "" #: src/overmap.cpp msgid "Head West. All survivors, head West. Help is waiting." -msgstr "На запад. Все уцелевшие, двигайтесь на запад. Там вам помогут." +msgstr "" +"Двигайтесь на запад. Все уцелевшие, двигайтесь на запад. Там вам помогут." #: src/overmap.cpp #, c-format @@ -278260,6 +286078,16 @@ msgstr "Зона:" msgid "# Unexplored" msgstr "# Неисследованно" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "мест.: %s" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "тип_мест: %s" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "Расстояние до активного задания:" @@ -278386,7 +286214,7 @@ msgstr "Вращение: %s %s" #: src/overmap_ui.cpp msgid "(fixed)" -msgstr "(исправленная)" +msgstr "(фиксирован.)" #: src/overmap_ui.cpp msgid "Areas highlighted in red" @@ -278591,6 +286419,10 @@ msgstr "Обжигающе!" msgid "Very hot!" msgstr "Очень жарко!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "Комфортно" + #: src/panels.cpp msgid "Very cold!" msgstr "Очень холодно!" @@ -278601,7 +286433,7 @@ msgstr "Замерзание!" #: src/panels.cpp msgid "SAFE" -msgstr "SAFE" +msgstr "БЕЗОП." #: src/panels.cpp msgid "STM" @@ -278946,22 +286778,22 @@ msgstr "Выйти" #: src/pickup.cpp #, c-format msgid "Dispose of %s and wield %s" -msgstr "Избавиться от %s и взять в руки %s" +msgstr "Избавиться от предмета (%s) и взять в руки: %s" #: src/pickup.cpp #, c-format msgid "Wield %s" -msgstr "Взять в руки %s" +msgstr "Взять в руки: %s" #: src/pickup.cpp #, c-format msgid "Wear %s" -msgstr "Надеть %s" +msgstr "Надеть: %s" #: src/pickup.cpp #, c-format msgid "Spill contents of %s, then pick up %s" -msgstr "Вылить содержимое (%s), затем поднять %s" +msgstr "Вылить содержимое (%s), затем поднять: %s" #: src/pickup.cpp msgid "" @@ -278978,17 +286810,17 @@ msgstr "Если подберёте этот предмет, то соверши #: src/pickup.cpp #, c-format msgid "The %s is too heavy!" -msgstr "%s слишком тяжёлый!" +msgstr "%s - слишком тяжело!" #: src/pickup.cpp #, c-format msgid "Can't stash %s while it's not empty" -msgstr "Вы не можете положить %s, пока тот не пуст." +msgstr "Вы не можете убрать это (%s) в инвентарь, пока в нём что-то есть." #: src/pickup.cpp #, c-format msgid "Not enough capacity to stash %s" -msgstr "Недостаточно места, чтобы вместить %s" +msgstr "Недостаточно места, чтобы вместить: %s" #: src/pickup.cpp msgid "You can't pick up a liquid!" @@ -279078,12 +286910,16 @@ msgstr "Вы подняли: %d %s" #: src/pickup.cpp #, c-format msgid "To avoid spilling its contents, you set your %1$s on the %2$s." -msgstr "Вы ставите %1$s на %2$s, чтобы избежать разлива содержимого." +msgstr "" +"Вы ставите предмет (%1$s) на повехность (%2$s), чтобы избежать разлива " +"содержимого." #: src/pickup.cpp #, c-format msgid "To avoid spilling its contents, sets their %1$s on the %2$s." -msgstr " ставит %1$s на %2$s, чтобы избежать разлива содержимого." +msgstr "" +" ставит предмет (%1$s) на поверхность (%2$s), чтобы избежать " +"разлива содержимого." #: src/player.cpp #, c-format @@ -279109,29 +286945,31 @@ msgstr " пытается потушить огонь!" #: src/player.cpp #, c-format msgid "Your ground sonar detected a %1$s to the %2$s!" -msgstr "Ваш сонар заметил %1$s к %2$sу от вас!" +msgstr "Ваш сонар заметил: %1$s, к %2$sу от вас!" #: src/player.cpp src/vehicle_move.cpp #, c-format msgid "You've spotted a %1$s to the %2$s!" -msgstr "Вы заметили %1$s к %2$sу от вас!" +msgstr "Вы заметили: %1$s к %2$sу от вас!" #: src/player.cpp #, c-format msgid "Your offensive defense system shocks %s in mid-attack!" msgstr "" -"Ваша наступательная система обороны бьёт %s электрическим разрядом во время " -"атаки!" +"Ваша наступательная система обороны бьёт противника (%s) электрическим " +"разрядом во время атаки!" #: src/player.cpp #, c-format msgid "%1$s's offensive defense system shocks %2$s in mid-attack!" -msgstr "Наступательная система обороны (%1$s) бьёт %2$s током во время атаки!" +msgstr "" +"Наступательная система обороны (%1$s) бьёт противника (%2$s) током во время " +"атаки!" #: src/player.cpp #, c-format msgid "%1$s's %2$s puncture %3$s in mid-attack!" -msgstr "%2$s (%1$s) прокалывает %3$s во время атаки!" +msgstr "%2$s (%1$s) прокалывают противника (%3$s) во время атаки!" #: src/player.cpp msgid "quills" @@ -279144,12 +286982,12 @@ msgstr "иголки" #: src/player.cpp #, c-format msgid "Your %1$s puncture %2$s in mid-attack!" -msgstr "Ваш %1$s прокалывает %2$s во время атаки!" +msgstr "Ваши %1$s прокалывают противника (%2$s) во время атаки!" #: src/player.cpp #, c-format msgid "%1$s's %2$s scrape %3$s in mid-attack!" -msgstr "%2$s (%1$s) царапает %3$s во время атаки!" +msgstr "%2$s (%1$s) царапают противника (%3$s) во время атаки!" #: src/player.cpp msgid "thorns" @@ -279158,21 +286996,21 @@ msgstr "колючки" #: src/player.cpp #, c-format msgid "Your thorns scrape %s in mid-attack!" -msgstr "Ваши колючки царапают %s во время атаки!" +msgstr "Ваши колючки царапают противника (%s) во время атаки!" #: src/player.cpp #, c-format msgid "%1$s gets a load of %2$s's %3$s stuck in!" -msgstr "%1$s вырывает клок %3$s у %2$s!" +msgstr "%1$s вырывает клок %3$s у противника (%2$s)!" #: src/player.cpp msgid "hair" -msgstr "волосы" +msgstr "волос" #: src/player.cpp #, c-format msgid "Your hairs detach into %s!" -msgstr "Ваши волосы отрывает %s!" +msgstr "Ваши волосы отрывает - %s!" #: src/player.cpp #, c-format @@ -279186,17 +287024,17 @@ msgstr "Вы теряете равновесие после удара!" #: src/player.cpp #, c-format msgid "You land on %s." -msgstr "Вы приземлились на %s." +msgstr "Вы приземлились на: %s." #: src/player.cpp #, c-format msgid "You are slammed against %1$s for %2$d damage." -msgstr "Вы врезались в %1$s, получив %2$d урона." +msgstr "Вы врезались в препятствие (%1$s), получив %2$d урона." #: src/player.cpp #, c-format msgid "You are slammed against %s!" -msgstr "Вы врезались в %s!" +msgstr "Вы врезались в препятствие (%s)!" #: src/player.cpp msgid "…but your shock absorbers negate the damage!" @@ -279205,37 +287043,37 @@ msgstr "… но ваши кинетические амортизаторы по #: src/player.cpp #, c-format msgid "You are slammed against %s." -msgstr "Вы врезались в %s." +msgstr "Вы врезались в препятствие (%s)." #: src/player.cpp #, c-format msgid " is slammed against %s." -msgstr " врезается в %s!" +msgstr " врезается в препятствие (%s)!" #: src/player.cpp #, c-format msgid " bounces off a %s!" -msgstr " отскакивает от %s!" +msgstr " отскакивает от препятствия (%s)!" #: src/player.cpp #, c-format msgid "You bounce off a %s!" -msgstr "Вы отскакиваете от %s!" +msgstr "Вы отскакиваете от препятствия (%s)!" #: src/player.cpp #, c-format msgid " bounces off %s!" -msgstr " отскакивает от %s!" +msgstr " отскакивает от препятствия (%s)!" #: src/player.cpp #, c-format msgid "You bounce off %s!" -msgstr "Вы отскакиваете от %s!" +msgstr "Вы отскакиваете от препятствия (%s)!" #: src/player.cpp #, c-format msgid "There is not enough %s left to siphon it." -msgstr "Здесь осталось недостаточно %s." +msgstr "Здесь осталось недостаточно жидкости (%s), чтобы можно было слить." #: src/player.cpp msgid "Your body is wracked with excruciating pain!" @@ -279260,27 +287098,27 @@ msgstr "У вас болит всё тело." #: src/player.cpp #, c-format msgid "Your %s is wracked with excruciating pain!" -msgstr "Ваша %s охвачено мучительной болью!" +msgstr "Ваша часть тела (%s) охвачена мучительной болью!" #: src/player.cpp #, c-format msgid "Your %s is wracked with terrible pain!" -msgstr "Ваша %s охвачено ужасной болью!" +msgstr "Ваша часть тела (%s) охвачена ужасной болью!" #: src/player.cpp #, c-format msgid "Your %s is wracked with pain!" -msgstr "Ваша %s охвачена болью!" +msgstr "Ваша часть тела (%s) охвачена болью!" #: src/player.cpp #, c-format msgid "Your %s pains you!" -msgstr "Ваш %s причиняет вам боль!" +msgstr "Ваш часть тела (%s) причиняет вам боль!" #: src/player.cpp #, c-format msgid "Your %s aches." -msgstr "У вас болит %s." +msgstr "Ваша часть тела (%s) болит." #: src/player.cpp #, c-format @@ -279323,17 +287161,17 @@ msgstr "Ваша силовая броня деактивирована." #: src/player.cpp src/veh_interact.cpp #, c-format msgid "Refill %s" -msgstr "Заправить %s" +msgstr "Заправить: %s" #: src/player.cpp src/vehicle_use.cpp #, c-format msgid "Reload %s" -msgstr "Перезарядить %s" +msgstr "Перезарядить: %s" #: src/player.cpp #, c-format msgid "Select ammo for %s" -msgstr "Выберите боеприпасы для %s" +msgstr "Выберите боеприпасы для оружия (%s)" #. ~ battery storage (charges) #: src/player.cpp @@ -279368,7 +287206,7 @@ msgstr "| Урон | Бронеб. " #: src/player.cpp #, c-format msgid "You need a compatible magazine to reload the %s!" -msgstr "Вам нужен совместимый магазин, чтобы перезарядить %s!" +msgstr "Вам нужен совместимый магазин, чтобы перезарядить оружие (%s)!" #: src/player.cpp msgid "Nothing to reload!" @@ -279377,7 +287215,7 @@ msgstr "Нечего перезаряжать!" #: src/player.cpp #, c-format msgid "You don't have any %s to reload your %s!" -msgstr "У вас нет %s, чтобы перезарядить %s!" +msgstr "У вас нет зарядов (%s), чтобы перезарядить оружие (%s)!" #: src/player.cpp msgid "Can't wield spilt liquids." @@ -279390,7 +287228,7 @@ msgstr "Чтобы что-нибудь взять, вам необходима #: src/player.cpp #, c-format msgid "The %s is preventing you from wielding the %s." -msgstr "%s не дает вам взять в руки %s." +msgstr "%s не дает вам взять в руки предмет (%s)." #: src/player.cpp msgid "Something you are wearing hinders the use of both hands." @@ -279399,12 +287237,12 @@ msgstr "Что-то, что надето на вас, мешает пользо #: src/player.cpp #, c-format msgid "The %s can't be wielded with only one arm." -msgstr "%s нельзя держать только одной рукой." +msgstr "Это (%s) нельзя держать только одной рукой." #: src/player.cpp #, c-format msgid "You are too weak to wield %s with only one arm." -msgstr "Вы слишком слабы, чтобы держать %s одной рукой." +msgstr "Вы слишком слабы, чтобы держать это (%s) одной рукой." #: src/player.cpp msgid "Keep hands free (off)" @@ -279439,12 +287277,12 @@ msgstr "Установить: %s" #: src/player.cpp #, c-format msgid "The %s doesn't have any faults to toggle." -msgstr "У %s нет дефектов для переключения." +msgstr "У предмета (%s) нет дефектов для переключения." #: src/player.cpp #, c-format msgid "The %s doesn't have any faults to mend." -msgstr "В %s нет никаких дефектов." +msgstr "У предмета (%s) нет никаких дефектов." #: src/player.cpp msgid "It is damaged, but cannot be repaired." @@ -279455,12 +287293,12 @@ msgstr "Предмет повреждён, его нельзя отремонт msgid "" "It is damaged, and could be repaired with %s. %s to use one of those items." msgstr "" -"Это повреждено, может быть отремонтировано, для ремонта потребуется %s. %s, " -"чтобы использовать один из этих предметов." +"Это повреждено, может быть отремонтировано, для ремонта потребуется: %s. %s," +" чтобы использовать один из этих предметов." #: src/player.cpp msgid "Mend which fault?" -msgstr "Исправить какой дефект?" +msgstr "Какой дефект исправить?" #: src/player.cpp #, c-format @@ -279503,7 +287341,8 @@ msgstr "%1$s (%2$d/%3$d)" #: src/player.cpp #, c-format msgid "You are currently unable to mend the %s this way." -msgstr "В настоящий момент вы не можете исправить %s таким способом." +msgstr "" +"В настоящий момент вы не можете исправить дефекты (%s) таким способом." #: src/player.cpp msgid "You are already wearing that." @@ -279515,7 +287354,7 @@ msgstr " уже носит это." #: src/player.cpp msgid " doesn't have that item." -msgstr "У нет этого предмета." +msgstr "У NPC () нет этого предмета." #: src/player.cpp msgid " is not wearing that item." @@ -279547,22 +287386,22 @@ msgstr " не может снять этот предмет." #: src/player.cpp #, c-format msgid "You take off your %s." -msgstr "Вы сняли %s." +msgstr "Вы сняли: %s." #: src/player.cpp #, c-format msgid " takes off their %s." -msgstr " снимает %s." +msgstr " снимает: %s." #: src/player.cpp #, c-format msgid "You put the %s in your inventory." -msgstr "Вы убираете %s в свой инвентарь." +msgstr "Вы убираете предмет (%s) в свой инвентарь." #: src/player.cpp #, c-format msgid "The %s is already empty!" -msgstr "Этот %s уже пуст!" +msgstr "Предмет (%s) уже пуст!" #: src/player.cpp msgid "The liquid can't be unloaded in its current state!" @@ -279575,22 +287414,22 @@ msgstr "Разрядить что?" #: src/player.cpp #, c-format msgid "You can't unload a %s!" -msgstr "Вы не можете разрядить %s!" +msgstr "Вы не можете разрядить это (%s)!" #: src/player.cpp #, c-format msgid "You can't unload a rechargeable %s!" -msgstr "Вы не можете разрядить перезаряжаемый %s!" +msgstr "Вы не можете разрядить перезаряжаемый предмет (%s)!" #: src/player.cpp #, c-format msgid "Your %s isn't charged." -msgstr "Ваш %s не заряжен." +msgstr "Предмет (%s) не заряжен." #: src/player.cpp #, c-format msgid "Your %s isn't loaded." -msgstr "%s не заряжен." +msgstr "Предмет (%s) не заряжен." #: src/player.cpp #, c-format @@ -279605,17 +287444,17 @@ msgstr "Вы не можете убрать частично обеднённы #: src/player.cpp #, c-format msgid "You remove your %1$s from your %2$s." -msgstr "Вы вынимаете %1$s из %2$s." +msgstr "Вы вынимаете модификацию (%1$s) из оружия (%2$s)." #: src/player.cpp #, c-format msgid "Permanently install your %1$s in your %2$s?" -msgstr "Установить %1$s в %2$s навсегда?" +msgstr "Установить модификацию (%1$s) в оружие (%2$s) навсегда?" #: src/player.cpp #, c-format msgid "Attach your %1$s to your %2$s?" -msgstr "Присоединить %1$s к %2$s?" +msgstr "Присоединить модификацию (%1$s) к оружию (%2$s)?" #: src/player.cpp #, c-format @@ -279689,7 +287528,7 @@ msgstr "Вы лежите под объятиями волн, глядя скв #: src/player.cpp msgid "You settle into the water and begin to drowse…" -msgstr "Вы ложитесь на воду и начинаете дремать…" +msgstr "Вы устраиваетесь в воде и начинаете дремать…" #: src/player.cpp msgid "This is a comfortable place to sleep." @@ -279698,24 +287537,24 @@ msgstr "Это удобное место для сна." #: src/player.cpp #, c-format msgid "It's a little hard to get to sleep on this %s." -msgstr "Не так-то просто заснуть на %s." +msgstr "Не так-то просто заснуть здесь (%s)." #: src/player.cpp #, c-format msgid "It's hard to get to sleep on this %s." -msgstr "Трудно заснуть на %s." +msgstr "Трудно заснуть здесь (%s)." #. ~ %1$s: vehicle name, %2$s: vehicle part name #: src/player.cpp #, c-format msgid "It's a little hard to get to sleep on this %2$s in %1$s." -msgstr "Не так-то просто заснуть на %2$s в %1$s." +msgstr "Не так-то просто заснуть здесь (%2$s - %1$s)." #. ~ %1$s: vehicle name #: src/player.cpp #, c-format msgid "It's hard to get to sleep in %1$s." -msgstr "Не так-то просто заснуть на %1$s." +msgstr "Не так-то просто заснуть здесь (%1$s)." #: src/player.cpp msgid "You start trying to fall asleep." @@ -279732,7 +287571,7 @@ msgstr "Стимулятору сна не хватает энергии для #: src/player.cpp #, c-format msgid "You use your %s for comfort." -msgstr "С %s вам комфортнее." +msgstr "Вы используете предмет (%s) для комфортного сна." #: src/player.cpp msgid "Your soporific inducer runs out of power!" @@ -279931,7 +287770,7 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Base HP: %d" -msgstr "Базовые HP: %d" +msgstr "Базовые ОЗ: %d" #: src/player_display.cpp #, c-format @@ -280062,13 +287901,13 @@ msgstr "Текущая скорость:" #, c-format msgctxt "speed penalty" msgid "Overburdened -%2d%%" -msgstr "Перегруз -%2d%%" +msgstr "Перегруз -%2d%%" #: src/player_display.cpp #, c-format msgctxt "speed penalty" msgid "Pain -%2d%%" -msgstr "Боль -%2d%%" +msgstr "Боль -%2d%%" #: src/player_display.cpp #, c-format @@ -280076,6 +287915,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "Жажда -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "Голодающие" + #: src/player_display.cpp msgid "Underfed" msgstr "Недоедание" @@ -280170,6 +288013,10 @@ msgstr "" "Ваше тело сильно ослаблено из-за голодания. Вы можете умереть, если не начнёте регулярно питаться!\n" "\n" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "Истощал" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -280248,7 +288095,7 @@ msgstr "Вас сильно рвёт густой серой слизью." #: src/player_hardcoded_effects.cpp msgid " vomits a thick, gray goop." -msgstr " стошнило густой серой слизью." +msgstr " блюёт густой серой слизью." #: src/player_hardcoded_effects.cpp msgid "You vomit thousands of live spores!" @@ -280256,7 +288103,7 @@ msgstr "Вас стошнило тысячами живых спор!" #: src/player_hardcoded_effects.cpp msgid " vomits thousands of live spores!" -msgstr " стошнило тысячами живых спор!" +msgstr " блюёт тысячами живых спор!" #: src/player_hardcoded_effects.cpp msgid "The flesh on your broken arms bulges. Fungus stalks burst through!" @@ -280264,7 +288111,7 @@ msgstr "Плоть на ваших сломанных руках вздувае #: src/player_hardcoded_effects.cpp msgid "'s broken arms bulge. Fungus stalks burst out of the bulges!" -msgstr "Сломанные руки вздуваются. Из них прорастают грибы!" +msgstr "Сломанные руки () вздуваются. Из них прорастают грибы!" #: src/player_hardcoded_effects.cpp msgid "" @@ -280276,7 +288123,7 @@ msgstr "" #: src/player_hardcoded_effects.cpp msgid "'s arms bulge. Fungus stalks burst out of the bulges!" -msgstr "Руки вздуваются. Из них прорастают грибы!" +msgstr "Руки () вздуваются. Из них прорастают грибы!" #: src/player_hardcoded_effects.cpp msgid "Your hands bulge. Fungus stalks burst through the bulge!" @@ -280284,7 +288131,7 @@ msgstr "Ваши руки вздуваются. Из них прорастают #: src/player_hardcoded_effects.cpp msgid "'s hands bulge. Fungus stalks burst through the bulge!" -msgstr "Руки вздуваются. Из них прорастают грибы!" +msgstr "Руки () вздуваются. Из них прорастают грибы!" #: src/player_hardcoded_effects.cpp msgid "You feel nauseous!" @@ -280304,7 +288151,7 @@ msgstr "Вы чувствуете себя немного странно." #: src/player_hardcoded_effects.cpp msgid "The world takes on a dreamlike quality." -msgstr "Мир вокруг принимает фантастическое очертание." +msgstr "Мир вокруг принимает фантастические очертания." #: src/player_hardcoded_effects.cpp msgid "You have a sudden nostalgic feeling." @@ -280498,19 +288345,19 @@ msgstr "" #: src/player_hardcoded_effects.cpp msgid "Insects begin to emerge from 's skin!" -msgstr "Насекомые начинают прорываться из кожи !" +msgstr "Насекомые начинают прорываться из кожи NPC ()!" #. ~ %s is bodypart in accusative. #: src/player_hardcoded_effects.cpp #, c-format msgid "You start scratching your %s!" -msgstr "Вы начали чесать %s!" +msgstr "Вы начали чесать часть тела (%s)!" #. ~ 1$s is NPC name, 2$s is bodypart in accusative. #: src/player_hardcoded_effects.cpp #, c-format msgid "%1$s starts scratching their %2$s!" -msgstr "%1$s начал чесать %2$s!" +msgstr "%1$s начинает чесать себя (%2$s)!" #: src/player_hardcoded_effects.cpp msgid "Why waste your time on that insignificant speck?" @@ -280808,22 +288655,25 @@ msgstr "Ваше оружие (%s) дало осечку, издав лишь т #: src/ranged.cpp #, c-format msgid "'s %s misfires with a muffled click!" -msgstr "Оружие %s () даёт осечку, издав лишь тихий щелчок!" +msgstr "Оружие (%s - ) даёт осечку, издав лишь тихий щелчок!" #: src/ranged.cpp #, c-format msgid "Perhaps taking the ammo out of your %s and reloading will help." -msgstr "Возможно патроны из %s будут кстати." +msgstr "" +"Возможно извлечение патрона из оружия (%s) и перезарядка решат проблему." #: src/ranged.cpp #, c-format msgid "Perhaps taking the ammo out of 's %s and reloading will help." -msgstr "Возможно патроны из %s у будут кстати." +msgstr "" +"Возможно извлечение патрона из оружия (%s - ) и перезарядка решат " +"проблему." #: src/ranged.cpp #, c-format msgid "Your %s misfires with a wet click!" -msgstr "Ваш %s влажно щёлкает и даёт осечку!" +msgstr "Ваше оружие (%s) влажно щёлкает и даёт осечку!" #: src/ranged.cpp #, c-format @@ -280833,7 +288683,7 @@ msgstr "%s () влажно щёлкает и даёт осечку!" #: src/ranged.cpp #, c-format msgid "Your %s malfunctions!" -msgstr "Ваш %s работает неисправно!" +msgstr "%s работает неисправно!" #: src/ranged.cpp #, c-format @@ -280848,7 +288698,7 @@ msgstr "Прикреплённая модификация (%s) уничтоже #: src/ranged.cpp #, c-format msgid "'s attached %s is destroyed by their shot!" -msgstr "Прикреплённая модификация (%s) уничтожена выстрелом!" +msgstr "Прикреплённая модификация (%s - ) уничтожена выстрелом!" #: src/ranged.cpp #, c-format @@ -280858,7 +288708,8 @@ msgstr "Прикреплённая модификация (%s) поврежда #: src/ranged.cpp #, c-format msgid "'s %s is damaged by their shot!" -msgstr "Прикреплённая модификация (%s) повреждается из-за выстрела!" +msgstr "" +"Прикреплённая модификация (%s - ) повреждается из-за выстрела!" #: src/ranged.cpp #, c-format @@ -280868,27 +288719,27 @@ msgstr "%s издаёт невыносимый пилящий звук!" #: src/ranged.cpp #, c-format msgid "'s %s emits a grimace-inducing screech!" -msgstr "%s у издаёт невыносимый пилящий звук!" +msgstr "%s () издаёт невыносимый пилящий звук!" #: src/ranged.cpp #, c-format msgid "Your %s fails to cycle!" -msgstr "Ваш %s заклинило!" +msgstr "Ваше оружие (%s) заклинило!" #: src/ranged.cpp #, c-format msgid "'s %s fails to cycle!" -msgstr "У заклинило %s!" +msgstr "У NPC () заклинило оружие (%s)!" #: src/ranged.cpp #, c-format msgid "Your %s is damaged by the high pressure!" -msgstr "Высокое давление повреждает ваш %s!" +msgstr "Высокое давление повреждает ваше оружие (%s)!" #: src/ranged.cpp #, c-format msgid "'s %s is damaged by the high pressure!" -msgstr "Высокое давление повреждает %s!" +msgstr "Высокое давление повреждает оружие (%s - )!" #: src/ranged.cpp #, c-format @@ -280903,12 +288754,12 @@ msgstr "Вы слышите %s." #: src/ranged.cpp #, c-format msgid "You cycle your %s manually." -msgstr "Вы вручную освобождаете камору %s." +msgstr "Вы вручную освобождаете камору оружия (%s)." #: src/ranged.cpp #, c-format msgid "You feel a surge of euphoria as flames roar out of the %s!" -msgstr "Вы чувствуете прилив эйфории, когда из %s с рёвом вырывается пламя!" +msgstr "Вы чувствуете прилив эйфории, когда %s с рёвом извергает пламя!" #: src/ranged.cpp msgid "Steadiness" @@ -281077,27 +288928,27 @@ msgstr "«Ты-Дыщ!»" #: src/ranged.cpp #, c-format msgid "You don't have enough %s to cast this spell" -msgstr "У вас не хватает %s для этого заклинания" +msgstr "У вас не хватает энергии (%s) для этого заклинания" #: src/ranged.cpp #, c-format msgid "Really attack %s?" -msgstr "Действительно атаковать %s?" +msgstr "Действительно атаковать: %s?" #: src/ranged.cpp #, c-format msgid "Firing %s" -msgstr "Стрельба из %s" +msgstr "Стрельба: %s" #: src/ranged.cpp #, c-format msgid "Throwing %s" -msgstr "Метнуть %s" +msgstr "Метнуть: %s" #: src/ranged.cpp #, c-format msgid "Blind throwing %s" -msgstr "Метнуть %s вслепую" +msgstr "Метнуть вслепую: %s " #: src/ranged.cpp msgid "Set target" @@ -281273,7 +289124,7 @@ msgstr "Радиус действия: %s%s" #: src/ranged.cpp msgid " WARNING! IN RANGE" -msgstr "ОПАСНО! В ДОСЯГАЕМОСТИ" +msgstr "ОПАСНО! В ЗОНЕ ПОРАЖЕНИЯ" #: src/ranged.cpp #, c-format @@ -281318,7 +289169,18 @@ msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "%1$d инструмент со значением %2$s %3$d или выше." msgstr[1] "%1$d инструмента со значением %2$s %3$d или выше." msgstr[2] "%1$d инструментов со значением %2$s %3$d или выше." -msgstr[3] "%1$d инструментов со значением %2$s %3$d или выше." +msgstr[3] "%1$d инструмент со значением %2$s %3$d или выше." + +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "%1$d инструмент со значением %2$s %3$d или выше." +msgstr[1] "%1$d инструмента со значением %2$s %3$d или выше." +msgstr[2] "%1$d инструментов со значением %2$s %3$d или выше." +msgstr[3] "%1$d инструмент со значением %2$s %3$d или выше." #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp @@ -281454,7 +289316,7 @@ msgstr "Ч/Б" #: src/safemode_ui.cpp msgctxt "category" msgid "Cat" -msgstr "Кот" +msgstr "Кат" #: src/safemode_ui.cpp msgid "Safe Mode enabled:" @@ -281707,37 +289569,39 @@ msgstr "d: удалить историю" #: src/suffer.cpp #, c-format msgid "Your %s is damaged by the water." -msgstr "Вода повреждает вам %s." +msgstr "Вода повреждает часть тела (%s)." #: src/suffer.cpp #, c-format msgid "'s %s is damaged by the water." -msgstr "Вода повреждает %s." +msgstr "Вода повреждает часть тела ( - %s)." #: src/suffer.cpp #, c-format msgid "Your %s is healed by the water." -msgstr "Вода исцеляет вам %s." +msgstr "Вода исцеляет вам часть тела (%s)." #: src/suffer.cpp #, c-format msgid "'s %s is healed by the water." -msgstr "Вода исцеляет %s." +msgstr "Вода исцеляет часть тела ( - %s)." #: src/suffer.cpp #, c-format msgid "You're too malnourished to keep your %s going." -msgstr "Вы слишком истощены, чтобы поддерживать ваш %s." +msgstr "" +"Вы слишком истощены, чтобы поддерживать вашу способность (%s) активной." #: src/suffer.cpp #, c-format msgid "You're too dehydrated to keep your %s going." -msgstr "Вы слишком обезвожены, чтобы поддерживать ваш %s." +msgstr "" +"Вы слишком обезвожены, чтобы поддерживать вашу способность (%s) активной." #: src/suffer.cpp #, c-format msgid "You're too exhausted to keep your %s going." -msgstr "Вы слишком устали, чтобы поддерживать ваш %s." +msgstr "Вы слишком устали, чтобы поддерживать вашу способность (%s) активной." #: src/suffer.cpp msgid "You're drowning!" @@ -281795,7 +289659,7 @@ msgstr "Внезапно, вам стало жарко." #: src/suffer.cpp #, c-format msgid "your %1$s" -msgstr "ваше %1$s" +msgstr "ваше оружие (%1$s)" #: src/suffer.cpp msgid "You suddenly feel so numb…" @@ -281807,7 +289671,7 @@ msgstr "Вас бросило в озноб." #: src/suffer.cpp msgid " starts to shake uncontrollably." -msgstr " бросило в озноб." +msgstr "NPC () бросило в озноб." #: src/suffer.cpp #, c-format @@ -282039,7 +289903,7 @@ msgstr " потягивает спину." #: src/suffer.cpp msgid "You feel mentally tired." -msgstr "Вы чувствуете себя душевно уставшими." +msgstr "Вы чувствуете себя умственную усталость." #: src/suffer.cpp msgid " lets out a huge yawn." @@ -282059,7 +289923,7 @@ msgstr "Ваше зрение немного размывается. " #: src/suffer.cpp msgid "Your mind lapses into unawareness briefly." -msgstr "Ваш разум быстро впадает в неосознанность." +msgstr "Ваш разум ненадолго впадает в неосознанность." #: src/suffer.cpp msgid "Your muscles ache in stressfully unpredictable ways." @@ -282104,13 +289968,13 @@ msgstr "Вы падаете!" #: src/suffer.cpp #, c-format msgid "Your radiation badge changes from %1$s to %2$s!" -msgstr "Ваш плёночный дозиметр сменил свой цвет с %1$s на %2$s!" +msgstr "Ваш плёночный дозиметр сменил свой цвет - %1$s на %2$s!" #. ~ %s is bodypart #: src/suffer.cpp #, c-format msgid "Your %s has started to mend!" -msgstr "Ваша %s начала заживать!" +msgstr "Ваша часть тела (%s) начала заживать!" #: src/suffer.cpp msgid "The water wash away the scent." @@ -282143,18 +290007,19 @@ msgstr "Вы разлетаетесь на тысячи кусочков." #: src/teleport.cpp #, c-format msgid "You teleport into %s, and they explode into thousands of fragments." -msgstr "Вы телепортируетесь в %s, и тот разлетается на тысячи кусочков." +msgstr "Вы телепортируетесь внутрь, и %s разлетается на тысячи кусочков." #: src/teleport.cpp #, c-format msgid "" " teleports into %s, and they explode into thousands of fragments." -msgstr " телепортируется в %s, и тот разлетается на тысячи кусочков." +msgstr "" +" телепортируется внутрь, и %s разлетается на тысячи кусочков." #: src/teleport.cpp #, c-format msgid "%1$s teleports into %2$s, killing them!" -msgstr "%1$s телепортируется в %2$s и убивает его!" +msgstr "%1$s телепортируется внутрь, и %2$s погибает!" #: src/timed_event.cpp msgctxt "memorial_male" @@ -282242,6 +290107,19 @@ msgctxt "grammatical gender list" msgid "n" msgstr "n" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" +"Заметность: %d\n" +"Сложность уклонения: %d\n" +"Сложность обезвреживания: %d\n" +"Безвредна: %s" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "Вы наступили на пузырчатую плёнку!" @@ -282253,7 +290131,7 @@ msgstr " наступает на пузырчатую плёнку!" #: src/trapfunc.cpp #, c-format msgid "Your %s steps on some bubble wrap!" -msgstr "Ваш %s наступает на пузырчатую плёнку!" +msgstr "%s наступает на пузырчатую плёнку!" #: src/trapfunc.cpp msgid "You step on some glass!" @@ -282278,12 +290156,12 @@ msgstr "Медвежий капкан захлопнулся на вашей н #: src/trapfunc.cpp msgid "A bear trap closes on 's foot!" -msgstr "Медвежий капкан захлопнулся на ноге !" +msgstr "Медвежий капкан захлопнулся на ноге NPC ()!" #: src/trapfunc.cpp #, c-format msgid "Your %s is caught by a beartrap!" -msgstr "Ваш %s попал в капкан!" +msgstr "Ваш скакун (%s) попал в капкан!" #: src/trapfunc.cpp msgid "You step on a spiked board!" @@ -282296,7 +290174,7 @@ msgstr " наступает на доску с шипами!" #: src/trapfunc.cpp #, c-format msgid "Your %s stepped on a spiked board!" -msgstr "Ваш %s наступил на доску с шипами!" +msgstr "Ваш скакун (%s) наступил на доску с шипами!" #: src/trapfunc.cpp msgid "You step on a sharp metal caltrop!" @@ -282309,7 +290187,7 @@ msgstr " наступает на острую металлическу #: src/trapfunc.cpp #, c-format msgid "Your %s steps on a sharp metal caltrop!" -msgstr "Ваш %s наступает на острую металлическую триболу!" +msgstr "Ваш скакун (%s) наступает на острую металлическую триболу!" #: src/trapfunc.cpp msgid "You step on a sharp glass caltrop!" @@ -282334,12 +290212,12 @@ msgstr " спотыкается об растяжку!" #: src/trapfunc.cpp #, c-format msgid "Your %s trips over a tripwire!" -msgstr "Ваш %s спотыкается о растяжку!" +msgstr "Ваш скакун (%s) спотыкается о растяжку!" #: src/trapfunc.cpp #, c-format msgid "Your %s triggers a crossbow trap." -msgstr "Ваш %s вызывает срабатывание арбалетной ловушки." +msgstr "Ваш скакун (%s) вызывает срабатывание арбалетной ловушки." #: src/trapfunc.cpp msgid "You trigger a crossbow trap!" @@ -282353,7 +290231,7 @@ msgstr " вызывает срабатывание арбалетной #: src/trapfunc.cpp #, c-format msgid "Your %s is hit!" -msgstr "Вас ударило по %s!" +msgstr "В вас попало - %s!" #: src/trapfunc.cpp msgid "You dodge the shot!" @@ -282366,12 +290244,12 @@ msgstr " уворачивается от выстрела!" #: src/trapfunc.cpp #, c-format msgid "A bolt shoots out and hits the %s!" -msgstr "Болт вылетает и попадает в %s!" +msgstr "Болт вылетает и попадает в существо (%s)!" #: src/trapfunc.cpp #, c-format msgid "A bolt shoots out, but misses the %s." -msgstr "Болт вылетает, но промахивается по %s." +msgstr "Болт вылетает, но промахивается по существу (%s)." #: src/trapfunc.cpp msgid "Kerblam!" @@ -282380,7 +290258,7 @@ msgstr "«Ты-дыщ!»" #: src/trapfunc.cpp #, c-format msgid "Your %s triggers a shotgun trap!" -msgstr "Ваш %s вызывает срабатывание ловушки с дробовиком!" +msgstr "Ваш скакун (%s) вызывает срабатывание ловушки с дробовиком!" #: src/trapfunc.cpp msgid "You trigger a shotgun trap!" @@ -282388,17 +290266,17 @@ msgstr "Вы вызвали срабатывание ловушки с дроб #: src/trapfunc.cpp msgid " triggers a shotgun trap!" -msgstr " заставил сработать ловушку с дробовиком!" +msgstr " заставляет сработать ловушку с дробовиком!" #: src/trapfunc.cpp #, c-format msgid "A shotgun fires and hits the %s!" -msgstr "Дробовик стреляет и попадает в %s!" +msgstr "Дробовик стреляет и попадает по существу (%s)!" #: src/trapfunc.cpp #, c-format msgid "A blade swings out and hacks your %s!" -msgstr "Лезвие замахивается и рубит ваш %s!" +msgstr "Лезвие замахивается и рубит вашего скакуна (%s)!" #: src/trapfunc.cpp msgid "A blade swings out and hacks your torso!" @@ -282406,7 +290284,7 @@ msgstr "Лезвие замахивается и рубит ваш торс!" #: src/trapfunc.cpp msgid "A blade swings out and hacks 's torso!" -msgstr "Лезвие замахивается и рубит торс !" +msgstr "Лезвие замахивается и рубит торс ()!" #: src/trapfunc.cpp msgid "Snap!" @@ -282415,7 +290293,7 @@ msgstr "«Щёлк!»" #: src/trapfunc.cpp #, c-format msgid "A snare closes on your %s's leg!" -msgstr "Силок затягивается на ноге у %s!" +msgstr "Силок затягивается на ноге у вашего скакуна (%s)!" #: src/trapfunc.cpp msgid "A snare closes on your leg." @@ -282423,26 +290301,26 @@ msgstr "Силок затягивается у вас на ноге." #: src/trapfunc.cpp msgid "A snare closes on s leg." -msgstr "Силок затягивается на ноге у ." +msgstr "Силок затягивается на ноге ()." #. ~ %s is bodypart name in accusative. #: src/trapfunc.cpp #, c-format msgid "A snare closes on your %s." -msgstr "Силок затягивается у вас на %s." +msgstr "Силок затягивается на вас (%s)." #: src/trapfunc.cpp #, c-format msgid "A snare closes on s %s." -msgstr "Силок затягивается на %s у ." +msgstr "Силок затягивается на NPC ( - %s)." #: src/trapfunc.cpp msgid "You trigger a land mine!" -msgstr "Вы наступили на фугас!" +msgstr "Вы наступили на мину!" #: src/trapfunc.cpp msgid " triggers a land mine!" -msgstr " вызывает срабатывание фугаса!" +msgstr " вызывает срабатывание мины!" #: src/trapfunc.cpp msgid "You trigger a booby trap!" @@ -282464,7 +290342,7 @@ msgstr "Воздух мерцает вокруг вас…" #: src/trapfunc.cpp #, c-format msgid "The air shimmers around %s…" -msgstr "Воздух мерцает вокруг %s…" +msgstr "Воздух мерцает вокруг существа (%s)…" #: src/trapfunc.cpp msgid "You step in a puddle of thick goo." @@ -282492,12 +290370,12 @@ msgstr "Электрические разряды вылетают из пола #: src/trapfunc.cpp msgid "Electrical beams emit from the floor and slice s flesh!" -msgstr "Электрические разряды вылетают из пола и пронзают плоть !" +msgstr "Электрические разряды вылетают из пола и пронзают плоть ()!" #: src/trapfunc.cpp #, c-format msgid "Electrical beams emit from the floor and slice the %s!" -msgstr "Электрические лучи вылетают из пола и рассекают %s!" +msgstr "Электрические лучи вылетают из пола и рассекают вашего скакуна (%s)!" #: src/trapfunc.cpp msgid " falls in a pit!" @@ -282526,7 +290404,7 @@ msgstr "Вы ловко приземлились." #: src/trapfunc.cpp #, c-format msgid "Your %s falls into a pit!" -msgstr "Ваш %s падает в яму!" +msgstr "Ваш скакун (%s) падает в яму!" #: src/trapfunc.cpp msgid "You fall in a spiked pit!" @@ -282538,12 +290416,12 @@ msgstr " падает в яму с шипами!" #: src/trapfunc.cpp msgid "You avoid the spikes within." -msgstr "Вы увернулись от внутренних шипов." +msgstr "Вы увернулись от шипов в яме." #: src/trapfunc.cpp #, c-format msgid "The spikes impale your %s!" -msgstr "Шипы пронзают вам %s!" +msgstr "Шипы пронзают часть вашего тела (%s)!" #: src/trapfunc.cpp msgid "The spears break!" @@ -282551,7 +290429,7 @@ msgstr "Копья ломаются!" #: src/trapfunc.cpp msgid "You fall in a pit filled with glass shards!" -msgstr "Ты падаешь в яму, наполненную стеклянными осколками!" +msgstr "Вы падаете в яму, наполненную стеклянными осколками!" #: src/trapfunc.cpp msgid " falls in pit filled with glass shards!" @@ -282564,12 +290442,12 @@ msgstr "Вы увернулись от осколков стекла." #: src/trapfunc.cpp #, c-format msgid "The glass shards slash your %s!" -msgstr "Стеклянные осколки порезали %s!" +msgstr "Стеклянные осколки порезали вас (%s)!" #: src/trapfunc.cpp #, c-format msgid "The %s burns !" -msgstr "%s поджигает !" +msgstr "%s поджигает NPC ()!" #: src/trapfunc.cpp #, c-format @@ -282579,7 +290457,7 @@ msgstr "%s ужасно обжигает вас!" #: src/trapfunc.cpp #, c-format msgid "Your %s is burned by the lava!" -msgstr "Ваш %s обжигается о лаву!" +msgstr "Ваш скакун (%s) обжигается о лаву!" #: src/trapfunc.cpp msgid "You fail to attach it…" @@ -282602,7 +290480,7 @@ msgstr "" #: src/trapfunc.cpp #, c-format msgid "Your %s falls into a sinkhole!" -msgstr "Ваш %s падает в карстовую воронку!" +msgstr "Ваш скакун (%s) падает в карстовую воронку!" #: src/trapfunc.cpp msgid "" @@ -282630,7 +290508,7 @@ msgstr "Карстовая воронка обрушивается!" #: src/trapfunc.cpp msgid "A sinkhole under collapses!" -msgstr "Карстовая воронка под обрушивается!" +msgstr "Карстовая воронка под NPC () обрушивается!" #: src/trapfunc.cpp msgid "You fall into the sinkhole!" @@ -282651,7 +290529,7 @@ msgstr " провалился на уровень ниже!" #: src/trapfunc.cpp #, c-format msgid "You fall down under %s!" -msgstr "Вы падаете под %s!" +msgstr "Вы падаете под: %s!" #: src/trapfunc.cpp #, c-format @@ -282684,7 +290562,7 @@ msgstr "Вас слепит вспышка света!" #: src/trapfunc.cpp msgid "Small flashes surround you." -msgstr "Маленькие вспышки вокруг вас." +msgstr "Вас окружают маленькие вспышки." #. ~ a quiet humming sound #: src/trapfunc.cpp @@ -282839,7 +290717,7 @@ msgstr "Нельзя пометить эту машину, потому что #: src/veh_interact.cpp #, c-format msgid "Only one %1$s powered engine can be installed." -msgstr "Можно установить только один %1$s двигатель." +msgstr "Можно установить только один двигатель, где топливо - %1$s." #: src/veh_interact.cpp msgid "This vehicle cannot be modified in this way.\n" @@ -283164,7 +291042,8 @@ msgstr "Эта часть не может быть удалена.\n" msgid "" "Removing the broken %1$s may yield some fragments.\n" msgstr "" -"Удаление сломанного %1$s может дать несколько частей.\n" +"Удаление сломанной части (%1$s) может принести несколько " +"обломков.\n" #: src/veh_interact.cpp #, c-format @@ -283205,7 +291084,7 @@ msgstr "Вы не можете убрать эту деталь, пока к н #: src/veh_interact.cpp msgid "Better not remove something while driving." -msgstr "Лучше не убирать детали, пока ведёшь." +msgstr "Лучше не удалять детали, пока ведёшь." #: src/veh_interact.cpp msgid "" @@ -283224,11 +291103,11 @@ msgstr "Вам нужен шланг, чтобы сливат #: src/veh_interact.cpp msgid "You can't siphon from a moving vehicle." -msgstr "Вы не можете перелить из движущейся машины." +msgstr "Вы не можете слить содержимое баков движущейся машины." #: src/veh_interact.cpp msgid "Select part to siphon:" -msgstr "Выберите часть для сливания жидкости:" +msgstr "Выберите, откуда сливать жидкость:" #: src/veh_interact.cpp msgid "The vehicle has no solid fuel left to remove." @@ -283294,11 +291173,11 @@ msgstr "достаточно" #: src/veh_interact.cpp msgid "sinks" -msgstr "умывальники" +msgstr "утонет" #: src/veh_interact.cpp msgid "floats" -msgstr "поплавки" +msgstr "держится на воде" #: src/veh_interact.cpp #, c-format @@ -283620,12 +291499,12 @@ msgstr "В этом транспорте нет заряженных плуто #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." -msgstr "Не выполнены условия для установки %s." +msgstr "Не выполнены условия для установки этого: %s." #: src/veh_interact.cpp #, c-format msgid "Could not find base part in requirements for %s." -msgstr "Невозможно найти основную часть в условиях для %s." +msgstr "Невозможно найти основную часть в условиях для этого: %s." #: src/veh_interact.cpp #, c-format @@ -283633,41 +291512,41 @@ msgid "" "Press space, choose a facing direction for the new %s and confirm with " "enter." msgstr "" -"Нажмите пробел, выберите направление для %s и нажмите enter для " -"подтверждения." +"Нажмите пробел, выберите направление для новой части (%s) и нажмите enter " +"для подтверждения." #: src/veh_interact.cpp #, c-format msgid "You install a %1$s into the %2$s." -msgstr "Вы смонтировали %1$s в машине (%2$s)." +msgstr "Вы смонтировали: %1$s - %2$s." #. ~ 1$s vehicle name, 2$s tank name #: src/veh_interact.cpp #, c-format msgid "You refill the %1$s's %2$s." -msgstr "Вы наполняете %2$s (%1$s)." +msgstr "Вы наполняете: %2$s - %1$s." #. ~ 1$s vehicle name, 2$s tank name #: src/veh_interact.cpp #, c-format msgid "You completely refill the %1$s's %2$s." -msgstr "Вы полностью наполняете %2$s (%1$s)." +msgstr "Вы полностью наполняете: %2$s - %1$s." #. ~ 1$s vehicle name, 2$s reactor name #: src/veh_interact.cpp #, c-format msgid "You refuel the %1$s's %2$s." -msgstr "Вы заправляете %2$s (%1$s)." +msgstr "Вы заправляете: %2$s - %1$s." #: src/veh_interact.cpp #, c-format msgid "The %s has already been removed by someone else." -msgstr "%s уже кем-то удалён." +msgstr "%s - уже кем-то удалено." #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to remove the %s." -msgstr "Не выполнены условия для снятия %s." +msgstr "Не выполнены условия для удаления части (%s)." #: src/veh_interact.cpp #, c-format @@ -283684,12 +291563,12 @@ msgstr "" #: src/veh_interact.cpp #, c-format msgid "You remove the %1$s from the %2$s." -msgstr "Вы вынимаете %1$s из %2$s." +msgstr "Вы вынимаете часть (%1$s) из транспорта (%2$s)." #: src/veh_interact.cpp #, c-format msgid "You completely dismantle the %s." -msgstr "Вы полностью демонтировали %s" +msgstr "Вы полностью разобрали транспорт -%s" #: src/veh_type.cpp msgid "Description\n" @@ -283717,17 +291596,17 @@ msgstr " и рассчитан на %1$d %2$s" #: src/veh_utils.cpp #, c-format msgid "You don't meet the requirements to repair the %s." -msgstr "Не выполнены условия для ремонта %s." +msgstr "Не выполнены условия для ремонта: %s." #: src/veh_utils.cpp #, c-format msgid "You replace the %1$s's %2$s. (was %3$s)" -msgstr "Вы заменили %2$s (%3$s) в %1$s." +msgstr "Вы заменили %2$s - %1$s (было %3$s)." #: src/veh_utils.cpp #, c-format msgid "You repair the %1$s's %2$s. (was %3$s)" -msgstr "Вы отремонтировали %2$s (%3$s) в %1$s." +msgstr "Вы отремонтировали %2$s - %1$s (было %3$s)." #: src/vehicle.cpp msgid "The vehicle part you were working on has gone!" @@ -283750,7 +291629,7 @@ msgstr "%s издаёт звуковой сигнал и произносит: #: src/vehicle.cpp #, c-format msgid "a loud BANG! from the %s" -msgstr "громкий БАБАХ с %s" +msgstr "громкий БАБАХ - %s" #: src/vehicle.cpp #, c-format @@ -283773,13 +291652,13 @@ msgstr "Демонтаж этой детали разделит транспор #: src/vehicle.cpp #, c-format msgid "You load the %1$s on the rack" -msgstr "Вы загрузили %1$s на стойку транспорта" +msgstr "Вы загрузили транспорт (%1$s) на велосипедную стойку" #. ~ %1$s is the vehicle being loaded onto the bicycle rack #: src/vehicle.cpp #, c-format msgid "You can't get the %1$s on the rack" -msgstr "Вы не можете загрузить %1$s на стойку транспорта" +msgstr "Вы не можете загрузить это (%1$s) на стойку транспорта" #: src/vehicle.cpp #, c-format @@ -283803,7 +291682,7 @@ msgstr "" #: src/vehicle.cpp #, c-format msgid "You unload the %s from the bike rack." -msgstr "Вы разгрузили %s с велосипедной стойки." +msgstr "Вы сгрузили транспорт (%s) с велосипедной стойки." #. ~ %s is the vehicle being loaded onto the bicycle rack #: src/vehicle.cpp @@ -283813,7 +291692,7 @@ msgstr "Вы не снять это (%s) с велосипедной стойк #: src/vehicle.cpp msgid "hmm" -msgstr "хмм" +msgstr "«хмм»" #: src/vehicle.cpp msgid "hummm!" @@ -283863,7 +291742,7 @@ msgstr "" #: src/vehicle.cpp #, c-format msgid "The %s's reactor dies!" -msgstr "Реактор у %s умирает!" +msgstr "Реактор (%s) умирает!" #: src/vehicle.cpp #, c-format @@ -283896,17 +291775,17 @@ msgstr "Ваш %s растворяется прочь из бытия." #: src/vehicle.cpp #, c-format msgid "The %s's %s breaks into pieces!" -msgstr "%s %s рассыпается на куски!" +msgstr "%s - %s рассыпается на куски!" #: src/vehicle.cpp #, c-format msgid "The %1$s's %2$s is torn off!" -msgstr "%2$s машины (%1$s) отрывается!" +msgstr "%2$s транспорта (%1$s) отрывается!" #: src/vehicle.cpp #, c-format msgid "The %1$s's %2$s is destroyed!" -msgstr "%2$s машины (%1$s) уничтожено!" +msgstr "%2$s транспорта (%1$s) уничтожается!" #: src/vehicle_display.cpp msgid "More parts here…" @@ -283976,7 +291855,7 @@ msgstr "завал" #: src/vehicle_move.cpp #, c-format msgid "The %s is too leaky!" -msgstr "%s слишком дырявый!" +msgstr "Транспорт (%s) слишком дырявый!" #: src/vehicle_move.cpp #, c-format @@ -283986,7 +291865,7 @@ msgstr "Транспорту (%s) не хватает колёс для езды #: src/vehicle_move.cpp #, c-format msgid "The %s struggles to pull the %s on this surface!" -msgstr "%s пытается поднять %s на эту поверхность!" +msgstr "%s с трудом тянет другой транспорт (%s) на такой поверхности!" #: src/vehicle_move.cpp #, c-format @@ -283996,7 +291875,7 @@ msgstr "Транспорт (%s) слишком тяжёл для своих дв #: src/vehicle_move.cpp #, c-format msgid "The %s's mechanism is out of reach!" -msgstr "Механизм %s вне досягаемости!" +msgstr "Механизм (%s) вне досягаемости!" #: src/vehicle_move.cpp #, c-format @@ -284006,7 +291885,7 @@ msgstr "Двигатель (%s) не заведён!" #: src/vehicle_move.cpp #, c-format msgid "The %s is stuck." -msgstr "%s застрял." +msgstr "Транспорт (%s) застрял." #: src/vehicle_move.cpp #, c-format @@ -284016,39 +291895,40 @@ msgstr "Двигатель (%s) жужжит и не заводится." #: src/vehicle_move.cpp #, c-format msgid "Your %s is not fast enough to keep up with the %s" -msgstr "Ваш %s недостаточно быстрый, чтобы успевать за %s" +msgstr "" +"Ваш питомец (%s) недостаточно быстрый, чтобы успевать за транспортом (%s)" #. ~ 1$s - vehicle name, 2$s - part name, 3$s - NPC or monster #: src/vehicle_move.cpp #, c-format msgid "Your %1$s's %2$s rams into %3$s and stuns it!" -msgstr "%2$s (%1$s) врезается в %3$s и оглушает его!" +msgstr "%2$s (%1$s) врезается в существо (%3$s) и оглушает его!" #. ~ 1$s - vehicle name, 2$s - part name, 3$s - NPC or monster #: src/vehicle_move.cpp #, c-format msgid "Your %1$s's %2$s rams into %3$s!" -msgstr "%2$s (%1$s) врезается в %3$s!" +msgstr "%2$s (%1$s) врезается в существо (%3$s)!" #. ~ 1$s - vehicle name, 2$s - part name, 3$s - collision object name, 4$s - #. sound message #: src/vehicle_move.cpp #, c-format msgid "Your %1$s's %2$s rams into %3$s with a %4$s" -msgstr "%2$s (%1$s) врезается в %3$s со звуком %4$s" +msgstr "%2$s (%1$s) врезается в существо (%3$s) со звуком %4$s" #. ~ 1$s - vehicle name, 2$s - part name, 3$s - collision object name #: src/vehicle_move.cpp #, c-format msgid "Your %1$s's %2$s rams into %3$s." -msgstr "%2$s (%1$s) врезается в %3$s." +msgstr "%2$s (%1$s) врезается во что-то (%3$s)." #. ~ %1$s: name of the vehicle; %2$s: name of the related vehicle part; %3$s: #. trap name #: src/vehicle_move.cpp #, c-format msgid "The %1$s's %2$s runs over %3$s." -msgstr "%2$s (%1$s) наезжает на %3$s." +msgstr "%2$s (%1$s) наезжает на что-то (%3$s)." #: src/vehicle_move.cpp #, c-format @@ -284093,7 +291973,7 @@ msgstr "Рулевое управление полностью сломано!" #: src/vehicle_move.cpp #, c-format msgid "You fumble with the %s's controls." -msgstr "Вы неумело ведёте %s." +msgstr "Вы неумело ведёте транспорт (%s)." #: src/vehicle_move.cpp msgid "It takes you a very long time to steer that vehicle!" @@ -284107,7 +291987,7 @@ msgstr "Вам понадобилось много времени, чтобы п #: src/vehicle_move.cpp #, c-format msgid "You regain control of the %s." -msgstr "Вы вновь контролируете %s." +msgstr "Вы вновь контролируете транспорт (%s)." #: src/vehicle_move.cpp #, c-format @@ -284117,7 +291997,7 @@ msgstr "%s выходит из заноса." #: src/vehicle_move.cpp #, c-format msgid "Your %s sank." -msgstr "Ваш %s утонул." +msgstr "Ваш %s тонет." #: src/vehicle_move.cpp #, c-format @@ -284127,7 +292007,7 @@ msgstr "%s не может двигаться по такой местности #: src/vehicle_move.cpp #, c-format msgid "Your %s is beached." -msgstr "Ваша %s вытащена на берег." +msgstr "Ваш транспорт (%s) вытащен на берег." #: src/vehicle_move.cpp #, c-format @@ -284142,27 +292022,27 @@ msgstr " получает от столкновения урон %d!" #: src/vehicle_move.cpp #, c-format msgid "You lose control of the %s." -msgstr "Вы потеряли управление над %s." +msgstr "Вы потеряли управление над транспортом (%s)." #: src/vehicle_move.cpp #, c-format msgid " loses control of the %s." -msgstr " теряет управление над %s." +msgstr " теряет управление над транспортом (%s)." #: src/vehicle_move.cpp #, c-format msgid "You are hurled from the %s's seat by the power of the impact!" -msgstr "От столкновения вы вылетели из сидения %s!" +msgstr "От столкновения вы вылетели из сидения транспорта (%s)!" #: src/vehicle_move.cpp #, c-format msgid " is hurled from the %s's seat by the power of the impact!" -msgstr "От столкновения вылетает из сидения %s !" +msgstr "От столкновения вылетает из сидения транспорта (%s)!" #: src/vehicle_move.cpp #, c-format msgid "The %s is hurled from %s's by the power of the impact!" -msgstr "От столкновения %s вылетел из %s!" +msgstr "От столкновения %s вылетает из транспорта (%s)!" #: src/vehicle_part.cpp #, c-format @@ -284181,7 +292061,7 @@ msgstr " (дефект)" #: src/vehicle_part.cpp #, c-format msgid " holding %s" -msgstr " содержит %s" +msgstr " содержит: %s" #: src/vehicle_part.cpp msgid " (draining)" @@ -284190,7 +292070,7 @@ msgstr " (осушение)" #: src/vehicle_part.cpp #, c-format msgid "Insufficient power to enable %s" -msgstr "Недостаточно энергии, чтобы включить %s" +msgstr "Недостаточно энергии, чтобы включить: %s" #: src/vehicle_use.cpp #, c-format @@ -285499,6 +293379,10 @@ msgstr "…%s = Полное описание " msgid "--NO AVAILABLE MODS--" msgstr "—НЕТ ДОСТУПНЫХ МОДОВ—" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "--НИЧЕГО НЕ НАЙДЕНО--" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "Текущий список модов сохранён как список по умолчанию." diff --git a/lang/po/zh_CN.po b/lang/po/zh_CN.po index f3a04b69791ec..051327a2a6dd3 100644 --- a/lang/po/zh_CN.po +++ b/lang/po/zh_CN.po @@ -45,21 +45,21 @@ # Mein Führer <851000914@qq.com>, 2020 # Jianxiang Wang , 2020 # 万 和 <380014507@qq.com>, 2020 -# Amans Tofu , 2020 -# fei li , 2020 -# 何方神圣 何 <1366003560@qq.com>, 2020 # VoidForge , 2020 -# L rient <1972308206@qq.com>, 2020 # GeekDuanLian , 2020 -# Aloxaf , 2020 # Silencess , 2020 +# fei li, 2020 +# L rient <1972308206@qq.com>, 2020 +# 何方神圣 何 <1366003560@qq.com>, 2020 +# Amans Tofu , 2020 +# Aloxaf , 2020 # cainiao , 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: cainiao , 2020\n" "Language-Team: Chinese (China) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_CN/)\n" @@ -293,7 +293,6 @@ msgid_plural "rocks" msgstr[0] "石头" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -854,6 +853,16 @@ msgstr[0] "氮氧混合气" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "将氧气和氮气以适度比例混合,用于潜水。" +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "灭火剂" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "一款能够有效灭火的干粉状化学溶剂。" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -4057,6 +4066,26 @@ msgstr "" "一些强化式杀虫剂,需填充于药剂喷罐喷洒。\n" "“最好戴上面罩或嘴部防护使用。”" +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "12.3ln 弹" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" +"罗马尼亚在第二次喀尔巴阡山冲突后引进了 12.3ln 弹。使用这种弹药的 PA md.71 " +"步枪迅速在东欧联盟以及世界各地流行起来。正因为如此,12.3ln " +"弹迅速成为欧亚大陆的标准弹药口径。因此流放族轻易地回收及储存了大量此类弹药。对你来说,它的外观和手感都非常类似于 .30-06 春田弹,但弹头稍显锋利。" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -5034,7 +5063,7 @@ msgstr[0] "黄油漆" msgid "A can of yellow paint." msgstr "一罐黄色的油漆。" -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "红地毯" @@ -5103,7 +5132,6 @@ msgstr[0] "金块" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -5173,7 +5201,6 @@ msgid_plural "small metal sheets" msgstr[0] "小型薄钢板" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "一小片薄钢板。" @@ -6420,63 +6447,6 @@ msgstr[0] "魔力动力" msgid "Seeing this is a bug." msgstr "看见这个说明出bug了。" -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "测试用石头" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "测试用小型薄钢板" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "测试用木制宽刃箭" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "测试用箭。" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "测试用9mm弹" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "测试用9mm空尖弹。" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "测试用.45弹" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "测试用.45空尖弹。" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "测试用气体" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "某种气体形式的神秘物质。只作测试,不要吸入!" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "测试用铂金块" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -6748,8 +6718,6 @@ msgstr[0] "防噪耳塞" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "" @@ -7030,8 +6998,8 @@ msgstr[0] "子弹袋" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." -msgstr "一个小袋子,可以用来存储大多数的小型弹药,但是装不下火箭弹。激活它来存储弹药。" +"rockets will not fit. Use insert to store ammunition." +msgstr "一个小袋子,可以用来存储大多数的小型弹药,但是装不下火箭弹。使用它来存储弹药。" #: lang/json/ARMOR_from_json.py msgid "ammo satchel" @@ -7122,9 +7090,9 @@ msgstr[0] "箭筒" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." -msgstr "一个佩戴在腰部、可容纳20支箭的皮革箭筒。使用它以存储箭支。" +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." +msgstr "一个可佩戴在腰部、可容纳20支箭的皮革箭筒。使用它以存储箭支或弩矢。" #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -7135,8 +7103,8 @@ msgstr[0] "桦皮箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." -msgstr "一个可佩戴在腰部、可容纳20支箭的桦树皮箭筒。使用它以存储箭支。" +"20 arrows or bolts. Use insert to store arrows or bolts." +msgstr "一个可佩戴在腰部、可容纳20支箭的桦树皮箭筒。使用它以存储箭支或弩矢。" #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -7147,9 +7115,10 @@ msgstr[0] "大箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." -msgstr "一个佩戴在后背、可容纳60支箭的皮革大箭筒,有着金属镶边。使用它以存储箭矢。" +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." +msgstr "一个佩戴在后背、可容纳60支箭的皮革大箭筒,有着金属镶边。使用它以存储箭矢或弩矢。" #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -7160,8 +7129,8 @@ msgstr[0] "桦皮大箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." -msgstr "一个佩带在后背、可容纳60支箭的桦树皮大箭筒。使用它以存储箭支。" +"hold 60 arrows or bolts. Use insert to store arrows or bolts." +msgstr "一个佩带在后背、可容纳60支箭的桦树皮大箭筒。使用它以存储箭支或弩矢。" #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -8508,8 +8477,6 @@ msgid_plural "pairs of socks" msgstr[0] "袜子" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "一双穿在脚上的棉制袜子。" @@ -10178,6 +10145,17 @@ msgid "" "heat." msgstr "用凯夫拉和芳纶纤维制成的用于处理爆炸物的轻型防护手套。它们被设计得能够防护破片和高温。" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "镶钉手套" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "一对嵌有金属钉饰的手套。" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -15917,7 +15895,6 @@ msgstr[0] "作战用外骨骼" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "你的动力装甲启动了。" @@ -16249,7 +16226,6 @@ msgid_plural "backpacks" msgstr[0] "背包" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "一个小型布制背包,用一点点累赘换取可观的储存空间。" @@ -16349,7 +16325,6 @@ msgid_plural "briefcases" msgstr[0] "手提箱" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "一个配有提手的箱子,内部可存放纸币、文档、或者是走私物品。" @@ -16650,10 +16625,10 @@ msgstr "一个主要用于旅行期间存放衣物和杂物的巨大轮式旅行 #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." -msgstr "一个主要用于旅行期间存放衣物和杂物的中型旅行箱,提供充足的储存空间,但拉起来很累赘。" +msgstr "一个带滚轮的中型旅行箱,主要用于旅行时存放衣物和杂物,提供了充足的储存空间,但拉起来很累赘。" #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -17190,7 +17165,6 @@ msgid_plural "hazmat suits" msgstr[0] "三防服" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -18022,7 +17996,6 @@ msgid_plural "long-sleeved shirts" msgstr[0] "长袖衬衫" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "一件长袖的全棉衬衣。" @@ -18697,6 +18670,18 @@ msgid "" "weight." msgstr "一个可以把你从头到脚包住的大睡袋。它采用中厚织物制成。" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "铁拳套" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "一个皮革缠绕而成的护手和护臂,在指关节上嵌入了金属板,以提高拳击威力和防护。" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -20083,54 +20068,15 @@ msgid "" msgstr "一个覆盖全身的肉眼无法看见的环境防护光环。" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "测试用袜子" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "测试用长袖衬衫" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "测试用防噪耳塞" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "测试用三防服" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "测试用背包" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "测试用手提箱" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "测试用箭筒" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "测试用箭筒,能储存20支箭或弩矢。" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" -msgstr[0] "测试用动力装甲" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" +msgstr[0] "电弧光环" -#. ~ Description for {'str': 'test power armor'} +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." -msgstr "一件测试用的动力装甲。" +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." +msgstr "一个肉眼无法看见的能向近战攻击你的敌人放出电弧的光环。" #: lang/json/BATTERY_from_json.py msgid "test battery" @@ -20525,8 +20471,8 @@ msgid "Aero-Evaporator CBM" msgid_plural "Aero-Evaporator CBMs" msgstr[0] "湿气凝水器CBM" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -21610,8 +21556,8 @@ msgid "Internal Furnace CBM" msgid_plural "Internal Furnace CBMs" msgstr[0] "内燃锅炉CBM" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -21710,8 +21656,8 @@ msgid "Wind Turbine CBM" msgid_plural "Wind Turbine CBMs" msgstr[0] "风力发电机CBM" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -21719,18 +21665,6 @@ msgid "" "power level." msgstr "你的身上安装了一排可伸缩的风力发电机。开启后,它们会自动伸出,缓慢收集风能并为你充能生化能量。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "精密焊接仪CBM" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "一套微型电子工具,包括烙铁和钢丝钳。它们本身没有任何用处,但是在制造生化插件时却必不可少。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -21784,13 +21718,37 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "一个安装在脊柱和脑干交汇处的炸弹。它在安装时就被设置了一个定时器,而你没有能够重置定时器的代码。" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "头骨枪CBM" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "你的头骨中隐藏着一只 .40 口径单发手枪。激活这个生化插件以发射并装填该手枪。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "精密焊接仪CBM" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "一套微型电子工具,包括烙铁和钢丝钳。它们本身没有任何用处,但是在制造生化插件时却必不可少。" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "离子过载发生器CBM" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -21945,6 +21903,33 @@ msgstr[0] "非小说类书籍" msgid "template for a paperback nonfiction book" msgstr "非小说类平装书模板" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "虚拟低俗小说" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "劣质低俗类书籍的模板。" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "虚拟科幻类书籍" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "平装科幻类书籍的模板。" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "精装科幻类书籍的模板。" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -23221,8 +23206,8 @@ msgstr[0] "原理图" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -24243,8 +24228,8 @@ msgstr[0] "冒险小说" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." -msgstr "一本讲述和时间赛跑的激动人心的故事书,讲述了一个搜寻位于非洲大陆黑暗之心的失落城市的故事。" +"in the heart of the African continent." +msgstr "一本讲述和时间赛跑的激动人心的故事书,讲述了一个搜寻位于非洲大陆中心的失落城市的故事。" #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -24258,25 +24243,6 @@ msgid "" "York City." msgstr "一本讲述了两个朋友如何在纽约街头挣扎生存的小说。" -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "青春小说" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "一本关于成长的经典小说,描绘了一个年轻小伙在生活、爱情、性等方面有趣而辛酸的经历。" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "一部图画小说,内容是关于1980年代一个生活在伊朗的年轻女孩,在国家受到伊拉克入侵时,对周遭世界变迁的见闻。" - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -24393,71 +24359,6 @@ msgstr[0] "悬疑小说" msgid "A detective investigates an unusual murder in a secluded location." msgstr "描述了一个侦探在偏僻地点调查变态杀人狂的凶杀案线索的故事。" -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "低俗小说" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "一本冷硬派的侦探小说,充满着硬派动作与阴谋,由\"文森特和马沙的妻子\"、\"金表\"、\"邦妮的处境\"三个故事组成。" - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "被时间遗忘的杀人乌贼星球" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" -"一部关于宇宙探索的迷幻冒险小说,讲述了一位年长的刺客发现了一颗好得难以置信的行星。当她发现位于\"那颗被时间遗忘的杀人乌贼星球\"中心那万分恐怖的真相时,一切都太迟了。" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "大都市中的斗篷英雄们" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "一本经典的平装超级英雄故事书,描述了一群拥有不同超能力的平民蒙面英雄学习如何齐心战胜终极大反派的故事。" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "昨日凶案" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "这本快节奏的平装小说讲述了一位拥有好酒量的侦探如何用他钢铁般的意志抓住了最后一次复仇机会。" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "快门秃鹰和腥红狂徒" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "秃鹰不仅仅是一个普通的摄影迷,她是一位用电影、镜头和拳头打击犯罪的热血摄影师。但这次,她能解开这个狡猾的骗局,将\"腥红狂徒\"绳之以法吗?" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -24616,8 +24517,8 @@ msgstr[0] "武士小说" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." -msgstr "一本经典小说,主要描写了日本战国时代,贫穷家村百姓为保卫家园,与雇来的七位武士联手击退强盗的故事。" +"marauding outlaws. This hardback is quite hefty." +msgstr "一本经典小说,主要描写了日本战国时代,贫穷家村百姓为保卫家园,与雇来的七位武士联手击退强盗的故事。这本精装本还有点重。" #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -24660,17 +24561,19 @@ msgstr "这本《第二十二条军规》平装版有份简短介绍背景的前 #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "大师和玛格丽特" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" -"这是一部由米哈伊尔·布尔加科夫创作的关于斯大林暴政的政治讽刺小说,书中角色包括了撒旦、本丢·彼拉多、耶稣基督、吸血鬼、一只会说话的猫和莫斯科的文艺精英们。" +"一部由米哈伊尔·布尔加科夫创作的探讨了善恶本质的哲学问题的政治讽刺小说,书中角色包括了撒旦、本丢·彼拉多、耶稣基督、吸血鬼、一只会说话的猫和莫斯科的文艺精英们。" #: lang/json/BOOK_from_json.py msgid "A Handful of Dust" @@ -24697,350 +24600,6 @@ msgid "" msgstr "" "库尔特·冯内古特第四本小说的平装本,书中核毁灭对人性并没有太大的影响。(译注:书中核弹的制造者在核弹被扔向人类时正在玩“猫的摇篮”,一种翻花绳游戏)" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "科幻小说" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "一本充斥着各类外星人、激光枪以及太空飞船描写的小说。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" -"这是一本威廉·吉布森的《神经漫游者》。虽然成书于上世纪80年代,但这本科幻经典令人惊奇地精准预测了许多现代社会的情形……但并不包括如今的情况。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" -"这是一本DC著名编剧、科幻作家阿尔弗雷德·贝斯特 所著的《群星,我的归宿》(又名《虎,虎》),书名源于威廉·布莱克的名诗《老虎》。\n" -"\n" -"“虎,虎,光焰灼灼\n" -"燃烧在黑夜之林,\n" -"怎样的神手和神眼\n" -"构造出你可畏的美健?”\n" -"(选自《老虎》张炽恒译)" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "这是一本厄休拉·勒奎恩所著的《天钧》。这本书被人用脏手拿过,所以有些词被污迹覆盖了。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "这是一本著名科幻作家厄休拉·勒奎恩所著的雨果奖、星云奖获奖作品《一无所有》。" - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "这是一本著名科幻作家雷·布莱伯利所著的反乌托邦小说《华氏451度》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "这是一本天才科幻作家丹·西蒙斯的雨果奖获奖作品、著名的“海伯利安四部曲”中的第一部《海伯利安》。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" -"这是一本天才科幻作家丹·西蒙斯的获奖作品、著名的“海伯利安四部曲”的第三部《安迪密恩》。它以一段戴维·赫伯特·劳伦斯的诗作开篇:\n" -"\n" -"“赐予我们神灵吧,\n" -"哦,请把他们赐予我们吧!\n" -"赐予我们神灵吧。\n" -"我们是如此地厌倦,\n" -"凡人和发动机。”\n" -"(选自《Give us Gods》,翻译来自网络,原诗可登陆https://kalliope.org/en/text/lawrence2001061108 查看)" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "这是一本由著名科幻作家菲利普·K·迪克所著的科幻名篇《仿生人会梦见电子羊吗?》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "一本被翻旧了的《新星快递》,由威廉·巴勒斯所著。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "这是一本由全球知名科幻作家艾萨克·阿西莫夫所著的、享誉全球的”基地系列“第一部《基地》。它的封底已经被撕掉了。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "这是一本折了角的《沙丘》,由著名科幻作家弗兰克·赫伯特所著。这本《沙丘》的一些书页之间夹了些沙子,真奇怪。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "这是一本弗兰兹·卡夫卡的经典文学著作《审判》。这本书已经被翻得破旧不堪了。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "这是一本加拿大小说家玛格丽特·阿特伍德的文学著作《使女的故事》。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "这是一本科幻作家保罗·巴奇加卢皮所著的科幻大奖作品《发条女孩》。这本书的简介使你不禁思索遥远的泰国是如何度过这个末日的。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "这是一本赛博朋克背景的科幻小说《网上的孤岛》,由赛博朋克之父、著名科幻作家布鲁斯·斯特林所著。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "这是一本由全球知名科幻作家艾萨克·阿西莫夫所著的、享誉全球的”基地系列“第二部《基地与帝国》。它的封底上被人写了一页超市购物单。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" -"这是一本几乎全新的《遮蔽的眼睛》(又译《黑暗扫描仪》《心机扫描》《盲区行者》),由著名科幻作家菲利普·K·迪克所著。翻开它的时候,你仍然能闻到新书特有的油墨香气。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "这是一本由赛博朋克之父布鲁斯·斯特林编撰的《镜影:赛博朋克文集》。它的封面上残留着晕开的咖啡渍。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "这是一本由著名科幻作家范·沃克特所著的科幻著作《非A世界》。这本书看起来好像被原主人用来做过压花。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "这是一本科幻作家理查德·摩根所著的科幻作品《副本》(同名网剧在Netfix上映)。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "这是一本由世界上第一位科幻作家玛丽·雪莱所著的世界上第一本科幻作品《弗兰肯斯坦》。这不就是那种怪物的名字吗?" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "这是一本英国早期科幻作家埃里克·弗兰克·拉塞尔所著的科幻作品《黄蜂》(1957)。这简直就是一本为未来主义恐怖分子量身打造的手册。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" -"这是一本由著名编剧、科幻小说家理查德·麦瑟森所著的《我是传奇》(同名电影由弗朗西斯·劳伦斯导演、威尔·史密斯主演)。这本书的封套上沾染了干掉的血渍。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "这是一本由著名科幻作家阿尔迪与鲍里斯·斯特里加茨基兄弟合著的科幻作品《路边野餐》。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "这是一本由著名科幻作家乔`霍尔德曼所著的《永世之战》(1974)。这本书看起来破烂得就像被狗或者别的大型动物嚼过一小会。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "这是一本由硬科幻大师罗伯特·A·海因莱因所著的《严厉的月亮》(又译《月亮是冷傲的情人》)。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "这是一本由著名黑色幽默作家库尔特·冯内古特所著的科幻讽刺作品《猫的摇篮》。你发现书脊上的作者名字拼错了。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "这是一本著名后现代科幻作家萨缪尔·R·德兰尼的科幻著作《新星》。这本书的封面上写着“赠阅本,非卖品”。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "这是一本由著名黑色幽默作家库尔特·冯古内特所著的科幻小说《泰坦族的海妖》(1959)。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "这是一本由美国女性主义奇幻科幻作家雪莉.泰珀所著的科幻奇幻作品《草》。有个孩子曾在封面上用蜡笔涂鸦。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "这是一本由著名科幻作家威廉·吉布森所著的著名科幻小说《零伯爵》。书脊上盖着“图书馆藏书”的章,还贴了一个“科幻小说”的分类贴纸。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "这是一本由科幻作家N·K·杰姆森所著的2016年获奖作品《第五季》。它闻起来有一股微弱的泥土味。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "这是一本由著名科幻作家A.E.范·沃克特所著的科幻作品《武器制造商》。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "这是一本由2019年雨果奖入围作家贝基·钱伯斯创作的长篇科幻小说《太空出生者的少数派报告》。它看起来几乎是全新的。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" -"这是一本由著名科幻小说作家伊恩·班克斯所著的太空歌剧《武器制造商》(又译《武器浮生录》)。这本书的书脊被扯破了,有些书页看起来已经变得松动。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "这是一本由法国作家让-巴普提斯特·库辛·德·格兰维尔所著的《最后一个人类》。这是世界上第一部描述世界末日的现代推想小说。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "这是一本乔治·奥威尔的著名反乌托邦小说《一九八四》。这本书的书页又松又薄,你得小心别把它弄坏了。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "这是一本著名硬科幻大师罗伯特·安森·海因莱因所著的科幻文学作品《异乡异客》。它的封面已经卷边破损了。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr " 这是一本著名科幻作家奥森·斯科特·卡德创作的雨果奖、星云奖获奖作品《安德的游戏》(1986)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "这是一本饱经风霜的反乌托邦著作《美丽新世界》,由著名作家阿道司·赫胥黎所著。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "这是一本由著名推理小说家、福尔摩斯之父阿瑟·柯南·道尔所著的著名科幻小说《迷失的世界》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "这是一本由世界知名科幻小说家阿瑟·C·克拉克所创作的科幻作品《空中列岛》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "这是一本由世界知名小说家、政治家H·G·威尔斯所创作的科幻著作《莫洛博士岛》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "这是一本由波兰著名天才科幻作家、哲学家斯坦尼斯拉夫·莱姆所创作的科幻小说《其主之声》(1968)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "这是一本由英国著名天文学家弗雷德·霍伊尔所创作的科幻小说《黑云压境》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "这是一本由英国哲学家、科幻作家奥拉夫·斯塔普雷创作的科幻著作《最后和最先的人》(1930)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "这是一本由波兰著名天才科幻作家、哲学家斯坦尼斯拉夫·莱姆所创作的著名克苏鲁风格科幻小说《索拉里斯星》(同名电影被翻拍多次)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "这是一本由著名科幻小说作家西奥多·斯特金所著的国际幻想文学奖获奖作品《超人类》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "这是一本由著名赛博朋克作家杰夫·努恩所创作的科幻小说《瓦尔特》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "这是一本由美国科幻小说家小沃尔特·M·米勒所创作的科幻著作《莱伯维茨的赞歌》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "这是一本由世界知名小说家、政治家H·G·威尔斯所创作的科幻著作《星际战争》(又译《世界之战》、《世界大战》、《强战世界》)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "这是一本由英国科幻小说家查尔斯·斯特罗斯创作的科幻小说《末日奇点:钢铁朝阳》(《奇点天空》续作)。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "这是一本由全美著名畅销小说作家苏珊妮·科林斯所创作的《饥饿游戏》。看到封面上的宣传语,你不禁想起一部曾在深夜里偶然在电视上瞥见的日本电影。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "" -"这是一本由著名短篇科幻小说家约翰·温德汉姆创作的著名科幻小说《三尖树之日》(又译《三尖树时代》)。\n" -"(译注:这本书就是cdda中三尖树怪物的出处)" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "这是一本由著名作家安东尼·伯吉斯所著的青春幻想小说《发条橙》。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "" -"这是一本由科幻作家沃尔特·特维斯创作的科幻小说《天外来客》(翻拍为同名电影(1976)、电视剧(1987),或将在2020年再次翻拍为电视剧)。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "" -"这是一本由著名科幻小说家丹尼尔·弗朗西斯·伽洛耶所著的赛博朋克经典著作《三重模拟》(又译《十三层空间》,不知道多了的十层是哪里来的)。这是科幻文学史上第一部描写虚拟现实技术的小说。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "这是一本由德国著名作家恩斯特·荣格创作的科幻小说《玻璃蜜蜂》,其中探讨了纳米机器人的未来。" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "这是一本由全球知名的法国科幻小说大师儒勒·凡尔纳创作的知名科幻巨著《地心游记》。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" -"这是一本由著名科幻小说作家拉里·尼文所创作的星云奖、雨果奖、轨迹奖获奖作品、世界公认硬科幻大师之作《环形世界》。这本书最后几页不幸遗失了,但幸好那只是一些邮购广告。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "这是一本被翻旧的科幻著作《银河系漫游指南》,由著名科幻作家道格拉斯·亚当斯所著。" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -26206,6 +25765,600 @@ msgid "" " key work in the existentialist tradition." msgstr "一本平装版的《存在与虚无》,让-保罗·萨特著,存在主义的重要著作。" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "低俗小说" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "一本冷硬派的侦探小说,充满着硬派动作与阴谋,由\"文森特和马沙的妻子\"、\"金表\"、\"邦妮的处境\"三个故事组成。" + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "来自火星的黑色女武神" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "你手里拿着一本饱经风霜的小说,这本小说是由一个名叫“李·勒克”的人写的。" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "错误的未来" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "你手里拿着一本廉价的药店平装小说,这本小说是由一个名叫“李·勒克”的人写的。" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "没有来自尸体的神灵" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" +"一本由名为“李·勒克”的人写的粗糙平装小说,讲述了愤怒和嫉妒是如何把一个男人,或女人,变成怪物的。这本小说太过冷峻,以至于连勺子都能砸弯了。" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "深潜" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "一部关于太空旅行的短篇小说,这本小说是由一个名叫“李·勒克”的人写的。" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "被时间遗忘的杀人乌贼星球" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" +"一部关于宇宙探索的迷幻冒险小说,讲述了一位年长的刺客发现了一颗好得难以置信的行星。当她发现位于\"那颗被时间遗忘的杀人乌贼星球\"中心那万分恐怖的真相时,一切都太迟了。" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "大都市中的斗篷英雄们" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "一本经典的平装超级英雄故事书,描述了一群拥有不同超能力的平民蒙面英雄学习如何齐心战胜终极大反派的故事。" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "昨日凶案" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "这本快节奏的平装小说讲述了一位拥有好酒量的侦探如何用他钢铁般的意志抓住了最后一次复仇机会。" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "快门秃鹰和腥红狂徒" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "秃鹰不仅仅是一个普通的摄影迷,她是一位用电影、镜头和拳头打击犯罪的热血摄影师。但这次,她能解开这个狡猾的骗局,将\"腥红狂徒\"绳之以法吗?" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "科幻小说" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "一本充斥着各类外星人、激光枪以及太空飞船描写的小说。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" +"这是一本威廉·吉布森的《神经漫游者》。虽然成书于上世纪80年代,但这本科幻经典令人惊奇地精准预测了许多现代社会的情形……但并不包括如今的情况。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" +"这是一本DC著名编剧、科幻作家阿尔弗雷德·贝斯特 所著的《群星,我的归宿》(又名《虎,虎》),书名源于威廉·布莱克的名诗《老虎》。\n" +"\n" +"“虎,虎,光焰灼灼\n" +"燃烧在黑夜之林,\n" +"怎样的神手和神眼\n" +"构造出你可畏的美健?”\n" +"(选自《老虎》张炽恒译)" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "这是一本厄休拉·勒奎恩所著的《天钧》。这本书被人用脏手拿过,所以有些词被污迹覆盖了。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "这是一本著名科幻作家厄休拉·勒奎恩所著的雨果奖、星云奖获奖作品《一无所有》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "这是一本天才科幻作家丹·西蒙斯的雨果奖获奖作品、著名的“海伯利安四部曲”中的第一部《海伯利安》。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" +"这是一本天才科幻作家丹·西蒙斯的获奖作品、著名的“海伯利安四部曲”的第三部《安迪密恩》。它以一段戴维·赫伯特·劳伦斯的诗作开篇:\n" +"\n" +"“赐予我们神灵吧,\n" +"哦,请把他们赐予我们吧!\n" +"赐予我们神灵吧。\n" +"我们是如此地厌倦,\n" +"凡人和发动机。”\n" +"(选自《Give us Gods》,翻译来自网络,原诗可登陆https://kalliope.org/en/text/lawrence2001061108 查看)" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "这是一本由著名科幻作家菲利普·K·迪克所著的科幻名篇《仿生人会梦见电子羊吗?》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "一本被翻旧了的《新星快递》,由威廉·巴勒斯所著。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "这是一本由全球知名科幻作家艾萨克·阿西莫夫所著的、享誉全球的”基地系列“第一部《基地》。它的封底已经被撕掉了。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "这是一本弗兰兹·卡夫卡的经典文学著作《审判》。这本书已经被翻得破旧不堪了。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "这是一本加拿大小说家玛格丽特·阿特伍德的文学著作《使女的故事》。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "这是一本科幻作家保罗·巴奇加卢皮所著的科幻大奖作品《发条女孩》。这本书的简介使你不禁思索遥远的泰国是如何度过这个末日的。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "这是一本赛博朋克背景的科幻小说《网上的孤岛》,由赛博朋克之父、著名科幻作家布鲁斯·斯特林所著。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "这是一本由全球知名科幻作家艾萨克·阿西莫夫所著的、享誉全球的”基地系列“第二部《基地与帝国》。它的封底上被人写了一页超市购物单。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" +"这是一本几乎全新的《遮蔽的眼睛》(又译《黑暗扫描仪》《心机扫描》《盲区行者》),由著名科幻作家菲利普·K·迪克所著。翻开它的时候,你仍然能闻到新书特有的油墨香气。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "这是一本由赛博朋克之父布鲁斯·斯特林编撰的《镜影:赛博朋克文集》。它的封面上残留着晕开的咖啡渍。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "这是一本由著名科幻作家范·沃克特所著的科幻著作《非A世界》。这本书看起来好像被原主人用来做过压花。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "这是一本科幻作家理查德·摩根所著的科幻作品《副本》(同名网剧在Netfix上映)。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "这是一本由世界上第一位科幻作家玛丽·雪莱所著的世界上第一本科幻作品《弗兰肯斯坦》。这不就是那种怪物的名字吗?" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "这是一本英国早期科幻作家埃里克·弗兰克·拉塞尔所著的科幻作品《黄蜂》(1957)。这简直就是一本为未来主义恐怖分子量身打造的手册。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" +"这是一本由著名编剧、科幻小说家理查德·麦瑟森所著的《我是传奇》(同名电影由弗朗西斯·劳伦斯导演、威尔·史密斯主演)。这本书的封套上沾染了干掉的血渍。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "这是一本由著名科幻作家乔`霍尔德曼所著的《永世之战》(1974)。这本书看起来破烂得就像被狗或者别的大型动物嚼过一小会。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "这是一本由硬科幻大师罗伯特·A·海因莱因所著的《严厉的月亮》(又译《月亮是冷傲的情人》)。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "这是一本著名后现代科幻作家萨缪尔·R·德兰尼的科幻著作《新星》。这本书的封面上写着“赠阅本,非卖品”。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "这是一本由著名黑色幽默作家库尔特·冯古内特所著的科幻小说《泰坦族的海妖》(1959)。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "这是一本由美国女性主义奇幻科幻作家雪莉.泰珀所著的科幻奇幻作品《草》。有个孩子曾在封面上用蜡笔涂鸦。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "这是一本由著名科幻作家威廉·吉布森所著的著名科幻小说《零伯爵》。书脊上盖着“图书馆藏书”的章,还贴了一个“科幻小说”的分类贴纸。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "这是一本由著名科幻作家A.E.范·沃克特所著的科幻作品《武器制造商》。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "这是一本由2019年雨果奖入围作家贝基·钱伯斯创作的长篇科幻小说《太空出生者的少数派报告》。它看起来几乎是全新的。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" +"这是一本由著名科幻小说作家伊恩·班克斯所著的太空歌剧《武器制造商》(又译《武器浮生录》)。这本书的书脊被扯破了,有些书页看起来已经变得松动。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "这是一本由法国作家让-巴普提斯特·库辛·德·格兰维尔所著的《最后一个人类》。这是世界上第一部描述世界末日的现代推想小说。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "这是一本乔治·奥威尔的著名反乌托邦小说《一九八四》。这本书的书页又松又薄,你得小心别把它弄坏了。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "这是一本著名硬科幻大师罗伯特·安森·海因莱因所著的科幻文学作品《异乡异客》。它的封面已经卷边破损了。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr " 这是一本著名科幻作家奥森·斯科特·卡德创作的雨果奖、星云奖获奖作品《安德的游戏》(1986)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "这是一本由著名推理小说家、福尔摩斯之父阿瑟·柯南·道尔所著的著名科幻小说《迷失的世界》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "这是一本由世界知名科幻小说家阿瑟·C·克拉克所创作的科幻作品《空中列岛》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "这是一本由世界知名小说家、政治家H·G·威尔斯所创作的科幻著作《莫洛博士岛》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "这是一本由波兰著名天才科幻作家、哲学家斯坦尼斯拉夫·莱姆所创作的科幻小说《其主之声》(1968)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "这是一本由英国著名天文学家弗雷德·霍伊尔所创作的科幻小说《黑云压境》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "这是一本由英国哲学家、科幻作家奥拉夫·斯塔普雷创作的科幻著作《最后和最先的人》(1930)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "这是一本由波兰著名天才科幻作家、哲学家斯坦尼斯拉夫·莱姆所创作的著名克苏鲁风格科幻小说《索拉里斯星》(同名电影被翻拍多次)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "这是一本由著名科幻小说作家西奥多·斯特金所著的国际幻想文学奖获奖作品《超人类》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "这是一本由著名赛博朋克作家杰夫·努恩所创作的科幻小说《瓦尔特》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "这是一本由美国科幻小说家小沃尔特·M·米勒所创作的科幻著作《莱伯维茨的赞歌》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "这是一本由世界知名小说家、政治家H·G·威尔斯所创作的科幻著作《星际战争》(又译《世界之战》、《世界大战》、《强战世界》)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "这是一本由英国科幻小说家查尔斯·斯特罗斯创作的科幻小说《末日奇点:钢铁朝阳》(《奇点天空》续作)。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "这是一本由全美著名畅销小说作家苏珊妮·科林斯所创作的《饥饿游戏》。看到封面上的宣传语,你不禁想起一部曾在深夜里偶然在电视上瞥见的日本电影。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" +"这是一本由著名短篇科幻小说家约翰·温德汉姆创作的著名科幻小说《三尖树之日》(又译《三尖树时代》)。\n" +"(译注:这本书就是cdda中三尖树怪物的出处)" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "这是一本由著名作家安东尼·伯吉斯所著的青春幻想小说《发条橙》。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" +"这是一本由科幻作家沃尔特·特维斯创作的科幻小说《天外来客》(翻拍为同名电影(1976)、电视剧(1987),或将在2020年再次翻拍为电视剧)。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "" +"这是一本由著名科幻小说家丹尼尔·弗朗西斯·伽洛耶所著的赛博朋克经典著作《三重模拟》(又译《十三层空间》,不知道多了的十层是哪里来的)。这是科幻文学史上第一部描写虚拟现实技术的小说。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "这是一本由德国著名作家恩斯特·荣格创作的科幻小说《玻璃蜜蜂》,其中探讨了纳米机器人的未来。" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "这是一本由全球知名的法国科幻小说大师儒勒·凡尔纳创作的知名科幻巨著《地心游记》。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" +"这是一本由著名科幻小说作家拉里·尼文所创作的星云奖、雨果奖、轨迹奖获奖作品、世界公认硬科幻大师之作《环形世界》。这本书最后几页不幸遗失了,但幸好那只是一些邮购广告。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "这是一本被翻旧的科幻著作《银河系漫游指南》,由著名科幻作家道格拉斯·亚当斯所著。" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "沙丘" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "这是一本折了角的《沙丘》,由著名科幻作家弗兰克·赫伯特所著。这本《沙丘》的一些书页之间夹了些沙子,真奇怪。" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "一本结实的弗兰克·赫伯特所著的《沙丘》的复刻本。它是最近才出版的重印本,在它附带的防尘套上面喷印着“剧场版即将上映”的文字。" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "天才寓言" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "一本结实的《天才寓言》。此书是奥克塔维亚·巴特勒所著《播种者寓言》的续集。" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "第五季" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "这是一本由科幻作家N·K·杰米辛所著的2016年雨果奖获奖作品《第五季》的作者签名精装版。它闻起来有一股微弱的泥土味。" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "我们" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" +"这本精装书的标题是《注释〈我们〉:叶夫根尼·扎米亚金小说的新译本》。\n" +"\n" +"此书是由弗拉基米尔·沃兹尼克于2015年重新翻译的《我们》,原版最初出版于1924年,被普遍视为第一部现代反乌托邦小说。新书中注释详细介绍了丰富的历史典故并突出了扎米亚金小说语言中所富有的诗意。" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" +"作为反乌托邦小说的开创性作品,叶夫根尼·扎米亚金的《我们》于1924年首次出版,但苏联一直到1988年才将其解禁。\n" +"\n" +"你手中这本书是1993年批量出版翻译自俄文的版本,由克拉伦斯·布朗翻译,包括一个简短的前言介绍。略显破旧的封面上有一张超现实主义的照片,照片中一个人怀疑地向身后凝视着。" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "赛博利亚特" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" +"这本350页的平装书介绍了造物者图尔和克莱鲍修斯的功绩和它们之间的机器人竞争。此书最初是由斯坦尼斯拉夫·莱姆用波兰语写成的,后来被迈克尔·坎德尔熟练地翻译成英译本。" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "美丽新世界" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" +"一本奥尔德斯·赫胥黎所著的经典小说《美丽新世界》,看起来像是被雨淋过一般饱经风霜。这部小说的故事开始于一座凄惨建筑之中,在那里,胎儿是在流水线上的瓶子中长大的。" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "路边野餐" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" +"一本阿卡迪和鲍里斯·斯特鲁伽茨基兄弟所著《路边野餐》的平装本。这本书已经被翻译成20多种语言,偶尔还被冠以《潜行者》的名字。幸运的是,这本书正好是你母语的译本。" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "华氏451度" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "这是一本著名科幻作家雷·布雷德伯里所著的反乌托邦小说《华氏451度》。" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "一些爱开玩笑的人轻轻地烧焦了这边平装本反乌托邦小说的外部边缘。书仍然是完整可读的。" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "这本书封面写着:“燃烧是一种乐趣。看到火焰吞噬它们,看到变黑变黑的东西,我感到特别高兴。”" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" +"这部1979年出版的雷·布雷德伯里所著的《华氏451度》的软封面版曾经是一本图书馆的书。在它被撕破的后封面上仍然插着一张浅蓝色的借阅卡。最后记录显示在1981年被一个叫做“苏珊娜·柯林斯”的人借走了它。" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "你手中拿着的这本红黑色封面的平装小说是雷·布雷德伯里所著的《华氏451度》的现代重印本。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "这部科幻小说分为三个章节:《壁炉与火蜥蜴》、《筛子与沙砾》、《火光熊熊》。" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -26508,9 +26661,11 @@ msgstr[0] "当捧戒者的十件酷事" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." -msgstr "这本书是为你婚礼上可爱的捧戒男孩准备的。作者描述了作为捧戒者的责任和荣誉,希望你的小天使能珍惜它。" +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." +msgstr "" +"这本书是为你婚礼上可爱的捧戒小孩准备的。作者描述了作为捧戒者的责任和荣誉,希望你的小天使能珍惜它,因为他或她需要学会如何在你最美好的一天上表现得体。" #: lang/json/BOOK_from_json.py msgid "How to Raise a Gentleman: A Civilized Guide to Parenting" @@ -27744,10 +27899,11 @@ msgstr "标题为《逃走的松饼》的民间童话故事集,适合讲给小 #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "呆萌女孩" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -27757,22 +27913,24 @@ msgstr "当心理医生的女儿转到新学校时,她决定改变自己的性 #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "成为杰克逊" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" -msgstr "当杰克逊获得能够改变自身外貌的神秘天赋时,他将如何在镜子中继续认出自己?" +"will he be able to recognize himself in his own mirror?" +msgstr "当杰克逊获得能够改变自身外貌的神秘天赋时,他还能在镜子中继续认出自己吗?" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "无人烧伤" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -27781,10 +27939,11 @@ msgstr "一位青年意见领袖交到了一个新密友。这个朋友很可能 #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "天国与地狱" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -27796,10 +27955,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "当你看见我眼中之火时" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -27808,10 +27968,11 @@ msgstr "故事发生在翻天覆地的未来,高度发达的科技让父母可 #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "花生酱碰伤了" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -27821,10 +27982,11 @@ msgstr "在这部青年小说中,一位靠食品券长大的女人爱上了一 #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "就等你了" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -27834,10 +27996,11 @@ msgstr "三个十几岁的少女们一起逃课去开车巡游全国,她们在 #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "男孩的学习日记" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -27847,10 +28010,11 @@ msgstr "一个高二学生的个人日记被偷,然后被泄露到社交媒体 #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "夏季变量" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -27858,6 +28022,59 @@ msgid "" " unsavory elements." msgstr "在这本主要为年轻人写的书中,一位少女在参加一次不太重要的暑期实习时有了一次令人难以置信的发现,吸引了一些不良分子的注意。" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "黑暗之地" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "马基亚梦想着未来。西奥渴望着过去。他们能一起找到一种生活在当下的方式吗?" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "背叛需要两次" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" +"一部专为大一点的青少年编写的精装小说。书中讲述了两个主角对他们的同学做恶作剧,以及为了避免被抓所做出的疯狂闹剧和他们共同的负罪感让他们成为挚友的故事。" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "青春小说" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "一本关于成长的经典小说,描绘了一个年轻小伙在生活、爱情、性等方面有趣而辛酸的经历。" + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "万神殿:伊朗青年的故事" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "一部精装图画小说,内容是关于1980年代一个生活在伊朗的年轻女孩,在国家受到伊拉克入侵时,对周遭世界变迁的见闻。" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -28235,6 +28452,18 @@ msgid "" "your pain at bay." msgstr "这是一种类似于体能训练的激烈仪式,可以帮助你将一些疼痛抛之脑后。" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "恶意变形术卷轴" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "把你的敌人变形成青蛙。" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -29428,6 +29657,44 @@ msgid "" "harmless." msgstr "召唤出一堵厚厚的雾墙。虽然突然出现的气压会击倒任何被困在里面的敌人,但这个魔法无法造成其它伤害。" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "敲击术卷轴" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "你可以引导魔力打开近距离内锁着的木门。" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "高等敲击术卷轴" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "你可以引导魔力打开近距离内任何锁着的门。" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "电弧光环卷轴" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "你在你周围召唤出一道噼啪作响的电弧光环,能放出可怕的闪电电击近战攻击你的敌人。" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -29705,6 +29972,19 @@ msgid "" "on combining magic with EM radiation." msgstr "这本实验室参考材料书很厚,里面充满了如何将魔法与电磁辐射结合的信息。" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "符文石板碎片" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "一小块黑色石板碎片,显然是从一个大得多的石板上被削下来的。金色符文在它的表面闪闪发光,当你盯着它们看时,会慢慢地变成能被你读懂的句子。" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -29763,35 +30043,6 @@ msgstr "" "我还有很多事想告诉你,但我必须先走一步了。我为你留了个朋友,对它好点。\n" "-爱你的 F。\"" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "在创世之初……只有命令行" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "一篇尼尔·斯蒂芬森在1999年写的幽默文章,文中把操作系统经销商和汽车经销商拿来做比较。" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "编译器设计原理" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" -"一本由和阿尔佛雷德·艾侯与杰弗里·乌尔曼于1977年编写的经典计算机教科书。这本书的显著特征是封面的骑士,他手持着LALR语法分析器和语法制导翻译对抗着含有隐喻编译器设计复杂性的绿色巨龙。" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -31306,14 +31557,8 @@ msgstr[0] "变异肉块" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." -msgstr "" -"从变异生物身上切下的肉块。这块肉有着恶心的海绵般的松散质感,不过闻起来……还算正常。肉的内部有着一些明显不自然的杂乱组织:骨头和毛发堆积在肌肉组织之间,就像是要生长出另一只生物一般。至少它看起来还能被消化,前提是你得把它烹饪加工并处理掉那些不好的部分。" +msgid "Meat from a heavily mutated animal." +msgstr "从严重变异的生物身上切下的一大块肉。" #: lang/json/COMESTIBLE_from_json.py msgid "scrap of mutant meat" @@ -31324,12 +31569,9 @@ msgstr[0] "变异碎肉" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." -msgstr "" -"一小块变异生物身上的肉。闻起来有点奇怪,里面混着不少毛发和骨头,像是直接从肉里长出来的。至少它看起来还能被消化,前提是你得把它烹饪加工并处理掉那些不好的部分。" +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." +msgstr "从严重变异的生物身上切下的一小片肉。客气点说,闻起来不太诱人。" #: lang/json/COMESTIBLE_from_json.py msgid "mutant humanoid meat" @@ -31396,17 +31638,22 @@ msgstr[0] "变异熟肉" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" -msgstr "一块煮熟的变异肉块。这块肉有着恶心的海绵般的松散质感,不过尝起来……还算正常。但愿你已经把里面的毛发和骨头全部清理干净了……" +msgid "This is a cooked chunk of meat from a mutated animal." +msgstr "一大块煮熟的变异生物的肉。" #: lang/json/COMESTIBLE_from_json.py msgid "cooked scrap of mutant meat" msgid_plural "cooked scraps of mutant meat" msgstr[0] "变异熟碎肉" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "一小片煮熟的变异生物的肉。它小到让你很难分辨出它原来有多恶心。" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -31433,6 +31680,16 @@ msgid "" "prepared." msgstr "一些煮熟的新鲜内脏和肠子。富含人体所需的各种维生素,但大多数人认为它有些恶心,除非经过精心料理。" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "变异器官" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "从巨大的变异昆虫身上切下的奇怪器官。" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -31601,6 +31858,16 @@ msgid "" msgstr "" "一块来自某种动物的肺脏。由于采用这种方式料理,它就是一大块不易嚼烂且枯燥乏味的灰褐色结缔组织。看上去并不比生的更好吃,但是起码寄生虫都被煮熟了。" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "变异肺脏" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "你很确定这是肺脏组织。" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -31753,9 +32020,10 @@ msgstr[0] "变异脂肪块" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." -msgstr "屠宰变异生物尸体得到的新鲜脂肪,可以用来充饥,但最好经过加工,与其他食材一同使用。" +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." +msgstr "从严重变异的生物身上切下的新鲜脂肪。它闻起来甚至比其他变异部位更恶心。有些不明油脂从中滴落下来形成小水坑。" #: lang/json/COMESTIBLE_from_json.py msgid "mutant tallow" @@ -33017,16 +33285,16 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "白水里加了点糖或蜂蜜,尝起来还不赖。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" -msgstr[0] "茶" +msgid "black tea" +msgid_plural "black teas" +msgstr[0] "红茶" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." -msgstr "一份供全球绅士享用的饮品,通过将滚烫的开水倒入被称作\"山茶科山茶属\"的茶树的叶子中而成。" +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." +msgstr "一份供全球绅士享用的饮品,通过将滚烫的开水倒入被称作\"山茶科山茶属\"的茶树的发酵过的叶子中而成。" #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -33070,6 +33338,31 @@ msgstr[0] "矿泉水" msgid "Fancy mineral water, so fancy it makes you feel fancy just holding it." msgstr "一份从地下深处自然涌出的或者是经人工揭露的、未受污染的纯净矿泉水。" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "绿茶" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "一道通过将滚烫的开水倒入被称作\"山茶科山茶属\"的茶树的叶子制成的饮品。绿茶比红茶口味清淡,是传统亚洲文化中的首选。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "果茶" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "一种美味的饮料,由草药和干果制成,而不是茶树。虽然被称为“茶”,但严格来说它只是一种冲泡饮料。" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -34686,6 +34979,30 @@ msgid "" "cheese. Delicious." msgstr "墨西哥式调味玉米片,加了肉末,又盖上一层奶酪。这才是正宗。" +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "素食辣味玉米片" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "墨西哥式调味玉米片。这份已经加了豆子。再来点奶酪就更棒了。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "素食奶酪辣味玉米片" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "墨西哥式调味玉米片,加了豆子,又盖上一层奶酪。这才是正宗。" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -38279,7 +38596,6 @@ msgid_plural "pine nuts" msgstr[0] "松籽" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "一把从松果里剥出来的松籽,又香又脆。" @@ -39123,24 +39439,52 @@ msgid "" msgstr "一些主要由种子、青贮或一些豆类制成的鸟食,小型鸟类非常喜欢吃。" #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "狗粮" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "半湿犬粮" + +#. ~ Description for {'str_sp': 'wet dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "半湿犬粮,用罐装鲜肉制成。闻起来很奇怪,但是狗狗喜欢。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "干犬粮" + +#. ~ Description for {'str_sp': 'dry dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "有较长保质期的干犬粮。由加工过的肉类和谷物制成,富含维生素和矿物质。" -#. ~ Description for {'str_sp': 'dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." -msgstr "狗粮,闻起来很奇怪,但是狗狗喜欢。" +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "半湿猫粮" +#. ~ Description for {'str_sp': 'wet cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "猫食" +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "半湿猫粮,用罐装鲜肉制成。闻起来有点刺鼻,但是猫猫喜欢。" -#. ~ Description for {'str_sp': 'cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." -msgstr "猫粮,闻起来很奇怪,但是猫猫喜欢。" +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "干猫粮" + +#. ~ Description for {'str_sp': 'dry cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "有较长保质期的干猫粮。由加工过的肉类和谷物制成,富含维生素和矿物质。" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -39176,16 +39520,40 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "一些花蜜。该物品不应该出现在正常游戏中。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" -msgstr[0] "茶包" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "红茶包" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "一个装满了茶叶的小纸袋。把它丢进一杯开水里就能泡出红茶了。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" +msgstr[0] "绿茶包" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." -msgstr "一个装满了茶叶的小纸袋。把它丢进一杯开水里就能喝茶了。" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "一个装满了茶叶的小纸袋。把它丢进一杯开水里就能泡出绿茶了。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "果茶包" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." +msgstr "一个装满了草叶和干果的小纸袋。把它丢进一杯开水里就能泡出果茶了。" #: lang/json/COMESTIBLE_from_json.py msgid "herbal tea bag" @@ -39270,16 +39638,17 @@ msgstr[0] "蛋白口粮" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" -"SoyPelusa公司成功地众筹并生产了这款现象级的“DaiZoom”牌的蛋白质棒。普通人只靠这种棒子过活的话,一天三根,大概永远都死不了。在众筹支持者们收到产品后,他们发现了它仅有的一个缺陷:大部分食用者宁愿饿死也受不了这味道。当公司破产之际,存放这些产品的仓库无人问津,这为联邦应急管理局提供了一个绝佳的机会,它接手了这些产品,并用其供应各个紧急避难所。\"现在你手中拿着的就是一段众筹历史的见证。真可谓亦可赛艇。\"" +"SoyPelusa公司成功地众筹并生产了这款现象级的“DaiZoom”牌的蛋白质棒。\n" +"\n" +"普通人可以只靠吃这种蛋白棒生存下去,一天三根,大概永远都死不了。在众筹支持者们收到产品后,他们发现了它仅有的一个缺陷:大部分食用者宁愿饿死也受不了这味道。当公司破产之际,存放这些产品的仓库无人问津,这为联邦应急管理局提供了一个绝佳的机会,它接手了这些产品,并用其供应各个紧急避难所。\n" +"\n" +"\"现在你手中拿着的就是一段众筹历史的见证。真可谓亦可赛艇。\"" #: lang/json/COMESTIBLE_from_json.py msgid "protein shake" @@ -40055,17 +40424,29 @@ msgid "" msgstr "这块新鲜的根茎已经成熟并且充满了糖分。赶紧把它们都榨出来吧。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "茶叶" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "红茶叶" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "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." msgstr "热带植物的晒干的叶子,可以当茶叶泡,还可以直接嚼着吃,只是不饱肚子。" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "绿茶叶" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "热带植物的晒干的叶子。可以煮沸得到绿茶,还可以直接嚼着吃。不过它们并不能填饱肚子。" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -42622,6 +43003,66 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "与水混合的面粉,被揉成黏糊糊的一团。这种面团相比于面粉,更适合用来烤面包。" +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "菠萝根茎" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "菠萝的根茎,你可以用它来种出你自己的菠萝。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "甜瓜种子" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "一些甜瓜种子。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "香蕉种苗" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "一些香蕉种苗。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "橙子种苗" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "一些橘子种苗。肯定是转基因产品。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "柠檬种苗" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "一些柠檬种苗。肯定是转基因产品。" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "地下椰子" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "证明人类在大灾变之前走得太远了。" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -42988,6 +43429,11 @@ msgid "ankylosaurus egg" msgid_plural "ankylosaurus eggs" msgstr[0] "甲龙蛋" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "迷惑龙蛋" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -43295,7 +43741,7 @@ msgid "scream mushroom" msgid_plural "scream mushrooms" msgstr[0] "尖叫蘑菇" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -43475,104 +43921,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "吾等不应存在在这一时空,聪明的小小人类哟,汝是用了调试模式吗,在当前模组加载设置下,吾等是不能允许汝加入的。" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "测试用松籽" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "测试用苦扁桃仁" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "一种含有微量氢氰酸的扁桃仁,生吃可能中毒。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "测试用迷幻肉豆蔻" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "高剂量的肉豆蔻可以引起幻觉和兴奋,同时也会产生许多令人讨厌的副作用。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "测试用苹果" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "测试用苹果。可能含有虫子,但味道鲜美!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "测试用液体" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "某种液体形式的神秘物质。只作测试,不要喝下!" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "测试用网球酒原汁" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "未发酵的网球酒。一种由捣碎的网球煮制成的有弹性的饮料。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "测试用网球酒" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "由发酵的网球汁制成的廉价酒。尝起来就像它名字听起来一样。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "测试用口香糖" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "带有奇异兴奋和解渴效果的蓝莓味口香糖。" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "测试用变异拇指" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "变异的人类拇指,丧心病狂的人才去吃,吃了后会恶心,并且导致DNA突变。" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -44370,18 +44718,6 @@ msgstr[0] "铝罐" msgid "An aluminum can, like what soda comes in." msgstr "一个铝罐,就是装汽水的那种。" -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "铝罐(开)" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "一个铝罐,就是装汽水的那种。这个已经被打开了而且没法简单的重新密封。" - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -44390,22 +44726,10 @@ msgstr[0] "纸桶" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "由纸,铝和塑料层压制成的纸板盒,容积为半加仑。附带一个螺纹盖子以便封装。" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "纸桶(开)" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "由纸,铝和塑料层压制成的纸板盒,容积为半加仑。它已经被打开了,内容物会开始变质。" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -44426,18 +44750,6 @@ msgstr[0] "小锡罐" msgid "A small tin can, like what tuna comes in." msgstr "一个小型锡制罐子,就是装金枪鱼的那种。" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "小锡罐(开)" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "一个小型锡制罐子,就是装金枪鱼的那种。这个已经被打开而且没法简单的重新密封。" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -44448,18 +44760,6 @@ msgstr[0] "中锡罐" msgid "A medium tin can, like what soup comes in." msgstr "一个中型锡制罐子,就是装汤水的那种。" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "中锡罐(开)" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "一个中型锡制罐子,就是装汤水的那种。这个已经被打开而且没法简单的重新密封。" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -44528,16 +44828,6 @@ msgstr[0] "塑料杯" msgid "A small, vacuum formed cup." msgstr "一只真空包装了的杯子。" -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "塑料杯(开)" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "一只真空包装了的杯子,基本上是垃圾。" - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -44694,7 +44984,6 @@ msgid_plural "gallon jugs" msgstr[0] "加仑壶" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "一个标准容量的塑料壶,一般盛放家用清洁剂或者牛奶等液体。" @@ -44786,7 +45075,6 @@ msgid_plural "small waterskins" msgstr[0] "小号皮水袋" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -44905,18 +45193,6 @@ msgid "" "food." msgstr "一个大型锡制罐子,就是装豆子的那种。能够容纳大量食物。" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "大锡罐(开)" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "一个大型锡制罐子,就是装豆子的那种。这个已经被打开而且没法简单的重新密封。" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -45382,6 +45658,33 @@ msgstr[0] "甲壳块" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "这是一块昆虫的坚硬躯壳,它不仅轻巧,而且很耐用。" +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "内几丁质丝" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "一块昆虫内骨骼。" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "气囊团" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" +"这是一团薄膜状气泡,每一个都有葡萄大小,是从某种变异的巨型昆虫体内屠宰而来的。它们像微小的氦气球一样在空中漂浮,内部充满了比空气还轻的气体,帮助昆虫飞行。" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -45443,6 +45746,32 @@ msgid "" "Felt patches, bundled tightly together for storage. Disassemble to unpack." msgstr "一捆被紧紧地捆在一起以存放的毛毡片,可拆解。" +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "木板捆" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "十片被绳子紧紧地捆在一起以存放的木板,可拆解。" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "粗树枝捆" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "十根被绳子紧紧地捆在一起以存放的粗树枝,可拆解。" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -46533,8 +46862,8 @@ msgid "lotus flower" msgid_plural "lotus flowers" msgstr[0] "荷花" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -47883,6 +48212,16 @@ msgid "" "Unusable as a weapon on its own without the necessary parts." msgstr "一个从TX-5LR地狱犬激光炮塔拆下来的激光炮。在缺少必要部件的情况下无法单独工作。" +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "骨制装甲板" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "载具用骨制装甲板。" + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -49339,6 +49678,54 @@ msgid "" "wound." msgstr "一具头没了一半的尸体。造成这种损伤的原因不得而知。" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "流放族工兵(损坏)" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "一台损坏的流放族工兵机器人。可以拆解得到部件。" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "流放族四足机器人(损坏)" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "一台损坏的流放族四足机器人。可能因为巨大的体积和质量的缘故,就算已经永久无法继续运作依旧看起来可怕无比。可以拆解得到部件。" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "流放族炮塔(损坏)" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "一台损坏的流放族炮塔。可能因为巨大的体积和质量的缘故,就算已经永久无法继续运作依旧看起来可怕无比。可以拆解得到部件。" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "流放族气球无人机(损坏)" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "一台损坏的流放族气球无人机。气球已被撕碎,但大部分底盘仍然完好无损。可以拆解得到部件。" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -51014,7 +51401,7 @@ msgstr[0] "卡农麦克风" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "一个常见的用来录音或放大声音的麦克风。有一个夹子。底部有一个3针卡农接头,用于连接调幅放大器。" #: lang/json/GENERIC_from_json.py @@ -51184,6 +51571,19 @@ msgid "" "anything on its own." msgstr "一种简易铸铁机械叶轮泵。单独它自己并没有什么用。" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "管道连接件" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "各式各样的金属管件。管帽、管接头和类似的配件。它们可以用在各种工程项目中。" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -51794,7 +52194,7 @@ msgstr[0] "琉森锤" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "这种多功能的长柄武器上面有一个钉锤头,一个矛头,和一道弯钩。" #. ~ Description for {'str': 'lucerne hammer'} @@ -52157,7 +52557,6 @@ msgid_plural "pointy sticks" msgstr[0] "尖木棍" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "一头削的尖尖的木棍,可以用来演杂技,当然也可以用来扎人。" @@ -52249,15 +52648,15 @@ msgstr[0] "战戟" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." -msgstr "一个长棍,顶端安装着一个由尖矛、斧头和其他装饰所构成的戟头,在14-15世纪被广泛使用于战争之中,如今常见于梵蒂冈的瑞士守卫。" +" attached to a long sturdy stick." +msgstr "这种多功能的长柄武器上面有一个斧头,一个矛头,和其他装饰。" #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." -msgstr "战戟的拙劣仿制品。一个斧头,一个尖矛头,以及其他有趣的东西固定在一根长棍上。" +"spike, and other fun things attached to a thick pole." +msgstr "这种多功能的长柄武器上面有一个斧头,一个矛头,和其他装饰。它是一把廉价的复制品。" #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -52824,18 +53223,6 @@ msgid "" "from India designed to be concealed under and against the palm." msgstr "一个小型刃爪武器,发源于印度,也被称作\"bagh nakha\"或\"铁爪\"。其小巧的体型使其能够被轻易隐藏在掌心之中。" -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "铁拳套" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "一个皮革缠绕而成的护手和护臂,在指关节上嵌入了金属板,以提高拳击威力和防护。" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -52986,6 +53373,109 @@ msgid "" "somewhat warm to the touch." msgstr "这是一块破碎的异界树脂块。它看起来有点像一大块海玻璃,表面磨砂,边缘圆润。摸起来有点温暖舒适。" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "流放族机器人底盘" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" +"这个看上去略呈六角形的框架和连接在其上的底盘看起来像是一体成型建造而成的。上面的连接孔和附带装置都十分耐用,尽管已经有许多严重磨损和维修的迹象。这个底盘十分灵活,并可能被设计为用于满足各种不同作战角色的需求。" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "流放族无人机底盘" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" +"这个看上去略呈六角形的小型框架和连接在其上的底盘看起来像是一体成型建造而成的。上面的连接孔和附带装置都十分耐用,尽管已经有许多严重磨损和维修的迹象。这个底盘十分灵活,并可能被设计为用于满足各种不同作战角色的需求。" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "生化神经矩阵" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" +"一系列容器和管道,包括供液系统、供电系统、和输入输出的信号接口,如此复杂的安排是为了使其能够容纳下大脑和脊柱,以及其他完全无法被替代的器官以保证其存活。" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "奇特电子元件" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" +"上面的连线和它的整体形状告诉你,这应该是一台电脑,或者至少是某种电子设备,但你还完全无法理解它具体是什么以及它所能起的作用。它的整体做工沉重而坚固。" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "蚀刻金属板" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" +"这个设备看上去像是电子设备,但你完全不了解它的原理。它是一系列紧密结合在一起的铜环,按照同心圆的方式排列着。每个环中伸出许多金属线连接到中间的一根轴上。" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "生化传感器" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" +"从位于正前方的大型玻璃眼睛来分析——有一个小餐盘那么大——你猜它可能是某种相机。但是它内部的工作原理完全让你无法理解,而且看起来也不像你以前见过的任何一台相机。" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "旋转装置" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "你通过铜线的线圈和突出的活塞来猜想它是某种电动机或发电机,但是它的设计看起来和你以前见过的完全不一样,你不知道如何让它工作。" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -53069,7 +53559,6 @@ msgid_plural "pipes" msgstr[0] "钢管" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -53264,7 +53753,12 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "这是一种大型的柔性塑料薄膜,这种塑料可能用于商业包装或密封房屋。" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "硬塑料板" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -53355,12 +53849,12 @@ msgid "" "An enormous beam of solid wood, very heavy and hard to lug around, but also " "very sturdy for construction. You could saw or chop it into smaller pieces," " like planks or panels." -msgstr "巨大的实木梁,很重,很难被拖动,但对于建筑来说也很坚固。你可以把它锯成小块,比如木板或中木板。" +msgstr "巨大的实木梁,很重,很难被拖动,但对于建筑来说也很坚固。你可以把它锯成小块,比如木板或木墙板。" #: lang/json/GENERIC_from_json.py msgid "wooden panel" msgid_plural "wooden panels" -msgstr[0] "中木板" +msgstr[0] "木墙板" #. ~ Description for {'str': 'wooden panel'} #: lang/json/GENERIC_from_json.py @@ -54131,9 +54625,9 @@ msgstr[0] "简易长刀" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." -msgstr "长长的棍子上有个大大的刀片,能造成严重的伤害。" +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." +msgstr "由粗树枝构成的棍身前端有个大大的刀片,能造成严重的伤害。" #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -54292,6 +54786,21 @@ msgstr[0] "订书机" msgid "A stapler for fastening sheets of paper together." msgstr "一种将纸张固定在一起的订书机。" +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "打孔器" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" +"这个金属工具可以帮你在纸上打一个洞。当然如果你想的话,也可以打更多孔,但必须一下一下来。或者,如果你真的想用它一次打更多的孔的话,也许你可以把纸折起来……它是一个单筒打孔器。" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -54534,6 +55043,18 @@ msgid "" "until it floats. Then attach oars or a motor to get the boat to move." msgstr "一个让船只保持浮力的木板。将其安装在载具上直到它浮在水上。继续添加桨或者引擎来移动船只。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "木筏船壳" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "一根让船只保持浮力的原木。将其安装在载具上直到它浮在水上。继续添加桨或者引擎来移动船只。" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -55392,7 +55913,6 @@ msgid_plural "sheet metal" msgstr[0] "薄钢板" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "薄薄的一片金属板。" @@ -55501,16 +56021,6 @@ msgstr[0] "硅化甲壳装甲片" msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "载具用硅化甲壳装甲板。" -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "骨制装甲板" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "载具用骨制装甲板。" - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -55761,8 +56271,8 @@ msgid "workbench" msgid_plural "workbenches" msgstr[0] "工作台" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -55931,6 +56441,16 @@ msgstr[0] "水龙头" msgid "A metal faucet that can be attached to a water tank for easy access." msgstr "一个金属的水龙头,可以连接到水箱上,方便随时取水。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "木制轮架" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "一种带有孔的木片,适合自行车车轮使用。" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -56510,6 +57030,17 @@ msgstr[0] "非因果逻辑变换器" msgid "It has given you an answer, but you are yet to ask anything." msgstr "它已经给出了答案,而你还没有问任何问题。" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "超级材料织物" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "一片经过精心设计用十分复杂工艺制成的彩虹色纤维织物。" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -56596,9 +57127,21 @@ msgstr[0] "超导电磁铁" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." msgstr "一个由室温超导体制成的强力电磁铁。" +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "铁磁流体发电机" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." +msgstr "黑色金属流体,和谐地流动变形成一个又一个分形形状。" + #: lang/json/GENERIC_from_json.py msgid "composite alloy" msgid_plural "composite alloys" @@ -57177,6 +57720,16 @@ msgid "" "battles is bookmarked." msgstr "一本古老的海拉尔传说和故事集。其中关于一次历史上著名的战役的章节被加上了书签标记。" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "风暴之盾" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "这本书包含了铁心流派相关的武术教学。" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -57189,6 +57742,61 @@ msgid "" "art." msgstr "一位战斗改造人特工的传记,详述了他的哲学和武术。" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "精灵宝可梦百科" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "这部百科全书详细列出了宝可梦游戏中各种虚构怪物的强度和招式,以及如何在真实战斗中运用它们的手段。" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "高瞻远瞩" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "这本书包含了暮日流派相关的武术教学。" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "绝地全息仪:第一式" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "这个装置包含了绝地武士光剑战斗的第一式:锡秋剑法相关的武术教学。" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "宁为玉碎" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "这本书包含了石龙流派相关的武术教学。" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "收割之爪" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "这本书包含了虎爪流派相关的武术教学。" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -57209,7 +57817,7 @@ msgstr[0] "发光粉尘" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." msgstr "一缕鬼火遗留下来的物理形态粉末,它似乎还在散发着神奇的光芒。" @@ -57325,8 +57933,8 @@ msgstr[0] "魔力之尘" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." -msgstr "粉末状的魔力结晶。它所含的奥术能量不断脉动着发出微光。" +"Crystalized mana in powdered form. It faintly pulses with arcane energy." +msgstr "一撮粉末状的魔力结晶。它所含的奥术能量不断脉动着发出微光。" #: lang/json/GENERIC_from_json.py msgid "black dragon scale" @@ -58574,126 +59182,6 @@ msgid "" "much more expensive." msgstr "一个由山铜制成的车架。比钢制车架要坚固得多,但同时也比它昂贵得多。" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "测试用木板" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "一块尺寸大概有2x4平方英寸的狭窄而厚实的木板。当做近战武器刚好趁手,也可用于各种建造。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "测试用钢管" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "测试用薄钢板" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "测试用加仑壶" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "测试用小号皮水袋" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "测试用气球" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "弹性,水密,气密,一个完美的测试用气球。" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "测试用尖木棍" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "测试用笨剑" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "测试用的平衡性很差的武器。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "测试用普通剑" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "测试用的武器。" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "测试用平衡剑" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "测试用的平衡性很好的武器。" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "测试用纸盒" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "一个简单的1升纸板箱,故意未设定比例。" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "测试用14厘米短棍" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "一根14厘米长的短棍。" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "测试用15厘米短棍" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "一根15厘米长的短棍。" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "测试用核咖啡壶" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "这是一个测试用咖啡壶,设计能保持原子饮料的放射性。它一直在泄漏辐射。" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "枪械" @@ -61334,6 +61822,34 @@ msgid "" "thrower." msgstr "一种自制的加压2L罐,设计用于为自制的化学品喷射器供料。" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "PA Md. 71 流放族 12.3ln 弹匣" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" +"一个流线型的小型弹匣,基于经典的PA MD .71 " +"弹夹造型,经过由流放族重新设计,能够更好地用在比空气还轻的无人机上。它的尺寸过小,不太适合用于与尸群的地面作战,因为装弹会比较麻烦。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "PA Md. 68 流放族 12.3ln 弹匣" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "一个大得过分的弹匣,适用于已经很沉重的PA Md. 68 战斗步枪,经过流放族特殊定制,并由其生产制造。" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -61765,28 +62281,6 @@ msgid "" "tips." msgstr "这是一个小型魔力水晶,专门被设计用来存储魔杖所需的能量。" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "测试用一次性电池" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "一个测试用一次性电池。" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "测试用可充电电池" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "一个测试用可充电电池。" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "默认" @@ -61802,8 +62296,11 @@ msgstr "余波未尽" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." -msgstr "在现实主义的游戏中添加更多的科幻元素。" +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." +msgstr "在现实主义的游戏中添加更多的科幻元素。长期目标是为玩家带来显著不同的体验,同时维持与其他模组的兼容性。" #: lang/json/MOD_INFO_from_json.py msgid "Blaze Industries" @@ -61845,8 +62342,9 @@ msgstr "暗黑天际" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "将大灾变转变为类似XCOM2风格的外星人入侵的全面改动类模组。不兼容其他模组,使用风险自负!" #: lang/json/MOD_INFO_from_json.py @@ -62051,16 +62549,6 @@ msgstr "技能提升属性" msgid "Allows stats to raise via skill progression." msgstr "让玩家的基础属性根据技能等级不断提高。" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "测试数据" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "这组数据包含了物品模型,配方以及其他为了自动化测试使用的东西。" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "更多城镇建筑" @@ -62342,6 +62830,48 @@ msgid "" msgstr "" "与零件、电缆融在一起的\"人\",虽然眼睛空洞,但转瞬即逝的痛苦表情能让人想起被困在这具怪诞身体里的曾经是人类。掌握足够的外科手术技巧,就可以为他们找回一些人性,但愿他们还在乎……" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "流放族工兵" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "一台看上去以人型生物为原型的机器人,装配了各种建筑工具。" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "流放族四足机器人" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" +"这台体型巨大的四足机器人似乎是由各类零件拼凑而成,其中大部分零件你都从未见过。它以一种沉重的,奇怪的优雅步态移动,伴随着沉重的脚步声,它在它所踏过之处留下了一串浅坑。它的体内堆满了各类武器,但似乎并不急于瞄准你。" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "丧尸改造人" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" +"一具早已死亡的人类和更致命的技术的混合体,这具钢铁和血肉扭曲在一起的躯体就像一个愤怒的幼童手中的木偶。它的机械部件似乎已经失效关闭,而新生的肌肉包裹在它们周围,把它们牵扯拉伸向奇怪的方向。一些金属骨架和盔甲从它腐烂的肉体中突出来。" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -62557,6 +63087,23 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "一只体积数倍于普通型号的无人机,这台正在飞行的四轴无人机体内装载了一枚微型核弹。如果它瞄准了你……快跑!" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "气球狙击无人机" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" +"这台不寻常的装置看起来像一个气象气球和一个四翼无人机的组合体。在装有部件的大箱子下面,悬挂着一个小型的铰接式装备,上面有把集成步枪。它的螺旋桨偶尔短暂地开启,而后再次关闭,使它不受气流影响,长时间保持静止。它看起来能够在空中悬浮很长一段时间才会耗尽电力。" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -63854,6 +64401,16 @@ msgid "" "about rapidly and the mouths form a chorus of groaning screams." msgstr "这个血肉傀儡是由腐烂的人类和动物躯体融合在一起组成,它飞快的移动着所有头上的眼睛。口中发出尖叫和呻吟。" +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "人类" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "该物品用于人类尸体的占位符,如果你看到这个说明游戏出Bug了。" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -64245,6 +64802,21 @@ msgid "" msgstr "" "东部美洲狮,大型猫科食肉动物。曾经在这一地区被认为已经灭绝,但是经过保育,在大灾变之后,成功的恢复了往日的荣光。迅捷而安静,这只捕猎者能够远距离跳扑,并用致命的爪子抓住猎物,最后用巨大的獠牙给它致命一击。" +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "老虎" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" +"一只雄伟而威严的老虎,一种大型猫科捕食性动物。它们原产于亚洲,现在美国各个私人保护区中有多个种群分布。它的速度快,力量大,是世界上最受人们认可和喜爱的动物之一。当然也是最致命的动物之一。" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -65806,6 +66378,18 @@ msgstr "一株光彩夺目而硕大的异界蕨类植物。从它身上散发出 msgid "Lightning arcs from the leech stalk!" msgstr "水蛭花茎秆射出了一道电弧!" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "信号树" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "这棵树的树干高高耸立入云,其最顶端的树枝发出黄光。它周期性地发出一阵阵低沉的鼓声震撼着四周。" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -66217,7 +66801,7 @@ msgid "" " This one is fitted with a M2HB." msgstr "" "这是一台M153 CROWS II " -"自主武器系统的升级型号,安装了自主操作软件。在大灾难发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何轻型车辆交战。这一台配备了一支" +"自主武器系统的升级型号,安装了自主操作软件。在大灾变发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何轻型车辆交战。这一台配备了一支" " M2HB 重机枪。" #: lang/json/MONSTER_from_json.py @@ -66234,7 +66818,7 @@ msgid "" " infantry without exposing the operator. This one is fitted with a M249." msgstr "" "这是一台M153 CROWS II " -"自主武器系统的升级型号,安装了自主操作软件。在大灾难发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支" +"自主武器系统的升级型号,安装了自主操作软件。在大灾变发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支" " M249 机枪。" #: lang/json/MONSTER_from_json.py @@ -66251,7 +66835,7 @@ msgid "" " infantry without exposing the operator. This one is fitted with a M240." msgstr "" "这是一台M153 CROWS II " -"自主武器系统的升级型号,安装了自主操作软件。在大灾难发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支" +"自主武器系统的升级型号,安装了自主操作软件。在大灾变发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支" " M240 机枪。" #: lang/json/MONSTER_from_json.py @@ -66284,6 +66868,19 @@ msgstr[0] "扩音器" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "一台大功率扩音器,一遍又一遍地重复着响亮的信息。" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "升级改造炮塔" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "这座巨大的炮塔似乎是用各种高科技零件拼凑而成的,其中有许多看起来非常奇怪的零件。它配备了一把看起来很结实的机枪。" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -66370,6 +66967,145 @@ msgid "" msgstr "" "安可异公司的第一款产品,一个高耸的四臂人形机器人,脸部柔和。它的面貌细节引人注目,但它的硬度让你感到非常不舒服。世界末日并没有阻止它寻找病人协助。" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "骷髅犬" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "" +"这只曾经的犬科生物的表皮早已全部脱落,露出了内部由骨骼和肋骨融合而成的甲壳。这套缺少血肉覆盖的会行走的骨甲似乎被一团充满了闪闪发光的黑色粘液的血管和肌腱网所驱动。" + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "犬魔" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "一只体型巨大而肿胀的丧尸犬,身体表面涂满了黑色的黏液。它的牙齿更长,宽阔的后背上布满了肌肉和渗出脓液的伤口。" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "恐怖巨犬" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "一只四条腿的丧尸犬,身体已经肿胀得十分荒唐,手臂像垃圾桶一样粗壮,巨大的牙齿暴露在外。" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "骨板狼" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "一只全身覆盖着骨板的四足动物,骨板和躯体已经融合在一起,外形有点像狗或狼。它全身上下的关节和裂缝渗出了黑色的黏液。" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "骷髅狼" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "矛猫猎手" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "这只美洲狮的眼睛渗出深色油状液体,它的皮毛被撕裂,露出了深深的溃烂的伤口。它的爪子和牙齿不自然地生长,并磨尖成危险的尖刺。" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "骸骨丧尸熊" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" +"一层巨大的过度生长而成的骨化组织已经形成了致密有机的骨制盔甲并取代了这只丧尸熊表面原来早已腐烂的皮肤。大块的黑色粘液从其关节不断渗出,它毫无目的蹒跚而行,全身的关节随着移动不断发出令人作呕的咔嗒声。" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "幽灵猫" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "这只丧尸怪物被一层不可思议的阴影所笼罩,看上去似如光线也拒绝去接触它一般。你唯一能够分辨出来的是一个步履蹒跚的大型猫科动物轮廓。" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "酸液丧尸熊" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "一头看上去很恶心的毛皮斑驳的丧尸熊。它的皮肤看上去非常薄,你都能看到它皮肤下的血管中流动着粘粘的黄色液体。" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "鹿角锤头兽" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "这只曾经体型巨大的驼鹿的眼睛渗出深色油状液体,被撕烈的血肉瘢痕累累。它全身上下布满了肿胀的肌肉和溃烂的伤口。" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "荆棘蹒跚兽" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" +"曾经是一只体型巨大的驼鹿,现在被长而密的毛发所覆盖,上面缠绕着荆棘藤蔓,这些藤蔓缠绕在一起包裹着它的尸体。长长的刺缠绕在鹿角上,有种神秘的银色液体从尖端滴下来。" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -66395,21 +67131,6 @@ msgid "" msgstr "" "一个皮毛下暴露出的肌肉组织和血管的丧尸犬。这种生物的腐烂程度更为严重,甚至可以看到暴露在外的骨头,动物本能驱使着其运动能力,它们可以很轻松地扑向敌人并且凶残地撕咬活体。" -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "骷髅犬" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "" -"这只曾经的犬科生物的表皮早已全部脱落,露出了内部由骨骼和肋骨融合而成的甲壳。这套缺少血肉覆盖的会行走的骨甲似乎被一团充满了闪闪发光的黑色粘液的血管和肌腱网所驱动。" - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -66514,6 +67235,30 @@ msgid "" "and its eyes bulge with black goo." msgstr "一条看似正常的美洲狮,但仔细观察会发现它的后腿肿了,眼睛凸起并流着黑色的粘液。" +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "幽灵虎" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "这只原本看上去很正常的老虎走起路来摇摇晃晃的,下巴松弛,眼睛睁得大大的,漆黑的眼睛正闪闪发亮。" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "大群丧尸蜘蛛" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "成千上万,也许是数百万蜘蛛高高地堆积在一起,每只蜘蛛都在慢慢地渗出黏糊糊的绿色脓液,它们挣扎着把腐烂发臭的躯体堆在一起移动。" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -67040,6 +67785,43 @@ msgstr "这个尸体以骇人的方式扭曲,变成了昆虫一般的形状。 msgid "The impaler launches a barb!" msgstr "坏疽穿刺者射出了一根毒刺!" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "利剪蛛" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "一团如同梦魇般的蜘蛛形状的血肉高高地矗立在废墟中,无声地守护着眼前残破的景色。它细长的骨头四肢以难以置信的速度在瓦砾中滑动。" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "吊挂内脏" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "一大块巨大的蛇形血肉从天花板悬吊下来,疯狂地四处摔打着,四处搜寻猎物。" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "痉挛肉块" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "一大团融合在一起的尸体和变异血肉。它不断痉挛,如同心率失常的心脏病人般绝望地搏动。" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -68873,6 +69655,18 @@ msgid "" " emerge." msgstr "一种庞大的、犀牛般的恐龙。头上有三个大角和一个骨质头冠。" +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "生化三角龙" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "一只巨大的三角四足恐龙,上面点缀着噼啪作响的生化插件。它的角发出可怕的光。" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -68896,6 +69690,18 @@ msgid "" "massive spiked club of bone." msgstr "这种恐龙看上去像是一种巨大的史前犰狳,它的尾端有一个巨大的骨质狼牙棒。" +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "迷惑龙" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "一只巨大的长颈四足恐龙,尾巴非常长,像鞭子一样。它的头能够直立起来,脖子看起来像一根巨大而坚固的棍子。" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -69094,6 +69900,96 @@ msgid "magenta and green hatchling" msgid_plural "magenta and green hatchlings" msgstr[0] "紫绿色恐龙幼仔" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "真菌丧尸棘龙" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" +"曾经是一只巨大的长着鳄鱼头和背帆的食肉恐龙,但现在真菌从它的口、眼、耳和其他孔洞处喷薄而出并互相连接起来,被霉菌覆盖的巨大躯体还在蹒跚而行。" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "真菌丧尸霸王龙" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "曾经是一只食肉恐龙中的霸王,但现在真菌从它的口、眼、耳和其他孔洞处喷薄而出并互相连接起来,被霉菌覆盖的巨大躯体还在蹒跚而行。" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "真菌丧尸恐爪龙" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "曾经是一只长着羽毛的中型食肉恐龙,但现在真菌从它的口、眼、耳和其他孔洞处喷薄而出并互相连接起来,被霉菌覆盖的巨大躯体还在蹒跚而行。" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "丧尸似鸡龙" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "丧尸厚头龙" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。它看起来像一只长着坚硬圆头的蜥蜴鸵鸟。" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "丧尸弯龙" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的大型两足恐龙尸体。它的两条腿很强壮,肩膀宽阔,长着尖喙。" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "丧尸棘龙" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "一具巨大的腐烂恐龙尸体,有着凶猛的像鳄鱼一样的头,眼睛渗出黑色的液体,背上有一个破烂的帆一样的东西。" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -69105,11 +70001,99 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "一大坨破烂发臭的血肉,托起了它巨大的牙齿。" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "丧尸阿尔伯塔龙" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "一具巨大的恐龙尸体撑起了巨大的大嘴和一对贪婪的利爪,嘴中不断滴落下黑色的液体。" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" +msgstr[0] "丧尸三角龙" + +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "一具庞大的、犀牛般的蹒跚而行的恐龙尸体。头上有三个恐怖大角和一个骨质头冠。眼中流出的黑色液体如同眼泪一般滴落下来。" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "丧尸剑龙" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "一具巨大的蹒跚而行的四足恐龙尸体,移动缓慢,背上有骨板,尾巴上有骨钉。" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "丧尸甲龙" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" +"这具巨大的恐龙尸体看上去像是一种巨大的史前犰狳,它的尾端有一个巨大的骨质狼牙棒。它体表的装甲骨板有些已经剥落了,黑色空洞的眼中有什么正在闪闪发光。" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "丧尸迷惑龙" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "一具巨大的蹒跚而行的长颈四足恐龙尸体,尾巴非常长,像鞭子一样。它的头能够直立起来,脖子看起来像一根巨大而坚固的棍子。" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "丧尸角鼻龙" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "一具巨大的、鳞片上布满了骨刺的恐龙尸体,它以可怕的速度移动。它五颜六色的角已经磨损,沾满了污秽,它明亮的鳞片和骨刺看上去也受过重创。" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "丧尸异特龙" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "一具巨大的蹒跚而行的掠夺性双足恐龙尸体,宽阔的脊背上有着和老虎相似的条纹。" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" msgstr[0] "丧尸恐爪龙" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -69117,6 +70101,386 @@ msgid "" "sickle-like claw." msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。双脚前端巨大的镰刀状利爪正不断挥舞着。" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "丧尸犹他盗龙" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "一具巨大的蹒跚而行的两足恐龙尸体。有着被破碎羽毛覆盖的胳膊、一个长尾巴和长长的镰刀状的爪子。" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "丧尸副栉龙" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "一具巨大的、身体上有各色斑块的蹒跚而行的恐龙尸体,长着钝的头脊。它正四处游荡,黑漆漆的眼中空洞而肿胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "丧尸双型齿翼龙" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "一具长着破碎羽毛的蹒跚而行的爬行动物尸体,有三英尺长,长着较短的翅膀和颜色鲜艳的大嘴。" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "丧尸双脊龙" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "一具蹒跚而行的中型恐龙尸体,牙齿很锋利,头部有两个突出的骨冠,上面撕裂的血肉像褶边一样垂落下来。" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "恐怖似鸡龙" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "恐怖厚头龙" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。它坚硬圆头下的身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "恐怖弯龙" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的大型两足恐龙尸体。它的两条腿肌肉变得肿胀,将肩膀撑得十分鼓胀,长着尖喙。" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "恐怖棘龙" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" +"一具巨大的腐烂恐龙尸体,有着凶猛的像鳄鱼一样的头,眼睛渗出黑色的液体,背上有一个破烂的帆一样的东西。它的整个身体被肿胀的肌肉和溃烂的伤口撑得更加巨大。" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "恐怖霸王龙" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "一大坨破烂发臭的血肉,托起了它巨大的牙齿。它的整个身体被肿胀的肌肉和溃烂的伤口撑得更加巨大。" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "恐怖阿尔伯塔龙" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "一具巨大的恐龙尸体撑起了巨大的大嘴和一对贪婪的利爪,嘴中不断滴落下黑色的液体。它的整个身体被肿胀的肌肉和溃烂的伤口撑得更加巨大。" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "恐怖三角龙" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" +"一具庞大的、犀牛般的蹒跚而行的恐龙尸体。头上有三个恐怖大角和一个骨质头冠。眼中流出的黑色液体如同眼泪一般滴落下来。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "恐怖剑龙" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "一具巨大的蹒跚而行的四足恐龙尸体,移动缓慢,背上有骨板,尾巴上有骨钉。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "恐怖甲龙" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" +"这具巨大的恐龙尸体看上去像是一种巨大的史前犰狳,它的尾端有一个巨大的骨质狼牙棒。它体表的装甲骨板有些已经剥落了,黑色空洞的眼中有什么正在闪闪发光。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "恐怖迷惑龙" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" +"一具巨大的蹒跚而行的长颈四足恐龙尸体,尾巴非常长,像鞭子一样。它的头能够直立起来,脖子看起来像一根巨大而坚固的棍子。它的整个身体被肿胀的肌肉和溃烂的伤口撑得更加巨大。" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "恐怖角鼻龙" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" +"一具巨大的、鳞片上布满了骨刺的恐龙尸体,它以可怕的速度移动。它五颜六色的角已经磨损,沾满了污秽,它明亮的鳞片和骨刺看上去也受过重创。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "恐怖异特龙" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "一具巨大的蹒跚而行的掠夺性双足恐龙尸体,宽阔的脊背上有着和老虎相似的条纹。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "恐怖恐爪龙" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"一具体表覆盖着破碎羽毛和黑色腐臭液体的蹒跚而行的中型两足恐龙尸体。双脚前端巨大的镰刀状利爪正不断挥舞着。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "恐怖犹他盗龙" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" +"一具巨大的蹒跚而行的两足恐龙尸体。有着被破碎羽毛覆盖的胳膊、一个长尾巴和长长的镰刀状的爪子。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "恐怖副栉龙" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" +"一具巨大的、身体上有各色斑块的蹒跚而行的恐龙尸体,长着钝的头脊。它正四处游荡,黑漆漆的眼中空洞而肿胀。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "恐怖双型齿翼龙" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "一具长着破碎羽毛的蹒跚而行的爬行动物尸体,有三英尺长,长着较短的翅膀和颜色鲜艳的大嘴。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "恐怖双脊龙" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" +"一具蹒跚而行的中型恐龙尸体,牙齿很锋利,头部有两个突出的骨冠,上面撕裂的血肉像褶边一样垂落下来。它的整个身体被肿胀的肌肉和溃烂的伤口撑得十分鼓胀。" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "暗影丧尸棘龙" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" +"这只丧尸恐龙被一层不可思议的阴影所笼罩,看上去似如光线也拒绝去接触它一般。你唯一能够分辨出来的是一个步履蹒跚的长着破碎背帆的巨型恐龙轮廓。头部又长又窄,有一个V形的鼻子。" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "暗影丧尸霸王龙" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" +"这只丧尸恐龙被一层不可思议的阴影所笼罩,看上去似如光线也拒绝去接触它一般。你唯一能够分辨出来的是一个步履蹒跚的模糊的巨型恐龙轮廓。头看起来很大,能装下很多大牙齿。" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "暗影丧尸恐爪龙" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" +"这只丧尸恐龙被一层不可思议的阴影所笼罩,看上去似如光线也拒绝去接触它一般。你唯一能够分辨出来的是一个步履蹒跚的模糊的中型恐龙轮廓。双脚前端巨大的镰刀状利爪正不断挥舞着。" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "骸骨霸王龙" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "巨大而密集的骨柱托举起巨大的尖牙,牙尖不断滴下黑色的黏液。" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "骸骨阿尔伯塔龙" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "巨大而密集的骨柱托举起尖牙,牙尖不断滴下黑色的黏液。它的骨爪在身前不断挥舞。" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "骸骨角鼻龙" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "巨大而密集的骨柱托举起尖牙,牙尖不断滴下黑色的黏液。尖尖的骨刺和五颜六色的角从它的后背刺出。" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "骸骨异特龙" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "巨大而密集的骨柱托举起尖牙,牙尖不断滴下黑色的黏液。" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "骸骨犹他盗龙" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "巨大而密集的骨柱托举起尖牙,牙尖不断滴下黑色的黏液。它的骨爪在身前不断挥舞。它长着一条长长的骨尾和长长的镰刀状的爪子。" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -69137,7 +70501,7 @@ msgid "" " This one is fitted with a heavy machinegun." msgstr "" "这是一台M153 CROWS II " -"自主武器系统的升级型号,安装了自主操作软件。在大灾难发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何轻型车辆交战。这一台配备了一支重机枪。" +"自主武器系统的升级型号,安装了自主操作软件。在大灾变发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何轻型车辆交战。这一台配备了一支重机枪。" #: lang/json/MONSTER_from_json.py msgid "CROWS II, light machinegun" @@ -69154,7 +70518,7 @@ msgid "" "machine gun." msgstr "" "这是一台M153 CROWS II " -"自主武器系统的升级型号,安装了自主操作软件。在大灾难发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支轻机枪。" +"自主武器系统的升级型号,安装了自主操作软件。在大灾变发生前,美国军方已经部署了数千架辆这种炮塔,它们的价值在于能够在不暴露驾驶员的情况下,在远距离与任何步兵交战。这一台配备了一支轻机枪。" #: lang/json/MONSTER_from_json.py msgid "autonomous rifle TALON UGV" @@ -69568,6 +70932,18 @@ msgid "" "off creatures that disturb it." msgstr "尖叫蘑菇怪是一种和人一样大的蘑菇,通过发出刺耳的尖叫声来驱赶打扰它的生物。" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "牛蛙" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "一只非常普通的美国牛蛙。你最好让王子远离它。" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -69821,18 +71197,6 @@ msgid "" "traditional forces." msgstr "\"幽灵怪\"(12N)10 级建筑工型机器人 。该型号是\"幽灵怪\"系列的单兵辅助型号的一部分,该系列设计得可与更传统的军队无缝衔接。" -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "厕纸木乃伊" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "一个看上去略像人形的怪物,被层层包裹在类似厕纸的东西里。" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -70190,18 +71554,6 @@ msgid "" msgstr "" "一套自制的马铠,包含保护马颈的鸡颈、保护马胸的当胸和保护马臀的搭后,上面的恶魔甲壳片和薄薄的网状织物贴合在一起。你可以将这套马铠穿在一匹友好的马身上。" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "喵力装甲" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "一套光滑又轻便的凯夫拉猫具,带有保护头盔和胸板。背面有个非常小、用起来很不方便的魔术贴口袋。" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "哺乳动物" @@ -70214,6 +71566,14 @@ msgstr "两栖动物" msgid "a bird" msgstr "鸟类" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "异界改造人" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "沉闷的重击声。" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "爬行动物" @@ -70946,6 +72306,22 @@ msgstr "颅脑爆炸" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "这个虚拟法术用于引爆颅脑内的炸弹。极度致命。" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "头骨枪反震" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "这个虚拟法术用于模拟头骨枪的反震。在重伤时可能会致命。" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "你的头被射击的威力反震了!" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "灵能击晕" @@ -71068,6 +72444,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "这仪式会创造出一块与泛灵师共鸣的小石块。你可以将符文作为催化剂用于制造其它物品。" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "裂魂术" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "用暴力将灵魂与躯体撕裂开,并强迫所生成的暗影遵照你的意志行动。" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "召唤鬼火" @@ -71290,6 +72677,15 @@ msgstr "调试用疲劳法术。" msgid "Uses a little fatigue" msgstr "使用一点疲劳。" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "调试用变形术" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "你想减肥,对吧?" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "调试用生命法术" @@ -71348,8 +72744,8 @@ msgstr "排斥所有物体。" msgid "Debug Full Protection" msgstr "调试用全身防护" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "没有东西能够伤害到你。" @@ -71720,6 +73116,10 @@ msgstr "奥术闪电" msgid "Haste" msgstr "加速术" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "恶意变形术" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "奥术光束" @@ -71841,10 +73241,10 @@ msgstr "召唤4个永久的恶魔蜘蛛。" msgid "Jolt" msgstr "震颤电击" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "噼里啪啦的闪电声" @@ -71913,6 +73313,31 @@ msgstr "为电离术添加闪光弹效果。" msgid "Wall of Fog" msgstr "雾墙术" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "电弧光环" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "这只是电弧光环附属的法术。" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "放电声!" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "电弧光环" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "你在你周围召唤出一道噼啪作响的电弧光环,能放出可怕的闪电电击近战攻击你的敌人。" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "祝福" @@ -72025,66 +73450,38 @@ msgstr "你将体内的生化能量过载并导入你的灵脉中,并将其导 msgid "X-ray Vision" msgstr "X光视觉" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "法力虹吸" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "这是法力虹吸系列突变的法术部分。如果你学会了这个法术,说明你用了调试功能。" - #: lang/json/SPELL_from_json.py -msgid "Pew, Pew" -msgstr "砰砰术" +msgid "Knock" +msgstr "敲击术" -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "你用手指指着施法目标,嘴里发出“砰砰”声。" - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "地板变岩浆" - -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" -msgstr "最好赶紧找一把椅子或柜台爬上去,因为地板变成岩浆了!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." +msgstr "你引导魔力,将其变成能够打开门的力量。这种法术只能打开木门。" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" -msgstr "运动训练蒙太奇" +msgid "Improved Knock" +msgstr "高等敲击术" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." -msgstr "当做一件事需要很长时间,而你又想快速完成时,你需要一个蒙太奇。" - -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "亲亲伤口术" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." -msgstr "一个温柔的吻,让痛苦消失,就像妈妈曾经做的那样。" +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." +msgstr "你引导魔力,将其变成能够打开门的力量。这种法术能打开任何锁住的门。" -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" -msgstr "召唤木乃伊" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" +msgstr "法力虹吸" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." -msgstr "从你灵魂中的扫帚柜里召唤出一个脆弱的纸巾生物。" +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." +msgstr "这是法力虹吸系列突变的法术部分。如果你学会了这个法术,说明你用了调试功能。" #: lang/json/TOOLMOD_from_json.py msgid "reactor core expansion device" @@ -74370,25 +75767,30 @@ msgid "" msgstr "传说中雷神索尔的神奇腰带,至少看起来是这样的。它能使佩戴者的基础力量加倍。" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" -msgstr[0] "次级口袋腰带" - -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" +msgstr[0] "次级次元工具腰带" + +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." -msgstr "一条很适合你腰部的宽腰带,上面覆盖着许多小口袋,能装下超出它们体积的物品,而且口袋中的物品重量大大减少。" +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." +msgstr "一条结实合身的工具腰带,上面套着许多方便取用的袋子。像所有的次元袋一样,放入的物品重量会减轻。" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" -msgstr[0] "高级口袋腰带" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" +msgstr[0] "高级次元工具腰带" + +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "一条特别结实合身的工具腰带,上面套着许多方便取用的袋子。像所有的次元袋一样,放入的物品重量会大大减轻。" #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" @@ -75404,6 +76806,18 @@ msgid "bionic firestarter" msgid_plural "bionic firestarters" msgstr[0] "生化生火工具" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "烟熏架" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "这是一个虚拟物品,正常不应该出现在你的游戏里。" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -75468,7 +76882,7 @@ msgstr[0] "万圣节南瓜" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "点亮" @@ -77986,12 +79400,6 @@ msgid "pseudo butter churn" msgid_plural "pseudo butter churns" msgstr[0] "虚拟黄油搅拌机" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "这是一个虚拟物品,正常不应该出现在你的游戏里。" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -78784,13 +80192,11 @@ msgstr[0] "智能手机" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "你启动了手电筒应用。" #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "智能手机没电了。" @@ -80109,7 +81515,6 @@ msgid_plural "fire axes" msgstr[0] "消防斧" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -80124,7 +81529,6 @@ msgid_plural "Halligan bars" msgstr[0] "消防破拆棍" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -80150,13 +81554,37 @@ msgid "throwable fire extinguisher" msgid_plural "throwable fire extinguishers" msgstr[0] "投掷型灭火器" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "拉开保险" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "你拉开了投掷型灭火器的保险销。" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." -msgstr "手榴弹式的灭火器。虽然效果不如常规灭火器,但可以从远处使用它。它受热后自动激活,所以只要把它扔进火中即可。" +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" +"手榴弹式的灭火器。虽然效果不如常规灭火器,但可以从远处使用它。它有个可以拉开的塑料保险销,但主要依靠受热后自动引爆,所以只要把它扔进火中即可。" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "投掷型灭火器(无保险)" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" +msgstr "一个拔了插销的投掷型灭火器,随时都会引爆,快点扔掉吧!" #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -80346,6 +81774,28 @@ msgid "" "shovel but really can't compare to a real shovel." msgstr "扁平的石头绑在了木棍上,就当做铁锹用吧,虽然显然比不上啊。" +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "金属耙子" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "一把结实的金属耙子,秋季收获必备农具。" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "塑料耙子" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "一把廉价的塑料耙子。如果把它用于除了耙树叶以外的任何用途,都会很快损坏它。" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -80369,6 +81819,26 @@ msgstr[0] "铁锹" msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "一个挖坑工具,你可以用它在你周围挖坑。" +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "雪铲" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "一把用来铲雪的结实铲子。" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "塑料雪铲" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "一把用来铲雪的廉价塑料铲子。" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -81077,6 +82547,11 @@ msgid "" "the right tools, you could use this for metalworking." msgstr "一种便携式烧炭金工锻造工具。搭配合适当的工具,你可以用它来加工金属物品。" +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "石头熔炉" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -81203,6 +82678,17 @@ msgid "" "metalworking fabrication recipes." msgstr "长颈的铝制火钳。是烹饪或金属加工制造的常用工具。" +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "砂纸" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "一张粗糙的纸。常用于金属加工和木工。" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -81352,6 +82838,18 @@ msgid "" "and place on the ground." msgstr "一床皮毛制成的铺盖,可以卷起来随身携带。垫在地上,让你更容易入睡。" +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "花园软管" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "一根柔软的花园用橡胶软管。可以用来做东西,也可以用来从载具中抽油。" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -83092,7 +84590,6 @@ msgid_plural "rags" msgstr[0] "布条" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -83500,11 +84997,11 @@ msgid "" msgstr "电锯已经启动,发出可怕的噪声。激活它来关闭。" #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "石手斧" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "石斧斧头" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -83512,11 +85009,11 @@ msgid "" msgstr "一块扁平的石头,边缘窄得足以勉强用来砍木头。" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "金属手斧" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "金属斧头" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -83630,6 +85127,11 @@ msgid "" "but you could use it to fire anything made of clay." msgstr "这是一个可移动的砖窑,设计用来烧砖的,但也可以烧任何粘土制品。" +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "窑炉" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -83776,7 +85278,6 @@ msgid_plural "scissor jacks" msgstr[0] "剪式千斤顶" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "紧凑的剪式千斤顶,用于起重车辆。" @@ -83990,7 +85491,6 @@ msgid_plural "screwdrivers" msgstr[0] "螺丝刀" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -84028,7 +85528,6 @@ msgid_plural "soldering irons" msgstr[0] "电烙铁" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -84410,16 +85909,16 @@ msgid "" " towards enemy targets and highlight them with a powerful spotlight." msgstr "这是一部未激活的猎犬无人机。当成功部署时,它会飞向敌对目标并用它的高功率探照灯照射目标。" -#: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" -msgstr[0] "精密焊接仪" - #: lang/json/TOOL_from_json.py msgid "pseudo atomic butter churn" msgid_plural "pseudo atomic butter churns" msgstr[0] "虚拟原子黄油搅拌机" +#: lang/json/TOOL_from_json.py +msgid "precision solderers" +msgid_plural "precision solderers" +msgstr[0] "精密焊接仪" + #: lang/json/TOOL_from_json.py msgid "atomic smartphone" msgid_plural "atomic smartphones" @@ -84434,7 +85933,7 @@ msgid "" "price made them a rarity. It includes an alarm clock, a high-resolution " "camera, and a bright flashlight." msgstr "" -"使用Rivtech原子智能手机后,你再用不需要给手机充电了。这台尖端设备的使用期超过1000万年,在大灾难来临时,它上市还不到一个星期,贵到令人想哭的价格使其成为稀缺品。它包括一个闹钟、一个高分辨率照相机和一个明亮的手电筒。" +"使用Rivtech原子智能手机后,你再用不需要给手机充电了。这台尖端设备的使用期超过1000万年,在大灾变来临前,它上市还不到一个星期,贵到令人想哭的价格使其成为稀缺品。它包括一个闹钟、一个高分辨率照相机和一个明亮的手电筒。" #: lang/json/TOOL_from_json.py msgid "atomic smartphone - music" @@ -84606,6 +86105,20 @@ msgid "" msgstr "" "一整套非常小的工具和加密所用的数字密钥,通常用于在专门诊所中修复生化插件。它们可以让你拆解一些简单的生化插件,但任何复杂的生化插件都需要更专业的工具才能拆解。" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "生化插件完全工具箱" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "一整套非常小的自动化工具和加密所用的数字密钥,通常用于在工厂中拆解和测试生化插件。一个经验丰富且耐心的工程师可以用它手工组装新的生化插件。" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -85420,6 +86933,60 @@ msgid "greater wand of cone of cold" msgid_plural "greater wands of cone of cold" msgstr[0] "高级极寒喷射法杖" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "下级敲击术法杖" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是敲击术。" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "次级敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "高级敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "下级高等敲击术法杖" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是高等敲击术。" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "次级高等敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "高级高等敲击术法杖" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -85582,6 +87149,60 @@ msgid "disposable greater wand of cone of cold" msgid_plural "disposable greater wands of cone of cold" msgstr[0] "一次性高级极寒喷射法杖" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "一次性下级敲击术法杖" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "一根细长的木制法杖,在底端镶嵌有一颗魔法水晶,激活时会施放一次法术。这根法杖发射的是敲击术。" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "一次性次级敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "一次性高级敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "一次性下级高等敲击术法杖" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "一根细长的木制法杖,在底端镶嵌有一颗魔法水晶,激活时会施放一次法术。这根法杖发射的是高等敲击术。" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "一次性次级高等敲击术法杖" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "一次性高级高等敲击术法杖" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -85709,66 +87330,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "一个便携式版本的火炭锻造台,它使用了恶魔蜘蛛甲壳进行附魔和强化,以便能够将魔法金属熔化成能够制造物品的锭。" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "测试用布条" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "测试用消防破拆棍" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "测试用消防斧" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "测试用螺丝刀" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "测试用超音速螺丝刀" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "一把测试用超音速螺丝刀。和普通螺丝刀一样,但是是超音速的。" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "测试用电烙铁" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "测试用剪式千斤顶" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "测试用智能手机" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "一个带手电筒、相机和MP3播放器的UPS供电的智能手机。" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "测试用火柴" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "测试用火柴,当你必须燃烧东西时点燃它,为了科学!" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -86095,7 +87656,7 @@ msgid "Pheidippides was a hack" msgstr "斐迪庇第斯不过如此" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "跑了一场马拉松……还多一点点。" #: lang/json/achievement_from_json.py @@ -86126,14 +87687,629 @@ msgstr "无论谷有多深" msgid "Freeman's favorite" msgstr "弗里曼博士的最爱" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "手持撬棍" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "固若金汤" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "穿上机甲" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "他们在隐瞒什么?" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "进入实验室终点房" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "最后的庇护所" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "抵达难民中心" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "寻根之旅" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "回到游戏起始位置" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "木头" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "一棵树在森林里倒下,如果没有人听见,那么它还会发出声音吗?" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "伐木工" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "对一个拿着斧头的人来说,森林是什么?" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "毁林人" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "如果你砍光所有树木,你就会找到狼。" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "掘墓人" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "这正是我们需要的:更多的尸体。" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "盗墓人" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "嘿,如果它们在里面变成丧尸了呢?你总得检查一下。" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "葬礼" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "当数十亿人死无葬身之地时,被埋葬是一种特权。" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "送葬者" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "不要让任何人在活死人中腐烂。" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "殡仪馆" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "你总不可能埋葬整个世界,不是吗?" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "赛博朋克" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "Spiritus quidem promptus; caro vero infirma.(心有余而力不足)" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "发条人" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "以肮脏龌龊的匠人之手。我必对你们痛加报复……究竟做什么我现在还不知道,不过总是人间可怕之事。" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "进化人" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "旧人类的世界已经结束。新人类的世界万岁。" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "破碎而未被打败" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "你的医保能报这个吗?" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "自由贸易者" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "不寻常的小商品,低得骨折的价格!" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "自作自受的迪布勒" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "我的因纽特朋友,我把这冰块以这么低的价格卖给你,这可真是自作自受啊。" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "雄辩家" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "我们是朋友啊,不是吗?" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "三寸不烂之舌" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "传说你说服了一只丧尸浩克转身离开。" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "黑客" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "这个操作系统有个后门。总会有后门的。" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "还是比不上凯文" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "这不是作弊。这是调试。" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "实习医生" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "观众中有医生吗?" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "豪斯医生" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "这是狼疮。" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "工程师" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "把扳手递给我。" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "百战天龙马盖先" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "这一切都依靠信仰,口水和一卷胶带。" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "陷阱猎人" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "一个好的陷阱不会区分海狸和丧尸海狸。" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "扫雷" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "一切只要走错一步。" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "王牌司机" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "没有转不过的弯。" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "试替哥" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "一级方程式是为周日慢车司机们准备的。" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "游泳选手" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "像一条水里的鱼。" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "迈克尔·菲尔普斯" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "游得比大白鲨还快。" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "动手主义者" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "拿着这个,放进那个里面,瞧好了。" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "万能博士" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "只要给我适量的胶水,没有什么是我做不了的。" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "大厨" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "做一道蜜汁里脊真是易如反掌。" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "地狱厨房" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "今日菜单:法式洋葱汤,法式红酒炖牛肉和法式焦糖布丁。" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "裁缝" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "一根针,一根线,一个梦。" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "时装设计师" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "男性,女性和变种人时尚的定义者。" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "生存狂" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "生存是我的游戏。" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "贝尔·格里尔斯" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "所以你说你可以靠自己的尿液生存?" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "欧姆定律" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "雷霆欧姆。两伏特进,只有一伏特能出。抵抗是徒劳的。" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "尼古拉·特斯拉" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "人们不会局限于品尝9V电池的滋味的。" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "正中靶心" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "比莱格拉斯还准。" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "罗宾汉" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "威廉·退尔?没听过这号人物。" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "鹰眼" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "只有我和我的目标。" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "死亡射手" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "别跑了。你只会累着死去。" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "炮兵" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "口径就是正义。" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "火箭人" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "我要送你去月球。一块块。" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "细小但致命" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "当你成为被枪管指着的一方时,口径无所谓。" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "肮脏的哈里" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "但是这是一把 .44 马格南,世界上最厉害的手枪,能把你的脑袋打飞,你得问问自己:我走运吗?那么,你走运吗,混蛋?" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "步枪兵" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "这是我的步枪,无数支与其相同,但唯独这支属于我。我的步枪是我的挚友,它就是我的命,我必主宰它就如我主宰我的人生。" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "士兵" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" +"离开了我,我的步枪将一无是处;离开了我的步枪,我将一无是处。我将保证它时刻整洁并能随时战斗,就像我一样整洁并时刻准备战斗那样。我们将彼此成为互相的一部分,我们会……" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "双份火力,双倍快乐" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "当你想一枪击中你的目标九次的时候。" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "爱发先生" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "出什么事了,伙计?在打兔子吗?" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "扫射并祈祷" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "总会有一发击中目标的。这是个统计学的问题。" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "冲锋枪哒哒哒!" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "我们真的需要更多弹药。" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "耶!" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "然后它再也没回来。" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "科比·布莱恩特" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "扔手雷了!" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "斗殴大师" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "左手拿瓶子,右手拿椅子腿。" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "街头霸王" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "最重要是得赢,用什么招式不重要。" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "击球手" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "每一次挥棒落空都让我更接近下一个全垒打。" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "石器时代" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "棍棒是人类的第一个工具。而且也很可能是最后一个工具了,为什么不掌握它呢?" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "剑之道" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "剑一出鞘,人的激情就没有止境。" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "宫本武藏" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "剑不仅仅是一把简单的武器,它还是对生命意义问题的回答。" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "难以捉摸" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "拳头威力再大,打不中人也不可怕。" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "尼奥" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "但你能躲过子弹吗?" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "冷钢" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "当你在开派对的时候,我在研究刀刃。" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "开膛手杰克" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "在我面前摇晃着,它的柄对着我的手的,不是一把刀子吗?来,让我抓住你。" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "少林之路" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "我觉得我的拳头里有一支军队。" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "宫城先生" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "成为你自己的武器。" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "窃贼" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "撬棍?一点技术含量都没有。" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "开锁匠" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "如果有锁,就会有钥匙。" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "元素周期表" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "有点像烹饪。但别舔勺子。" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "海森堡" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "你们都知道我是谁。我就是毒师。说出我的名字。" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "准魔法师" @@ -86588,6 +88764,11 @@ msgstr "入侵" msgid "canceling activity serialized with legacy code" msgstr "终止由旧代码生成的操作" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "锻炼" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "核聚变电池" @@ -86889,6 +89070,10 @@ msgstr "喷雾式化学药剂" msgid "compressed air" msgstr "压缩空气" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "12.3ln 弹" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "纸壳弹" @@ -86941,10 +89126,6 @@ msgstr "液态汞" msgid "mana energy" msgstr "魔力" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "兴奋蒸汽" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "肾上腺素泵" @@ -88364,20 +90545,6 @@ msgstr "你的背上安装了一排像蝴蝶翅膀的可伸缩太阳能面板。 msgid "Wind Turbines" msgstr "风力发电机" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "精密焊接仪" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" -"你的手上配备了精确的焊接工具、钢丝钳和电缆线轴。它们太迷你了,不适用于制造大多数物品,但是在缺乏合适的机器的情况下,它们对于制造生化插件而言是必不可少的。" - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "榴弹发射器" @@ -88426,6 +90593,20 @@ msgid "" msgstr "" "你曾经为一些可怕的人工作过。那些人在你颅脑里安装了一个炸弹。他们现在都死了,但不幸的是,如果你30天内没向他们报告就会触发炸弹的自毁装置。你需要尽快把这玩意取出来。" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "精密焊接仪" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" +"你的手上配备了精确的焊接工具、钢丝钳和电缆线轴。它们太迷你了,不适用于制造大多数物品,但是在缺乏合适的机器的情况下,它们对于制造生化插件而言是必不可少的。" + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -88772,8 +90953,64 @@ msgstr "不杀死任何NPC。" msgid "Merciful" msgstr "仁慈" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "精灵之路" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "不砍树" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "智人" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "不安装生化插件" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "不安装故障生化插件" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "无变异" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "X-ray安检通过" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "血统纯正" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "结构完整" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "从未骨折" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "老师,放过孩子们把" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "从不提升技能等级" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "自愿当文盲" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "从不读书" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "全部" @@ -88922,7 +91159,7 @@ msgstr "移除窗户上的胶带" #: lang/json/construction_from_json.py msgid "Board Up Window" -msgstr "用木板封死窗户" +msgstr "用木板封窗" #: lang/json/construction_from_json.py msgid "Reinforce Boarded Window" @@ -89396,10 +91633,6 @@ msgstr "墙体漆黄色" msgid "Take Paint Off Wall" msgstr "墙体除漆" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "移除地毯" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "铺红色地毯" @@ -89440,6 +91673,30 @@ msgstr "建造木楼梯" msgid "Mine Upstair" msgstr "建造上行矿梯" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "建造混凝土斜坡底部" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "建造一个通往上层的混凝土坡道,需要在上层建造对应的通往本层的坡道。坡道顶部需要与底部相邻,这样才能在两层之间来回移动。" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "建造混凝土斜坡顶部" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "建造一个通往下层的混凝土坡道,需要在下层建造对应的通往本层的坡道。坡道顶部需要与底部相邻,这样才能在两层之间来回移动。" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "开始车辆建造" @@ -91257,7 +93514,7 @@ msgstr "你骑着动物。" msgid "You mount your steed." msgstr "你骑上你的坐骑。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "着火" @@ -92430,7 +94687,7 @@ msgstr "你抽了几口。" msgid "You smoked too much." msgstr "你抽得有点多。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "亢奋" @@ -93722,70 +95979,6 @@ msgstr "你被口香糖黏住了!" msgid "The gum webs constrict your movement." msgstr "口香糖网限制了你的行动。" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "调试" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" -"你正在调试游戏!\n" -"一切都会变得正常了吧。" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "深入你的内心代码,你会找到一只橡皮鸭,然后向它反复解释到死。" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "充分优化" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "调试最大最小值" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "拥有做坏人的所有好处,而没有做好人的任何缺点!" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "你觉得自己体内指标就像是面对哈哈镜时一样被拉紧。" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "喔噢" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "瓦特?" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "哇噢!" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" -"一切都太紧张了,我的伙计!\n" -"你感到困惑和迷失。" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "!!紧张紧张,刺激刺激!!" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "你和你的同伴" @@ -93970,6 +96163,17 @@ msgid "" " the kind words used about them." msgstr "沃特利家族是新英格兰一个守旧的怪人家庭。用怪人来形容他们算是说他们的好话。" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "沼泽教及下属酒店和赌场" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "一群富有但神秘的教会信徒和娱乐大亨,他们对恐龙有着某种浓厚的爱慕之情。他们欢迎所有未受污染的人类。" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "上古遗存" @@ -94502,6 +96706,18 @@ msgstr "火焰" msgid "raging fire" msgstr "烈焰" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "灭火剂薄雾" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "灭火剂喷雾" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "灭火剂浓雾" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "碎石残留" @@ -95528,8 +97744,7 @@ msgid "" msgstr "一个常见的家具,用于在室内安全地生火,还有一个烟囱将烟雾排出到室外。但在点燃时单独离开也可能会导致危险。" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "撞击声!" @@ -95698,7 +97913,7 @@ msgid "" msgstr "一大堆树叶,如果你不在乎舒适和温暖,你可以睡在上面。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "嘎嚓!" @@ -96347,10 +98562,9 @@ msgstr "健身器" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." -msgstr "一套沉重的用于力量训练的举重设备,一对杠铃片固定在一根结实的钢管两端。重量相当可观,在没有辅助观察者的情况下使用它们很容易对自己造成重伤。" +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." +msgstr "一套沉重的用于力量训练的举重设备,一对杠铃片固定在一根结实的钢管两端。你可以手工挑选自己所想使用的重量来调整设备。" #: lang/json/furniture_from_json.py msgid "ball machine" @@ -96440,6 +98654,18 @@ msgid "" " to be scavanged." msgstr "一台锻炼身体的机器,有一套手柄和滑板,用来模拟划船。如果没有供电,它就不能运行,但它可能有一些能回收的有用零件。" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "机械划船机" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "一台锻炼身体的机器,有一套手柄和滑板,用来模拟划船。这台是旧型号,使用机械调整阻力,不需要供电就可以使用。" + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "跑步机" @@ -96452,6 +98678,19 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "一根带控制面板的电动传送带。没有动力,想再让皮带动起来会是巨大的挑战。不管怎么说,你自己可能已经进行了足够多的有氧运动了。" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "重力跑步机" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" +"一台带有机械控制面板的重力驱动跑步机,可以让你在原地锻炼身体。跑步机的传送带很陡峭,但倾斜角度可以手动调节,所以它能在你的体重作用下向后滚动。" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "训练沙袋" @@ -97721,10 +99960,6 @@ msgstr "一个用于煅烧粉末状焦炭石灰混合物来制取电石的电弧 msgid "filled arc furnace" msgstr "电弧炉(满)" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "烟熏架" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -98054,6 +100289,79 @@ msgid "" "temperature. You'll need to take it down first." msgstr "这台冰箱经过了进一步的整修,可在更低的温度下运行。你得先把它取下来。" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "休眠舱" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "这是一个带有恒温控制机构的休眠舱。在密集的城市环境中降低能源成本的简单方法。" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "低温休眠舱" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "这是一个长期休眠舱。低温休眠舱主要是用来等待器官的病人或是供罪犯躲避犯罪后的热度。" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "CRISPR生物实验室" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "一个方形的装置,由各式机械臂、滴管和吸管组成。它被用于大灾变前的基因编辑实验之中。" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "3D打印机" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "这台方形设备用于产品原型的快速迭代和普通大众的娱乐使用。" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "神经网络植入器" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" +"这个设备看起来像是某种梦魇般的牙科设备和安装在滑槽上的套管工具的混合体,滑槽可以精确地控制套管落下的位置。对于那些需要将精细物品放入难以触及的空间的手术很有用。" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "单分子锯" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" +"一根像奶酪刀那么大的线在这台机器中单向运行,能以任何角度进行原子级别的精确切割。即使没有动力,刀头周围几英寸范围内的物体也会有些视觉畸变扭曲,以防止你意外失去一只手。如果不先摧毁刀头,你无法拆解这台设备。" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -98401,7 +100709,8 @@ msgstr "射出酸液球的假枪。" msgid "auto" msgstr "自动" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "步枪" @@ -98423,8 +100732,7 @@ msgid "" " a double barrel shotgun." msgstr "一把自制三管枪械,一根枪管用来发射 .30-06 口径步枪子弹,另外两根则用来发射霰弹。它是用从双管猎枪上拆下来的部件和钢管制成的。" -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "霰弹枪" @@ -98572,7 +100880,8 @@ msgid "" "standard UPS." msgstr "一款自制的激光手枪,设计灵感源自于21世纪中期的V29激光手枪。虽然只是各类由胶带简单固定在一起电子原件,它依旧可以使用标准的UPS供能。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "手枪" @@ -98633,7 +100942,7 @@ msgid "" "deadly." msgstr "一把可以连续发射的气动突击步枪,采用废料自制而成。极度安静而致命。" -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "半自动" @@ -99057,9 +101366,9 @@ msgid "" msgstr "一把采用经典 AR-15 步枪设计,结构紧凑,使用7.5英寸长枪管的手枪,商业宣传上主要将它当作家庭防御武器销售。" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" -msgstr[0] "MAS 223 步枪" +msgid "MAS .223" +msgid_plural "MAS .223" +msgstr[0] "MAS .223 步枪" #: lang/json/gun_from_json.py msgid "" @@ -101330,20 +103639,20 @@ msgstr "" "以制造廉价武器而知名,其生产的武器常常体积巨大且使用不便。Hi-Point 制造的枪械的套筒由锌合金制成,相比钢制套筒来说比较脆弱。" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" -msgstr[0] "CZ-75 手枪" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" +msgstr[0] "CZ-75 B 手枪" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " "pistol remains wildly popular among competition shooters." msgstr "" -"CZ-75 " +"CZ-75 B " "手枪是一种由捷克斯洛伐克研制的半自动手枪。尽管是为出口至西方国家而设计,这个设计却在当时被列为了国家秘密。由于缺乏国际专利保护,全世界都开始了这种型号或衍生型号的生产和销售,而最初设计该型号的乌尔斯基·布罗德兵工厂直到二十世纪八十年代才开始境内的销售。这种手枪仍在射击比赛中被广泛使用。" #: lang/json/gun_from_json.py @@ -101451,6 +103760,40 @@ msgstr "" "一把后部装弹式双枪管组合枪,枪上方一条 .30-06 " "口径子弹带膛线枪管,下方有两根装载12号霰弹的滑膛枪管。这种枪历史上曾经在非洲被那些贪心不足的偷猎者们用来射杀大小动物,而现在则被新英格兰的那些狂妄的装逼犯们拿来装逼。" +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "PA Md. 68 战斗步枪" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" +"在所有使用 12.3ln 弹的枪械中,最受欢迎的的枪当然是PA Md. 71 步枪。作为它的前身,PA Md. 68 " +"战斗步枪被许多人认为是某种程度上的失败品:虽然它非常可靠而且威力强大,但它太重了,不是一把好的步兵武器,但又不足以成为一把好的支援武器。尽管如此,它仍然被大量制造,在随后到来的丧尸末日之中,作为一种弹药很容易获得的轻型炮塔枪,受到了人们的再次青睐。而且它完全符合流放族的需求,它们对这把枪械不灵活的使用条件不太在意。" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "PA Md. 71 丧尸狩猎步枪" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" +"这款极受欢迎的罗马尼亚突击步枪,在第三次喀尔巴阡山战争中闻名于世,被流放族略微修改了设计,作为狙击武器使用。它非常适合用来精确狙击优先目标。改进后的设计能够非常快速地射出5连发,完全粉碎目标防止其复活。" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -101959,6 +104302,17 @@ msgstr "" "温彻斯特 1897 " "霰弹枪是首批在商业上成功的泵动霰弹枪之一。它的\"堑壕战\"型号已经成为一个高度浪漫化的一战美国象征。它的枪套、刺刀卡口和17英寸长的刺刀,无可否认,让这把霰弹枪看上去十分骇人。现在已经没有战壕需要清理,但来个充满丧尸的城镇也足够了。" +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "自制“四风”霰弹枪" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "一把自制的简易霰弹枪,由两根厚钢管、一个后盖和一根钉子组成。由于缺乏瞄具,这把武器只能在近距离使用。" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -102591,6 +104945,33 @@ msgstr "一把仍安装在\"幽灵怪\"机器人的一只机械手上的三管 msgid "trilaser" msgstr "三管激光" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "生化头骨枪" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "通过生化插件植入你头骨的单发伸缩式手枪。" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "改装马林 39A 步枪" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "一把经过改装的马林 39A 步枪,可以被安装在炮塔上使用。" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "改装 SKS 步枪" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "一把经过改装的 SKS 步枪,可以被安装在炮塔上使用。" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -103444,20 +105825,6 @@ msgstr "一把魔法生成的华丽反曲弓。由结实而有弹性的木料制 msgid "Fake gun that fires barbed javelins." msgstr "射出带刺标枪的假枪。" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "测试用现代复合弓" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "测试用格洛克手枪" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "一把测试用的格洛克手枪,数据基于格洛克9mm手枪。" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -105239,15 +107606,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "在你的枪上安装一个使用魔力结晶发光的蓝点瞄具以取代机械瞄准具。提高命中率,增加重量。" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "测试用消音器" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "测试用的消音器模组。" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "你把鱼掏除内脏并切成片" @@ -105262,6 +107620,12 @@ msgid "" " experiment" msgstr "你尝试从这失败的实验体中搜寻还能再次使用的生化插件" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "你尝试从这具血肉和金属混合的怪物中搜寻还能再次使用的零件" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -105275,8 +107639,34 @@ msgid "" msgstr "你笨手笨脚地将这一大块融合的腐烂肉块砍开,并小心观察是否有什么突出的特殊物品。" #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "你费力地解剖了这只体型巨大的昆虫。" +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "你费力地解剖了这只体型巨大的昆虫。" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" +"在剥皮时,你发现这只生物的甲壳上的附带的昆虫毛发看起来更像是小羽毛。里面是一团气泡状组织构成的气囊,看起来像是漂浮在空中,这与你所知道的真正的蜜蜂解剖结构不符。" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" +"在这种生物的甲壳下面,有一层薄薄的毛茸茸的皮肤一样的薄膜,上面覆盖着血管。里面是一团气泡状组织构成的气囊,看起来像是漂浮在空中,这与你所知道的真正的黄蜂解剖结构不符。" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -107341,10 +109731,6 @@ msgstr "书写" msgid "Teleport yourself" msgstr "传送自己" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "扑灭火焰" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "擦干/清理自己" @@ -107743,6 +110129,13 @@ msgstr "这种装备会让你难以稳定重心。穿着时被击中可能会让 msgid "This item can be used to communicate with radio waves." msgstr "通过这件物品可以进行无线交流。" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "这件物品可以 无消耗 开锁。" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -108576,6 +110969,14 @@ msgstr "离开创建角色选单" msgid "Toggle sorting order" msgstr "切换排序顺序" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "随机生成职业" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "随机生成场景" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "向上滚动描述" @@ -108976,6 +111377,10 @@ msgstr "拆解物品" msgid "Sleep" msgstr "睡觉" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "锻炼" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "控制载具" @@ -109449,12 +111854,12 @@ msgstr "读取配色模板" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "是" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "否" @@ -110025,6 +112430,15 @@ msgstr "丧尸陷阱" msgid "Zombie trap." msgstr "这里有个吸引丧尸的陷阱。" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "芦苇" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "一种水生植物。" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -111339,6 +113753,11 @@ msgid "" "years.'" msgstr "沃特利家族殡仪馆服务。已为新英格兰服务了三百年。" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "恐龙实验室手术中心控制台" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "无流派" @@ -111508,7 +113927,7 @@ msgid "" msgstr "" "你通过反复移动来变得更加难以击中。\n" "\n" -"闪避技能+1。\n" +"闪避技能 +1。\n" "持续 1 回合,可叠加 2 次。" #: lang/json/martial_art_from_json.py @@ -111606,7 +114025,7 @@ msgid "" msgstr "" "你的持续不停的舞步使你在战斗时异常灵巧。\n" "\n" -"闪避技能+1,闪避次数+1。" +"闪避技能 +1,闪避次数 +1。" #: lang/json/martial_art_from_json.py msgid "Capoeira Momentum" @@ -111624,10 +114043,29 @@ msgid "" msgstr "" "你能感受到你移动的节奏。你不仅更加难以击中,你的脚法也变得更加炫酷!\n" "\n" -"闪避技能+1。\n" +"闪避技能 +1。\n" "解锁“回旋踢”和“扫堂腿”。\n" "持续 3 回合。" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "巴西战舞节拍" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" +"你从不击空,这只是舞蹈的一部分,而最棒的部分即将开始!\n" +"\n" +"+15% 钝击伤害。\n" +"持续 2 回合。可叠加 3 次。" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "鹤形拳" @@ -111807,6 +114245,27 @@ msgstr "" "\n" "命中+2。" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "卡力连击" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +"机会出现之时,你能在暴击之后连上一招更强的攻击。\n" +"\n" +"+15% 所有伤害。\n" +"解锁“组合连击”招式。\n" +"持续 3 回合。可叠加 3 次。" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "击剑" @@ -111848,6 +114307,42 @@ msgstr "" "\n" "被格挡的伤害按敏捷的 50% 减少。" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "招架" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" +"由于你的招架,你的下一次攻击更容易命中敌人。\n" +"\n" +"命中 +1。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "二次进攻" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"你的佯攻是下一次致命一击的完美准备!\n" +"\n" +"命中 +1。\n" +"解锁“复杂进攻”招式。\n" +"持续 1 回合。" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -111903,6 +114398,42 @@ msgstr "" "格挡次数-2,闪避技能+1,所受格挡伤害按力量的 50% 增加。\n" "持续 1 回合。" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "防御反击" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"每一个成功的阻挡都会暴露出你对手防守的漏洞。\n" +"\n" +"命中 +1。\n" +"持续 1 回合。可叠加 3 次。" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "战术佯攻" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" +"他们被你的佯攻给骗了!\n" +"\n" +"解锁“勾拽”招式。\n" +"持续 1 回合。" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "柔道" @@ -112094,7 +114625,7 @@ msgid "" msgstr "" "你就像猫一样动作敏捷,难以被抓住。\n" "\n" -"闪避技能 +1.0。" +"闪避技能 +1。" #: lang/json/martial_art_from_json.py msgid "Leopard's Stalk" @@ -112178,6 +114709,40 @@ msgstr "" "\n" "格挡次数 +1,格挡后的伤害按力量的 50% 减少。" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "偏斜格挡" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"你偏斜格挡了敌人的攻击,现在可以反击敌人了!\n" +"\n" +"解锁“横扫攻击”和“雷霆一击”招式。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "杀心四起" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"你的强力一击给了你结束这场战斗的机会!\n" +"\n" +"解锁“要害攻击”招式。\n" +"持续 1 回合。" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "泰拳" @@ -112220,6 +114785,25 @@ msgstr "" "\n" "格挡后的伤害按力量的 50% 减少。" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "坚定决心" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" +"受到攻击并不会减慢你的速度。你能比你的对手撑得更久,从而赢得这场比赛。\n" +"\n" +"钝击伤害按 力量 的 25% 增加,格挡后伤害按 力量 的 50% 降低。\n" +"持续 5 回合。" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "忍术" @@ -112293,9 +114877,45 @@ msgid "" msgstr "" "忍者训练注重敏捷和灵活。\n" "\n" -"+1 闪避技能,命中率按敏捷的 20% 提升。\n" +"闪避技能 +1,命中按敏捷的 20% 提升。\n" "持续 1 回合。" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "失去奇袭" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" +"你的意图已经被人发现了!你需要过一阵子才能再次偷袭。\n" +"\n" +"-50% 所有伤害。\n" +"持续 3 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "逃脱计划" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" +"你的目标已经死了。是时候逃离并计划下一次攻击了。\n" +"\n" +"闪避次数 +2,移动速度 +10。\n" +"持续 3 回合。" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "二天一流" @@ -112360,9 +114980,9 @@ msgid "" msgstr "" "暗如黑夜\n" "魑魅魍魉,四面袭来\n" -"快跑!\n" +"速速逃离!\n" "\n" -"-5.0 闪避技能。\n" +"闪避技能 -5。\n" "持续 1 回合。" #: lang/json/martial_art_from_json.py @@ -112380,13 +115000,58 @@ msgid "" "Enables \"In-One Timing\".\n" "Lasts 1 turn." msgstr "" -"幸有此光\n" +"幸有此光,\n" "于此暗夜\n" "有如月洒清辉\n" "\n" "解锁\"闪现突攻\"。\n" "持续 1 回合。" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "落叶" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"利刃已出鞘,\n" +"然则万物随时间消逝。\n" +"唯忍得以精进此术。\n" +"\n" +"闪避技能 -1,钝击伤害 -1,斩击伤害 -1。\n" +"持续 1 回合。可堆叠 5 次。" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "宁静" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" +"风暴之眼,\n" +"安宁须臾,\n" +"旋即消失无踪。\n" +"\n" +"命中 +2,闪避技能按 感知 的 50% 增加。\n" +"持续2回合。" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "古希腊搏击" @@ -112558,6 +115223,25 @@ msgstr "" "\n" "命中按感知的 25% 增加,同时按敏捷的 25% 减少。" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "蛇之盘绕" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" +"每条蛇都会等待完美一击的时刻的到来。当你的对手分心时,毫无怜悯地攻击他们的弱点!\n" +"\n" +"命中 +1,护甲穿透按 感知的 50% 增加。\n" +"持续 1 回合。可叠加 3 次。" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "日本枪术" @@ -112735,6 +115419,25 @@ msgstr "" "命中率按感知的 20% 增加,钝击护甲穿透按感知的 50% 增加。\n" "持续 2 回合。" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "十字手" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" +"通过花点时间为自己下一步招式做准备,你可以充分利用全身来攻击和防守。\n" +"\n" +"闪避技能 +1,格挡后伤害按感知的50%减少。\n" +"解锁“拗步掌”和“双按掌”招式。持续 3 回合。" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "虎形拳" @@ -112796,6 +115499,25 @@ msgstr "" "\n" "命中按力量的 25% 增加,同时按敏捷的 25% 减少。" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "虎之怒" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" +"你的对手输了就是你赢了。你的下一击能够击破对手的防御。\n" +"\n" +"护甲穿透按力量的50%增加。\n" +"持续 1 回合。可叠加 2 次。" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "咏春" @@ -112855,7 +115577,25 @@ msgid "" msgstr "" "你对平衡和技巧有更深的理解。这让你能更好地躲开你的对手的攻击。\n" "\n" -"闪避技能按感知的 15% 增加。格挡伤害按感知的 50% 减少。" +"闪避技能按感知的 15% 增加。格挡后伤害按感知的 50% 减少。" + +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "咏春标指" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" +"通过完美地应用插指的招式,你可以打击对手的弱点,迫使他们后退,然后跟进一击!\n" +"\n" +"命中按感知的20%增加,解锁“直拳(击退)”和“左勾拳(击退)”招式。\n" +"持续2回合。" #: lang/json/martial_art_from_json.py msgid "Zui Quan" @@ -112986,6 +115726,34 @@ msgid "" "armor, +Perception fire armor." msgstr "+力量 钝击防护,+敏捷 酸液防护,+智力 电击防护,+感知 火焰防护。" +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "我怒了" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "别让我抓住你…… +2 钝击伤害。持续 2 回合。可叠加 5 次。" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "闪电攻击" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "闪电能击中两次。+感知 电击伤害。持续 3 回合。可叠加 2 次。" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "你着火了!+5 火焰伤害。持续 5 回合。" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "生化格斗术" @@ -113031,6 +115799,28 @@ msgstr "" "\n" "格挡次数+2,命中+1。" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "优化" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" +">10 锁定目标\n" +">20 击杀目标\n" +">30 GOTO 10\n" +"\n" +"命中 +1,所有伤害 +2。\n" +"持续 3 回合。可叠加 3 次。" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "蜈蚣拳" @@ -113072,6 +115862,24 @@ msgstr "" "移动耗时-4。\n" "持续 3 回合。可叠加 4 次。" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "蜈蚣毒" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" +"你的毒液是你的对手永远无法忘却的长久苦痛。\n" +"\n" +"+2 钝击伤害。\n" +"持续 2 回合。" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "壁虎功" @@ -113130,8 +115938,8 @@ msgid "" msgstr "" "通过简单地攀爬、跳跃或推开附近的墙壁,你可以避开对手最严重的攻击。\n" "\n" -"紧邻墙壁时 +3.0 闪避技能。\n" -"紧邻墙壁时解锁\"壁虎之尾\"及\"壁虎墙反\"招式。" +"紧邻墙壁时闪避技能 +3。\n" +"紧邻墙壁时解锁“壁虎扫尾”及“壁虎墙反”。" #: lang/json/martial_art_from_json.py msgid "Lizard's Leap" @@ -113209,10 +116017,28 @@ msgid "" msgstr "" "向前冲,抓住你的猎物!\n" "\n" -"所有伤害 +10%。\n" +"+10% 伤害。\n" "解锁“巨螯击”。\n" "可叠加 2 次。持续 2 回合。" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "蝎之威慑" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" +"没有什么比一只被激怒的蝎子更可怕的了。你的攻击可以威吓你的敌人。\n" +"\n" +"闪避次数 +1。\n" +"持续 1 回合。" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "蛤蟆功" @@ -113272,6 +116098,42 @@ msgstr "" "-1 钝击/斩击/刺击防护。\n" "持续 6 回合。可叠加 6 次。" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "蛤蟆冥想功" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" +"通过集中注意力,你可以增强你的铁布衫的力量。\n" +"\n" +"+3 钝击/斩击/刺击防护。\n" +"持续 2 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "蛤蟆毒" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" +"你的毒液只不过是你的铁布衫威力的又一课。\n" +"\n" +"+2 钝击伤害。\n" +"持续 5 回合。" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "毒蛇功" @@ -113327,7 +116189,7 @@ msgid "" msgstr "" "你的闪避能力使你的对手很容易受到痛苦的伤害。\n" "\n" -" 解锁\"毒蛇疯咬\"。\n" +"解锁“毒蛇疯咬”。\n" "持续 1 回合。" #: lang/json/martial_art_from_json.py @@ -113641,6 +116503,42 @@ msgstr "" "闪避次数+1\n" "持续 1 回合。可叠加 2 次" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "神行" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" +"在眨眼间,你已经移动。你的速度、反应、以及自信让你可以快速而勇敢的移动,让对手猝不及防。\n" +"\n" +"+50 速度。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "精神御体" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" +"你的训练和精神力让你可以用专注力克服肉体的威胁。\n" +"\n" +"命中 +1。\n" +"持续 1 回合。可叠加 2 次。" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "海拉尔剑术" @@ -113751,6 +116649,51 @@ msgstr "" "-25%行动耗时。\n" "持续 1 回合。" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "蓄力" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" +"花点时间准备,你可以释放出一记威力强大的回旋斩!\n" +"\n" +"+20% 伤害,解锁“回旋斩”招式。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "铁心" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" +"对剑术的绝对掌握是铁心流派修炼的目标。通过不断的训练和学习,一名铁心高手能用手中的武器展现出超人般的技能。铁心流派的招式大都是不可思议的武术技巧,它用钢铁编织出的图案让人晕眩、迷惑,最终杀死毫无抵抗的敌人。" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "你清空内心的恐惧并站直身体。" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "%s 摆出了一个勇敢无畏的姿势。" + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "机甲术" @@ -113810,6 +116753,467 @@ msgstr "" "钝击护甲穿透+5。\n" "持续 2 回合。" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "口袋铁拳" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" +"“口袋铁拳”是从著名的宝可梦系列电子游戏发展而来的一种奇怪的武术流派。不知怎的,一群热心的粉丝设法将各种精灵宝可梦中的招式与拳击、空手道等多种现有武术结合起来。令人惊讶的是,它确实有效。有人甚至会说这是一种效果拔群的战斗方式。" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "你准备好战斗了。" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "%s 准备好和人战斗了。" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "持久力" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" +"受到攻击时,你的防御会提高。\n" +"\n" +"钝击/斩击/刺击防护按力量的50%提升。\n" +"持续3回合。" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "狙击手" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" +"击中要害时,威力会变得更强。\n" +"\n" +"+50% 伤害。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "自信过度" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" +"如果打倒对手,就会充满自信,攻击会提高。\n" +"\n" +"+50% 伤害。\n" +"持续 3 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "暮日" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" +"暮日派教导门徒借力打力。随着姿态的快速转变和精心瞄准的攻击,依靠着四两拨千斤的巧劲,暮日派的武道家可以让向自己冲锋的敌人失去重心翻滚向另一个方向。" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "你调整重心,准备好防御自己。" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "%s 调整重心,摆出了一个新姿势。" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "千幻防御" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" +"你单脚半蹲,手放在顶门。你的对手犹豫着,没法确定该如何攻击这种诡异的架势。\n" +"\n" +"闪避技能按智力的20%提升,解锁“暮日投”和“穿云投”。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "伪装破绽" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" +"你向你的目标露出好像是致命的破绽,但却轻易地避开,并在同时让对手为轻率的进击付出代价。\n" +"\n" +"+20 速度。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "锡秋剑法" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" +"锡秋剑法,“沙拉克之路”是绝地武士从金属武器向光剑过渡期间发展起来的第一种光剑战斗流派。锡秋剑法被认为是所有绝地武士在学习了解武装战斗基本知识时使用的训练剑法。锡秋剑法擅长对抗多名敌人,但缺乏其他光剑流派的攻击力。" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "你一只脚后退,把你的武器竖直握在你的主手侧。" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "%s 一只脚后退,把武器竖直握在主手侧。" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" +"你是一名坚定的战士。你内心的平静有助于你击中敌人并保护自己。\n" +"\n" +"格挡后的伤害按力量的100%减少,命中+1。" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "实习训练" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"你对锡秋剑法的训练教你如何与多个对手作战。\n" +"\n" +"格挡次数+1,格挡效果+1。" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "武士训练" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"你对锡秋剑法的进一步训练提高了你与多个对手作战的能力。\n" +"\n" +"格挡次数+1,格挡效果+1。" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "大师训练" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" +"作为一名锡秋剑法大师,你对抗多个敌人的能力无人能敌。\n" +"\n" +"格挡次数+1,格挡效果+1。" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "石龙" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "石龙流专注于力量,威力以及强壮。它传授了武技学徒在一击间破金裂石的威力。石龙的防御则注重于将对手的攻击的破坏力转嫁到大地上。" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "你将脚后跟扎入土中,稳住自己。" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "%s 将脚后跟扎入土中。" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "石铸身躯" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" +"你聚集你的武器打中对手时产生的能量来强化自己的防御,这使你在面对接下来的反击时立于不败之地。\n" +"\n" +"+1 钝击/斩击/刺击防护。\n" +"持续 1 回合。可叠加 5 次。" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "坚如磐石" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" +"你将重心沉向下盘,将大地之力转化为自身的抗力。然而,移动太多会破坏你的姿势。\n" +"\n" +"+10% 伤害,+2 钝击/斩击/刺击防护。" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "裂石" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" +"移动太多会破坏坚如磐石的效果。站稳了别动,不要破坏了你的姿势!\n" +"\n" +"解锁“碎石”。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "碎石" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" +"你完全无法保持坚如磐石的姿势,必须停止移动一段时间以重新获得增益。\n" +"\n" +"-10% 伤害,-2 钝击/斩击/刺击防护。\n" +"持续 4 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "铁布衫" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" +"每当你成功攻击敌人,你就能进入冥想状态,使你近乎无懈可击。\n" +"\n" +"+5 钝击/斩击/刺击防护。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "虎爪" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" +"虎爪流派信奉潜伏在其门徒的内心之中的狂暴怒火。在战斗中,这些战士像野兽一样咆哮,用类似于野蛮人的怒火攻击,依靠势不可挡、凶残的攻击来击败他们的敌人。" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "你发出低沉的咆哮,准备好作战。" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "%s 像一只野兽一样蹲下。" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "精通重击" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" +"总是全力打击。除非你想死,否则永远不要限制自己。\n" +"\n" +"+5% 暴击几率。" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "猛扑冲锋" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" +"伴随着野兽般的咆哮,你自己投身进入了这场打斗中。先发制人,一击致命。\n" +"\n" +"命中 +2,+10% 伤害。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "落难猎手" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" +"一只走投无路的捕食者是可怕而危险的生物。你也一样。\n" +"\n" +" -20% 移动耗时。\n" +"持续 1 回合。" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "嗜血" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" +"血腥的气味驱使着你狂怒地攻击。你想要更多。现在!\n" +"\n" +" 命中 +1,+15% 伤害。\n" +"持续 1 回合。可叠加 2 次。" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "弱肉强食" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" +"你像扫过羊群的狼一样收割弱者的生命。\n" +"\n" +"+30 速度。\n" +"持续 2 回合。可叠加 2 次。" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "酒精" @@ -114293,7 +117697,7 @@ msgid "Emulsified Hydrogel" msgstr "乳化水凝胶" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "碎浆的" #: lang/json/material_from_json.py @@ -114324,7 +117728,7 @@ msgstr "收集些骨头带给布丽吉特·拉克鲁瓦。8根应该就够了。 msgid "There is always work to be done, song to be woven." msgstr "总有做不完的事,总有编不完的歌。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -114332,16 +117736,16 @@ msgid "" " you." msgstr "如果你希望踏上觉悟之路,首先你必须学会倾听和聆听这首歌。去外面杀一头生物,感受在你指尖之间的力量。然后把骨头带来,我能为你雕些东西。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "太好了。现在请出发上道吧。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "我理解你的固执。当你见证真道之后,随时可以回来。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -115565,7 +118969,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "到时候见……或者不见,然后我就知道不跟你是对的了。" #: lang/json/mission_def_from_json.py @@ -115574,7 +118978,7 @@ msgid "" msgstr "别死了就行。如果你还得找我问才知道的话,那对你来说可不是什么好消息。" #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." +msgid "Well, you're not dead… yet." msgstr "哦,你还没死呢。" #: lang/json/mission_def_from_json.py @@ -116011,7 +119415,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "你能找到我儿子让他回来吗?" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "谢谢你。" @@ -116296,7 +119700,7 @@ msgstr "黛西" #: lang/json/mission_def_from_json.py msgid "Find 10 3L jars" -msgstr "收集 20 个3L玻璃罐" +msgstr "收集 10 个3L玻璃罐" #: lang/json/mission_def_from_json.py msgid "I could use some help scavenging." @@ -116304,9 +119708,9 @@ msgstr "我需要有人帮我找点东西。" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." -msgstr "我们需要些 3L 玻璃罐来腌制我们的作物。你能帮我找 20 个吗?作为谢礼我会给你一些腌菜。" +msgstr "我们需要些 3L 玻璃罐来腌制我们的作物。你能帮我找 10 个吗?作为谢礼我会给你一些腌菜。" #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve foods while we can." @@ -118080,6 +121484,87 @@ msgstr "是啊,当然了。" msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "好吧,我只能自己去找金子了,算我自讨没趣。" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "激活降噪程序" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "调查Hub 01附近的无线电塔,寻找干扰源,并解决问题。" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "几天前,我在附近无线电塔里安装了一台无线电发射机,但它最近停止工作了。如果你愿意在我检查时帮我一把,我会欠你一个大人情的。" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "好吧,我们走吧。你不介意我去侦察一下,对吧?" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "谢谢你的提议,我想还是算了吧。" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "我相信我们一到那里就会想出办法的。无论如何,一定要先开枪。" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "你觉得我们解决问题了吗?" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "看起来问题解决了。我们快点回HUB吧。" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "好吧,算我自讨没趣。" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "返回 HUB 01" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "返回 HUB 01。" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "我们快点回HUB吧。" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "呃……" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "你随身不带地图的吗?我可会带,你或许也应该这么做。" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "我们到了吗?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "谢谢你帮我。就像我之前说的,我欠你一个人情。" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "你迷路了还是怎么了?" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "不敢相信我们迷路了……" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "制造 2 个蒸馏器" @@ -119368,6 +122853,54 @@ msgstr "让我们看看我们能从这些宝贝身上得到些什么改进。" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "你不给我带来这些东西我可当不成弗兰肯斯坦医生。" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "收集些肉带给博·巴罗尼克斯。8块应该就够了。" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "大食客们饿了,他们需要肉。" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "如果你想给大食客们喂食,你的工作就会得到回报。去外面,屠宰一只纯种动物。不是假食者,肉必须是可以吃的。然后把肉给我,我去拿给大食客们。" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "太棒了。大食客们必将进食。" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "明白了。大食客们总会找到方法进食的。" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "最近一阵子一些生物被伪神触碰过,变得又大又危险,产生了被污染的变异肉。这些肉不能给大食客,它必须是真正的肉。" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "你带肉来了吗?" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "大食客们必将进食。" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "大食客们必将进食,我确信。" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "我没看到肉。森林和沼泽里都有肉在等着大食客们。" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "取回魔法书" @@ -120121,12 +123654,12 @@ msgstr "你将机甲的腿部电机功率设置为最高挡。" #. ~ Failure to switch to this move mode, no steed #: lang/json/move_modes_from_json.py msgid "You're too tired to run." -msgstr "你力竭了,无法奔跑。" +msgstr "你太累了,无法奔跑。" #. ~ Failure to switch to this move mode, animal steed #: lang/json/move_modes_from_json.py msgid "Your steed is too tired to go faster." -msgstr "你的马太累了,跑不动了。" +msgstr "你的坐骑太累了,无法奔跑。" #. ~ Failure to switch to this move mode, mech steed #: lang/json/move_modes_from_json.py @@ -121687,6 +125220,23 @@ msgid "" "footing." msgstr "你的腿部肌肉与协调能力更加出色,可以比别人走、跑得更快,俗称\"健步如飞\"。你步行的速度增加15%。" +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "反射式发光器" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "你的头上长出了一个发光器。你不能自主控制它,它可能会随着你的情绪或生理状态而自行发光。" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "反射式发光器(开)" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "弱发光器" @@ -121699,15 +125249,52 @@ msgid "" "mating season." msgstr "从你的额头上长出一个发光器官,你可以使它发出微光。这将使你在黑暗中非常明显,很适合在交配季节吸引伴侣。" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "弱发光器(开)" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "你额头上的发光器官正在发出柔弱的微光。" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "发光器" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." msgstr "你额头上的发光器官现在能发出强光。" +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "发光器(开)" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "你额头上的发光器官正在发出强光。" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "正常人" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "你现在是个正常人,没什么问题。不用担心。" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "猛兽形态" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." +msgstr "莫名的愤怒充满了你的头脑,你脑子里一团糟,但你感觉自己很强大。" + #: lang/json/mutation_from_json.py msgid "Good Hearing" msgstr "听觉发达" @@ -121800,10 +125387,12 @@ msgstr "快速自愈" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." -msgstr "睡眠时你恢复得比普通人更快,甚至在不睡觉的时候也会少量恢复HP。" +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." +msgstr "你的伤口比平时愈合得更快。伤口在睡眠时恢复速度提升50%,在清醒时提升20%。你折断的四肢愈合速度也是正常人的两倍。" #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -122430,8 +126019,11 @@ msgstr "慢速自愈" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." -msgstr "你的恢复速度比大多数人要慢一些;你通过睡眠恢复的HP比普通人要少一些。" +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." +msgstr "你的伤口愈合得比大多数人都慢。伤口在睡眠时恢复速度以及折断的四肢的愈合速度是正常人的75%。" #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -122439,10 +126031,11 @@ msgstr "自愈弱化" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." -msgstr "你的机体自愈能力严重受损,你通过睡眠所恢复的HP只有常人的三分之一。" +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." +msgstr "你的机体自愈能力严重受损。伤口在睡眠时恢复速度以及折断的四肢的愈合速度是正常人的33%。" #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -122450,10 +126043,11 @@ msgstr "自愈无效" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." -msgstr "你身上的伤口几乎无法通过睡眠治愈,你通过睡眠所恢复的HP只有常人的十分之一。" +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." +msgstr "伤口对你来说是非常危险的,因为它们几乎无法愈合。伤口在睡眠时恢复速度以及折断的四肢的愈合速度是正常人的10%。" #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -123165,10 +126759,11 @@ msgstr "高速自愈" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." -msgstr "你的机体自愈能力发生了变异,能在受创发生时缓慢愈合,即使不睡觉的时候也能恢复HP。" +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." +msgstr "你的伤口很快就愈合了。伤口在睡眠时恢复速度提升50%,在清醒时提升66%。你折断的四肢愈合速度也是正常人的4倍。" #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -123176,8 +126771,12 @@ msgstr "急速自愈" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "你的机体自愈能力发生了变异,你在受创时,身体会以难以置信的速度愈合伤口。" +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "你的肉体受伤后愈合得非常快。伤口在睡眠时恢复速度提升150%,在清醒时提升200%。你折断的四肢愈合速度也是正常人的16倍。" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -123185,8 +126784,10 @@ msgstr "蜥蜴再生" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "你的机体自愈能力发生了变异,并产生了强大的断肢再生能力。断掉的肢体可以如蜥蜴的尾巴一般轻易的再生。" +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "你断掉的四肢可以轻易的自愈。你折断的四肢不需要夹板就能愈合,而且愈合速度是正常人的20倍。" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -126600,8 +130201,7 @@ msgstr "蜘蛛人" msgid "Well, maybe you'll just have to make your own world wide web." msgstr "你已经变异为蜘蛛人,你也许可以自己搞个万维网。" -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "幸存者" @@ -126910,10 +130510,6 @@ msgid "" "you." msgstr "你是真正的美食家,有些人可能认为那只是吉祥物而已,但你知道不仅仅如此:你是美食家,面具已成为你的面孔,你真实存在,绝世而独立。" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "实习医生" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -127286,15 +130882,34 @@ msgstr "快速反应" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." -msgstr "你反应很快,让你更容易闪避敌人的攻击。" +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." +msgstr "你反应很快,让你更容易闪避敌人的攻击和擒抱。" #: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "幸存者故事" +msgid "Survivor: Confused 1" +msgstr "幸存者" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -127302,6 +130917,86 @@ msgstr "幸存者故事" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "这名NPC可以告诉你他们是如何在大灾变中幸存下来的。" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "幸存者" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "幸存者故事" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "先知之印" @@ -128515,6 +132210,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "谁说要用武器呢?你在徒手攻击时能够造成更多的近战伤害。伤害随着你的徒手格斗技能等级提升而提升。" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "绝地武士训练" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "你受过绝地武士训练。这让你能够使用光剑战斗流派作战。" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "口袋铁拳大师" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "你非常精通口袋铁拳中的各类武术招式。好好训练,因为你命中注定要成为一名训练师。" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "武术专长" @@ -128523,8 +132240,9 @@ msgstr "武术专长" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." -msgstr "你是一名武道高手,学会了至高之道的武术流派中的一种。" +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." +msgstr "你是一名武道高手,学会了至高之道的武术流派中的一种。你能够从漠风,钢魂,铁心,暮日,石龙,及虎爪流派中选择一种开始游戏。" #: lang/json/mutation_from_json.py msgid "Magus" @@ -129032,10 +132750,6 @@ msgstr "我只是在努力生存下去。" msgid "I'm tracking game." msgstr "我正在追踪猎物。" -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "士兵" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "酒保" @@ -129508,6 +133222,14 @@ msgstr "乳齿象基因擢升战士" msgid "Humans created me. Let's see what I can be on my own." msgstr "人类创造了我。让我看看我自己能做什么。" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "沼泽教教众" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "大食客们回来了,他们必须进食。" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "特种兵" @@ -129777,10 +133499,6 @@ msgstr "拾荒者" msgid "Laborer" msgstr "劳工" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "伐木工" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "木工师" @@ -129793,6 +133511,14 @@ msgstr "异界生物学家,疯女人" msgid "Millyficen Whately" msgstr "米利菲森·沃特利" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "CEO" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "博·巴罗尼克斯" + #: lang/json/npc_from_json.py msgid "magus" msgstr "魔术师" @@ -132288,6 +136014,18 @@ msgstr "公路(下水井)" msgid "bridge" msgstr "桥梁" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "桥梁(天桥)" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "桥梁(地面)" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "桥梁(斜坡)" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "路边饮食店" @@ -137262,6 +141000,118 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "你受够了看到东西从天上掉下来,把士兵和幸存者从一个地方运输到另外一个地方。你知道在天空巡逻的恐惧迟早会把你击倒。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "急救员" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "你和你的搭档在出急救现场时被分开了。现在你只有你那辆可靠的救护车陪着你,准备好把病人运过大灾变。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "急救员" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "你和你的搭档在出急救现场时被分开了。现在你只有你那辆可靠的救护车陪着你,准备好把病人运过大灾变。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "急救护士" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "你和你的搭档在出急救现场时被分开了。你设法保存了一些医疗用品,但看起来现在唯一需要拯救的是你的生命。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "急救护士" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "你和你的搭档在出急救现场时被分开了。你设法保存了一些医疗用品,但看起来现在唯一需要拯救的是你的生命。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "战地医生" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "在这一切发生时你正好在前线,为受伤的人修补伤口并提供支援。但它们源源不断向你涌来。现在你只能靠自己了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "战地医生" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "在这一切发生时你正好在前线,为受伤的人修补伤口并提供支援。但它们源源不断向你涌来。现在你只能靠自己了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "白粉仔" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "你所记得的最后一件事是在当地美食广场后面和上帝谈心。然后人们开始互相吃。这感觉不像是一场狂热之梦。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "白粉妹" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "你所记得的最后一件事是在当地美食广场后面和上帝谈心。然后人们开始互相吃。这感觉不像是一场狂热之梦。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -137440,9 +141290,11 @@ msgstr "CBM工程师" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." -msgstr "你是一名在一间全无菌高安防级别的设施中制造生化插件的技术工程师。在你手中植入的焊枪和精密焊接设备的帮助下,你获得了丰厚的报酬。" +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." +msgstr "" +"你是一名在一间全无菌高安防级别的设施中制造生化插件的技术工程师。你在长达16个小时的轮班之中收到了那条最后的疏散令,而你靠手里的工具勉强逃出了那栋大楼。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -137454,9 +141306,11 @@ msgstr "CBM女工程师" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." -msgstr "你是一名在一间全无菌高安防级别的设施中制造生化插件的技术工程师。在你手中植入的焊枪和精密焊接设备的帮助下,你获得了丰厚的报酬。" +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." +msgstr "" +"你是一名在一间全无菌高安防级别的设施中制造生化插件的技术工程师。你在长达16个小时的轮班之中收到了那条最后的疏散令,而你靠手里的工具勉强逃出了那栋大楼。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -138750,6 +142604,228 @@ msgid "" "find some other use." msgstr "随着大灾变的到来,你可能得想办法把在考试时学会的作弊技巧用在其它方面了。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "内省主义者" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "你把自己与社会隔离开来,因为你想集中精力提升自我。这本是你自己最好的朋友,但现在大灾变可不会让你一个人呆着。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "内省主义者" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "你把自己与社会隔离开来,因为你想集中精力提升自我。这本是你自己最好的朋友,但现在大灾变可不会让你一个人呆着。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "复仇传教士" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "当你的配偶因病去世时,你失去了你的信仰。从那以后你就一直喝得烂醉如泥。上帝用大灾变惩罚每一个人,而你要向它们展示你仁慈的烙印。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "复仇传教士" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "当你的配偶因病去世时,你失去了你的信仰。从那以后你就一直喝得烂醉如泥。上帝用大灾变惩罚每一个人,而你要向它们展示你仁慈的烙印。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "科技法师信徒" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "你早就怀疑世界会突然终结。有了你的训练、法术和左轮手枪,你活下去的几率比大多数人都要高得多。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "科技法师信徒" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "你早就怀疑世界会突然终结。有了你的训练、法术和左轮手枪,你活下去的几率比大多数人都要高得多。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "生化伪吸血鬼" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"你一直对恐怖小说着迷,并利用你手中的财富买来各种法术和生化插件强化自己,使你成为一个暗夜的居民。你在追求抛瓦的过程中忽视了自己的健康,结果使你面色苍白,毫无生气。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "生化伪吸血鬼" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" +"你一直对恐怖小说着迷,并利用你手中的财富买来各种法术和生化插件强化自己,使你成为一个暗夜的居民。你在追求抛瓦的过程中忽视了自己的健康,结果使你面色苍白,毫无生气。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "魔法师研究生" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "在魔法学院的一年里,你学会了耐心、智慧和一些有用的法术。随着教师转变成不死人,课程渐渐取消,最后一课已经开始。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "魔法师研究生" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "在魔法学院的一年里,你学会了耐心、智慧和一些有用的法术。随着教师转变成不死人,课程渐渐取消,最后一课已经开始。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "腐蚀摇滚乐手" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "当你把特效换成辛辣刺鼻的血肉和带刺的长鞭时,你的金属摇滚职业生涯飙升到了一个新的高度。看来大灾变现在是你的最后一次巡演了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "腐蚀摇滚乐手" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "当你把特效换成辛辣刺鼻的血肉和带刺的长鞭时,你的金属摇滚职业生涯飙升到了一个新的高度。看来大灾变现在是你的最后一次巡演了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "电击警官" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "你是一项实验性执法部门计划的参与者,目的是通过将电击枪和子弹替换为低致命性的风暴塑造者法术来减少嫌疑犯的伤亡以及设备采购成本。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "电击警官" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "你是一项实验性执法部门计划的参与者,目的是通过将电击枪和子弹替换为低致命性的风暴塑造者法术来减少嫌疑犯的伤亡以及设备采购成本。" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "塑地拳手" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "你在地下魔法拳击圈中声名显赫,被称为一台挡不住的打桩机。既然你所有的对手都变成不死人了,那也没必要留手了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "塑地拳手" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "你在地下魔法拳击圈中声名显赫,被称为一台挡不住的打桩机。既然你所有的对手都变成不死人了,那也没必要留手了。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -140416,7 +144492,7 @@ msgid "build a metalworking forge" msgstr "建造金属锻造工坊" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." +msgid "Let's build an anvil and crucible to increase our crafting options." msgstr "让我们建造一个铁砧和熔炉来增加我们的制造物品选项。" #: lang/json/recipe_from_json.py @@ -144686,6 +148762,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "魔法师度假地" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "流放者" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "流放者" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "你是一个流放者,不管是因为人们害怕你的背景而回避你,亦或是因为你个人的选择。但这些亡者并不想放过你。" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "你是一个流放者,不管是因为人们害怕你的背景而回避你,亦或是因为你个人的选择。但这些亡者并不想放过你。" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "流放地" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -145263,7 +149373,7 @@ msgstr "为什么还要走路,当你明明可以开车时?或是开坦克时 #: lang/json/snippet_from_json.py msgid "Food from before the Cataclysm won't last forever. Keep that in mind." -msgstr "大灾难之前的食物不会永远保持新鲜。记住这一点。" +msgstr "大灾变前的食物不会永远保持新鲜。记住这一点。" #: lang/json/snippet_from_json.py msgid "" @@ -147072,96 +151182,6 @@ msgstr "我都想不起上次我这么渴是什么时候了。" msgid "I'd kill for a sip of water right now." msgstr "我现在能为喝一口水而杀人。" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "当然可以,我看到你身上带着啤酒!让我们开一瓶冰啤酒,坐下来聊一聊,,怎么样?" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "哦,当然,不如给我一瓶你带着的啤酒怎么样?怎么样,成交?" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "是的,不过你得先分我一瓶你囤的那些啤酒,然后我们接着聊!开个玩笑。你怎么样,?" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "嘿,我想聊天的时候喝点冰啤酒会更加愉快。过得如何?" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "趁我们聊天的时候,我们要不开要一瓶啤酒然后……假装世界没有毁灭,就一小会。你怎么说?" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "递一瓶给我,让我们好好谈谈从前的好日子吧,。" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "哦,当然可以,,正好我也该放松一下了,你最近怎么样?" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "哦,可以,,近况如何啊?" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "当然,让我们来吹吹逼!你还好吧?" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "为什么不呢?你还好吗?" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "我不介意,怎么了?" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "我可以抽出几分钟时间,怎么了?" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "当然,,你还好吗?" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "好吧,你有什么要说的吗?" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "我随时可以聊!怎样,你还好吗?" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "好吧,,我们是应该互相了解一下,你过得怎样?" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "当然可以,我奉陪。你还好吗? " - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "好主意,。让我们暂时忘掉这个世界吧。你过得怎样?" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "啊,我去。你最近如何了?" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "行。那么,你觉得天气如何?" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "该死" @@ -149619,12 +153639,24 @@ msgstr "你是怎么度过最初的混乱的?" #: lang/json/snippet_from_json.py msgid "Tell me how you survived the initial wave of the Cataclysm." -msgstr "和我说说你是如何在大灾难的最初阶段幸存下来的。" +msgstr "和我说说你是如何在大灾变的最初阶段幸存下来的。" #: lang/json/snippet_from_json.py msgid "Was it rough surviving thus far?" msgstr "活到现在是不是非常艰难?" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "你觉得这一切是怎样到这个地步的?到底发生了什么?" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "到底怎么回事?就是说,从全局角度看,到底发生了什么?" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "你听说过这场大灾变是怎么发生的吗?" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -150340,6 +154372,303 @@ msgstr "会尽力避免交战。" msgid " will follow normal engagement rules." msgstr "会遵循正常的交战规则。" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "当然,想为这个故事开瓶啤酒吗?" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "哦,当然,不如给我一瓶你带着的啤酒怎么样?" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "是的,不过你得先分我一瓶你囤的那些啤酒,然后我们接着聊!开个玩笑,呵呵。" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "嘿 ,我想聊天的时候喝点冰啤酒会更加愉快。" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "趁我们聊天的时候,我们要不开要一瓶啤酒然后……假装这个世界还没有毁灭。" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "递瓶酒给我,让我们好好谈谈吧,。" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "啊,炎炎夏日让我很难受,是吧?" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "享受夏天吧。" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "老实说,希望这天气能凉快一点。" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "好吧,也许这能让我不再这鬼天气里冻僵了。" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "不得不说,我可不是在看雪。" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "真奇怪,那些丧尸居然不会被冻僵。" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "呃,我感觉人很难受……但还是聊聊吧。" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "正好我也该放松一下了,你最近怎么样?" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "那么,最近过得如何?" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "当然,让我们来吹吹逼!你还好吧,?" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "我不介意,怎么了?" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "我想我还是能抽出些时间聊聊的,怎么了?" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "当然,,你还好吗?" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "好吧,你有什么要说的吗?" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "我随时可以聊!怎样,你还好吗?" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "好吧,,你过得怎样?" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "我奉陪。你还好吗?" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "让我们暂时忘掉这个世界吧。近来过得如何啊?" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "啊,我去。命运最近待你如何了?" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "呃,你觉得今天天气怎么样?" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "能抽出点时间来聊天真是太好了。你最近过得怎么样?" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "我的脚走得也有点累了,你知道吗?" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "我今天感觉超棒的。不知道为什么,也许是那种日子吧。" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "我只是不敢相信一切都终结了。我不停地回想自从一切都崩溃的那天以来的经历。暴乱。谎言。精神病。从来没有感觉到这一切会变成这样子。" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" +"你想过那些家伙在世界末日之前说的那些废话有任何真相吗?水里有精神控制药物,生物恐怖主义?也许其中有些事是真的,但似乎太牵强了。不过话说回来,我们现在要对付的是真正的丧尸。" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "我不知道自己现在是应该变得更虔诚呢,还是更不虔诚。你懂我的意思吧,?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "我一直在想重新整理下我的装备。真是一团糟。你可不想在拿武器时不小心拔出一根麦片棒,对吧?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "你有想过我们为什么还要这么费力生存吗?反正我们最终都会变成丧尸的。我不是说我们该停止战斗,但这一切有什么意义?" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "我希望我现在就能一枪干翻自己变成那些丧尸中的一员,这样就不用为自己的生命操心了。" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "每次闭上眼睛,我都能看到那场暴乱的画面。你明白了吗,还是只有我一个人会这样?" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "你有没有觉得大灾变发生的那些事只是你醒来之前所做的一场梦?" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "你是什么时候意识到已经世界末日的?对我来说,这就是那个该死的YouTube视频,那个女人杀孩子的视频。真该死,不是吗?" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "我想知道联邦政府是否还在某处存在着,也许躲在一个地堡里。" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "还记得一些来自世界末日的疯狂新闻吗?我是说那些被暴乱报道淹没的东西。比如,罗德岛的州长不是说已经脱离联邦了吗?" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "我一直梦到丧尸仍然记得自己作为人类时的身份,只是被困在尸体里,看着一切发生。这让我一直都没法睡一场好觉。" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "他们放在水里的那些让人们暴动的精神控制药物……你觉得会不会还在水里面呢?" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "我不禁想知道是谁搞砸了这一切。显然,我们不能相信新闻报道,他们几周以来一只声称丧尸都是“暴徒”。为什么?这一切都是从哪开始的?" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" +"如果他们告诉我们的关于中国人的说法在一定程度上是真的,你认为中国的情况是不是也和我们一样?或者美国已经变成某种隔离区,至少世界上还有一些地方没有受影响。" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "你注意到伤口不像平时那样恢复了吗?我在世界末日之前就发现了,但最近变得更明显了。割伤恢复后都几乎不会有疤痕。" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "我还是不明白这些丧尸是靠什么维持运动的。它们就像永动机。" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "这一切还有很多地方对不上。是谁创造了丧尸?是什么力量驱使它们?也许有关精神控制药物的谣言一直都是真的,而且有人找到了一种方法来改造活死人。" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "这些丧尸是怎么维持运动的?它们吃什么?你觉得它们会腐烂吗?" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "我一直在想,总有一天,我们会用完卫生纸的。然后我们该怎么办呢?" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "你不觉得奇怪吗,我们打开那幢上锁的房子,居然发现里面有只丧尸?它是怎么进到那里的?" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "有时我想知道我们是否都变成精神病了,而不仅仅是那些发疯和暴乱的人。自世界末日以来我做过不少以前从没想过自己会做的事。" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "你最近读过什么不错的书吗?我很庆幸我们至少还有些书剩下。" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "你知道我怀念什么吗?电影院。你觉得好莱坞会不会逃过一劫呢?也许有一群丧尸演员在那里,靠条件反射胡说八道拍片。哈,我可想看看那些狗玩意。" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "我懂你的意思,……" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "这让我想起了一件往事……" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "对,对。你有没有想过……" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -151588,6 +155917,15 @@ msgstr "" "这是一个Rivtech弹药的广告。它上面有一幅画了中间有弹孔的装甲钢板。旁边是一盒闪亮的无壳弹药。标题写着:“Rivtech " "8x40mm无壳,万夫莫敌。”" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" +"这是一则 SUDS 洗衣店的广告。上面的广告词被许多泡泡包围着,泡泡似乎正往上漂浮。上面写着:“Tergitol 星期二!所有洗衣干衣半价!”" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -151598,6 +155936,22 @@ msgid "" msgstr "" "这是一张宣传海报,展示了诺斯罗普公司的军事机器人。它描绘了经典的深绿色蛛型派遣者,它站在栅栏前,背对着拍摄者,模糊的机器影子从它背后冲向地平线上一个恐怖外形的黑色轮廓。海报上面写着:“我们是来保护你的。”" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "这是一则钢铁健身馆的广告。上面印着人们进行各种运动,例如跑步、瑜伽和举重的照片。上面写着:“我把东西举起又放下!”" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" +"这是太空时光公司的广告。它印着一张以月球为背景的照片,上面宇航员正绕着一艘宇宙飞船上漂浮。上面写着:“拥有属于你自己的月亮!一个月只需29.99美元,你就可以拥有宇宙中最优秀的房产!”" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -154662,6 +159016,337 @@ msgstr "风格" msgid "-chant" msgstr "颂歌" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" +"从变异生物身上切下的肉块。这块肉有着恶心的海绵般的松散质感,不过闻起来……还算正常。肉的内部有着一些明显不自然的杂乱组织:骨头和毛发堆积在肌肉组织之间,就像是要生长出另一只生物一般。至少它看起来还能被消化,前提是你得把它烹饪加工并处理掉那些不好的部分。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" +"从严重变异的生物身上切下的一大块肉。虽然它来自肌肉组织,但它上面布满了奇怪的颗粒状旋转花纹,在每个颗粒中心是一团坚硬的软骨组织。闻起来很恶心。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" +"从严重变异的生物身上切下的一大块肉。看上去像是来自肌肉组织,但在肌肉之间的筋膜组织中,长出了许多粗大的多刺毛发已经生长。一旦把毛发拔出,就会涌出一股臭气熏天的奶油色的液体。" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "从严重变异的生物身上切下的一大块肉。虽然这是来自肌肉组织,但它表面布满了厚厚的绳索状纹理,闻起来像是皮革和发霉的面包。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "一块煮熟的变异肉块。这块肉有着恶心的海绵般的松散质感,不过尝起来……还算正常。但愿你已经把里面的毛发和骨头全部清理干净了……" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" +"一大块煮熟的变异生物的肉。你本以为自己已经除掉了所有的脏物,但是在烹饪时,里面的一个充满奇怪液体的液囊破了,整块肉都被裹上了某种厚厚的油脂。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "一大块煮熟的变异生物的肉。它的表面布满了羽绒一样的硬茬,需要你清除干净,才勉强让它看起来可以食用。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "一大块煮熟的变异生物的肉。加热使肌肉组织像活着一样扭曲移动,现在它已经扭成一个密集的肉结。" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" +"从巨大的变异昆虫身上切下的奇怪器官,你真的不知道如何利用它们。有些东西你从来没有在任何解剖学书上看到过,脊刺、毛发和其他不明的器官结构似乎是随意地从其中伸出来。" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" +"从巨大的变异昆虫身上切下的奇怪器官。它们有一种病态的绿色,其中一个在你取下它时被撕裂了,露出了它的内表面,看起来像是一排排像是人类手指或是指甲之类的结构。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "从巨大的变异昆虫身上切下的一个巨大的厚肉囊。表面覆盖着光滑柔软的皮肤,内部是一团盘绕扭曲的绳索状组织。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "从巨大的变异昆虫身上切下的一个长长的绳索状器官。它从头部一直延伸到腹部,有长长的卷须从上面脱落,和脊柱没什么两样。" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" +"从变异生物身上切下的一个肉质灰色器官。它有一层粉状黄色涂层,能灼伤你的皮肤,还有几根无法辨认的肉质管子从里面伸出来。它散发出的气味相当刺鼻。你很肯定任何自然生物都不会有这种器官。" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "从变异生物身上切下的器官肉,看起来像是一系列排列在长长的肉质血管上的小型哺乳动物心脏。在长链的末端是一个巨大的肉质囊,看上去像是胃。" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" +"你很确定这是肺脏组织。它看起来像一个大型哺乳动物的肺,例如狗,但它没有几个明显的肺叶,而是有几十个肺叶排列成片状。奇怪的肌梭和扭曲的肿胀点缀在表面。" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" +"你很确定这是肺脏组织。它看起来大致呈飞翼形状,在“飞翼”的后缘周围有一系列的小瘤。在器官的每个角落都有一团团棘刺把整个器官像搭扣一样扣在虫子的甲壳上。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "一块昆虫的坚硬躯壳,但变异了。内侧布满了血管和奇怪的钩状突起。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "一块昆虫的坚硬躯壳。细线一样的神经组织和血管仍然附着在内表面。" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "从巨大的变异昆虫体内切下的一块坚硬的管状昆虫躯壳。它似乎在其体内起到某种支撑作用。你很确定普通昆虫没有这些器官结构。" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "从巨大的变异昆虫体内切下的一根细长而有弹性的棍状昆虫躯壳。它的表面布满了血管和几丁质结节。" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "当你剥开它的外壳时,你发现甲壳板上布满了血管" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "这只生物已经死了,它的甲壳出奇的容易剥开" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "这只生物的外层甲壳上长出了一层薄膜,很像皮肤" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "在这只变异生物的甲壳下是一层刚毛状、类似魔术贴的材质" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "隐藏在这只生物内部的解剖结构看起来像是一只长了甲壳的小型哺乳动物,被扭曲成节肢动物的形状" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "你把这只怪兽的尸体像撕开一只可怕的龙虾一样撕开" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "甲壳紧紧地包裹着这只生物,你需要把它撕开,锯开下方坚硬的纤维" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "在它体内,半成形的器官挤压着海绵状的肉,这些肉看起来不像是正常节肢动物会长的肉" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "你发现甲壳下方有一堆钩状的刺,不知怎么地紧紧地扣在了一起" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "里面是一团复杂的、仍在蠕动的奇怪附肢和器官混合体,和任何正常生物都没有一丝相似之处" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "在甲壳下面,肉被厚厚的刚毛覆盖,其中隐藏着一个由半成形的变异器官构成的混乱荆棘" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "里面是一团杂乱的器官和组织,看起来毫不自然" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "在这只生物体内,你发现了肺脏、心脏和肠子,看上去更像是哺乳动物而不是巨大的昆虫" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "里面的肉散发出一股可怕的臭味,似乎被一团湿漉漉的细毛覆盖着,就像一只出了可怕毛病的新生动物" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "当你进行屠宰时,许多细小的纤维随着你的动作飞散分裂开来,露出这只生物自己扭曲的半成型的复制品" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "屠宰工作进展得很慢,因为海绵一般的组织在你的工具下方不断裂开" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "在你把它翻过来时,它的外壳上冒出了一滩热气腾腾的酸液" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "当你剥开它的外壳时,它所流出的热气腾腾的酸液汩汩作响" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "当你剥开甲壳时,几个酸腺破裂,喷出一股股热气腾腾的酸液" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "器官本身有一股刺鼻的气味,但不像外壳那样有腐蚀酸性" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "你小心地避免撕破你认为可能是酸液分泌腺的口袋形结构" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "甲壳素下面厚厚的、绳索状的组织保护着内层的奇怪器官,看上去最像鸟的器官" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "尸体所喷出的强酸性蒸汽使你很难进行屠宰工作" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "这只生物的组织中充满了半成形的器官,它们的作用还不清楚" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "有好几次,你在不小心刺穿一个充满酸液的隐藏腺体时差点烧伤自己" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +"。" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "。" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" +"。" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -162795,6 +167480,10 @@ msgstr "LMOE避难所(地下室)" msgid "Middle of Nowhere" msgstr "无人区" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "沙漠岛" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "实验室单间" @@ -162940,11 +167629,11 @@ msgid "Acolyte." msgstr "助手。" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" -msgstr "你又回来了。你是来这听歌的吗?" +msgid "You're back. Have you come to listen to the song?" +msgstr "你又回来了。你是来听这歌声的吗?" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" +msgid "You there. Quiet down. Can you hear it? The song?" msgstr "那里的家伙,安静点。你能听到吗?这歌声?" #: lang/json/talk_topic_from_json.py @@ -162979,8 +167668,8 @@ msgstr "我得走了。保重了,先知。" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "仔细倾听。骨头……在唱歌。你能听到吗?它们编的歌?它们说的事?" #: lang/json/talk_topic_from_json.py @@ -162993,11 +167682,11 @@ msgstr "嗯……好吧,是吧。我想我该走了。" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" "当这一切发生的时候,这场大灾变,有些东西……改变了。你能在所有的生物身上看到它,但最重要的是从骨头上。它们破碎,变形,再次复活,无限循环。活死人在四处行走。怪物互相撕扯着对方。你可以看到共鸣,原始力量的安静哼鸣,只有取走骨头,这个循环才会结束——它们的故事,它们的歌声,它们的力量,都将成为你的力量。" @@ -163016,11 +167705,11 @@ msgstr "还有其它人,呃,相信这个吗?" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" "只有当你压碎了一具尸体的骨头,它才会停止复活。只有仔细检查这些骨头,你才能知道那是什么东西。这就是故事的全部。无论什么原因导致了这种变化,它都在我们所有人的内心活动着,是这个新世界不可避免的一部分。它拥有改变的力量。当我们握住骨头,我们就拥有了力量。这就是力量的全部。在一起……它们组成了一首美丽的歌。" @@ -163030,7 +167719,7 @@ msgstr "我想我明白你的意思了,尽管我不确定我是否认同你。 #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "还有其他人也在追随这一事业。你最好帮助他们,因为尽管吾等人数不多,但吾等所承载的歌鼓舞着吾辈。" @@ -163044,10 +167733,10 @@ msgstr "原因呢?你为什么要收集这些骨头?" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" "歌可以用多种形式编排。用雕刻的骨制护身符,武器和盔甲都拥有巨大的力量,当时机来临,我和我的族人将收集大量的歌曲,并歌唱它来恢复这个世界。要么恢复,要么终结。都没有区别。" @@ -163058,7 +167747,7 @@ msgstr "终结世界?什么?" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" "我们相信,一首歌曲中足够的力量可以逆转这场灾难——或者将它加速到一个超越一切的时代,以同样的方式终结。但在目前的情况下,这两种结果都可以接受。" @@ -163075,8 +167764,8 @@ msgstr "你这个疯子。" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "你的思想很开放。比大多数人都开放。也许有一天,你也会感受到这首歌的力量,并成为吾之同侪。现在,助手,倾听,倾听,感觉这首歌。" @@ -163086,15 +167775,21 @@ msgstr "我……谢谢。" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "你的怀疑并不令我惊讶。也许有一天,你也会不可避免地听到这首歌,感受到它的力量。但在那之前,你仍将只是一名助手,通往同侪的道路已经关闭。" #: lang/json/talk_topic_from_json.py msgid "Yeah, alright." msgstr "是的,好吧。" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "现在歌……很安静。也许随着时间的推移,更多的音符会刻在这个世界的骨头上。" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "一名助手一次不应该唱太多的歌。" @@ -163104,10 +167799,8 @@ msgid "That is all for now." msgstr "到此为止。" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." -msgstr "现在歌……很安静。也许随着时间的推移,更多的音符会刻在这个世界的骨头上。" +msgid "There are bones to etch, songs to sing. Wish to join me?" +msgstr "有骨待刻,有曲当歌。想加入吗?" #: lang/json/talk_topic_from_json.py msgid "Do you wish to take on more songs?" @@ -163118,8 +167811,8 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "你相信自己能承担额外骨骼带来的重担吗?" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" -msgstr "有骨待刻,有曲当歌。想加入吗?" +msgid "A song may yet be sung by you, should you wish to." +msgstr "尚有歌未被你所唱,如果你想的话。" #: lang/json/talk_topic_from_json.py msgid "There is an additional song you could take on, if you'd like." @@ -163130,10 +167823,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "我知道有一些有用的骨头,如果你想知道更多的话。" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "尚有歌未被你所唱,如果你想的话。" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "我懂了。" @@ -163146,14 +167835,6 @@ msgstr "洗耳恭听。" msgid "Perhaps another time, Seer." msgstr "下次再说吧,先知。" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "如果你希望踏上觉悟之路,首先你必须学会倾听和聆听这首歌。去外面杀一头生物,感受在你指尖之间的力量。然后把骨头带来,我能为你雕些东西。" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "好吧,我想我应该看看这是怎么回事。我加入了。" @@ -163162,10 +167843,6 @@ msgstr "好吧,我想我应该看看这是怎么回事。我加入了。" msgid "Not interested." msgstr "[取消]不感兴趣。" -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "太好了。现在请出发上道吧。" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "包在我身上。但我还想问问……" @@ -163182,20 +167859,13 @@ msgstr "能给点装备让我完成这个任务吗?" msgid "I'm off then." msgstr "那么我走了。" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "我们到处所见的那些步履蹒跚的尸体都在不和谐地移动。它们的歌仍可使用,但作为一名助手,这将是不必要的困难。一定要用未被污染的完整生物雕刻。" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "所以,任何不是丧尸或怪物的生物。明白了。" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "觉悟之路是需要你自己走。如果我帮助你,最终会阻碍你进步,搅乱你的歌。" @@ -163206,8 +167876,8 @@ msgstr "我明白了。好吧。" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." -msgstr "你身上有我的印记,意味着我相信你有潜力学会真正倾听这首歌。是的,我将把助你一臂之力,暂时的。" +"listen to the Song. Yes, I will lend my skills to you, for now." +msgstr "你身上有我的印记,意味着我相信你有潜力学会真正倾听这首歌。是的,我将助你一臂之力,暂时的。" #: lang/json/talk_topic_from_json.py msgid "Only those who bear my mark will prove themselves worthy of my skills." @@ -163221,11 +167891,6 @@ msgstr "听你这么说我很高兴。我们出发吧。" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "那很好,但我现在需要一个人干。以后再说吧。" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "我理解你的固执。当你见证真道之后,随时可以回来。" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "下次再说吧。不如换个话题……" @@ -163237,14 +167902,14 @@ msgstr "好吧,但我现在得走了。" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" "大灾难改变的不仅仅是行走的死者和怪物。它启动了……某种循环。一切都在不断重复。我们只能在别人身上看到它,但它也发生在我们身上,包括你和我。你的肉从你身上撕裂,被吞食。也可能是面对死亡的无声呻吟。但你的骨头又复活了。不同的肉体,不同的名字,有时甚至是不同的知识,但骨头,是一样的。我们都被困在同一个循环中。我们只是一直在遗忘。这就是为什么我们需要收集歌声。这就是为什么这一切必须终结,即使它意味着毁灭,而不是恢复。" @@ -163274,6 +167939,14 @@ msgstr "暂时不想问了。" msgid "Skip it, let's get going." msgstr "不必,我们出发吧。" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "关于这个世界,还有什么建议吗?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "我们来谈谈派系营地的事情。" + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "翻译翻译,什么叫\"大体上\"愿意跟随我?" @@ -163478,7 +168151,7 @@ msgstr "告诉我怎么给你医疗用品。" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -163682,8 +168355,8 @@ msgstr "嗨,。" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "站住,举起手来!哈哈,吓到你了吗,我们……已经没有法律了……" #: lang/json/talk_topic_from_json.py @@ -163705,7 +168378,7 @@ msgstr "我得走了。" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "事情发生时我在这里守着警局,其他警察在最后一次通话之后就再也没回来……至少没作为人类回来。" #: lang/json/talk_topic_from_json.py @@ -163757,8 +168430,8 @@ msgid "" msgstr "是的,还有其他一些人像我一样躲在镇里。我们有时候会做些交易……有时会有陌生人路过这,以为他们能找到比之前待得更好的地方。" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." -msgstr "不行就是不行……" +msgid "No, just no…" +msgstr "不行,就是 不行……" #: lang/json/talk_topic_from_json.py msgid "Just let me sleep, !" @@ -163769,7 +168442,7 @@ msgid "Make it quick, I want to go back to sleep." msgstr "快点,我想回去睡觉" #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." +msgid "Just few minutes more…" msgstr "再等几分钟……" #: lang/json/talk_topic_from_json.py @@ -163799,14 +168472,14 @@ msgstr "是的,快醒醒!" msgid "no, go back to sleep." msgstr "不了,继续睡吧。" -#: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" -msgstr "干什么,老铁?" - #: lang/json/talk_topic_from_json.py msgid " *pshhhttt* I'm reading you boss, over." msgstr "*电流声* 老大,我收到了。完毕。" +#: lang/json/talk_topic_from_json.py +msgid "What is it, friend?" +msgstr "干什么,老铁?" + #: lang/json/talk_topic_from_json.py msgid "I want to give you some commands for combat." msgstr "[战斗]我想给你一些作战指令。" @@ -163815,6 +168488,68 @@ msgstr "[战斗]我想给你一些作战指令。" msgid "I want to set some miscellaneous rules." msgstr "[其他]我想设定一些其他规则。" +#: lang/json/talk_topic_from_json.py +msgid "I'd like to know a bit more about your abilities." +msgstr "[查看]我想更多地了解你的能力。" + +#: lang/json/talk_topic_from_json.py +msgid "There's something I want you to do." +msgstr "我想让你做些事情。" + +#: lang/json/talk_topic_from_json.py +msgid "I just wanted to talk for a bit." +msgstr "我只想聊聊天。" + +#: lang/json/talk_topic_from_json.py +msgid "Can you help me understand something? (HELP/TUTORIAL)" +msgstr "[教程]你能教教我吗?" + +#: lang/json/talk_topic_from_json.py +msgid "I'm going to go my own way for a while." +msgstr "[解散]我们就此分开吧。" + +#: lang/json/talk_topic_from_json.py +msgid "Let's go." +msgstr "一起走吧。" + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" +msgstr "*滋滋*你是认真的吗?这可不是手机。能等到我们在同一个地方再聊吗?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what did you want to say?" +msgstr "好吧,你想要聊些什么?" + +#: lang/json/talk_topic_from_json.py +msgid "Mind if we just chat for a bit about your history?" +msgstr "可以和我聊聊你的经历吗?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's just chitchat for a while, I could use some relaxation." +msgstr "让我们聊会儿天吧,我需要放松一下。" + +#: lang/json/talk_topic_from_json.py +msgid "I changed my mind, wanted to ask you something else." +msgstr "我改变主意了,问点别的吧。" + +#: lang/json/talk_topic_from_json.py +msgid "I'm all ears, my friend." +msgstr "我洗耳恭听,我的朋友。" + +#: lang/json/talk_topic_from_json.py +msgid "You gonna give me orders?" +msgstr "你要给我下什么指令吗?" + +#: lang/json/talk_topic_from_json.py +msgid "What would you like?" +msgstr "你想要我做什么?" + +#: lang/json/talk_topic_from_json.py +msgid "Just say the word." +msgstr "只要你开口。" + #: lang/json/talk_topic_from_json.py msgid "Can you teach me anything?" msgstr "[求教]现在你能教我点东西吗?" @@ -163839,14 +168574,6 @@ msgstr "[站岗]守在这里。" msgid "I want to assign you to work at this camp." msgstr "[指派]我想派你去这个营地工作。" -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." -msgstr "我们来谈谈你当前干的活。" - -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "我们来谈谈派系营地的事情。" - #: lang/json/talk_topic_from_json.py msgid "Find a horse and mount up!" msgstr "找一匹马,然后骑上去!" @@ -163860,32 +168587,20 @@ msgid "Please go to this location." msgstr "请到这个地方。" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." -msgstr "[查看]我想更多地了解你的能力。" - -#: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" -msgstr "关于这个世界,还有什么建议吗?" - -#: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" -msgstr "可以和我聊聊你的经历吗?" - -#: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." -msgstr "让我们聊会儿天吧,我需要放松一下。" +msgid "I want you to build a camp here." +msgstr "我想让你在这里建立营地。" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." -msgstr "[教程]告诉我怎么给你下达命令。" +msgid "We need to abandon this camp." +msgstr "[营地]我们得废弃这个营地了。" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "[解散]我们就此分开吧。" +msgid "Show me what needs to be done at the camp." +msgstr "告诉我营地还需要些什么。" #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "一起走吧。" +msgid "Let's talk about your current activity." +msgstr "我们来谈谈你当前干的活。" #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -164043,15 +168758,15 @@ msgstr "自由移动以对抗敌人。" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "坚守阵地:不要移动到我旁边的障碍物上。" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "算了。" @@ -164255,14 +168970,14 @@ msgstr "算了。我们该走了。" msgid "OVERRIDE: " msgstr "临时指令:" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -164427,10 +169142,6 @@ msgstr "请到这个地方去……" msgid "Stay at your current position." msgstr "守在你现在的位置。" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "告诉我营地还需要些什么。" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "我正在。" @@ -164503,60 +169214,6 @@ msgstr "*电流声* 收到,我会赶过去的。完毕。" msgid "Sure thing, I'll make my way there." msgstr "好的,我会赶过去的。" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "是的,炎炎夏日让我很难受,让我们休息一下,你最近如何啊, ?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "好吧,也许这能让我不再这鬼天气里冻僵了,怎么了?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "对啊,是时候休息一下了!你感觉怎么样?" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "天太黑了不是吗?怎么了?" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "我感觉很难受……你还好吗?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "当然,顺便说一下,谢谢你帮了我这么多的忙!不管怎样,你能应付吗,?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "好吧,我们聊聊。哦对了,谢谢你帮我做那件事。那么……你还好吗?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "现在我们可以稍微歇一会,我刚刚在想,这得有一个多月了吧……发生了这多事,你是怎么应付这一切的?" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "哦,那啥,还行,还行……" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -164611,21 +169268,21 @@ msgid "Hello there." msgstr "你好。" #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." +msgid "Okay, no sudden movements…" msgstr "好吧,别乱动……" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "离我远点!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "这是我的地盘,。" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "这是我的地盘,。" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "冷静点,我不会伤害你。" @@ -164678,30 +169335,30 @@ msgstr "你怎么了?" msgid "I don't care." msgstr "我不在乎。" -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "我没有更多的工作可以给你了。" - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "我没有工作可以给你。" #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "我还有更多的工作想交给你,要听听看吗?" +msgid "I don't have any more jobs for you." +msgstr "我没有更多的工作可以给你了。" #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "我还有些其它的工作想交给你,要听听看吗?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "我这正好有份你能做的事,想听听吗?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "我还有更多的工作想交给你,要听听看吗?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "我还有件事要拜托你,要听听看吗?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "我这正好有份你能做的事,想听听吗?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -164711,6 +169368,10 @@ msgstr "哦,好的。" msgid "Never mind, I'm not interested." msgstr "[拒绝]算了,我没兴趣。" +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "你现在没有为我做任何事情。" + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "哪个工作?" @@ -164719,10 +169380,6 @@ msgstr "哪个工作?" msgid "What about it?" msgstr "怎么样了?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "你现在没有为我做任何事情。" - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "[确认]我去做吧!" @@ -164931,6 +169588,10 @@ msgstr "嗯嗯,好吧。" msgid "Thanks!" msgstr "谢谢啦!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "专心开车,兄弟!" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "我在开车呢!" @@ -164955,16 +169616,12 @@ msgstr "我现在什么都想不到,下次再问我吧。" msgid "I have some reason for not telling you." msgstr "我不方便对你说。" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "专心开车,兄弟!" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "啊,好吧。" #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." +msgid "Not until I get some antibiotics…" msgstr "除非你给我一点抗生素……" #: lang/json/talk_topic_from_json.py @@ -165063,22 +169720,22 @@ msgstr "不要,在这挺好的。" msgid "On second thought, never mind." msgstr "[取消]回头想一想,算了吧。" +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "你开车的时候,我没法好好儿训练你!" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "我开车的时候没法训练你!" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." +msgid "Give it some time, I'll show you something new later…" msgstr "给我点时间,我会给你看点新玩意……" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "我不教你是有原因的。" -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "你开车的时候,我没法好好儿训练你!" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "一点可能也没有。我要留下来!" @@ -165100,7 +169757,7 @@ msgid "See you around." msgstr "[取消]嗯,保重吧,回头见。" #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." +msgid "I really don't feel comfortable doing so…" msgstr "这么做让我很不爽啊……" #: lang/json/talk_topic_from_json.py @@ -165172,7 +169829,7 @@ msgid "Thanks, see you later!" msgstr "谢了,请多保重!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." +msgid "You picked up something that does not belong to you…" msgstr "你拿起了不属于你的东西……" #: lang/json/talk_topic_from_json.py @@ -165266,13 +169923,13 @@ msgid "You might be seeing more of me…" msgstr "我们还会再见的……" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" -msgstr "再次问好。 *滋滋滋*" +msgid "Hey again. *kzzz*" +msgstr "又见面了。 *滋滋滋*" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "我……我自由了。 *滋滋滋* 我真的自由了! *噗滋滋滋* 看啊,你是这么长时间以来我见到的第一个活人。" #: lang/json/talk_topic_from_json.py @@ -165294,8 +169951,8 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "对不起,不要在意我是谁。我想你还是继续享受自由吧。" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" -msgstr "*嗡嗡声* 太棒了!那么现在发生了什么?" +msgid "*buzz* Great! So what happens now?" +msgstr "*噗滋滋* 太棒了!那么现在发生了什么?" #: lang/json/talk_topic_from_json.py msgid "Come with me. We can help each other out." @@ -165307,9 +169964,9 @@ msgstr "我们各自走各自的路,继续享受你的自由吧。" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" -msgstr "……等等。*哔卟*为什么我要相信你?*滋滋匝*你可能和他们一样坏!" +msgstr "……等等。*哔卟*为什么我要相信你?*滋滋滋*你可能和他们一样坏!" #: lang/json/talk_topic_from_json.py msgid "" @@ -165329,8 +169986,8 @@ msgstr "算了,继续享受你的自由吧。" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" -msgstr "好吧,好吧,*巴兹*对不起!别再伤害我了!别插芯片要我做什么都行!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +msgstr "好吧,好吧,*噗滋滋*对不起!别再伤害我了!别插芯片要我做什么都行!" #: lang/json/talk_topic_from_json.py msgid "Follow me and do my bidding, then." @@ -165345,7 +170002,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "不,我才该道歉,我不是故意的。去做你想做的事吧。" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "……杀了…… *滋滋滋* ……你!" #: lang/json/talk_topic_from_json.py @@ -165380,14 +170037,6 @@ msgstr "告诉我派系营地是怎么样运行的。" msgid "Tell me how faction camps have changed." msgstr "告诉我派系营地有哪些变化。" -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "我想让你在这里建立营地。" - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "[营地]我们得废弃这个营地了。" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "没什么。我们谈点其他的事情吧。" @@ -165663,7 +170312,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." +"talk…" msgstr "你是认真的吗?这里看上去可不是可以安全闲聊的地方……" #: lang/json/talk_topic_from_json.py @@ -165686,6 +170335,50 @@ msgstr "你想谈些什么?" msgid "Actually, never mind." msgstr "呃,其实没什么。" +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "何事,吾友?" @@ -165707,7 +170400,7 @@ msgid "May the earth flourish beneath our paths." msgstr "愿此地在吾等之路下欣欣向荣。" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "神智体,生而为一……" #: lang/json/talk_topic_from_json.py @@ -165830,7 +170523,7 @@ msgstr "你怎么活下来的?" #: lang/json/talk_topic_from_json.py msgid "What did you do before the Cataclysm?" -msgstr "你在大灾难之前是做什么的?" +msgstr "你在大灾变之前是做什么的?" #: lang/json/talk_topic_from_json.py msgid "Have anything to trade?" @@ -165895,10 +170588,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." -msgstr "我从小在农场长大,对鬼怪和地精什么的了解不多,但是我花了很多时间种菜而且我干活特别卖力。在乡下更好,更干净。没有那么危险。我希望。" +msgstr "我从小在农场长大,对鬼怪和地精什么的了解不多,但是我花了很多时间种菜而且我干活特别卖力。在乡下更好,更干净。没有那么危险。希望是这样吧。" #: lang/json/talk_topic_from_json.py msgid "Hey, I didn't expect to live long enough to see another living human!" @@ -166476,7 +171169,7 @@ msgid "Nevermind me, I'm just going to leave." msgstr "没事,我要走了。" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" +msgid "Indeed it is I! The one and only FOODPERSON!" msgstr "的确是我!独一无二的美食家!" #: lang/json/talk_topic_from_json.py @@ -166934,6 +171627,39 @@ msgstr "" msgid "Huh." msgstr "哈。" +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "我甚至搞不懂*现在*发生了什么。你怎么觉得我会知道世界是如何结束的呢?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "好吧,好吧。那你能不能至少告诉我迄今为止你所记得的事情吗?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" +"什么,你自己都不记得了吗?哦,抱歉,这样说对你不太公平,现在真是个奇怪的时代。好吧,好吧,我想这一切都是从那次暴乱开始的,不是吗?我们只是过着自己的生活,做着自己的工作,然后人们就开始暴动了。不像是平时那种由抗议演变成的暴乱或是啥的,人们突然就走出自己家门,开始到处打砸。新闻报道一开始试图淡化它,但他们无法阻止消息在互联网上传播。我不知道这是什么由引起的,他们说是水里的某种药物或毒素?不过,一开始我还没意识到情况有多糟糕。从某个时刻开始,有些死掉的“暴徒”开始复苏,胸膛上开着大洞还能够到处走来走去,这时真正的恐慌才开始了。接下来的几天——也许是几个星期,不太确定——对我来说完全是一团浆糊。你得问问别人我们这个世界是怎么完全崩溃的。" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "谢谢你让我知道。" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -166991,8 +171717,8 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" "最终是的。已经安静了好几个小时了。我口渴得厉害,又受伤了,而且被吓坏了。我的训练也许是唯一能让我没发疯的原因。我决定试着把自己拉出来,看看我的伤势有多严重。结果很" " " @@ -167288,6 +172014,32 @@ msgstr "可怜的家伙。" msgid "Thanks for telling me that stuff. " msgstr "谢谢你告诉我这一切。" +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" +"好吧,呃,之前发生了一些非常严重的骚乱,是吧?每个人都变得特别暴力恶毒,老实说,这次经历对我而言就像是一次精神之旅,而很多事情我都记不太清了。但最奇怪的是,甚至没有人想要*关心*对方。好像我们所有对他人的关心都被吸走一样了。我认为这是一种负能量。而这种能量带来了,呃,死者复生和其他东西。还有,呃,一些怪物?我真不太清楚它们是怎么来的。" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "你听起来似乎很懂啊,你认为是什么导致了这一切?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" +"这可是个困难的问题,但我不断回想起那个梦,在这一切开始之前一年我做过的梦。我梦见有一个充满邪恶能量的大球,它在等待着吸收地球上所有美好的想法,把我们变成怪物和那种东西?所以我想真实情况也许就是这样的。其他一切理论似乎都太牵强了,你知道吗?" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -167342,6 +172094,25 @@ msgstr "" " " "怪兽,那家伙有一辆大众越野车那么大,全身上下都是骨板。那一刻我知道自己被越级碾压了。那个大块头被尸潮里它的那些\"朋友\"给挡住了,我设法绕过它跑回了我的住处。我关上窗户,把房间完全上锁,但已经太晚了。那头巨兽跟着我,然后就开始敲墙。我抓上所有带得动的东西,逃得远远的。当我最后回头朝原来的躲藏点看时,它整个塌在了那个混蛋身上。我寻思着,那家伙应该是被砸死了,但我可不会回去找出答案。" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" +"发生了什么?我可不太确定。你肯定已经知道那场暴乱和接下来发生的一切,政府和警察完全没能控制住状况。我不知道那是什么原因造成的。一开始我以为这不过和往常一样,我不得不承认,一想到这可能会是一场革命的开始就让我既兴奋又害怕。但我还没兴奋到主动加入它,而且我想任何曾经加入的人现在应该都已经死了。我试着在家里等着,收拾了一个小求生背包,但后来互联网上开始播放暴徒们复生后带着可怕的伤口继续打斗的视频。我不知道一开始有多少人真的相信它,但我把它当作我的告警信号,直接离开了小镇,去了避难所。我不知道在那之后到底发生了什么。我所在的避难所遭到严重破坏,空无一人,我再也没有看到其他人。手机网络被完全封停了,除了有天传来的一条紧急短信说政府已经倒台了。几天后整个避难所就停电了。" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -167378,6 +172149,22 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "你觉得发生了什么?你在附近看到那些家伙了吗?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" +"好吧,我想你知道暴乱,军队和警察,还有和丧尸一起在各处肆虐的怪物,对吧?如果你问我认为是什么导致了这一切,我不知道。我最好的猜测是政府的过度行为,也许是某种实验性的生物武器泄漏了。他们一开始就试图对发生的一切撒谎,我可不认为这一切都是“中国攻击”的鬼话。他们试图掩盖一些事情。至于真正的末日,也许世界其他国家都在试图控制它。我听说在美国本土有些真正的核弹被引爆了。在我看来,这意味着其他地方,也许是欧洲,试图控制这里发生的一切。也许他们成功了。现在也许很糟糕,但现在不像以前了。" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -167440,6 +172227,42 @@ msgstr "" "嗯,我在那里过得还不赖,但最终我开始变得有点发疯。下面总是黑乎乎的,还有点冷,而且只能靠吃捡来的垃圾食品过日子……一个灵魂只能在那种环境下活这么久。当地上开始变暖,白天时间变长之后,我决定再勇敢一点。我已经学到了很多关于" " 的知识,在那之后我就能过得很好了。我在好几个地方露营过,采集浆果之类的东西填肚子,与前几个月相比,我过着相当好的生活。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" +"哇,,我都不知道从哪里开始说起。暴乱吗?我想事情发展得要比这快。在那件事发生前的几个星期里,就已经有很多可怕的传闻了。很多可怕的罪行,不是你平常的事,而是像吃人和一些真正无法形容的烂事,你知道吗?当暴乱开始的时候,我想我已经做足了一切准备,认为这是一场不同于普通的平权暴乱或类似的事情。我想这是我能安全逃离的一部分原因,我已经提前买好了装备直接就出发了,而不是试着去购物。那时候人们简直是疯了。这很像几年前的新冠大流行,不过这次警察在街上大肆出动,四处拿枪杀人,就好像情况已经快失控了一样。" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "你知道这一切真正的起因是什么吗?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" +"完全没有头绪。政府给我们灌输了各种相互矛盾的故事,而且还发生了一些十恶不赦的事情。我是说,你不可能没看过那个女人杀死自己孩子的视频吧?天啊,它现在还会让我做噩梦。我不知道是怎么回事,光是看她脸上的那种表情。更糟糕的事情当然接连发生,现在我们都已经亲眼更糟糕的事,但那个视频还是像个梦魇一样缠着我。不管怎么说,他们都没能控制住暴乱,而当暴乱者开始变成不死人时,一切都已经太晚了。我不知道是不是士气崩溃了或者是什么,但我听到传言说,军队和警察开始像人群一样互相攻击。到底是什么让死人复活的?我一点线索也没有。" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -167449,6 +172272,55 @@ msgid "" msgstr "" "他们本来准备把我和一群被疏散者们送到一个难民中心,但我们的大巴被你所能见过的体型最大的丧尸给砸烂了。它忙着追赶其他乘客,所以我做了所有人都会做的一件事,那就是他妈的赶紧跑得越远越好。" +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "别吊我胃口了,接下来发生了什么?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" +"我一直跑,直到我觉得自己的肺快要从嘴里跳出来。我在森林里躲了一夜,靠在一棵冷杉树下。早上我听见了说话声,于是我过去调查了一下。我当时的动作特别小心,因为四周还有很多疯子和暴徒。我暗中观察到了一些东西,一些比丧尸还糟糕的怪物。一些巨大的昆虫一样的生物,说一些随机的短语,像是一台坏掉了的录音机一样。它的身后拖着几具人类尸体,我不知道他们是死了还是昏迷了。老实说,我可不想呆在那里找出答案然后等着被发现,我躲进了灌木丛,试着屏住呼吸,直到我再也听不见它所发出的声音。" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "在那之后你又去了哪里?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" +"当我确认离开灌木丛没事之后,我找到一间能让我随身脱身的旧木屋。它已经快塌了,但至少能挡挡风雨,而且给了我一处能避开他人视线的地方。我一直呆在那里,直到我把满满一背包的那些尝起来和屎一样的口粮棒吃完。然后我不得不浪迹天涯,直到我们相遇。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" +"这是什么意思,你是经历了和《回到未来》电影里那样的事吗?你怎么可能不知道发生了什么事?世界末日到了,就是这样。而且不是从地震,鸟,蛇,飞机开始的。一开始是暴乱,政府不得不派警察,随后派军队去解决那些" +" " +"罪犯。政府试图掩盖它,声称这是某种精神控制药物,但一开始在我看来和平时那些扯淡事情没什么不同,不过是些巨婴们想要找个借口违法罢了。这一次,情况变得更糟了,直到是时候逃离“道奇城”了。我听说有传言说他们甚至尝试用核弹轰炸一些城市中心试图控制它——我不得不承认,这可能有点过于硬核了。" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -167493,6 +172365,28 @@ msgstr "对不起。你能告诉我更多关于它们的信息吗?" msgid "Right. Sorry." msgstr "好吧。很抱歉。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "好吧听着。别相信任何政府说的东西。所有这些都有相同的脉络:暴乱发生,军队控制不住,最后几天时他们甚至说出现了巨型怪物,必须用核武器消灭。" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "你引起了我的注意。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" +"你看过黑客帝国吗?就和那一样。电影成真了。为了让我们被锁在这里,这个模拟世界的创造者必须确保我们能恰到好处地遭遇不幸。我认为他们用的算法可能出了点问题,进入了超速档,因为现在发生的这些事情有点让人难以置信。不过,我想我们还是被困在里面了,所以也许它还是起到了一定的作用。" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -167506,6 +172400,20 @@ msgid "" msgstr "" "嗯,我那会正在家,手机突然开始一直响警报,告诉我去一个紧急避难所。所以我就去了紧急避难所。然后紧急避难所渐渐变得拥挤起来,人们等着被送到难民中心,但是大巴却一直没有来。你一定已经知道接下来会发生什么了。一开始是恐慌,然后变成打斗。我没有留下来看看接下来会发生什么,我带着我能从锁柜里抢到的工具逃进树林里。几天后我回去了,但那地方被完全遗弃了。不知道那些人最后怎么样了。" +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" +"老实说,我在避难所听了很多故事,但我脑海里最后只剩一个了。这一切都是某种科学实验出了问题。我不知道是什么引起了暴乱和死人复生,但不可能每个地方都像这样失控。是的,我和其他人一样都收到了“政府已经沦陷”的短信,但完全这么短时间内就能扩散得这么快是完全*讲不通*的。我认为我们处于某种禁区之中,他们放任事态任意发展,了解其工作原理,这样他们下次就能更好地与之抗衡。在外面的某个地方,在这个区域之外,基本上一切照旧。" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -167580,6 +172488,45 @@ msgstr "很抱歉不该问你。" msgid "Sorry for asking. " msgstr "很抱歉不该问你。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "哇,你想听听我的第一感觉吗? 政府对我们做了这件事。他们肯定是故意的,或者至少是半故意的。" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "哦?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" +"就是这样的。他们骗了我们,天知道这些事情已经发生过多久了,因为他们不想让我们弄明白。可能一开始是为了让人们保持秩序,但不知怎么适得其反。我的猜测是他们试图愚弄我们,试图误导我们,当那不起作用的时候,他们在水里下药让我们变得愚蠢或其他什么。结果人们没变得愚蠢,反而变得暴力。然后他们试图利用这一点来实施戒严,但那没有奏效,他们最终与人群作战。只是他们没有意识到他们那" +" 精神药物是某种诱变剂,能把人变成丧尸。" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "那其他的怪物又是怎么回事?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" +"我想大概都是变异引发的吧。我不知道他们用了什么,但可真是疯狂科学家之类的狗屁玩意,我之前也觉得大部分事情都不可能发生。我也在想,是不是他们放在水里的东西让我们变得有些疯狂了。也许这一切只是幻觉?想到这让我有点吃惊,我不确定我是否相信这种理论,但我也没有其他解释了。" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -168221,6 +173168,49 @@ msgstr "" "当一切都失控的时候我很晚才被疏散。在城里被困了几天,躲在地下室里吃女童子军饼干和喝温过的麦根沙士。最后,我设法在 不被 " "抓住的情况下逃了出来。我在一家废弃的购物中心里呆了几天,但我需要食物,所以我又进了树林里自食其力。这活计我做得不太好,所以很高兴你及时出现了。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "好吧,那么,听我说完。这听起来可能有点疯狂,但我们已经要对付 行尸了,所以我觉得这个理论可以接受。你听说过希腊神话吗?" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "不太熟悉。这有什么关系?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "当然了,怎么了?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" +"好吧,好吧,我知道这听起来像是印第安纳琼斯B级片里的情节,但我想有人发现了潘多拉的盒子,真实的盒子或接近它的玩意。我认为他们试图利用它,利用它的力量来做些什么。也许原本想做件好事,谁知道呢,上帝的力量对我来说似乎应该算是一种绿色能源。不管是什么,他们把它搞砸了,然后真的放出来了。不仅仅是故事里的隐喻,而是将地狱的力量在地球上散播。是的,我知道这太牵强了,但就像我说的:我想这说得通。" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "什么?潘多拉的盒子?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "根据传说,潘多拉在众神的居所中发现了一个未打开的盒子。她决定去调查,当她打开它时,不可思议的恐怖灾难和疾病蔓延开来。听起来很熟悉吧?" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "好吧,那它和这一切有什么关系?" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -168269,6 +173259,137 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "谢谢你告诉我这一切。" +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" +"你是说是什么引起了暴乱?好吧,他们说这是中国的生物武器,但我很难相信有什么人能制造出一种能做到这一切的生物武器。我能想出的唯一答案,虽然听起来很傻,是外星人。" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "你觉得这是入侵?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" +"好吧,也许吧,但我想这太混乱了,不可能是一次真正的入侵。如果非要我猜的话,我会说极地冰层里有什么东西。比如,记得几年前网上有一件关于在冰里发现的外星人尸体的大事吗?我不知道你是否还记得,但有一段时间,这件事在新闻上铺天盖地,最后变成了一场骗局。只是,从那以后,我见过一些外星人,他们看起来*很像*那个冰住的尸体。也许这不是骗局,也许是政府掩饰了这一切。所以,也许那些外星人有某种病毒。它周游世界,悄无声息地感染着一切,直到不知何故,它激活并引发了暴乱、怪物和突变。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" +"我们就别卖关子了:一开始我参加了暴乱。我真的不记得那时候我在想什么。我以前参加过抗议警察暴行的游行,但这次不太一样。我并没有做个牌子,也没打算去那里唱歌游行,我抓起一根球棒,打算去外面搞打砸抢。我从来没有这么生气过。当时的暴乱已经持续了一段时间,在我看来,这只是政府试图再次镇压人民。" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "那些暴徒确实像是疯子。" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "没有多少人能活着走出暴乱。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" +"是的,还用你告诉我。那些暴乱的人……他们甚至不像是人类,更不像抗议者。和我从前参加过的任何一次抗议活动都不一样。但这并没有阻止我。我加入了他们,我和他们一样坏。砸碎窗户,殴打旁观者,烧毁汽车。我记得我把防暴装备从警察身上扯下来……算了。我想忘掉它。" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "你是怎么活下来的?" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "是什么让你回头的?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" +"在某个时候,我感觉自己好像醒过来了。当时他们正在摧毁那些顶部有防暴炮塔的悍马。说起当时我的心里甚至不记得自己是否曾经遇见过他们。不论怎样,我听到枪响了,我才意识到我正站在一群准备冲击全副武装军事据点的暴徒周围。从那时起,我那时才真正认清楚暴徒的模样,看到那种带着狂野眼神的动物,甚至是丧尸。我转身就跑。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" +"我真的不知道。我猜如果有足够的时间,其他人也许一样会恢复理智。我觉得我没什么特别的。也许他们中的很多人都恢复理智了,只是当时并不在人群的边缘。但我要告诉你的是,当我回过神来之后,能看到一些暴徒看着我的眼神像是看待猎物一样。我可不想留下来看看会发生什么。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" +"我对这个城市很熟悉。我跑到我所知道的一幢废弃建筑里,从一扇破窗里钻了进去,呆了几天。我在那里存了一些偷来的食物,我就自己一个人呆着。当事情开始平静下来,我就离开了,然后我就在这里了。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" +"是的,我和其他人一样,记得引发暴乱的那一系列事件。事情很糟糕,新闻上报道了一些非常可怕的罪行,而警察处理案件的方式,也像往常一样引发了种族之间的紧张关系。然后人们开始暴乱,这并不罕见,但骚乱开始的地方很奇怪。比如,中上阶层的街区,中西部的小城镇,诸如此类。不管怎么说,我参加了暴乱,在那之后我就记不太清了。" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "你参加了暴乱?" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "那么,你肯定对造成这一切的原因有所了解。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" +"我想某种程度上是吧。我听到有人把暴乱归咎于某种精神控制药物,说实话,我觉得这理论并不离谱。这就是我的感觉,虽然全程中我感觉还能控制自己。直到我猛地惊醒过来,我才意识到整件事情有多奇怪。不过,这并不能解释其他的一切:丧尸,怪物,以及那些离谱的东西。我所能想到的任何解释听起来都像是糟糕的科幻小说,像是恶魔的诅咒或者外星人的武器之类的东西。" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -168558,16 +173679,54 @@ msgstr "" msgid "I can respect that." msgstr "我可以尊重这一点。" +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "我真的不想和你谈以前的事,知道吗?" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "实在不行可以模糊地描述一下,但请你稍微讲讲好吗?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" +"我——好吧。水里被人下了药,我猜是某种生物武器。你知道我们和中国的关系,政府把所有问题都归咎于他们。人们开始变得暴力凶恶。然后发生了暴乱。我所关心的人也加入了他们,我想我永远也没法知道原因了。暴乱导致军队和警察采用强力措施,这使得暴乱更加严重。人们变得像动物一样,不仅是暴徒,而且是所有人。然后,那些怪物和梦魇就出现了,像真正的世界末日一样,每个人都死了,然后开始复生变成怪物。这就是你要的故事。如果你还想要更多,找其他人谈谈。" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "谢谢你的故事。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" +"老实说……我不记得了。我只能记得世界变成现在这个样子之前生活的一些模糊细节,但关于 " +"本身呢?全都是一团浆糊。我不知道我是怎么走到现在这一步的,也不知道这一切是怎么发生的。我想一定是我遇到些特别糟糕的事。我记得一些事情:一些暴力事件,一个女人杀了她的孩子。我宁愿我能忘掉它。" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" "老实说……我不记得了。我只能记得世界变成现在这个样子之前生活的一些模糊细节,但关于 " -"本身呢?全都是一团浆糊。我不知道我是怎么走到现在这一步的,也不知道这一切是怎么发生的。我想一定是我遇到些特别糟糕的事。或者我的头被狠狠揍了一顿。或者两者兼而有之。大概这些都发生过吧。" +"本身呢?全都是一团浆糊。我不知道我是怎么走到现在这一步的,也不知道这一切是怎么发生的。我想一定是我遇到些特别糟糕的事。或者我的头被狠狠揍了一顿。或者两者兼而有之。大概这些都发生过吧。我醒过来能记得的第一件事是在手机上看到一条已经读过的短信,上面说联邦政府已经垮台了。" #: lang/json/talk_topic_from_json.py msgid "" @@ -168659,6 +173818,46 @@ msgid "" " ask again." msgstr "听好了,我说得很清楚,如果你继续找茬,我就要发火了。曾经的我已经走了。死了。我不在乎你的\"健康\",别 再问了。" +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" +"你在问我是什么导致了这一切?新闻上到处都是。某种中国生物武器。这与几年前的新冠病毒大流行没有什么不同,但看来这次他们的配方用对了。也许太对了。反正没关系,我听说这病毒对他们也有效,把他们全都干掉了。他们活该。" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "不过,你能告诉我到底发生了什么事吗?" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "这怎么解释其他疯狂的事情呢?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" +"好吧,你知道的。首先是水里的精神控制药物引起的暴乱。但我想我们现在都能看到它其实又是一种病毒。军方和警察尽了最大的努力镇压暴乱,但它失去了控制。然后病毒发生变异,开始让死人复活,就像B级片里的情节,那狗屁玩意真的变成了现实。然后它们释放出了巨型怪物,或者它们把我们变成了怪物,我不知道。那是巨大的难以形容的怪物……一想到它们我就不寒而栗。它们显然不适合战斗,军队很快就把它们干掉了。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" +"什么?当然能解释。他们一开始用的是生物武器,后来变成了全核武器。只不过我们现在所拥有的武器比氢弹差得多。山姆大叔设法击退了那些最可怕的怪物,但我猜那不过是他的垂死一搏。" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -168968,7 +174167,7 @@ msgstr "那是因为一件……东西。一开始是一次大胆的决定。最 #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "逃税。我是一名会计师,我用一些非常聪明的方式帮我的老板转移了一大笔钱。但聪明得还不够,结果就这样了……" #: lang/json/talk_topic_from_json.py @@ -169156,6 +174355,34 @@ msgid "" msgstr "" "我会坚持所信,一直祷告,击倒我所看见的一切地狱使者。这是我们剩下所能做的少数几件事,不是吗?我想也许我们太过懦弱,只能留下来继承这个人世。但我不太看好我们的胜算。" +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" +"很清楚,不是吗?那个……当末日来临,\"被提\"会来。而我却仍然在这里,我仍然不明白为什么,但我会把耶稣留在我的心中,经历即将到来的苦难。当一切过去之后,我相信祂会欢迎我进入天国。或者……或者其他类似的东西。" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "我的意思更多指的是实际发生的事件。到底发生了什么?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" +"哦。好吧,如果我没记错的话,我想这是《启示录》中的预言过的事情。你知道,我有一段时间没参加牧师弥撒了。一开始是瘟疫……第一次是几年前的那次,那次新冠大流行,那时候人们就已经开始谈论末日即将来临。然后是血之灾,还是暴力?那指的是暴乱。然后海水被血染红,那是所有被警察枪杀的人的血。然后是火之灾,这个我很确定,因为当时丢了核弹和到处都有爆炸,试图控制暴乱。然后是恶魔和怪物在地上行走,死者从坟墓中复活,最后温顺的人承受地土。说得一清二楚。" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -169164,6 +174391,24 @@ msgid "" msgstr "" "和其他人一样。我背叛了上帝,现在我要付出代价。\"被提\"来了,而我被留下了。所以现在,我想我得留在这个人间地狱里四处游荡。我真希望当初我在主日学校里上能多听点课。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" +"好吧,我想那大概就是\"被提\"吧。但这和我想的不一样啊。他们让我以为会像是一道闪光,然后“噗”的一声,所有人都不见了。相反,一切都变得又乱又脏。一开始是街上的暴乱,然后为敌基督效命的军队和警察开始枪杀人民——就像我爸常说的啥来着——像镰刀收割麦子一样?当我们真的显出我们的罪时,神带着真正的灾祸来了。死者开始复生行于地上,身上带着机枪的弹孔站起来攻击军队,军队也开始互相攻击。在那之后,地狱军团也亲自降临于世。巨大的怪物,比我能想象到的任何东西都还要可怕,它们在城市中撕碎一切。然后它们像来时一样很快消亡了,我们只好四处逃命尝试躲开亡灵。一两天后,供电也都没有了。" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -169392,10 +174637,6 @@ msgstr "为自由商会工作是什么样的?" msgid "What was working for the Old Guard like?" msgstr "为旧世守护者工作是什么样的?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "谢谢你的故事。" - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "谢谢你的故事。我们该走了。" @@ -169627,6 +174868,23 @@ msgstr "" msgid "What were you saying before that?" msgstr "你刚刚还说了什么?" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" +"实话跟你说,我更关心婚礼策划,而非时事要闻。我知道外面有暴乱发生,但他们已经出城了。即使当他们离家越来越近的时候,我尽力尝试无视他们,这样可以好好过我们大喜的日子。但是在丧尸开始出现之后,一切都变得非常奇怪了。当我从婚礼逃出来时,我发誓我看到天空裂开了,怪物从洞里飞出来,就像独立日电影里的那样。我不知道它们是什么,看起来像是黑魔法之类的。" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "嗨,那边那位。" @@ -170156,7 +175414,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "马上滚出我的农场,我不跟政府的走狗说话。" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "继续……" #: lang/json/talk_topic_from_json.py @@ -170556,10 +175814,6 @@ msgid "" " catastrophe." msgstr "你最好马上离开我的地盘,这次灾难早就显示了政府的无能。" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "说吧……" - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "你老婆呢,她在这吗?" @@ -171204,15 +176458,15 @@ msgstr "好吧,我也会和他们谈谈的。" msgid "All right! Let's get going." msgstr "好的!那我们走吧。" +#: lang/json/talk_topic_from_json.py +msgid "We've done it! We've solved the list!" +msgstr "成功了!购物清单完成了!" + #: lang/json/talk_topic_from_json.py msgid "" "How's things with you? My cardboard collection is getting quite impressive." msgstr "近况如何?我收集的纸箱越来越多了!" -#: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "成功了!购物清单完成了!" - #: lang/json/talk_topic_from_json.py msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "我跟你说过硬纸板的事吗,朋友?你有吗?" @@ -172008,10 +177262,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." -msgstr "真恶心,不是吗?像个野人一样。大灾难过后不久,我身上就开始到处长毛。不知道是什么引起的。我不怪他们讨厌这玩意,我也讨厌。" +msgstr "真恶心,不是吗?像个野人一样。大灾变过后不久,我身上就开始到处长毛。不知道是什么引起的。我不怪他们讨厌这玩意,我也讨厌。" #: lang/json/talk_topic_from_json.py msgid "" @@ -172752,7 +178006,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -173862,12 +179116,12 @@ msgstr "你是怎么到这里来的?" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" "达娜和我是最早撤离的一批,因为她怀了孩子。我们被带到一个集合中心,在那里坐上了一辆巴士。那巴士被一个巨大的怪物掀翻了,很多人死在那里。我们与其他几个人设法逃脱,一直走到这儿。其实我们走的并不远,不知为何那怪物并没有追我们,只是继续撕扯那辆巴士。" @@ -173999,12 +179253,12 @@ msgstr "过的和我预想的一样,只能这么说了。不过感谢你的关 #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" "说来话长。我不是这附近的人,实际上我是从加拿大西部来的。我一直想见识一下新英格兰,我在这里度假的时候,嗯,你知道的。我被疏散到了这里,但因为我不是美国公民,他们不让我下楼。我能理解他们的做法,即使我不太喜欢。说实话,我还在尝试着接受事实,接受我可能永远无法知道我的家人和乐队情况的事实。" @@ -174073,7 +179327,7 @@ msgid "Hm? Oh, hi." msgstr "哈?哦,嗨。" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "……嗨。" #: lang/json/talk_topic_from_json.py @@ -174448,8 +179702,8 @@ msgstr "是的,我不知道你做了什么来说服他们搬出去,但是我 #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" "即使我们把这一切事情都解决了,这里也没有足够的床位给每个人,而且肯定也没有足够的补给。现在我们处境艰难。我们只能提供些力所能及的帮助……至少他们有个安全的地方呆着。" @@ -174468,9 +179722,9 @@ msgstr "你们的处置室出了什么问题?" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -174800,7 +180054,7 @@ msgid "" msgstr "我们才不会把你这种废物放在眼里,有事办事,办完赶紧滚开。" #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." +msgid "I'm not in charge here, you're looking for someone else…" msgstr "我在这只是个干活的,要谈事情的话找别人去吧……" #: lang/json/talk_topic_from_json.py @@ -174848,11 +180102,11 @@ msgid "Well, I'd better be going. Bye." msgstr "好吧,我最好先走了。再见。" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." +msgid "Welcome marshal…" msgstr "欢迎您,执法官……" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." +msgid "Welcome…" msgstr "欢迎……" #: lang/json/talk_topic_from_json.py @@ -175094,11 +180348,11 @@ msgstr "" "不幸的是,没有。离开的大部分人原本就被困在楼上,他们所承担的风险已经比那些有张安全的床的人要小。地下室里只带出了几个人,当我们开始计划的时候地下室已经太拥挤了。我们希望有更多的人到农场去晒晒太阳,呼吸新鲜空气,干点苦活……但是你可能猜到了,人们更害怕被尸群袭击。" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." +msgid "Marshal…" msgstr "你好,执法官……" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." +msgid "Citizen…" msgstr "你好,公民……" #: lang/json/talk_topic_from_json.py @@ -175712,7 +180966,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" "考虑到目前的情况,我们可以打折卖给你一套我们的防护装备:防护服、防毒面具和滤芯。我们只要两枚我们的硬币。\n" "\n" @@ -175766,6 +181020,18 @@ msgstr "你知道这里的规矩的,祝你好运。" msgid "Got it." msgstr "知道了。" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "我们最好盯着路。" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "这里最好小心点。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "怎么了?" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "有什么事吗?" @@ -175778,14 +181044,14 @@ msgstr "我这里按小时计费,所以快点……" msgid "Hey." msgstr "嗨。" -#: lang/json/talk_topic_from_json.py -msgid "Yes?" -msgstr "怎么了?" - #: lang/json/talk_topic_from_json.py msgid "Good to see you." msgstr "很高兴见到你。" +#: lang/json/talk_topic_from_json.py +msgid "About those jobs…" +msgstr "关于那些任务……" + #: lang/json/talk_topic_from_json.py msgid "Good to see you around." msgstr "很高兴再次见到你。" @@ -175795,8 +181061,8 @@ msgid "Want help with something else?" msgstr "还有什么需要吗?" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." -msgstr "算了,我该走了。" +msgid "Lets set a combat strategy" +msgstr "让我们制定一个作战策略" #: lang/json/talk_topic_from_json.py msgid "" @@ -175849,6 +181115,10 @@ msgstr "最近有啥有趣的事吗?" msgid "Anything on your mind?" msgstr "你在想什么呢?" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "想要帮忙吗?" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "你对我们这个雇主有了解吗?" @@ -175892,15 +181162,15 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "你这么一说,确实有点奇怪。" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." +msgid "Thinking I should go hunt something soon…" msgstr "看来我有个狩猎目标了……" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." +msgid "Wondering if things will get better someday…" msgstr "也不知道情况会不会好起来……" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." +msgid "Hmm? Nothing, I guess I just like resting in this place." msgstr "嗯?没什么,我想我只是喜欢在这个地方休息。" #: lang/json/talk_topic_from_json.py @@ -175940,8 +181210,8 @@ msgstr "文明举止,佣兵。" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." -msgstr "路上的坏家伙无穷无尽,也许你应该专心工作,执法官……" +"marshal…" +msgstr "路上仍然有不少不法分子,也许你应该专心工作,执法官……" #: lang/json/talk_topic_from_json.py msgid "You see anything you want, marshal?" @@ -176009,7 +181279,7 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "眼下好像没什么需要你帮忙的。" #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." +msgid "Stand still while I get my clippers…" msgstr "请稍等,让我拿把剪刀来……" #: lang/json/talk_topic_from_json.py @@ -176388,8 +181658,8 @@ msgid "" msgstr "我自己是不怎么需要的,不过我们派出去回收载具的小队应该是需要帮手的,但他们大部分时间都在哨站外面,恐怕不太好找。" #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "请离我远一点……" +msgid "Please leave me alone…" +msgstr "请让我一个人静静……" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -176407,14 +181677,13 @@ msgstr "那可真糟糕。" #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." -msgstr "我不知道你能做什么。什么我都试过了。也许多给我点时间就好……" +"I don't know what you could do. I've tried everything. Just give me time…" +msgstr "我不知道你还能做些什么。什么我都试过了。也许多给我点时间就好……" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." +"seems like I can't keep anything down…" msgstr "我一直在生病!起初我猜是不是我吃坏肚子了,可现在我吃什么吐什么……" #: lang/json/talk_topic_from_json.py @@ -176539,8 +181808,8 @@ msgstr "反正我也不想加入你们那个俱乐部。" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "这里?水果和浆果。也许偶尔是农场设备,但你需要加密币。" #: lang/json/talk_topic_from_json.py @@ -176867,6 +182136,267 @@ msgstr "现在活下来的人太少了,再也没法把我区分开了。除了 msgid "Now I choose the cause I'll die for." msgstr "现在我可以自己选择了能为之死去的信条了。" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "是的。我这么问是因为我注意到周围有很多恐龙。你知道关于它们的事吗?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" +"我知道各种奇怪又无用的知识。我在教堂看到过东西,在农场看到过东西,我看过整场展览。那些沼泽人,他们知道发生了什么。他们是光之生物,回来拯救我们所有人。也许是吃掉我们,我记不清了。" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "大食客们必将进食。" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "欢迎。你饿了吗朋友?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "你看起来很饿,朋友。世界上有那么多的饥饿。现在是大食客们的时代。" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "啊。谁是大食客?" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "关于大食客……" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "之前你提到过什么伪神。那是什么?" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "有什么方法可以让我帮你喂养大食客吗?" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "我该走了。保重,CEO巴罗尼克斯。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "大食客和假食客都回来了。我们必须喂饱大食客,消灭伪神之子。" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "什么?你在说什么?" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "不了,谢谢,我想我该走了。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" +"这场大灾变唤醒了那些迷失在时间里的大食客们,让他们回到这个世界去完成他们伟大的工作,繁衍生息,用他们的歌声填满这片土地。人类的时代已经结束了,但我们这些有幸活下来的少数人应当尽我们的一份力量来保护这个新世界不受那些会偷肉的伪神的伤害。" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "那么你究竟对那些肉做了什么呢?" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "谁是大食客,谁又是伪神?" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "还有其他人活着吗?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" +"大食客是那些已经消失的,我们称之为恐龙的动物,它们的肉被我们拿走了,而他们正在把它取回。伪神是那些来偷这个世界的肉的外人。它不属于他们,我们会从他们嘴里拿走。" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "好吧,所以你们供奉的是恐龙。懂了。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "沼泽教教众们知道这些日子会回来,我们为他们做了准备。当别人浪费他们的时间和肉的时候,我们吃饱了,变强了,现在我们的商店里堆满了肉。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "是的,很好。" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "你一直在说肉。为什么肉这么重要?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" +"肉使大食客强壮。我们把肉收起来喂他们,最后我们也要以死亡来供奉大食者,正如我们活着时一样。这一直是我们的目标,我们这几个人有幸能活着看到它实现。" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "我们的目标?你怎么知道的?" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "一位预言家预言了大食客们的回归。我们这些忠心的人,自从这神启开始,就一直在等候和准备。" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "我想被证明是对的一定让你感觉很好。" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "这也太疯狂了。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "你理解我们的目标。我欢迎你加入这项工作,所有的食物都需要被用来喂饱大食客。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "你否认眼前的一切。这个世界早就被神告知过了。" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "大食客们已经吃饱了。他们很快又会饿的。" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "你知道该怎么做。" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "大食客们必须进食。你准备好了吗?" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "还有更多的工作要做。你准备好了吗?" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "可以喂肉了。你准备好了吗?" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "大食客们饿了。" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "我们需要更多的肉。" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "我想大食客要吃肉了。" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "下次再说吧,CEO巴罗尼克斯。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "如果你准备好为大食客效劳,就去找些肉带回来。这里总是需要更多肉。" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "很高兴能为大食客效劳。算我一个。" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "太棒了。加油干吧。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "大食客们并不挑剔,任何纯净的肉都可以,但变异和污染的肉不行。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "所以,任何不是丧尸或怪物的生物的肉。明白了。" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "当然,在这里你应该能找到你需要的一切。" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "这就解释了为什么这里会有刀。" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "哦,你认识我的朋友布丽吉特。好吧,那样的话,我们走吧!" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "不,我必须留在这里管理公司。" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "好吧,CEO巴罗尼克斯。" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "真棒!" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "现在还不行,你必须留在这里管理公司。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "当然,当你准备好的时候,公司也会随时准备好的,而且大食客们总会找到方法进食的。" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "据说,当大食客回来时,那些来偷肉的伪神也会回来。神示里对我们的要求不多,除了我们需要确保真正的大食客得到尽可能多的肉,并让假食客们去挨饿。" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "是的,CEO巴罗尼克斯。很好,CEO巴罗尼克斯。" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "这都是胡说八道,我不想再谈这件事了。" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "你好,伙计。" @@ -176964,15 +182494,15 @@ msgid "Oh, you again." msgstr "哦,又是你。" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" -msgstr "哼?*喃喃自语*……你是谁?" +msgid "Huh? *mumble mumble* … Who are you?" +msgstr "哈?*喃喃自语*……你是谁?" #: lang/json/talk_topic_from_json.py msgid "I'm busy, what is it?" msgstr "我很忙,怎么了?" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "然后丢下我这座塔和我所有的研究?我还是不要了。" #: lang/json/talk_topic_from_json.py @@ -177119,7 +182649,7 @@ msgstr " 并指如矛,猛击 %s" #: lang/json/technique_from_json.py msgid "Lizard Tail" -msgstr "壁虎之尾" +msgstr "壁虎扫尾" #: lang/json/technique_from_json.py #, python-format @@ -177399,10 +182929,6 @@ msgstr "你格挡了%s的攻击" msgid " blocks %s" msgstr "格挡了%s的攻击" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "招架" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -179837,6 +185363,90 @@ msgstr "你对 %s 和其周围的人发动回旋斩" msgid " unleashes a spin attack against %s and those nearby" msgstr " 对 %s 和其周围的人发动回旋斩" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "缴械攻击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "你巧妙地将%s缴械" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "巧妙地将%s缴械" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "快速整顿" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "你没能击中 %s,但转瞬间就已恢复 " + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr " 没能击中 %s,但转瞬间就已恢复 " + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "终结之舞" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "你用一记强力的劈砍终结了 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr " 用一记强力的劈砍终结了 %s" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "晕眩打击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "你用力击晕了 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr " 用力击晕了 %s" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "钢铁之风" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "你像钢铁之风一样劈穿了%s和附近的敌人" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "像钢铁之风一样劈穿了%s和附近的敌人" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "收割之刃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "你干净利落地收割了%s和附近的敌人" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "干净利落地收割了%s和附近的敌人" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "导力反转" @@ -179893,6 +185503,216 @@ msgstr "你如导弹一般对%s发动超音速冲击。" msgid " launches a supersonic punch at %s" msgstr "如导弹一般,突破音速撞向%s。" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "百万吨重踢" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "你对%s使用了百万吨重踢" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "对%s使用了百万吨重踢" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "DD金勾臂" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "你对%s使用了DD金勾臂" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "对%s使用了DD金勾臂" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "修长之角" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "你对%s使用了修长之角" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "对%s使用了修长之角" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "下盘踢" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "你对%s使用了下盘踢" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "对%s使用了下盘踢" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "真·斗转星移" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "你反转并回击了 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr " 反转并回击了 %s" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "破龙击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "你精准一击打断了 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr " 精准一击打断了 %s" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "暮日投" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "你使出一招暮日投,将%s丢倒在地" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "使出一招暮日投,将%s丢倒在地" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "穿云投" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "你使出一招穿云投,将%s远远丟倒在地" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "使出一招穿云投,将%s远远丟倒在地" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "流水击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "你用流畅的动作格挡并回击了%s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "用流畅的动作格挡并回击了%s" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "缴械斩" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "你用武器轻轻一砍,将 %s 缴械" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr " 用武器轻轻一砍,将 %s 缴械" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "沙拉克扫击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "你迅速地扫击了%s和附近的敌人" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "迅速地扫击了%s和附近的敌人" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "巨山破" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "你用一记巨山破砸向 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr " 用一记巨山破砸向 %s" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "地动山摇" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "你用一记地动山摇将 %s 砸翻" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr " 用一记地动山摇将 %s 砸翻" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "巨人冲击" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "你用一记巨人冲击击碎了 %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr " 用一记巨人冲击击碎了 %s" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "狼獾势" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "%s 试图抓住你,但你奋力挣脱了。" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "%s 试着抓住 ,但被奋力挣脱了!" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "大地纹丝不动,拒绝服从你的命令。" @@ -179938,6 +185758,10 @@ msgstr "枯木重生。" msgid "Life springs anew from the dead grass." msgstr "生命从枯死的草丛中重新涌发。" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "门被强行打开了!" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "焦土" @@ -180898,223 +186722,29 @@ msgid "" msgstr "一段金属栏杆,放置在适当的位置,以防止人员坠落或轻易离开。" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "泥土地" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "泥土地,看来土壤适合耕种。也可以开发建设项目。" - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "噗通" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." -msgstr "一大片优质细砂,如果开采得当,可以在很多方面发挥作用。" - -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "泥地" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "一块泥泞湿滑的泥地。" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "黏土" - -#. ~ Description for clay -#: lang/json/terrain_from_json.py -msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "一块充满可塑性黏土的场地,如果开采得当,挺适用来烧窑。" - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "黏土堆" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "一堆黏土。" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "啪叽!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "沙堆" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "一堆沙子。" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "土堆" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "一块开好垄的泥土地,不容易穿行。仔细检查,可以发现它很适合种植。" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "一个大土丘,看起来可以爬进去当掩蔽。" - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "古怪的裂痕" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "一个不自然的人形洞,看上去有种奇怪的熟悉感觉。你觉得自己有种想要靠近仔细观察的冲动,仿佛它本来就和你是一体的一般。" - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "墓地" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "一个泥土坟墓,上面长着一些草。至少有些死者确实安息了。" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "一座新坟,用石头盖着既防止他人挖开又防止里面的东西挖出来。有两块木板标识着某人永恒安息之地。" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "石地板" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "相对平坦的岩石区。看来稳定程度足堪采矿设备的开掘。" - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "路面" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr " 一段铺了柏油的路面,因为裂缝、冻胀和缺乏维护而逐渐老化。" - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "黄线路面" +msgid "overgrown floor" +msgstr "血肉覆盖的地板" -#. ~ Description for yellow pavement +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "禁止司机跨越的双黄线。再也没有人来执行这些规则了。" - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "人行道" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "一段现浇混凝土路面。因为缺乏维护而毁于冻胀和大裂缝。" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "一种新式的水泥浇筑块,表面处理兼顾了美观与抗冻-融循环功能。" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "一种新式的水泥浇筑块,表面处理兼顾了美观与抗冻-融循环功能。外部涂上一层黄色的油漆。" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "木地板" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." -msgstr "木质楼板,由扎紧的木板钉牢而成。常见于露台。" +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." +msgstr "一层裸露的混凝土地板,几乎完全被不断抽搐的细小灰色肉丝所覆盖。" #: lang/json/terrain_from_json.py msgid "SMASH!" msgstr "啪嗒!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "金属地板" +msgid "overgrown wall" +msgstr "血肉覆盖的墙" -#. ~ Description for metal floor +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." -msgstr "高质量的坚固网纹地板,可以减小滑倒的风险。" - -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "油毡地砖" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "用坚硬的橡胶材料制成的地板。涂上简单的白色。" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "用坚硬的、灰色的橡胶材料制成的地板。" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "泥地板" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." -msgstr "由材质细腻的土壤夯实而成的泥土地板。" +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." +msgstr "一面裸露的混凝土墙,几乎完全被奇怪血管和肉结组成的网格所覆盖。" #: lang/json/terrain_from_json.py msgid "concrete floor" @@ -181197,6 +186827,21 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "未完成的钢筋水泥结构,地板尚未整平,屋顶也还没盖严实。" +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "石地板" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "相对平坦的岩石区。看来稳定程度足堪采矿设备的开掘。" + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "金属地板" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -181204,6 +186849,10 @@ msgid "" " with a matching roof." msgstr "高品质的坚固花纹地板,可降低滑倒和摔倒的风险,配有相应的屋顶。" +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "噗通" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "地板" @@ -181246,6 +186895,10 @@ msgid "" "resistance and sliding, commonly for recreational sports." msgstr "经过化学材料防滑处理过的硬木地板,通常用于休闲运动场所。" +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "泥地板" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -181328,28 +186981,15 @@ msgid "A blue section of flooring." msgstr "一块蓝色地面。" #: lang/json/terrain_from_json.py -msgid "industrial carpet" -msgstr "工业地毯" +msgid "carpet" +msgstr "地毯" -#. ~ Description for industrial carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." -msgstr "坚固、低绒毛、高耐久性的中性灰色地毯,用于铺设在裸露的混凝土上。" - -#: lang/json/terrain_from_json.py -msgid "bunker carpet" -msgstr "地堡地毯" - -#. ~ Description for bunker carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "坚固、低绒毛、完全不可燃的中性奶油色地毯,下面有绝缘层。" +msgid "Base carpet!" +msgstr "基础地毯模板。" -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "柔软的红色地毯。" @@ -181369,6 +187009,124 @@ msgstr "柔软的绿色地毯。" msgid "Soft purple carpet." msgstr "柔软的紫色地毯。" +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "地毯" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "基础地毯模板。" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "工业红地毯" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "坚固、低绒毛、高耐久性的红色地毯,用于铺设在裸露的混凝土上。" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "工业黄地毯" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "坚固、低绒毛、高耐久性的黄色地毯,用于铺设在裸露的混凝土上。" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "工业绿地毯" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "坚固、低绒毛、高耐久性的绿色地毯,用于铺设在裸露的混凝土上。" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "工业紫地毯" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "坚固、低绒毛、高耐久性的紫色地毯,用于铺设在裸露的混凝土上。" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "基础地毯模板。" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "地堡红地毯" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "坚固、低绒毛、完全不可燃的红色地毯,下面有绝缘层。" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "地堡黄地毯" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "坚固、低绒毛、完全不可燃的黄色地毯,下面有绝缘层。" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "地堡绿地毯" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "坚固、低绒毛、完全不可燃的绿色地毯,下面有绝缘层。" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "地堡紫地毯" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "坚固、低绒毛、完全不可燃的紫色地毯,下面有绝缘层。" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "油毡地砖" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "用坚硬的橡胶材料制成的地板。涂上简单的白色。" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "用坚硬的、灰色的橡胶材料制成的地板。" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "染色打蜡地板" @@ -181404,6 +187162,33 @@ msgid "" msgstr "" "一个由锈迹斑斑的废金属制成的简单的屋顶和地板,被螺栓和铁丝绑在一个简易框架上。在世界末日后的棚户区非常流行。希望你喜欢雨点打在褶皱金属板上的声音。" +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "泥土地" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "泥土地,看来土壤适合耕种。也可以开发建设项目。" + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "一大片优质细砂,如果开采得当,可以在很多方面发挥作用。" + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "泥地" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "一块泥泞湿滑的泥地。" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "苔藓" @@ -181413,6 +187198,30 @@ msgstr "苔藓" msgid "Moist spongy moss." msgstr "潮湿松软的苔藓。" +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "黏土" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "一块充满可塑性黏土的场地,如果开采得当,挺适用来烧窑。" + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "黏土堆" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "一堆黏土。" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "啪叽!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "纸地板" @@ -181422,6 +187231,131 @@ msgstr "纸地板" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "一块由纤维物质制成的地板,上面覆盖了粘乎乎的黄蜂唾液。" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "沙堆" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "一堆沙子。" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "土堆" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "一块开好垄的泥土地,不容易穿行。仔细检查,可以发现它很适合种植。" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "一个大土丘,看起来可以爬进去当掩蔽。" + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "古怪的裂痕" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "一个不自然的人形洞,看上去有种奇怪的熟悉感觉。你觉得自己有种想要靠近仔细观察的冲动,仿佛它本来就和你是一体的一般。" + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "墓地" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "一个泥土坟墓,上面长着一些草。至少有些死者确实安息了。" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "一座新坟,用石头盖着既防止他人挖开又防止里面的东西挖出来。有两块木板标识着某人永恒安息之地。" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "路面" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr " 一段铺了柏油的路面,因为裂缝、冻胀和缺乏维护而逐渐老化。" + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "黄线路面" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "禁止司机跨越的双黄线。再也没有人来执行这些规则了。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "人行道" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "一段现浇混凝土路面。因为缺乏维护而毁于冻胀和大裂缝。" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "一种新式的水泥浇筑块,表面处理兼顾了美观与抗冻-融循环功能。" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "一种新式的水泥浇筑块,表面处理兼顾了美观与抗冻-融循环功能。外部涂上一层黄色的油漆。" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "木地板" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "木质楼板,由扎紧的木板钉牢而成。常见于露台。" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "高质量的坚固网纹地板,可以减小滑倒的风险。" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "由材质细腻的土壤夯实而成的泥土地板。" + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "核桃树" @@ -183069,7 +189003,7 @@ msgstr "一台用来给奶牛挤奶的机械。" #: lang/json/terrain_from_json.py msgid "bulk tank" -msgstr "储奶罐" +msgstr "大型储罐" #. ~ Description for bulk tank #: lang/json/terrain_from_json.py @@ -185210,6 +191144,78 @@ msgstr "往上的梯子。" msgid "A ladder leading down." msgstr "向下的梯子。" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "向下斜坡(顶部)" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "一段通往下层的铺了柏油的斜坡顶部。" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "向下斜坡(底部)" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "一段通往下层的铺了柏油的斜坡底部。" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "向上斜坡(顶部)" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "一段通往上层的铺了柏油的斜坡顶部。" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "向上斜坡(底部)" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "一段通往上层的铺了柏油的斜坡底部。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "向下人行道(顶部)" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "一段通往下层的人行道顶部。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "向下人行道(底部)" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "一段通往下层的人行道底部。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "向上人行道(顶部)" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "一段通往上层的人行道顶部。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "向上人行道(底部)" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "一段通往上层的人行道底部。" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "向下斜坡" @@ -185703,7 +191709,7 @@ msgstr "嘣!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "砰!" @@ -187509,6 +193515,11 @@ msgstr "木制船壳" msgid "A wooden board that keeps the water out of your boat." msgstr "一块木板,可以把水挡在船外。" +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "绑在一起的原木,可以把水挡在船外。" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -187947,14 +193958,19 @@ msgid "" msgstr "一种重型牵引索。当一头连接至另一辆车后,可以拉动其他车辆。" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "木椅" +msgid "flimsy wooden seat" +msgstr "薄木椅" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "一个可以坐的地方。" +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "木椅" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "木钉刺" @@ -188158,6 +194174,15 @@ msgid "" "extending the time until the food spoils." msgstr "一个60升容量的冷藏罐。开启时,冷却里面的液体,延缓腐烂。" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "一种带有孔的木片,适合自行车车轮使用。" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "木制轮架(可转向)" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "轻型轮架(可转向)" @@ -188763,6 +194788,11 @@ msgstr "游戏开始" msgid "At least %s from %s (%s remaining)" msgstr "至少已经过 %s 自 %s 起(还需 %s)" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "恰好于 %s 自 %s 起" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -188779,13 +194809,14 @@ msgid "Within %s of %s (passed)" msgstr "于 %s 之内自 %s 起(已超出)" #: src/achievement.cpp -msgid "Triggered by " -msgstr "触发条件:" +#, c-format +msgid "Triggered by %s" +msgstr "触发于 %s" #: src/achievement.cpp #, c-format -msgid "%s/%s " -msgstr "%s/%s" +msgid "%s/%s %s" +msgstr "%s/%s %s" #: src/achievement.cpp msgid " (further requirements hidden)" @@ -188988,8 +195019,9 @@ msgstr "你想打开门锁,结果不仅失败了,还损坏了你的工具。 msgid "The lock stumps your efforts to pick it." msgstr "你想打开门锁,结果失败了。" -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "不能在骑乘时这样做。" @@ -189052,6 +195084,120 @@ msgstr "继续尝试入睡。" msgid "Continue trying to fall asleep and don't ask again." msgstr "继续尝试入睡并不再提示。" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "你太累了,无法锻炼。" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "你太渴了,无法锻炼。" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "需要空出双手。" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "你无法用已经骨折的手锻炼。" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "你无法用已经骨折的腿锻炼。" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "你无法用已经骨折的肢体锻炼。" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "锻炼强度决定了锻炼效率,也决定了体力消耗速率。" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "选择锻炼强度:" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "轻度锻炼的强度与步行相近,但更集中而且更有计划。" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "适度" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "适度锻炼不会造成过度劳累,但强度已经足够让你汗流浃背。" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "积极" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "积极锻炼使全身充分参与锻炼。运动很剧烈,但仍然在你的可控范围内。" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "高强度锻炼竭尽全力进行充分锻炼。长期来看会让你精疲力竭。" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "锻炼多久(分钟):" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "你开始进行锻炼。" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "你太累了,所以你提前结束了锻炼。" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "你太渴了,所以你提前结束了锻炼。" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "自己气喘吁吁!" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "你停下来喘了一会气。" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "你重新开始锻炼。" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "你完成了锻炼。" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "你已经完成了你的锻炼周期,继续锻炼?" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "停止锻炼。" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "继续锻炼。" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "继续锻炼并不再提示。" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -189498,7 +195644,7 @@ msgstr "你无法呼吸,呼吸停止了。" #: src/activity_handlers.cpp msgid "You're too tired to continue." -msgstr "你太疲劳了以至于无法继续。" +msgstr "你太累了,无法继续。" #: src/activity_handlers.cpp src/vehicle_move.cpp src/vehicle_use.cpp #, c-format @@ -190692,7 +196838,7 @@ msgstr "[<] %1$d / %2$d页 [>]" msgid "< [%s] Sort: %s >" msgstr "< [%s] 排序:%s >" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "[%s] 筛选" @@ -193598,6 +199744,29 @@ msgstr "%s(%i 个空位);" msgid "Increased storage capacity by %i." msgstr "能量储备上限增加 %i。" +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "选择节能能量阈值" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "能量全满" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "高于80%%" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "高于55%%" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "高于30%%" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "选择自启能量阈值" @@ -193763,8 +199932,9 @@ msgid "(incapacitated)" msgstr "(失效)" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" -msgstr "(节能模式)" +#, c-format +msgid "(fuel saving ON > %d %%)" +msgstr "(高于%d%%时节能)" #: src/bionics_ui.cpp #, c-format @@ -193835,10 +200005,18 @@ msgstr "" msgid "Accuracy" msgstr "命中" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "暴击几率" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "闪避" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "格挡效率" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "速度" @@ -194317,20 +200495,25 @@ msgstr " 站了起来。" #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%s 挣脱了蛛网的束缚!" +msgid "The %s escapes the bear trap!" +msgstr "%s 从捕熊陷阱中脱出!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "你从网中挣脱出来!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "你的%s尝试从捕熊陷阱里挣脱出来,但是失败了。" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr " 从网中挣脱出来!" +msgid "You free yourself from the bear trap!" +msgstr "你从捕熊陷阱中挣脱了出来!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "你尝试从网中挣脱出来,但是失败了。" +msgid " frees themselves from the bear trap!" +msgstr " 从捕熊陷阱挣脱了出来!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "你尝试从捕熊陷阱里挣脱出来,但是失败了。" #: src/character.cpp src/monster.cpp #, c-format @@ -194366,28 +200549,6 @@ msgstr " 从大型捕猎陷阱中挣扎了出来!" msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "你尝试从大型捕猎陷阱中挣扎出来,但是失败了。" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%s 从捕熊陷阱中脱出!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "你的%s尝试从捕熊陷阱里挣脱出来,但是失败了。" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "你从捕熊陷阱中挣脱了出来!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr " 从捕熊陷阱挣脱了出来!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "你尝试从捕熊陷阱里挣脱出来,但是失败了。" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "你从瓦砾中挣脱了出来!" @@ -194400,18 +200561,6 @@ msgstr " 从瓦砾中挣脱了出来!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "你尝试从瓦砾中挣脱出来,但是失败了。" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "你试图从深坑里头爬出来,但是又滑落进去了。" - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "你逃离了深坑!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr " 逃离了深坑!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -194451,6 +200600,52 @@ msgstr "你挣脱了!" msgid " breaks out of the grab!" msgstr " 挣脱了!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%s 挣脱了蛛网的束缚!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "你从网中挣脱出来!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr " 从网中挣脱出来!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "你尝试从网中挣脱出来,但是失败了。" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "%s 挣脱了!" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "你挣脱了出来!" + +#: src/character.cpp +msgid " frees themselves!" +msgstr " 挣脱了出来!" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "你尝试挣脱,但是失败了。" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "你试图从深坑里头爬出来,但是又滑落进去了。" + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "你逃离了深坑!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr " 逃离了深坑!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -194752,11 +200947,11 @@ msgstr "错误!" #: src/character.cpp src/npctalk.cpp msgid "Exhausted" -msgstr "精疲力尽" +msgstr "精疲力竭" #: src/character.cpp msgid "Dead Tired" -msgstr "精疲力尽" +msgstr "疲惫不堪" #: src/character.cpp msgid "Pain " @@ -195291,6 +201486,10 @@ msgstr "海量运动" msgid "Your body strains under the weight!" msgstr "你的身体由于负重过高而感到疼痛!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "你的生物特性与那件医疗用品不兼容。" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -198258,14 +204457,6 @@ msgstr "渲染测试(秒)" msgid "Test trait group" msgstr "测试特性组" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "显示调试信息" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "强制游戏崩溃(测试崩溃处理)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "在地图上切换NPC寻路" @@ -198294,6 +204485,18 @@ msgstr "信息…" msgid "Enable achievements" msgstr "启用成就" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "显示调试信息" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "强制游戏崩溃(测试崩溃处理)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "退出至主菜单" + #: src/debug_menu.cpp msgid "Game…" msgstr "游戏..." @@ -198390,10 +204593,6 @@ msgstr "嵌套式生成地图" msgid "Map…" msgstr "地图…" -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "退出至主菜单" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -198917,6 +205116,10 @@ msgstr "标记任务完成" msgid "Remove mission without proper cleanup" msgstr "强制移除任务" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "渲染测试进行中……" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -199434,19 +205637,6 @@ msgstr "" "室内:%s\n" "屋顶:%s" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" -"可见:%d\n" -"回避:%d\n" -"难度:%d\n" -"无害:%s" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -200143,138 +206333,182 @@ msgid "Liked" msgstr "喜欢" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "传奇" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "无人质疑" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" msgstr "强大" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" msgstr "著名" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "广为人知" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "时常提起" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "渣滓" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "害虫" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" -msgstr "卑劣" +msgstr "卑劣不堪" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "寄生虫" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" -msgstr "水蛭" +msgstr "吸血鬼" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "笑柄" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "中立" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "壕无人性" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "富甲一方" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "繁荣昌盛" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "丰衣足食" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" -msgstr "舒适" +msgstr "小康之家" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "囊中羞涩" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "捉襟见肘" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "不名一文" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "一无所有" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "酒池肉林" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "户有余粮" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "野果裹腹" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "营养不良" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "饥肠辘辘" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "举世无双" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" -msgstr "所向无敌" +msgstr "所向披靡" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" -msgstr "兵强将勇" +msgstr "精兵强将" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" -msgstr "兵强马壮" +msgstr "人强马壮" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "半斤八两" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "势单力薄" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "老弱病残" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "弱不禁风" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "百无一用" @@ -200885,12 +207119,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -200899,12 +207133,12 @@ msgid "" "Positions: %d/3\n" msgstr "" "说明:\n" -"选择一名同伴去收集灌木和重木棍。\n" +"选择一名同伴去收集灌木和树枝。\n" "\n" "技能:生存\n" "需求等级:N/A\n" "可能的收集物:\n" -"> 重木棍\n" +"> 粗树枝\n" "> 枯萎植物\n" "> 碎木\n" "\n" @@ -202174,8 +208408,8 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "你没有设置营地食品区。中止……" #: src/faction_camp.cpp -msgid "No items are located at the drop point…" -msgstr "食物储藏点没有任何物品……" +msgid "No suitable items are located at the drop points…" +msgstr "食物储藏点没有任何符合要求的食品……" #: src/faction_camp.cpp #, c-format @@ -202387,6 +208621,15 @@ msgstr "%s 过于接近!" msgid "Wait till you wake up…" msgstr "等待你醒来……" +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" +"\n" +"按 %s 中断" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -202497,6 +208740,11 @@ msgctxt "action" msgid "open" msgstr "开启" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "口袋自动拾取设置" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -203580,6 +209828,10 @@ msgstr "你没有可以装填的物品。" msgid "You aren't holding something you can reload." msgstr "你并未手持任何能够装填的物品。" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "你得先把袋子收起来,然后再试着手持物品。" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -204007,11 +210259,25 @@ msgstr "你从 %s 旁边挤了过去。" msgid "You cannot haul items here." msgstr "你不能在这里搬运物品。" +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "%s挡在路上!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "%s挡住了你!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "%s 真的要挤过去吗?你可能要杀出一条血路才能回来。" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -205385,11 +211651,6 @@ msgstr "一个傻子挡住路了!" msgid "The %s is in the way!" msgstr "%s挡在路上!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "%s挡在路上!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -206120,6 +212381,10 @@ msgstr "已忽略被激光瞄准!" msgid "Creature whitelisted: %s" msgstr "怪物白名单:%s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "开始锻炼?" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "确认自杀?" @@ -206648,6 +212913,11 @@ msgstr "你开始破解保险箱。" msgid "Attempt to hack this safe?" msgstr "尝试破解保险箱?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "%s上锁了。你要是有把合适的工具就好了……" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -207467,11 +213737,28 @@ msgstr "乱动这个 %s 看起来非常危险,最好别去碰它。" msgid "There is a %s there. Take down?" msgstr "那里有一个 %s。拿下来吗?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "%s 被拆除。" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "那里有一个 %s。是否拆除?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "你成功解除了陷阱!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "你拆解陷阱失败。" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "你拆解陷阱失败,而且你把它触发了!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -207846,6 +214133,10 @@ msgstr "选择要移除的生化插件" msgid "Splint broken limbs" msgstr "断肢夹板" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "治疗伤势" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "你没有任何已安装的生化插件。" @@ -207873,16 +214164,78 @@ msgid " doesn't have limbs that require splinting." msgstr " 的四肢完好,不需要夹板。" #: src/iexamine.cpp -msgid "This mill already contains flour." -msgstr "这个碾磨机已经装满了面粉。" +msgid "You don't have any wounds that need treatment." +msgstr "你没有任何需要治疗的伤口。" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." -msgstr "再次碾磨前请把碾磨机清空。" +msgid " doesn't have any wounds that need treatment." +msgstr " 没有任何需要治疗的伤口。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "全自动医疗仪检测到了你体内的细菌感染,但是由于它也检测到你已经服用了抗生素,所以它决定现在不再使用第二份抗生素。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "全自动医疗仪检测到了 体内的细菌感染,但是由于它也检测到已经服用了抗生素,所以它决定现在不再使用第二份抗生素。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "全自动医疗仪检测到了你体内的细菌感染,并注射抗生素来治疗它。" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "全自动医疗仪检测到了 体内的细菌感染,并注射抗生素来治疗它。" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "肌肉痉挛开始缓解了。" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "药物无法缓解当前的痉挛症状。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "全自动医疗仪检测到了你的 %s 出血,并注射止血药物来阻止流血。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "全自动医疗仪检测到了 的 %s 出血,并注射止血药物来阻止流血。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "全自动医疗仪检测到了你的 %s 的开放性伤口,并使用消毒剂来清洗它。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "全自动医疗仪检测到了 的 %s 的开放性伤口,并使用消毒剂来清洗它。" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" +msgid "This mill contains %s, which can't be milled!" msgstr "碾磨机里有%s,无法被碾磨!" #: src/iexamine.cpp @@ -208056,8 +214409,9 @@ msgid "Remove brake and start milling" msgstr "放开制动器并开始碾磨" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." -msgstr "放开制动器并开始碾磨,大约需要6个小时完成。" +#, c-format +msgid "Remove brake and start milling, milling will take about %s." +msgstr "放开制动器并开始碾磨,大约需要 %s 完成。" #: src/iexamine.cpp msgid "Insert products for milling… mill is full" @@ -208090,18 +214444,8 @@ msgstr "这里有个碾磨机,它在转动和碾磨。" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "大概需要 %d 小时完成碾磨。" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "它将在不到一小时内完成碾磨。" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." -msgstr "大概需要 %d 分钟完成碾磨。" +msgid "It should take about %s to finish milling." +msgstr "大概需要 %s 完成碾磨。" #: src/iexamine.cpp msgid "There's a mill here." @@ -208284,6 +214628,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr " 不知道 %s 的配方,无法继续制造。" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "使用 %s 锻炼?" + #: src/init.cpp msgid "Finalizing" msgstr "完成" @@ -208861,7 +215210,7 @@ msgstr "体积(%s):" msgid "There are no available choices" msgstr "没有可用的选项" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "[%s] 筛选:" @@ -209290,7 +215639,7 @@ msgid "" "very bad idea." msgstr "* 这份食物已经开始腐坏吃下它是个坏主意。" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -209731,10 +216080,6 @@ msgstr "负重系数:" msgid "Weight capacity bonus: " msgstr "负重增益:" -#: src/item.cpp -msgid "Storage: " -msgstr "容积:" - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* 这件物品可与 头盔同时穿着。" @@ -210000,6 +216345,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* 这件工具使用 生化能量。" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "它是全新的,可以拿来烧了。" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "它几乎是全新的,还有很多材料可以烧。" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "它已经烧掉了约四分之一。" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "它已经烧掉了约一半。" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "它已经烧掉了约四分之三。" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "它几乎快烧光了。" + +#: src/item.cpp +msgid "Fuel: " +msgstr "燃料:" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -210023,10 +216396,22 @@ msgstr "* 这件物品可以被 强化。" msgid "* This item is not repairable." msgstr "* 这件物品 无法修理。" +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items +#: src/item.cpp +#, c-format +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "拆解 需要 %1$s 可获得:%2$s。" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." -msgstr "拆解 需要 %s 可获得:%s。" +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." +msgstr "拆解 需要 %1$s 及 %2$s 可获得:%3$s" #: src/item.cpp #, c-format @@ -210138,27 +216523,28 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "暴击几率 %d%% - %d%%" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" -msgstr "%d 钝击(%d 暴击)" +msgid "Bashing: " +msgstr "钝击:" #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" -msgstr "%d 斩击(%d 暴击)" +msgid "Critical bash: " +msgstr "钝击(暴击):" #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" -msgstr "%d 穿刺(%d 暴击)" +msgid "Cutting: " +msgstr "斩击:" #: src/item.cpp -#, c-format -msgid "%d moves per attack" -msgstr "攻击消耗 %d 点行动点" +msgid "Critical cut: " +msgstr "斩击(暴击):" + +#: src/item.cpp +msgid "Piercing: " +msgstr "刺击:" + +#: src/item.cpp +msgid "Critical pierce: " +msgstr "刺击(暴击):" #: src/item.cpp msgid "Integrated mod: " @@ -210737,8 +217123,9 @@ msgstr "你的 %1$s 不能装下更多的 %2$s。" msgid "That %s doesn't have room to expand." msgstr "%s 没有可扩展的空间。" -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d x %s" @@ -210860,10 +217247,66 @@ msgstr "没有可以使用的物品" msgid "Execute which action?" msgstr "执行哪个行动?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "按键添加至%s" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "黑名单" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "白名单" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "优先级," + +#: src/item_contents.cpp +msgid " item, " +msgstr "物品," + +#: src/item_contents.cpp +msgid " category, " +msgstr "类别," + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "白名单," + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "黑名单" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "输入优先级(当前优先级 %d)" + +#: src/item_contents.cpp +msgid "item id" +msgstr "物品ID" + +#: src/item_contents.cpp +msgid "item category" +msgstr "物品类别" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "选择附近的物品" + #: src/item_contents.cpp msgid "is not a container" msgstr "不是容器" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "口袋不可用因为 %s" + #: src/item_contents.cpp msgid "is not rigid" msgstr "不够坚硬" @@ -210900,6 +217343,11 @@ msgstr "测试哪一组?" msgid "Result of 100 spawns:" msgstr "100次生成结果:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d x %s" + #: src/item_location.cpp msgid "inventory" msgstr "物品栏" @@ -210922,6 +217370,10 @@ msgstr "开启" msgid "Pocket %d:" msgstr "口袋 %d:" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "可容纳:" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "最大物品长度:" @@ -211082,6 +217534,34 @@ msgstr "可用重量不足" msgid "not enough space" msgstr "可用容量不足" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "优先级:" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "物品白名单:%s" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "(空)" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "物品黑名单:%s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "类别白名单:%s" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "类别黑名单:%s" + #: src/itype.h msgid "click." msgstr "喀哒。" @@ -211149,14 +217629,6 @@ msgstr "你服用了一些抗生素。" msgid " takes some antibiotics." msgstr " 服用了一些抗生素。" -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "肌肉痉挛开始缓解了。" - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "药物无法缓解当前的痉挛症状。" - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -212685,10 +219157,6 @@ msgstr "贪吃蛇" msgid "Sokoban" msgstr "推箱子" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "扫雷" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "灯全都亮了!" @@ -215571,7 +222039,7 @@ msgstr "%s 需要靠近 %s 使用。" msgid "You can't place a %s there. It contains a trap already." msgstr "你无法将%s放在那里。那儿已经有一个陷阱了。" -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "你触发了一个 %s!" @@ -216750,6 +223218,10 @@ msgstr "初级" msgid "Intermediate" msgstr "中级" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "所向无敌" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "关卡宽度:" @@ -217324,6 +223796,15 @@ msgstr "生成" msgid "Summon" msgstr "召唤" +#: src/magic.cpp +msgid "random creature" +msgstr "随机生物" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "将生命值低于 %d 的目标变形为:%s" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "有效距离" @@ -217344,6 +223825,10 @@ msgstr "有效范围" msgid "Spawned" msgstr "召唤数量" +#: src/magic.cpp +msgid "Threshold" +msgstr "变形阈值" + #: src/magic.cpp msgid "Recover" msgstr "能量恢复" @@ -217396,6 +223881,15 @@ msgstr "你的伤口被平均分配到各个身体部位。" msgid "%s wounds are closing up!" msgstr "%s 的伤口开始愈合了!" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "%s 被变形成 %s。" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "你的目标抵抗了变形效果。" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "那里已有其他载具了。" @@ -217853,30 +224347,23 @@ msgstr "%s的高压灭菌釜已经完成了灭菌程序。" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "%s 被拆除。" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "你成功解除了陷阱!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "你拆解陷阱失败。" +msgid "Something has crawled out of the %s plants!" +msgstr "从 %s 丛里爬出了一些东西!" #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "你拆解陷阱失败,而且你把它触发了!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "从 %s 里爬出了一些东西!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "从 %s 丛里爬出了一些东西!" +msgid "You've spotted a %1$ss!" +msgstr "你发现了一个 %1$s!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "从 %s 里爬出了一些东西!" +msgid " triggers a %s!" +msgstr " 触发了一个 %s!" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -219417,6 +225904,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "被警察通缉了!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "折断了 %s。" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "折断了 %s。" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -220384,6 +226884,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "引发警报。" +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "使用了调试菜单(%s)。" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "使用了调试菜单(%s)。" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -223255,6 +229767,11 @@ msgstr "\"侦测到来自未知攻击者的射击,反击模式已启动。\"" msgid "zombie slave" msgstr "丧尸奴仆" +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "推开 %s" + #: src/monexamine.cpp msgid "Rename" msgstr "重命名" @@ -224222,11 +230739,6 @@ msgstr "专注值平衡点:" msgid "You feel bugs crawl over your skin." msgstr "你感觉虫子在你的移动模式上爬。" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "人类" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -225193,17 +231705,6 @@ msgstr "年龄:" msgid "Blood type:" msgstr "血型:" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "*随机*(共 %d 种)" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "%s(共 %d 种)" - #: src/newcharacter.cpp msgid "Name:" msgstr "名字:" @@ -225216,6 +231717,20 @@ msgstr "性别:" msgid "Select a starting location." msgstr "选择一个起始位置。" +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "*随机*(共 %d 种)" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s(共 %d 种)" + #: src/newcharacter.cpp msgid "Stats:" msgstr "属性:" @@ -225293,6 +231808,12 @@ msgstr "按 %s 选择地点。" msgid "Starting location:" msgstr "起始位置:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "%s(共 %d 种)" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "起始载具:" @@ -226255,7 +232776,7 @@ msgstr "感 %d - %d" #: src/npctalk.cpp msgid "Dead tired" -msgstr "精疲力尽" +msgstr "疲惫不堪" #: src/npctalk.cpp msgid "Not tired" @@ -226965,6 +233486,14 @@ msgstr "捣碎" msgid "Pulp Adjacent" msgstr "捣碎附近" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "捣碎附近丧尸" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "捣碎丧尸" + #: src/options.cpp msgid "Auto mining" msgstr "自动挖矿" @@ -228482,17 +235011,6 @@ msgstr "辐射诱发变异" msgid "If true, radiation causes the player to mutate." msgstr "开启后,辐射将会导致玩家变异。" -#: src/options.cpp -msgid "Z-levels" -msgstr "Z轴" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "开启时,将启用数个竖直移动功能,包括搬运物品上下楼,攀爬落水管以及操纵飞行器。若在创建游戏后开启可能导致Bug。" - #: src/options.cpp msgid "Character point pools" msgstr "角色点数池" @@ -229287,6 +235805,16 @@ msgstr "区域:" msgid "# Unexplored" msgstr "# 未探索" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "大地图:%s" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "大地图类型:%s" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "距离当前任务目标:" @@ -229614,6 +236142,10 @@ msgstr "酷热!" msgid "Very hot!" msgstr "炎热!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "舒适" + #: src/panels.cpp msgid "Very cold!" msgstr "寒冷!" @@ -231058,6 +237590,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "口渴 -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "饥肠辘辘" + #: src/player_display.cpp msgid "Underfed" msgstr "营养不良" @@ -231152,6 +237688,10 @@ msgstr "" "你的身体已经因为严重营养不良而变得十分虚弱。你再不开始规律进食,就会死亡!\n" "\n" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "营养不良" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -232278,6 +238818,14 @@ msgid "%1$d tool with %2$s of %3$d or more." msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "%1$d 个 %2$s 功能至少 %3$d 级的工具。" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "%1$d 个 %2$s 功能至少 %3$d 级 的工具" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -232657,12 +239205,12 @@ msgstr "你营养不良,无法保持你的 %s 继续运行。" #: src/suffer.cpp #, c-format msgid "You're too dehydrated to keep your %s going." -msgstr "你脱水严重,无法保持你的 %s 继续运行。" +msgstr "你太渴了,无法保持你的 %s 继续运行。" #: src/suffer.cpp #, c-format msgid "You're too exhausted to keep your %s going." -msgstr "你筋疲力尽,无法保持你的 %s 继续运行。" +msgstr "你太累了,无法保持你的 %s 继续运行。" #: src/suffer.cpp msgid "You're drowning!" @@ -232956,7 +239504,7 @@ msgstr " 伸了伸懒腰。" #: src/suffer.cpp msgid "You feel mentally tired." -msgstr "你觉得精神很疲倦。" +msgstr "你觉得头脑有点累。" #: src/suffer.cpp msgid " lets out a huge yawn." @@ -233155,7 +239703,20 @@ msgstr "选择游戏语言" #: src/translations.cpp msgctxt "grammatical gender list" msgid "n" -msgstr "中性" +msgstr "n" + +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" +"可见:%d\n" +"回避:%d\n" +"难度:%d\n" +"无害:%s" #: src/trapfunc.cpp msgid "You step on some bubble wrap!" @@ -236322,6 +242883,10 @@ msgstr "…%s = 显示完整说明" msgid "--NO AVAILABLE MODS--" msgstr "--无有效模组--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "--未找到结果--" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "激活模组列表已保存为默认" diff --git a/lang/po/zh_TW.po b/lang/po/zh_TW.po index a262638447850..24e01c7440529 100644 --- a/lang/po/zh_TW.po +++ b/lang/po/zh_TW.po @@ -15,21 +15,21 @@ # 菲伊斯 , 2020 # 為勳 周 , 2020 # HOXV , 2020 -# Brett Dong , 2020 # 類凱宇 , 2020 -# kiddragon Chung , 2020 # Jeremy Wu , 2020 +# Hao JK , 2020 +# kiddragon Chung , 2020 +# Brett Dong , 2020 # Hsinyu Chan, 2020 -# xap, 2020 # Laughing Man, 2020 -# Hao JK , 2020 +# xap, 2020 # Yangerine Yuan , 2020 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.E\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-06 11:53+0800\n" +"POT-Creation-Date: 2020-07-08 10:07+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Yangerine Yuan , 2020\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_TW/)\n" @@ -265,7 +265,6 @@ msgid_plural "rocks" msgstr[0] "石頭" #. ~ Description for {'str': 'rock'} -#. ~ Description for TEST rock #: lang/json/AMMO_from_json.py msgid "" "A rock the size of a baseball. Makes a decent melee weapon, and is also " @@ -793,6 +792,16 @@ msgstr[0] "高氧" msgid "Mixture of oxygen and nitrogen in proportions suitable for diving." msgstr "氧氣和氮氣以特定比例混和,用於潛水。" +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +msgid "extinguishing agent" +msgid_plural "extinguishing agent" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'extinguishing agent'} +#: lang/json/AMMO_from_json.py +msgid "Dry chemical solution effective in extinguishing fires." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "tinder" msgid_plural "tinder" @@ -3968,6 +3977,23 @@ msgid "" "with some kind of mask or mouth protection." msgstr "用於化學藥劑噴灑器的強力噴灑式殺蟲劑彈藥。使用時最好能戴上面部的護具。" +#: lang/json/AMMO_from_json.py +msgid "12.3ln round" +msgid_plural "12.3ln rounds" +msgstr[0] "" + +#. ~ Description for {'str': '12.3ln round'} +#: lang/json/AMMO_from_json.py +msgid "" +"The 12.3ln cartridge was introduced in Romania in the wake of the second " +"Carpathian conflict. The PA md. 71 rifle using this ammunition rapidly " +"gained popularity in the Eastern Union, and from there, the world. Due to " +"this, the 12.3ln rapidly became the standard combat round in the Eurasian " +"sphere. It was easily scavenged and stockpiled by the Exodii. To you, it " +"looks and feels quite similar to a .30-06 Springfield cartridge, but with a " +"slightly sharper taper." +msgstr "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" msgid_plural "paper cartridges" @@ -4929,7 +4955,7 @@ msgstr[0] "黃色油漆" msgid "A can of yellow paint." msgstr "一罐黃色油漆。" -#: lang/json/AMMO_from_json.py lang/json/terrain_from_json.py +#: lang/json/AMMO_from_json.py msgid "red carpet" msgid_plural "red carpets" msgstr[0] "" @@ -4998,7 +5024,6 @@ msgstr[0] "金塊" #. ~ Description for {'str_sp': 'gold'} #. ~ Description for {'str_sp': 'platinum'} -#. ~ Description for {'str': 'TEST platinum bit'} #: lang/json/AMMO_from_json.py msgid "" "A soft shiny metal. Before the apocalypse this would've been worth a small " @@ -5066,7 +5091,6 @@ msgid_plural "small metal sheets" msgstr[0] "" #. ~ Description for {'str': 'small metal sheet'} -#. ~ Description for TEST small metal sheet #: lang/json/AMMO_from_json.py msgid "A small sheet of metal." msgstr "一片小型金屬板。" @@ -6294,63 +6318,6 @@ msgstr[0] "" msgid "Seeing this is a bug." msgstr "看到這訊息是程式錯誤導致的。" -#: lang/json/AMMO_from_json.py -msgid "TEST rock" -msgid_plural "TEST rocks" -msgstr[0] "" - -#: lang/json/AMMO_from_json.py -msgid "TEST small metal sheet" -msgid_plural "TEST small metal sheets" -msgstr[0] "" - -#: lang/json/AMMO_from_json.py -msgid "test wooden broadhead arrow" -msgid_plural "test wooden broadhead arrows" -msgstr[0] "" - -#. ~ Description for {'str': 'test wooden broadhead arrow'} -#: lang/json/AMMO_from_json.py -msgid "Test arrow" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test 9mm ammo" -msgid_plural "Test 9mm ammos" -msgstr[0] "" - -#. ~ Description for {'str': 'Test 9mm ammo'} -#: lang/json/AMMO_from_json.py -msgid "Generic 9mm ammo based on JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "Test .45 ammo" -msgid_plural "Test .45 ammos" -msgstr[0] "" - -#. ~ Description for {'str': 'Test .45 ammo'} -#: lang/json/AMMO_from_json.py -msgid "Test ammo based on the .45 JHP." -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "test gas" -msgid_plural "test gas" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test gas'} -#: lang/json/AMMO_from_json.py -msgid "" -"Some mysterious substance in the form of a gas. Only for testing, do not " -"inhale!" -msgstr "" - -#: lang/json/AMMO_from_json.py -msgid "TEST platinum bit" -msgid_plural "TEST platinum bits" -msgstr[0] "" - #: lang/json/ARMOR_from_json.py msgid "pair of bone arm guards" msgid_plural "pairs of bone arm guards" @@ -6624,8 +6591,6 @@ msgstr[0] "耳塞" #. ~ Description for {'str': 'pair of ear plugs', 'str_pl': 'pairs of ear #. plugs'} -#. ~ Description for {'str': 'TEST pair of ear plugs', 'str_pl': 'TEST pairs -#. of ear plugs'} #: lang/json/ARMOR_from_json.py msgid "Industrial grade ear plugs. They fit inside the ear." msgstr "工業等級耳塞。能夠服貼耳朵。" @@ -6904,8 +6869,8 @@ msgstr[0] "彈藥小袋" #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " -"rockets will not fit. Activate to store ammunition." -msgstr "一個可以用來存放大部分類型小型彈藥的小袋子,火箭是放不進去的。使用它來存取彈藥。" +"rockets will not fit. Use insert to store ammunition." +msgstr "" #: lang/json/ARMOR_from_json.py msgid "ammo satchel" @@ -6995,9 +6960,9 @@ msgstr[0] "箭筒" #. ~ Description for {'str': 'quiver'} #: lang/json/ARMOR_from_json.py msgid "" -"A leather quiver worn at the waist that can hold 20 arrows. Activate to " -"store arrows." -msgstr "一個以皮革製成的箭筒, 穿戴在腰間, 能夠裝入 20 支箭矢。使用它來裝入箭矢。" +"A leather quiver worn at the waist that can hold 20 arrows or bolts. Use " +"insert to store arrows or bolts." +msgstr "" #: lang/json/ARMOR_from_json.py msgid "birchbark quiver" @@ -7008,8 +6973,8 @@ msgstr[0] "樺皮箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A quiver woven from strips of birch bark, worn at the waist, that can hold " -"20 arrows. Activate to store arrows." -msgstr "一個以樺樹皮製成的箭筒, 穿戴在腰際, 能裝入 20 支箭矢。使用它來裝入箭矢。" +"20 arrows or bolts. Use insert to store arrows or bolts." +msgstr "" #: lang/json/ARMOR_from_json.py msgid "large quiver" @@ -7020,11 +6985,10 @@ msgstr[0] "大型箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A large leather quiver trimmed with metal, worn on the back, that can hold " -"60 arrows. Historically used by horse archers, rather than foot archers, " -"but neither of THEM had to fight zombies. Activate to store arrows." +"60 arrows or bolts. Historically used by horse archers, rather than foot " +"archers, but neither of THEM had to fight zombies. Use insert to store " +"arrows or bolts." msgstr "" -"一個鑲嵌了金屬的大型皮革箭筒, 穿戴在背後, 能夠裝入 60 支箭矢。歷史上是供馬弓兵使用, 而非步行的弓兵, 但這兩者都不用對抗殭屍。\"使用\" " -"它來裝入箭矢。" #: lang/json/ARMOR_from_json.py msgid "large birchbark quiver" @@ -7035,8 +6999,8 @@ msgstr[0] "大型樺皮箭筒" #: lang/json/ARMOR_from_json.py msgid "" "A large quiver woven from strips of birchbark, worn on the back, that can " -"hold 60 arrows. Activate to store arrows." -msgstr "一個以樺樹皮製成的箭筒, 穿戴在背後, 能夠裝入 60 支箭矢。使用它來裝入箭矢。" +"hold 60 arrows or bolts. Use insert to store arrows or bolts." +msgstr "" #: lang/json/ARMOR_from_json.py msgid "tac vest" @@ -8359,8 +8323,6 @@ msgid_plural "pairs of socks" msgstr[0] "襪子" #. ~ Description for {'str': 'pair of socks', 'str_pl': 'pairs of socks'} -#. ~ Description for {'str': 'TEST pair of socks', 'str_pl': 'TEST pairs of -#. socks'} #: lang/json/ARMOR_from_json.py msgid "Socks. Put 'em on your feet." msgstr "襪子。穿在腳上的玩意。" @@ -10004,6 +9966,17 @@ msgid "" "heat." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of studded gloves" +msgid_plural "pairs of studded gloves" +msgstr[0] "" + +#. ~ Description for {'str': 'pair of studded gloves', 'str_pl': 'pairs of +#. studded gloves'} +#: lang/json/ARMOR_from_json.py +msgid "A pair of gloves with studded metal knuckles." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "ten-gallon hat" msgid_plural "ten-gallon hats" @@ -15678,7 +15651,6 @@ msgstr[0] "" #. ~ Use action activate_msg for {'str': 'combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'heavy combat exoskeleton'}. #. ~ Use action activate_msg for {'str': 'field combat exoskeleton'}. -#. ~ Use action activate_msg for {'str': 'test power armor'}. #: lang/json/ARMOR_from_json.py msgid "Your power armor engages." msgstr "你的動力裝甲啟動了。" @@ -16004,7 +15976,6 @@ msgid_plural "backpacks" msgstr[0] "背包" #. ~ Description for {'str': 'backpack'} -#. ~ Description for TEST backpack #: lang/json/ARMOR_from_json.py msgid "A small backpack. Good storage for a little encumbrance." msgstr "一個小背包, 有許多的儲物空間卻只會增加一點點累贅。" @@ -16102,7 +16073,6 @@ msgid_plural "briefcases" msgstr[0] "公事包" #. ~ Description for {'str': 'briefcase'} -#. ~ Description for TEST briefcase #: lang/json/ARMOR_from_json.py msgid "Useful for carrying money, documents, or smuggled goods." msgstr "用途是裝錢, 放文件, 或是走私物品。" @@ -16398,10 +16368,10 @@ msgstr "一個巨大的有輪子的行李箱, 主要用於運送旅行期間的 #. ~ Description for {'str': 'suitcase'} #: lang/json/ARMOR_from_json.py msgid "" -"A mid-sized suitcase used mainly for transporting clothes and other " +"A mid-sized wheeled suitcase used mainly for transporting clothes and other " "possessions during trips, provides a decent amount of storage but hauling it" " around is not exactly comfortable." -msgstr "一個中型的旅行箱, 主要用於運送旅行期間的衣服或其他財物, 能提供不錯的儲物空間, 但拖著它走並不是很舒服。" +msgstr "" #: lang/json/ARMOR_from_json.py msgid "survivor duffel bag" @@ -16932,7 +16902,6 @@ msgid_plural "hazmat suits" msgstr[0] "防護衣" #. ~ Description for {'str': 'hazmat suit'} -#. ~ Description for TEST hazmat suit #: lang/json/ARMOR_from_json.py msgid "" "An impermeable whole-body garment worn as protection against hazardous " @@ -17753,7 +17722,6 @@ msgid_plural "long-sleeved shirts" msgstr[0] "長袖T恤" #. ~ Description for {'str': 'long-sleeved shirt'} -#. ~ Description for TEST long-sleeved shirt #: lang/json/ARMOR_from_json.py msgid "A long-sleeved cotton shirt." msgstr "一件長袖的棉質上衣。" @@ -18263,7 +18231,7 @@ msgstr[0] "" msgid "" "A lightweight, form-fitting long-sleeved spandex undershirt that helps " "maintains body temperature." -msgstr "" +msgstr "一件輕巧、合身的長袖氨綸(萊卡)汗衫,能夠保持體溫。" #: lang/json/ARMOR_from_json.py msgid "sports bra" @@ -18421,6 +18389,18 @@ msgid "" "weight." msgstr "一件大睡袋能夠從頭到腳把你蓋住。這件重量適中。" +#: lang/json/ARMOR_from_json.py +msgid "cestus" +msgid_plural "cestuses" +msgstr[0] "金屬拳套" + +#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} +#: lang/json/ARMOR_from_json.py +msgid "" +"A leather hand and arm wrap incorporating metal plates over the knuckles to " +"improve punching power and defence." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -19787,53 +19767,14 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "TEST pair of socks" -msgid_plural "TEST pairs of socks" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST long-sleeved shirt" -msgid_plural "TEST long-sleeved shirts" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST pair of ear plugs" -msgid_plural "TEST pairs of ear plugs" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST hazmat suit" -msgid_plural "TEST hazmat suits" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST backpack" -msgid_plural "TEST backpacks" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "TEST briefcase" -msgid_plural "TEST briefcases" -msgstr[0] "" - -#: lang/json/ARMOR_from_json.py -msgid "test quiver" -msgid_plural "test quivers" -msgstr[0] "" - -#. ~ Description for {'str': 'test quiver'} -#: lang/json/ARMOR_from_json.py -msgid "Quiver of Testing, with room for 20 arrows or bolts." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "test power armor" -msgid_plural "test power armors" +msgid "aura of repelling arc" +msgid_plural "aura of repelling arcs" msgstr[0] "" -#. ~ Description for {'str': 'test power armor'} +#. ~ Description for aura of repelling arc #: lang/json/ARMOR_from_json.py -msgid "This is a prototype power armor just for testing." +msgid "" +"An invisible aura that strikes melee attackers with arcs of electricity." msgstr "" #: lang/json/BATTERY_from_json.py @@ -20225,8 +20166,8 @@ msgid "Aero-Evaporator CBM" msgid_plural "Aero-Evaporator CBMs" msgstr[0] "CBM: 濕氣凝水裝置" -#. ~ Description for {'str': 'Aero-Evaporator'} #. ~ Description for {'str': 'Aero-Evaporator CBM'} +#. ~ Description for {'str': 'Aero-Evaporator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "This unit draws moisture from the surrounding air, which slowly trickles " @@ -21298,8 +21239,8 @@ msgid "Internal Furnace CBM" msgid_plural "Internal Furnace CBMs" msgstr[0] "CBM: 內燃機" -#. ~ Description for {'str': 'Internal Furnace'} #. ~ Description for {'str': 'Internal Furnace CBM'} +#. ~ Description for {'str': 'Internal Furnace'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "When this bionic is active, you can burn nearly any organic material as fuel" @@ -21398,8 +21339,8 @@ msgid "Wind Turbine CBM" msgid_plural "Wind Turbine CBMs" msgstr[0] "" -#. ~ Description for {'str': 'Wind Turbines'} #. ~ Description for {'str': 'Wind Turbine CBM'} +#. ~ Description for {'str': 'Wind Turbines'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "Installed on your body is a set of small retractable wind turbines. When " @@ -21407,18 +21348,6 @@ msgid "" "power level." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Precision Solderers CBM" -msgid_plural "Precision Solderers CBMs" -msgstr[0] "CBM:精工焊接" - -#. ~ Description for {'str': 'Precision Solderers CBM'} -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A set of tiny electronics tools, including soldering irons and wire cutters." -" They serve no purpose on their own, but are required for crafting bionics." -msgstr "一套微型電子工具,包括烙鐵和鋼絲鉗。它們本身沒有任何用途,但是製作生化插件時是必要的。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Deployable Grenade Launcher CBM" msgid_plural "Deployable Grenade Launcher CBMs" @@ -21471,13 +21400,37 @@ msgid "" "from installation and you don't have the codes to reset the timer." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "Skullgun CBM" +msgid_plural "Skullgun CBMs" +msgstr[0] "" + +#. ~ Description for {'str': 'Skullgun CBM'} +#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +msgid "" +"Concealed in your head is a single shot .40 pistol. Activate the bionic to " +"fire and reload the skullgun." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Precision Solderers CBM" +msgid_plural "Precision Solderers CBMs" +msgstr[0] "CBM:精工焊接" + +#. ~ Description for {'str': 'Precision Solderers CBM'} +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of tiny electronics tools, including soldering irons and wire cutters." +" They serve no purpose on their own, but are required for crafting bionics." +msgstr "一套微型電子工具,包括烙鐵和鋼絲鉗。它們本身沒有任何用途,但是製作生化插件時是必要的。" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Ionic Overload Generator CBM" msgid_plural "Ionic Overload Generator CBMs" msgstr[0] "CBM: 離子超載生成器" -#. ~ Description for {'str': 'Ionic Overload Generator'} #. ~ Description for {'str': 'Ionic Overload Generator CBM'} +#. ~ Description for {'str': 'Ionic Overload Generator'} #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "" "A powerful ion energy generator is implanted on your chest. Fires a " @@ -21635,6 +21588,33 @@ msgstr[0] "" msgid "template for a paperback nonfiction book" msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Generic Pulp Book" +msgid_plural "Generic Pulp Books" +msgstr[0] "" + +#. ~ Description for Generic Pulp Book +#: lang/json/BOOK_from_json.py +msgid "" +"This is a template for pulp books. Which really all ought to be paperbacks," +" right?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Generic SciFi Book" +msgid_plural "Generic SciFi Books" +msgstr[0] "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for paperback scifi books." +msgstr "" + +#. ~ Description for Generic SciFi Book +#: lang/json/BOOK_from_json.py +msgid "This is a template for a hard cover scifi book." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Homemaking Book" msgid_plural "Homemaking Books" @@ -22451,7 +22431,7 @@ msgid "" "This cookbook is written by liver enthusiast Tamsyn Beckerleg. Inside " "you'll find a great deal of anecdotes about the near-certain ruination of " "children who refuse to eat their liver." -msgstr "" +msgstr "這本烹飪書是由肝臟愛好家 Tamsyn Beckerleg 所著。充滿著挑食不吃自己肝臟的小孩們近乎崩潰的逸事。" #: lang/json/BOOK_from_json.py msgid "Dainty Dishes Fit for a King" @@ -22465,7 +22445,7 @@ msgid "" "This cookbook contains many fanciful recipes. Some of them are even worth " "the trouble to actually prepare. Lovely pen and ink illustrations of " "overweight knights and gluttonous monks line the pages." -msgstr "" +msgstr "這本烹飪書裡有許多如夢似幻的食譜。其中有些甚至值得冒風險去煮。書頁中充滿優美的筆墨描繪著過重的騎士和貪吃的僧侶。" #: lang/json/BOOK_from_json.py msgid "Eat Your Way to a Fit Physique" @@ -22478,7 +22458,7 @@ msgstr[0] "" msgid "" "This self-help book is as dubious as its title. Worse, it is boring. It " "does, however, contain a few basic cooking instructions." -msgstr "" +msgstr "這本自助烹飪書就和他的名字一樣可疑。更糟的是,他讀起來很無聊。不過,它仍有些基礎的烹飪技巧。" #: lang/json/BOOK_from_json.py msgid "Food Fashions for Young Moderns" @@ -22493,7 +22473,7 @@ msgid "" "sophisticated flavors.\" The book exhorts the reader to defy convention and" " break the rules, and then presents a number of useful rules and conventions" " for preparing food." -msgstr "" +msgstr "一本烹飪書宣稱是給那些尋求「大膽且複雜口味」的人。這本書鼓勵讀者拋下成見和打破規則,後半部寫著一些對烹飪很有用的技巧和觀念。" #: lang/json/BOOK_from_json.py msgid "Winemaking for Beginners" @@ -22905,8 +22885,8 @@ msgstr[0] "" #. 'str_pl': 'none'} #. ~ Description for {'str_sp': 'none'} #. ~ Description for {'str': 'abstract map'} -#. ~ Description for {'str': 'weapon'} #. ~ Description for {'str_sp': 'seeing this is a bug'} +#. ~ Description for {'str': 'weapon'} #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/furniture_from_json.py lang/json/skill_from_json.py @@ -23203,7 +23183,7 @@ msgid "" "Everything you could ever want to know about handloading ammunition, sealed " "with a… childproof cover. Apparently a liability thing, because the chapter" " on explosive rounds covers them in excellent detail too." -msgstr "" +msgstr "裡面有關於手工裝配子彈的所有知識, 封面有著… 18 禁的標誌。顯然這是必要的, 因為裡面有個章節詳細講述了高爆子彈。" #: lang/json/BOOK_from_json.py msgid "Rivtech design binder" @@ -23372,7 +23352,7 @@ msgstr[0] "" msgid "" "A paperback book detailing 101 home repair projects for the novice " "carpenter." -msgstr "" +msgstr "一本平裝書, 詳細介紹了新手進行居家修繕的方法。" #: lang/json/BOOK_from_json.py msgid "The Complete Home Repair Guide" @@ -23437,6 +23417,7 @@ msgid "" "additive manufacturing. If you need to know how best complete a certain " "machining operation, the answer lies somewhere in these pages." msgstr "" +"這本經典的參考書包含有關材料,計量,工具製造,齒輪,螺紋等的大量而密集的章節和表格。最新版本包含有關添加劑製造的最新技術的大量數據。如果你需要知道如何最好地完成某個加工操作,答案就在這些頁面的某處。" #: lang/json/BOOK_from_json.py msgid "Concrete Constructions" @@ -23918,8 +23899,8 @@ msgstr[0] "冒險小說" #: lang/json/BOOK_from_json.py msgid "" "The stirring tale of a race against time, in search of a lost city located " -"in the dark heart of the African continent." -msgstr "一個與時間賽跑的熱血故事, 內容是關於搜索一個坐落於非洲大陸的失落城市。" +"in the heart of the African continent." +msgstr "" #: lang/json/BOOK_from_json.py msgid "buddy novel" @@ -23933,25 +23914,6 @@ msgid "" "York City." msgstr "一個扣人心弦的故事, 講述兩個朋友在紐約市街頭掙扎求存。" -#: lang/json/BOOK_from_json.py -msgid "coming of age novel" -msgid_plural "coming of age novels" -msgstr[0] "成長小說" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A classic tale about growing up, portraying one young man's funny and " -"poignant experiences with life, love, and sex." -msgstr "一本關於成長的經典寓言故事, 描述一位年輕男子在生活、愛、和性的有趣和淒美的經驗。" - -#. ~ Description for {'str': 'coming of age novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A graphic novel about a young girl living in Iran during the 1980's, seeing " -"the world change around her as Iraq invaded her country." -msgstr "這是一部關於 1980 年代生活在伊朗的年輕女孩的視覺文學, 描述當伊拉克入侵她的國家時, 她周遭世界產生的種種變化。" - #: lang/json/BOOK_from_json.py msgid "crime novel" msgid_plural "crime novels" @@ -24064,70 +24026,6 @@ msgstr[0] "推理小說" msgid "A detective investigates an unusual murder in a secluded location." msgstr "一個僻靜的地點, 一起不尋常的謀殺, 一名偵探。" -#: lang/json/BOOK_from_json.py -msgid "pulp novel" -msgid_plural "pulp novels" -msgstr[0] "推理小說" - -#. ~ Description for {'str': 'pulp novel'} -#: lang/json/BOOK_from_json.py -msgid "" -"A hardboiled detective tale filled with hard hitting action and intrigue." -msgstr "一本冷硬派的偵探小說, 充滿著硬派動作與陰謀。" - -#: lang/json/BOOK_from_json.py -msgid "Planet of the Murderous Squids that Time Forgot!" -msgid_plural "Planet of the Murderous Squids that Time Forgot!s" -msgstr[0] "" - -#. ~ Description for Planet of the Murderous Squids that Time Forgot! -#: lang/json/BOOK_from_json.py -msgid "" -"In this psychedelic adventure novel of cosmic exploration, an elderly " -"assassin discovers a planet too good to be true. Only once it is too late " -"does she discover the harrowing truth at the center of \"The Planet of the " -"Murderous Squids that Time Forgot!\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "The Great Capes of Metropolis" -msgid_plural "The Great Capes of Metropoliss" -msgstr[0] "" - -#. ~ Description for The Great Capes of Metropolis -#: lang/json/BOOK_from_json.py -msgid "" -"In this classic pulp paperback of superheroic exploits, a group of masked " -"vigilantes with diverse superpowers learn to work together to defeat the " -"ultimate villain." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Yesterday's Murdered" -msgid_plural "Yesterday's Murdereds" -msgstr[0] "" - -#. ~ Description for Yesterday's Murdered -#: lang/json/BOOK_from_json.py -msgid "" -"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" -" has one last shot at vengeance." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Flashgun Condor and the Crimson Criminal" -msgid_plural "Flashgun Condor and the Crimson Criminals" -msgstr[0] "" - -#. ~ Description for Flashgun Condor and the Crimson Criminal -#: lang/json/BOOK_from_json.py -msgid "" -"A hot-blooded photographer who fights crime with film, footage, and fists, " -"Condor is more than a mere shutterbug on the crime beat. But will she be " -"able to unravel a devious deception and bring the \"Crimson Criminal\" to " -"justice?" -msgstr "" - #: lang/json/BOOK_from_json.py msgid "road novel" msgid_plural "road novels" @@ -24285,8 +24183,8 @@ msgstr[0] "武士小說" msgid "" "The classic tale of a wandering swordsman who comes to a small settlement " "and is hired to help the townsfolk defend themselves from a band of " -"marauding outlaws." -msgstr "經典的故事, 講述一個小鎮來了一個陌生劍士被雇用來幫忙鎮民防衛, 阻止劫匪的入侵。" +"marauding outlaws. This hardback is quite hefty." +msgstr "" #: lang/json/BOOK_from_json.py msgid "satire novel" @@ -24327,15 +24225,17 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Master and Margarita" -msgid_plural "The Master and Margaritas" +msgid_plural "copies of Master and Margarita" msgstr[0] "" -#. ~ Description for The Master and Margarita +#. ~ Description for {'str': 'The Master and Margarita', 'str_pl': 'copies of +#. Master and Margarita'} #: lang/json/BOOK_from_json.py msgid "" "Featuring a cast that includes Satan, Pontius Pilate, Jesus Christ, " -"vampires, a talking cat, and the literary elite of Moscow, this is a satire " -"on Stalinist tyranny written by Mikhail Bulgakov." +"vampires, a talking cat, and the literary elite of Moscow, this novel by " +"Mikhail Bulgakov explores philosophical issues on the nature of good and " +"evil." msgstr "" #: lang/json/BOOK_from_json.py @@ -24362,326 +24262,6 @@ msgid "" "nuclear destruction isn't much of an influence on human nature." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "scifi novel" -msgid_plural "scifi novels" -msgstr[0] "科幻小說" - -#. ~ Description for {'str': 'scifi novel'} -#: lang/json/BOOK_from_json.py -msgid "Aliens, ray guns, and space ships." -msgstr "外星人, 雷射槍, 還有太空船。" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" -" surprisingly accurate in predicting much of modern society… Until " -"recently." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" -"\n" -"Tyger, Tyger, Burning bright,\n" -"In the forests of the night:\n" -"What immortal hand or eye,\n" -"Dare frame thy fearful symmetry?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" -"stains have smudged the occasional word." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Hyperion\" by Dan Simmons." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" -"\n" -"Give us gods. Oh give them us!\n" -"Give us gods.\n" -"We are so tired of men\n" -"And motor-power." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " -"ripped off." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " -"some of its pages. Weird." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " -"you wonder how Thailand fared the end of the world." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " -"contains a hand-written grocery list." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " -"still has the smell of new books within its pages." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " -"Sterling. The cover has rings of coffee stains over it." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " -"looks to have been used to press flowers." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " -"the monster?" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" -" handbook." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " -"covered in dried blood." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " -"if it's been slightly chewed by a dog or other large animal." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " -"typo in the authors name on the spine of the book." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " -"Copy. Not for re-sale.\"" -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " -"the first pages in crayon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " -"with 'Library Copy'. And a sticker reading 'Science Fiction'." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of" -" dirt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" -" almost brand new." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " -"and worn, some pages appear to be loose." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " -"and thin. You should probably be careful with this copy." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " -"dog-eared and worn." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Stanislaw Lem's \"Solaris\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Vurt\" by Jeff Noon." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " -"blurb reminds you of a Japanese movie you think you once caught on the " -"television late at night." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " -"missing from the end of the book. Luckily only mail-order advertisements." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "" -"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " -"Douglas Adams." -msgstr "" - #: lang/json/BOOK_from_json.py msgid "spy novel" msgid_plural "spy novels" @@ -25825,6 +25405,564 @@ msgid "" " key work in the existentialist tradition." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "pulp novel" +msgid_plural "pulp novels" +msgstr[0] "推理小說" + +#. ~ Description for {'str': 'pulp novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hardboiled detective tale filled with hard hitting action and intrigue." +msgstr "一本冷硬派的偵探小說, 充滿著硬派動作與陰謀。" + +#: lang/json/BOOK_from_json.py +msgid "Black Valkyries From Venus" +msgid_plural "copies of Black Valkyries" +msgstr[0] "" + +#. ~ Description for {'str': 'Black Valkyries From Venus', 'str_pl': 'copies +#. of Black Valkyries'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a weather-beaten novel written by someone named \"Lee" +" Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Wrong Tomorrow" +msgid_plural "copies of Wrong Tomorrow" +msgstr[0] "" + +#. ~ Description for {'str': 'The Wrong Tomorrow', 'str_pl': 'copies of Wrong +#. Tomorrow'} +#: lang/json/BOOK_from_json.py +msgid "" +"You hold in your hands a cheap drugstore paperback written by someone named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "No God From a Corpse" +msgid_plural "copies of No God" +msgstr[0] "" + +#. ~ Description for {'str': 'No God From a Corpse', 'str_pl': 'copies of No +#. God'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a weatherworn paperback written by some skirt named \"Lee Racket.\"" +" It tells how rage and jealousy can turn a man, or a woman, into a monster." +" This story is hard-boiled enough to break a spoon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Deep Dive" +msgid_plural "copies of Deep Dive" +msgstr[0] "" + +#. ~ Description for {'str': 'The Deep Dive', 'str_pl': 'copies of Deep Dive'} +#: lang/json/BOOK_from_json.py +msgid "" +"This dimestore short story about space travel is written by a broad named " +"\"Lee Racket.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Planet of the Murderous Squids that Time Forgot!" +msgid_plural "Planet of the Murderous Squids that Time Forgot!s" +msgstr[0] "" + +#. ~ Description for Planet of the Murderous Squids that Time Forgot! +#: lang/json/BOOK_from_json.py +msgid "" +"In this psychedelic adventure novel of cosmic exploration, an elderly " +"assassin discovers a planet too good to be true. Only once it is too late " +"does she discover the harrowing truth at the center of \"The Planet of the " +"Murderous Squids that Time Forgot!\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Great Capes of Metropolis" +msgid_plural "The Great Capes of Metropoliss" +msgstr[0] "" + +#. ~ Description for The Great Capes of Metropolis +#: lang/json/BOOK_from_json.py +msgid "" +"In this classic pulp paperback of superheroic exploits, a group of masked " +"vigilantes with diverse superpowers learn to work together to defeat the " +"ultimate villain." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Yesterday's Murdered" +msgid_plural "Yesterday's Murdereds" +msgstr[0] "" + +#. ~ Description for Yesterday's Murdered +#: lang/json/BOOK_from_json.py +msgid "" +"In this fast paced pulp noir, a hard-drinking detective with nerves of steel" +" has one last shot at vengeance." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Flashgun Condor and the Crimson Criminal" +msgid_plural "Flashgun Condor and the Crimson Criminals" +msgstr[0] "" + +#. ~ Description for Flashgun Condor and the Crimson Criminal +#: lang/json/BOOK_from_json.py +msgid "" +"A hot-blooded photographer who fights crime with film, footage, and fists, " +"Condor is more than a mere shutterbug on the crime beat. But will she be " +"able to unravel a devious deception and bring the \"Crimson Criminal\" to " +"justice?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "scifi novel" +msgid_plural "scifi novels" +msgstr[0] "科幻小說" + +#. ~ Description for {'str': 'scifi novel'} +#: lang/json/BOOK_from_json.py +msgid "Aliens, ray guns, and space ships." +msgstr "外星人, 雷射槍, 還有太空船。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was" +" surprisingly accurate in predicting much of modern society… Until " +"recently." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester.\n" +"\n" +"Tyger, Tyger, Burning bright,\n" +"In the forests of the night:\n" +"What immortal hand or eye,\n" +"Dare frame thy fearful symmetry?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n" +"\n" +"Give us gods. Oh give them us!\n" +"Give us gods.\n" +"We are so tired of men\n" +"And motor-power." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within its pages." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorist's" +" handbook." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks" +" almost brand new." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwell's \"Nineteen Eighty-Four\". The pages are loose " +"and thin. You should probably be careful with this copy." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Dune" +msgid_plural "copies of Dune" +msgstr[0] "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" + +#. ~ Description for {'str': 'Dune', 'str_pl': 'copies of Dune'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Dune\" by Frank Herbert. It is a fairly new " +"reprint with the words \"SOON TO BE A MAJOR MOTION PICTURE\" splashed across" +" its dust jacket." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Parable of the Talents" +msgid_plural "copies of Parable of the Talents" +msgstr[0] "" + +#. ~ Description for {'str': 'Parable of the Talents', 'str_pl': 'copies of +#. Parable of the Talents'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a sturdy copy of \"Parable of the Talents.\". It is Octavia " +"Butler's sequel to her book \"Parable of the Sower.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Fifth Season" +msgid_plural "signed copies of Fifth Season" +msgstr[0] "" + +#. ~ Description for {'str': 'The Fifth Season', 'str_pl': 'signed copies of +#. Fifth Season'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a signed hardcover copy of the Hugo award winning \"The Fifth " +"Season\" by N.K. Jemisin. It smells faintly of dirt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "We" +msgid_plural "copies of We" +msgstr[0] "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"This hardback book is titled \"The Annotated We: A New Translation of Evgeny Zamiatin's Novel.\"\n" +"\n" +"It is Vladimir Wozniuk's 2015 translation of \"We,\" originally published in 1924 and generally seen as the first modern dystopian novel. The commentary examines the profusive allusions and highlights the poetic nature of Zamiatin's language." +msgstr "" + +#. ~ Description for {'str': 'We', 'str_pl': 'copies of We'} +#: lang/json/BOOK_from_json.py +msgid "" +"A seminal work of dystopian fiction, Evgeny Zamiatin's \"We\" was first published in 1924 but suppresed by the Soviet Union until 1988.\n" +"\n" +"This mass-market 1993 edition you've found was translated from the Russian by Clarence Brown and includes a short introduction. The slightly worn cover features a surrealist photo of a person gazing backward suspiciouly." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "The Cyberiad" +msgid_plural "copies of The Cyberiad" +msgstr[0] "" + +#. ~ Description for {'str': 'The Cyberiad', 'str_pl': 'copies of The +#. Cyberiad'} +#: lang/json/BOOK_from_json.py +msgid "" +"This 350 page paperback presents the exploits and robotic rivalries of Trurl" +" and Klapaucius. Originally written in Polish by Stanislaw Lem, it has been" +" masterfully translated into English by Michael Kandel." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Brave New World" +msgid_plural "copies of Brave New World" +msgstr[0] "" + +#. ~ Description for {'str': 'Brave New World', 'str_pl': 'copies of Brave New +#. World'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is weather worn copy of \"Brave New World\" by Aldous Huxley looks like" +" it has been left out in rain. The novel begins in a bleak building where " +"fetuses are grown in bottles on an assembly line." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Roadside Picnic" +msgid_plural "copies of Roadside Picnic" +msgstr[0] "" + +#. ~ Description for {'str': 'Roadside Picnic', 'str_pl': 'copies of Roadside +#. Picnic'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a paperback copy of \"Roadside Picnic\" by Arkady and Boris " +"Strugatsky. It has been translated into over 20 languages, occasionally " +"under the name \"Stalker.\" This copy, fortunately for you, just happens to" +" be in your native tongue." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Fahrenheit 451" +msgid_plural "copies of Fahrenheit 451" +msgstr[0] "" + +#. ~ Description for {'str': 'Fahrenheit 451', 'str_pl': 'copies of Fahrenheit +#. 451'} +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"Some joker has gently burnt the exterior edge of this paperback dystopia. " +"It's still perfectly readable." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"\"It was a pleasure to burn. It was a special pleasure to see things eaten," +" to see things blackened and changed.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This 1979 softcover edition of Ray Bradbury's \"Fahrenheit 451\" was once a " +"library book. It still has a light blue checkout card pocketed on the torn " +"back cover. One \"Suzanne Collins\" borrowed it in 1981." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"The red and black paperback novel you hold in your hands is a modern reprint" +" of Ray Bradbury's \"Fahrenheit 451.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This scifi novel is divided into three parts: \"The Hearth and the " +"Salamander,\" \"The Sieve and the Sand,\", and \"Burning Bright.\"" +msgstr "" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -26121,8 +26259,9 @@ msgstr[0] "" #: lang/json/BOOK_from_json.py msgid "" "This book is for the delightful little ring bearer in your wedding. The " -"author depicts the responsibility and the honor in being a ring bearer your " -"little angel will cherish." +"author depicts the responsibility and honor in being a ring bearer. Your " +"little angel will cherish this book as he or she learns how to behave on " +"your perfect day." msgstr "" #: lang/json/BOOK_from_json.py @@ -27260,7 +27399,7 @@ msgstr "" msgid "" "A book of Italian fairy tales translated into English. The cover features " "an orange fairy juggling a lemon, a lime, and a tangerine." -msgstr "" +msgstr "一本將義大利童話的英譯本。封面上有一隻柳橙仙子正在用檸檬、萊姆、橘子雜耍。" #: lang/json/BOOK_from_json.py msgid "A book of fables about people who change into birds." @@ -27343,10 +27482,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "The Adorkable Girl" -msgid_plural "The Adorkable Girls" +msgid_plural "copies of Adorkable" msgstr[0] "" -#. ~ Description for The Adorkable Girl +#. ~ Description for {'str': 'The Adorkable Girl', 'str_pl': 'copies of +#. Adorkable'} #: lang/json/BOOK_from_json.py msgid "" "When a therapist's daughter transfers to a new school, she decides to change" @@ -27356,22 +27496,24 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Becoming Jackson" -msgid_plural "Becoming Jacksons" +msgid_plural "copies of Becoming Jackson" msgstr[0] "" -#. ~ Description for Becoming Jackson +#. ~ Description for {'str': 'Becoming Jackson', 'str_pl': 'copies of Becoming +#. Jackson'} #: lang/json/BOOK_from_json.py msgid "" "When Jackson gains the mystical talent to alter his appearance on command, " -"how will he continue to recognize himself in his own mirror?" +"will he be able to recognize himself in his own mirror?" msgstr "" #: lang/json/BOOK_from_json.py msgid "Nothing Burned" -msgid_plural "Nothing Burneds" +msgid_plural "copies of Nothing Burned" msgstr[0] "" -#. ~ Description for Nothing Burned +#. ~ Description for {'str': 'Nothing Burned', 'str_pl': 'copies of Nothing +#. Burned'} #: lang/json/BOOK_from_json.py msgid "" "A teenage influencer becomes fast friends with someone who may or may not be" @@ -27380,10 +27522,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "High and Low" -msgid_plural "High and Lows" +msgid_plural "copies of High and Low" msgstr[0] "" -#. ~ Description for High and Low +#. ~ Description for {'str': 'High and Low', 'str_pl': 'copies of High and +#. Low'} #: lang/json/BOOK_from_json.py msgid "" "In this work of adolescent fiction, a young gemini discovers that the " @@ -27394,10 +27537,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Fire When You See My Eyes" -msgid_plural "Fire When You See My Eyess" +msgid_plural "copies of Fire When" msgstr[0] "" -#. ~ Description for Fire When You See My Eyes +#. ~ Description for {'str': 'Fire When You See My Eyes', 'str_pl': 'copies of +#. Fire When'} #: lang/json/BOOK_from_json.py msgid "" "In a cataclysmic future, advanced technology gives parents access to video " @@ -27406,10 +27550,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Peanut Butter Bruised" -msgid_plural "Peanut Butter Bruiseds" +msgid_plural "copies of Peanut Butter Bruised" msgstr[0] "" -#. ~ Description for Peanut Butter Bruised +#. ~ Description for {'str': 'Peanut Butter Bruised', 'str_pl': 'copies of +#. Peanut Butter Bruised'} #: lang/json/BOOK_from_json.py msgid "" "In this work of young adult fiction, a woman raised on food stamps falls in " @@ -27419,10 +27564,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Ready When You Are" -msgid_plural "Ready When You Ares" +msgid_plural "copies of Ready When" msgstr[0] "" -#. ~ Description for Ready When You Are +#. ~ Description for {'str': 'Ready When You Are', 'str_pl': 'copies of Ready +#. When'} #: lang/json/BOOK_from_json.py msgid "" "When three teenage girls ditch class to drive cross country together they " @@ -27432,10 +27578,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Study of a Boy" -msgid_plural "Study of a Boys" +msgid_plural "copies of \"Study of a Boy\"" msgstr[0] "" -#. ~ Description for Study of a Boy +#. ~ Description for {'str': 'Study of a Boy', 'str_pl': 'copies of "Study of +#. a Boy"'} #: lang/json/BOOK_from_json.py msgid "" "A high school sophomore's personal journal is stolen and then leaked on " @@ -27445,10 +27592,11 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Summer Variables" -msgid_plural "Summer Variabless" +msgid_plural "copies of Summer Variables" msgstr[0] "" -#. ~ Description for Summer Variables +#. ~ Description for {'str': 'Summer Variables', 'str_pl': 'copies of Summer +#. Variables'} #: lang/json/BOOK_from_json.py msgid "" "In this book written primarily for young adults, a woman's modest summer " @@ -27456,6 +27604,58 @@ msgid "" " unsavory elements." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "In a Dark Place" +msgid_plural "copies of Dark Place" +msgstr[0] "" + +#. ~ Description for {'str': 'In a Dark Place', 'str_pl': 'copies of Dark +#. Place'} +#: lang/json/BOOK_from_json.py +msgid "" +"Markia dreams about the future. Theo longs for the past. Together can they" +" find a way to live in the now?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Betrayal Takes Two" +msgid_plural "copies of Betrayal" +msgstr[0] "" + +#. ~ Description for {'str': 'Betrayal Takes Two', 'str_pl': 'copies of +#. Betrayal'} +#: lang/json/BOOK_from_json.py +msgid "" +"This is a hard cover book for older teens. The two main characters pull a " +"cruel prank on their classmates, and are brought together both by their " +"frantic efforts to avoid being caught and their shared sense of guilt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "coming of age novel" +msgid_plural "coming of age novels" +msgstr[0] "成長小說" + +#. ~ Description for {'str': 'coming of age novel'} +#: lang/json/BOOK_from_json.py +msgid "" +"A classic tale about growing up, portraying one young man's funny and " +"poignant experiences with life, love, and sex." +msgstr "一本關於成長的經典寓言故事, 描述一位年輕男子在生活、愛、和性的有趣和淒美的經驗。" + +#: lang/json/BOOK_from_json.py +msgid "Pantheon: The Story of an Iranian Youth" +msgid_plural "copies of Pantheon" +msgstr[0] "" + +#. ~ Description for {'str': 'Pantheon: The Story of an Iranian Youth', +#. 'str_pl': 'copies of Pantheon'} +#: lang/json/BOOK_from_json.py +msgid "" +"A hard cover graphic novel about a young girl living in Iran during the " +"1980's, seeing the world change around her as Iraq invaded her country." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "original copy of Housefly" msgid_plural "original copies of Housefly" @@ -27830,6 +28030,18 @@ msgid "" "your pain at bay." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Baleful Polymorph" +msgid_plural "Scrolls of Baleful Polymorph" +msgstr[0] "" + +#. ~ Description for {'str': 'Scroll of Baleful Polymorph', 'str_pl': 'Scrolls +#. of Baleful Polymorph'} +#. ~ Description for Baleful Polymorph +#: lang/json/BOOK_from_json.py lang/json/SPELL_from_json.py +msgid "Transform your enemies into frogs." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scrolls of Summon Zombie" @@ -28248,7 +28460,7 @@ msgid "" "Summons a small flame that does not burn you, but you can use it to light " "things on fire. It seems to need you to have some intent to light things on" " fire, because you are able to put it in your pocket with no issue." -msgstr "" +msgstr "召喚一個不會燒傷你的細小火焰,你可以用它去點燃物品。它看來需要你一點專注去點燃東西,因為你能毫無阻礙地把它放進去你的口袋之中。" #: lang/json/BOOK_from_json.py msgid "Scroll of Ice Spike" @@ -29018,6 +29230,44 @@ msgid "" "harmless." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Scroll of Knock" +msgid_plural "Scrolls of Knock" +msgstr[0] "" + +#. ~ Description for {'str': 'Scroll of Knock', 'str_pl': 'Scrolls of Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open locked wooden doors from a short " +"range away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Improved Knock" +msgid_plural "Scrolls of Improved Knock" +msgstr[0] "" + +#. ~ Description for {'str': 'Scroll of Improved Knock', 'str_pl': 'Scrolls of +#. Improved Knock'} +#: lang/json/BOOK_from_json.py +msgid "" +"You can channel magical energy to open any locked door from a short range " +"away." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Scroll of Repelling Arc" +msgid_plural "Scrolls of Repelling Arc" +msgstr[0] "" + +#. ~ Description for {'str': 'Scroll of Repelling Arc', 'str_pl': 'Scrolls of +#. Repelling Arc'} +#: lang/json/BOOK_from_json.py +msgid "" +"You manifest an aura of crackling electricity around you to strike attackers" +" with baleful lightning." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "copies of A Technomancer's Guide to Debugging C:DDA" @@ -29295,6 +29545,19 @@ msgid "" "on combining magic with EM radiation." msgstr "這本實驗室參考資料書很厚,內含關於魔法與電磁輻射相結合的大量資訊。" +#: lang/json/BOOK_from_json.py +msgid "Runic Tablet shard" +msgid_plural "Runic Tablet shards" +msgstr[0] "" + +#. ~ Description for {'str': 'Runic Tablet shard'} +#: lang/json/BOOK_from_json.py +msgid "" +"A small tablet of blackened stone, apparently cut from a much larger slab. " +"Golden runes glow over its surface, and slowly shift into intelligible " +"sentences when you stare at them." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Geospatial Systems: The Lie Of Linearity" msgid_plural "copies of Geospatial Systems: The Lie Of Linearity" @@ -29345,34 +29608,6 @@ msgid "" " - F. \"." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "In the Beginning… Was the Command Line" -msgid_plural "copies of In the Beginning… Was the Command Line" -msgstr[0] "" - -#. ~ Description for {'str': 'In the Beginning… Was the Command Line', -#. 'str_pl': 'copies of In the Beginning… Was the Command Line'} -#: lang/json/BOOK_from_json.py -msgid "" -"Humorous 1999 essay by Neal Stephenson comparing computer operating system " -"vendors to car dealerships." -msgstr "" - -#: lang/json/BOOK_from_json.py -msgid "Principles of Compiler Design" -msgid_plural "copies of Principles of Compiler Design" -msgstr[0] "" - -#. ~ Description for {'str': 'Principles of Compiler Design', 'str_pl': -#. 'copies of Principles of Compiler Design'} -#: lang/json/BOOK_from_json.py -msgid "" -"Alfred Aho and Jeffrey Ullman's classic 1977 computer science textbook. " -"Features a cover drawing of a knight wielding an LALR parser generation and " -"syntax directed translation against the metaphorical green dragon, The " -"Complexity of Compiler Design." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py lang/json/ammunition_type_from_json.py msgid "water" msgid_plural "water" @@ -30858,12 +31093,7 @@ msgstr[0] "突變體肉塊" #. ~ Description for {'str': 'chunk of mutant meat', 'str_pl': 'chunks of #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py -msgid "" -"Meat from a heavily mutated animal. It has an unsettling loose and spongy " -"texture, but smells… mostly normal. There are strange tangles and " -"formations in it that don't appear natural at all: bits of bone and hair " -"crusted up inside the muscle, as if trying to form another organism. Still," -" seems digestible at least, if you cook it and remove the worst parts." +msgid "Meat from a heavily mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -30875,10 +31105,8 @@ msgstr[0] "突變體肉碎片" #. mutant meat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"A tiny scrap of meat from a heavily mutated animal. It smells a bit odd, " -"and has bits of hair and bone mixed in that seem like they grew inside the " -"muscle itself. Still, seems digestible at least, if you cook it and remove " -"the worst parts." +"A tiny scrap of meat from a heavily mutated animal. It smells unappealing, " +"to say the least." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -30946,10 +31174,7 @@ msgstr[0] "" #. ~ Description for cooked mutant meat #: lang/json/COMESTIBLE_from_json.py -msgid "" -"This is a cooked chunk of meat from a mutated animal. It has an unsettling," -" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" -" the bits of hair and bone out…" +msgid "This is a cooked chunk of meat from a mutated animal." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -30957,6 +31182,14 @@ msgid "cooked scrap of mutant meat" msgid_plural "cooked scraps of mutant meat" msgstr[0] "煮熟的突變體肉碎片" +#. ~ Description for {'str': 'cooked scrap of mutant meat', 'str_pl': 'cooked +#. scraps of mutant meat'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is a tiny scrap of cooked mutant meat. It is small enough that it's " +"hard to tell how disgusting it is." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw offal" msgid_plural "raw offals" @@ -30983,6 +31216,16 @@ msgid "" "prepared." msgstr "這是經過烹煮的內部器官和腸子。 它含有必需的維生素,但大多數人認為它有點噁心,除非經過精心的調理。" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant organs" +msgid_plural "mutant organs" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'mutant organs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "These organs came from a giant mutant bug." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pickled offal" msgid_plural "pickled offal" @@ -31147,6 +31390,16 @@ msgid "" "all cooked out." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "mutant lungs" +msgid_plural "mutant lungs" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'mutant lungs'} +#: lang/json/COMESTIBLE_from_json.py +msgid "You're pretty sure this is lung tissue." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "raw liver" msgid_plural "raw livers" @@ -31299,8 +31552,9 @@ msgstr[0] "突變體脂肪塊" #. mutant fat'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Freshly butchered fat from a heavily mutated animal. You could eat it raw, " -"but it is better used as an ingredient in other foods or projects." +"Freshly butchered fat from a heavily mutated animal. It smells, if " +"anything, even more disgusting than the rest of the mutant. There are " +"little puddles of unidentified oils dripping from it." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -32554,16 +32808,16 @@ msgid "Water with sugar or honey added. Tastes okay." msgstr "添加了糖或蜂蜜的水。味道也就還好。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea" -msgid_plural "teas" +msgid "black tea" +msgid_plural "black teas" msgstr[0] "" -#. ~ Description for tea +#. ~ Description for black tea #: lang/json/COMESTIBLE_from_json.py msgid "" -"The beverage of gentlemen everywhere, made from applying hot water to leaves" -" of the tea plant /Camellia sinensis/." -msgstr "供全球每位紳士享用的飲品,以熱水沖泡茶樹的葉子製成。" +"The beverage of gentlemen everywhere, made from applying hot water to " +"oxidized leaves of the tea plant /Camellia sinensis/." +msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "bark tea" @@ -32607,6 +32861,31 @@ msgstr[0] "礦泉水" msgid "Fancy mineral water, so fancy it makes you feel fancy just holding it." msgstr "優質的礦泉水, 太優質了讓你連拿著瓶子都覺得優質。" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea" +msgid_plural "green teas" +msgstr[0] "" + +#. ~ Description for green tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Made from applying hot water to leaves of the tea plant /Camellia sinensis/." +" Green tea has a lighter, fresher taste than black and is traditionally " +"preferred in Asian cultures." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea" +msgid_plural "fruit teas" +msgstr[0] "" + +#. ~ Description for fruit tea +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A tasty beverage made with herbs and dried fruit from plants other than the " +"tea plant. While colloquially called 'tea', technically it's an infusion." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sweetened coffee" msgid_plural "sweetened coffees" @@ -34204,6 +34483,30 @@ msgid "" "cheese. Delicious." msgstr "用墨西哥玉米餅製成的鹽漬玉米片, 搭配了奶酪與肉。真美味。" +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos" +msgid_plural "vegetarian nachoss" +msgstr[0] "" + +#. ~ Description for vegetarian nachos +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas, now with beans. Could probably use " +"some cheese, though." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "vegetarian nachos with cheese" +msgid_plural "vegetarian nachos with cheeses" +msgstr[0] "" + +#. ~ Description for vegetarian nachos with cheese +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Salted chips made from corn tortillas with beans and smothered in cheese. " +"Delicious, even if you're not a vegetarian." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pork stick" msgid_plural "pork sticks" @@ -34224,7 +34527,7 @@ msgstr[0] "" msgid "" "A small, microwaveable steak & cheese burrito, like those found at gas " "stations." -msgstr "" +msgstr "一份可微波, 包著肉排和起司的小捲餅。就像那些在加油站找到的。" #: lang/json/COMESTIBLE_from_json.py msgid "uncooked TV dinner" @@ -35178,7 +35481,7 @@ msgstr[0] "" msgid "" "A meat pizza, for all the carnivores out there. Chock-full of minced meat " "and heavily seasoned." -msgstr "" +msgstr "一個加肉的披薩, 所有肉食者的最愛。加入了大量的肉類以及濃郁的醬料。" #: lang/json/COMESTIBLE_from_json.py msgid "supreme pizza" @@ -35188,7 +35491,7 @@ msgstr[0] "" #. ~ Description for supreme pizza #: lang/json/COMESTIBLE_from_json.py msgid "A supreme pizza with ALL the toppings." -msgstr "" +msgstr "擁有所有配料的至高無上披薩。" #: lang/json/COMESTIBLE_from_json.py msgid "deluxe scrambled eggs" @@ -35851,7 +36154,7 @@ msgid "" "Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" " textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." -msgstr "" +msgstr "一瓶稀釋的雙氧水, 用於殺菌或者漂白頭髮和紡織品。接觸到有機物時會起泡, 除此之外是無害的。" #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -36600,7 +36903,7 @@ msgstr[0] "" msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " "antiseptic." -msgstr "" +msgstr "從麝香草中提取出來的油, 它可以作為有輕微刺激的消毒劑。" #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -36798,7 +37101,7 @@ msgstr[0] "" msgid "" "A rag soaked in antiseptic. Useful for light wounds, probably won't help " "with deep bites." -msgstr "" +msgstr "一條浸泡過消毒劑的布條。對小傷口有幫助,對被咬得很深的傷口沒用。" #: lang/json/COMESTIBLE_from_json.py msgid "antiseptic soaked cotton balls" @@ -37778,7 +38081,6 @@ msgid_plural "pine nuts" msgstr[0] "松子" #. ~ Description for {'str_sp': 'pine nuts'} -#. ~ Description for {'str_sp': 'TEST pine nuts'} #: lang/json/COMESTIBLE_from_json.py msgid "A handful of tasty crunchy nuts from a pinecone." msgstr "從松果剝出的香脆美味松子" @@ -38618,24 +38920,52 @@ msgid "" msgstr "給鳥類吃的東西。主要由種子,青貯飼料或豆類製成。它非常適合小型鳥。" #: lang/json/COMESTIBLE_from_json.py -msgid "dog food" -msgid_plural "dog food" -msgstr[0] "狗食" +msgid "wet dog food" +msgid_plural "wet dog food" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'wet dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for dogs, made from canned fresh meats. It smells strange," +" but dogs seem to love it." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "dry dog food" +msgid_plural "dry dog food" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'dry dog food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dry morsels of dog food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" -#. ~ Description for {'str_sp': 'dog food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for dogs. It smells strange, but dogs seem to love it." -msgstr "這是狗的食物。它聞起來很怪, 但是狗很喜歡。" +msgid "wet cat food" +msgid_plural "wet cat food" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'wet cat food'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is wet food for cats, made from canned fresh meats. It has a pungent " +"aroma that cats seem to love." +msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "cat food" -msgid_plural "cat food" -msgstr[0] "貓食" +msgid "dry cat food" +msgid_plural "dry cat food" +msgstr[0] "" -#. ~ Description for {'str_sp': 'cat food'} +#. ~ Description for {'str_sp': 'dry cat food'} #: lang/json/COMESTIBLE_from_json.py -msgid "This is food for cats. It smells strange, but cats seem to love it." -msgstr "這是貓的食物。它聞起來很怪, 但是貓很喜歡。" +msgid "" +"Dry kibbles of cat food with a long shelf life. Made from dried processed " +"meats and grains, and enriched with vitamins and minerals." +msgstr "" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "grass" @@ -38671,15 +39001,39 @@ msgid "Some nectar. Seeing this item is a bug." msgstr "一些花蜜。看到這個的話就是有 bug。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea bag" -msgid_plural "tea bags" +msgid "black tea bag" +msgid_plural "black tea bags" +msgstr[0] "" + +#. ~ Description for {'str': 'black tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of black tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea bag" +msgid_plural "green tea bags" msgstr[0] "" -#. ~ Description for {'str': 'tea bag'} +#. ~ Description for {'str': 'green tea bag'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"Paper sachet with tea leafs inside. Put it into boiling water to get your " -"cup of tea." +"A paper sachet with tea leaves inside. Put it into boiling water to make a " +"cup of green tea." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "fruit tea bag" +msgid_plural "fruit tea bags" +msgstr[0] "" + +#. ~ Description for {'str': 'fruit tea bag'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A paper sachet with leaves and fruit parts inside. Put it into boiling " +"water to make a cup of fruit tea." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -38765,14 +39119,11 @@ msgstr[0] "" #. ~ Description for {'str': 'protein ration'} #: lang/json/COMESTIBLE_from_json.py msgid "" -"SoyPelusa ran a highly successful crowdfunding campaign for their signature " -"protein bar, dubbed \"DaiZoom.\" A person can live on one of these bars, " -"three times a day, presumably forever. After backers received their " -"product, a single flaw was found: most consumers found starvation preferable" -" to the flavor. Warehouses of the product went unsold as the company went " -"bankrupt, providing the perfect opportunity for FEMA to scoop them up and " -"stock the evac shelters. Now, you hold a piece of famous crowdfunding " -"history in your hands. How exciting." +"SoyPelusa ran a highly successful crowdfunding campaign for their signature protein bar, dubbed \"DaiZoom.\"\n" +"\n" +"A person can live on one of these bars, three times a day, presumably forever. After backers received their product, a single flaw was found: most consumers found starvation preferable to the flavor. Warehouses of the product went unsold as the company went bankrupt, providing the perfect opportunity for FEMA to scoop them up and stock the evac shelters.\n" +"\n" +"Now, you hold a piece of famous crowdfunding history in your hands. How exciting." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -39527,17 +39878,29 @@ msgid "" msgstr "這塊根莖已經成熟且充滿糖分, 稍做處理就能提取出糖。" #: lang/json/COMESTIBLE_from_json.py -msgid "tea leaf" -msgid_plural "tea leaves" -msgstr[0] "茶葉" +msgid "black tea leaf" +msgid_plural "black tea leaves" +msgstr[0] "" -#. ~ Description for {'str': 'tea leaf', 'str_pl': 'tea leaves'} +#. ~ Description for {'str': 'black tea leaf', 'str_pl': 'black tea leaves'} #: lang/json/COMESTIBLE_from_json.py msgid "" "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." msgstr "熱帶植物的乾樹葉。您可以燒開水煮成茶, 或者生吃。他們都不太能填補你的肚子。" +#: lang/json/COMESTIBLE_from_json.py +msgid "green tea leaf" +msgid_plural "green tea leaves" +msgstr[0] "" + +#. ~ Description for {'str': 'green tea leaf', 'str_pl': 'green tea leaves'} +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Dried leaves of a tropical plant. You can boil them into green tea, or you " +"can just eat them raw. They aren't too filling though." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "tomato" msgid_plural "tomatoes" @@ -42065,6 +42428,66 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "麵粉與水混合揉成。與僅用麵粉相比,麵團可以更有效率地烘焙麵包。" +#: lang/json/COMESTIBLE_from_json.py +msgid "pineapple stem" +msgid_plural "pineapple stem" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'pineapple stem'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a pineapple plant, for growing your own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "melon seeds" +msgid_plural "melon seeds" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'melon seeds'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some melon seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "banana saplings" +msgid_plural "banana saplings" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'banana saplings'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some banana saplings." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "orange vine" +msgid_plural "orange vine" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'orange vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some orange vine. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "lemon vine" +msgid_plural "lemon vine" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'lemon vine'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Some lemon vines. Definitely GMO." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "subterraenean coconut" +msgid_plural "subterraenean coconut" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'subterraenean coconut'} +#: lang/json/COMESTIBLE_from_json.py +msgid "Proof that man went too far before the Cataclysm." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "vampire mutagen" msgid_plural "vampire mutagens" @@ -42422,6 +42845,11 @@ msgid "ankylosaurus egg" msgid_plural "ankylosaurus eggs" msgstr[0] "" +#: lang/json/COMESTIBLE_from_json.py +msgid "apatosaurus egg" +msgid_plural "apatosaurus eggs" +msgstr[0] "" + #: lang/json/COMESTIBLE_from_json.py msgid "ceratosaurus egg" msgid_plural "ceratosaurus eggs" @@ -42727,7 +43155,7 @@ msgid "scream mushroom" msgid_plural "scream mushrooms" msgstr[0] "" -#. ~ Description for scream mushroom +#. ~ Description for {'str': 'scream mushroom'} #: lang/json/COMESTIBLE_from_json.py msgid "" "The mushrooms harvested from a dead shrieker. Could be used in potions." @@ -42907,104 +43335,6 @@ msgid "" "see this? We will not permit you to join us while we are modded out." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "TEST pine nuts" -msgid_plural "TEST pine nuts" -msgstr[0] "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test bitter almonds" -msgid_plural "test bitter almonds" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test bitter almonds'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A variety of almonds with traces of hydrocyanic acid, potentially toxic when" -" eaten raw." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test hallucinogenic nutmeg" -msgid_plural "test hallucinogenic nutmeg" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test hallucinogenic nutmeg'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"With high levels of the psychoactive myristicin, high doses of nutmeg can " -"cause hallucinations and euphoria, along with a lot of nasty side effects." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test apple" -msgid_plural "test apples" -msgstr[0] "" - -#. ~ Description for {'str': 'test apple'} -#: lang/json/COMESTIBLE_from_json.py -msgid "Test apple. May contain worms, but tastes delicious!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test liquid" -msgid_plural "test liquid" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test liquid'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"No clue what it's made of, but it's definitely liquid. Only for testing, do" -" not drink!" -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "tennis ball wine must" -msgid_plural "tennis ball wine musts" -msgstr[0] "" - -#. ~ Description for tennis ball wine must -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Unfermented tennis ball wine. A rubbery, boiled juice made from mashed " -"tennis balls." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test tennis ball wine" -msgid_plural "test tennis ball wine" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test tennis ball wine'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Cheap booze made from fermented tennis ball juice. Tastes just like it " -"sounds." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test chewing gum" -msgid_plural "test chewing gum" -msgstr[0] "" - -#. ~ Description for {'str_sp': 'test chewing gum'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"Curiously stimulating and thirst-quenching blueberry-flavored chewing gum." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "test mutated thumb" -msgid_plural "test mutated thumbs" -msgstr[0] "" - -#. ~ Description for {'str': 'test mutated thumb'} -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A misshapen human thumb. Eating this would be incredibly disgusting and " -"probably cause you to mutate." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "small metal tank" msgid_plural "small metal tanks" @@ -43799,18 +44129,6 @@ msgstr[0] "鋁罐" msgid "An aluminum can, like what soda comes in." msgstr "一個鋁製罐子, 通常裝過了可樂之類的東西。" -#: lang/json/GENERIC_from_json.py -msgid "opened aluminum can" -msgid_plural "opened aluminum cans" -msgstr[0] "打開的鋁罐" - -#. ~ Description for {'str': 'opened aluminum can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"An aluminum can, like what soda comes in. This one is opened and can't be " -"easily sealed." -msgstr "一個鋁製罐子, 通常裝過了可樂之類的東西。這罐已被開啟而且難以封密。" - #: lang/json/GENERIC_from_json.py msgid "paper carton" msgid_plural "paper cartons" @@ -43819,22 +44137,10 @@ msgstr[0] "" #. ~ Description for {'str': 'paper carton'} #: lang/json/GENERIC_from_json.py msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." +"A half gallon carton constructed of a paper, aluminum, and plastic laminate." " It has a threaded cap for easy resealing." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "opened paper carton" -msgid_plural "opened paper cartons" -msgstr[0] "" - -#. ~ Description for {'str': 'opened paper carton'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A half gallon carton constructed of a paper, aluminum and plastic laminate." -" This one is open and its contents will spoil." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -43855,18 +44161,6 @@ msgstr[0] "" msgid "A small tin can, like what tuna comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "small opened tin can" -msgid_plural "small opened tin cans" -msgstr[0] "" - -#. ~ Description for {'str': 'small opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A small tin can, like what tuna comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "medium tin can" msgid_plural "medium tin cans" @@ -43877,18 +44171,6 @@ msgstr[0] "" msgid "A medium tin can, like what soup comes in." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "medium opened tin can" -msgid_plural "medium opened tin cans" -msgstr[0] "" - -#. ~ Description for {'str': 'medium opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A medium tin can, like what soup comes in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "plastic canteen" msgid_plural "plastic canteens" @@ -43957,16 +44239,6 @@ msgstr[0] "塑膠杯" msgid "A small, vacuum formed cup." msgstr "一個真空成型的小杯。" -#: lang/json/GENERIC_from_json.py -msgid "opened plastic cup" -msgid_plural "opened plastic cups" -msgstr[0] "打開的塑膠杯" - -#. ~ Description for {'str': 'opened plastic cup'} -#: lang/json/GENERIC_from_json.py -msgid "A small, vacuum formed cup, essentially trash." -msgstr "一個真空成型的小杯, 基本上是垃圾。" - #: lang/json/GENERIC_from_json.py msgid "glass flask" msgid_plural "glass flasks" @@ -44121,7 +44393,6 @@ msgid_plural "gallon jugs" msgstr[0] "加侖壺" #. ~ Description for {'str': 'gallon jug'} -#. ~ Description for TEST gallon jug #: lang/json/GENERIC_from_json.py msgid "A standard plastic jug used for milk and household cleaning chemicals." msgstr "用在裝牛奶或家用清潔化學藥品的標準塑膠罐。" @@ -44213,7 +44484,6 @@ msgid_plural "small waterskins" msgstr[0] "小水袋" #. ~ Description for {'str': 'small waterskin'} -#. ~ Description for TEST small waterskin #: lang/json/GENERIC_from_json.py msgid "" "A small watertight leather bag with a carrying strap, can hold 1.5 liters of" @@ -44332,18 +44602,6 @@ msgid "" "food." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "large opened tin can" -msgid_plural "large opened tin cans" -msgstr[0] "" - -#. ~ Description for {'str': 'large opened tin can'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A large tin can, like what beans come in. This one is opened and can't be " -"easily sealed." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "survival kit box" msgid_plural "survival kit boxes" @@ -44378,7 +44636,7 @@ msgstr[0] "" msgid "" "This electrical component is designed to produce microwaves, for use in your" " microwave." -msgstr "" +msgstr "這個電子零件是設計來產生微波的,能用在你的微波爐上。" #: lang/json/GENERIC_from_json.py msgid "explosively pumped flux compression generator" @@ -44807,6 +45065,32 @@ msgstr[0] "甲殼塊" msgid "A piece of an insect's exoskeleton. It is light and very durable." msgstr "一件昆蟲的外骨骼, 輕又耐用。" +#: lang/json/GENERIC_from_json.py +msgid "strand of endochitin" +msgid_plural "strands of endochitin" +msgstr[0] "" + +#. ~ Description for {'str': 'strand of endochitin', 'str_pl': 'strands of +#. endochitin'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of an insect's endoskeleton." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cluster of gas sacs" +msgid_plural "clusters of gas sacs" +msgstr[0] "" + +#. ~ Description for {'str': 'cluster of gas sacs', 'str_pl': 'clusters of gas +#. sacs'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a cluster of membranous bubbles, each about the size of a grape, " +"retrieved from inside a mutant insect. They float like tiny helium " +"balloons, and are likely full of a lighter-than-air gas helping the bug to " +"fly." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "set of 100 ceramic disk" msgid_plural "ceramic disks" @@ -44868,6 +45152,32 @@ msgid "" "Felt patches, bundled tightly together for storage. Disassemble to unpack." msgstr "將大量的毛氈補丁緊緊地捆成一束, 以便於存放。可拆解回原來的大量毛氈補丁。" +#: lang/json/GENERIC_from_json.py +msgid "bundle of planks" +msgid_plural "bundles of planks" +msgstr[0] "" + +#. ~ Description for {'str': 'bundle of planks', 'str_pl': 'bundles of +#. planks'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten construction planks securely lashed together with a rope. Disassemble " +"to unpack." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "bundle of stout branches" +msgid_plural "bundles of stout branches" +msgstr[0] "" + +#. ~ Description for {'str': 'bundle of stout branches', 'str_pl': 'bundles of +#. stout branches'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Ten stout branches securely lashed together with a rope. Disassemble to " +"untie them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "t-substrate sample" msgid_plural "t-substrate samples" @@ -45952,8 +46262,8 @@ msgid "lotus flower" msgid_plural "lotus flowers" msgstr[0] "" -#. ~ Description for lotus #. ~ Description for {'str': 'lotus flower'} +#. ~ Description for lotus #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A lovely flower that grows on the surface of bodies of freshwater. " @@ -47303,6 +47613,16 @@ msgid "" "Unusable as a weapon on its own without the necessary parts." msgstr "這個雷射砲是從 TX-5LR 地獄犬雷射砲塔拆解下來的。因為缺少其必要的元件, 無法作為武器來使用。" +#: lang/json/GENERIC_from_json.py +msgid "bone armor kit" +msgid_plural "bone armor kits" +msgstr[0] "骨製裝甲板" + +#. ~ Description for {'str': 'bone armor kit'} +#: lang/json/GENERIC_from_json.py +msgid "Bone plating made for a vehicle." +msgstr "為車輛而設計的骨板。" + #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" @@ -48742,6 +49062,54 @@ msgid "" "wound." msgstr "一具半斬首的屍體。目前尚不清楚是什麼原因造成了這種傷口。" +#: lang/json/GENERIC_from_json.py +msgid "broken exodii worker" +msgid_plural "broken exodii workers" +msgstr[0] "" + +#. ~ Description for broken exodii worker +#: lang/json/GENERIC_from_json.py +msgid "A broken exodii worker. It's possible it could be gutted for parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii quadruped" +msgid_plural "broken exodii quadrupeds" +msgstr[0] "" + +#. ~ Description for broken exodii quadruped +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii walker. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii turret" +msgid_plural "broken exodii turrets" +msgstr[0] "" + +#. ~ Description for broken exodii turret +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken exodii turret. Still looks intimidating despite being permanently " +"inoperative, possibly due to the sheer size and mass. Could be gutted for " +"parts." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "broken exodii balloon-drone" +msgid_plural "broken exodii balloon-drones" +msgstr[0] "" + +#. ~ Description for broken exodii balloon-drone +#: lang/json/GENERIC_from_json.py +msgid "" +"A broken balloon drone. The balloon has been shredded, but most of the " +"chassis is still intact. Could be gutted for parts." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "ammo belt linkage" msgid_plural "ammo belt linkages" @@ -49873,7 +50241,7 @@ msgstr[0] "塑膠叉子" msgid "" "A plastic disposable fork. Great for picnic lunches in the post apocalyptic" " wasteland." -msgstr "" +msgstr "一把塑膠製的一次性叉子。最適合在大災變後的廢土上野餐了。" #: lang/json/GENERIC_from_json.py msgid "spoon" @@ -49893,7 +50261,7 @@ msgstr[0] "塑膠湯匙" #. ~ Description for {'str': 'plastic spoon'} #: lang/json/GENERIC_from_json.py msgid "A plastic disposable spoon. Easier to bend than the metal variety." -msgstr "" +msgstr "一把塑膠製的一次性湯匙。比金屬做的還要好折彎。" #: lang/json/GENERIC_from_json.py msgid "kiddie spoon" @@ -49911,7 +50279,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "This spoon is styled to look like a bulldozer." -msgstr "" +msgstr "這個湯匙的造型看起來像是台推土機。" #: lang/json/GENERIC_from_json.py msgid "" @@ -49940,7 +50308,7 @@ msgstr[0] "奶油刀" msgid "" "A dull knife, absolutely worthless in combat. Excellent for spreading soft " "things on bread." -msgstr "" +msgstr "除了塗奶油外, 完全沒有戰鬥價值。在把糊狀的東西塗在麵包上的功能特別突出。" #: lang/json/GENERIC_from_json.py msgid "plastic knife" @@ -50021,7 +50389,7 @@ msgstr "" msgid "" "This bottle opener is emblazoned with a logo for an HVAC contracting " "company." -msgstr "" +msgstr "這個開瓶器上面有暖通空調承包公司的商標。" #: lang/json/GENERIC_from_json.py msgid "This bottle opener reads 'Corporate Team Building Exercise 1999'." @@ -50071,7 +50439,7 @@ msgstr[0] "一雙筷子" msgid "" "One of the most popular eating utensils in the world. Does double duty as a" " way of dealing with especially fragile vampires." -msgstr "" +msgstr "世界上最有名的餐飲用具之一。還能拿來對付弱不禁風的吸血鬼。" #: lang/json/GENERIC_from_json.py msgid "ladle" @@ -50411,7 +50779,7 @@ msgstr[0] "" #: lang/json/GENERIC_from_json.py msgid "" "A typical microphone used to record or amplify voice. Comes with a clip. " -"Has a 3-pin XLR connector on the bottom in order to connect to am amp." +"Has a 3-pin XLR connector on the bottom in order to connect to an amp." msgstr "" #: lang/json/GENERIC_from_json.py @@ -50581,6 +50949,19 @@ msgid "" "anything on its own." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "set of pipe fittings" +msgid_plural "sets of pipe fittings" +msgstr[0] "" + +#. ~ Description for {'str': 'set of pipe fittings', 'str_pl': 'sets of pipe +#. fittings'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A loose assortment of metal pipe fittings - end caps, pipe junctions, and " +"similar items. They can be used in a variety of projects." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "short cordage piece" msgid_plural "short cordage pieces" @@ -51178,7 +51559,7 @@ msgstr[0] "琉森鎚" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with a spiked hammer head, a spike, and a hook " -"attached to a long stick." +"attached to a beefy wooden pole." msgstr "" #. ~ Description for {'str': 'lucerne hammer'} @@ -51520,7 +51901,6 @@ msgid_plural "pointy sticks" msgstr[0] "尖木棍" #. ~ Description for {'str': 'pointy stick'} -#. ~ Description for {'str': 'test pointy stick'} #: lang/json/GENERIC_from_json.py msgid "A simple wood pole with one end sharpened." msgstr "一隻簡單的木棍, 前端是鋒利的。" @@ -51610,15 +51990,15 @@ msgstr[0] "長戟" #: lang/json/GENERIC_from_json.py msgid "" "This is a versatile polearm with an axe blade, a spike, and other fun things" -" attached to a long stick." -msgstr "這是把多功能的長柄武器, 長棍上有著斧刃、尖刺和其他 \"有趣\" 的事物。" +" attached to a long sturdy stick." +msgstr "" #. ~ Description for {'str': 'halberd'} #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, cheaply made replica of a polearm with an axe blade, a " -"spike, and other fun things attached to a long stick." -msgstr "這是把長柄武器, 長棍上有著斧刃、尖刺和其他 \"有趣\" 的事物。它是鈍的廉價複製品。" +"spike, and other fun things attached to a thick pole." +msgstr "" #: lang/json/GENERIC_from_json.py msgid "glaive" @@ -52179,18 +52559,6 @@ msgid "" "from India designed to be concealed under and against the palm." msgstr "也叫bagh nakha或鐵爪, 這是一種來自印度有著小爪狀刀刃設計的武器, 能被藏在手中。" -#: lang/json/GENERIC_from_json.py -msgid "cestus" -msgid_plural "cestuses" -msgstr[0] "金屬拳套" - -#. ~ Description for {'str': 'cestus', 'str_pl': 'cestuses'} -#: lang/json/GENERIC_from_json.py -msgid "" -"A leather hand and arm wrap incorporating metal plates over the knuckles to " -"improve punching power and defence." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "pair of brass knuckles" msgid_plural "pairs of brass knuckles" @@ -52337,6 +52705,103 @@ msgid "" "somewhat warm to the touch." msgstr "這是外星樹脂的碎片。它看起來有點像一塊大的海玻璃,結霜而堅韌,邊緣變圓。摸起來竟有點溫暖。" +#: lang/json/GENERIC_from_json.py +msgid "Exodii chassis" +msgid_plural "Exodii chassis" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Exodii chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This roughly hexagonal frame and associated bodywork looks like it was " +"constructed as a single monolithic piece. The fitting holes and attachments" +" are extremely durable, despite showing signs of heavy wear and repair. The" +" structure is versatile, and could probably be engineered to serve a number " +"of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Exodii drone chassis" +msgid_plural "Exodii drone chassis" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Exodii drone chassis'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This small, roughly hexagonal frame and associated bodywork looks like it " +"was constructed as a single monolithic piece. The fitting holes and " +"attachments are extremely durable, despite showing signs of heavy wear and " +"repair. The structure is versatile, and could probably be engineered to " +"serve a number of different heavy combat roles." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic neural matrix" +msgid_plural "cybernetic neural matrices" +msgstr[0] "" + +#. ~ Description for {'str': 'cybernetic neural matrix', 'str_pl': 'cybernetic +#. neural matrices'} +#: lang/json/GENERIC_from_json.py +msgid "" +"A series of tanks and tubes with ports for fluids, electricity, and input " +"and output, this complex arrangement is made to house a brain and spine and " +"the most difficult to replace organs for keeping them alive." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "unfamiliar electronic thingy" +msgid_plural "unfamiliar electronic thingys" +msgstr[0] "" + +#. ~ Description for {'str': 'unfamiliar electronic thingy'} +#: lang/json/GENERIC_from_json.py +msgid "" +"The wiring and general shape suggest to you that this is a computer, or at " +"least some sort of electronic device, but what it is and what role it serves" +" is lost on you. It's heavy and sturdy in construction." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "inscribed metal plates" +msgid_plural "inscribed metal platess" +msgstr[0] "" + +#. ~ Description for {'str': 'inscribed metal plates'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device looks electronic, but is unfamiliar. It is a series of tightly " +"fitted coppery-looking rings, set concentrically. Wires run from each ring " +"to an axis in the middle." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "cybernetic sensor" +msgid_plural "cybernetic sensors" +msgstr[0] "" + +#. ~ Description for {'str': 'cybernetic sensor'} +#: lang/json/GENERIC_from_json.py +msgid "" +"From the large glassy eye - the size of a small dinner plate - in the front," +" you deduce this is some sort of camera. None of the inner workings make " +"any sense to you nor resemble any camera you've seen before." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "rotary device" +msgid_plural "rotary devices" +msgstr[0] "" + +#. ~ Description for {'str': 'rotary device'} +#: lang/json/GENERIC_from_json.py +msgid "" +"You assume from the coils of coppery wire and the protruding piston that " +"this is some sort of motor or generator, but the design doesn't look similar" +" to anything you've seen before, and you can't figure out how to get it to " +"work." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "sheet of glass" msgid_plural "sheets of glass" @@ -52420,7 +52885,6 @@ msgid_plural "pipes" msgstr[0] "鋼管" #. ~ Description for {'str': 'pipe'} -#. ~ Description for TEST pipe #: lang/json/GENERIC_from_json.py msgid "" "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes." @@ -52611,7 +53075,12 @@ msgid "" "been used for commercial wrapping or for weather-sealing a home." msgstr "這是一大張厚重的軟塑膠,可用於商業包裝或家用防水。" -#. ~ Description for plastic sheet +#: lang/json/GENERIC_from_json.py +msgid "rigid plastic sheet" +msgid_plural "rigid plastic sheets" +msgstr[0] "" + +#. ~ Description for rigid plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "A large, rigid sheet of translucent plastic, useful for all manner of " @@ -53479,9 +53948,9 @@ msgstr[0] "粗製長柄刀" #. ~ Description for {'str': 'makeshift glaive'} #: lang/json/GENERIC_from_json.py msgid "" -"This is a large blade attached to a long stick. It could do a considerable " -"amount of damage." -msgstr "將大刀刃連接在一根長棍子上。它能造成可觀的傷害。" +"This is a large blade attached to a stout section of tree branch. It could " +"do a considerable amount of damage." +msgstr "" #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -53637,6 +54106,20 @@ msgstr[0] "" msgid "A stapler for fastening sheets of paper together." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "hole puncher" +msgid_plural "hole punchers" +msgstr[0] "" + +#. ~ Description for {'str': 'hole puncher'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This metal tool can help you punch a single hole in a piece of paper. I " +"mean, you could do more if you wanted, but you'd have to do them one at a " +"time. Or, if you really wanted more holes with one punch, I suppose you " +"could fold the paper… This is a one cylinder hole puncher." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pen" msgid_plural "pens" @@ -53879,6 +54362,18 @@ msgid "" "until it floats. Then attach oars or a motor to get the boat to move." msgstr "讓船漂浮的木板。將船體安裝到載具中直到它漂浮。然後附上槳或馬達以使船移動。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "raft boat hull" +msgid_plural "raft boat hulls" +msgstr[0] "" + +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Logs tied together to make a vehicle float. Add boat hulls to a vehicle " +"until it floats. Then attach oars or a motor to get the boat to move." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "plastic boat hull" msgid_plural "plastic boat hulls" @@ -54737,7 +55232,6 @@ msgid_plural "sheet metal" msgstr[0] "" #. ~ Description for {'str_sp': 'sheet metal'} -#. ~ Description for TEST sheet metal #: lang/json/GENERIC_from_json.py msgid "A thin sheet of metal." msgstr "一片薄金屬板。" @@ -54846,16 +55340,6 @@ msgstr[0] "生物矽化甲殼裝甲套件" msgid "Durable silica-coated chitin plating made for a vehicle." msgstr "用於車輛的耐用二氧化矽塗層幾丁質鍍層。" -#: lang/json/GENERIC_from_json.py -msgid "bone armor kit" -msgid_plural "bone armor kits" -msgstr[0] "骨製裝甲板" - -#. ~ Description for {'str': 'bone armor kit'} -#: lang/json/GENERIC_from_json.py -msgid "Bone plating made for a vehicle." -msgstr "為車輛而設計的骨板。" - #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -55111,8 +55595,8 @@ msgid "workbench" msgid_plural "workbenches" msgstr[0] "" -#. ~ Description for workbench #. ~ Description for {'str': 'workbench', 'str_pl': 'workbenches'} +#. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" @@ -55280,6 +55764,16 @@ msgstr[0] "水龍頭" msgid "A metal faucet that can be attached to a water tank for easy access." msgstr "一個金屬的水龍頭, 可以連接到水箱上以便取水。" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount" +msgid_plural "wooden wheel mounts" +msgstr[0] "" + +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/GENERIC_from_json.py +msgid "A piece of wood with holes suitable for a bike wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "light wheel mount" msgid_plural "light wheel mounts" @@ -55848,6 +56342,17 @@ msgstr[0] "" msgid "It has given you an answer, but you are yet to ask anything." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "woven metamaterial sheet" +msgid_plural "woven metamaterial sheets" +msgstr[0] "" + +#. ~ Description for {'str': 'woven metamaterial sheet'} +#: lang/json/GENERIC_from_json.py +msgid "" +"An intricately spun and carefully engineered sheet of iridescent fibers." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "nanowire battery" msgid_plural "nanowire batteries" @@ -55934,7 +56439,19 @@ msgstr[0] "" #. ~ Description for {'str': 'super conductive electromagnet'} #: lang/json/GENERIC_from_json.py -msgid "A powerful electromagnet made from a room temperature superconductor ." +msgid "A powerful electromagnet made from a room temperature superconductor." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "ferrofluid dynamo" +msgid_plural "ferrofluid dynamos" +msgstr[0] "" + +#. ~ Description for {'str': 'ferrofluid dynamo'} +#: lang/json/GENERIC_from_json.py +msgid "" +"Black metallic fluid, harmonically flowing from one fractal shape to the " +"next." msgstr "" #: lang/json/GENERIC_from_json.py @@ -56509,6 +57026,16 @@ msgid "" "battles is bookmarked." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Stormguard Warrior" +msgid_plural "Stormguard Warrior" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Stormguard Warrior'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Iron Heart discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "The Life and Work of Tiger Sauer" msgid_plural "The Life and Work of Tiger Sauer" @@ -56521,6 +57048,61 @@ msgid "" "art." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Pocket Monster Encyclopedia" +msgid_plural "Pocket Monster Encyclopedia" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Pocket Monster Encyclopedia'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This encyclopedia contains a detailed listing of the strengths and " +"techniques of various fictional monsters and how to apply them the in a real" +" fight." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Distant Horizon" +msgid_plural "Distant Horizon" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Distant Horizon'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Setting Sun discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Jedi Holocrons: Form I" +msgid_plural "Jedi Holocrons: Form I" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Jedi Holocrons: Form I'} +#: lang/json/GENERIC_from_json.py +msgid "" +"This device contains the teachings of the first form of Jedi lightsaber " +"combat: Shii-Cho." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Shards of Granite" +msgid_plural "Shards of Granite" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Shards of Granite'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Stone Dragon discipline." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Reaping Talons" +msgid_plural "Reaping Talons" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Reaping Talons'} +#: lang/json/GENERIC_from_json.py +msgid "This book contains the teaching of the Tiger Claw discipline." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "stone shell" msgid_plural "stone shells" @@ -56541,9 +57123,9 @@ msgstr[0] "發光粉" #. ~ Description for glow dust #: lang/json/GENERIC_from_json.py msgid "" -"The powdered remains of a will-o-wisps's phsyical form. It seems to still " +"The powdered remains of a will-o-wisps's physical form. It seems to still " "possess an otherworldly glow." -msgstr "鬼火物質型態的粉狀遺骸。它依然散發出異界的光芒。" +msgstr "" #: lang/json/GENERIC_from_json.py msgid "magical reading light" @@ -56657,7 +57239,7 @@ msgstr[0] "" #. ~ Description for mana dust #: lang/json/GENERIC_from_json.py msgid "" -"Crystallized mana in powdered form. It faintly pulses with arcane energy." +"Crystalized mana in powdered form. It faintly pulses with arcane energy." msgstr "" #: lang/json/GENERIC_from_json.py @@ -57900,126 +58482,6 @@ msgid "" "much more expensive." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "TEST plank" -msgid_plural "TEST planks" -msgstr[0] "" - -#. ~ Description for TEST plank -#: lang/json/GENERIC_from_json.py -msgid "" -"A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" -" lumber. Makes a decent melee weapon, and can be used for all kinds of " -"construction." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST pipe" -msgid_plural "TEST pipes" -msgstr[0] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST sheet metal" -msgid_plural "TEST sheet metals" -msgstr[0] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST gallon jug" -msgid_plural "TEST gallon jugs" -msgstr[0] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST small waterskin" -msgid_plural "TEST small waterskins" -msgstr[0] "" - -#: lang/json/GENERIC_from_json.py -msgid "test balloon" -msgid_plural "test balloons" -msgstr[0] "" - -#. ~ Description for {'str': 'test balloon'} -#: lang/json/GENERIC_from_json.py -msgid "Stretchy, watertight, and airtight - the perfect trial balloon." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test pointy stick" -msgid_plural "test pointy sticks" -msgstr[0] "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST clumsy sword" -msgid_plural "TEST clumsy swords" -msgstr[0] "" - -#. ~ Description for TEST clumsy sword -#: lang/json/GENERIC_from_json.py -msgid "A poorly balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST normal sword" -msgid_plural "TEST normal swords" -msgstr[0] "" - -#. ~ Description for TEST normal sword -#: lang/json/GENERIC_from_json.py -msgid "A sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "TEST balanced sword" -msgid_plural "TEST balanced swords" -msgstr[0] "" - -#. ~ Description for TEST balanced sword -#: lang/json/GENERIC_from_json.py -msgid "A well-balanced sword for test purposes" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test box" -msgid_plural "test boxs" -msgstr[0] "" - -#. ~ Description for {'str': 'test box'} -#: lang/json/GENERIC_from_json.py -msgid "A simple 1-liter cardboard box of deliberately undefined proportions." -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 14 cm rod" -msgid_plural "test 14 cm rods" -msgstr[0] "" - -#. ~ Description for test 14 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 14 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test 15 cm rod" -msgid_plural "test 15 cm rods" -msgstr[0] "" - -#. ~ Description for test 15 cm rod -#: lang/json/GENERIC_from_json.py -msgid "A thin rod exactly 15 cm in length" -msgstr "" - -#: lang/json/GENERIC_from_json.py -msgid "test nuclear carafe" -msgid_plural "test nuclear carafes" -msgstr[0] "" - -#. ~ Description for {'str': 'test nuclear carafe'} -#: lang/json/GENERIC_from_json.py -msgid "" -"This is a test coffee carafe designed to keep atomic beverages extra " -"radioactive. It leaks radiation all the time." -msgstr "" - #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" msgstr "槍械" @@ -60660,6 +61122,32 @@ msgid "" "thrower." msgstr "粗製的加壓 2公升鋼瓶,設計用於粗製化學藥劑噴灑器供料。" +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 71 Exodii 12.3ln magazine" +msgid_plural "PA Md. 71 Exodii 12.3ln magazines" +msgstr[0] "" + +#. ~ Description for {'str': 'PA Md. 71 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A small, sleek magazine based on a classic PA Md. 71 clip, with some " +"redesigns by the Exodii for better use in lighter-than-air drones. Its " +"small size is less appropriate for ground-fighting of hordes of zombies, as " +"it is a bit inconvenient to reload." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PA Md. 68 Exodii 12.3ln magazine" +msgid_plural "PA Md. 68 Exodii 12.3ln magazines" +msgstr[0] "" + +#. ~ Description for {'str': 'PA Md. 68 Exodii 12.3ln magazine'} +#: lang/json/MAGAZINE_from_json.py +msgid "" +"An unreasonably large magazine for the already heavy PA Md. 68 battle rifle," +" custom designed and manufactured by the Exodii." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" msgid_plural "pressurized fuel tanks" @@ -61089,28 +61577,6 @@ msgid "" "tips." msgstr "這種小型法力水晶,專門設計用於連接魔杖的尖端。" -#: lang/json/MAGAZINE_from_json.py -msgid "test disposable battery" -msgid_plural "test disposable batteries" -msgstr[0] "" - -#. ~ Description for {'str': 'test disposable battery', 'str_pl': 'test -#. disposable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test disposable battery." -msgstr "" - -#: lang/json/MAGAZINE_from_json.py -msgid "test rechargeable battery" -msgid_plural "test rechargeable batteries" -msgstr[0] "" - -#. ~ Description for {'str': 'test rechargeable battery', 'str_pl': 'test -#. rechargeable batteries'} -#: lang/json/MAGAZINE_from_json.py -msgid "This is a test battery that may be recharged." -msgstr "" - #: lang/json/MOD_INFO_from_json.py src/color.cpp src/color.cpp msgid "default" msgstr "預設" @@ -61126,7 +61592,10 @@ msgstr "餘波" #. ~ Description for Aftershock #: lang/json/MOD_INFO_from_json.py -msgid "Drifts the game away from realism and more towards sci-fi." +msgid "" +"Drifts the game away from realism and more towards sci-fi. Long term goal " +"of being a significantly different experience that remains compatible with " +"other mods." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -61168,8 +61637,9 @@ msgstr "" #. ~ Description for Dark Skies Above #: lang/json/MOD_INFO_from_json.py msgid "" -"A total conversion that shifts the Cataclysm towards an XCOM 2 style alien " -"occupation. Use other mods at your own risk!" +"A total conversion that shifts the Cataclysm towards an alien occupation " +"survival scenario. THIS MOD WILL BREAK INTENDED FUNCTIONALITY OF OTHER " +"MODS! USE OTHER MODS AT YOUR OWN RISK." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -61372,16 +61842,6 @@ msgstr "技能提高屬性" msgid "Allows stats to raise via skill progression." msgstr "屬性會隨技能發展提昇。" -#: lang/json/MOD_INFO_from_json.py -msgid "TESTING DATA" -msgstr "" - -#. ~ Description for TESTING DATA -#: lang/json/MOD_INFO_from_json.py -msgid "" -"Adds mockup items, recipes, and other content for use by automated tests." -msgstr "" - #: lang/json/MOD_INFO_from_json.py msgid "Urban Development" msgstr "城市發展" @@ -61661,6 +62121,46 @@ msgid "" "able to give them back some humanity. If only they cared…" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Exodii worker" +msgid_plural "Exodii workers" +msgstr[0] "" + +#. ~ Description for Exodii worker +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a mostly humanoid robot equipped with various construction tools." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Exodii quadruped" +msgid_plural "Exodii quadrupeds" +msgstr[0] "" + +#. ~ Description for Exodii quadruped +#: lang/json/MONSTER_from_json.py +msgid "" +"This enormous quadrupedal robot seems to be cobbled together from parts, " +"most of them unfamiliar to you. It moves with a heavy, oddly graceful gait," +" its footsteps leaving shallow craters behind. It bristles with an arsenal " +"of weaponry, but doesn't seem in a particular rush to target you." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "zomborg" +msgid_plural "zomborgs" +msgstr[0] "" + +#. ~ Description for zomborg +#: lang/json/MONSTER_from_json.py +msgid "" +"A mix of dead human and even deader technology, this twisted mess of steel " +"and flesh moves like a puppet in the hands of an angry toddler. Its robotic" +" components seem to have shut down, and new bands of flesh have wrapped " +"around them, tugging and pulling them in awkward directions. Bits of " +"metallic skeleton and armor plating jut from its decaying flesh." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "police bot" msgid_plural "police bots" @@ -61876,6 +62376,22 @@ msgid "" "appears to have a mininuke inside. If this is targeting you… Run." msgstr "這台四軸飛行器無人機比一般無人機大上數倍,配有迷你核彈。如果看到它飛向你... 快逃!" +#: lang/json/MONSTER_from_json.py +msgid "balloon sniper-drone" +msgid_plural "balloon sniper-drones" +msgstr[0] "" + +#. ~ Description for {'str': 'balloon sniper-drone'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This unusual contraption looks like a combination of a weather balloon and a" +" quadcopter. Beneath the crude box containing its components hangs a small " +"articulated rig wielding an integrated rifle. Its propellers flicker to " +"life briefly, then shut down again, keeping it mostly stationary despite the" +" air currents. It looks capable of hanging in the air for quite a long time" +" before running out of power." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "alpha razorclaw" msgid_plural "alpha razorclaws" @@ -63174,6 +63690,16 @@ msgid "" "about rapidly and the mouths form a chorus of groaning screams." msgstr "許多腐爛的人類和動物融合成噁心的形體, 上面的所有頭顱會快速的眨眼而嘴巴會發出尖叫與呻吟。" +#: lang/json/MONSTER_from_json.py src/mtype.cpp +msgid "human" +msgid_plural "humans" +msgstr[0] "人類" + +#. ~ Description for {'str': 'human'} +#: lang/json/MONSTER_from_json.py +msgid "Place holder for human corpses. If you see this, it's a bug." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bat" msgid_plural "bats" @@ -63564,6 +64090,20 @@ msgid "" msgstr "" "棲息於東部的美洲獅,是一種大型的食肉目貓科動物。一度被認為在本地已經滅絕,經過了保育的工作已經成功的恢復成蓬勃發展的群體。敏捷又隱蔽,這位獵食者能夠用強而有力的跳躍猛撲到遠處的獵物,用危險的利爪抓住獵物然後用牙齒給予致命一擊。" +#: lang/json/MONSTER_from_json.py +msgid "tiger" +msgid_plural "tigers" +msgstr[0] "" + +#. ~ Description for {'str': 'tiger'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The majestic tiger, a large feline predator. Native to Asia, they are now " +"most populous in private reserves in the United States. Fast and powerful, " +"this predator is one of the most recognizable and beloved animals in the " +"world. Also one of the deadliest." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "calf" msgid_plural "calves" @@ -65111,6 +65651,18 @@ msgstr "" msgid "Lightning arcs from the leech stalk!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "signal tree" +msgid_plural "signal trees" +msgstr[0] "" + +#. ~ Description for signal tree +#: lang/json/MONSTER_from_json.py +msgid "" +"A trunk reaches tall into the sky, its topmost branches glowing with yellow " +"light. A low drum periodically shakes its vicinities." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "leech pod cluster" msgid_plural "leech pod clusters" @@ -65577,6 +66129,19 @@ msgstr[0] "" msgid "High-powered loudspeaker, repeating loud messages over and over again." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "upcycled turret" +msgid_plural "upcycled turrets" +msgstr[0] "" + +#. ~ Description for upcycled turret +#: lang/json/MONSTER_from_json.py +msgid "" +"This hefty turret appears to be bolted together out of various scraps of " +"technology, many of them extremely foreign looking. It is equipped with a " +"hefty looking machine gun." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "eyebot" msgid_plural "eyebots" @@ -65663,6 +66228,142 @@ msgid "" "looking for patient to assist." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "skeletal dog" +msgid_plural "skeletal dogs" +msgstr[0] "骷髏犬" + +#. ~ Description for {'str': 'skeletal dog'} +#. ~ Description for {'str': 'skeletal wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once-canine has shed all of its skin, revealing a carapace of fused " +"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " +"to be controlled by a net of veins and sinews which pulse with glistening " +"black goo." +msgstr "這個曾經是狗的生物所有的皮膚都已剝落,露出了骨頭與肋骨。雖然完全沒有血肉,骨頭間仍有血管與肌腱聯繫,伴隨著黑色黏液。" + +#: lang/json/MONSTER_from_json.py +msgid "barghest" +msgid_plural "barghests" +msgstr[0] "" + +#. ~ Description for {'str': 'barghest'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Huge swollen zombie dog, smeared black with slime. Its teeth are longer and" +" its broad back is rippling with muscles and oozing wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hulking horror" +msgid_plural "hulking horrors" +msgstr[0] "" + +#. ~ Description for {'str': 'hulking horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A four-legged canine body now grotesquely swollen, with arms as wide as a " +"trash can and massive exposed teeth." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "boneplate wolf" +msgid_plural "boneplate wolfs" +msgstr[0] "" + +#. ~ Description for {'str': 'boneplate wolf'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This is a four legged creature covered in fused bony plates, shaped somewhat" +" like a dog or wolf. Joints and cracks around its body ooze with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal wolf" +msgid_plural "skeletal wolfs" +msgstr[0] "" + +#: lang/json/MONSTER_from_json.py +msgid "spearcat hunter" +msgid_plural "spearcat hunters" +msgstr[0] "" + +#. ~ Description for {'str': 'spearcat hunter'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This cougar's eyes ooze with dark, oily fluid, and its fur is torn, " +"revealing deep festering wounds. Its claws and teeth are unnaturally long " +"and sharpened into dangerous looking spikes" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "skeletal zombear" +msgid_plural "skeletal zombears" +msgstr[0] "" + +#. ~ Description for {'str': 'skeletal zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A monstrous overgrowth of ossified tissue has replaced this zombear's " +"rotting skin with an organic armor of dense bone. Large clumps of black goo" +" seep from its joints as it shambles aimlessly, with sickening crackling " +"sounds filling the air around it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "shadowcat" +msgid_plural "shadowcats" +msgstr[0] "" + +#. ~ Description for {'str': 'shadowcat'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is the outline of a large, " +"shambling cat." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "acidic zombear" +msgid_plural "acidic zombears" +msgstr[0] "" + +#. ~ Description for {'str': 'acidic zombear'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A sickly-looking dead dead black bear with patchy fur. Its skin looks " +"especially thin, with a sticky, yellow fluid flowing through the clearly " +"visible veins." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "antlered hammer" +msgid_plural "antlered hammers" +msgstr[0] "" + +#. ~ Description for {'str': 'antlered hammer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This once great moose's eyes ooze with dark, oily fluid, and its flesh is " +"torn and scarred. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "thorny bear shambler" +msgid_plural "thorny bear shamblers" +msgstr[0] "" + +#. ~ Description for {'str': 'thorny bear shambler'} +#: lang/json/MONSTER_from_json.py +msgid "" +"What once was a great moose is now covered with long, matted hair twisted " +"with thorny vines that wrap together and then twist back into the body. " +"Long interlocking thorns wrap the antlers, dripping with a mysterious " +"silvery liquid." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "jawed terror" msgid_plural "jawed terrors" @@ -65687,20 +66388,6 @@ msgid "" "outpace its two-legged friends." msgstr "這是隻強而有力的犬科畸形生物, 向前的追擊速度比牠兩條腿的朋友更快。" -#: lang/json/MONSTER_from_json.py -msgid "skeletal dog" -msgid_plural "skeletal dogs" -msgstr[0] "骷髏犬" - -#. ~ Description for {'str': 'skeletal dog'} -#: lang/json/MONSTER_from_json.py -msgid "" -"This once-canine has shed all of its skin, revealing a carapace of fused " -"bones and ribs. Devoid entirely of flesh, this walking suit of bone seems " -"to be controlled by a net of veins and sinews which pulse with glistening " -"black goo." -msgstr "這個曾經是狗的生物所有的皮膚都已剝落,露出了骨頭與肋骨。雖然完全沒有血肉,骨頭間仍有血管與肌腱聯繫,伴隨著黑色黏液。" - #: lang/json/MONSTER_from_json.py msgid "Z-9" msgid_plural "Z-9s" @@ -65804,6 +66491,30 @@ msgid "" "and its eyes bulge with black goo." msgstr "一隻看起來普通的美洲獅, 但是它的後腳腫脹, 並且從眼睛流出黑色的黏液。" +#: lang/json/MONSTER_from_json.py +msgid "Tiger wight" +msgid_plural "Tiger wights" +msgstr[0] "" + +#. ~ Description for {'str': 'Tiger wight'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This otherwise normal looking tiger stumbles and sways, its jaws slack, its " +"eyes wide open and shining black." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "mass of zombie spiders" +msgid_plural "mass of zombie spiderss" +msgstr[0] "" + +#. ~ Description for {'str': 'mass of zombie spiders'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Thousands, maybe millions of spiders piling up high, each slowly oozing " +"sticky green pus, struggling to keep the fetid mass together and moving." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "scarred zombie" msgid_plural "scarred zombies" @@ -66320,6 +67031,43 @@ msgstr "" msgid "The impaler launches a barb!" msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "scissorlimbs" +msgid_plural "scissorlimbss" +msgstr[0] "" + +#. ~ Description for {'str': 'scissorlimbs'} +#: lang/json/MONSTER_from_json.py +msgid "" +" A nightmarish spider of gore stands tall among the ruins, and keeps silent " +"watch of the blighted landscape. Its spindly limbs of bone slip between the" +" rubble with otherworldly speed." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "hanging innards" +msgid_plural "hanging innardss" +msgstr[0] "" + +#. ~ Description for {'str': 'hanging innards'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Great snakes of flesh hang from the ceiling above, madly thrashing and " +"reaching about." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "spasming lump" +msgid_plural "spasming lumps" +msgstr[0] "" + +#. ~ Description for {'str': 'spasming lump'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A great pile of merged bodies and mutated flesh. It spasms in an arrhythmic" +" and desperate manner." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "flesh wall" msgid_plural "flesh walls" @@ -68093,6 +68841,18 @@ msgid "" " emerge." msgstr "一支像是超大隻的犀牛樣貌的恐龍, 有著許多頸盾緣骨突與三隻大角。" +#: lang/json/MONSTER_from_json.py +msgid "Triceratops bio-operator" +msgid_plural "Triceratops bio-operator" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Triceratops bio-operator'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive three-horned four-legged dinosaur dotted with crackling bionics. " +"The horns glow menacingly." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Stegosaurus" msgid_plural "Stegosaurus" @@ -68116,6 +68876,18 @@ msgid "" "massive spiked club of bone." msgstr "這種恐龍看起來像一隻巨大的史前犰狳。牠有根巨型的尾巴棒槌。" +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus" +msgid_plural "Apatosaurus" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Apatosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur with a long, whip-like tail. The" +" head is upright and the neck looks like it would make a good strong club." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Ceratosaurus" msgid_plural "Ceratosaurus" @@ -68314,6 +69086,95 @@ msgid "magenta and green hatchling" msgid_plural "magenta and green hatchlings" msgstr[0] "" +#: lang/json/MONSTER_from_json.py +msgid "fungal Spinosaurus zombie" +msgid_plural "fungal Spinosaurus zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'fungal Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once an enormous crocodile-headed carnivorous dinosaur with a sail on its " +"back, fungal tendrils now sprout from its mouth, eyes, and other orifices, " +"holding together an enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Z-Rex" +msgid_plural "fungal Z-Rexes" +msgstr[0] "" + +#. ~ Description for {'str': 'fungal Z-Rex', 'str_pl': 'fungal Z-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once monarch of the dinosaurs, fungal tendrils now sprout from its mouth, " +"eyes, and other orifices, holding together an enormous shambling mass of " +"mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "fungal Deinonychus zombie" +msgid_plural "fungal Deinonychus zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'fungal Deinonychus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Once a medium-sized feathered carnivorous dinosaur, fungal tendrils now " +"sprout from its mouth, eyes, and other orifices, holding together an " +"enormous shambling mass of mold-covered flesh." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gallimimus zombie" +msgid_plural "Gallimimus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Gallimimus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Pachy zombie" +msgid_plural "Pachy zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Pachy zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. It looks like a reptilian " +"ostrich with a round hard-looking domed head." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Campto zombie" +msgid_plural "Campto zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Campto zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with strong legs," +" broad shoulders and a pointed beak. Its tattered feathers are stained with" +" black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus zombie" +msgid_plural "Spinosaurus zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'Spinosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "Z-Rex" msgid_plural "Z-Rexes" @@ -68325,11 +69186,98 @@ msgid "Massive piles of ragged, stinking flesh lifting enormous teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Z-Deinonychus" -msgid_plural "Z-Deinonychus" +msgid "Albertosaurus zombie" +msgid_plural "Albertosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Albertosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws drooling black liquid lifted over grasping claws by a huge " +"shuffling dinosaur corpse." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceraterror" +msgid_plural "Triceraterror" msgstr[0] "" -#. ~ Description for {'str_sp': 'Z-Deinonychus'} +#. ~ Description for {'str_sp': 'Triceraterror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus zombie" +msgid_plural "Stegosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Stegosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse dragging with the weight of the " +"plates on its back, waving a much livelier looking spiked tail." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Ankylosaurus zombie" +msgid_plural "Ankylosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Ankylosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of what looks like a giant armadillo with peeling " +"armored plates and black, glistening eyes. Its tail ends in a massive " +"spiked club of bone." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Apatosaurus zombie" +msgid_plural "Apatosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Apatosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. The head is upright and the neck looks like it would still make a " +"good strong club." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie dragon" +msgid_plural "Zombie dragon" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Zombie dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns are worn and wet with filth and its " +"bright scales and bone spikes have taken a beating." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus zombie" +msgid_plural "Allosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Allosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur, with tiger-like " +"stripes on its broad, scaled back." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus zombie" +msgid_plural "Deinonychus zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'Deinonychus zombie'} #: lang/json/MONSTER_from_json.py msgid "" "The shuffling corpse of a medium-sized bipedal dinosaur covered with " @@ -68337,6 +69285,374 @@ msgid "" "sickle-like claw." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "Utahraptor zombie" +msgid_plural "Utahraptor zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'Utahraptor zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaurolophus zombie" +msgid_plural "Parasaurolophus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Parasaurolophus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dimorphodon zombie" +msgid_plural "Dimorphodon zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Dimorphodon zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The raggedly flying corpse of a feathered reptile over three feet long, " +"with short wings and a big colorful beak." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dilophosaurus zombie" +msgid_plural "Dilophosaurus zombie" +msgstr[0] "" + +#. ~ Description for {'str_sp': 'Dilophosaurus zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Gruesome Gallimimus" +msgid_plural "Gruesome Gallimimuss" +msgstr[0] "" + +#. ~ Description for {'str': 'Gruesome Gallimimus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its entire body bulges with " +"distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skull Breaker" +msgid_plural "Skull Breakers" +msgstr[0] "" + +#. ~ Description for {'str': 'Skull Breaker'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Its round, hard-looking domed " +"head sits on a body bulging with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crusher Camp" +msgid_plural "Crusher Camps" +msgstr[0] "" + +#. ~ Description for {'str': 'Crusher Camp'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a large feathered bipedal dinosaur with grossly " +"bulging legs, massive hulking shoulders and a vicious pointed beak. Its " +"tattered feathers are stained with black, sticky liquid." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spino Sledge" +msgid_plural "Spino Sledges" +msgstr[0] "" + +#. ~ Description for {'str': 'Spino Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Enormous putrid dinosaur corpse with a ferocious crocodile-like head, oozing" +" black eyes, and a tattered sail on its back. Its body is even bigger than " +"normal, bulging with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Rage Rex" +msgid_plural "Rage Rexs" +msgstr[0] "" + +#. ~ Description for {'str': 'Rage Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive piles of ragged, stinking flesh lifting enormous teeth. Its entire " +"body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Alberta Anvil" +msgid_plural "Alberta Anvils" +msgstr[0] "" + +#. ~ Description for {'str': 'Alberta Anvil'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive jaws and grabbing claws lifting by a body bulging with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Triceratruck" +msgid_plural "Triceratrucks" +msgstr[0] "" + +#. ~ Description for {'str': 'Triceratruck'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A massive shambling rhino-like dinosaur corpse with a bony crest from which " +"three wicked looking horns emerge. Its black eyes ooze like tears. Its " +"entire body bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Stegosaurus Sledge" +msgid_plural "Stegosaurus Sledges" +msgstr[0] "" + +#. ~ Description for {'str': 'Stegosaurus Sledge'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A large shambling quadruped dinosaur corpse with plates on its back, waving " +"a spiked tail. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Dino Tank" +msgid_plural "Dino Tanks" +msgstr[0] "" + +#. ~ Description for {'str': 'Dino Tank'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Heavily armored zombie dinosaur. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Zombie Dreadnought" +msgid_plural "Zombie Dreadnoughts" +msgstr[0] "" + +#. ~ Description for {'str': 'Zombie Dreadnought'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Massive, long-necked, four-legged dinosaur corpse with a long, whip-like " +"tail. Its entire body bulges with distended muscles and swollen, festering " +"wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Draco Titan" +msgid_plural "Draco Titans" +msgstr[0] "" + +#. ~ Description for {'str': 'Draco Titan'} +#: lang/json/MONSTER_from_json.py +msgid "" +"This zombie is enormous, scaly, studded with bony spikes, and it moves with " +"horrible speed. Its colorful horns and bone spikes sit on a body bulging " +"with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Allosaurus Avalanche" +msgid_plural "Allosaurus Avalanches" +msgstr[0] "" + +#. ~ Description for {'str': 'Allosaurus Avalanche'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shambling corpse of a large predatory bipedal dinosaur. Its entire body" +" bulges with distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deino Destroyer" +msgid_plural "Deino Destroyers" +msgstr[0] "" + +#. ~ Description for {'str': 'Deino Destroyer'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium-sized bipedal dinosaur covered with " +"tattered feathers and black putrid liquid. Both feet brandish a large " +"sickle-like claw. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Hoodoo" +msgid_plural "Utah Hoodoos" +msgstr[0] "" + +#. ~ Description for {'str': 'Utah Hoodoo'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The swaying, hopping corpse of a large bipedal dinosaur with feathered arms," +" a long tail, and long sharp scythe-like claws. Its entire body bulges with" +" distended muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Parasaur Punch" +msgid_plural "Parasaur Punchs" +msgstr[0] "" + +#. ~ Description for {'str': 'Parasaur Punch'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A huge mottled dinosaur with a blunt head crest, dead and walking, eyes " +"vacant and swollen. Its entire body bulges with distended muscles and " +"swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Winged Horror" +msgid_plural "Winged Horrors" +msgstr[0] "" + +#. ~ Description for {'str': 'Winged Horror'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The flying corpse of a feathered reptile over three feet long, with short " +"wings and a big colorful beak. Its entire body bulges with distended " +"muscles and swollen, festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Crested Crusher" +msgid_plural "Crested Crushers" +msgstr[0] "" + +#. ~ Description for {'str': 'Crested Crusher'} +#: lang/json/MONSTER_from_json.py +msgid "" +"The shuffling corpse of a medium dinosaur with sharp teeth and two prominent" +" bony crests on its head with ragged strips of ripped flesh hanging down " +"like a frill. Its entire body bulges with distended muscles and swollen, " +"festering wounds." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Spinosaurus shady zombie" +msgid_plural "Spinosaurus shady zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'Spinosaurus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with a tattered sail. The head is long and narrow " +"with a V-shaped snout." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Shady Z-Rex" +msgid_plural "Shady Z-Rexs" +msgstr[0] "" + +#. ~ Description for {'str': 'Shady Z-Rex'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" huge bipedal dinosaur with feathery edges. The head looks big, lots of big" +" teeth would fit in it." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Deinonychus shady zombie" +msgid_plural "Deinonychus shady zombies" +msgstr[0] "" + +#. ~ Description for {'str': 'Deinonychus shady zombie'} +#: lang/json/MONSTER_from_json.py +msgid "" +"An uncanny shadow envelops this dinosaur. You can make out the outline of a" +" medium-sized bipedal dinosaur with feathery edges. Both feet brandish a " +"large sickle-like claw." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "S-Rex" +msgid_plural "S-Rexes" +msgstr[0] "" + +#. ~ Description for {'str': 'S-Rex', 'str_pl': 'S-Rexes'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting enormous sharp pointed teeth " +"dripping with black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal Albertosaurus" +msgid_plural "Skeletal Albertosauruss" +msgstr[0] "" + +#. ~ Description for {'str': 'Skeletal Albertosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Skeletal claws reach ahead." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Bone Dragon" +msgid_plural "Bone Dragons" +msgstr[0] "" + +#. ~ Description for {'str': 'Bone Dragon'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. Spikes and colorful horns jut out to complete the effect." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Skeletal allosaurus" +msgid_plural "Skeletal allosauruss" +msgstr[0] "" + +#. ~ Description for {'str': 'Skeletal allosaurus'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Utah Bones" +msgid_plural "Utah Boness" +msgstr[0] "" + +#. ~ Description for {'str': 'Utah Bones'} +#: lang/json/MONSTER_from_json.py +msgid "" +"Monstrous columns of dense bone lifting sharp pointed teeth dripping with " +"black goo. There is a long tail and long sharp scythe-like claws" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "improvised SMG turret" msgid_plural "improvised SMG turrets" @@ -68779,6 +70095,18 @@ msgid "" "off creatures that disturb it." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "frog" +msgid_plural "frogs" +msgstr[0] "" + +#. ~ Description for {'str': 'frog'} +#: lang/json/MONSTER_from_json.py +msgid "" +"A conspicuously average american bullfrog. You better keep prince charming " +"away from it." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "lemure" msgid_plural "lemures" @@ -69030,18 +70358,6 @@ msgid "" "traditional forces." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "toilet paper mummy" -msgid_plural "toilet paper mummies" -msgstr[0] "" - -#. ~ Description for {'str': 'toilet paper mummy', 'str_pl': 'toilet paper -#. mummies'} -#: lang/json/MONSTER_from_json.py -msgid "" -"Vaguely humanoid in shape, layered in something resembling toilet paper." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "giant scorpion" msgid_plural "giant scorpions" @@ -69392,18 +70708,6 @@ msgid "" "chitin fitted to a thin mesh. You could put this on a friendly horse." msgstr "" -#: lang/json/PET_ARMOR_from_json.py -msgid "meower armor" -msgid_plural "meower armors" -msgstr[0] "" - -#. ~ Description for {'str': 'meower armor'} -#: lang/json/PET_ARMOR_from_json.py -msgid "" -"Sleek and lightweight kevlar cat harness with a protective hood and " -"chestplate. Includes a very small, inconvenient velcro pocket on the back." -msgstr "" - #: lang/json/SPECIES_from_json.py msgid "a mammal" msgstr "" @@ -69416,6 +70720,14 @@ msgstr "" msgid "a bird" msgstr "" +#: lang/json/SPECIES_from_json.py +msgid "an alien cyborg" +msgstr "" + +#: lang/json/SPECIES_from_json.py +msgid "heavy thuds." +msgstr "" + #: lang/json/SPECIES_from_json.py msgid "a reptile" msgstr "" @@ -70148,6 +71460,22 @@ msgstr "" msgid "This fake spell occurs on cranial bomb activation. Likely fatal." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Skullgun Snapback" +msgstr "" + +#. ~ Description for Skullgun Snapback +#: lang/json/SPELL_from_json.py +msgid "" +"This fake spell occurs on skullgun activation. May be fatal if done in " +"critical condition." +msgstr "" + +#. ~ Message for SPELL 'Skullgun Snapback' +#: lang/json/SPELL_from_json.py +msgid "Your head snaps back from the force of the shot." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "psi stun" msgstr "" @@ -70270,6 +71598,17 @@ msgid "" "rune as a catalyst for recipes." msgstr "這個儀式創造了一個與泛靈論者契合的小石子。你能將此符文用於製作時的催化劑。" +#: lang/json/SPELL_from_json.py +msgid "Soulrend" +msgstr "" + +#. ~ Description for Soulrend +#: lang/json/SPELL_from_json.py +msgid "" +"Violently tears the spirit from the body, and bounds the resulting shade to " +"your will." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Ignus Fatuus" msgstr "" @@ -70345,12 +71684,12 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Crystallize Mana" -msgstr "" +msgstr "法力結晶化" #. ~ Description for Crystallize Mana #: lang/json/SPELL_from_json.py msgid "Crystallizes mana into solid form" -msgstr "" +msgstr "將法力凝結成固體" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Mana Fatigue" @@ -70492,6 +71831,15 @@ msgstr "" msgid "Uses a little fatigue" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug polymorph" +msgstr "" + +#. ~ Description for Debug polymorph +#: lang/json/SPELL_from_json.py +msgid "Well you wanted to lose weight, right?" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -70550,8 +71898,8 @@ msgstr "" msgid "Debug Full Protection" msgstr "除錯完全防護" -#. ~ Description of effect 'Debug Full Protection'. #. ~ Description for Debug Full Protection +#. ~ Description of effect 'Debug Full Protection'. #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "You can not be harmed by anything." msgstr "你不會受到任何傷害。" @@ -70920,6 +72268,10 @@ msgstr "魔力之箭" msgid "Haste" msgstr "迅捷術" +#: lang/json/SPELL_from_json.py +msgid "Baleful Polymorph" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Mana Beam" msgstr "魔力射線" @@ -71041,10 +72393,10 @@ msgstr "召喚四隻永久性的惡魔蜘蛛。" msgid "Jolt" msgstr "猛擊術" -#. ~ Mutation class: Manatouched iv_sound_message #. ~ description for the sound of spell 'Jolt' #. ~ description for the sound of spell 'Lightning Bolt' #. ~ description for the sound of spell 'Lightning Blast' +#. ~ Mutation class: Manatouched iv_sound_message #: lang/json/SPELL_from_json.py lang/json/mutation_category_from_json.py msgid "a crackle" msgstr "劈啪聲" @@ -71113,6 +72465,31 @@ msgstr "" msgid "Wall of Fog" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc Aura" +msgstr "" + +#. ~ Description for Repelling Arc Aura +#: lang/json/SPELL_from_json.py +msgid "This is a sub-spell of the Repelling Arc spell." +msgstr "" + +#. ~ description for the sound of spell 'Repelling Arc Aura' +#: lang/json/SPELL_from_json.py +msgid "arcing electricity!" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Repelling Arc" +msgstr "" + +#. ~ Description for Repelling Arc +#: lang/json/SPELL_from_json.py +msgid "" +"Manifests an aura of crackling electricity around you to strike attackers " +"with baleful lightning." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Bless" msgstr "祝福術" @@ -71225,65 +72602,37 @@ msgstr "" msgid "X-ray Vision" msgstr "" -#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py -msgid "Mana Siphon" -msgstr "" - -#. ~ Description for Mana Siphon -#: lang/json/SPELL_from_json.py -msgid "" -"This is the spell portion of the mana siphon series of mutations. If you " -"have this spell you probably debugged it in." -msgstr "" - #: lang/json/SPELL_from_json.py -msgid "Pew, Pew" +msgid "Knock" msgstr "" -#. ~ Description for Pew, Pew -#: lang/json/SPELL_from_json.py -msgid "You aim your finger at your opponent and make 'Pew, pew' sounds." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "The Floor is Lava" -msgstr "" - -#. ~ Description for The Floor is Lava +#. ~ Description for Knock #: lang/json/SPELL_from_json.py msgid "" -"Better find a chair or countertop to climb onto, because the floor is made " -"of lava!" +"You channel magic into a force capable of opening doors. This variant can " +"only open wooden doors." msgstr "" #: lang/json/SPELL_from_json.py -msgid "Sports Training Montage" +msgid "Improved Knock" msgstr "" -#. ~ Description for Sports Training Montage +#. ~ Description for Improved Knock #: lang/json/SPELL_from_json.py msgid "" -"When something takes a really long time, and you want to just skip to the " -"end, you're gonna need a montage." -msgstr "" - -#: lang/json/SPELL_from_json.py -msgid "Kiss the Owie" -msgstr "" - -#. ~ Description for Kiss the Owie -#: lang/json/SPELL_from_json.py -msgid "A tender kiss to make the pain go away, just like mother used to give." +"You channel magic into a force capable of opening doors. This variant can " +"open any locked door." msgstr "" -#: lang/json/SPELL_from_json.py -msgid "Summon Mummy" +#: lang/json/SPELL_from_json.py lang/json/mutation_from_json.py +msgid "Mana Siphon" msgstr "" -#. ~ Description for Summon Mummy +#. ~ Description for Mana Siphon #: lang/json/SPELL_from_json.py msgid "" -"Call forth a flimsy creature of tissue from the broom closet of your soul." +"This is the spell portion of the mana siphon series of mutations. If you " +"have this spell you probably debugged it in." msgstr "" #: lang/json/TOOLMOD_from_json.py @@ -73562,26 +74911,31 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Lesser Girdle of Pockets" -msgid_plural "Lesser Girdles of Pockets" +msgid "lesser dimensional toolbelt" +msgid_plural "lesser dimensional toolbelts" msgstr[0] "" -#. ~ Description for {'str': 'Lesser Girdle of Pockets', 'str_pl': 'Lesser -#. Girdles of Pockets'} -#. ~ Description for {'str': 'Greater Girdle of Pockets', 'str_pl': 'Greater -#. Girdles of Pockets'} +#. ~ Description for {'str': 'lesser dimensional toolbelt'} #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A wide girdle that fits around your waist, coverd in numerous small pouches " -"that hold a lot more than they should, and the weight of their contents is " -"greatly reduced." +"A sturdy workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold more than they " +"should with a fair weight reduction." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "Greater Girdle of Pockets" -msgid_plural "Greater Girdles of Pockets" +msgid "greater dimensional toolbelt" +msgid_plural "greater dimensional toolbelts" msgstr[0] "" +#. ~ Description for {'str': 'greater dimensional toolbelt'} +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A heavy duty workman's belt that fits around your waist, covered in easy to " +"access pouches. Like all dimensional spaces, they hold far more than they " +"should with a substantial weight reduction." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "Belt of Weaponry" msgid_plural "Belts of Weaponry" @@ -74593,6 +75947,18 @@ msgid "bionic firestarter" msgid_plural "bionic firestarters" msgstr[0] "生化點火器" +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +msgid "smoking rack" +msgid_plural "smoking racks" +msgstr[0] "" + +#. ~ Description for {'str': 'smoking rack'} +#. ~ Description for {'str': 'pseudo butter churn'} +#. ~ Description for {'str': 'pseudo atomic butter churn'} +#: lang/json/TOOL_from_json.py +msgid "This is a crafting_pseudo_item if you have it something is wrong." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -74657,7 +76023,7 @@ msgstr[0] "傑克南瓜燈" #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. #. ~ Use action menu_text for {'str': 'candle'}. #. ~ Use action menu_text for {'str': 'Louisville Slaughterer'}. -#: lang/json/TOOL_from_json.py src/veh_interact.cpp +#: lang/json/TOOL_from_json.py src/activity_actor.cpp src/veh_interact.cpp msgid "Light" msgstr "燈光" @@ -76224,7 +77590,7 @@ msgstr[0] "削皮刀" msgid "" "This is a short-bladed knife with a sharp blade, made for fine controlled " "cuts to vegetables without using a cutting board." -msgstr "" +msgstr "這是一把刀刃短但是鋒利的刀,用來精準控制的切蔬菜而不需要砧板。" #: lang/json/TOOL_from_json.py msgid "chef knife" @@ -76277,7 +77643,7 @@ msgid "" "This is a menacing looking knife with a broad, square shaped blade, curved " "for fast vegetable chopping. Its heft and sharpness would make it a decent " "weapon as well, although not as good as a meat cleaver." -msgstr "" +msgstr "這把有著寬大方形刀身的刀子看起來很有威脅感,有著彎曲的刀刃來快速切菜。它的重量和鋒利度使它也能作為一把不錯的武器,雖然不及切肉刀。" #: lang/json/TOOL_from_json.py msgid "meat cleaver" @@ -77148,12 +78514,6 @@ msgid "pseudo butter churn" msgid_plural "pseudo butter churns" msgstr[0] "" -#. ~ Description for {'str': 'pseudo butter churn'} -#. ~ Description for {'str': 'pseudo atomic butter churn'} -#: lang/json/TOOL_from_json.py -msgid "This is a crafting_pseudo_item if you have it something is wrong." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "electric carver (off)" msgid_plural "electric carvers (off)" @@ -77947,13 +79307,11 @@ msgstr[0] "智慧型手機" #. ~ Use action msg for {'str': 'smartphone'}. #. ~ Use action msg for {'str': 'atomic smartphone'}. #. ~ Use action msg for {'str': "Wraitheon executive's smartphone"}. -#. ~ Use action msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "You activate the flashlight app." msgstr "你啟動了手電筒 app。" #. ~ Use action need_charges_msg for {'str': 'smartphone'}. -#. ~ Use action need_charges_msg for {'str': 'test smartphone'}. #: lang/json/TOOL_from_json.py msgid "The smartphone's charge is too low." msgstr "這支智慧型手機的電力不足。" @@ -79267,7 +80625,6 @@ msgid_plural "fire axes" msgstr[0] "消防斧" #. ~ Description for {'str': 'fire axe'} -#. ~ Description for TEST fire axe #: lang/json/TOOL_from_json.py msgid "" "This is a large, two-handed pickhead axe normally used by firefighters. It " @@ -79280,7 +80637,6 @@ msgid_plural "Halligan bars" msgstr[0] "哈利根鐵鋌" #. ~ Description for {'str': 'Halligan bar'} -#. ~ Description for TEST Halligan bar #: lang/json/TOOL_from_json.py msgid "" "This is a heavy multiple-use tool commonly carried by firefighters, law " @@ -79307,13 +80663,36 @@ msgid "throwable fire extinguisher" msgid_plural "throwable fire extinguishers" msgstr[0] "投擲式滅火器" +#. ~ Use action menu_text for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "Pull plug" +msgstr "" + +#. ~ Use action msg for {'str': 'throwable fire extinguisher'}. +#: lang/json/TOOL_from_json.py +msgid "You pull the plug on the extinguisher grenade." +msgstr "" + #. ~ Description for {'str': 'throwable fire extinguisher'} #: lang/json/TOOL_from_json.py msgid "" "This is a fire extinguisher in grenade form. While not as effective as a " -"regular fire extinguisher, you can use it from a distance. It is activated " -"by heat, so just throw it into the flames." -msgstr "這是一個有著手榴彈外形的滅火器, 效果雖不如常規滅火器, 但你可以從遠處使用它。它受熱後會自動啟動, 所以只要把它扔到火裡就行了。" +"regular fire extinguisher, you can use it from a distance. It has a plastic" +" plug that can be pulled, but is primarely activated by heat, so just throw " +"it into the flames." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "active throwable fire extinguisher" +msgid_plural "active throwable fire extinguishers" +msgstr[0] "" + +#. ~ Description for {'str': 'active throwable fire extinguisher'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is an active extinguisher grenade, likely to burst any second now. " +"Better throw it!" +msgstr "" #: lang/json/TOOL_from_json.py msgid "New York hook" @@ -79503,6 +80882,28 @@ msgid "" "shovel but really can't compare to a real shovel." msgstr "一根木棍連結一石片, 功能類似鏟子, 但與真正的鏟子差太多。" +#: lang/json/TOOL_from_json.py +msgid "metal rake" +msgid_plural "metal rakes" +msgstr[0] "" + +#. ~ Description for {'str': 'metal rake'} +#: lang/json/TOOL_from_json.py +msgid "A sturdy metal rake, a must-have during autumn." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic rake" +msgid_plural "plastic rakes" +msgstr[0] "" + +#. ~ Description for {'str': 'plastic rake'} +#: lang/json/TOOL_from_json.py +msgid "" +"A cheap plastic rake. Will break quite fast if used for anything other than" +" raking leaves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "scythe" msgid_plural "scythes" @@ -79526,6 +80927,26 @@ msgstr[0] "鏟子" msgid "This is a digging tool. Use it to dig pits adjacent to your location." msgstr "一件挖掘工具。使用這個工具能夠在你相鄰的格子挖坑。" +#: lang/json/TOOL_from_json.py +msgid "snow shovel" +msgid_plural "snow shovels" +msgstr[0] "" + +#. ~ Description for {'str': 'snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "This is a sturdy tool used for shoving snow." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "plastic snow shovel" +msgid_plural "plastic snow shovels" +msgstr[0] "" + +#. ~ Description for {'str': 'plastic snow shovel'} +#: lang/json/TOOL_from_json.py +msgid "A cheap plastic shovel used for shoving snow." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "sickle" msgid_plural "sickles" @@ -80227,6 +81648,11 @@ msgid "" "the right tools, you could use this for metalworking." msgstr "一個燒木炭能鑄鐵的攜帶式鍛造爐。只要跟正確的工具一起使用, 你就能用這個東西來進行鑄造。" +#: lang/json/TOOL_from_json.py +msgid "Rock Forge" +msgid_plural "Rock Forges" +msgstr[0] "" + #: lang/json/TOOL_from_json.py msgid "metalworking chisel" msgid_plural "metalworking chisels" @@ -80353,6 +81779,17 @@ msgid "" "metalworking fabrication recipes." msgstr "是一把長鐵鉗。它通常用於烹飪或在金屬加工配方。" +#: lang/json/TOOL_from_json.py +msgid "sandpaper" +msgid_plural "sheets of sandpaper" +msgstr[0] "" + +#. ~ Description for {'str': 'sandpaper', 'str_pl': 'sheets of sandpaper'} +#: lang/json/TOOL_from_json.py +msgid "" +"A sheet of rough paper. It is commonly used in metalworking and carpentry." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "compressed air horn" msgid_plural "compressed air horns" @@ -80502,6 +81939,18 @@ msgid "" "and place on the ground." msgstr "一張用毛皮製成能卷起攜帶的睡墊。可以讓你跟地板有所阻隔, 更容易入睡。使用它來鋪在地上。" +#: lang/json/TOOL_from_json.py +msgid "garden hose" +msgid_plural "garden hoses" +msgstr[0] "" + +#. ~ Description for {'str': 'garden hose'} +#: lang/json/TOOL_from_json.py +msgid "" +"This is a flexible garden hose. If you cut it in smaller pieces, it could " +"be used for crafting, or siphoning fuel from a vehicle." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "grip hook" msgid_plural "grip hooks" @@ -82224,7 +83673,6 @@ msgid_plural "rags" msgstr[0] "布條" #. ~ Description for {'str': 'rag'} -#. ~ Description for TEST rag #: lang/json/TOOL_from_json.py msgid "" "This is a largish piece of cloth, useful in crafting and possibly for " @@ -82576,7 +84024,7 @@ msgid "" "A lightweight handheld cordless circular saw. Spins a circular blade fast " "enough to cut wood, zombies, or in an emergency, pizza. The blade, while " "effective in combat, is hard to hit with due to its small size." -msgstr "" +msgstr "一把輕量化的手持式無繩圓鋸。快速轉動的圓形刀片足夠拿來切割木材與殭屍,緊急情況下也能切披薩。但也因刀片太小,很難有效的進行攻擊。" #: lang/json/TOOL_from_json.py msgid "circular saw (on)" @@ -82631,11 +84079,11 @@ msgid "" msgstr "這把開著的電鋸正產生大量的噪音。使用它來關閉。" #: lang/json/TOOL_from_json.py -msgid "stone hand axe" -msgid_plural "stone hand axes" -msgstr[0] "石製手斧" +msgid "stone axe head" +msgid_plural "stone axe heads" +msgstr[0] "" -#. ~ Description for {'str': 'stone hand axe'} +#. ~ Description for {'str': 'stone axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a broad piece of stone with an edge narrow enough to roughly chop " @@ -82643,11 +84091,11 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "metal hand axe" -msgid_plural "metal hand axes" -msgstr[0] "金屬手斧" +msgid "metal axe head" +msgid_plural "metal axe heads" +msgstr[0] "" -#. ~ Description for {'str': 'metal hand axe'} +#. ~ Description for {'str': 'metal axe head'} #: lang/json/TOOL_from_json.py msgid "" "This is a chunk of steel with one edge hammered down to something resembling" @@ -82761,6 +84209,11 @@ msgid "" "but you could use it to fire anything made of clay." msgstr "這是一種便攜式木炭爐。你可以用它來自製磚塊, 或是燒製黏土。" +#: lang/json/TOOL_from_json.py +msgid "Kiln" +msgid_plural "Kilns" +msgstr[0] "" + #: lang/json/TOOL_from_json.py msgid "paint chipper" msgid_plural "paint chippers" @@ -82908,7 +84361,6 @@ msgid_plural "scissor jacks" msgstr[0] "剪式千斤頂" #. ~ Description for {'str': 'scissor jack'} -#. ~ Description for TEST scissor jack #: lang/json/TOOL_from_json.py msgid "A compact scissor jack used for lifting vehicles." msgstr "一個牢固的剪式千斤頂, 用於抬起車輛。" @@ -83122,7 +84574,6 @@ msgid_plural "screwdrivers" msgstr[0] "螺絲起子" #. ~ Description for {'str': 'screwdriver'} -#. ~ Description for TEST screwdriver #: lang/json/TOOL_from_json.py msgid "" "This is a Philips-head screwdriver. It is important for almost all " @@ -83160,7 +84611,6 @@ msgid_plural "soldering irons" msgstr[0] "電焊棒" #. ~ Description for {'str': 'soldering iron'} -#. ~ Description for TEST soldering iron #: lang/json/TOOL_from_json.py msgid "" "This is a device with a metal tip that can get very hot. It is necessary " @@ -83540,13 +84990,13 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "precision solderers" -msgid_plural "precision solderers" +msgid "pseudo atomic butter churn" +msgid_plural "pseudo atomic butter churns" msgstr[0] "" #: lang/json/TOOL_from_json.py -msgid "pseudo atomic butter churn" -msgid_plural "pseudo atomic butter churns" +msgid "precision solderers" +msgid_plural "precision solderers" msgstr[0] "" #: lang/json/TOOL_from_json.py @@ -83732,6 +85182,20 @@ msgid "" "specialized tools." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "complete bionic toolkit" +msgid_plural "complete bionic toolkits" +msgstr[0] "" + +#. ~ Description for {'str': 'complete bionic toolkit'} +#: lang/json/TOOL_from_json.py +msgid "" +"A set of very small robotic tools and encrypted digital keys originally " +"designed to disassemble and test the quality of industrially produced " +"bionics. A highly skilled and patient engineer could use them to manually " +"assemble new cybernetics." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "energy saber" msgid_plural "energy sabers" @@ -84531,6 +85995,60 @@ msgid "greater wand of cone of cold" msgid_plural "greater wands of cone of cold" msgstr[0] "冷錐術高級魔杖" +#: lang/json/TOOL_from_json.py +msgid "minor wand of knock" +msgid_plural "minor wands of knock" +msgstr[0] "" + +#. ~ Description for {'str': 'minor wand of knock', 'str_pl': 'minor wands of +#. knock'} +#. ~ Description for {'str': 'lesser wand of knock', 'str_pl': 'lesser wands +#. of knock'} +#. ~ Description for {'str': 'greater wand of knock', 'str_pl': 'greater wands +#. of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of knock" +msgid_plural "lesser wands of knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of knock" +msgid_plural "greater wands of knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "minor wand of improved knock" +msgid_plural "minor wands of improved knock" +msgstr[0] "" + +#. ~ Description for {'str': 'minor wand of improved knock', 'str_pl': 'minor +#. wands of improved knock'} +#. ~ Description for {'str': 'lesser wand of improved knock', 'str_pl': +#. 'lesser wands of improved knock'} +#. ~ Description for {'str': 'greater wand of improved knock', 'str_pl': +#. 'greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with a mana crystal socket at the base that casts a " +"spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "lesser wand of improved knock" +msgid_plural "lesser wands of improved knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "greater wand of improved knock" +msgid_plural "greater wands of improved knock" +msgstr[0] "" + #: lang/json/TOOL_from_json.py msgid "disposable minor wand of magic missile" msgid_plural "disposable minor wands of magic missile" @@ -84693,6 +86211,60 @@ msgid "disposable greater wand of cone of cold" msgid_plural "disposable greater wands of cone of cold" msgstr[0] "一次性的冷錐術高級魔杖" +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of knock" +msgid_plural "disposable minor wands of knock" +msgstr[0] "" + +#. ~ Description for {'str': 'disposable minor wand of knock', 'str_pl': +#. 'disposable minor wands of knock'} +#. ~ Description for {'str': 'disposable lesser wand of knock', 'str_pl': +#. 'disposable lesser wands of knock'} +#. ~ Description for {'str': 'disposable greater wand of knock', 'str_pl': +#. 'disposable greater wands of knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of knock" +msgid_plural "disposable lesser wands of knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of knock" +msgid_plural "disposable greater wands of knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable minor wand of improved knock" +msgid_plural "disposable minor wands of improved knock" +msgstr[0] "" + +#. ~ Description for {'str': 'disposable minor wand of improved knock', +#. 'str_pl': 'disposable minor wands of improved knock'} +#. ~ Description for {'str': 'disposable lesser wand of improved knock', +#. 'str_pl': 'disposable lesser wands of improved knock'} +#. ~ Description for {'str': 'disposable greater wand of improved knock', +#. 'str_pl': 'disposable greater wands of improved knock'} +#: lang/json/TOOL_from_json.py +msgid "" +"A slender wooden wand with an embedded mana crystal at the base that casts a" +" spell when activated. This wand casts improved knock." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "disposable lesser wand of improved knock" +msgid_plural "disposable lesser wands of improved knock" +msgstr[0] "" + +#: lang/json/TOOL_from_json.py +msgid "disposable greater wand of improved knock" +msgid_plural "disposable greater wands of improved knock" +msgstr[0] "" + #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" @@ -84820,66 +86392,6 @@ msgid "" "magical metals into their workable ingot form." msgstr "" -#: lang/json/TOOL_from_json.py -msgid "TEST rag" -msgid_plural "TEST rags" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST Halligan bar" -msgid_plural "TEST Halligan bars" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST fire axe" -msgid_plural "TEST fire axes" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST screwdriver" -msgid_plural "TEST screwdrivers" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST sonic screwdriver" -msgid_plural "TEST sonic screwdrivers" -msgstr[0] "" - -#. ~ Description for TEST sonic screwdriver -#: lang/json/TOOL_from_json.py -msgid "This is a sonic screwdriver. Like a normal screwdriver, but sonic." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "TEST soldering iron" -msgid_plural "TEST soldering irons" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "TEST scissor jack" -msgid_plural "TEST scissor jacks" -msgstr[0] "" - -#: lang/json/TOOL_from_json.py -msgid "test smartphone" -msgid_plural "test smartphones" -msgstr[0] "" - -#. ~ Description for {'str': 'test smartphone'} -#: lang/json/TOOL_from_json.py -msgid "UPS-powered smartphone with a flashlight, camera, and MP3 player." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "test matchbook" -msgid_plural "test matchbooks" -msgstr[0] "" - -#. ~ Description for {'str': 'test matchbook'} -#: lang/json/TOOL_from_json.py -msgid "Test matches - when you must burn things, for science!" -msgstr "" - #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" msgid_plural "yokes and harnesses" @@ -85205,7 +86717,7 @@ msgid "Pheidippides was a hack" msgstr "" #: lang/json/achievement_from_json.py -msgid "Run a marathon…plus a little bit more." +msgid "Run a marathon… plus a little bit more." msgstr "" #: lang/json/achievement_from_json.py @@ -85236,14 +86748,628 @@ msgstr "" msgid "Freeman's favorite" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wield a crowbar" +msgstr "" + #: lang/json/achievement_from_json.py msgid "Impenetrable" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Wear a tank suit" +msgstr "" + #: lang/json/achievement_from_json.py msgid "What are they hiding?" msgstr "" +#: lang/json/achievement_from_json.py +msgid "Enter a lab finale room" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Last Homely House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Reach a refugee center" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to your roots" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Return to the location you started the game" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Timber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"If a tree falls in a forest and no one is around to hear it, does it make a " +"sound?" +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_from_json.py +msgid "Lumberjack" +msgstr "伐木工" + +#: lang/json/achievement_from_json.py +msgid "What is a forest for a man with an axe?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deforestation" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If you cut down the trees you will find the wolf." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Digger" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "That's exactly what we need: more dead bodies." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Grave Robber" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hey, what if they turned down there? You've gotta check." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's a privilege to be buried when billions will not be." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Undertaker" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Leave no one to rot among the living dead." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Funeral House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You cannot bury the whole world, can you?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cyberpunk" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spiritus quidem promptus; caro vero infirma." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Clockwork Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"By most mechanical and dirty hand. I shall have such revenges on you… both." +" The things I will do, what they are, yet I know not. But they will be the" +" terrors of the earth." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Homo Evolutis" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "World of man has ended. Long live the world of transhumanism." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Broken But Not Defeated" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Does your medical insurance cover that?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Free Trader" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Extraordinary gizmos for obscenely low prices!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cut-Me-Own-Throat Dibbler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"My Innuit friend, I'm selling you this ice for such a low price, that it's " +"cutting me own throat." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eloquent" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We're frends, aren't we?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Silver Tongue" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Legend has it that you convinced a zombie hulk to go away." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "HackerMan" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This OS has a back door. There is always a back door." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Still not quite like Kevin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's not cheating. It's debugging." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/mutation_from_json.py +msgid "MD" +msgstr "實習醫生" + +#: lang/json/achievement_from_json.py +msgid "Is there a doctor in the house?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dr House" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's lupus." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Engineer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Just give me my wrench." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "MacGyver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "This whole deal is holding on faith, spit and duct tape." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Trapper" +msgstr "捕獸者" + +#: lang/json/achievement_from_json.py +msgid "A good trap doesn't discriminate between beavers and zombeavers." +msgstr "" + +#: lang/json/achievement_from_json.py src/iuse.cpp +#: src/iuse_software_minesweeper.cpp +msgid "Minesweeper" +msgstr "踩地雷" + +#: lang/json/achievement_from_json.py +msgid "All it takes is one mistake." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ace Driver" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "No turn is too sharp." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "The Stig" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Formula One is for Sunday drivers." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Swimmer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Like a fish to water." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Michael Phelps" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Faster then Jaws." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Do-It-Yourselfer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Take this thing, put it in that thing, and voila." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack of All Trades" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "With a right ammount of glue, there is nothing I can't do." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Master Chef" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Glazed tenderloin is a cakewalk." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Hell's Kitchen" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Today's menu: Soupe a l'oignon, Boeuf Bourguignon and Creme brulee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Tailor" +msgstr "裁縫師" + +#: lang/json/achievement_from_json.py +msgid "A needle, a thread and a dream." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Fashion Designer" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Male, feamale and mutant fashion alike." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Survivalist" +msgstr "生存專家" + +#: lang/json/achievement_from_json.py +msgid "Survival is my game." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bear Grylls" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "So you say you can survive on your own urine?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Ohm's Law" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Thunder Ohm. Two volts enter, one volt leaves. Resistance is futile." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Nicola Tesla" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One does not simply taste a 9V battery." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bull's Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Better then Legolas." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Robin Hood" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Wilhelm Tell? Never heard of." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Eagle Eye" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Only me and my target." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Deadshot" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Don't run. You'll die tired." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Gunner" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber makes the difference." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rocket Man" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I'm sending you to the moon. In pieces." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Small But Deadly" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Caliber doesn't count when you're on the recieving side of the barrel." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Dirty Harry" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"But being this is a .44 Magnum, the most powerful handgun in the world and " +"would blow your head clean off, you've gotta ask yourself one question: Do " +"I feel lucky? Well, do ya, punk?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Rifleman" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"This is my rifle. There are many like it, but this one is mine. My rifle " +"is my best friend. It is my life. I must master it as I must master my " +"life." +msgstr "" + +#: lang/json/achievement_from_json.py lang/json/npc_class_from_json.py +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Soldier" +msgstr "軍人" + +#: lang/json/achievement_from_json.py +msgid "" +"Without me, my rifle is useless. Without my rifle, I am useless. I will " +"keep my rifle clean and ready, even as I am clean and ready. We will become" +" part of each other." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Double Barrel, Double Fun" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "When you want to hit your target nine times with one shot." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elmer Fudd" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "What's up doc? Hunting wabbits?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Spray'n'Pray" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "One will hit. It's a matter of statistics." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "SMG Goes BRRRT!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "We definitely need more ammo." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Yeet!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "And never come back." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Kobe Bryant" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Frag out!" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Brawler" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Bottle in left hand, chair leg in right hand." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Street Fighter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's winning that matters, not the style." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Batter" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Every strike brings me closer to a home run." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Stone Age" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Cudgel was humanity's first tool. And it may be it's last, so why not " +"master it?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Way of the Sword" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"When the sword is once drawn, the passions of men observe no bounds of " +"moderation." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Miyamoto Musashi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"The sword has to be more than a simple weapon; it has to be an answer to " +"life's questions." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Elusive" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "A strongest of blows is nothing if it doesn't land." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Neo" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "But can you dodge a bullet?" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Cold Steel" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "While you were partying, I studied the blade." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Jack the Ripper" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "" +"Is this a dagger which I see before me, the handle toward my hand? Come, " +"let me clutch thee." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Road to Shaolin" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "I feel an army in my fist." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Mr Miyagi" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "To be your own weapon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Burglar" +msgstr "竊賊" + +#: lang/json/achievement_from_json.py +msgid "Crowbar? Such a barbarity." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Locksmith" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "If there is a lock, there is a key." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Periodic Table" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "It's somewhat like cooking. Just don't lick the spoon." +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "Heisenberg" +msgstr "" + +#: lang/json/achievement_from_json.py +msgid "You all know who I am. I'm the cook. Say my name." +msgstr "" + #: lang/json/achievement_from_json.py msgid "Would-be Wizard" msgstr "將來的巫師" @@ -85696,6 +87822,11 @@ msgstr "" msgid "canceling activity serialized with legacy code" msgstr "" +#: lang/json/activity_type_from_json.py +msgctxt "training" +msgid "working out" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "fusion cell" msgstr "核融合電池" @@ -85997,6 +88128,10 @@ msgstr "噴灑式化學物" msgid "compressed air" msgstr "壓縮空氣" +#: lang/json/ammunition_type_from_json.py +msgid "12.3ln cartridge" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "shotcanisters" msgstr "射彈罐" @@ -86049,10 +88184,6 @@ msgstr "" msgid "mana energy" msgstr "" -#: lang/json/ammunition_type_from_json.py -msgid "heady vapours" -msgstr "" - #: lang/json/bionic_from_json.py msgid "Adrenaline Pump" msgstr "腎上腺素幫浦" @@ -87450,19 +89581,6 @@ msgstr "" msgid "Wind Turbines" msgstr "" -#: lang/json/bionic_from_json.py -msgid "Precision Solderers" -msgstr "" - -#. ~ Description for {'str': 'Precision Solderers'} -#: lang/json/bionic_from_json.py -msgid "" -"Your hands have been outfitted with precise soldering tools, wire cutters, " -"and cable spools. They're too small to use in most crafting, but in the " -"absence of proper machinery, they're essential for creating bionics without " -"better tools." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Deployable Grenade Launcher" msgstr "" @@ -87509,6 +89627,19 @@ msgid "" "and fast." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Precision Solderers" +msgstr "" + +#. ~ Description for {'str': 'Precision Solderers'} +#: lang/json/bionic_from_json.py +msgid "" +"Your hands have been outfitted with precise soldering tools, wire cutters, " +"and cable spools. They're too small to use in most crafting, but in the " +"absence of proper machinery, they're essential for creating bionics without " +"better tools." +msgstr "" + #: lang/json/bionic_from_json.py lang/json/gun_from_json.py msgid "Ionic Overload Generator" msgid_plural "Ionic Overload Generators" @@ -87855,8 +89986,64 @@ msgstr "" msgid "Merciful" msgstr "" +#: lang/json/conduct_from_json.py +msgid "The Elven Path" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Cut no trees" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Homo Sapiens" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Install no faulty bionic implants" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "No mutations" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Clean on X-ray" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Pure Blood" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Structural Integrity" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Break no bones" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Teacher, Leave Them Kids Alone" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Gain no skill levels" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Self-Imposed Illiteracy" +msgstr "" + +#: lang/json/conduct_from_json.py +msgid "Read no books" +msgstr "" + #: lang/json/construction_category_from_json.py src/advanced_inv.cpp -#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +#: src/armor_layers.cpp src/debug_menu.cpp src/options.cpp src/scenario.cpp msgid "All" msgstr "全部" @@ -88479,10 +90666,6 @@ msgstr "牆壁漆成黃色" msgid "Take Paint Off Wall" msgstr "去除牆壁的顏色" -#: lang/json/construction_from_json.py -msgid "Remove Carpet" -msgstr "移除地毯" - #: lang/json/construction_from_json.py msgid "Carpet Floor Red" msgstr "鋪設紅色地毯" @@ -88523,6 +90706,30 @@ msgstr "建造木製樓梯" msgid "Mine Upstair" msgstr "往上採礦" +#: lang/json/construction_from_json.py +msgid "Build Low End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. The " +"high end of a ramp must be built adjacent to allow moving between z-levels " +"in both directions." +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build High End of a Concrete Ramp" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "" +"Build a concrete ramp leading to the next z-level above, and the " +"corresponding ramp down leading from the z-level above to this level. It " +"must be built next to a low end of a ramp to allow moving between z-levels " +"in both directions." +msgstr "" + #: lang/json/construction_from_json.py msgid "Start Vehicle Construction" msgstr "開始車輛建造" @@ -90336,7 +92543,7 @@ msgstr "你正騎乘著動物。" msgid "You mount your steed." msgstr "你騎乘著坐騎。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py lang/json/martial_art_from_json.py msgid "On Fire" msgstr "著火" @@ -91509,7 +93716,7 @@ msgstr "你抽了一兩口。" msgid "You smoked too much." msgstr "你抽太多菸了。" -#: lang/json/effects_from_json.py +#: lang/json/effects_from_json.py src/activity_actor.cpp msgid "High" msgstr "快感" @@ -92795,66 +95002,6 @@ msgstr "" msgid "The gum webs constrict your movement." msgstr "" -#: lang/json/effects_from_json.py -msgid "Debugged" -msgstr "" - -#. ~ Description of effect 'Debugged'. -#: lang/json/effects_from_json.py -msgid "" -"You have been debugged!\n" -"Everything is working perfectly now." -msgstr "" - -#. ~ Apply message for effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Diving into your source, you find a rubber duck, and talk it to death." -msgstr "" - -#. ~ Speed name of effect(s) 'Debugged'. -#: lang/json/effects_from_json.py -msgid "Optimized" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Min-Maxed" -msgstr "" - -#. ~ Description of effect 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "" -"All the benefits of being the worst with none of the drawbacks of being the " -"best!" -msgstr "" - -#. ~ Apply message for effect(s) 'Min-Maxed'. -#: lang/json/effects_from_json.py -msgid "You feel your internal metrics stretch like a fun-house mirror." -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Whoa" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wut?" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "Wow!" -msgstr "" - -#: lang/json/effects_from_json.py -msgid "" -"Everything is just way too intense, man!\n" -"You feel confused and disoriented." -msgstr "" - -#. ~ Apply message for effect(s) 'Whoa, Wut?, Wow!'. -#: lang/json/effects_from_json.py -msgid "!!Intensity intensifies!!" -msgstr "" - #: lang/json/faction_from_json.py msgid "Your Followers" msgstr "你的追隨者" @@ -93040,6 +95187,17 @@ msgid "" " the kind words used about them." msgstr "" +#: lang/json/faction_from_json.py +msgid "Swampers Religious Community and Hotels and Casinos" +msgstr "" + +#. ~ Description for Swampers Religious Community and Hotels and Casinos +#: lang/json/faction_from_json.py +msgid "" +"A prosperous but secretive group of churchgoers and entertainment moguls " +"with an affection for dinosaurs. They welcome all untainted humans." +msgstr "" + #: lang/json/faction_from_json.py msgid "The Ancient Ones" msgstr "" @@ -93569,6 +95727,18 @@ msgstr "火" msgid "raging fire" msgstr "大火" +#: lang/json/field_type_from_json.py +msgid "extinguisher mist" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "extinguisher cloud" +msgstr "" + +#: lang/json/field_type_from_json.py +msgid "thick extinguisher cloud" +msgstr "" + #: lang/json/field_type_from_json.py msgid "legacy rubble" msgstr "廢墟瓦礫" @@ -94592,8 +96762,7 @@ msgid "" msgstr "" #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp src/map.cpp +#: lang/json/terrain_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" msgstr "轟隆!" @@ -94660,7 +96829,7 @@ msgstr "" msgid "" "A common weed with a yellow flower. Produces seeds that get carried on the " "wind by thin, gray filaments." -msgstr "" +msgstr "常見帶有黃花的野草。會長出能夠藉由輕薄灰色細絲乘風而去的種子。" #. ~ Description for burdock #: lang/json/furniture_from_json.py @@ -94761,7 +96930,7 @@ msgid "" msgstr "一大堆葉子。如果你不關心舒適或溫暖,你可以睡在上面。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/iuse.cpp +#: src/iuse.cpp msgid "crunch!" msgstr "匡噹!" @@ -95400,9 +97569,8 @@ msgstr "健身器材" #: lang/json/furniture_from_json.py msgid "" "A heavy set of weightlifting equipment for strength training, with a pair of" -" heavy weights affixed to opposite ends of a sturdy pipe. The weights are " -"huge, and using them without a spotter would be a good way to seriously " -"injure yourself." +" heavy weights affixed to opposite ends of a sturdy pipe. You can adjust " +"the set by hand-picking the weights you wish to use." msgstr "" #: lang/json/furniture_from_json.py @@ -95491,6 +97659,18 @@ msgid "" " to be scavanged." msgstr "" +#: lang/json/furniture_from_json.py +msgid "mechanical ergometer" +msgstr "" + +#. ~ Description for mechanical ergometer +#: lang/json/furniture_from_json.py +msgid "" +"An exercise machine with a set of handles and plates meant to emulate rowing" +" a boat. This an older model with mechanical resistance adjustments, but it" +" works without power." +msgstr "" + #: lang/json/furniture_from_json.py msgid "treadmill" msgstr "跑步機" @@ -95503,6 +97683,18 @@ msgid "" "you're probably getting enough cardio on your own." msgstr "" +#: lang/json/furniture_from_json.py +msgid "gravity treadmill" +msgstr "" + +#. ~ Description for gravity treadmill +#: lang/json/furniture_from_json.py +msgid "" +"A gravity driven conveyor belt with a mechanical control panel for running " +"in place. Conveyor belt is positioned in a steep, but adjustable incline, " +"so it slides back under your weight." +msgstr "" + #: lang/json/furniture_from_json.py msgid "heavy punching bag" msgstr "重拳擊沙袋" @@ -95663,7 +97855,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "bale of hay" -msgstr "" +msgstr "乾草捆" #. ~ Description for bale of hay #: lang/json/furniture_from_json.py @@ -96764,10 +98956,6 @@ msgstr "" msgid "filled arc furnace" msgstr "" -#: lang/json/furniture_from_json.py -msgid "smoking rack" -msgstr "煙燻架" - #. ~ Description for smoking rack #. ~ Description for metal smoking rack #: lang/json/furniture_from_json.py @@ -97096,6 +99284,77 @@ msgid "" "temperature. You'll need to take it down first." msgstr "" +#: lang/json/furniture_from_json.py +msgid "sleep pod" +msgstr "" + +#. ~ Description for sleep pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a climate controlled sleep pod. An easy way to reduce energy costs " +"in dense urban environments." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cryo pod" +msgstr "" + +#. ~ Description for cryo pod +#: lang/json/furniture_from_json.py +msgid "" +"This is a long term sleep pod. Cryo pods are mostly used by people waiting " +"a short term for organs or criminals avoiding heat right after a crime." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "CRISPR Biolab" +msgstr "" + +#. ~ Description for CRISPR Biolab +#: lang/json/furniture_from_json.py +msgid "" +"A boxy looking device of arms, droppers and pipettes. It was used pre-" +"Cataclysm to do expirements in gene editing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "3D printer" +msgstr "" + +#. ~ Description for 3D printer +#: lang/json/furniture_from_json.py +msgid "" +"This box was used for rapid prototyping of products and for general " +"entertainment purposes in the masses." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "neural net inserter" +msgstr "" + +#. ~ Description for neural net inserter +#: lang/json/furniture_from_json.py +msgid "" +"This device looks like a cross between some kind of nightmare dentistry " +"equipment and socketing tool mounted on a slide that lets it drop precisely " +"down. Useful for those project that require putting delicate items into " +"hard to reach spaces." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "monomolecular saw" +msgstr "" + +#. ~ Description for monomolecular saw +#: lang/json/furniture_from_json.py +msgid "" +"A wire the size of a cheescutter runs in a single direction in this tool, " +"allowing atomically precise cuts at almost any angle. Even unpowered it " +"gives off a visual distortion for several inches around it to prevent you " +"from losing a hand. It is impossible to deconstruct this device without the" +" wire self destructing." +msgstr "" + #. ~ Description for dresser #: lang/json/furniture_from_json.py msgid "Dress yourself!" @@ -97439,7 +99698,8 @@ msgstr "能夠發射酸液球的槍。" msgid "auto" msgstr "自動" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" msgstr "步槍" @@ -97461,8 +99721,7 @@ msgid "" " a double barrel shotgun." msgstr "一把土炮的三管槍械。其中一管的口徑是 .30-06, 另外兩管能裝填霰彈。它是由鋼管和拆解出來的雙管散彈槍零件組合而成。" -#: lang/json/gun_from_json.py lang/json/gun_from_json.py -#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "shotgun" msgstr "霰彈槍" @@ -97607,7 +99866,8 @@ msgid "" "standard UPS." msgstr "這把雷射手槍是以 21 世紀中葉的 V29 雷射手槍為基礎而設計的,又加了一些大力膠帶跟電子零件的構造,使用標準 UPS 供電。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "手槍" @@ -97665,7 +99925,7 @@ msgid "" "deadly." msgstr "利用許多廢料手工製作而成的高衝程氣動步槍。相當的安靜且致命。" -#: lang/json/gun_from_json.py src/item_factory.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "半自動" @@ -98087,8 +100347,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "MAS 223" -msgid_plural "MAS 223" +msgid "MAS .223" +msgid_plural "MAS .223" msgstr[0] "" #: lang/json/gun_from_json.py @@ -100258,14 +102518,14 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "CZ-75" -msgid_plural "CZ-75s" -msgstr[0] "CZ-75 手槍" +msgid "CZ 75 B" +msgid_plural "CZ 75 Bs" +msgstr[0] "" #: lang/json/gun_from_json.py msgid "" -"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" -" of the original wonder nines. Though designed for export to western " +"The CZ 75 B is a semi-automatic pistol developed in Czechoslovakia, and is " +"one of the original wonder nines. Though designed for export to western " "countries, it was declared a state secret; lack of international patent " "protection meant that many clones and variants were produced and distributed" " around the world, with Česká zbrojovka only joining in the 90's. This " @@ -100369,6 +102629,37 @@ msgid "" "by their egomaniac descendants in New England." msgstr "" +#: lang/json/gun_from_json.py +msgid "PA md. 68 Battle Rifle" +msgid_plural "PA md. 68 Battle Rifles" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The most popular gun to use the 12.3ln cartridge was, of course, the PA md. " +"71. Its predecessor, the md. 68, was viewed by many as a sort of failure: " +"although it was reliable and powerful, it was too heavy to be used as a good" +" infantry weapon, and not really heavy enough to be a good support gun. " +"Enough were made, though, that during the zombie apocalypse, it gained a " +"great deal of resurgent popularity as a light emplacement gun that used " +"readily available ammunition. It perfectly served the purposes of the " +"Exodii, who had far less concern about its unwieldiness." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "PA md. 71 zombie hunting rifle" +msgid_plural "PA md. 71 zombie hunting rifles" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"This extremely popular Romanian assault rifle, made famous in the third " +"Carpachian War, has been redesigned slightly by the Exodii to serve as a " +"sniper weapon. It is well suited to precision shots against high-priority " +"targets. This modified design fires an extremely rapid 5-shot burst, with " +"the goal of shredding the target and preventing revivification." +msgstr "" + #: lang/json/gun_from_json.py msgid "flamethrower" msgid_plural "flamethrowers" @@ -100840,6 +103131,17 @@ msgid "" "will have to suffice." msgstr "" +#: lang/json/gun_from_json.py +msgid "four winds shotgun" +msgid_plural "four winds shotguns" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"A crude shotgun, composed of two thick steel pipes, an end cap and a nail. " +"The lack of sights make this weapon only useful at point-blank range." +msgstr "" + #: lang/json/gun_from_json.py msgid "flaregun" msgid_plural "flareguns" @@ -101463,6 +103765,33 @@ msgstr "" msgid "trilaser" msgstr "" +#: lang/json/gun_from_json.py +msgid "bionic skullgun" +msgid_plural "bionic skullguns" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "Bionic one-shot subdermal .40 pistol integrated with your head." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified Marlin 39A" +msgid_plural "modified Marlin 39A" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "A Marlin 39A, modified for use in a vehicle turret." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "modified SKS" +msgid_plural "modified SKSs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "An SKS, modified to be suitable for use in a vehicle turret." +msgstr "" + #: lang/json/gun_from_json.py msgid "CRIT .5 LP" msgid_plural "CRIT .5 LPs" @@ -102271,20 +104600,6 @@ msgstr "" msgid "Fake gun that fires barbed javelins." msgstr "" -#: lang/json/gun_from_json.py -msgid "TEST compound bow" -msgid_plural "TEST compound bows" -msgstr[0] "" - -#: lang/json/gun_from_json.py -msgid "Test Glock" -msgid_plural "Test Glocks" -msgstr[0] "" - -#: lang/json/gun_from_json.py -msgid "A handgun for testing, based on the Glock 9mm." -msgstr "" - #: lang/json/gunmod_from_json.py msgid "pipe combination gun shotgun" msgid_plural "pipe combination gun shotguns" @@ -104033,15 +106348,6 @@ msgid "" "replacing the iron sights. Increases accuracy and weight." msgstr "" -#: lang/json/gunmod_from_json.py -msgid "test suppressor" -msgid_plural "test suppressors" -msgstr[0] "" - -#: lang/json/gunmod_from_json.py -msgid "Gun suppressor mod for testing." -msgstr "" - #: lang/json/harvest_from_json.py msgid "You gut and fillet the fish" msgstr "你取出這條魚的內臟並將肉切成片" @@ -104056,6 +106362,12 @@ msgid "" " experiment" msgstr "" +#: lang/json/harvest_from_json.py +msgid "" +"You search for any salvageable hardware in what's left of this flesh and " +"metal monster" +msgstr "" + #: lang/json/harvest_from_json.py msgid "" "You messily hack apart the hulking mass of fused, rancid flesh, taking note " @@ -104069,8 +106381,32 @@ msgid "" msgstr "" #: lang/json/harvest_from_json.py -msgid "You laboriously dissect the colossal insect." -msgstr "你費力地解剖了龐大昆蟲。" +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "You laboriously dissect the colossal insect. " +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"What appeared to be insect hairs on the chitin of this creature look more " +"like tiny feathers as you pare them back. Inside is a bundle of bubble-like" +" tissue sacs that appear to be floating, which doesn't fit with what you " +"know about real bees." +msgstr "" + +#: lang/json/harvest_from_json.py +msgid "" +"There's a faintly hairy, skin-like membrane, covered in blood vessels, " +"beneath the chitin of this creature. Inside it is a bundle of bubble-like " +"tissue sacs that appear to be floating, which doesn't fit with what you know" +" about real wasps." +msgstr "" #: lang/json/harvest_from_json.py msgid "You laboriously hack and dig through the remains of the fungal mass." @@ -104629,7 +106965,7 @@ msgid "" "In addition to the primary crafting skills, other skills may be necessary to" " create certain items. Traps, Marksmanship, and First Aid are all required " "for certain items." -msgstr "" +msgstr "除了主要的製作相關技能, 其他技能在製作特定物品時也可能用到。陷阱技能、射擊技能、以及急救技能, 都在製作特定物品時會用到。" #: lang/json/help_from_json.py msgid "" @@ -104871,6 +107207,8 @@ msgid "" " for example load 9x19mm JHP and 9x19mm FMJ ammo into the same magazine, " "since a magazine always requires identical rounds to be loaded in it." msgstr "" +"請注意,雖然同一口徑及種類的子彈有多種變體,但玩家並不能將不同類型的子彈混合裝填到一個彈匣中。例如,你不能將 9x19mm JHP 和 9x19 FMJ" +" 彈藥裝到同一個彈匣中,因為一個彈匣中只能裝填一款彈藥。" #: lang/json/help_from_json.py msgid "" @@ -105975,10 +108313,6 @@ msgstr "寫字" msgid "Teleport yourself" msgstr "傳送自己" -#: lang/json/item_action_from_json.py -msgid "Extinguish a fire" -msgstr "滅火" - #: lang/json/item_action_from_json.py msgid "Dry/clean yourself" msgstr "抹乾/清潔 自己" @@ -106375,6 +108709,13 @@ msgstr "這裝備使用時須注意平衡。穿著它被擊中時會讓你 msgid "This item can be used to communicate with radio waves." msgstr "" +#. ~ Please leave anything in unchanged. +#: lang/json/json_flag_from_json.py +msgid "" +"This item can be used to pick locks with zero " +"effort." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is designed to keep you dry in the rain." @@ -106676,7 +109017,7 @@ msgstr "" msgid "" "If your vehicle consists of a single tile, this wheel is enough to allow it " "to move." -msgstr "" +msgstr "如果你的載具只有一格,這個輪子就足夠讓它移動了。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -106894,7 +109235,7 @@ msgstr "脫掉選中的裝備" #: lang/json/keybinding_from_json.py msgid "Display keybindings menu" -msgstr "" +msgstr "顯示熱鍵設定選單" #: lang/json/keybinding_from_json.py msgid "Reset filter" @@ -107208,6 +109549,14 @@ msgstr "離開創造角色選單" msgid "Toggle sorting order" msgstr "改變排序模式" +#: lang/json/keybinding_from_json.py +msgid "Randomize profession" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Randomize scenario" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Scroll description up" msgstr "向上捲動描述" @@ -107608,6 +109957,10 @@ msgstr "拆解物品" msgid "Sleep" msgstr "睡覺" +#: lang/json/keybinding_from_json.py +msgid "Workout" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Control Vehicle" msgstr "控制車輛" @@ -108081,12 +110434,12 @@ msgstr "讀取顏色模板" #. ~ translation should not exceed 3 console cells #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/veh_interact.cpp +#: src/trap.cpp src/veh_interact.cpp msgid "Yes" msgstr "是" #: lang/json/keybinding_from_json.py src/editmap.cpp src/editmap.cpp -#: src/options.cpp src/options.cpp src/veh_interact.cpp +#: src/options.cpp src/trap.cpp src/veh_interact.cpp msgid "No" msgstr "否" @@ -108657,6 +111010,15 @@ msgstr "" msgid "Zombie trap." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Reed" +msgstr "" + +#. ~ Description for {'str': 'Reed'} +#: lang/json/map_extra_from_json.py +msgid "Water vegetation." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -109961,6 +112323,11 @@ msgid "" "years.'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "DinoLab Operating Theater Controls" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "No style" msgstr "沒有招式" @@ -110216,6 +112583,21 @@ msgid "" "Lasts 3 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Capoeira Tempo" +msgstr "戰舞節奏" + +#. ~ Description of buff 'Capoeira Tempo' for martial art '{'str': +#. 'Capoeira'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You didn't miss, it's just part of the dance and the best part is about to start!\n" +"\n" +"+15% Bash damage.\n" +"Lasts 2 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" msgstr "鶴形拳" @@ -110372,6 +112754,22 @@ msgid "" "+2 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Eskrima Combination" +msgstr "菲律賓劍棍術組合" + +#. ~ Description of buff 'Eskrima Combination' for martial art '{'str': +#. 'Eskrima'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You can follow up a critical hit with a stronger attack if the opportunity presents itself.\n" +"\n" +"+15% bonus to all damage.\n" +"Enables \"Combination Strike\" technique.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Fencing" msgstr "擊劍" @@ -110409,6 +112807,33 @@ msgid "" "Blocked damage reduced by 50% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py lang/json/technique_from_json.py +msgid "Parry" +msgstr "格擋" + +#. ~ Description of buff 'Parry' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your next strike will find its mark much easier from your parry.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Remise" +msgstr "" + +#. ~ Description of buff 'Remise' for martial art '{'str': 'Fencing'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your feint is the perfect setup for a devastating followup attack!\n" +"\n" +"+1 Accuracy.\n" +"Enables \"Compound Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + #. ~ Description for martial art '{'str': 'Fior Di Battaglia'}' #: lang/json/martial_art_from_json.py msgid "" @@ -110457,6 +112882,34 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Defense Break" +msgstr "" + +#. ~ Description of buff 'Defense Break' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Each successful block reveals an opening in your opponent's guard.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Feinting" +msgstr "" + +#. ~ Description of buff 'Tactical Feinting' for martial art '{'str': 'Fior Di +#. Battaglia'}' +#: lang/json/martial_art_from_json.py +msgid "" +"They fell for your feint!\n" +"\n" +"Enables \"Hook and Drag\" technique.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Judo" msgstr "柔道" @@ -110698,6 +113151,32 @@ msgid "" "+1 Dodge attempts, blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Deflection" +msgstr "" + +#. ~ Description of buff 'Deflection' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You deflected your enemy's attack and now they are open to a counterattack!\n" +"Enables \"Sweeping Strike\" and \"Deathblow\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Manslayer" +msgstr "" + +#. ~ Description of buff 'Manslayer' for martial art '{'str': 'Medieval +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your powerful attack has given you the chance to end this fight right now!\n" +"Enables \"Vicious Strike\" techniques.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Muay Thai" msgstr "泰拳" @@ -110736,6 +113215,21 @@ msgid "" "Blocked damage decreased by 50% of Strength." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Determination" +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Muay +#. Thai'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Taking a hit will not slow you down. You will outlast your opponent and win this fight.\n" +"\n" +"+Bash damage increased by 25% of Strength, blocked damage decreased by 50% of Strength.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Ninjutsu" msgstr "忍術" @@ -110804,6 +113298,34 @@ msgid "" "Last 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Loss of Surprise" +msgstr "" + +#. ~ Description of buff 'Loss of Surprise' for martial art '{'str': +#. 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentions are known! It will take you a few moments to sneak attack again.\n" +"\n" +"-50% all damage.\n" +"Last 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Escape Plan" +msgstr "" + +#. ~ Description of buff 'Escape Plan' for martial art '{'str': 'Ninjutsu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your target has perished. It is time to leave and plan your next attack.\n" +"\n" +"+2 Dodge attempts, +10 movement speed.\n" +"Last 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Niten Ichi-Ryu" msgstr "二天一流" @@ -110877,6 +113399,39 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Falling Leaf" +msgstr "" + +#. ~ Description of buff 'Falling Leaf' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"A sharp sword cuts true.\n" +"Although, all things fade with time.\n" +"Restraint hones your skills.\n" +"\n" +"-1.0 Dodge skill, -1 bash damage, -1 cut damage.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stillness" +msgstr "" + +#. ~ Description of buff 'Stillness' for martial art '{'str': 'Niten Ichi- +#. Ryu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The eye of the storm,\n" +"a fleeting moment of peace,\n" +"gone without a trace.\n" +"\n" +"+2 Accuracy, Dodge skill increased by 50% of Perception.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Pankration" msgstr "古希臘式搏擊" @@ -111025,6 +113580,21 @@ msgid "" "Perception increases Accuracy instead of Dexterity. Accuracy increased by 25% of Perception but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Snake's Coil" +msgstr "" + +#. ~ Description of buff 'Snake's Coil' for martial art '{'str': 'Snake Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Every snake wait for the perfect moment to strike. Aim as your opponents approve and attack their weakness without mercy!\n" +"\n" +"+1 Accuracy, gain armor penetration equal to 50% of Perceptions.\n" +"Lasts 1 turn. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Sōjutsu" msgstr "日本槍術" @@ -111179,6 +113749,21 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Cross Hands" +msgstr "" + +#. ~ Description of buff 'Cross Hands' for martial art '{'str': 'Tai Chi'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare yourself, you are able to use your entire body fully for attacking and defending.\n" +"\n" +"+1.0 Dodge skill, blocked damage reduced by 50% of Perception.\n" +"Enables \"Palm Strike\" and \"Double Palm Strike\" techniques.\n" +"Lasts 3 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Tiger Kung Fu" msgstr "虎形拳" @@ -111232,6 +113817,21 @@ msgid "" "Accuracy increased by 25% of Strength but decreased by 25% of Dexterity." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Tiger Rampage" +msgstr "" + +#. ~ Description of buff 'Tiger Rampage' for martial art '{'str': 'Tiger Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Your opponent's lose is your gain. Your next attack will break through your opponent's guard.\n" +"\n" +"Gain Armor Penetration equal to 50% of Strength.\n" +"Lasts 1 turns. Stacks 2 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Wing Chun" msgstr "詠春拳" @@ -111286,6 +113886,20 @@ msgid "" " Dodging Skill increased by 15% of Perception. Blocked damage reduced by 50% of Perception." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Biu Ji" +msgstr "" + +#. ~ Description of buff 'Biu Ji' for martial art '{'str': 'Wing Chun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Through the perfect application of the Thrusting Fingers form, you can strike your opponents' weak points, force them away, and follow!\n" +"\n" +"Accuracy increased by 20% of Perception, Enables \"Straight Punch (Knockback)\" and \"L-Hook (Knockback)\" techniques.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Zui Quan" msgstr "醉拳" @@ -111400,6 +114014,34 @@ msgid "" "armor, +Perception fire armor." msgstr "+力量 鈍擊防護, +敏捷 酸液防護, +智力 電擊防護, +感知 火焰防護。" +#: lang/json/martial_art_from_json.py +msgid "Getting Angry" +msgstr "" + +#. ~ Description of buff 'Getting Angry' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When I get my hands on you… +2 bash damage for 2 turns. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Lightning Strike" +msgstr "" + +#. ~ Description of buff 'Lightning Strike' for martial art '{'str': 'Debug +#. Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Lightning strikes twice. +Perception electric damage for 3 turns. Stacks 2" +" times." +msgstr "" + +#. ~ Description of buff 'On Fire' for martial art '{'str': 'Debug Mastery'}' +#: lang/json/martial_art_from_json.py +msgid "YOU ARE ON FIRE! +5 fire damage for 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Bionic Combatives" msgstr "生化格鬥術" @@ -111439,6 +114081,22 @@ msgid "" "+2 Blocks attempts, +1 Accuracy." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Optimization" +msgstr "" + +#. ~ Description of buff 'Optimization' for martial art '{'str': 'Bionic +#. Combatives'}' +#: lang/json/martial_art_from_json.py +msgid "" +">10 LOCATE TARGET\n" +">20 EXECUTE TARGET\n" +">30 GOTO 10\n" +"\n" +"+1 Accuracy, +2 all damage.\n" +"Lasts 3 turns. Stacks 3 times." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "蜈蚣毒" @@ -111476,6 +114134,20 @@ msgid "" "Lasts 3 turns. Stacks 4 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Centipede's Venom" +msgstr "" + +#. ~ Description of buff 'Centipede's Venom' for martial art '{'str': +#. 'Centipede Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom burns your opponents at the worst of times.\n" +"\n" +"+2 bashing damage.\n" +"Lasts 2 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Lizard Kung Fu" msgstr "蜥蜴功" @@ -111595,6 +114267,20 @@ msgid "" "Stacks 2 times. Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Scorpion's Intimidation" +msgstr "" + +#. ~ Description of buff 'Scorpion's Intimidation' for martial art '{'str': +#. 'Scorpion Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Nothing is scarier than an angry scorpion. Your attacks can keep others at bay.\n" +"\n" +"+1 Dodge attempts.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Toad Kung Fu" msgstr "蛤蟆功" @@ -111646,6 +114332,34 @@ msgid "" "Lasts 6 turns. Stacks 6 times." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Toad's Meditation" +msgstr "" + +#. ~ Description of buff 'Toad's Meditation' for martial art '{'str': 'Toad +#. Kung Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By concentrating for a moment, you can bolster the strength of your iron skin.\n" +"\n" +"+3 bash, cut, and stab armor.\n" +"Lasts 2 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Toad's Venom" +msgstr "" + +#. ~ Description of buff 'Toad's Venom' for martial art '{'str': 'Toad Kung +#. Fu'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your venom is just another lesson about the strength of your iron body.\n" +"\n" +"+2 bash damage.\n" +"Lasts 5 turns." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Viper Kung Fu" msgstr "虺蛇功" @@ -111987,6 +114701,34 @@ msgid "" "Lasts 1 turn. Stacks 2 times" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Quicksilver Motion" +msgstr "" + +#. ~ Description of buff 'Quicksilver Motion' for martial art '{'str': +#. 'Diamond Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"In the blink of an eye, you make your move. Your speed, reflexes, and boundless confidence combine to allow you to make a fast, bold move that catches your foes off guard.\n" +"\n" +"+50 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Mind over Body" +msgstr "" + +#. ~ Description of buff 'Mind over Body' for martial art '{'str': 'Diamond +#. Mind'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training and mental toughness allow you to use your focus to overcome physical threats.\n" +"\n" +"+1 Accuracy.\n" +"Lasts 1 turn. Stacks 2 times" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Hylian Swordsmanship" msgstr "" @@ -112080,6 +114822,46 @@ msgid "" "Lasts 1 turn." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Charge Up" +msgstr "" + +#. ~ Description of buff 'Charge Up' for martial art '{'str': 'Hylian +#. Swordsmanship'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"By taking a moment to prepare, you can unleash a strong, spinning slash!\n" +"\n" +"+20% damage, enables \"Spin Attack\" technique.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Heart" +msgstr "" + +#. ~ Description for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Absolute mastery of the sword is the goal of the Iron Heart discipline. " +"Through unending practice and study, the Iron Heart adept achieves " +"superhuman skill with her weapons. Iron Heart maneuvers are demonstrations " +"of uncanny martial skill—weaving patterns of steel that dizzy, confuse, and " +"ultimately kill with no recourse." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +msgid "You push away your fear and stand tall." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Iron Heart'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s takes a bold and fearless stance." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" msgstr "" @@ -112131,6 +114913,393 @@ msgid "" "Lasts 2 turns." msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Pokken" +msgstr "" + +#. ~ Description for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Pokken or \"Pocket Fist\" is a strange martial art developed from the famous" +" Pokemon video game series. Somehow, a group of dedicated fans managed to " +"combine the moves used by various pokemon with multiple existing martial " +"arts such as boxing and karate. Amazingly, it actually works. Some might " +"even say it's a super effective way to fight." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +msgid "You get ready to battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s is about to challenge someone to a battle." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stamina" +msgstr "" + +#. ~ Description of buff 'Stamina' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your defense after you get hit.\n" +"\n" +"Gain bash, cut, stab armor equal to 50% of Strength.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Sniper" +msgstr "" + +#. ~ Description of buff 'Sniper' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Powers up your techniques after you score a critical hit.\n" +"\n" +"+50% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Moxie" +msgstr "" + +#. ~ Description of buff 'Moxie' for martial art '{'str': 'Pokken'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Boosts your damage after defeating an opponent.\n" +"\n" +"+50% damage.\n" +"Lasts 3 turns." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Setting Sun" +msgstr "" + +#. ~ Description for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Setting Sun discipline teaches its initiates to turn their opponents' " +"strength against them. With a quick shift in stance and carefully aimed " +"attack, a Setting Sun warrior sends a charging enemy tumbling in a new " +"direction." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +msgid "You shift your weight and prepare to defend yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Setting Sun'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s shifts their weight and assumes a new stance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Baffling Defense" +msgstr "" + +#. ~ Description of buff 'Baffling Defense' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You intentionally move and position yourself awkwardly to confuse and throw off your opponents.\n" +"\n" +"Dodging Skill increased by 20% of Intelligence, enables \"Mighty Throw\" and \"Ballista Throw\" techniques.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Feigned Opening" +msgstr "" + +#. ~ Description of buff 'Feigned Opening' for martial art '{'str': 'Setting +#. Sun'}' +#: lang/json/martial_art_from_json.py +msgid "" +"By intentionally openning your guard, you force your opponent to overextend and are able to take full advantage of your next attack!\n" +"\n" +"+20 Speed.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Shii-Cho" +msgstr "" + +#. ~ Description for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Shii-Cho, \"The way of the Sarlacc\" was the first form lightsaber combat " +"developed by the Jedi during their transition from metal weaponry to " +"lightsabers. Shii-Cho is regarded as a training form that all Jedi learn to" +" understand the basics of armed combat. Shii-Cho excels at fighting against" +" groups but lacks the offensive power of the other lightsaber forms." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You place one foot back and hold your weapon vertically on your dominant " +"side." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s places one foot back and hold their weapon vertically." +msgstr "" + +#. ~ Description of buff 'Determination' for martial art '{'str': 'Shii-Cho'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are a determined warrior. Your inner calm aids you in landing your strikes and protecting yourself.\n" +"\n" +"Blocked damage reduced by 100% of Strength, +1 Accuracy." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Apprentice Training" +msgstr "" + +#. ~ Description of buff 'Apprentice Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Your training in Shii-Cho teaches you how to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Knight Training" +msgstr "" + +#. ~ Description of buff 'Knight Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Further training in Shii-Cho improves your ability to combat multiple opponents.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Master Training" +msgstr "" + +#. ~ Description of buff 'Master Training' for martial art '{'str': 'Shii- +#. Cho'}' +#: lang/json/martial_art_from_json.py +msgid "" +"As a master of Shii-Cho, your ability to fight against groups is second to none.\n" +"\n" +"+1 block attempts, +1 block effectiveness." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Dragon" +msgstr "" + +#. ~ Description for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Stone Dragon discipline for focuses on strength, power, and toughness. " +"Its teachings grant a martial adept the ability to splinter steel with a " +"single, focused blow. Stone Dragon's defensive abilities focus on tapping " +"into the enduring power of stone to turn aside attacks." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "You dig your heels into the ground and steady yourself." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Stone Dragon'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s digs their heels into the ground." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stone Bones" +msgstr "" + +#. ~ Description of buff 'Stone Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You focus your energy to enhance your defenses, drawing on the power of your weapon's impact with a foe to toughen yourself against a counterattack.\n" +"\n" +"+1 bash, cut, and stab armor.\n" +"Lasts 1 turn. Stacks 5 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stonefoot Stance" +msgstr "" + +#. ~ Description of buff 'Stonefoot Stance' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You crouch and set your feet flat on the ground, drawing the resilience of the earth into your body. However, moving too much will break your stance.\n" +"\n" +"+10% damage, +2 bash, cut, and stab armor." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cracked Stone" +msgstr "" + +#. ~ Description of buff 'Cracked Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"Moving too much will negate the effects of Surefoot Stance. Stay still to avoid shattering your stance!\n" +"\n" +"Enables \"Shattered Stone\" buff.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stattered Stone" +msgstr "" + +#. ~ Description of buff 'Stattered Stone' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You are unable to maintain your Surefoot Stance and must stop moving for a short time to regain its benefits.\n" +"\n" +"-10% damage, -2 bash, cut, and stab armor.\n" +"Lasts 4 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Iron Bones" +msgstr "" + +#. ~ Description of buff 'Iron Bones' for martial art '{'str': 'Stone +#. Dragon'}' +#: lang/json/martial_art_from_json.py +msgid "" +"When you make a successful attack, you enter a meditative state that leaves you almost invulnerable to harm.\n" +"\n" +"+5 bash, cut, and stab armor.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tiger Claw" +msgstr "" + +#. ~ Description for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"The Tiger Claw discipline embraces a feral rage that lurks within the heart " +"of its initiates. In battle, such warriors growl like wild animals, attack " +"with a furry similar to that of a barbarian, and rely on overwhelming, " +"vicious assaults to defeat their enemies." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +msgid "You emit a low growl as you prepare for battle." +msgstr "" + +#. ~ initiate message for martial art '{'str': 'Tiger Claw'}' +#: lang/json/martial_art_from_json.py +#, python-format +msgid "%s hunkers down like a wild animal." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Improved Critical" +msgstr "" + +#. ~ Description of buff 'Improved Critical' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"Always strike with full force. Never hold back anything unless you want to die.\n" +"\n" +"+5% critical hit chance." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Pounching Charge" +msgstr "" + +#. ~ Description of buff 'Pounching Charge' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"With the roar of a wild beast, you throw yourself into the fray. Strike first and strike hard.\n" +"\n" +"+2 Accuracy, +10% damage.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Cornered Predator" +msgstr "" + +#. ~ Description of buff 'Cornered Predator' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"A cornered animal is a terrifying and dangerous creature. You are no different.\n" +"\n" +"-20% move cost.\n" +"Lasts 1 turn." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Blood In The Water" +msgstr "" + +#. ~ Description of buff 'Blood In The Water' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"The smell of blood drives you into a fury. You want more. NOW!\n" +"\n" +"+1 Accuracy, +15% damage.\n" +"Lasts 1 turn. Stacks 2 times." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Prey on the Weak" +msgstr "" + +#. ~ Description of buff 'Prey on the Weak' for martial art '{'str': 'Tiger +#. Claw'}' +#: lang/json/martial_art_from_json.py +msgid "" +"You scythe through weaker foes like a mighty predator turned loose among a herd of prey.\n" +"\n" +"+30 Speed.\n" +"Lasts 2 turns. Stacks 2 times" +msgstr "" + #: lang/json/material_from_json.py src/bionics.cpp msgid "Alcohol" msgstr "酒類" @@ -112614,7 +115783,7 @@ msgid "Emulsified Hydrogel" msgstr "" #: lang/json/material_from_json.py -msgid "pupled" +msgid "pulped" msgstr "" #: lang/json/material_from_json.py @@ -112645,7 +115814,7 @@ msgstr "" msgid "There is always work to be done, song to be woven." msgstr "總是有工作要做,有歌要編。" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "If you wish to be set on the path to enlightenment, first you must learn to " "listen and hear the song. Go out, butcher a creature and feel the power " @@ -112653,16 +115822,16 @@ msgid "" " you." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "Excellent. Now be on your way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "I understand your reluctancy. Feel free to return when you see the way." msgstr "" -#: lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py msgid "" "The shambling corpses we see all around move in discord. Their song can be " "used, but for an Acolyte, this would be needlessly hard. Be sure to carve " @@ -113881,7 +117050,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I'll see you then…or I won't, and then I'll know I made the right decision." +"I'll see you then… or I won't, and then I'll know I made the right decision." msgstr "" #: lang/json/mission_def_from_json.py @@ -113890,7 +117059,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Well, you're not dead…yet." +msgid "Well, you're not dead… yet." msgstr "" #: lang/json/mission_def_from_json.py @@ -113937,6 +117106,8 @@ msgid "" "collect 80 cattail stalks, and bring them back here. In exchange, I'll show" " you how to harvest the jelly." msgstr "" +"你知道香蒲可以取得膠質並用在消毒和止痛上嗎?像這樣的東西在這種狀況下可能會有幫助。我希望你拿著這個包包,前往最近的沼澤,蒐集 80 " +"個香蒲秸稈,然後帶回這裡。作為交換,我會教你怎麼採集膠質。" #: lang/json/mission_def_from_json.py msgid "" @@ -114320,7 +117491,7 @@ msgid "Can you go find my son and tell him to check in with us." msgstr "" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py -#: lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py msgid "Thank you." msgstr "謝謝你。" @@ -114612,7 +117783,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"We could use some 3 liter jars to preserve our produce. Can you bring me 20" +"We could use some 3 liter jars to preserve our produce. Can you bring me 10" " large three liter jars? I'll give you some preserves in exchange." msgstr "" @@ -115416,7 +118587,7 @@ msgstr "" msgid "" "Lots of people used to have first aid kits in their bathrooms. I'm sure " "they can't all have been looted." -msgstr "" +msgstr "很多人會習慣在他們的浴室裡放急救箱。我確定它們不會全被拿走的。" #: lang/json/mission_def_from_json.py msgid "" @@ -116363,6 +119534,87 @@ msgstr "耶,當然。" msgid "Well I'll have to scavenge the gold myself, thanks for nothing." msgstr "好吧,我必須自己搜刮黃金,不勞您費神。" +#: lang/json/mission_def_from_json.py +msgid "Active Noise Control" +msgstr "" + +#. ~ Description for mission 'Active Noise Control' +#: lang/json/mission_def_from_json.py +msgid "" +"Investigate Hub 01's radio tower, discover the source of the interference, " +"and fix the problem." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"A few days ago, I installed a radio transmitter in the nearby tower, but it " +"stopped working recently. If you are willing to be my back up while I check" +" it out, I'll owe you a favor." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Alright, lets be off. You don't mind taking point, right?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well thanks for offering, I guess." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I'm sure we'll figure it out once there. In any case, make sure to shoot " +"first." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You think we killed the culprit?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure seems like it. Lets go back to the hub." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Sure, thanks for nothing." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01" +msgstr "" + +#. ~ Description for mission 'Return to Hub 01' +#: lang/json/mission_def_from_json.py +msgid "Return to Hub 01." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Lets go back to the Hub" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well…" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "You keep a map around don't you? I do, and you probably should too." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We there yet?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks for having my back. As I said, I owe you one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Are you lost or something?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't believe we got lost…" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "製作 2 個蒸餾器" @@ -116500,6 +119752,8 @@ msgid "" "half and construction. If you don't have a truck, I'd make finding one your" " first priority. " msgstr "" +"我們的首要目標是把穀倉圍起來, 讓難民們有一個安全的地方睡覺。在開始工程之前, 我們需要大量的木材作準備。封閉穀倉的四個入口需要接近 400 塊角材… " +"如果你能提供一半的木材, 我們有辦法搞定另外一半還有完成建造。如果你沒有卡車的話, 我想你要先找一台。" #: lang/json/mission_def_from_json.py msgid "" @@ -116586,6 +119840,9 @@ msgid "" "is salt. I negotiated them down from 500 units to 300… we were hoping you " "might have access to a source." msgstr "" +"我想你也注意到新的工人開始流入這裡。由於資源有限, 自由商人議會要求我們要開始項目以達到自給自足。為免在毫無支援和準備的情況下面臨冬天和飢荒, " +"我們需要迅速建立一個農業產業。我們會通過以物易物的方式獲得半打鏟子和兩大包種子。交易已經談好了, 但他們唯一願意接受的貨物就是鹽。我已經通過談判將數量從" +" 500 份降到 300 份了… 我們希望你能夠取得這些資源。" #: lang/json/mission_def_from_json.py msgid "" @@ -116627,7 +119884,7 @@ msgstr "" msgid "" "I don't know the exact recipe but I'm sure you could make it from a " "commercial fertilizer or produce it from bonemeal." -msgstr "" +msgstr "我不知道確切的配方,不過我很確定你可以用商用肥料或是骨粉來製造它。" #: lang/json/mission_def_from_json.py msgid "I'd look through a few basic chemistry books to find a simple recipe." @@ -117009,6 +120266,8 @@ msgid "" "prevent me from ever seeing it. I could use your help getting a few bottles" " of aspirin to start with." msgstr "" +"我現在手上只有一些繃帶和少量的急救箱… 換句話說, 我無法處理最嚴重的醫療緊急情況。我以為拾荒者會優先向我提供醫療物資, " +"但我想這方面的黑市賣家早已把物資買光。我想你首先幫我搜集幾瓶阿斯匹靈。" #: lang/json/mission_def_from_json.py msgid "Aspirin is pretty common in homes and convenience stores." @@ -117654,6 +120913,54 @@ msgstr "" msgid "I can't be Dr Frankenstein unless you get me these." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather meat for Bo Baronyx. About 8 should do it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters are hungry. They need meat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If you wish to feed the eaters, your work will be rewarded. Go out, butcher" +" a pure animal. Not a false eater, the meat must be good to eat. Then " +"bring me the meat and I will see to the eaters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Excellent. The eaters must feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Understood. The great eaters will feed either way." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Some of the animals have become touched by the pretenders in recent days, " +"larger and more dangerous, producing tainted mutant meat. This will not " +"work for the great eaters, it must be the true meat." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you brought meat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The eaters will feed I am sure." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I see no meat. There is meat in the forests and swamps waiting for the " +"eaters." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Retrieve Magic Book" msgstr "" @@ -119970,6 +123277,23 @@ msgid "" "footing." msgstr "你移動得比一般人快, 站穩時得到 15% 的速度加成。" +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore" +msgstr "" + +#. ~ Description for {'str': 'Reflex Photophore'} +#. ~ Description for {'str': 'Reflex Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "" +"A photophore has grown from your head. You can't consciously control it, " +"and it might start to shine in response to your emotions or your " +"physiological state." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Reflex Photophore (on)" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Weak Photophore" msgstr "" @@ -119982,13 +123306,50 @@ msgid "" "mating season." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Weak Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Weak Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "Your photophore is glowing softly." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Photophore" msgstr "" #. ~ Description for {'str': 'Photophore'} #: lang/json/mutation_from_json.py -msgid "Your can make your photophore glow brightly." +msgid "You can make your photophore glow brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Photophore (on)" +msgstr "" + +#. ~ Description for {'str': 'Photophore (on)'} +#: lang/json/mutation_from_json.py +msgid "You photophore is glowing brightly." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Normal Human" +msgstr "" + +#. ~ Description for {'str': 'Normal Human'} +#: lang/json/mutation_from_json.py +msgid "" +"You're a normal human, there's nothing wrong with you. No need to worry." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Violent Monster" +msgstr "" + +#. ~ Description for {'str': 'Violent Monster'} +#: lang/json/mutation_from_json.py +msgid "Anger clouds your mind, you can't think straight but you feel strong." msgstr "" #: lang/json/mutation_from_json.py @@ -120083,10 +123444,12 @@ msgstr "快速痊癒" #. ~ Description for {'str': 'Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You heal faster when sleeping and will even recover a small amount of HP " -"when not sleeping." -msgstr "你在睡眠時會痊癒得比平時快, 甚至在醒著時也能恢復少量的 HP。" +"Your wounds heal themselves quicker than usual. You heal 50% faster whilst " +"asleep and 20% faster whilst awake. Your broken limbs also heal twice as " +"fast." +msgstr "" #: lang/json/mutation_from_json.py msgid "Light Eater" @@ -120712,8 +124075,11 @@ msgstr "復原慢" #. ~ Description for {'str': 'Slow Healer'} #: lang/json/mutation_from_json.py -msgid "You heal a little slower than most; sleeping will heal less HP." -msgstr "你的復原能力比一般人差了點;睡眠時回復的生命值比較少。" +#, no-python-format +msgid "" +"Your wounds heal a little slower than most. Your HP whilst asleep as well " +"as your broken limbs heal at 75% the regular rate." +msgstr "" #: lang/json/mutation_from_json.py msgid "Poor Healer" @@ -120721,10 +124087,11 @@ msgstr "復原差劣" #. ~ Description for {'str': 'Poor Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your health recovery through sleeping is severely impaired and causes you to" -" recover only a third of usual HP." -msgstr "你透過睡眠的健康復原力被嚴重減弱,使你只能恢復平常三分之一的HP。" +"Your health recovery is severely impaired. Your HP whilst asleep as well as" +" your broken limbs heal at 33% the regular rate." +msgstr "" #: lang/json/mutation_from_json.py msgid "Imperceptive Healer" @@ -120732,10 +124099,11 @@ msgstr "復原無感" #. ~ Description for {'str': 'Imperceptive Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"You recover barely any health through sleeping - it will heal only one tenth" -" of usual HP." -msgstr "你在睡眠時只能僅僅恢復健康 - 它只會恢復平常十分之一的HP" +"Wounds are incredibly dangerous to you, as they barely heal at all. Your HP" +" whilst asleep as well as your broken limbs heal at 10% the regular rate." +msgstr "" #: lang/json/mutation_from_json.py msgid "Far-Sighted" @@ -120788,7 +124156,7 @@ msgstr "背痛" msgid "" "You simply cannot carry as much as people with a similar strength could. " "Your maximum weight carried is reduced by 35%." -msgstr "" +msgstr "你就是沒法像一般人一樣搬運這麼多東西。你的最大負重量減少 35% 。" #: lang/json/mutation_from_json.py msgid "Bad Temper" @@ -121444,10 +124812,11 @@ msgstr "高速痊癒" #. ~ Description for {'str': 'Very Fast Healer'} #: lang/json/mutation_from_json.py +#, no-python-format msgid "" -"Your flesh regenerates slowly, and you will regain HP even when not " -"sleeping." -msgstr "你的血肉能夠緩慢的再生, 不論你是否在睡覺, HP都會慢慢回復。" +"Your wounds heal very quickly. You heal 50% faster whilst asleep and 66% " +"faster whilst awake. Your broken limbs also heal 4 times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Regeneration" @@ -121455,8 +124824,12 @@ msgstr "再生" #. ~ Description for {'str': 'Regeneration'} #: lang/json/mutation_from_json.py -msgid "Your flesh regenerates from wounds incredibly quickly." -msgstr "你的血肉能夠以不可思議的速度再生。" +#, no-python-format +msgid "" +"Your flesh regenerates from wounds incredibly quickly. You heal 150% faster" +" whilst asleep and 200% faster whilst awake. Your broken limbs also heal 16" +" times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Reptilian Healing" @@ -121464,8 +124837,10 @@ msgstr "爬蟲類癒合" #. ~ Description for {'str': 'Reptilian Healing'} #: lang/json/mutation_from_json.py -msgid "Your broken limbs mend themselves without significant difficulty." -msgstr "你的斷肢開始自行復原了, 沒有大礙。" +msgid "" +"Your broken limbs mend themselves without significant difficulty. You do " +"not require splints and broken limbs heal 20 times faster than usual." +msgstr "" #: lang/json/mutation_from_json.py msgid "Very Little Sleep" @@ -124868,8 +128243,7 @@ msgstr "蛛形" msgid "Well, maybe you'll just have to make your own world wide web." msgstr "嗯, 也許你只需要製作你自己的網路。" -#: lang/json/mutation_from_json.py lang/json/mutation_from_json.py -#: lang/json/npc_from_json.py +#: lang/json/mutation_from_json.py lang/json/npc_from_json.py msgid "Survivor" msgstr "倖存者" @@ -125179,10 +128553,6 @@ msgid "" msgstr "" "你是真正的美食人,有些人可能認為美食人只是吉祥物,但你知道更多真相。你是美食人,面具已經變成你的臉,你是真實的,站在這個世界與遺忘之間的唯一事物就是你。" -#: lang/json/mutation_from_json.py -msgid "MD" -msgstr "實習醫生" - #. ~ Description for {'str': 'MD'} #: lang/json/mutation_from_json.py msgid "" @@ -125554,15 +128924,34 @@ msgstr "" #. ~ Description for {'str': 'Fast Reflexes'} #: lang/json/mutation_from_json.py -msgid "You have fast reflexes, allowing you to dodge attacks more easily." +msgid "" +"You have fast reflexes, allowing you to dodge attacks and grabs more easily." msgstr "" #: lang/json/mutation_from_json.py -msgid "Survivor Story" -msgstr "倖存者故事" +msgid "Survivor: Confused 1" +msgstr "" -#. ~ Description for {'str': 'Survivor Story'} -#. ~ Description for {'str': 'Survivor'} +#. ~ Description for {'str': 'Survivor: Confused 1'} +#. ~ Description for {'str': 'Survivor: No Past 1'} +#. ~ Description for {'str': 'Survivor: No Past 2'} +#. ~ Description for {'str': 'Survivor: No Past 3'} +#. ~ Description for {'str': 'Survivor: No Past 4'} +#. ~ Description for {'str': 'Survivor: No Past 5'} +#. ~ Description for {'str': 'Survivor: Religious 1'} +#. ~ Description for {'str': 'Survivor: Religious 2'} +#. ~ Description for {'str': 'Survivor: Dreamer 1'} +#. ~ Description for {'str': 'Survivor: Wedding 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Evacuee 2'} +#. ~ Description for {'str': 'Survivor: Evacuee 3'} +#. ~ Description for {'str': 'Survivor: Evacuee 4'} +#. ~ Description for {'str': 'Survivor: Evacuee 5'} +#. ~ Description for {'str': 'Survivor: Evacuee 6'} +#. ~ Description for {'str': 'Survivor: FEMA Evacuee 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 1'} +#. ~ Description for {'str': 'Survivor: Left for Dead 2'} +#. ~ Description for {'str': 'Survivor: Left for Dead 3'} #. ~ Description for {'str': 'Survivor Story'} #. ~ Description for {'str': 'Survivor'} #. ~ Description for {'str': 'Survivor Story'} @@ -125570,6 +128959,86 @@ msgstr "倖存者故事" msgid "This NPC could tell you about how they survived the Cataclysm" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: No Past 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Religious 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Dreamer 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Wedding 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 4" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 5" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Evacuee 6" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: FEMA Evacuee 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 1" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 2" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor: Left for Dead 3" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Survivor Story" +msgstr "倖存者故事" + #: lang/json/mutation_from_json.py msgid "Mark of the Seer" msgstr "先知的印記" @@ -126779,6 +130248,28 @@ msgid "" "improves as your unarmed skill increases." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Jedi Training" +msgstr "" + +#. ~ Description for {'str': 'Jedi Training'} +#: lang/json/mutation_from_json.py +msgid "" +"You are trained in the ways of the Jedi. Your knowledge allows you to " +"utilize a form of lightsaber combat." +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Pokken Master" +msgstr "" + +#. ~ Description for {'str': 'Pokken Master'} +#: lang/json/mutation_from_json.py +msgid "" +"You are well versed in the monsterous Pocket Fist martial art. Train well, " +"because it is your destiny to be a master." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Martial Adept" msgstr "" @@ -126787,7 +130278,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You are a martial adept and learned one of the martial disciplines of the " -"Sublime Way." +"Sublime Way. You start with your choice of Desert Wind, Diamond Mind, Iron " +"Heart, Setting Sun, Stone Dragon, or Tiger Claw." msgstr "" #: lang/json/mutation_from_json.py @@ -127295,10 +130787,6 @@ msgstr "我只是努力活著。" msgid "I'm tracking game." msgstr "我在跟蹤遊戲。" -#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py -msgid "Soldier" -msgstr "軍人" - #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Bartender" msgstr "調酒師" @@ -127771,6 +131259,14 @@ msgstr "" msgid "Humans created me. Let's see what I can be on my own." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Swamper" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "The great eaters have returned and they must be fed" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Operator" msgstr "特種部隊" @@ -128040,10 +131536,6 @@ msgstr "廢料承辦員" msgid "Laborer" msgstr "勞工" -#: lang/json/npc_from_json.py -msgid "Lumberjack" -msgstr "伐木工" - #: lang/json/npc_from_json.py msgid "Woodworker" msgstr "木工" @@ -128056,6 +131548,14 @@ msgstr "" msgid "Millyficen Whately" msgstr "" +#: lang/json/npc_from_json.py +msgid "CEO" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "Bo Baronyx" +msgstr "" + #: lang/json/npc_from_json.py msgid "magus" msgstr "" @@ -130545,6 +134045,18 @@ msgstr "人孔蓋" msgid "bridge" msgstr "橋" +#: lang/json/overmap_terrain_from_json.py +msgid "bridge (overpass)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ground)" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "bridgehead (ramp)" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "roadstop" msgstr "路邊小吃店" @@ -135415,6 +138927,118 @@ msgid "" "time before the horrors patrolling the skies shot you down." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "EMT" +msgstr "" + +#. ~ Profession (male EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "EMT" +msgstr "" + +#. ~ Profession (female EMT) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were responding to a call with your partner before you got separated. " +"Now all you have is your trusty ambulance, ready to transport patients " +"through the apocalypse." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (male Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Paramedic" +msgstr "" + +#. ~ Profession (female Paramedic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were separated from your partner while out on a call. You managed to " +"hang onto some medical supplies, but it's looking like the only life that " +"needs saving now is yours." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (male Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Combat Medic" +msgstr "" + +#. ~ Profession (female Combat Medic) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were on the front-lines when everything happened, patching up the " +"wounded and providing support. But they wouldn't stop coming. Now you're " +"on your own." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (male Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Heroin Addict" +msgstr "" + +#. ~ Profession (female Heroin Addict) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"The last thing you remember was meeting God behind the local Foodplace. " +"Then people started eating each other. This doesn't feel like a fever " +"dream." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Radio Tower Technician" @@ -135583,8 +139207,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -135597,8 +139222,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You worked as a technician in a sterile, high-security facility concerned " -"with the fabrication of bionic implants. Armed with the solderers in your " -"hands, and aided by precise machines, you earned great pay." +"with the fabrication of bionic implants. The final evacuation order caught " +"you in the middle of your 16 hour extended shift, and you barely managed to " +"escape the building, tools in hand." msgstr "" #: lang/json/professions_from_json.py @@ -136843,6 +140469,226 @@ msgid "" "find some other use." msgstr "在最近的大災變中,你發現的在測試中作弊的方式可能需要找到其他用途。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (male Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Introspectionist" +msgstr "" + +#. ~ Profession (female Introspectionist) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You segregated yourself from society because you wanted to concentrate on " +"improving yourself. It was you and your best friend, but now the apocalypse" +" won't leave you alone. " +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (male Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Vengeful Preacher" +msgstr "" + +#. ~ Profession (female Vengeful Preacher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You lost your faith when your spouse died of illness. You've been drinking " +"yourself to death ever since. God is punishing everyone with this " +"apocalypse, you are going to show them your brand of mercy." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (male Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Techno-Prepper" +msgstr "" + +#. ~ Profession (female Techno-Prepper) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long suspected the world might suddenly turn over. With your " +"training, spells, and revolver, your chances are far better than most." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (male Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Bionic Pseudovamp" +msgstr "" + +#. ~ Profession (female Bionic Pseudovamp) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've long had an obsession with horror novels, and used your wealth to " +"augment yourself with spells and bionics into a denizen of the night. Your " +"neglect to your health in your pursuit has left you pale and unlively." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (male Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Academy Wizard" +msgstr "" + +#. ~ Profession (female Academy Wizard) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"A year of enrollment in a wizard's academy has taught you patience, wisdom, " +"and a handful of useful spells. With the teachers converted into the undead " +"and classes cancelled, the final lesson has begun." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (male Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Corrosive Rocker" +msgstr "" + +#. ~ Profession (female Corrosive Rocker) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"Your metal career soared to new heights when you swapped special effects for" +" acrid gore and spiked whips. It seems the Cataclysm is now your final tour." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (male Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Shock Officer" +msgstr "" + +#. ~ Profession (female Shock Officer) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were enrolled in a experimental law enforcement program designed to " +"decrease suspect casualties and equipment costs by substituting tasers and " +"bullets for less-lethal Stormshaping." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (male Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Earthquake Brawler" +msgstr "" + +#. ~ Profession (female Earthquake Brawler) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've made a name for yourself in underground magic boxing rings as an " +"unstoppable punching machine. Now that all your opponents are undead, " +"there's no need to hold back." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Sugar Boy" @@ -138515,8 +142361,8 @@ msgid "build a metalworking forge" msgstr "建造金屬加工鍛造爐" #: lang/json/recipe_from_json.py -msgid "Let's an an anvil and crucible to increase our crafting options." -msgstr "讓我們用鐵砧和坩堝來增加我們製作的選項吧。" +msgid "Let's build an anvil and crucible to increase our crafting options." +msgstr "" #: lang/json/recipe_from_json.py msgid "add an anvil and crucible" @@ -142757,6 +146603,40 @@ msgctxt "start_name" msgid "Wizard's Retreat Vacation" msgstr "" +#. ~ Name for scenario 'Exile' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Exile" +msgstr "" + +#. ~ Name for scenario 'Exile' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Exile" +msgstr "" + +#. ~ Description for scenario 'Exile' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Description for scenario 'Exile' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You are an exile, whether because of people shunning you because of who you " +"are or from a personal choice. The dead aren't willing to leave you be." +msgstr "" + +#. ~ Starting location for scenario 'Exile'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Exiled" +msgstr "" + #. ~ Name for scenario 'The Sweet Life' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -144040,7 +147920,7 @@ msgid "" "First aid 101 for you. Always bandage your wounds, they will heal faster " "that way. Bandages are plenty and you can make makeshift ones easily, so " "there is no reason not to." -msgstr "" +msgstr "告訴你一個急救入門守則。一定要包紮你的傷口,這樣才會好得快。繃帶到處都有再說粗製繃帶很容易就能自己做,所以沒有理由不包紮。" #: lang/json/snippet_from_json.py msgid "" @@ -144052,7 +147932,7 @@ msgstr "" msgid "" "If you have extra antiseptic, use it to disinfect your wounds, even if they " "aren't infected. They will recover faster that way." -msgstr "" +msgstr "如果你有多餘的消毒劑,用它來消毒你的傷口,就算你沒有被感染。這樣會好得比較快。" #: lang/json/snippet_from_json.py msgid "" @@ -144337,7 +148217,7 @@ msgstr "" msgid "" "Some days are full of sadness. Reading can help, if you have the right " "book." -msgstr "" +msgstr "有時日子太苦了。閱讀能讓你好過點,如果有合適的書。" #: lang/json/snippet_from_json.py msgid "" @@ -145131,96 +149011,6 @@ msgstr "" msgid "I'd kill for a sip of water right now." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Yeah sure, can't help but notice you got beer with you! Let's crack a cold " -"one and chat, , how goes it?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Yeah you share those beers I see you hoarding and then we chat all you like!" -" Only joking, what's up ?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Hey , I bet a chat would be all the sweeter with a nice, cold beer " -"in hand. How's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"While we chat, what say you we open a beer and just… pretend the world isn't" -" ending, just for a while?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Pass me one and let's talk about the good ol' days, ." -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"Good idea . Let's forget the world for a while. How you doin'?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Ah, what the heck. How's life been treating you?" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "Sure. So, how about that weather ey?" -msgstr "" - #: lang/json/snippet_from_json.py msgid "darn" msgstr "縫補" @@ -147241,7 +151031,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "I hope these bandages work." -msgstr "" +msgstr "希望這些繃帶會有用。" #: lang/json/snippet_from_json.py msgid "I think I need to see a doctor. They're all dead, I hope these work." @@ -147684,6 +151474,18 @@ msgstr "" msgid "Was it rough surviving thus far?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "How do you think we ended up here? What even happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What's going on? Like, big picture, what the hell happened?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Have you heard anything about how the apocalypse came about?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -148399,6 +152201,301 @@ msgstr " 會盡量避免跟敵人交戰。" msgid " will follow normal engagement rules." msgstr " 會遵守一般的交戰守則。" +#: lang/json/snippet_from_json.py +msgid "Yeah sure, want to crack open one of them beers?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Oh definitely, how about one of those beers you got?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Yeah you share those beers I see you hoarding and then we chat all you like!" +" Only joking, heh." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just… pretend the world isn't" +" ending." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Pass me one and let's talk, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Yeah, this summer heat is hitting me hard, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Enjoying the summer." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Kinda wishing it would cool off a bit, to be honest." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK, maybe it'll stop me from freezing in this weather." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta say, I'm not minding the snow." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "It's weird the zombies don't freeze." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, I'm feeling pretty sick… but sure." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I need a break anyway, how are you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's shoot the shit! You OK, ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm OK with that, what's up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I guess I can spare a few minutes, how's things?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure thing , you good?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Alright, you got something to get off your chest?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Always ready for a good chat! But why, you OK?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "OK , how are you coping?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm game. How you holding up?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "What the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "So, how about that weather, eh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Nice of you to make time. How's it been for you lately?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "My dogs’ve been barkin’ lately, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I feel great today. Not sure what it is, just one of those days." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I just can't believe it's over. I keep running my head back to the days it " +"all fell apart. The riots. The lies. The psychos. It never really felt " +"like it was going to go like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever think there's any truth to the crap they were spouting before the " +"world ended? Mind control drugs in the water, bio-terrorism? Some of it " +"would make sense, but it seems so far-fetched. Then again, we're dealing " +"with actual zombies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wonder if I should be getting more religious now, or less. You know what " +"I'm sayin', ?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin’ about rearranging my gear. It’s a real mess. Don’t wanna " +"go for my weapon and accidentally pull out a granola bar, right?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever wonder why we even bother? We’re all just gonna be zombies " +"eventually anyway. I mean, not that I’m gonna stop fighting, but what’s the" +" damn point?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I wish I could go bust a cap in one of those zombies right now, without all " +"the fuss about being scared for my life." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Every time I close my eyes, I can still see the riots. Do you get that, or " +"is it just me?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You ever feel like the whole time before the apocalypse was just a dream " +"you’re waking up from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"When do you think you realized the world was ending? For me, it was that " +"damned YouTube video with the lady killing the baby. Holy shit, you know?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I wonder if the government's still out there, holed up in some bunker." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Remember some of the crazy news from the end of the world? The stuff that " +"got drowned out by the riot coverage I mean. Like, didn't the governor of " +"Rhode Island secede from the Union or something?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I keep having dreams that zombies still remember who they were as people, " +"and are just trapped inside the bodies watching everything happen. Haven't " +"been sleeping well." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Those mind-control drugs they put in the water to make people riot… you " +"think they're still in there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can't stop wondering who fucked up to make all this happen. Obviously we " +"can't trust the news, they claimed the zombies were \"rioters\" for weeks. " +"Why? Where did this come from?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"If what they told us about the Chinese was even partly true, do you think " +"it's like this in China? Or maybe the US is some kind of quarantine zone, " +"and at least some of the world is still out there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Have you noticed injuries aren’t healing the same as usual? I started " +"spotting it before the world ended, but it’s become more pronounced. " +"There’s hardly even a granulation step after a cut closes." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I still don’t understand how these zombies are powered. They’re like " +"perpetual motion machines." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"So many parts of this still don't fit together. Who created the zombies? " +"What powers them? Maybe the rumours of mind control drugs were true all " +"along, and someone found a way to bioengineer living dead." +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"How do these zombies even keep going? What are they eating? Do you think " +"they'll ever rot away?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I been thinkin', one of these days, we're gonna run out of toilet paper. " +"What then?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Do you think it’s weird how we’ll, like, open a locked building and find a " +"lone zombie inside? How’d it even get there?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Sometimes I wonder if we're all psychos, not just the ones that went crazy " +"and rioted. I never would have thought I could do the things I've done " +"since the world ended." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You read any good books lately? I'm glad we still got books." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You know what I miss? Movie theaters. You think Hollywood survived this? " +"Maybe there's a bunch of zombie actors out there, filmin' shit out of " +"reflex. Hah, I'd watch that shit." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I hear you, …" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That reminds me of something…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Right, right. Say, you ever thought about…" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\n" @@ -149544,6 +153641,14 @@ msgstr "" "這是 Rivtech 牌的槍械廣告。上面畫著一個中央被炸開大洞的裝甲鋼板。還有一堆色彩鮮豔的無殼彈藥放在旁邊。標題寫著: \"用 Rivtech " "8x40mm 無殼子彈, 沒有什麼能靠近你。\"" +#: lang/json/snippet_from_json.py +#, no-python-format +msgid "" +"This is an advertisement for SUDS Laundromat. It shows words surrounded by " +"bubbles that appear to be floating upward. It reads: \"Tergitol Tuesdays! " +"50% off on all washers and driers!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a propaganda poster showing the Northrop Dispatch's military " @@ -149553,6 +153658,21 @@ msgid "" " reads: \"WE ARE HERE TO PROTECT YOU.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Iron Gym. It shows pictures of people " +"performing various exercises such as running, yoga and weight lifting. It " +"reads: \"I lift things up and put them down!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an advertisement for Space Time Inc. It has pictures of astronauts " +"floating around a spaceship with the Moon in the background. It reads: " +"\"Own your own piece of the Moon! For only $29.99 a month, you can have " +"prime real estate amongst the stars!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " @@ -152427,6 +156547,326 @@ msgstr "-風格" msgid "-chant" msgstr "-唱腔" +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. It has an unsettling loose and spongy " +"texture, but smells… mostly normal. There are strange tangles and " +"formations in it that don't appear natural at all: bits of bone and hair " +"crusted up inside the muscle, as if trying to form another organism. Still," +" seems digestible at least, if you cook it and remove the worst parts." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although it came from muscle tissue, it" +" has a curious swirling grain pattern, and at the center of each grain is a " +"knot of hard, cartilaginous tissue. It smells offputting." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. This is from muscle, but in the fascial" +" tissue between the muscles, thick spiny hairs have grown. Foul smelling, " +"cream-colored fluid gushes out whenever a hair pulls loose." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Meat from a heavily mutated animal. Although this came from muscle, it has " +"a thick cordlike texture and smells like leather and bread mold." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. It has an unsettling," +" spongy texture, but otherwise tastes… mostly normal. Hopefully you got all" +" the bits of hair and bone out…" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. You thought you'd " +"cleared out all the gross parts, but while cooking, a fluid-filled sac " +"inside burst and covered it in some kind of thick grease." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. The surface is " +"peppered with divets from the pieces you had to dig out to make it seem " +"edible." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a cooked chunk of meat from a mutated animal. Heat caused the " +"muscles to twist and move as if they were alive, and now it has writhed " +"itself into a dense knot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug, and you really aren't sure what " +"to make of them. There are things you've never seen in any anatomy book, " +"with spines and hair and other unidentified parts protruding off seemingly " +"at random." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"These organs came from a giant mutant bug. They have a sickly green color, " +"and one of them ripped when you were removing it, revealing an inner surface" +" that looks like row upon row of human fingers, nails and all." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a huge, thick, fleshy sac you removed from a giant mutant bug. The " +"surface is covered in smooth, soft skin, and beneath it is a coiled, twisted" +" mess of cordlike tissue." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a long, corded organ you removed from a giant mutant bug. It ran " +"from the head to the abdomen and has long tendrils coming off it, not unlike" +" a spinal cord." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a meaty grey organ you removed from a mutant. It has a chalky " +"yellow coating that burns your skin, and several unidentifiable fleshy tubes" +" sticking out of it. The smell it gives off stings your nostrils. You're " +"pretty confident no natural creature has one of these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This organ meat, retrieved from a mutated creature, looks like a series of " +"small mammalian hearts arranged in series on a long fleshy tube. At the end" +" of the chain is a large fleshy sac resembling a stomach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It looks like a lung from a larger " +"mammal, like a dog, but instead of a few distinct lobes, it has dozens of " +"lobes arranged in sheets. Strange spindles and gnarled tumescences dot the " +"surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You're pretty sure this is lung tissue. It has a vaguely wing-like shape, " +"with a series of nodules around what would be the trailing edge of the " +"'wing'. A cluster of quills in each corner of the organ held it to the " +"bug's carapace like clasps." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton, but mutated. The inner side is lined with " +"veins and strange hooked protuberances." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of a bug's exoskeleton. Stringy lines of nervous tissue and blood " +"vessels still cling to the inner surface." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A piece of rigid, tube-shaped chitin from the inside of a giant bug. It " +"seemed to be performing some kind of support role. You're quite sure normal" +" insects don't have these." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"A long, flexible rod of chitin from inside a giant mutant bug. It is laced " +"with blood vessels and chitinous nodules." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"As you peel away the outer shell, you find veins lining the chitin plates" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "With the creature dead, its carapace comes away surprisingly easily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"There's a thin membrane, much like skin, spread over the chitin of this " +"creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Under the carapace of this mutant is a bristly, velcro-like material" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The anatomy concealed beneath seems almost like a small mammal given a shell" +" and twisted into the shape of an arthropod" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You crack the beast open like a horrific lobster" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The chitin holds tight to the creature, and you need to snap and tear it " +"away, sawing at tough fibers beneath" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside, half-formed organs press against spongy meat that doesn't look " +"anything like raw arthropod meat from normal creatures" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You find a collection of hooked spines beneath that seem to have been " +"clasping it on somehow" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a complex, still-squirming mess of strange appendages and organs " +"that bear only a passing resemblance to any natural creature" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Beneath the chitin, the meat is covered in thick, bristly hair hiding a " +"chaotic bramble of half-formed, mutated organs" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside is a tangled mess of organs and tissues that do not appear to " +"entirely natural" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Inside the creature you find lungs, hearts, and intestines more like a " +"mammal than a giant bug" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The meat inside gives off a horrifying stench, and seems to be covered in " +"thin damp hair, like a newborn animal gone horribly wrong" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Small bundles of fiber break loose as you work, splitting open to reveal " +"twisted, half-formed copies of the creature itself" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"It is difficult to work, as the spongey tissue tears apart under your tools" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Steaming puddles of acid spill from its outer shell as you pull it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Steaming acid burbles from the creature's chitin as you peel it back" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several acid glands rupture as you peel back the carapace, sending streams " +"of steaming caustic fluids spraying around" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The organs themselves have an acrid odour, but don't seem as caustically " +"acidic as the outer shell" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"You carefully avoid breaking through pockets of what you think may be acid-" +"secreting glands" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Thick, ropey cords of tissue beneath its chitin protect an inner layer of " +"strange organs, resembling those of a bird more than anything" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The powerfully acidic vapors coming from the carcass make it hard to work" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"The tissues of the creature are full of half-formed organs, their purpose " +"unclear" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Several times, you nearly burn yourself piercing a concealed gland full of " +"acid" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid ". ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +". . " +"." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "ATOMIC DEREGULATION! President Toffer announced to a mixed crowd today that" @@ -160360,6 +164800,10 @@ msgstr "" msgid "Middle of Nowhere" msgstr "中途" +#: lang/json/start_location_from_json.py +msgid "Desert Island" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Experiment Cell" msgstr "實驗品牢房" @@ -160505,12 +164949,12 @@ msgid "Acolyte." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're back. Have you come to listen to the song?" -msgstr "你回來了。你有來聽這首歌嗎?" +msgid "You're back. Have you come to listen to the song?" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You there. Quiet down. Can you hear it? The song?" -msgstr "你那邊。靜下來。你能聽見嗎?這首歌?" +msgid "You there. Quiet down. Can you hear it? The song?" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "What? What do you mean? What song?" @@ -160544,8 +164988,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Listen carefully. The bones… they sing. Can you hear it? The song they " -"weave? The stories they hold?" +"Listen carefully. The bones… they sing. Can you hear it? The song they " +"weave? The stories they hold?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -160558,11 +165002,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"When it all happened, the Cataclysm, something… changed. You can see it in " -"all creatures, but most of all their bones. They break, morph, rise again, " -"in an infinite cycle. Living dead walk. Monsters rip and tear each other " -"apart. You can see the resonance, the quiet hum of raw strength, and only by" -" taking the bones does the cycle end - their story, their song, their " +"When it all happened, the Cataclysm, something… changed. You can see it in " +"all creatures, but most of all their bones. They break, morph, rise again, " +"in an infinite cycle. Living dead walk. Monsters rip and tear each other " +"apart. You can see the resonance, the quiet hum of raw strength, and only " +"by taking the bones does the cycle end - their story, their song, their " "strength, become yours to use." msgstr "" @@ -160580,11 +165024,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Only when you crush the bones of a body does it cease to rise. Only if you " -"examine the bones can you see what was. Thus is the story. Whatever causes " -"this change is alive, moving within us all, an inevitable part of this new " -"world. It holds the power of change. When we hold the bones, we hold the " -"power. Thus the strength. Together… they form a beautiful song." +"Only when you crush the bones of a body does it cease to rise. Only if you " +"examine the bones can you see what was. Thus is the story. Whatever causes" +" this change is alive, moving within us all, an inevitable part of this new " +"world. It holds the power of change. When we hold the bones, we hold the " +"power. Thus the strength. Together… they form a beautiful song." msgstr "" #: lang/json/talk_topic_from_json.py @@ -160593,7 +165037,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"There are others who follow this cause. You'd do well to aid them, for " +"There are others who follow this cause. You'd do well to aid them, for " "though we may not be numerous, we are emboldened by the songs we carry." msgstr "" @@ -160607,10 +165051,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The song can be weaved in many forms. Carved bone charms, weapons and armor " -"all hold immense power, and when the time comes, me and my kindred shall " -"gather a great amount of song and sing it to restore this world. Restore it," -" or end it. Makes no difference." +"The song can be weaved in many forms. Carved bone charms, weapons and armor" +" all hold immense power, and when the time comes, me and my kindred shall " +"gather a great amount of song and sing it to restore this world. Restore " +"it, or end it. Makes no difference." msgstr "" #: lang/json/talk_topic_from_json.py @@ -160620,7 +165064,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "We believe that enough power in one song could revert the Cataclysm - or " -"accelerate it to a time beyond all, ending it all the same. But with the " +"accelerate it to a time beyond all, ending it all the same. But with the " "world looking as is, both options are preferable." msgstr "" @@ -160636,8 +165080,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your mind is open. More than most. Perhaps one day, you too will feel the " -"power of the song and become Kindred. For now, Acolyte, listen, listen and " +"Your mind is open. More than most. Perhaps one day, you too will feel the " +"power of the song and become Kindred. For now, Acolyte, listen, listen and " "feel the song." msgstr "" @@ -160647,15 +165091,21 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Your skepticism does not surprise me. Perhaps one day, you too will hear the" -" inevitability of the song, feel its power. But until then, you will remain " -"an Acolyte, path to the Kindred closed." +"Your skepticism does not surprise me. Perhaps one day, you too will hear " +"the inevitability of the song, feel its power. But until then, you will " +"remain an Acolyte, path to the Kindred closed." msgstr "" #: lang/json/talk_topic_from_json.py msgid "Yeah, alright." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"The song is… quiet for now. Perhaps with time, more notes will be etched in" +" the bones of this world." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "An acolyte should not take on too many songs at once." msgstr "" @@ -160665,9 +165115,7 @@ msgid "That is all for now." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"The song is… quiet for now. Perhaps with time, more notes will be etched in" -" the bones of this world." +msgid "There are bones to etch, songs to sing. Wish to join me?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -160679,7 +165127,7 @@ msgid "Do you believe you can take on the burden of additional bones?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "There are bones to etch, songs to sing. Wish to join me?" +msgid "A song may yet be sung by you, should you wish to." msgstr "" #: lang/json/talk_topic_from_json.py @@ -160691,10 +165139,6 @@ msgid "" "I know of certain bones that could be of use, if you'd like to know more." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "A song may yet be sung by you, should you wish to." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I see." msgstr "我懂了。" @@ -160707,14 +165151,6 @@ msgstr "" msgid "Perhaps another time, Seer." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"If you wish to be set on the path to enlightenment, first you must learn to " -"listen and hear the song. Go out, butcher a creature and feel the power " -"between your fingertips. Then bring me the bones and I shall carve them for " -"you. " -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Well, I guess I oughta see where this goes. I'm in." msgstr "" @@ -160723,10 +165159,6 @@ msgstr "" msgid "Not interested." msgstr "沒興趣。" -#: lang/json/talk_topic_from_json.py -msgid "Excellent. Now be on your way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Consider it done. But I also wanted to ask…" msgstr "" @@ -160743,20 +165175,13 @@ msgstr "" msgid "I'm off then." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"The shambling corpses we see all around move in discord. Their song can be " -"used, but for an Acolyte, this would be needlessly hard. Be sure to carve an" -" unspoiled living creature." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "So, a creature that isn't a zombie, or a monster. Got it." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"The path to enlightenment is for you to walk. For me to aid you would " +"The path to enlightenment is for you to walk. For me to aid you would " "ultimately impede your progress and muddle your song." msgstr "" @@ -160767,7 +165192,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "You bear my mark, meaning I believe you have potential to learn to truly " -"listen to the Song. Yes, I will lend my skills to you, for now." +"listen to the Song. Yes, I will lend my skills to you, for now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -160782,11 +165207,6 @@ msgstr "" msgid "That's good, but I need to go at it alone right now. Maybe later." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "" -"I understand your reluctancy. Feel free to return when you see the way." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Maybe some other time. Changing the topic…" msgstr "" @@ -160798,14 +165218,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's not just walking horrors and monsters that have changed with the " -"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only " -"see it in others, but it happens to us, even you and I. How many times have " -"you fallen? Your flesh rent from your body, devoured. Or perhaps it was the " -"quiet whimper of death to exposure. But your bones rose again. Different " -"flesh, different name, sometimes even different knowledge, but the bones, " -"the same. We are all trapped in the same cycle. We just keep forgetting. " -"That's why we need to amass the Song. That's why it has to end, even if it " -"means the destruction, not restoration." +"Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only" +" see it in others, but it happens to us, even you and I. How many times " +"have you fallen? Your flesh rent from your body, devoured. Or perhaps it " +"was the quiet whimper of death to exposure. But your bones rose again. " +"Different flesh, different name, sometimes even different knowledge, but the" +" bones, the same. We are all trapped in the same cycle. We just keep " +"forgetting. That's why we need to amass the Song. That's why it has to " +"end, even if it means the destruction, not restoration." msgstr "" #: lang/json/talk_topic_from_json.py @@ -160832,6 +165252,14 @@ msgstr "忘掉我問的東西吧。" msgid "Skip it, let's get going." msgstr "跳過它,我們繼續。" +#: lang/json/talk_topic_from_json.py +msgid "Any hints about the world we now live in?" +msgstr "關於我們現在生活的世界有什麼提示嗎?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's talk about faction camps." +msgstr "我們來談談陣營營寨。" + #: lang/json/talk_topic_from_json.py msgid "What do you mean, \"mostly\" willing to follow my lead?" msgstr "" @@ -160991,13 +165419,13 @@ msgstr "" msgid "" "Hey, I'm a doctor! I know how to treat trauma. You give me some bandages " "or a bottle of antiseptic, I'm get you fixed when I see you hurting." -msgstr "" +msgstr "嘿,我是個醫生!你只要給我一些繃帶或一瓶消毒劑,當我看到你受傷時我就會治好你。" #: lang/json/talk_topic_from_json.py msgid "" "Yeah, I can perform first aid. You give me some bandages or a bottle of " "antiseptic, I'll treat your wounds as best I can." -msgstr "" +msgstr "嗯,我能進行急救。你給我一些繃帶或一瓶消毒劑,我會盡我所能治療你的傷口。" #: lang/json/talk_topic_from_json.py msgid "" @@ -161012,7 +165440,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I can help with some tasks if you show me where to work.\n" -" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" +" Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled or repaired, or a good fishing spot. Then talk to me about my current activity and tell me to sort stuff, or build stuff, or cut down trees, or repair or dismantle a vehicle, or do farmwork, or catch some fish, and I'll go off and do my best to get what you want done.\n" " If I need tools, you should leave them in a loot zone near where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I promise to put stuff back in an unsorted loot zone when I'm finished.\n" " I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much." msgstr "" @@ -161175,8 +165603,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"STOP, Put your hands in the air! Ha, startled you didn't I…there is no law " -"anymore..." +"STOP, Put your hands in the air! Ha, startled you didn't I… there is no law" +" anymore…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -161198,7 +165626,7 @@ msgstr "我要走了。" #: lang/json/talk_topic_from_json.py msgid "" "I was watching the station when things went sideways. None of the other " -"officers returned from the last call, well not as humans anyway..." +"officers returned from the last call, well not as humans anyway…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -161250,8 +165678,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "No, just no..." -msgstr "不要, 就只是不要" +msgid "No, just no…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Just let me sleep, !" @@ -161262,8 +165690,8 @@ msgid "Make it quick, I want to go back to sleep." msgstr "快一點啦, 我想要回去睡覺了。" #: lang/json/talk_topic_from_json.py -msgid "Just few minutes more..." -msgstr "再幾分鐘就好…" +msgid "Just few minutes more…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Anything to do before I go to sleep?" @@ -161292,14 +165720,14 @@ msgstr "" msgid "no, go back to sleep." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" -msgstr "什麼事,朋友?" - #: lang/json/talk_topic_from_json.py msgid " *pshhhttt* I'm reading you boss, over." msgstr "\"滋滋扑滋\" 我正聽著呢,老大,完畢。" +#: lang/json/talk_topic_from_json.py +msgid "What is it, friend?" +msgstr "什麼事,朋友?" + #: lang/json/talk_topic_from_json.py msgid "I want to give you some commands for combat." msgstr "我想給你一些戰鬥命令。" @@ -161308,6 +165736,68 @@ msgstr "我想給你一些戰鬥命令。" msgid "I want to set some miscellaneous rules." msgstr "我想設定一些行動規則。" +#: lang/json/talk_topic_from_json.py +msgid "I'd like to know a bit more about your abilities." +msgstr "我想進一步了解你的能力。" + +#: lang/json/talk_topic_from_json.py +msgid "There's something I want you to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I just wanted to talk for a bit." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you help me understand something? (HELP/TUTORIAL)" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm going to go my own way for a while." +msgstr "我要暫時分開一會。" + +#: lang/json/talk_topic_from_json.py +msgid "Let's go." +msgstr "我們走。" + +#: lang/json/talk_topic_from_json.py +msgid "" +" *tshk* Are you serious? This isn't a cell phone. Can it wait until we're " +"in the same place?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what did you want to say?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Mind if we just chat for a bit about your history?" +msgstr "介意我們閒聊一下你的過去嗎?" + +#: lang/json/talk_topic_from_json.py +msgid "Let's just chitchat for a while, I could use some relaxation." +msgstr "讓我們閒聊一會兒,我可以放鬆一下。" + +#: lang/json/talk_topic_from_json.py +msgid "I changed my mind, wanted to ask you something else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm all ears, my friend." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You gonna give me orders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What would you like?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Just say the word." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Can you teach me anything?" msgstr "你可以教我些東西嗎?" @@ -161332,14 +165822,6 @@ msgstr "守護這個地點。" msgid "I want to assign you to work at this camp." msgstr "我想指派你在這個營寨工作。" -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about your current activity." -msgstr "我們來談談你目前的行動。" - -#: lang/json/talk_topic_from_json.py -msgid "Let's talk about faction camps." -msgstr "我們來談談陣營營寨。" - #: lang/json/talk_topic_from_json.py msgid "Find a horse and mount up!" msgstr "找匹馬,騎上馬!" @@ -161353,32 +165835,20 @@ msgid "Please go to this location." msgstr "請到這個地點。" #: lang/json/talk_topic_from_json.py -msgid "I'd like to know a bit more about your abilities." -msgstr "我想進一步了解你的能力。" - -#: lang/json/talk_topic_from_json.py -msgid "Any hints about the world we now live in?" -msgstr "關於我們現在生活的世界有什麼提示嗎?" - -#: lang/json/talk_topic_from_json.py -msgid "Mind if we just chat for a bit about your history?" -msgstr "介意我們閒聊一下你的過去嗎?" - -#: lang/json/talk_topic_from_json.py -msgid "Let's just chitchat for a while, I could use some relaxation." -msgstr "讓我們閒聊一會兒,我可以放鬆一下。" +msgid "I want you to build a camp here." +msgstr "我要你在這裡建立一個營寨。" #: lang/json/talk_topic_from_json.py -msgid "Tell me about giving you orders (NPC TUTORIAL)." -msgstr "告訴我有關向你下命令的內容(NPC 教程)。" +msgid "We need to abandon this camp." +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm going to go my own way for a while." -msgstr "我要暫時分開一會。" +msgid "Show me what needs to be done at the camp." +msgstr "告訴營寨還需要什麼。" #: lang/json/talk_topic_from_json.py -msgid "Let's go." -msgstr "我們走。" +msgid "Let's talk about your current activity." +msgstr "我們來談談你目前的行動。" #: lang/json/talk_topic_from_json.py msgid "*will not engage enemies." @@ -161536,15 +166006,15 @@ msgstr "自由移動到與敵人交戰的地方。" msgid "Hold the line: don't move onto obstacles adjacent to me." msgstr "保持戰線:不要移動到與我相鄰的障礙物上。" -#: lang/json/talk_topic_from_json.py src/action.cpp src/activity_handlers.cpp -#: src/avatar.cpp src/avatar.cpp src/avatar_action.cpp src/avatar_action.cpp -#: src/avatar_action.cpp src/crafting.cpp src/game.cpp src/handle_action.cpp -#: src/handle_action.cpp src/handle_liquid.cpp src/handle_liquid.cpp -#: src/iexamine.cpp src/iexamine.cpp src/iexamine.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp -#: src/iuse_actor.cpp src/monexamine.cpp src/monexamine.cpp src/npc.cpp -#: src/pickup.cpp src/player.cpp src/player.cpp src/player.cpp -#: src/veh_interact.cpp src/vehicle_use.cpp +#: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py +#: src/action.cpp src/activity_handlers.cpp src/avatar.cpp src/avatar.cpp +#: src/avatar_action.cpp src/avatar_action.cpp src/crafting.cpp +#: src/crafting.cpp src/game.cpp src/handle_action.cpp src/handle_action.cpp +#: src/handle_liquid.cpp src/handle_liquid.cpp src/iexamine.cpp +#: src/iexamine.cpp src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse.cpp +#: src/iuse_actor.cpp src/iuse_actor.cpp src/iuse_actor.cpp src/monexamine.cpp +#: src/monexamine.cpp src/npc.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/player.cpp src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "沒事。" @@ -161749,11 +166219,11 @@ msgid "OVERRIDE: " msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py @@ -161920,10 +166390,6 @@ msgstr "" msgid "Stay at your current position." msgstr "留在原地。" -#: lang/json/talk_topic_from_json.py -msgid "Show me what needs to be done at the camp." -msgstr "告訴營寨還需要什麼。" - #: lang/json/talk_topic_from_json.py msgid "I'm currently ." msgstr "我目前 。" @@ -161996,60 +166462,6 @@ msgstr "* 嗤嗤* 十 - 四,我會去那裡,完畢。" msgid "Sure thing, I'll make my way there." msgstr "當然,我會去那裡。" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Yeah, this summer heat is hitting me hard, let's take a quick break, how " -"goes it ?" -msgstr "是的,夏天的炎熱使我難受,讓我們休息一下,,如何?" - -#: lang/json/talk_topic_from_json.py -msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" -msgstr "好吧,也許這能不讓我在這種天氣被凍僵,如何?" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Well, I'm feeling pretty sick… are you doing OK though?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, so… " -"what's up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "" -"Now, we've got a moment, I was just thinking it's been a month or so since… " -"since all this, how are you coping with it all?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Oh you know, not bad, not bad…" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -162104,21 +166516,21 @@ msgid "Hello there." msgstr "哈囉你好。" #: lang/json/talk_topic_from_json.py -msgid "Okay, no sudden movements..." -msgstr "很好, 別突然亂動…" +msgid "Okay, no sudden movements…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep your distance!" msgstr "保持你的距離!" -#: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." -msgstr "這是我的地盤,。" - #: lang/json/talk_topic_from_json.py msgid "" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is my territory, ." +msgstr "這是我的地盤,。" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "冷靜點。我不會傷害你。" @@ -162171,30 +166583,30 @@ msgstr "怎麼了?" msgid "I don't care." msgstr "我不在乎。" -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "我已經沒有可以給你辦的工作了。" - #: lang/json/talk_topic_from_json.py msgid "I don't have any jobs for you." msgstr "我沒有可以給你的工作。" #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" -msgstr "我有更多的工作給你。想要聽看看嗎?" +msgid "I don't have any more jobs for you." +msgstr "我已經沒有可以給你辦的工作了。" #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "我有其他的工作給你。想要聽看看嗎?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "我只有一件工作給你。想要聽看看嗎?" +msgid "I have more jobs for you. Want to hear about them?" +msgstr "我有更多的工作給你。想要聽看看嗎?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "我有另一件工作給你。想要聽看看嗎?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "我只有一件工作給你。想要聽看看嗎?" + #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp msgid "Oh, okay." @@ -162204,6 +166616,10 @@ msgstr "喔, 好吧。" msgid "Never mind, I'm not interested." msgstr "別在意, 我沒興趣。" +#: lang/json/talk_topic_from_json.py +msgid "You're not working on anything for me now." +msgstr "你現在並沒有幫我做任何工作。" + #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "哪件工作?" @@ -162212,10 +166628,6 @@ msgstr "哪件工作?" msgid "What about it?" msgstr "這樣如何?" -#: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "你現在並沒有幫我做任何工作。" - #: lang/json/talk_topic_from_json.py msgid "I'll do it!" msgstr "我會做的!" @@ -162424,6 +166836,10 @@ msgstr "嗯, 好吧。" msgid "Thanks!" msgstr "謝謝!" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "專心路況,夥伴!" + #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "我必須專心路況!" @@ -162448,17 +166864,13 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "我有些苦衷,不能告訴你。" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "專心路況,夥伴!" - #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "啊,好的。" #: lang/json/talk_topic_from_json.py -msgid "Not until I get some antibiotics..." -msgstr "我還沒找到抗生素…" +msgid "Not until I get some antibiotics…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "You asked me recently; ask again later." @@ -162556,22 +166968,22 @@ msgstr "不, 我待在這就好了。" msgid "On second thought, never mind." msgstr "我再想想, 抱歉。" +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "你在駕駛車輛時我無法訓練你。" + #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "我在駕駛車輛時無法訓練你。" #: lang/json/talk_topic_from_json.py -msgid "Give it some time, I'll show you something new later..." -msgstr "給我點時間, 我會讓你看些新玩意…" +msgid "Give it some time, I'll show you something new later…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I have some reason for denying you training." msgstr "我有些苦衷,不能接受你的訓練。" -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "你在駕駛車輛時我無法訓練你。" - #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "我才不要, 我會被丟在後面沒人理!" @@ -162593,8 +167005,8 @@ msgid "See you around." msgstr "待會見。" #: lang/json/talk_topic_from_json.py -msgid "I really don't feel comfortable doing so..." -msgstr "這麼做讓我不是很舒服…" +msgid "I really don't feel comfortable doing so…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll give you some space." @@ -162665,8 +167077,8 @@ msgid "Thanks, see you later!" msgstr "謝了, 待會見!" #: lang/json/talk_topic_from_json.py -msgid "You picked up something that does not belong to you..." -msgstr "你拿了不屬於你的東西..." +msgid "You picked up something that does not belong to you…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Okay, okay, this is all a misunderstanding. Sorry, I'll drop it now." @@ -162759,13 +167171,13 @@ msgid "You might be seeing more of me…" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hey again. *kzzz*" +msgid "Hey again. *kzzz*" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person " -"I've seen in a long time." +"I… I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first " +"person I've seen in a long time." msgstr "" #: lang/json/talk_topic_from_json.py @@ -162787,7 +167199,7 @@ msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*buzz* Great! So what happens now?" +msgid "*buzz* Great! So what happens now?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -162800,7 +167212,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"...Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " +"…Wait. *BEEP* Why do I believe you? *ZZZT* You could be just as bad as " "them!" msgstr "" @@ -162822,7 +167234,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" +"Okay, okay, *BUZZ* I'm sorry! Don't hurt me again! Anything but the chip!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -162838,7 +167250,7 @@ msgid "No, *I'm* sorry, I didn't mean that. Go do what you want." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...kill… *ZTZTZT* …you!" +msgid "…kill… *ZTZTZT* …you!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -162873,14 +167285,6 @@ msgstr "告訴我陣營營寨如何運作。" msgid "Tell me how faction camps have changed." msgstr "跟我說說陣營營寨有甚麼變化。" -#: lang/json/talk_topic_from_json.py -msgid "I want you to build a camp here." -msgstr "我要你在這裡建立一個營寨。" - -#: lang/json/talk_topic_from_json.py -msgid "We need to abandon this camp." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." msgstr "沒事。 我們談點別的吧。" @@ -163109,8 +167513,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " -"talk..." -msgstr "你確定嗎?這裡看起來不太安全呢,不太適合閒聊..." +"talk…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." @@ -163132,6 +167536,50 @@ msgstr "你想談什麼?" msgid "Actually, never mind." msgstr "其實,沒關係。" +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid " " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" msgstr "是的,朋友?" @@ -163153,7 +167601,7 @@ msgid "May the earth flourish beneath our paths." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Unity of spirit, of mind, and body..." +msgid "Unity of spirit, of mind, and body…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -163337,8 +167785,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"I grew up on the farm, I don't know much about ghosts and goblins, but I've" -" spent a lot of time growing food and I work hard. It's better in the " +"I grew up on the farm, I don't know much about ghosts and goblins, but I've " +"spent a lot of time growing food and I work hard. It's better in the " "country, cleaner. Not as dangerous. I hope." msgstr "" @@ -163912,8 +168360,8 @@ msgid "Nevermind me, I'm just going to leave." msgstr "別在意我,我要走了。" #: lang/json/talk_topic_from_json.py -msgid "Indeed it is I! The one and only FOODPERSON!" -msgstr "確實是我!唯一的美食人!" +msgid "Indeed it is I! The one and only FOODPERSON!" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Wow! Such an honor to meet you in person!" @@ -164356,6 +168804,38 @@ msgstr "" msgid "Huh." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I barely understand what's going on *now*. Why do you think I'd know how " +"the world ended?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"OK, fine. Can you at least tell me what you remember about the events " +"leading up to now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What, don't you remember? No, sorry, that's not fair, it was a weird time." +" OK, well, I guess this all started with the riots, didn't it? We were " +"just leading our lives, doing our jobs, and then people started rioting. " +"Not the usual protests that turned violent or anything, either, people just " +"left their houses and started breaking shit. The news tried to downplay it " +"but they couldn't keep it off the internet. I don't know what caused it, " +"they said it was some kind of drug or toxin in the water? Still, I didn't " +"really realize how bad it was getting at first. Somewhere along the way the" +" \"rioters\" started getting up and walking around with holes in their " +"chests, and that's when the real panic took over. The next few days - or " +"weeks, not really sure - are a blur to me. You'd have to ask someone else " +"how we got from there to total collapse." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for filling me in." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was a cop. Small town sheriff. We got orders without even really knowing" @@ -164408,8 +168888,8 @@ msgid "" "tented around me. I wasn't even too badly hurt. I grabbed as much gear as " "I could, and I slipped out. It was night. I could hear fighting farther " "away in the city, so I went the other way. I made it a few blocks before I " -"ran into any ... I ran from them. I ran, and I ran, and I ran " -"some more. And here I am." +"ran into any … I ran from them. I ran, and I ran, and I ran some " +"more. And here I am." msgstr "" #: lang/json/talk_topic_from_json.py @@ -164675,6 +169155,30 @@ msgstr "" msgid "Thanks for telling me that stuff. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"So, like, there were some really bad riots, okay? Everyone got realy " +"violent and nasty, and to be honest, I was on a bit of a spirit journey for " +"a lot of it and I don't really remember too well. But the weirdest part is," +" nobody even *cared* about each other. It's like all our caring got sucked " +"away. I think it was some kind of negative energy thing. And also that " +"made the dead, like, come back to life and stuff. Plus, like, there were " +"some monsters? I'm not really sure how they fit in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You seem to know a lot, what do you think caused it all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"That's a tough one, but I keep thinking back to this dream I had like, a " +"year before it all started. I dreamed there was this big ball of evil " +"energy that was just waiting to suck up all the good thoughts on the earth " +"and turn us into monsters and things? So I guess that's what I think " +"happened. Everything else just seems too far-fetched, you know?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I made it to one of those evac shelters, but it was almost worse " @@ -164724,6 +169228,24 @@ msgid "" "died in the crash, but I am not going back to find out." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"What happened? I'm not really sure. You must know about the riots and all " +"that, that the government and the police totally failed to contain. I don't" +" have a good guess what caused that. I thought it was the usual stuff at " +"first, and I gotta admit, I was sort of excited and scared it was the start " +"of a revolution. Not excited enough to join in though, and I guess anyone " +"who was is probably dead now. I tried to wait it out at home, packed a " +"little bug-out bag, but then the internet started showing videos of rioters " +"getting back up and fighting with crazy injuries. I don't know how many " +"people really believed it at first, but I took that as my sign and ditched " +"town for the evac shelter. I don't know exactly what happened after that. " +"The center I was in was heavily vandalized and empty, and I never saw anyone" +" else. The cell phone grid was locked up, except for one emergency message " +"that came through around a day later saying the government had fallen. " +"Power went out a few days later." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as most people who didn't get killed straight up during the riots. I " @@ -164757,6 +169279,21 @@ msgstr "" msgid "What do you think happened? You see them around anywhere?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I assume you know about the riots and the military and police and the " +"freakin' nightmare monsters walking the earth beside zombies, right? If " +"you're asking what I think caused it all, well, I dunno. My best guess it " +"was some huge government overreach, maybe some kind of experimental " +"bioweapon that got away. They tried to lie so much at the start about " +"everything that was going on, I don't think the whole 'Chinese attack' shit " +"measures up. They were trying to cover something up. As for the real end " +"times, maybe the rest of the world tried to contain it. I heard there were " +"honest-to-god nukes going off here on American soil. To me that seems like " +"somewhere else, maybe Europe, trying to get whatever is going on here " +"contained. Maybe it even worked. It's bad now but it's not like it was." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "There's nothing too special about me, I'm not sure why I survived. I got " @@ -164813,6 +169350,40 @@ msgid "" "pretty good life compared to those first few months." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woah, , I don't even know where to start. The riots? I think it " +"was going on sooner than that. There were bad murmurs going on a few weeks " +"before that happened. Lots of really scary crimes, not your usual stuff but" +" like cannibalism and some real unspeakable shit, you know? When the riots " +"started, I think I was already primed to think of it as something different " +"from a normal equality riot or anything like that. I think that's part of " +"how I got out safer, I had had some time to get some stuff and get going, " +"and didn't try to make shopping trips. People were abso-fuckin-lutely crazy" +" in those days. It was a lot like the pandemic a few years back, except the" +" police were out in the streets in force, gunning people down like it was " +"going out of style." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do you have any idea what the actual cause was?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Not really. Government fed us all kinds of conflicting stories, and there " +"was some absolutely heinous stuff going on. I mean, you can't have missed " +"that video of the woman killing her own baby, right? God, that still gives " +"me nightmares. I don't know what it was about it, something about the look " +"on her face. Worse stuff came out of course, and now we've both seen worse " +"things with our own eyes, but that one still comes back to haunt me. " +"Anyway, they never could control the riots, and by the time the rioters " +"started turning into undead it was way too late. I don't know if morale " +"just broke or what but I heard rumours the military and police started " +"turning on each other as much as the crowds. What actually made the dead " +"come back to life though? I haven't got a clue." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "They were shipping me with a bunch of evacuees over to a refugee center, " @@ -164821,6 +169392,50 @@ msgid "" "out of there." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Don't leave me hanging, what happened next?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I ran until I felt like my lungs were going to jump right out of my mouth. " +"I holed up in the forest for the night, under a fir tree. In the morning I " +"heard someone talking, so I went to see. I was playing it pretty careful " +"though, there were still a lot of psychos and rioters around. I snuck up on" +" some kind of thing, some monster worse than any zombie. Some huge bug " +"thing, saying random phrases like some kind of broken tape recorder. It was" +" dragging a few human bodies behind it, I couldn't tell if they were dead or" +" unconscious. Honestly I didn't wait to find out, I ducked into the bushes " +"and tried not to breath until I couldn't hear it anymore." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Where did you go from there?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Once I was okay leaving the bushes, I made my way to an old shed I could see" +" a ways off. It was falling in but it kept the rain and wind off and gave " +"me a place out of sight. I stayed there until I ran out of those ass-" +"tasting ration bars I'd filled my backpack with. Then I took on the " +"wanderin' life until we met." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What's this, some kinda Back to the Future thing? How could you not know " +"what happened? The world damn well ended, that's what. And it didn't start" +" with an earthquake, birds, snakes, or aeroplanes. It started with riots, " +"and they had to dispatch cops and then the military to take care of the " +" criminals. The government tried to pad it claiming it was some kind" +" of mind control, but I didn't see too much different from the usual " +"bullshit: entitled babies looking for an excuse to break the law. It just " +"got way worse, this time, until it was time to get out of dodge. I heard " +"rumours they were even bombing some of the urban centers to try to control " +"it - which, I have to admit, is maybe a bit too hard-core." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My Evac shelter got swarmed by some of those bees, the ones the size of " @@ -164862,6 +169477,27 @@ msgstr "" msgid "Right. Sorry." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay listen. Don't believe that government stuff. There's a common thread " +"to all of it: the riots, the military failing to contain it, even the giant " +"monsters they said were appearing in the last few days and had to be wiped " +"out with nukes." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You've got my attention." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You ever see the Matrix? This is it. In real life. To keep us locked in " +"here, the creators of the simulation have to make sure we're just the right " +"level of miserable. I think their algorithms got messed up though, and went" +" into overdrive, because all this is a little implausible. Still, I guess " +"we're still jacked in, so maybe it's working." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Well, I was at home when the cell phone alert went off and told me to get to" @@ -164874,6 +169510,19 @@ msgid "" " No idea what happened to all those people." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I gotta be honest with you, I heard a lot of stories back at the shelter, " +"and only one of them really stuck. This is some kind of science experiment " +"gone wrong. I don't know what caused the riots and the undead in the first " +"place, but there's no way it's this out of control everywhere. Yeah, I got " +"the same 'the government has fallen' text as everyone, but it doesn't make " +"*sense* that it could be so widespread so fast. I think we're in some sort " +"of exclusion zone, where they're letting whatever is going on run its course" +" to see how it works so they can fight it better next time. Somewhere out " +"there, outside the zone, it's more or less business as usual." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "That's a tall order. I guess the short version is that I got evacuated to a" @@ -164945,6 +169594,42 @@ msgstr "" msgid "Sorry for asking. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Woof, you ready for a real hot take? The government did this to us." +" Intentionally, or at least sort-of intentionally." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Damn right. They lied to us for god knows how long about what was going on " +"because they didn't want us to figure it out. It probably started as a way " +"to keep the people in line, but it backfired somehow. My guess is they " +"tried to de-educate us, tried to mislead us, and when that wasn't working " +"they tried actual drugs in the water to make us stupid or something. " +"Instead of just stupid, some people got violent. Then they tried to " +"leverage that to put in martial law, but that didn't work and they wound up " +"fighting hordes of people. Only they didn't realize their brain " +"drugs were some kind of mutagen that turn people into zombies." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about all the other stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I think it's mostly mutation. I don't know what they used, but it's some " +"real mad science shit, I didn't think most of this was even possible. I " +"also wonder if whatever they put in the water has made us a bit crazy. " +"Maybe some of this is just a hallucination? That one blows my mind a bit, " +"I'm not sure I believe it but I got nothin' else." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I'm not from around here… You can probably tell from the accent, I'm from " @@ -165534,6 +170219,48 @@ msgid "" "woods. I wasn't doing a great job of it, so I'm kinda glad you showed up." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, so, hear me out. This might sound crazy, but we're dealing with the " +" walking dead, so I think I get a pass on that. You know your Greek " +"mythology at all?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not really. How is that relevant?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, why?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Okay, well, I know this sounds like an Indiana Jones B-plot, but I think " +"someone found Pandora's Box, the actual thing or close to it. I think they " +"tried to somehow harness it, to use the power in it for something. Maybe " +"even something good, who knows, the power of the gods seems like it would be" +" a green energy source to me. Whatever it was, they screwed it up, and " +"released it for real. Not just a metaphorical thing like in the stories, " +"but actually set the forces of Hades loose on Earth. Yeah, I know it's " +"farfetched, but like I said: I think I get a pass on that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What? Pandora's box?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"According to legend, Pandora was in the house of the gods and found an " +"unopened box. She decided to investigate, and when she opened it and " +"unthinkable horrors and diseases spilled out. Sound familiar?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, what's that go to do with anything?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I was home with the flu when the world went to shit, and when I recovered " @@ -165579,6 +170306,128 @@ msgstr "" msgid "Thanks for telling me all that. " msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"You mean what caused the riots and all that? Well, they told us it was a " +"Chinese bioweapon but I have troubles believing anyone could engineer a " +"bioweapon that could do all this. The only answer I can come up with, silly" +" though it sounds, is aliens." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You think this is an invasion?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, maybe, but I'd guess it's too disorganized to be a proper invasion. " +"If I had to guess, I'd say there was something locked in the polar ice. " +"Like, remember a few years back there was that big thing online about an " +"alien body found in the ice? I don't know if you remember but it was all " +"over the news for a while until it turned out to be a hoax. Only, since " +"then, I've seen some aliens walking around that look a *lot* like that ice " +"body. Maybe it wasn't a hoax, maybe that was a cover-up. So, maybe those " +"aliens had some kind of virus. It went around the world and infected " +"everything silently until, somehow, it activated and caused the violence and" +" monsters and mutations." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Let's not dance around it: I joined the riots, at first. I don't really " +"remember what I was thinking. I'd protested stuff like police brutality " +"before, but this was different. I didn't make a sign and go down there " +"expecting to chant and march, I grabbed a bat and went outside planning to " +"fuck shit up. I've never felt so angry before. The riots had already been " +"going on a while at that point, and to me, it just looked like the " +"government trying to squash the people again." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Those rioters had a reputation for being absolutely psycho." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not many people made it out of the riots alive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, you're telling me. The rioters… they weren't even like humans, let " +"alone protestors. Nothing like any protest I'd ever been in before. That " +"didn't stop me. I joined them, and I was as bad as a bunch of them. " +"Smashed windows, beat up bystanders, burnt cars. I remember ripping riot " +"gear off a cop and… nevermind. I don't want to remember that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How did you survive?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What made you come back?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"At some point, I felt like I was waking up. It was around the time they " +"were busting out those humvees with riot control turrets on top. Says " +"something about my frame of mind that I don't even remember if I'd seen them" +" before that point. Anyway I heard the gunfire going off and just kinda " +"realized I was on the edges of a mob charging a heavily armed military " +"emplacement. That's when I started seeing the mob for what it was, seeing " +"the wild-eyed animals, even the zombies. I turned and ran." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I honestly don't know. I wonder if some of the others would have come back " +"to their senses, given time. I don't think I'm anything special. Maybe a " +"lot of them did, and just weren't on the edge of the crowd at the time. " +"I'll tell you, almost as soon as I came back to myself, I could see some of " +"the rioters looking at me like I was prey. I didn't stick around to see " +"what would happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I knew the city pretty well. I went for an abandoned building I knew about," +" headed through a broken window, and holed up in there for a few days. I " +"had a fair bit of stolen food and I just kept to myself. When things " +"started to quiet down, I headed out, and here I am." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, I remember the time leading up to the riots, same as anyone. Things " +"were bad, there were some really awful crimes being reported in the news, " +"and there was a lot of racial tension as usual from the way the cops were " +"handling it. Then people started rioting, which isn't unusual, but it was " +"weird the kind of places that the riots were starting in. Like, upper " +"middle class neighbourhoods, midwestern small towns, things like that. " +"Anyway, I joined the riots and I don't remember a lot of clear stuff after " +"that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You joined the riots?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You must have some insights into what caused all this, then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Kinda, I guess. I heard people blaming the riots on some kind of mind " +"control drug, and frankly I'm not sure that's far off base. That's kinda " +"what it felt like, although the whole time I really felt like myself. It " +"wasn't until I snapped out of it that I realized how weird it was. That " +"doesn't explain anything else though: the zombies, the monsters, all this " +"stuff is way off base. Anything I've tried to guess just sounds like bad " +"science fiction, like demonic curses or alien weapons kinda stuff." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My husband made it out with me, but got eaten by one of those plant " @@ -165845,13 +170694,48 @@ msgstr "" msgid "I can respect that." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I don't really want to talk about the time before, you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Keep it vague if you want, but please, can you fill me in a little?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I - fine. Drugs in the water, some kind of bioweapon I guess. You know how" +" things were with China, they blamed it on them mostly. Made people violent" +" and ugly. There were riots. People I cared about joined them, and I guess" +" I'll never know why. Riots led to military and police action, which made " +"the riots worse. People acted like animals, not just the rioters but " +"everyone. Then came the monsters and nightmares walking the world like real" +" Armageddon, and everyone died, and started coming back as monsters " +"themselves. There's your story. If you want more, talk to someone else." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thanks for that." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"To be honest… I don't really remember. I remember vague details of my life" +" before the world was like this, but itself? It's all a " +"blur. I think something pretty bad must have happened to me. I remember a " +"few things: snatches of violence, something about a woman killing her baby." +" I feel like I'd rather not remember." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "To be honest… I don't really remember. I remember vague details of my life" " before the world was like this, but itself? It's all a " "blur. I don't know how I got where I am now, or how any of this happened. " "I think something pretty bad must have happened to me. Or maybe I was just " -"hit in the head really hard. Or both. Both seems likely." +"hit in the head really hard. Or both. Both seems likely. First thing I " +"remember is seeing an already-read text on my phone from the emergency " +"government broadcast system, saying the United States had fallen." msgstr "" #: lang/json/talk_topic_from_json.py @@ -165937,6 +170821,43 @@ msgid "" " ask again." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"You're asking me what I think caused all this? It was all over the news. " +"Some kind of Chinese bio-weapon. It's no different from the pandemic a few " +"years back, but this time they got the formula right. Maybe too right. " +"Doesn't matter anyway, I hear it got out on them and wiped them out too. " +"Serves em right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me more about what actually went down, though?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "How does that explain all the other crazy stuff?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, you know. First there were the riots from the mind-control drugs in " +"the water. Except I think we can all see now it was actually a virus again." +" The military and the cops did their damndest to put it down but it got out" +" of hand. Then the virus mutated and started bringing the dead back to life" +" like in some kinda B-movie, and shit got really real. They let the big " +"things loose, or they set them on us, I dunno. Huge unspeakable monsters… " +"still makes me shudder to think of them. They obviously weren't built for " +"combat though, and the military took 'em down fast." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"What? Of course it does. They started with a bioweapon and then it went " +"full nuclear. Only the weapons we had now were a lot worse than H-bombs. " +"Uncle Sam managed to beat back the really nasty stuff, but I guess it was " +"with his dying breath." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Let's not talk about it, ok? It just hurts to think about. I've lost so " @@ -166230,7 +171151,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Tax evasion. I was an accountant, and I helped my boss move a hell of a lot" -" of money in some very clever ways. Not clever enough, it turns out..." +" of money in some very clever ways. Not clever enough, it turns out…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -166404,6 +171325,32 @@ msgid "" "odds." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"It's clear enough, isn't it? That… that end, was the Rapture. I'm still " +"here, and I still don't understand why, but I will keep Jesus in my heart " +"through the Tribulations to come. When they're past, I'm sure He will " +"welcome me into the Kingdom of Heaven. Or… or something along those lines." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I meant more the actual events. What happened?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Oh. Well, I think it follows the good word in Revelations, if I remember " +"right. I haven't talked to a preacher in a bit, you know. There were the " +"plagues… the first one was the one a couple years ago, that big pandemic, " +"that was when people started talking about the end being near. Then there " +"was a plague of blood, or was it violence? That was the riots. Then the " +"seas turned red with blood, that was from all the people being shot. Then a" +" plague of fire, I remember that one for sure, that was when there were " +"bombs and things going off everywhere to try to contain the riots. And then" +" demons and monsters walked the Earth, and the dead rose from their graves, " +"and finally the meek inherited. Clear as day." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Same as anyone. I turned away from God, and now I'm paying the price. The " @@ -166411,6 +171358,23 @@ msgid "" "Hell on Earth. I wish I'd paid more attention in Sunday School." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Well, I guess that was the Rapture. It didn't play out how I thought it " +"would. They made me think it was gonna be a flash of light and then *poof*," +" everyone's gone. Instead it was messy and dirty. Riots in the streets, " +"the military and police serving the Antichrist to gun down the people like -" +" what was it my dad used to say - like wheat before the chaff? Then when " +"we'd really showed our Sin, God came in with the real plagues. The dead " +"started walking, getting up with machine gun holes in them to fight the " +"military, and the military started turning on each other too. After that, " +"the legions of Hell itself came out. Huge monsters, worse than anything I'd" +" ever imagined, just tore through the cities ripping everything to shreds. " +"Then they started dying off as quick as they'd arrived, and we were left " +"trying to run and hide from the undead. A day or two later the power " +"started going out." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I lived alone, on the old family property way out of town. My husband " @@ -166624,10 +171588,6 @@ msgstr "" msgid "What was working for the Old Guard like?" msgstr "替舊日守衛工作是什麼感覺?" -#: lang/json/talk_topic_from_json.py -msgid "Thanks for that." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "Thanks for that. Let's get going." msgstr "" @@ -166839,6 +171799,22 @@ msgstr "" msgid "What were you saying before that?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I'll be honest with you, I was paying more attention to wedding planning " +"than current events leading up to things. I knew there were riots going on," +" but they were out of town. Even when they got closer to home, I tried to " +"ignore them so we could have our big day. After the zombies started coming," +" though, well that's when stuff got really weird. When I was running from " +"the wedding I swear I saw the sky rip open and monsters fly out of the hole," +" like something out of Independence Day. I don't know what it all was, it " +"looked like black magic or something." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Hey there." msgstr "" @@ -167362,7 +172338,7 @@ msgid "You should get off my farm, I won't deal with a government stooge." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Go on..." +msgid "Go on…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -167759,10 +172735,6 @@ msgid "" " catastrophe." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Go on ..." -msgstr "繼續 ..." - #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" msgstr "告訴我關於你妻子的事,她在附近嗎?" @@ -168399,15 +173371,15 @@ msgstr "好的,我也會和他們談談。" msgid "All right! Let's get going." msgstr "好! 我們走吧。" +#: lang/json/talk_topic_from_json.py +msgid "We've done it! We've solved the list!" +msgstr "我們做到了!我們已經完成這個清單!" + #: lang/json/talk_topic_from_json.py msgid "" "How's things with you? My cardboard collection is getting quite impressive." msgstr "你好嗎?我的紙板收藏已經相當可觀了。" -#: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "我們做到了!我們已經完成這個清單!" - #: lang/json/talk_topic_from_json.py msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "朋友,我告訴過你關於硬紙板的事嗎?你有硬紙板嗎?" @@ -169175,7 +174147,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " +"Gross, isn't it? Feels like pubes. I just started growing it everywhere a " "little while after the Cataclysm. No idea what caused it. I can't blame " "them for hating it, I hate it." msgstr "" @@ -169901,7 +174873,7 @@ msgid "" "Guitar's my baby. You like folk and the blues, friend? Well, that was my " "bag and I sure could please my own ear with em, anyway. Folks who's bein' " "generous might also say it pleased theirs. Problem is, I seem to be between" -" guitars right now, you know? Temporarily guitar-light, if you get my " +" guitars right now, you know? Temporarily guitar-light, if you get my " "saying. Problem is, in the run for my life, I had to use old Jasmine as a " "bit of a billy club. Had to curb some rowdy dudes on my way here. It was " "her or me, you understand? You wouldn't begrudge a man breakin' his " @@ -170963,12 +175935,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Dana and I were evacuated early, because of her pregnancy. They took us to a" -" concentration center, and then we got on a bus to come here. The bus " -"though, it was rolled over by a giant monster, and many died. We made it out" -" along with a few others, and we kept going until we made it here. It wasn't" -" much farther, and for some reason the monster didn't chase us, just kept " -"tearing at the bus." +"Dana and I were evacuated early, because of her pregnancy. They took us to " +"a concentration center, and then we got on a bus to come here. The bus " +"though, it was rolled over by a giant monster, and many died. We made it " +"out along with a few others, and we kept going until we made it here. It " +"wasn't much farther, and for some reason the monster didn't chase us, just " +"kept tearing at the bus." msgstr "" #: lang/json/talk_topic_from_json.py @@ -171096,12 +176068,12 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It's a long, long story. I'm not from around here, I'm actually from way " -"out in Western Canada. I'd always wanted to see New England, and I was down " -"here on vacation when, well, you know. I got evacuated, but because I'm not" -" a US citizen they weren't willing to take me downstairs. I can understand " -"that, even if I don't like it much. To tell you the truth I'm still coming " -"to terms with the fact that I'll probably never know how my family and my " -"band are doing." +"out in Western Canada. I'd always wanted to see New England, and I was down" +" here on vacation when, well, you know. I got evacuated, but because I'm " +"not a US citizen they weren't willing to take me downstairs. I can " +"understand that, even if I don't like it much. To tell you the truth I'm " +"still coming to terms with the fact that I'll probably never know how my " +"family and my band are doing." msgstr "" #: lang/json/talk_topic_from_json.py @@ -171166,7 +176138,7 @@ msgid "Hm? Oh, hi." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "...Hi." +msgid "…Hi." msgstr "" #: lang/json/talk_topic_from_json.py @@ -171530,8 +176502,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Even once we got things sorted out, there weren't enough beds for everyone, " -"and definitely not enough supplies. These are harsh times. We're doing what" -" we can for those folks… at least they've got shelter." +"and definitely not enough supplies. These are harsh times. We're doing " +"what we can for those folks… at least they've got shelter." msgstr "" #: lang/json/talk_topic_from_json.py @@ -171548,9 +176520,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We didn't have great organization when we first arrived. A few of the " +"We didn't have great organization when we first arrived. A few of the " "earliest arrivals set up a triage and sorting system, with the sick and " -"infirm getting set aside to wait. It's cruel, but we could see there was " +"infirm getting set aside to wait. It's cruel, but we could see there was " "only space for so many, and we didn't know what was causing people to turn " "into zombies at the time, so we were trying to quarantine out infection. A " "couple folks died in there, and it escalated. One of the first people here," @@ -171879,8 +176851,8 @@ msgid "" msgstr "我們不想容忍像垃圾一樣的你, 做完你的事, 然後滾。" #: lang/json/talk_topic_from_json.py -msgid "I'm not in charge here, you're looking for someone else..." -msgstr "我在這並不是管事的, 你應該要找別人…" +msgid "I'm not in charge here, you're looking for someone else…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Keep civil or I'll bring the pain." @@ -171927,12 +176899,12 @@ msgid "Well, I'd better be going. Bye." msgstr "我想我要走了,再見。" #: lang/json/talk_topic_from_json.py -msgid "Welcome marshal..." -msgstr "歡迎法警…" +msgid "Welcome marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Welcome..." -msgstr "歡迎…" +msgid "Welcome…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -172168,12 +177140,12 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Marshal..." -msgstr "法警…" +msgid "Marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Citizen..." -msgstr "公民…" +msgid "Citizen…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Can I trade for supplies?" @@ -172779,7 +177751,7 @@ msgstr "" msgid "" "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" "\n" -"the intercom: Hmm wait, we might not have your size..." +"the intercom: Hmm wait, we might not have your size…" msgstr "" #: lang/json/talk_topic_from_json.py @@ -172826,6 +177798,18 @@ msgstr "" msgid "Got it." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Better keep our eyes on the road." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Better be careful around here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes?" +msgstr "嗯?" + #: lang/json/talk_topic_from_json.py msgid "Something to say?" msgstr "有話要說嗎?" @@ -172838,14 +177822,14 @@ msgstr "" msgid "Hey." msgstr "嗨!" -#: lang/json/talk_topic_from_json.py -msgid "Yes?" -msgstr "嗯?" - #: lang/json/talk_topic_from_json.py msgid "Good to see you." msgstr "很高興見到你。" +#: lang/json/talk_topic_from_json.py +msgid "About those jobs…" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Good to see you around." msgstr "很高興有機會再見到你。" @@ -172855,8 +177839,8 @@ msgid "Want help with something else?" msgstr "需要其他幫助嗎?" #: lang/json/talk_topic_from_json.py -msgid "Never mind, I was about to leave." -msgstr "沒關係,我正要離開。" +msgid "Lets set a combat strategy" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" @@ -172909,6 +177893,10 @@ msgstr "有什麼有趣的事嗎?" msgid "Anything on your mind?" msgstr "你有什麼想法嗎?" +#: lang/json/talk_topic_from_json.py +msgid "Want help with something?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "What do you know about our employers?" msgstr "你對我們的雇主了解多少?" @@ -172951,16 +177939,16 @@ msgid "Now that you mention it, it does seem rather strange." msgstr "既然你提到它,它似乎真的很奇怪。" #: lang/json/talk_topic_from_json.py -msgid "Thinking I should go hunt something soon..." -msgstr "我想我應該盡快去獵點東西..." +msgid "Thinking I should go hunt something soon…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Wondering if things will get better someday..." -msgstr "想知道是否有一天會變得更好..." +msgid "Wondering if things will get better someday…" +msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hmm? Nothing, I guess I just like resting in this place." -msgstr "嗯?沒什麼,我想我只是喜歡在這個地方休息。" +msgid "Hmm? Nothing, I guess I just like resting in this place." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Have you ever noticed how… wait no, never mind." @@ -172999,8 +177987,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " -"marshal..." -msgstr "路上仍有很多不法分子,也許你該專心做好你的工作,法警..." +"marshal…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "You see anything you want, marshal?" @@ -173068,8 +178056,8 @@ msgid "I can't imagine what I'd need your assistance with." msgstr "我想不到會需要你的什麼幫助。" #: lang/json/talk_topic_from_json.py -msgid "Stand still while I get my clippers..." -msgstr "站著別動, 讓我把剪刀拿過來…" +msgid "Stand still while I get my clippers…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Thanks…" @@ -173447,8 +178435,8 @@ msgid "" msgstr "我個人並不需要。回收車輛的團隊需要更多幫手, 但他們通常都在前哨外面, 不容易碰見。" #: lang/json/talk_topic_from_json.py -msgid "Please leave me alone..." -msgstr "請離我遠一點…" +msgid "Please leave me alone…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "What's wrong?" @@ -173466,15 +178454,14 @@ msgstr "那真不幸。" #: lang/json/talk_topic_from_json.py msgid "" -"I don't know what you could do. I've tried everything. Just give me " -"time..." -msgstr "我不知道你能做些什麼。我嘗試了所有方法。給我點時間就好…" +"I don't know what you could do. I've tried everything. Just give me time…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I keep getting sick! At first I thought it was something I ate but now it " -"seems like I can't keep anything down..." -msgstr "我一直在生病! 起初我還以為自己吃了壞東西, 但現在我吃什麼吐什麼…" +"seems like I can't keep anything down…" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Uhm." @@ -173595,8 +178582,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Here? Fruits and berries. Maybe the occasional piece of farm equipment, but" -" you need crypto coins" +"Here? Fruits and berries. Maybe the occasional piece of farm equipment, " +"but you need crypto coins" msgstr "" #: lang/json/talk_topic_from_json.py @@ -173917,6 +178904,263 @@ msgstr "" msgid "Now I choose the cause I'll die for." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Yes. I ask because I noticed there are dinosaurs around. Do you know " +"anything about that?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I know all kinds of weird useless stuff. I've seen things at churches, I've" +" seen things on farms, I've seen whole exhibits way out. Those Swampers, " +"they know what's happening. They're creatures of light come back to save us" +" all. Or eat us, I forget." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters will be fed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome. Are you hungry friend?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You look hungry friend. So much hunger in this world. This is the time of " +"the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hello. Who are the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So about the eaters…" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You mentioned some pretenders before. What does that mean?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Is there a way I can help feed the eaters?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to get going. Take care, CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters have returned, along with the false ones. We must feed the" +" eaters and destroy the pretenders child." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are you talking about?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No thank you, I'd like to leave now." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This Cataclysm has woken the great eaters, lost in time, returned them to " +"the world to do their great work, to multiply and fill the land with their " +"song. The time of man is over, but we few who remain can do our part to " +"protect this new world from the pretenders, who would steal the meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what do you do with the meat?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Who are the great eaters and the pretenders?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are there any others left?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are the ones that were lost, what we call dinosaurs whose " +"meat we took and who are taking it back. The pretenders are those others " +"that have come to steal the meat of this world. It does not belong to them " +"and we will take it from their mouths." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, so you worship dinosaurs. Understood." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Swampers knew these times would return and we prepared for them. When " +"others wasted their time and meat, we fed and grew strong, and we filled our" +" stores with meat for this day." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes, very good." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You keep talking about meat. Why is meat so important?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The meat makes the great eaters strong. We gather the meat and feed them, " +"and in the end we too will serve the eaters in death as we do in life. This" +" was always our purpose and we lucky few have lived to see it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Our purpose? How do you know?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The return of the great eaters was fortold by a prophet. We faithful have " +"been waiting and preparing since the revelation." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I guess it must be nice to be proven right." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is crazy." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You understand our purpose. I welcome you to this work, all are needed to " +"feed the eaters." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"You deny what you see right in front of you. This world is what was " +"fortold." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters have fed. They will be hungry again in time" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You know what to do." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The great eaters must be fed. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is still more work to do. Are you ready?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is meat ready for the feeding. Are you ready to gather it?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The eaters are hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is more meat needed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I know of eaters ready for meat." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Maybe another time CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"If you are ready to be of service to the great eaters, go and find meat and " +"bring it back. There is always need for more." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Happy to be of service to the great eaters. I'm in." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Excellent. Make it happen." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great eaters are not picky, any pure meat will do, but mutant and " +"tainted meat are not good enough." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"So, meat from a creature that isn't a zombie, or a giant monster. Got it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, you should find everything you need here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That explains the knives then." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh, you know my friend Brigitte. Well in that case, let's go!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "No, I must remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sweet!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Not just now. You should remain here to oversee the company." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Of course, the company will be ready when you are and the great eaters will " +"feed either way." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It was fortold that as the great eaters returned, so too would the " +"pretenders, who would come to steal the meat. Very little is asked of us, " +"except that we do all we can to ensure that the true great eaters received " +"as much meat as possible and the pretenders go hungry." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Yes CEO Baronyx, very good CEO Baronyx." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This makes no sense and I'm done talking about it." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Heya, scav." msgstr "嘿,拾荒仔。" @@ -174013,7 +179257,7 @@ msgid "Oh, you again." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Huh? *mumble mumble* … Who are you?" +msgid "Huh? *mumble mumble* … Who are you?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -174021,7 +179265,7 @@ msgid "I'm busy, what is it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "And leave my tower and all my research? I think not." +msgid "And leave my tower and all my research? I think not." msgstr "" #: lang/json/talk_topic_from_json.py @@ -174448,10 +179692,6 @@ msgstr "你格擋了 %s" msgid " blocks %s" msgstr " 格擋了 %s" -#: lang/json/technique_from_json.py -msgid "Parry" -msgstr "格擋" - #. ~ Description for Parry #: lang/json/technique_from_json.py msgid "High blocking ability" @@ -176886,6 +182126,90 @@ msgstr "" msgid " unleashes a spin attack against %s and those nearby" msgstr "" +#: lang/json/technique_from_json.py +msgid "Disarming Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You skillfully disarm %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " skillfully disarms %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Lightning Recovery" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss %s but recover in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses %s but recovers in the blink of an eye" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Finishing Move" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You finish off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " finishes off %s with a powerful slash" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Dazing Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You harshly stun %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " harshly stuns %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Steel Wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleave through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleaves through %s and those nearby like a steel wind" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Scything Blade" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You cleanly reap through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " cleanly reap throug %s and those nearby" +msgstr "" + #: lang/json/technique_from_json.py msgid "Ausstoß" msgstr "" @@ -176942,6 +182266,216 @@ msgstr "" msgid " launches a supersonic punch at %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Mega Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Mega Kick on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Darkest Lariat" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Darkest Lariat on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Smart Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Smart Strike on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Low Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You use Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " uses Low Sweep on %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Fool's Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely fool %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely fools %s and strike back" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hydra Slaying Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " interrupt %s with a perfectly aimed strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You toss %s aside with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " tosses %s with a Mighty Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You spin and hurl %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " spins and hurls %s away with a Ballista Throw" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Flowing Water" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You deflect %s's attack and counter in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " deflects %s's attack and counters in one fluid motion" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Disarming Slash" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You disarm %s with a quick flick of your weapon" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " disarms %s with a quick flick of their weapon" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Sarlacc Sweep" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly sweep through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly sweeps through %s and those nearby" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You crush %s with the weight of your Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " crushes %s with the weight of their Mountain Hammer" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Irrestistible Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You smash down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smashes down on %s with a Mountain Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You completely shatter %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " completely shatters %s with a Colossus Strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Wolverine Stance" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you thrash your way to freedom!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they thrash their way to freedom!" +msgstr "" + #: lang/json/ter_furn_transform_messages_from_json.py msgid "The earth here does not listen to your command to move." msgstr "" @@ -176987,6 +182521,10 @@ msgstr "" msgid "Life springs anew from the dead grass." msgstr "" +#: lang/json/ter_furn_transform_messages_from_json.py +msgid "The door opens forcefully!" +msgstr "" + #: lang/json/terrain_from_json.py msgid "scorched earth" msgstr "焦土" @@ -177942,183 +183480,14 @@ msgid "" msgstr "" #: lang/json/terrain_from_json.py -msgid "dirt" -msgstr "土地" - -#. ~ Description for dirt -#: lang/json/terrain_from_json.py -msgid "" -"It's dirt. Looks like some fine soil for tillage. Could also be dug out " -"for construction projects." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "thump" -msgstr "咚" - -#. ~ Description for sand -#: lang/json/terrain_from_json.py -msgid "" -"A large area of fine sand that could be useful in a number of ways, if it " -"was extracted properly." +msgid "overgrown floor" msgstr "" -#: lang/json/terrain_from_json.py -msgid "mud" -msgstr "泥巴" - -#. ~ Description for mud -#: lang/json/terrain_from_json.py -msgid "An area of wet, slick mud." -msgstr "濕滑的泥濘區域。" - -#: lang/json/terrain_from_json.py -msgid "clay" -msgstr "黏土" - -#. ~ Description for clay +#. ~ Description for overgrown floor #: lang/json/terrain_from_json.py msgid "" -"A field full of malleable clay, suitable for kiln firing if it was extracted" -" properly." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "mound of clay" -msgstr "黏土堆" - -#. ~ Description for mound of clay -#: lang/json/terrain_from_json.py -msgid "A mound of clay soil." -msgstr "一堆黏土。" - -#: lang/json/terrain_from_json.py -msgid "splosh!" -msgstr "啪啦!" - -#: lang/json/terrain_from_json.py -msgid "mound of sand" -msgstr "沙堆" - -#. ~ Description for mound of sand -#: lang/json/terrain_from_json.py -msgid "A mound of sand." -msgstr "一堆沙子。" - -#: lang/json/terrain_from_json.py -msgid "mound of dirt" -msgstr "泥土堆" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"An area of heaped dirt, not easily traversable. If examined more closely, " -"it's quite favorable for planting seeds and the like." -msgstr "" - -#. ~ Description for mound of dirt -#: lang/json/terrain_from_json.py -msgid "" -"A giant hill of dirt that looks like you could crawl inside for shelter." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "odd fault" -msgstr "奇特的斷層" - -#. ~ Description for odd fault -#: lang/json/terrain_from_json.py -msgid "" -"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " -"strange sensation to examine it closer, as if it belongs to you somehow." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "grave" -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A dirt grave, with some grass growing on it. At least some of the dead do " -"actually rest in peace." -msgstr "" - -#. ~ Description for grave -#: lang/json/terrain_from_json.py -msgid "" -"A fresh grave, covered with stones, either to keep something from digging it" -" out or to keep one inside from digging out of it. Two planks mark this " -"place of someone's eternal rest." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "rock floor" -msgstr "岩石地板" - -#. ~ Description for rock floor -#: lang/json/terrain_from_json.py -msgid "" -"A relatively flat area of rock and stone. Looks stable enough to be mined " -"with the proper mining gear." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "pavement" -msgstr "路面" - -#. ~ Description for pavement -#: lang/json/terrain_from_json.py -msgid "" -"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" -" maintenance." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "yellow pavement" -msgstr "黃色路面" - -#. ~ Description for yellow pavement -#: lang/json/terrain_from_json.py -msgid "" -"Streaks of carefully aligned yellow paint mark the road to inform drivers " -"not to cross. No one is enforcing these rules anymore." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "sidewalk" -msgstr "人行道" - -#. ~ Description for sidewalk -#: lang/json/terrain_from_json.py -msgid "" -"An area of common poured concrete, damaged by frost heaves and large cracks " -"due to lack of maintenance." -msgstr "" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles." -msgstr "" - -#. ~ Description for concrete -#: lang/json/terrain_from_json.py -msgid "" -"A newer segment of poured concrete with surface finishes for aesthetics and " -"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "wooden floor" -msgstr "木製地板" - -#. ~ Description for wooden floor -#: lang/json/terrain_from_json.py -msgid "" -"Wooden floor created from boards, packed tightly together and nailed down. " -"Common in patios." +"A bare concrete floor, almost completely covered by twitching filaments of " +"grey flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -178126,38 +183495,13 @@ msgid "SMASH!" msgstr "碰!" #: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "金屬地板" - -#. ~ Description for metal floor -#: lang/json/terrain_from_json.py -msgid "" -"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgid "overgrown wall" msgstr "" -#: lang/json/terrain_from_json.py -msgid "linoleum tile" -msgstr "油氈磚" - -#. ~ Description for linoleum tile +#. ~ Description for overgrown wall #: lang/json/terrain_from_json.py msgid "" -"A section of flooring made out of a tough, rubbery material. Colored a " -"simple white." -msgstr "" - -#. ~ Description for linoleum tile -#: lang/json/terrain_from_json.py -msgid "A section of flooring made out of a tough, gray, rubbery material." -msgstr "" - -#: lang/json/terrain_from_json.py -msgid "dirt floor" -msgstr "泥土地" - -#. ~ Description for dirt floor -#: lang/json/terrain_from_json.py -msgid "Floor consisting of finely mixed earth that has been tamped down." +"A concrete wall overgrown by a grotesque grid of veins and knotted flesh." msgstr "" #: lang/json/terrain_from_json.py @@ -178241,6 +183585,21 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" +#: lang/json/terrain_from_json.py +msgid "rock floor" +msgstr "岩石地板" + +#. ~ Description for rock floor +#: lang/json/terrain_from_json.py +msgid "" +"A relatively flat area of rock and stone. Looks stable enough to be mined " +"with the proper mining gear." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "金屬地板" + #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -178248,6 +183607,10 @@ msgid "" " with a matching roof." msgstr "" +#: lang/json/terrain_from_json.py +msgid "thump" +msgstr "咚" + #: lang/json/terrain_from_json.py msgid "floor" msgstr "地板" @@ -178290,6 +183653,10 @@ msgid "" "resistance and sliding, commonly for recreational sports." msgstr "" +#: lang/json/terrain_from_json.py +msgid "dirt floor" +msgstr "泥土地" + #. ~ Description for dirt floor #: lang/json/terrain_from_json.py msgid "" @@ -178372,28 +183739,15 @@ msgid "A blue section of flooring." msgstr "" #: lang/json/terrain_from_json.py -msgid "industrial carpet" +msgid "carpet" msgstr "" -#. ~ Description for industrial carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, high-durability carpet in a neutral gray color, for laying " -"down on bare concrete." +msgid "Base carpet!" msgstr "" -#: lang/json/terrain_from_json.py -msgid "bunker carpet" -msgstr "" - -#. ~ Description for bunker carpet -#: lang/json/terrain_from_json.py -msgid "" -"Firm, low-pile, totally non-flammable carpet in a neutral cream color, with " -"an insulation layer beneath." -msgstr "" - -#. ~ Description for red carpet +#. ~ Description for carpet #: lang/json/terrain_from_json.py msgid "Soft red carpet." msgstr "柔軟的紅色地毯。" @@ -178413,6 +183767,124 @@ msgstr "柔軟的綠色地毯。" msgid "Soft purple carpet." msgstr "柔軟的紫色地毯。" +#: lang/json/terrain_from_json.py +msgid "Carpet" +msgstr "" + +#. ~ Description for Carpet +#: lang/json/terrain_from_json.py +msgid "Base concrete carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial red carpet" +msgstr "" + +#. ~ Description for industrial red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a red color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial yellow carpet" +msgstr "" + +#. ~ Description for industrial yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a yellow color, for laying down on" +" bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial green carpet" +msgstr "" + +#. ~ Description for industrial green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a green color, for laying down on " +"bare concrete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "industrial purple carpet" +msgstr "" + +#. ~ Description for industrial purple carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, high-durability carpet in a purple color, for laying down on" +" bare concrete." +msgstr "" + +#. ~ Description for carpet +#: lang/json/terrain_from_json.py +msgid "Base metal carpet!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker red carpet" +msgstr "" + +#. ~ Description for bunker red carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a red color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker yellow carpet" +msgstr "" + +#. ~ Description for bunker yellow carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a yellow color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker green carpet" +msgstr "" + +#. ~ Description for bunker green carpet +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a green color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "bunker carpet purple" +msgstr "" + +#. ~ Description for bunker carpet purple +#: lang/json/terrain_from_json.py +msgid "" +"Firm, low-pile, totally non-flammable carpet in a purple color, with an " +"insulation layer beneath." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "linoleum tile" +msgstr "油氈磚" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "" +"A section of flooring made out of a tough, rubbery material. Colored a " +"simple white." +msgstr "" + +#. ~ Description for linoleum tile +#: lang/json/terrain_from_json.py +msgid "A section of flooring made out of a tough, gray, rubbery material." +msgstr "" + #: lang/json/terrain_from_json.py msgid "painted waxed floor" msgstr "" @@ -178447,6 +183919,33 @@ msgid "" "you like the sound of rain on corrugated metal." msgstr "" +#: lang/json/terrain_from_json.py +msgid "dirt" +msgstr "土地" + +#. ~ Description for dirt +#: lang/json/terrain_from_json.py +msgid "" +"It's dirt. Looks like some fine soil for tillage. Could also be dug out " +"for construction projects." +msgstr "" + +#. ~ Description for sand +#: lang/json/terrain_from_json.py +msgid "" +"A large area of fine sand that could be useful in a number of ways, if it " +"was extracted properly." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mud" +msgstr "泥巴" + +#. ~ Description for mud +#: lang/json/terrain_from_json.py +msgid "An area of wet, slick mud." +msgstr "濕滑的泥濘區域。" + #: lang/json/terrain_from_json.py msgid "moss" msgstr "" @@ -178456,6 +183955,30 @@ msgstr "" msgid "Moist spongy moss." msgstr "" +#: lang/json/terrain_from_json.py +msgid "clay" +msgstr "黏土" + +#. ~ Description for clay +#: lang/json/terrain_from_json.py +msgid "" +"A field full of malleable clay, suitable for kiln firing if it was extracted" +" properly." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "mound of clay" +msgstr "黏土堆" + +#. ~ Description for mound of clay +#: lang/json/terrain_from_json.py +msgid "A mound of clay soil." +msgstr "一堆黏土。" + +#: lang/json/terrain_from_json.py +msgid "splosh!" +msgstr "啪啦!" + #: lang/json/terrain_from_json.py msgid "paper floor" msgstr "" @@ -178465,6 +183988,131 @@ msgstr "" msgid "Floor made of pulpy mass, covered in sticky wasp saliva." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mound of sand" +msgstr "沙堆" + +#. ~ Description for mound of sand +#: lang/json/terrain_from_json.py +msgid "A mound of sand." +msgstr "一堆沙子。" + +#: lang/json/terrain_from_json.py +msgid "mound of dirt" +msgstr "泥土堆" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"An area of heaped dirt, not easily traversable. If examined more closely, " +"it's quite favorable for planting seeds and the like." +msgstr "" + +#. ~ Description for mound of dirt +#: lang/json/terrain_from_json.py +msgid "" +"A giant hill of dirt that looks like you could crawl inside for shelter." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "odd fault" +msgstr "奇特的斷層" + +#. ~ Description for odd fault +#: lang/json/terrain_from_json.py +msgid "" +"An unnaturally humanoid-shaped hole, it seems oddly familiar. There's a " +"strange sensation to examine it closer, as if it belongs to you somehow." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "grave" +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A dirt grave, with some grass growing on it. At least some of the dead do " +"actually rest in peace." +msgstr "" + +#. ~ Description for grave +#: lang/json/terrain_from_json.py +msgid "" +"A fresh grave, covered with stones, either to keep something from digging it" +" out or to keep one inside from digging out of it. Two planks mark this " +"place of someone's eternal rest." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "pavement" +msgstr "路面" + +#. ~ Description for pavement +#: lang/json/terrain_from_json.py +msgid "" +"A segment of asphalt, slowly degrading from cracks, frost heaves and lack of" +" maintenance." +msgstr "一段瀝青,正在緩慢的碎裂中,凍結的冰塊破壞了結構並且缺乏了維護。" + +#: lang/json/terrain_from_json.py +msgid "yellow pavement" +msgstr "黃色路面" + +#. ~ Description for yellow pavement +#: lang/json/terrain_from_json.py +msgid "" +"Streaks of carefully aligned yellow paint mark the road to inform drivers " +"not to cross. No one is enforcing these rules anymore." +msgstr "漆在路上一條一條小心對齊的黃色油漆,提示駕駛不要跨越黃線。現在再也沒有人需要遵守這項規定了。" + +#: lang/json/terrain_from_json.py +msgid "sidewalk" +msgstr "人行道" + +#. ~ Description for sidewalk +#: lang/json/terrain_from_json.py +msgid "" +"An area of common poured concrete, damaged by frost heaves and large cracks " +"due to lack of maintenance." +msgstr "" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles." +msgstr "" + +#. ~ Description for concrete +#: lang/json/terrain_from_json.py +msgid "" +"A newer segment of poured concrete with surface finishes for aesthetics and " +"resistance to freeze-thaw cycles. Covered with a streak of yellow paint." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "wooden floor" +msgstr "木製地板" + +#. ~ Description for wooden floor +#: lang/json/terrain_from_json.py +msgid "" +"Wooden floor created from boards, packed tightly together and nailed down. " +"Common in patios." +msgstr "" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + +#. ~ Description for dirt floor +#: lang/json/terrain_from_json.py +msgid "Floor consisting of finely mixed earth that has been tamped down." +msgstr "" + #: lang/json/terrain_from_json.py msgid "walnut tree" msgstr "核桃樹" @@ -182224,6 +187872,78 @@ msgstr "往上的梯子。" msgid "A ladder leading down." msgstr "往下的梯子。" +#: lang/json/terrain_from_json.py +msgid "road ramp down (high end)" +msgstr "" + +#. ~ Description for road ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp down (low end)" +msgstr "" + +#. ~ Description for road ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (high end)" +msgstr "" + +#. ~ Description for road ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "road ramp up (low end)" +msgstr "" + +#. ~ Description for road ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of an asphalt ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp down (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp down (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (high end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (high end) +#: lang/json/terrain_from_json.py +msgid "The upper end of a sidewalk ramp leading up." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "sidewalk ramp up (low end)" +msgstr "" + +#. ~ Description for sidewalk ramp up (low end) +#: lang/json/terrain_from_json.py +msgid "The lower end of a sidewalk ramp leading up." +msgstr "" + #: lang/json/terrain_from_json.py msgid "downward slope" msgstr "下坡" @@ -182715,7 +188435,7 @@ msgstr "鏗拉!" #. ~ Trap-vehicle collision message for trap 'shotgun trap' #: lang/json/trap_from_json.py lang/json/trap_from_json.py src/iuse.cpp -#: src/iuse.cpp src/ranged.cpp +#: src/ranged.cpp msgid "Bang!" msgstr "碰!" @@ -184511,6 +190231,11 @@ msgstr "木製船體" msgid "A wooden board that keeps the water out of your boat." msgstr "將水擋在船外的木板。" +#. ~ Description for {'str': 'raft boat hull'} +#: lang/json/vehicle_part_from_json.py +msgid "Logs tied together that will keep your boat out of the water." +msgstr "" + #. ~ Description for {'str': 'plastic boat hull'} #: lang/json/vehicle_part_from_json.py msgid "A rigid plastic sheet that keeps water out of your boat." @@ -184950,14 +190675,19 @@ msgid "" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "wooden seat" -msgstr "木座椅" +msgid "flimsy wooden seat" +msgstr "" +#. ~ Description for {'str': 'flimsy wooden seat'} #. ~ Description for {'str': 'wooden seat'} #: lang/json/vehicle_part_from_json.py msgid "A place to sit." msgstr "可以坐下的地方。" +#: lang/json/vehicle_part_from_json.py +msgid "wooden seat" +msgstr "木座椅" + #: lang/json/vehicle_part_from_json.py msgid "wooden spike" msgstr "木尖刺" @@ -185157,6 +190887,15 @@ msgid "" "extending the time until the food spoils." msgstr "" +#. ~ Description for {'str': 'wooden wheel mount'} +#: lang/json/vehicle_part_from_json.py +msgid "A piece of wood with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden wheel mount (steerable)" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "light wheel mount (steerable)" msgstr "輕型輪轂(轉向輪)" @@ -185762,6 +191501,11 @@ msgstr "" msgid "At least %s from %s (%s remaining)" msgstr "" +#: src/achievement.cpp +#, c-format +msgid "Exactly %s from %s" +msgstr "" + #: src/achievement.cpp #, c-format msgid "Within %s of %s (%s remaining)" @@ -185778,12 +191522,13 @@ msgid "Within %s of %s (passed)" msgstr "" #: src/achievement.cpp -msgid "Triggered by " +#, c-format +msgid "Triggered by %s" msgstr "" #: src/achievement.cpp #, c-format -msgid "%s/%s " +msgid "%s/%s %s" msgstr "" #: src/achievement.cpp @@ -185985,8 +191730,9 @@ msgstr "這個鎖無情的嘲笑你的開鎖技術, 而你損傷了你的工具 msgid "The lock stumps your efforts to pick it." msgstr "這個鎖無情的嘲笑你的開鎖技術。" -#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iuse.cpp src/iuse.cpp -#: src/iuse.cpp src/iuse_actor.cpp src/iuse_actor.cpp +#: src/activity_actor.cpp src/game.cpp src/game.cpp src/iexamine.cpp +#: src/iuse.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "騎乘時無法做那個。" @@ -186046,6 +191792,120 @@ msgstr "繼續嘗試入睡。" msgid "Continue trying to fall asleep and don't ask again." msgstr "繼續嘗試入睡,不再詢問。" +#: src/activity_actor.cpp +msgid "You are too tired to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are too dehydrated to exercise." +msgstr "" + +#: src/activity_actor.cpp +msgid "Empty your hands first." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken arm." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train here with a broken leg." +msgstr "" + +#: src/activity_actor.cpp +msgid "You cannot train freely with a broken limb." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Physical effort determines workout efficiency, but also rate of exhaustion." +msgstr "" + +#: src/activity_actor.cpp +msgid "Choose training intensity:" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Light excercise comparable in intensity to walking, but more focused and " +"methodical." +msgstr "" + +#: src/activity_actor.cpp +msgid "Moderate" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Moderate excercise without excessive exertion, but with enough effort to " +"break a sweat." +msgstr "" + +#: src/activity_actor.cpp +msgid "Active" +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"Active excercise with full involvement. Strenuous, but in a controlled " +"manner." +msgstr "" + +#: src/activity_actor.cpp +msgid "" +"High intensity excercise with maximum effort and full power. Exhausting in " +"the long run." +msgstr "" + +#: src/activity_actor.cpp +msgid "Train for how long (minutes): " +msgstr "" + +#: src/activity_actor.cpp +msgid "You start your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are exhausted so you finish your workout early." +msgstr "" + +#: src/activity_actor.cpp +msgid "You are dehydrated so you finish your workout early." +msgstr "" + +#. ~ heavy breathing when excercising +#: src/activity_actor.cpp +msgid "yourself huffing and puffing!" +msgstr "" + +#: src/activity_actor.cpp +msgid "You catch your breath for few moments." +msgstr "" + +#: src/activity_actor.cpp +msgid "You get back to your training." +msgstr "" + +#: src/activity_actor.cpp +msgid "You finish your workout session." +msgstr "" + +#: src/activity_actor.cpp +msgid "You have finished your training cycle, keep training?" +msgstr "" + +#: src/activity_actor.cpp +msgid "Stop training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training." +msgstr "" + +#: src/activity_actor.cpp +msgid "Continue training and don't ask again." +msgstr "" + #. ~ Sound of a Rat mutant burrowing! #: src/activity_handlers.cpp msgid "ScratchCrunchScrabbleScurry." @@ -187698,7 +193558,7 @@ msgstr "[<] 頁面 %1$d/%2$d [>]" msgid "< [%s] Sort: %s >" msgstr "" -#: src/advanced_inv.cpp src/inventory_ui.cpp +#: src/advanced_inv.cpp src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter" msgstr "" @@ -190579,6 +196439,29 @@ msgstr "%s (%i 插槽)。" msgid "Increased storage capacity by %i." msgstr "增加了 %i 的容量。" +#: src/bionics.cpp +msgid "Chose Safe Fuel Level Threshold" +msgstr "" + +#: src/bionics.cpp +msgid "Full Power" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 80 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 55 %%" +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Above 30 %%" +msgstr "" + #: src/bionics.cpp msgid "Chose Start Power Level Threshold" msgstr "" @@ -190743,7 +196626,8 @@ msgid "(incapacitated)" msgstr "(嚴重傷殘)" #: src/bionics_ui.cpp -msgid "(fuel saving ON)" +#, c-format +msgid "(fuel saving ON > %d %%)" msgstr "" #: src/bionics_ui.cpp @@ -190813,10 +196697,18 @@ msgstr "" msgid "Accuracy" msgstr "命中率" +#: src/bonuses.cpp +msgid "Critical Hit Chance" +msgstr "" + #: src/bonuses.cpp src/martialarts.cpp msgid "Dodge" msgstr "閃避" +#: src/bonuses.cpp +msgid "Block effectiveness" +msgstr "" + #: src/bonuses.cpp src/panels.cpp msgid "Speed" msgstr "速度" @@ -191295,20 +197187,25 @@ msgstr " 站起來了。" #: src/character.cpp src/monster.cpp #, c-format -msgid "The %s breaks free of the webs!" -msgstr "%s 掙脫了網子!" +msgid "The %s escapes the bear trap!" +msgstr "%s 逃出捕獸陷阱!" #: src/character.cpp -msgid "You free yourself from the webs!" -msgstr "你從網子中掙脫了!" +#, c-format +msgid "Your %s tries to free itself from the bear trap, but can't get loose!" +msgstr "" #: src/character.cpp -msgid " frees themselves from the webs!" -msgstr " 從網子中掙脫了!" +msgid "You free yourself from the bear trap!" +msgstr "你從捕熊陷阱中掙脫!" #: src/character.cpp -msgid "You try to free yourself from the webs, but can't get loose!" -msgstr "你嘗試從網子中掙脫, 但失敗了!" +msgid " frees themselves from the bear trap!" +msgstr " 從捕熊陷阱中掙脫!" + +#: src/character.cpp +msgid "You try to free yourself from the bear trap, but can't get loose!" +msgstr "你嘗試從捕熊陷阱中掙脫, 但失敗了!" #: src/character.cpp src/monster.cpp #, c-format @@ -191344,28 +197241,6 @@ msgstr " 從重型圈套中掙脫了!" msgid "You try to free yourself from the heavy snare, but can't get loose!" msgstr "你嘗試從重型圈套中掙脫, 但失敗了!" -#: src/character.cpp src/monster.cpp -#, c-format -msgid "The %s escapes the bear trap!" -msgstr "%s 逃出捕獸陷阱!" - -#: src/character.cpp -#, c-format -msgid "Your %s tries to free itself from the bear trap, but can't get loose!" -msgstr "" - -#: src/character.cpp -msgid "You free yourself from the bear trap!" -msgstr "你從捕熊陷阱中掙脫!" - -#: src/character.cpp -msgid " frees themselves from the bear trap!" -msgstr " 從捕熊陷阱中掙脫!" - -#: src/character.cpp -msgid "You try to free yourself from the bear trap, but can't get loose!" -msgstr "你嘗試從捕熊陷阱中掙脫, 但失敗了!" - #: src/character.cpp msgid "You free yourself from the rubble!" msgstr "你從瓦礫中掙脫了!" @@ -191378,18 +197253,6 @@ msgstr " 從瓦礫中掙脫了!" msgid "You try to free yourself from the rubble, but can't get loose!" msgstr "你嘗試從瓦礫中掙脫, 但失敗了!" -#: src/character.cpp -msgid "You try to escape the pit, but slip back in." -msgstr "你試著逃出坑, 但是又滑回去了。" - -#: src/character.cpp -msgid "You escape the pit!" -msgstr "你逃出坑了!" - -#: src/character.cpp -msgid " escapes the pit!" -msgstr " 逃出坑了!" - #: src/character.cpp #, c-format msgid "Your %s tries to break free, but fails!" @@ -191429,6 +197292,52 @@ msgstr "你掙脫束縛!" msgid " breaks out of the grab!" msgstr " 掙脫束縛!" +#: src/character.cpp src/monster.cpp +#, c-format +msgid "The %s breaks free of the webs!" +msgstr "%s 掙脫了網子!" + +#: src/character.cpp +msgid "You free yourself from the webs!" +msgstr "你從網子中掙脫了!" + +#: src/character.cpp +msgid " frees themselves from the webs!" +msgstr " 從網子中掙脫了!" + +#: src/character.cpp +msgid "You try to free yourself from the webs, but can't get loose!" +msgstr "你嘗試從網子中掙脫, 但失敗了!" + +#: src/character.cpp +#, c-format +msgid "The %s breaks free!" +msgstr "" + +#: src/character.cpp +msgid "You free yourself!" +msgstr "" + +#: src/character.cpp +msgid " frees themselves!" +msgstr "" + +#: src/character.cpp +msgid "You try to free yourself, but can't!" +msgstr "" + +#: src/character.cpp +msgid "You try to escape the pit, but slip back in." +msgstr "你試著逃出坑, 但是又滑回去了。" + +#: src/character.cpp +msgid "You escape the pit!" +msgstr "你逃出坑了!" + +#: src/character.cpp +msgid " escapes the pit!" +msgstr " 逃出坑了!" + #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." @@ -192269,6 +198178,10 @@ msgstr "" msgid "Your body strains under the weight!" msgstr "你的身體被超重拖累!" +#: src/character.cpp src/player.cpp +msgid "Your biology is not compatible with that healing item." +msgstr "" + #: src/character.cpp #, c-format msgid "Dispose of %s" @@ -195221,14 +201134,6 @@ msgstr "繪圖基準測試(5 秒)" msgid "Test trait group" msgstr "測試特質群組" -#: src/debug_menu.cpp -msgid "Show debug message" -msgstr "顯示除錯消息" - -#: src/debug_menu.cpp -msgid "Crash game (test crash handling)" -msgstr "崩潰遊戲(測試崩潰處理)" - #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" msgstr "切換NPC在地圖上的尋徑" @@ -195257,6 +201162,18 @@ msgstr "資訊 ... " msgid "Enable achievements" msgstr "" +#: src/debug_menu.cpp +msgid "Show debug message" +msgstr "顯示除錯消息" + +#: src/debug_menu.cpp +msgid "Crash game (test crash handling)" +msgstr "崩潰遊戲(測試崩潰處理)" + +#: src/debug_menu.cpp +msgid "Quit to main menu" +msgstr "返回主選單" + #: src/debug_menu.cpp msgid "Game…" msgstr "" @@ -195353,10 +201270,6 @@ msgstr "" msgid "Map…" msgstr "地圖 ..." -#: src/debug_menu.cpp -msgid "Quit to main menu" -msgstr "返回主選單" - #: src/debug_menu.cpp msgid "" "Debug Functions - Using these will cheat not only the game, but yourself.\n" @@ -195880,6 +201793,10 @@ msgstr "標記為完成" msgid "Remove mission without proper cleanup" msgstr "刪除任務 (缺乏適當的清理)" +#: src/debug_menu.cpp +msgid "Benchmark in progress…" +msgstr "" + #: src/debug_menu.cpp #, c-format msgid "Drew %d times in %.3f seconds. (%.3f fps average)" @@ -196393,19 +202310,6 @@ msgstr "" "室內:%s\n" "屋頂:%s" -#: src/editmap.cpp -#, c-format -msgid "" -"Visible: %d\n" -"Avoidance: %d\n" -"Difficulty: %d\n" -"Benign: %s" -msgstr "" -"可見:%d\n" -"避免:%d\n" -"困難:%d\n" -"良性:%s" - #: src/editmap.cpp #, c-format msgctxt "map feature id" @@ -197102,138 +203006,182 @@ msgid "Liked" msgstr "受人喜歡" #: src/faction.cpp +msgctxt "Faction respect" msgid "Legendary" msgstr "有如傳奇" #: src/faction.cpp +msgctxt "Faction respect" msgid "Unchallenged" msgstr "舉世聞名" #: src/faction.cpp +msgctxt "Faction respect" msgid "Mighty" -msgstr "聲名遠播" +msgstr "偉大" #: src/faction.cpp +msgctxt "Faction respect" msgid "Famous" -msgstr "眾所周知" +msgstr "有名" #: src/faction.cpp +msgctxt "Faction respect" msgid "Well-Known" msgstr "小有名氣" #: src/faction.cpp +msgctxt "Faction respect" msgid "Spoken Of" msgstr "略有所聞" #: src/faction.cpp +msgctxt "Faction respect" msgid "Worthless Scum" msgstr "不值一提" #: src/faction.cpp +msgctxt "Faction respect" msgid "Vermin" msgstr "小人" #: src/faction.cpp +msgctxt "Faction respect" msgid "Despicable" msgstr "害蟲" #: src/faction.cpp +msgctxt "Faction respect" msgid "Parasite" msgstr "寄生蟲" #: src/faction.cpp +msgctxt "Faction respect" msgid "Leech" msgstr "吸血鬼" #: src/faction.cpp +msgctxt "Faction respect" msgid "Laughingstock" msgstr "笑柄" #: src/faction.cpp +msgctxt "Faction respect" +msgid "Neutral" +msgstr "中立" + +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Filthy rich" msgstr "富豪" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Affluent" msgstr "富裕" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Prosperous" msgstr "富足" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Well-Off" msgstr "小康" -#: src/faction.cpp src/panels.cpp +#: src/faction.cpp +msgctxt "Faction wealth" msgid "Comfortable" msgstr "舒適" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Wanting" msgstr "拮据" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Failing" msgstr "貧窮" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Impoverished" msgstr "貧困" #: src/faction.cpp +msgctxt "Faction wealth" msgid "Destitute" msgstr "赤貧" #: src/faction.cpp +msgctxt "Faction food" msgid "Overflowing" msgstr "資源充溢" #: src/faction.cpp +msgctxt "Faction food" msgid "Well-Stocked" msgstr "資源充足" #: src/faction.cpp +msgctxt "Faction food" msgid "Scrapping By" msgstr "僅可糊口" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Malnourished" msgstr "營養不良" -#: src/faction.cpp src/player_display.cpp +#: src/faction.cpp +msgctxt "Faction food" msgid "Starving" msgstr "瀕臨飢荒" -#: src/faction.cpp src/iuse_software_minesweeper.cpp +#: src/faction.cpp +msgctxt "Faction combat lvl" +msgid "Legendary" +msgstr "有如傳奇" + +#: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Expert" msgstr "專家" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Veteran" msgstr "老兵" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Skilled" msgstr "熟練" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Competent" msgstr "合格" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Untrained" msgstr "生澀" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Crippled" msgstr "殘缺" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Feeble" msgstr "薄弱" #: src/faction.cpp +msgctxt "Faction combat lvl" msgid "Worthless" msgstr "無用" @@ -197844,12 +203792,12 @@ msgstr "" #, c-format msgid "" "Notes:\n" -"Send a companion to gather light brush and heavy sticks.\n" +"Send a companion to gather light brush and stout branches.\n" "\n" "Skill used: survival\n" "Difficulty: N/A\n" "Gathering Possibilities:\n" -"> heavy sticks\n" +"> stout branches\n" "> withered plants\n" "> splintered wood\n" "\n" @@ -197857,19 +203805,6 @@ msgid "" "Time: 3 Hours, Repeated\n" "Positions: %d/3\n" msgstr "" -"註記:\n" -"派遣同伴去收集灌木和木棍。\n" -"\n" -"使用的技能:生存\n" -"難度:N/A\n" -"可能收集的物品:\n" -"> 木棍\n" -"> 枯萎的植物\n" -"> 碎裂的木頭\n" -"\n" -"風險:非常低\n" -"時間:3 小時,重複執行\n" -"職缺:%d / 3\n" #: src/faction_camp.cpp #, c-format @@ -199105,8 +205040,8 @@ msgid "You do not have a camp food zone. Aborting…" msgstr "你沒有 [營寨:儲糧] 區。中止..." #: src/faction_camp.cpp -msgid "No items are located at the drop point…" -msgstr "該區域內沒有物品..." +msgid "No suitable items are located at the drop points…" +msgstr "" #: src/faction_camp.cpp #, c-format @@ -199313,6 +205248,13 @@ msgstr "%s很靠近,很危險!" msgid "Wait till you wake up…" msgstr "等你醒來..." +#: src/game.cpp +#, c-format +msgid "" +"\n" +"%s to interrupt" +msgstr "" + #: src/game.cpp #, c-format msgid "%s, cancel Auto-move?" @@ -199423,6 +205365,11 @@ msgctxt "action" msgid "open" msgstr "" +#: src/game.cpp +msgctxt "action" +msgid "pocket autopickup settings" +msgstr "" + #: src/game.cpp msgctxt "action" msgid "unfavorite" @@ -200506,6 +206453,10 @@ msgstr "你沒東西可填裝。" msgid "You aren't holding something you can reload." msgstr "" +#: src/game.cpp +msgid "You need to put the bag away before trying to wield something from it." +msgstr "" + #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." @@ -200933,11 +206884,25 @@ msgstr "" msgid "You cannot haul items here." msgstr "你不能在這裡搬運。" +#. ~ %s is the name of hostile NPC +#: src/game.cpp src/gates.cpp +#, c-format +msgid "%s is in the way!" +msgstr "有 %s 擋在那!" + +#. ~ %s is some monster #: src/game.cpp #, c-format msgid "There's a %s in the way!" msgstr "有 %s 擋在那!" +#. ~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a +#. zombie in the way!" +#: src/game.cpp +#, c-format +msgid "%s Attempt to push past? You may have to fight your way back up." +msgstr "" + #: src/game.cpp msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " @@ -202311,11 +208276,6 @@ msgstr "有屁孩擋在路中間!" msgid "The %s is in the way!" msgstr "有 %s 擋在那!" -#: src/gates.cpp -#, c-format -msgid "%s is in the way!" -msgstr "有 %s 擋在那!" - #: src/gates.cpp #, c-format msgid "That %s can only be closed from the inside." @@ -203046,6 +209006,10 @@ msgstr "忽略正被雷射瞄準!" msgid "Creature whitelisted: %s" msgstr "白名單中的生物: %s" +#: src/handle_action.cpp +msgid "Start workout?" +msgstr "" + #: src/handle_action.cpp msgid "Commit suicide?" msgstr "要自殺?" @@ -203574,6 +209538,11 @@ msgstr "你開始破解保險箱。" msgid "Attempt to hack this safe?" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "The %s is locked. You could pry it open with the right tool…" +msgstr "" + #: src/iexamine.cpp #, c-format msgid "The %s is locked. If only you had something to pry it with…" @@ -203593,7 +209562,7 @@ msgstr "" #: src/iexamine.cpp #, c-format msgid "You attempt to pick lock of %1$s using your %2$s…" -msgstr "" +msgstr "你試圖將%1$s用你的%2$s開鎖…" #: src/iexamine.cpp msgid "This bulletin board is not inside a camp" @@ -204392,11 +210361,28 @@ msgstr "%s 看起來實在太危險了。最好不要碰它。" msgid "There is a %s there. Take down?" msgstr "那裡有一個 %s, 要把它拆下來?" +#: src/iexamine.cpp +#, c-format +msgid "The %s is taken down." +msgstr "%s已被拆下。" + #: src/iexamine.cpp #, c-format msgid "There is a %s there. Disarm?" msgstr "有 %s 在那。解除嗎?" +#: src/iexamine.cpp +msgid "You disarm the trap!" +msgstr "你解除了陷阱!" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap." +msgstr "你解除陷阱失敗。" + +#: src/iexamine.cpp +msgid "You fail to disarm the trap, and you set it off!" +msgstr "你解除陷阱失敗, 並觸發了!" + #: src/iexamine.cpp #, c-format msgid "This %s can not be reloaded!" @@ -204769,6 +210755,10 @@ msgstr "選取要移除的已安裝生化插件" msgid "Splint broken limbs" msgstr "為斷肢上夾板" +#: src/iexamine.cpp +msgid "Treat wounds" +msgstr "" + #: src/iexamine.cpp msgid "You don't have any bionics installed." msgstr "你並未有安裝任何生化插件。" @@ -204796,17 +210786,79 @@ msgid " doesn't have limbs that require splinting." msgstr " 沒有需要夾板的肢體。" #: src/iexamine.cpp -msgid "This mill already contains flour." -msgstr "這個磨中已經裝有麵粉。" +msgid "You don't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid " doesn't have any wounds that need treatment." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in your body, but as it also " +"detected you've already taken antibiotics, it decided not to apply another " +"dose right now." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body, but as it " +"also detected you've already taken antibiotics, it decided not to apply " +"another dose right now." +msgstr "" #: src/iexamine.cpp -msgid "Remove it before starting the mill again." -msgstr "再次轉動磨子前請先把它取出。" +msgid "" +"The autodoc detected a bacterial infection in your body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp +msgid "" +"The autodoc detected a bacterial infection in 's body and injected " +"antibiotics to treat it." +msgstr "" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The muscle spasms start to go away." +msgstr "肌肉痙攣開始消失了。" + +#: src/iexamine.cpp src/iuse.cpp +msgid "The medication does nothing to help the spasms." +msgstr "藥物無法改善痙攣的狀況。" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on your %s and applied a hemostatic drug to " +"stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected a bleeding on 's %s and applied a hemostatic " +"drug to stop it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on your %s and applied a disinfectant to " +"clean it." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "" +"The autodoc detected an open wound on 's %s and applied a " +"disinfectant to clean it." +msgstr "" #: src/iexamine.cpp #, c-format -msgid "This rack contains %s, which can't be milled!" -msgstr "這個架子裡裝有 %s,它無法被磨粉!" +msgid "This mill contains %s, which can't be milled!" +msgstr "" #: src/iexamine.cpp #, c-format @@ -204979,8 +211031,9 @@ msgid "Remove brake and start milling" msgstr "移除制動器並開始磨粉" #: src/iexamine.cpp -msgid "Remove brake and start milling, milling will take about 6 hours." -msgstr "移除制動器並開始磨粉。作業時間大約 6 小時。" +#, c-format +msgid "Remove brake and start milling, milling will take about %s." +msgstr "" #: src/iexamine.cpp msgid "Insert products for milling… mill is full" @@ -205013,18 +211066,8 @@ msgstr "這裡有個磨。它正在轉動並磨粉中。" #: src/iexamine.cpp #, c-format -msgid "It will finish milling in about %d hour." -msgid_plural "It will finish milling in about %d hours." -msgstr[0] "磨粉作業大約在 %d 小時後完成。" - -#: src/iexamine.cpp -msgid "It will finish milling in less than an hour." -msgstr "磨粉作業將在一小時內完成。" - -#: src/iexamine.cpp -#, c-format -msgid "It should take about %d minutes to finish milling." -msgstr "大約還需要 %d 分鐘才能完成磨粉。" +msgid "It should take about %s to finish milling." +msgstr "" #: src/iexamine.cpp msgid "There's a mill here." @@ -205207,6 +211250,11 @@ msgid "" " doesn't know the recipe for the %s and can't continue crafting." msgstr " 不知道 %s的製作方法,因此無法繼續製作。" +#: src/iexamine.cpp +#, c-format +msgid "Use the %s to exercise?" +msgstr "" + #: src/init.cpp msgid "Finalizing" msgstr "最終處理" @@ -205784,7 +211832,7 @@ msgstr "體積 (%s): " msgid "There are no available choices" msgstr "沒有可用的選擇" -#: src/inventory_ui.cpp +#: src/inventory_ui.cpp src/worldfactory.cpp #, c-format msgid "[%s] Filter: " msgstr "" @@ -206211,7 +212259,7 @@ msgid "" "very bad idea." msgstr "" -#: src/item.cpp +#: src/item.cpp src/item_pocket.cpp #, c-format msgid " round of %s" msgid_plural " rounds of %s" @@ -206652,10 +212700,6 @@ msgstr "" msgid "Weight capacity bonus: " msgstr "" -#: src/item.cpp -msgid "Storage: " -msgstr "儲物空間: " - #: src/item.cpp msgid "* This item can be worn with a helmet." msgstr "* 這件物品能 與頭盔一起穿戴。" @@ -206920,6 +212964,34 @@ msgstr "" msgid "* This tool runs on bionic power." msgstr "* 這件工具 使用生化能量。" +#: src/item.cpp +msgid "It's new, and ready to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost new, with much material to burn." +msgstr "" + +#: src/item.cpp +msgid "More than a quarter has burned away." +msgstr "" + +#: src/item.cpp +msgid "More than half has burned away." +msgstr "" + +#: src/item.cpp +msgid "Less than a quarter left to burn." +msgstr "" + +#: src/item.cpp +msgid "Almost completely burned out." +msgstr "" + +#: src/item.cpp +msgid "Fuel: " +msgstr "" + #: src/item.cpp #, c-format msgid "Using: %s" @@ -206943,9 +213015,21 @@ msgstr "* 此物品可被強化。" msgid "* This item is not repairable." msgstr "* 這件物品無法修理。" +#. ~ 1 is approx. time (e.g. 'about 5 minutes'), 2 is a list of items +#: src/item.cpp +#, c-format +msgid "Disassembly takes %1$s and might yield: %2$s." +msgstr "" + +#. ~ 1 is approx. time, 2 is a list of items and tools with qualities, 3 is a +#. list of items. +#. ~ Bold text in the middle makes it easier to see where the second list +#. starts. #: src/item.cpp #, c-format -msgid "Disassembly takes %s and might yield: %s." +msgid "" +"Disassembly takes %1$s, requires %2$s and might " +"yield: %3$s." msgstr "" #: src/item.cpp @@ -206989,7 +213073,7 @@ msgstr "" #: src/item.cpp msgid "Environmental Protection: " -msgstr "" +msgstr "環境傷害防護:" #: src/item.cpp msgid "Bash Protection: " @@ -207057,26 +213141,27 @@ msgid "Critical hit chance %d%% - %d%%" msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d bashing (%d on a critical hit)" +msgid "Bashing: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d cutting (%d on a critical hit)" +msgid "Critical bash: " msgstr "" #: src/item.cpp -#, c-format -msgid "" -"%d piercing (%d on a critical hit)" +msgid "Cutting: " msgstr "" #: src/item.cpp -#, c-format -msgid "%d moves per attack" +msgid "Critical cut: " +msgstr "" + +#: src/item.cpp +msgid "Piercing: " +msgstr "" + +#: src/item.cpp +msgid "Critical pierce: " msgstr "" #: src/item.cpp @@ -207656,8 +213741,9 @@ msgstr "你的 %1$s 無法再容納更多的 %2$s。" msgid "That %s doesn't have room to expand." msgstr "沒有足夠的位置供 %s 打開。" -#: src/item.cpp src/item_factory.cpp src/trait_group.cpp +#: src/item.cpp #, c-format +msgctxt "components count" msgid "%d x %s" msgstr "%d x %s" @@ -207779,10 +213865,66 @@ msgstr "你沒有可以使用動作選單的物品。" msgid "Execute which action?" msgstr "執行什麼動作?" +#: src/item_contents.cpp +#, c-format +msgid "Press a key to add to %s" +msgstr "" + +#: src/item_contents.cpp +msgid "blacklist" +msgstr "" + +#: src/item_contents.cpp +msgid "whitelist" +msgstr "" + +#: src/item_contents.cpp +msgid " priority, " +msgstr "" + +#: src/item_contents.cpp +msgid " item, " +msgstr "" + +#: src/item_contents.cpp +msgid " category, " +msgstr "" + +#: src/item_contents.cpp +msgid " whitelist, " +msgstr "" + +#: src/item_contents.cpp +msgid " blacklist" +msgstr "" + +#: src/item_contents.cpp +#, c-format +msgid "Enter Priority (current priority %d)" +msgstr "" + +#: src/item_contents.cpp +msgid "item id" +msgstr "" + +#: src/item_contents.cpp +msgid "item category" +msgstr "" + +#: src/item_contents.cpp +msgid "Select an item from nearby" +msgstr "" + #: src/item_contents.cpp msgid "is not a container" msgstr "" +#: src/item_contents.cpp +#, c-format +msgid "pocket unacceptable because %s" +msgid_plural "pockets unacceptable because %s" +msgstr[0] "" + #: src/item_contents.cpp msgid "is not rigid" msgstr "" @@ -207819,6 +213961,11 @@ msgstr "測試哪一組?" msgid "Result of 100 spawns:" msgstr "100個產生的結果:" +#: src/item_factory.cpp src/trait_group.cpp +#, c-format +msgid "%d x %s" +msgstr "%d x %s" + #: src/item_location.cpp msgid "inventory" msgstr "物品欄" @@ -207841,6 +213988,10 @@ msgstr "" msgid "Pocket %d:" msgstr "" +#: src/item_pocket.cpp +msgid "Holds: " +msgstr "" + #: src/item_pocket.cpp msgid "Maximum item length: " msgstr "" @@ -208001,6 +214152,34 @@ msgstr "" msgid "not enough space" msgstr "" +#: src/item_pocket.cpp +msgid "Priority:" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +msgid "(empty)" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Item Blacklist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Whitelist: %s" +msgstr "" + +#: src/item_pocket.cpp +#, c-format +msgid "Category Blacklist: %s" +msgstr "" + #: src/itype.h msgid "click." msgstr "喀哩。" @@ -208068,14 +214247,6 @@ msgstr "你服用了一些抗生素。" msgid " takes some antibiotics." msgstr "服用了一些抗生素。" -#: src/iuse.cpp -msgid "The muscle spasms start to go away." -msgstr "肌肉痙攣開始消失了。" - -#: src/iuse.cpp -msgid "The medication does nothing to help the spasms." -msgstr "藥物無法改善痙攣的狀況。" - #: src/iuse.cpp msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " @@ -209604,10 +215775,6 @@ msgstr "貪食蛇" msgid "Sokoban" msgstr "倉庫番" -#: src/iuse.cpp src/iuse_software_minesweeper.cpp -msgid "Minesweeper" -msgstr "踩地雷" - #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" msgstr "開燈!" @@ -212478,7 +218645,7 @@ msgstr "%s 需要有 %s 鄰接。" msgid "You can't place a %s there. It contains a trap already." msgstr "你不能把%s放在這裡,這裡已經有陷阱了。" -#: src/iuse_actor.cpp +#: src/iuse_actor.cpp src/map.cpp #, c-format msgid "You trigger a %s!" msgstr "你觸動了 %s!" @@ -213653,6 +219820,10 @@ msgstr "新手" msgid "Intermediate" msgstr "中級" +#: src/iuse_software_minesweeper.cpp +msgid "Expert" +msgstr "專家" + #: src/iuse_software_minesweeper.cpp msgid "Level width:" msgstr "關卡寬度: " @@ -214227,6 +220398,15 @@ msgstr "產生" msgid "Summon" msgstr "召喚" +#: src/magic.cpp +msgid "random creature" +msgstr "" + +#: src/magic.cpp +#, c-format +msgid "Targets under: %dhp become a %s" +msgstr "" + #: src/magic.cpp src/veh_interact.cpp msgid "Range" msgstr "距離" @@ -214247,6 +220427,10 @@ msgstr "效果範圍" msgid "Spawned" msgstr "生成" +#: src/magic.cpp +msgid "Threshold" +msgstr "" + #: src/magic.cpp msgid "Recover" msgstr "恢復" @@ -214299,6 +220483,15 @@ msgstr "你的傷勢均分了。" msgid "%s wounds are closing up!" msgstr "%s 的傷口正在痊癒!" +#: src/magic_spell_effect.cpp +#, c-format +msgid "The %s transforms into a %s." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your target resists transformation." +msgstr "" + #: src/magic_spell_effect.cpp msgid "There is already a vehicle there." msgstr "" @@ -214522,25 +220715,25 @@ msgstr "容許你完全自定義點數、劇本、以及角色的職業、屬性 #: src/main_menu.cpp msgid "Select from one of previously created character templates." -msgstr "" +msgstr "從先前創好的角色模板中選擇。" #: src/main_menu.cpp msgid "" "Creates random character, but lets you preview the generated character and " "the scenario and change character and/or scenario if needed." -msgstr "" +msgstr "創建隨機角色,但是讓你預覽生成的角色和劇情,如果需要的話可以修改角色或劇情。" #: src/main_menu.cpp msgid "" "Puts you right in the game, randomly choosing character's traits, " "profession, skills and other parameters. Scenario is fixed to Evacuee." -msgstr "" +msgstr "把你直接丟入遊戲中,隨機選擇角色的特性、職業、技能和其他參數。劇情固定為撤離者。" #: src/main_menu.cpp msgid "" "Puts you right in the game, randomly choosing scenario and character's " "traits, profession, skills and other parameters." -msgstr "" +msgstr "把你直接丟入遊戲中,隨機選擇劇情和角色的特性、職業、技能和其他參數。" #: src/main_menu.cpp msgid "No templates found!" @@ -214756,30 +220949,23 @@ msgstr "%s的高壓滅菌器已經完成滅菌循環。" #: src/map.cpp #, c-format -msgid "The %s is taken down." -msgstr "%s已被拆下。" - -#: src/map.cpp -msgid "You disarm the trap!" -msgstr "你解除了陷阱!" - -#: src/map.cpp -msgid "You fail to disarm the trap." -msgstr "你解除陷阱失敗。" +msgid "Something has crawled out of the %s plants!" +msgstr "有東西從 %s 植物中爬出來了! " #: src/map.cpp -msgid "You fail to disarm the trap, and you set it off!" -msgstr "你解除陷阱失敗, 並觸發了!" +#, c-format +msgid "Something has crawled out of the %s!" +msgstr "有東西從 %s 爬出來了!" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s plants!" -msgstr "有東西從 %s 植物中爬出來了! " +msgid "You've spotted a %1$ss!" +msgstr "" #: src/map.cpp #, c-format -msgid "Something has crawled out of the %s!" -msgstr "有東西從 %s 爬出來了!" +msgid " triggers a %s!" +msgstr "" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -215206,7 +221392,7 @@ msgstr "%s 在持武時無法施展。" #: src/martialarts.cpp #, c-format msgid "The %1$s is not a valid %2$s weapon." -msgstr "" +msgstr "%1$s 並不是合適的 %2$s 武器。" #: src/martialarts.cpp msgid "Block Counter" @@ -216320,6 +222506,19 @@ msgctxt "memorial_female" msgid "Became wanted by the police!" msgstr "你成了十大通緝要犯!" +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broke his %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broke her %s." +msgstr "" + #. ~ %s is bodypart #: src/memorial_logger.cpp #, c-format @@ -217287,6 +223486,18 @@ msgctxt "memorial_female" msgid "Set off an alarm." msgstr "引發警報。" +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Used the debug menu (%s)." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Used the debug menu (%s)." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a #. whack! x 12" #: src/messages.cpp @@ -220146,6 +226357,11 @@ msgstr "" msgid "zombie slave" msgstr "屍奴 " +#: src/monexamine.cpp +#, c-format +msgid "Push %s" +msgstr "推 %s" + #: src/monexamine.cpp msgid "Rename" msgstr "重新命名" @@ -221113,11 +227329,6 @@ msgstr "專注力趨向:" msgid "You feel bugs crawl over your skin." msgstr "" -#: src/mtype.cpp -msgid "human" -msgid_plural "humans" -msgstr[0] "人類" - #: src/mutation.cpp #, c-format msgid "Your %s is destroyed!" @@ -222077,17 +228288,6 @@ msgstr "" msgid "Blood type:" msgstr "" -#: src/newcharacter.cpp -#, c-format -msgid "" -"* Random location * (%d variants)" -msgstr "" - -#: src/newcharacter.cpp -#, c-format -msgid "%s (%d variants)" -msgstr "" - #: src/newcharacter.cpp msgid "Name:" msgstr "名字:" @@ -222100,6 +228300,20 @@ msgstr "性別:" msgid "Select a starting location." msgstr "選擇一個起始地點。" +#: src/newcharacter.cpp +#, c-format +msgid "" +"* Random location * (%d variant)" +msgid_plural "" +"* Random location * (%d variants)" +msgstr[0] "" + +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" + #: src/newcharacter.cpp msgid "Stats:" msgstr "屬性:" @@ -222169,6 +228383,12 @@ msgstr "" msgid "Starting location:" msgstr "起始地點:" +#: src/newcharacter.cpp +#, c-format +msgid "%s (%d variant)" +msgid_plural "%s (%d variants)" +msgstr[0] "" + #: src/newcharacter.cpp msgid "Starting Vehicle: " msgstr "" @@ -223838,6 +230058,14 @@ msgstr "打爛" msgid "Pulp Adjacent" msgstr "打爛鄰接" +#: src/options.cpp +msgid "Pulp Adjacent Zombie Only" +msgstr "" + +#: src/options.cpp +msgid "Pulp Zombies Only" +msgstr "" + #: src/options.cpp msgid "Auto mining" msgstr "自動採礦" @@ -225353,17 +231581,6 @@ msgstr "受輻射影響突變" msgid "If true, radiation causes the player to mutate." msgstr "設定為 [是], 輻射會造成玩家的突變。" -#: src/options.cpp -msgid "Z-levels" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, enables several features related to vertical movement, such as " -"hauling items up stairs, climbing downspouts, and flying aircraft. May " -"cause problems if toggled mid-game." -msgstr "" - #: src/options.cpp msgid "Character point pools" msgstr "角色點數" @@ -226163,6 +232380,16 @@ msgstr "區域:" msgid "# Unexplored" msgstr "# 尚未探索" +#: src/overmap_ui.cpp +#, c-format +msgid "oter: %s" +msgstr "" + +#: src/overmap_ui.cpp +#, c-format +msgid "oter_type: %s" +msgstr "" + #: src/overmap_ui.cpp msgid "Distance to active mission:" msgstr "距離任務地點:" @@ -226492,6 +232719,10 @@ msgstr "酷熱!" msgid "Very hot!" msgstr "很熱!" +#: src/panels.cpp +msgid "Comfortable" +msgstr "舒適" + #: src/panels.cpp msgid "Very cold!" msgstr "很冷!" @@ -227939,6 +234170,10 @@ msgctxt "speed penalty" msgid "Thirst -%2d%%" msgstr "口渴 -%2d%%" +#: src/player_display.cpp +msgid "Starving" +msgstr "瀕臨飢荒" + #: src/player_display.cpp msgid "Underfed" msgstr "營養不良" @@ -228033,6 +234268,10 @@ msgstr "" "你的身體因為營養不良而變得嚴重虛弱。如果再不開始定期進食,你可能會死!\n" "\n" +#: src/player_display.cpp +msgid "Malnourished" +msgstr "營養不良" + #: src/player_display.cpp msgid "" "Your body is weakened by starvation. Only time and regular meals will help you recover.\n" @@ -229157,6 +235396,14 @@ msgid "%1$d tool with %2$s of %3$d or more." msgid_plural "%1$d tools with %2$s of %3$d or more." msgstr[0] "%1$d 個 %2$s %3$d 級 以上的工具" +#. ~ %1$d: tool count, %2$s: quality requirement name, %3$d: quality level +#. requirement +#: src/requirements.cpp +#, c-format +msgid "%1$d tool with %2$s of %3$d or more" +msgid_plural "%1$d tools with %2$s of %3$d or more" +msgstr[0] "" + #. ~ %1$s: tool name, %2$d: charge requirement #: src/requirements.cpp #, c-format @@ -230029,6 +236276,19 @@ msgctxt "grammatical gender list" msgid "n" msgstr "" +#: src/trap.cpp +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" +msgstr "" +"可見:%d\n" +"避免:%d\n" +"困難:%d\n" +"良性:%s" + #: src/trapfunc.cpp msgid "You step on some bubble wrap!" msgstr "你踩到了泡泡紙!" @@ -232932,7 +239192,7 @@ msgstr "多雲" #: src/weather_data.cpp msgid "Light Drizzle" -msgstr "" +msgstr "毛毛細雨" #: src/weather_data.cpp msgid "Drizzle" @@ -233084,7 +239344,7 @@ msgstr "@ %d: %s " #: src/wish.cpp #, c-format msgid "Set '%s' to…" -msgstr "" +msgstr "設定 '%s' 為…" #: src/wish.cpp msgid " (current)" @@ -233189,6 +239449,10 @@ msgstr "… 按 %s 檢視完整模組描述 " msgid "--NO AVAILABLE MODS--" msgstr "--沒有可用的模組--" +#: src/worldfactory.cpp +msgid "--NO RESULTS FOUND--" +msgstr "" + #: src/worldfactory.cpp msgid "Saved list of active mods as default" msgstr "已將啟動中的模組列表儲存為預設值" diff --git a/msvc-full-features/Cataclysm-lib-vcpkg-static.vcxproj b/msvc-full-features/Cataclysm-lib-vcpkg-static.vcxproj index 66cf377f1163a..578271efa0d3e 100644 --- a/msvc-full-features/Cataclysm-lib-vcpkg-static.vcxproj +++ b/msvc-full-features/Cataclysm-lib-vcpkg-static.vcxproj @@ -1,137 +1,145 @@ - - - Debug - x64 - - - Debug - Win32 - - - Release - x64 - - - Release - Win32 - - + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + 16.0 {0009BB11-11AD-4C14-A5FC-D882A942C00B} Win32Proj CataclysmLib 10.0 - x86-windows-static - x64-windows-static + x86-windows-static + x64-windows-static + + + true + true + true + true + true + x86-windows + x64-windows + $(Configuration) - - StaticLibrary - v142 - MultiByte + StaticLibrary + v142 + MultiByte - true + true - false - false + false + false + + + + + + + + + + $(ProjectName)-$(Configuration)-$(Platform) + .lib + $(SolutionDir)..\ + $(SolutionDir)$(ProjectName)\$(Configuration)\$(Platform)\ + + + true + + + false - - - - - - - - - - $(ProjectName)-$(Configuration)-$(Platform) - .lib - $(SolutionDir)..\ - $(SolutionDir)$(ProjectName)\$(Configuration)\$(Platform)\ - - - true - - - false - - - - Level1 - Use - true - false - true - false - ProgramDatabase - 4819;4146;26495;26444;26451;4068;6319;6237 - stdafx.h - /bigobj /utf-8 %(AdditionalOptions) - _SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32_LEAN_AND_MEAN;_CONSOLE;SDL_SOUND;TILES;SDL_BUILDING_LIBRARY;LOCALIZE;USE_VCPKG;%(PreprocessorDefinitions) - stdcpp14 - ..\src;%(AdditionalIncludeDirectories) - - - Windows - true - Default - true - /LTCG:OFF %(AdditionalOptions) - winmm.lib;imm32.lib;version.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;setupapi.lib;%(AdditionalDependencies) - - - prebuild.cmd - Get version string - - - true - - - - - Disabled - false - false - _DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebug - - - - - MaxSpeed - true - true - NDEBUG;%(PreprocessorDefinitions) - DebugFastLink - MultiThreaded - - - true - true - - - - - WIN32;%(PreprocessorDefinitions) - - - - - - - - - - Create - - - - - + + + Level1 + Use + true + false + true + false + ProgramDatabase + 4819;4146;26495;26444;26451;4068;6319;6237 + stdafx.h + /bigobj /utf-8 %(AdditionalOptions) + _SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;WIN32_LEAN_AND_MEAN;_CONSOLE;SDL_SOUND;TILES;SDL_BUILDING_LIBRARY;LOCALIZE;USE_VCPKG;%(PreprocessorDefinitions) + stdcpp14 + ..\src;%(AdditionalIncludeDirectories) + + + Windows + true + Default + true + /LTCG:OFF %(AdditionalOptions) + winmm.lib;imm32.lib;version.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;setupapi.lib;%(AdditionalDependencies) + + + prebuild.cmd + Get version string + + + true + + + + + Disabled + false + false + _DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebug + + + + + MaxSpeed + true + true + NDEBUG;%(PreprocessorDefinitions) + DebugFastLink + MultiThreaded + + + true + true + + + + + WIN32;%(PreprocessorDefinitions) + + + + + + + + + + Create + + + + + diff --git a/msvc-full-features/Cataclysm-test-vcpkg-static.vcxproj b/msvc-full-features/Cataclysm-test-vcpkg-static.vcxproj index e1bfccb6bdd0c..6591853dcfe85 100644 --- a/msvc-full-features/Cataclysm-test-vcpkg-static.vcxproj +++ b/msvc-full-features/Cataclysm-test-vcpkg-static.vcxproj @@ -27,6 +27,16 @@ x86-windows-static x64-windows-static + + true + true + true + true + true + x86-windows + x64-windows + $(Configuration) + Application @@ -138,4 +148,4 @@ - \ No newline at end of file + diff --git a/msvc-full-features/Cataclysm-vcpkg-static.sln b/msvc-full-features/Cataclysm-vcpkg-static.sln index ce23375f05220..38c183d6ab5f7 100644 --- a/msvc-full-features/Cataclysm-vcpkg-static.sln +++ b/msvc-full-features/Cataclysm-vcpkg-static.sln @@ -7,6 +7,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject ..\.editorconfig = ..\.editorconfig AStyleExtension-Cataclysm-DDA.cfg = AStyleExtension-Cataclysm-DDA.cfg + vcpkg.json = vcpkg.json EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cataclysm-vcpkg-static", "Cataclysm-vcpkg-static.vcxproj", "{19F0BE17-3DAF-40E8-A9D2-904A56382E54}" diff --git a/msvc-full-features/Cataclysm-vcpkg-static.vcxproj b/msvc-full-features/Cataclysm-vcpkg-static.vcxproj index b8021c0e3d405..422b2df1fcbcb 100644 --- a/msvc-full-features/Cataclysm-vcpkg-static.vcxproj +++ b/msvc-full-features/Cataclysm-vcpkg-static.vcxproj @@ -27,6 +27,16 @@ x86-windows-static x64-windows-static + + true + true + true + true + true + x86-windows + x64-windows + $(Configuration) + Application @@ -132,4 +142,4 @@ - \ No newline at end of file + diff --git a/msvc-full-features/JsonFormatter.vcxproj b/msvc-full-features/JsonFormatter.vcxproj index bf31ec6133545..7ffd9f160301e 100644 --- a/msvc-full-features/JsonFormatter.vcxproj +++ b/msvc-full-features/JsonFormatter.vcxproj @@ -27,6 +27,16 @@ x86-windows-static x64-windows-static + + true + true + true + true + true + x86-windows + x64-windows + $(Configuration) + Application diff --git a/msvc-full-features/vcpkg.json b/msvc-full-features/vcpkg.json new file mode 100644 index 0000000000000..4d441c9ec9c6f --- /dev/null +++ b/msvc-full-features/vcpkg.json @@ -0,0 +1,14 @@ +{ + "name": "cdda-vcpkg-dependencies", + "version-string": "0.E", + "dependencies": [ + "sdl2", + "sdl2-image", + { + "name": "sdl2-mixer", + "features": [ "dynamic-load", "libflac", "mpg123", "libmodplug", "libvorbis" ] + }, + "sdl2-ttf", + "gettext" + ] +} diff --git a/src/achievement.cpp b/src/achievement.cpp index e5fb30b8ce2e6..b96b914ff4815 100644 --- a/src/achievement.cpp +++ b/src/achievement.cpp @@ -15,7 +15,7 @@ // the execution flow to help clarify how it all fits together. // // * Various core game code paths generate events via the event bus. -// * The stats_traecker subscribes to the event bus, and receives these events. +// * The stats_tracker subscribes to the event bus, and receives these events. // * Events contribute to event_multisets managed by the stats_tracker. // * (In the docs, these event_multisets are described as "event streams"). // * (Optionally) event_transformations transform these event_multisets into diff --git a/src/action.cpp b/src/action.cpp index 4c0eec381e9d2..6c90378d8d543 100644 --- a/src/action.cpp +++ b/src/action.cpp @@ -296,6 +296,8 @@ std::string action_ident( action_id act ) return "ignore_enemy"; case ACTION_WHITELIST_ENEMY: return "whitelist_enemy"; + case ACTION_WORKOUT: + return "workout"; case ACTION_SAVE: return "save"; case ACTION_QUICKSAVE: @@ -656,8 +658,7 @@ bool can_examine_at( const tripoint &p ) return true; } - const trap &tr = here.tr_at( p ); - return tr.can_see( p, g->u ); + return here.can_see_trap_at( p, g->u ); } static bool can_pickup_at( const tripoint &p ) @@ -928,6 +929,7 @@ action_id handle_action_menu() } else if( category == _( "Misc" ) ) { REGISTER_ACTION( ACTION_WAIT ); REGISTER_ACTION( ACTION_SLEEP ); + REGISTER_ACTION( ACTION_WORKOUT ); REGISTER_ACTION( ACTION_BIONICS ); REGISTER_ACTION( ACTION_MUTATIONS ); REGISTER_ACTION( ACTION_CONTROL_VEHICLE ); diff --git a/src/action.h b/src/action.h index ad6b004fe8452..db4a3e0bcd4ec 100644 --- a/src/action.h +++ b/src/action.h @@ -219,6 +219,8 @@ enum action_id : int { ACTION_IGNORE_ENEMY, /** Whitelist the enemy that triggered safemode */ ACTION_WHITELIST_ENEMY, + /** Open workout menu */ + ACTION_WORKOUT, /** Save the game and quit */ ACTION_SAVE, /** Quicksave the game */ diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index 3cfe572ba1f88..ecf459b91ca91 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -21,6 +21,7 @@ #include "line.h" #include "map.h" #include "map_iterator.h" +#include "morale_types.h" #include "npc.h" #include "options.h" #include "output.h" @@ -89,7 +90,7 @@ std::string enum_to_string( WS data ) aim_activity_actor::aim_activity_actor() { - initial_view_offset = g->u.view_offset; + initial_view_offset = get_avatar().view_offset; } aim_activity_actor aim_activity_actor::use_wielded() @@ -135,7 +136,7 @@ void aim_activity_actor::do_turn( player_activity &act, Character &who ) aborted = true; return; } - avatar &you = g->u; + avatar &you = get_avatar(); item *weapon = get_weapon(); if( !weapon || !avatar_action::can_fire_weapon( you, get_map(), *weapon ) ) { @@ -240,10 +241,12 @@ std::unique_ptr aim_activity_actor::deserialize( JsonIn &jsin ) item *aim_activity_actor::get_weapon() { switch( weapon_source ) { - case WeaponSource::Wielded: + case WeaponSource::Wielded: { + Character &player_character = get_player_character(); // Check for lost gun (e.g. yanked by zombie technician) // TODO: check that this is the same gun that was used to start aiming - return g->u.weapon.is_null() ? nullptr : &g->u.weapon; + return player_character.weapon.is_null() ? nullptr : &player_character.weapon; + } case WeaponSource::Bionic: case WeaponSource::Mutation: // TODO: check if the player lost relevant bionic/mutation @@ -256,10 +259,11 @@ item *aim_activity_actor::get_weapon() void aim_activity_actor::restore_view() { - bool changed_z = g->u.view_offset.z != initial_view_offset.z; - g->u.view_offset = initial_view_offset; + avatar &player_character = get_avatar(); + bool changed_z = player_character.view_offset.z != initial_view_offset.z; + player_character.view_offset = initial_view_offset; if( changed_z ) { - get_map().invalidate_map_cache( g->u.view_offset.z ); + get_map().invalidate_map_cache( player_character.view_offset.z ); g->invalidate_main_ui_adaptor(); } } @@ -267,7 +271,7 @@ void aim_activity_actor::restore_view() bool aim_activity_actor::load_RAS_weapon() { // TODO: use activity for fetching ammo and loading weapon - player &you = g->u; + player &you = get_avatar(); item *weapon = get_weapon(); gun_mode gun = weapon->gun_current_mode(); const auto ammo_location_is_valid = [&]() -> bool { @@ -312,7 +316,7 @@ bool aim_activity_actor::load_RAS_weapon() void aim_activity_actor::unload_RAS_weapon() { // Unload reload-and-shoot weapons to avoid leaving bows pre-loaded with arrows - avatar &you = g->u; + avatar &you = get_avatar(); item *weapon = get_weapon(); if( !weapon ) { return; @@ -389,7 +393,7 @@ void dig_activity_actor::finish( player_activity &act, Character &who ) calendar::turn ) ); } - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = get_avatar().get_num_crafting_helpers( 3 ); who.mod_stored_nutr( 5 - helpersize ); who.mod_thirst( 5 - helpersize ); who.mod_fatigue( 10 - ( helpersize * 2 ) ); @@ -401,6 +405,8 @@ void dig_activity_actor::finish( player_activity &act, Character &who ) } act.set_to_null(); + + here.maybe_trigger_trap( location, who, true ); } void dig_activity_actor::serialize( JsonOut &jsout ) const @@ -459,7 +465,7 @@ void dig_channel_activity_actor::finish( player_activity &act, Character &who ) calendar::turn ) ); } - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = get_avatar().get_num_crafting_helpers( 3 ); who.mod_stored_nutr( 5 - helpersize ); who.mod_thirst( 5 - helpersize ); who.mod_fatigue( 10 - ( helpersize * 2 ) ); @@ -467,6 +473,8 @@ void dig_channel_activity_actor::finish( player_activity &act, Character &who ) here.ter( location ).obj().name() ); act.set_to_null(); + + here.maybe_trigger_trap( location, who, true ); } void dig_channel_activity_actor::serialize( JsonOut &jsout ) const @@ -1128,19 +1136,22 @@ std::unique_ptr open_gate_activity_actor::deserialize( JsonIn &j void consume_activity_actor::start( player_activity &act, Character &guy ) { int moves; + Character &player_character = get_player_character(); if( consume_location ) { - const auto ret = g->u.will_eat( *consume_location, true ); + const auto ret = player_character.will_eat( *consume_location, true ); if( !ret.success() ) { consume_menu_selections = std::vector(); + consume_menu_filter = std::string(); return; } else { force = true; } moves = to_moves( guy.get_consume_time( *consume_location ) ); } else if( !consume_item.is_null() ) { - const auto ret = g->u.will_eat( consume_item, true ); + const auto ret = player_character.will_eat( consume_item, true ); if( !ret.success() ) { consume_menu_selections = std::vector(); + consume_menu_filter = std::string(); return; } else { force = true; @@ -1162,22 +1173,34 @@ void consume_activity_actor::finish( player_activity &act, Character & ) // too late; we've already consumed). act.interruptable = false; + avatar &player_character = get_avatar(); if( consume_location ) { - g->u.consume( consume_location, force ); + player_character.consume( consume_location, force ); } else if( !consume_item.is_null() ) { - g->u.consume( consume_item, force ); + player_character.consume( consume_item, force ); } else { debugmsg( "Item location/name to be consumed should not be null." ); } - if( g->u.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { - g->u.set_value( "THIEF_MODE", "THIEF_ASK" ); + if( player_character.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { + player_character.set_value( "THIEF_MODE", "THIEF_ASK" ); } //setting act to null clears these so back them up std::vector temp_selections = consume_menu_selections; - act.set_to_null(); - if( !temp_selections.empty() ) { - g->u.assign_activity( ACT_EAT_MENU ); - g->u.activity.values = temp_selections; + const std::string temp_filter = consume_menu_filter; + if( act.id() == activity_id( "ACT_CONSUME" ) ) { + act.set_to_null(); + } + if( !temp_selections.empty() || !temp_filter.empty() ) { + if( act.is_null() ) { + player_character.assign_activity( ACT_EAT_MENU ); + player_character.activity.values = temp_selections; + player_character.activity.str_values = { temp_filter }; + } else { + player_activity eat_menu( ACT_EAT_MENU ); + eat_menu.values = temp_selections; + eat_menu.str_values = { temp_filter }; + player_character.backlog.push_back( eat_menu ); + } } } @@ -1188,6 +1211,7 @@ void consume_activity_actor::serialize( JsonOut &jsout ) const jsout.member( "consume_location", consume_location ); jsout.member( "consume_item", consume_item ); jsout.member( "consume_menu_selections", consume_menu_selections ); + jsout.member( "consume_menu_filter", consume_menu_filter ); jsout.member( "force", force ); jsout.end_object(); @@ -1203,6 +1227,7 @@ std::unique_ptr consume_activity_actor::deserialize( JsonIn &jsi data.read( "consume_location", actor.consume_location ); data.read( "consume_item", actor.consume_item ); data.read( "consume_menu_selections", actor.consume_menu_selections ); + data.read( "consume_menu_filter", actor.consume_menu_filter ); data.read( "force", actor.force ); return actor.clone(); @@ -1293,6 +1318,243 @@ std::unique_ptr try_sleep_activity_actor::deserialize( JsonIn &j return actor.clone(); } +void workout_activity_actor::start( player_activity &act, Character &who ) +{ + if( who.get_fatigue() > fatigue_levels::DEAD_TIRED ) { + who.add_msg_if_player( _( "You are too tired to exercise." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + if( who.get_thirst() > 240 ) { + who.add_msg_if_player( _( "You are too dehydrated to exercise." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + if( who.is_armed() ) { + who.add_msg_if_player( _( "Empty your hands first." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + map &here = get_map(); + // free training requires all limbs intact, but specialized workout machines + // train upper or lower parts of body only and may permit workout with + // broken limbs as long as they are not involved by the machine + bool hand_equipment = here.has_flag_furn( "WORKOUT_ARMS", location ); + bool leg_equipment = here.has_flag_furn( "WORKOUT_LEGS", location ); + static const bodypart_id arm_l = bodypart_id( "arm_l" ); + static const bodypart_id arm_r = bodypart_id( "arm_r" ); + static const bodypart_id leg_l = bodypart_id( "leg_l" ); + static const bodypart_id leg_r = bodypart_id( "leg_r" ); + if( hand_equipment && ( ( who.is_limb_broken( arm_l ) ) || + who.is_limb_broken( arm_r ) ) ) { + who.add_msg_if_player( _( "You cannot train here with a broken arm." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + if( leg_equipment && ( ( who.is_limb_broken( leg_l ) ) || + who.is_limb_broken( leg_r ) ) ) { + who.add_msg_if_player( _( "You cannot train here with a broken leg." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + if( !hand_equipment && !leg_equipment && + ( who.is_limb_broken( arm_l ) || + who.is_limb_broken( arm_r ) || + who.is_limb_broken( leg_l ) || + who.is_limb_broken( leg_r ) ) ) { + who.add_msg_if_player( _( "You cannot train freely with a broken limb." ) ); + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + uilist workout_query; + workout_query.desc_enabled = true; + workout_query.text = + _( "Physical effort determines workout efficiency, but also rate of exhaustion." ); + workout_query.title = _( "Choose training intensity:" ); + workout_query.addentry_desc( 1, true, 'l', _( "Light" ), + _( "Light excercise comparable in intensity to walking, but more focused and methodical." ) ); + workout_query.addentry_desc( 2, true, 'm', _( "Moderate" ), + _( "Moderate excercise without excessive exertion, but with enough effort to break a sweat." ) ); + workout_query.addentry_desc( 3, true, 'a', _( "Active" ), + _( "Active excercise with full involvement. Strenuous, but in a controlled manner." ) ); + workout_query.addentry_desc( 4, true, 'h', _( "High" ), + _( "High intensity excercise with maximum effort and full power. Exhausting in the long run." ) ); + workout_query.query(); + switch( workout_query.ret ) { + case UILIST_CANCEL: + act.set_to_null(); + act_id = activity_id::NULL_ID(); + return; + case 4: + act_id = activity_id( "ACT_WORKOUT_HARD" ); + intensity_modifier = 4; + break; + case 3: + act_id = activity_id( "ACT_WORKOUT_ACTIVE" ); + intensity_modifier = 3; + break; + case 2: + act_id = activity_id( "ACT_WORKOUT_MODERATE" ); + intensity_modifier = 2; + break; + case 1: + default: + act_id = activity_id( "ACT_WORKOUT_LIGHT" ); + intensity_modifier = 1; + break; + } + int length; + query_int( length, _( "Train for how long (minutes): " ) ); + if( length > 0 ) { + duration = length * 1_minutes; + } else { + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return; + } + act.moves_total = to_moves( duration ); + act.moves_left = act.moves_total; + if( who.male ) { + sfx::play_activity_sound( "plmove", "fatigue_m_med", sfx::get_heard_volume( location ) ); + } else { + sfx::play_activity_sound( "plmove", "fatigue_f_med", sfx::get_heard_volume( location ) ); + } + who.add_msg_if_player( _( "You start your workout session." ) ); +} + +void workout_activity_actor::do_turn( player_activity &act, Character &who ) +{ + if( who.get_fatigue() > fatigue_levels::DEAD_TIRED ) { + who.add_msg_if_player( _( "You are exhausted so you finish your workout early." ) ); + act.set_to_null(); + return; + } + if( who.get_thirst() > 240 ) { + who.add_msg_if_player( _( "You are dehydrated so you finish your workout early." ) ); + act.set_to_null(); + return; + } + if( !rest_mode && who.get_stamina() > who.get_stamina_max() / 3 ) { + who.mod_stamina( -25 - intensity_modifier ); + if( one_in( 180 / intensity_modifier ) ) { + who.mod_fatigue( 1 ); + who.mod_thirst( 1 ); + } + if( calendar::once_every( 16_minutes / intensity_modifier ) ) { + //~ heavy breathing when excercising + std::string huff = _( "yourself huffing and puffing!" ); + sounds::sound( location + tripoint_east, 2 * intensity_modifier, sounds::sound_t::speech, huff, + true ); + } + // morale bonus kicks in gradually after 5 minutes of exercise + if( calendar::once_every( 2_minutes ) && + ( ( elapsed + act.moves_total - act.moves_left ) / 100 * 1_turns ) > 5_minutes ) { + who.add_morale( MORALE_FEELING_GOOD, intensity_modifier, 20, 6_hours, 30_minutes ); + } + if( calendar::once_every( 2_minutes ) ) { + who.add_msg_if_player( m_debug, who.activity_level_str() ); + who.add_msg_if_player( m_debug, act.id().c_str() ); + } + } else if( !rest_mode ) { + rest_mode = true; + who.add_msg_if_player( _( "You catch your breath for few moments." ) ); + } else if( who.get_stamina() >= who.get_stamina_max() ) { + rest_mode = false; + who.add_msg_if_player( _( "You get back to your training." ) ); + } +} + +void workout_activity_actor::finish( player_activity &act, Character &who ) +{ + if( !query_keep_training( act, who ) ) { + act.set_to_null(); + who.add_msg_if_player( _( "You finish your workout session." ) ); + } +} + +void workout_activity_actor::canceled( player_activity &/*act*/, Character &/*who*/ ) +{ + stop_time = calendar::turn; +} + +bool workout_activity_actor::query_keep_training( player_activity &act, Character &who ) +{ + if( disable_query || !who.is_avatar() ) { + elapsed += act.moves_total - act.moves_left; + act.moves_total = to_moves( 60_minutes ); + act.moves_left = act.moves_total; + return true; + } + int length; + uilist workout_query; + workout_query.text = _( "You have finished your training cycle, keep training?" ); + workout_query.addentry( 1, true, 'S', _( "Stop training." ) ); + workout_query.addentry( 2, true, 'c', _( "Continue training." ) ); + workout_query.addentry( 3, true, 'C', _( "Continue training and don't ask again." ) ); + workout_query.query(); + switch( workout_query.ret ) { + case UILIST_CANCEL: + case 1: + act_id = activity_id::NULL_ID(); + act.set_to_null(); + return false; + case 3: + disable_query = true; + elapsed += act.moves_total - act.moves_left; + act.moves_total = to_moves( 60_minutes ); + act.moves_left = act.moves_total; + return true; + case 2: + default: + query_int( length, _( "Train for how long (minutes): " ) ); + elapsed += act.moves_total - act.moves_left; + act.moves_total = to_moves( length * 1_minutes ); + act.moves_left = act.moves_total; + return true; + break; + } +} + +void workout_activity_actor::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + + jsout.member( "disable_query", disable_query ); + jsout.member( "act_id", act_id ); + jsout.member( "duration", duration ); + jsout.member( "location", location ); + jsout.member( "stop_time", stop_time ); + jsout.member( "elapsed", elapsed ); + jsout.member( "intensity_modifier", intensity_modifier ); + jsout.member( "rest_mode", rest_mode ); + + jsout.end_object(); +} + +std::unique_ptr workout_activity_actor::deserialize( JsonIn &jsin ) +{ + workout_activity_actor actor = workout_activity_actor( tripoint_zero ); + + JsonObject data = jsin.get_object(); + + data.read( "disable_query", actor.disable_query ); + data.read( "act_id", actor.act_id ); + data.read( "duration", actor.duration ); + data.read( "location", actor.location ); + data.read( "stop_time", actor.stop_time ); + data.read( "elapsed", actor.elapsed ); + data.read( "intensity_modifier", actor.intensity_modifier ); + data.read( "rest_mode", actor.rest_mode ); + + return actor.clone(); +} + namespace activity_actors { @@ -1311,6 +1573,10 @@ deserialize_functions = { { activity_id( "ACT_OPEN_GATE" ), &open_gate_activity_actor::deserialize }, { activity_id( "ACT_PICKUP" ), &pickup_activity_actor::deserialize }, { activity_id( "ACT_TRY_SLEEP" ), &try_sleep_activity_actor::deserialize }, + { activity_id( "ACT_WORKOUT_HARD" ), &workout_activity_actor::deserialize }, + { activity_id( "ACT_WORKOUT_ACTIVE" ), &workout_activity_actor::deserialize }, + { activity_id( "ACT_WORKOUT_MODERATE" ), &workout_activity_actor::deserialize }, + { activity_id( "ACT_WORKOUT_LIGHT" ), &workout_activity_actor::deserialize }, }; } // namespace activity_actors diff --git a/src/activity_actor.h b/src/activity_actor.h index e8eeff6d42169..de7ded2e1afb0 100644 --- a/src/activity_actor.h +++ b/src/activity_actor.h @@ -7,6 +7,7 @@ #include #include +#include "activity_type.h" #include "clone_ptr.h" #include "item_location.h" #include "item.h" @@ -514,6 +515,7 @@ class consume_activity_actor : public activity_actor item_location consume_location; item consume_item; std::vector consume_menu_selections; + std::string consume_menu_filter; bool force = false; /** * @pre @p other is a consume_activity_actor @@ -525,8 +527,10 @@ class consume_activity_actor : public activity_actor } public: consume_activity_actor( const item_location &consume_location, - std::vector consume_menu_selections ) : - consume_location( consume_location ), consume_menu_selections( consume_menu_selections ) {} + std::vector consume_menu_selections, + const std::string &consume_menu_filter ) : + consume_location( consume_location ), consume_menu_selections( consume_menu_selections ), + consume_menu_filter( consume_menu_filter ) {} consume_activity_actor( const item_location &consume_location ) : consume_location( consume_location ), consume_menu_selections( std::vector() ) {} @@ -581,6 +585,46 @@ class try_sleep_activity_actor : public activity_actor static std::unique_ptr deserialize( JsonIn &jsin ); }; +class workout_activity_actor : public activity_actor +{ + private: + bool disable_query = false; // disables query, continue as long as possible + bool rest_mode = false; // work or rest during training session + time_duration duration; + tripoint location; + time_point stop_time; // can resume if time apart is not above + activity_id act_id = activity_id( "ACT_WORKOUT_LIGHT" ); // variable activities + int intensity_modifier = 1; + int elapsed = 0; + + public: + workout_activity_actor( const tripoint &loc ) : location( loc ) {} + + // can assume different sub-activities + activity_id get_type() const override { + return act_id; + } + + bool can_resume_with_internal( const activity_actor &other, const Character & ) const override { + const workout_activity_actor &w_actor = static_cast( other ); + return ( location == w_actor.location && calendar::turn - stop_time <= 10_minutes ); + } + + void start( player_activity &act, Character &who ) override; + void do_turn( player_activity &act, Character &who ) override; + void finish( player_activity &act, Character &who ) override; + void canceled( player_activity &/*act*/, Character &/*who*/ ) override; + + bool query_keep_training( player_activity &act, Character &who ); + + std::unique_ptr clone() const override { + return std::make_unique( *this ); + } + + void serialize( JsonOut &jsout ) const override; + static std::unique_ptr deserialize( JsonIn &jsin ); +}; + namespace activity_actors { diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 664a2c369649e..094d771cc1b92 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -1718,7 +1718,7 @@ void activity_handlers::firstaid_finish( player_activity *act, player *p ) // TODO: Store the patient somehow, retrieve here player &patient = *p; - const hp_part healed = static_cast( act->values[0] ); + const bodypart_id healed = bodypart_id( act->str_values[0] ); const int charges_consumed = actor->finish_using( *p, patient, *used_tool, healed ); p->consume_charges( it, charges_consumed ); @@ -1771,7 +1771,8 @@ void activity_handlers::forage_finish( player_activity *act, player *p ) debugmsg( "Invalid season" ); } - here.ter_set( here.getlocal( act->placement ), next_ter ); + const tripoint bush_pos = here.getlocal( act->placement ); + here.ter_set( bush_pos, next_ter ); // Survival gives a bigger boost, and Perception is leveled a bit. // Both survival and perception affect time to forage @@ -1809,6 +1810,8 @@ void activity_handlers::forage_finish( player_activity *act, player *p ) iexamine::practice_survival_while_foraging( p ); act->set_to_null(); + + here.maybe_trigger_trap( bush_pos, *p, true ); } void activity_handlers::generic_game_do_turn( player_activity * /*act*/, player *p ) @@ -2038,35 +2041,32 @@ void activity_handlers::reload_finish( player_activity *act, player *p ) } item &reloadable = *act->targets[ 0 ]; - item &ammo = *act->targets[1]; + item &ammo = *act->targets[ 1 ]; + std::string reloadable_name = reloadable.tname(); std::string ammo_name = ammo.tname(); const int qty = act->index; - const bool is_speedloader = ammo.has_flag( flag_SPEEDLOADER ); - const bool ammo_is_filthy = ammo.is_filthy(); if( !reloadable.reload( *p, std::move( act->targets[ 1 ] ), qty ) ) { - add_msg( m_info, _( "Can't reload the %s." ), reloadable.tname() ); + add_msg( m_info, _( "Can't reload the %s." ), reloadable_name ); return; } - std::string msg = _( "You reload the %s." ); - - if( ammo_is_filthy ) { + if( ammo.is_filthy() ) { reloadable.set_flag( "FILTHY" ); } if( reloadable.get_var( "dirt", 0 ) > 7800 ) { - msg = - _( "You manage to loosen some debris and make your %s somewhat operational." ); + add_msg( m_neutral, _( "You manage to loosen some debris and make your %s somewhat operational." ), + reloadable_name ); reloadable.set_var( "dirt", ( reloadable.get_var( "dirt", 0 ) - rng( 790, 2750 ) ) ); } if( reloadable.is_gun() ) { p->recoil = MAX_RECOIL; - if( reloadable.has_flag( flag_RELOAD_ONE ) && !is_speedloader ) { + if( reloadable.has_flag( flag_RELOAD_ONE ) && !ammo.has_flag( flag_SPEEDLOADER ) ) { for( int i = 0; i != qty; ++i ) { - msg = _( "You insert one %2$s into the %1$s." ); + add_msg( m_neutral, _( "You insert one %2$s into the %1$s." ), reloadable_name, ammo_name ); } } if( reloadable.type->gun->reload_noise_volume > 0 ) { @@ -2076,9 +2076,10 @@ void activity_handlers::reload_finish( player_activity *act, player *p ) sounds::sound_t::activity, reloadable.type->gun->reload_noise ); } } else if( reloadable.is_watertight_container() ) { - msg = _( "You refill the %s." ); + add_msg( m_neutral, _( "You refill the %s." ), reloadable_name ); + } else { + add_msg( m_neutral, _( "You reload the %1$s with %2$s." ), reloadable_name, ammo_name ); } - add_msg( m_neutral, msg, reloadable.tname(), ammo_name ); } void activity_handlers::start_fire_finish( player_activity *act, player *p ) @@ -2284,7 +2285,7 @@ void activity_handlers::vibe_do_turn( player_activity *act, player *p ) //Deduct 1 battery charge for every minute in use, or vibrator is much less effective item &vibrator_item = *act->targets.front(); - if( p->encumb( bp_mouth ) >= 30 ) { + if( p->encumb( bodypart_id( "mouth" ) ) >= 30 ) { act->moves_left = 0; add_msg( m_bad, _( "You have trouble breathing, and stop." ) ); } @@ -2546,7 +2547,10 @@ struct weldrig_hack { item &get_item() { if( veh != nullptr && part >= 0 ) { - pseudo.charges = veh->drain( itype_battery, 1000 - pseudo.charges ); + item pseudo_magazine( pseudo.magazine_default() ); + pseudo.put_in( pseudo_magazine, item_pocket::pocket_type::MAGAZINE_WELL ); + pseudo.ammo_set( itype_battery, veh->drain( itype_battery, + pseudo.ammo_capacity( ammotype( "battery" ) ) ) ); return pseudo; } @@ -2560,8 +2564,7 @@ struct weldrig_hack { return; } - veh->charge_battery( pseudo.charges ); - pseudo.charges = 0; + veh->charge_battery( pseudo.ammo_remaining() ); } ~weldrig_hack() { @@ -2670,7 +2673,6 @@ void activity_handlers::repair_item_finish( player_activity *act, player *p ) } const item &fix = *act->targets[1]; - if( repeat == repeat_type::INIT ) { const int level = p->get_skill_level( actor->used_skill ); repair_item_actor::repair_type action_type = actor->default_action( fix, level ); @@ -2726,7 +2728,6 @@ void activity_handlers::repair_item_finish( player_activity *act, player *p ) } } while( repeat == repeat_type::INIT ); } - // Otherwise keep retrying act->moves_left = actor->move_cost; } @@ -2900,6 +2901,8 @@ void activity_handlers::clear_rubble_finish( player_activity *act, player *p ) here.furn_set( pos, f_null ); act->set_to_null(); + + here.maybe_trigger_trap( pos, *p, true ); } void activity_handlers::meditate_finish( player_activity *act, player *p ) @@ -2993,7 +2996,7 @@ void activity_handlers::travel_do_turn( player_activity *act, player *p ) tripoint sm_tri = here.getlocal( sm_to_ms_copy( omt_to_sm_copy( p->omt_path.back() ) ) ); tripoint centre_sub = sm_tri + point( SEEX, SEEY ); if( !here.passable( centre_sub ) ) { - tripoint_range candidates = here.points_in_radius( centre_sub, 2 ); + tripoint_range candidates = here.points_in_radius( centre_sub, 2 ); for( const tripoint &elem : candidates ) { if( here.passable( elem ) ) { centre_sub = elem; @@ -3663,9 +3666,9 @@ void activity_handlers::craft_do_turn( player_activity *act, player *p ) // Base moves for batch size with no speed modifier or assistants // Must ensure >= 1 so we don't divide by 0; - const double base_total_moves = std::max( 1, rec.batch_time( craft->charges, 1.0f, 0 ) ); + const double base_total_moves = std::max( 1, rec.batch_time( *p, craft->charges, 1.0f, 0 ) ); // Current expected total moves, includes crafting speed modifiers and assistants - const double cur_total_moves = std::max( 1, rec.batch_time( craft->charges, crafting_speed, + const double cur_total_moves = std::max( 1, rec.batch_time( *p, craft->charges, crafting_speed, assistants ) ); // Delta progress in moves adjusted for current crafting speed const double delta_progress = p->get_moves() * base_total_moves / cur_total_moves; @@ -3930,6 +3933,7 @@ void activity_handlers::chop_tree_finish( player_activity *act, player *p ) // sound of falling tree sfx::play_variant_sound( "misc", "timber", sfx::get_heard_volume( here.getlocal( act->placement ) ) ); + g->events().send( p->getID() ); act->set_to_null(); resume_for_multi_activities( *p ); } @@ -4392,26 +4396,24 @@ void activity_handlers::tree_communion_do_turn( player_activity *act, player *p static void blood_magic( player *p, int cost ) { - static std::array part = { { - bodypart_id( "head" ), bodypart_id( "torso" ), bodypart_id( "arm_l" ), bodypart_id( "arm_r" ), bodypart_id( "leg_l" ), bodypart_id( "leg_r" ) - } - }; - int max_hp_part = 0; std::vector uile; - for( int i = 0; i < num_hp_parts; i++ ) { - uilist_entry entry( i, p->hp_cur[i] > cost, i + 49, body_part_hp_bar_ui_text( part[i] ) ); - if( p->hp_cur[max_hp_part] < p->hp_cur[i] ) { - max_hp_part = i; - } - const std::pair &hp = get_hp_bar( p->hp_cur[i], p->hp_max[i] ); + std::vector parts; + int i = 0; + for( const std::pair &part : p->get_body() ) { + const int hp_cur = part.second.get_hp_cur(); + uilist_entry entry( i, hp_cur > cost, i + 49, body_part_hp_bar_ui_text( part.first.id() ) ); + + const std::pair &hp = get_hp_bar( hp_cur, part.second.get_hp_max() ); entry.ctxt = colorize( hp.first, hp.second ); uile.emplace_back( entry ); + parts.push_back( part.first.id() ); + i++; } int action = -1; while( action < 0 ) { action = uilist( _( "Choose part\nto draw blood from." ), uile ); } - p->hp_cur[action] -= cost; + p->mod_part_hp_cur( parts[action], - cost ); p->mod_pain( std::max( 1, cost / 3 ) ); } @@ -4427,9 +4429,7 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) // if level != 1 then we need to set the spell's level if( level_override != -1 ) { - while( spell_being_cast.get_level() < level_override && !spell_being_cast.is_max_level() ) { - spell_being_cast.gain_level(); - } + spell_being_cast.set_level( level_override ); } const bool no_fail = act->get_value( 1 ) == 1; diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index e43ba65f52b61..0fbd1e36f82d9 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -1727,7 +1727,7 @@ static bool construction_activity( player &p, const zone_data * /*zone*/, const pc.id = built_chosen.id; map &here = get_map(); // Set the trap that has the examine function - if( here.tr_at( src_loc ).loadid == tr_null ) { + if( here.tr_at( src_loc ).is_null() ) { here.trap_set( src_loc, tr_unfinished_construction ); } // Use up the components @@ -3014,7 +3014,7 @@ int get_auto_consume_moves( player &p, const bool food ) void try_fuel_fire( player_activity &act, player &p, const bool starting_fire ) { const tripoint pos = p.pos(); - std::vector adjacent = closest_tripoints_first( pos, PICKUP_RANGE ); + std::vector adjacent = closest_points_first( pos, PICKUP_RANGE ); adjacent.erase( adjacent.begin() ); cata::optional best_fire = starting_fire ? act.placement : find_best_fire( adjacent, diff --git a/src/activity_type.h b/src/activity_type.h index b38b8e557f5e9..45dc96096d7f9 100644 --- a/src/activity_type.h +++ b/src/activity_type.h @@ -79,6 +79,9 @@ class activity_type bool valid_auto_needs() const { return auto_needs; } + float exertion_level() const { + return activity_level; + } void call_do_turn( player_activity *, player * ) const; /** Returns whether it had a finish function or not */ bool call_finish( player_activity *, player * ) const; diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index 914baf03a09c9..0339993e8eb2f 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -108,7 +108,7 @@ advanced_inventory::~advanced_inventory() } // Only refresh if we exited manually, otherwise we're going to be right back if( exit ) { - g->u.check_item_encumbrance_flag(); + get_player_character().check_item_encumbrance_flag(); } } @@ -127,6 +127,15 @@ void advanced_inventory::load_settings() aim_exit aim_code = static_cast( save_state->exit_code ); panes[left].load_settings( save_state->saved_area, squares, aim_code == aim_exit::re_entry ); panes[right].load_settings( save_state->saved_area_right, squares, aim_code == aim_exit::re_entry ); + // In-vehicle flags are set dynamically inside advanced_inventory_pane::load_settings, + // which means the flags may end up the same even if the areas are also the same. To + // avoid this, we use the saved in-vehicle flags instead. + if( panes[left].get_area() == panes[right].get_area() ) { + panes[left].set_area( squares[panes[left].get_area()], save_state->pane.in_vehicle ); + // Use the negated in-vehicle flag of the left pane to ensure different + // in-vehicle flags. + panes[right].set_area( squares[panes[right].get_area()], !save_state->pane.in_vehicle ); + } save_state->exit_code = aim_exit::none; } @@ -195,6 +204,11 @@ void advanced_inventory::init() src = ( save_state->active_left ) ? left : right; dest = ( save_state->active_left ) ? right : left; + + //sanity check, badly initialized values may cause problem in move_all_items( see assert() ) + if( panes[src].get_area() == AIM_ALL && panes[dest].get_area() == AIM_ALL ) { + panes[dest].set_area( AIM_INVENTORY ); + } } void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool active ) @@ -209,12 +223,13 @@ void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool nc_color norm = active ? c_white : c_dark_gray; + Character &player_character = get_player_character(); //print inventory's current and total weight + volume if( pane.get_area() == AIM_INVENTORY || pane.get_area() == AIM_WORN ) { - const double weight_carried = convert_weight( g->u.weight_carried() ); - const double weight_capacity = convert_weight( g->u.weight_capacity() ); - std::string volume_carried = format_volume( g->u.volume_carried() ); - std::string volume_capacity = format_volume( g->u.volume_capacity() ); + const double weight_carried = convert_weight( player_character.weight_carried() ); + const double weight_capacity = convert_weight( player_character.weight_capacity() ); + std::string volume_carried = format_volume( player_character.volume_carried() ); + std::string volume_capacity = format_volume( player_character.volume_capacity() ); // align right, so calculate formatted head length const std::string formatted_head = string_format( "%.1f/%.1f %s %s/%s %s", weight_carried, weight_capacity, weight_units(), @@ -225,7 +240,8 @@ void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool nc_color color = weight_carried > weight_capacity ? c_red : c_light_green; mvwprintz( window, point( hrightcol, 4 ), color, "%.1f", weight_carried ); wprintz( window, c_light_gray, "/%.1f %s ", weight_capacity, weight_units() ); - color = g->u.volume_carried().value() > g->u.volume_capacity().value() ? c_red : c_light_green; + color = player_character.volume_carried().value() > player_character.volume_capacity().value() ? + c_red : c_light_green; wprintz( window, color, volume_carried ); wprintz( window, c_light_gray, "/%s %s", volume_capacity, volume_units_abbr() ); } else { @@ -248,9 +264,9 @@ void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool maxvolume = get_map().max_volume( s.pos ); } formatted_head = string_format( "%3.1f %s %s/%s %s", - convert_weight( s.weight ), + convert_weight( pane.in_vehicle() ? s.weight_veh : s.weight ), weight_units(), - format_volume( s.volume ), + format_volume( pane.in_vehicle() ? s.volume_veh : s.volume ), format_volume( maxvolume ), volume_units_abbr() ); } @@ -286,7 +302,7 @@ void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool int pageStart = 0; // index of first item on current page advanced_inventory_pagination pagination( linesPerPage, pane ); - if( items.size() > 0 ) { + if( !items.empty() ) { // paginate up to the current item (to count pages) for( int i = 0; i <= index; i++ ) { const bool pagebreak = pagination.step( i ); @@ -333,7 +349,7 @@ void advanced_inventory::print_items( const advanced_inventory_pane &pane, bool std::string item_name; std::string stolen_string; bool stolen = false; - if( !it.is_owned_by( g->u, true ) ) { + if( !it.is_owned_by( player_character, true ) ) { stolen_string = "!"; stolen = true; } @@ -592,8 +608,8 @@ void advanced_inventory::recalc_pane( side p ) if( s.can_store_in_vehicle() && !( same && there.in_vehicle() ) ) { bool do_vehicle = there.get_area() == s.id ? !there.in_vehicle() : true; pane.add_items_from_area( s, do_vehicle ); - alls.volume += s.volume; - alls.weight += s.weight; + alls.volume += s.volume_veh; + alls.weight += s.weight_veh; } // Add map items @@ -704,6 +720,7 @@ bool advanced_inventory::move_all_items( bool nested_call ) advanced_inventory_pane &spane = panes[src]; advanced_inventory_pane &dpane = panes[dest]; + Character &player_character = get_player_character(); // AIM_ALL source area routine if( spane.get_area() == AIM_ALL ) { // move all to `AIM_WORN' doesn't make sense (see `MAX_WORN_PER_TYPE') @@ -775,7 +792,7 @@ bool advanced_inventory::move_all_items( bool nested_call ) // restore the pane to its former glory panes[src] = shadow; // make it auto loop back, if not already doing so - if( !done && !g->u.activity ) { + if( !done && !player_character.activity ) { do_return_entry(); } return true; @@ -839,33 +856,31 @@ bool advanced_inventory::move_all_items( bool nested_call ) drop_locations dropped_favorite; if( spane.get_area() == AIM_INVENTORY ) { - for( size_t index = 0; index < g->u.inv.size(); ++index ) { - const std::list &stack = g->u.inv.const_stack( index ); - const item &it = stack.front(); - item_location indexed_item( g->u, const_cast( &it ) ); - - if( !spane.is_filtered( it ) ) { - int count; - if( it.count_by_charges() ) { - count = it.charges; - } else { - count = stack.size(); + //add all solid top level items + for( item &cloth : player_character.worn ) { + for( item *it : cloth.contents.all_items_top() ) { + if( !it->made_of_from_type( phase_id::SOLID ) ) { + continue; } - if( it.is_favorite ) { - dropped_favorite.emplace_back( indexed_item, count ); - } else { - dropped.emplace_back( indexed_item, count ); + if( !spane.is_filtered( *it ) ) { + if( it->is_favorite ) { + dropped_favorite.emplace_back( item_location( item_location( player_character, &cloth ), it ), + it->count() ); + } else { + dropped.emplace_back( item_location( item_location( player_character, &cloth ), it ), it->count() ); + } } } + } } else if( spane.get_area() == AIM_WORN ) { // do this in reverse, to account for vector item removal messing with future indices - auto iter = g->u.worn.rbegin(); - for( size_t idx = 0; idx < g->u.worn.size(); ++idx, ++iter ) { + auto iter = player_character.worn.rbegin(); + for( size_t idx = 0; idx < player_character.worn.size(); ++idx, ++iter ) { item &it = *iter; if( !spane.is_filtered( it ) ) { - item_location loc( g->u, &it ); + item_location loc( player_character, &it ); if( it.is_favorite ) { dropped_favorite.emplace_back( loc, it.count() ); } else { @@ -881,10 +896,10 @@ bool advanced_inventory::move_all_items( bool nested_call ) dropped = dropped_favorite; } - g->u.drop( dropped, g->u.pos() + darea.off ); + player_character.drop( dropped, player_character.pos() + darea.off ); } else { if( dpane.get_area() == AIM_INVENTORY || dpane.get_area() == AIM_WORN ) { - g->u.activity.coords.push_back( g->u.pos() ); + player_character.activity.coords.push_back( player_character.pos() ); std::vector target_items; std::vector quantities; item_stack::iterator stack_begin, stack_end; @@ -923,16 +938,17 @@ bool advanced_inventory::move_all_items( bool nested_call ) if( filtered_any_bucket ) { add_msg( m_info, _( "Skipping filled buckets to avoid spilling their contents." ) ); } - g->u.assign_activity( player_activity( pickup_activity_actor( - target_items, - quantities, - cata::optional( g->u.pos() ) - ) ) ); + player_character.assign_activity( player_activity( pickup_activity_actor( + target_items, + quantities, + cata::optional( player_character.pos() ) + ) ) ); } else { // Vehicle and map destinations are handled the same. // Check first if the destination area still have enough room for moving all. - if( !is_processing() && sarea.volume > darea.free_volume( dpane.in_vehicle() ) && + const units::volume &src_volume = spane.in_vehicle() ? sarea.volume_veh : sarea.volume; + if( !is_processing() && src_volume > darea.free_volume( dpane.in_vehicle() ) && !query_yn( _( "There isn't enough room, do you really want to move all?" ) ) ) { return false; } @@ -980,12 +996,12 @@ bool advanced_inventory::move_all_items( bool nested_call ) add_msg( m_info, _( "Skipping filled buckets to avoid spilling their contents." ) ); } - g->u.assign_activity( player_activity( move_items_activity_actor( - target_items, - quantities, - dpane.in_vehicle(), - relative_destination - ) ) ); + player_character.assign_activity( player_activity( move_items_activity_actor( + target_items, + quantities, + dpane.in_vehicle(), + relative_destination + ) ) ); } } @@ -1082,7 +1098,7 @@ void advanced_inventory::redraw_sidebar() right_print( head, 0, +3, c_white, string_format( _( "< [%s] keybindings >" ), ctxt.get_desc( "HELP_KEYBINDINGS" ) ) ); - if( g->u.has_watch() ) { + if( get_player_character().has_watch() ) { const std::string time = to_string_time_of_day( calendar::turn ); mvwprintz( head, point( 2, 0 ), c_white, time ); } @@ -1149,27 +1165,31 @@ void advanced_inventory::start_activity( const aim_location destarea, const aim_ const bool by_charges = sitem->items.front()->count_by_charges(); + Character &player_character = get_player_character(); if( destarea == AIM_WORN ) { - g->u.assign_activity( ACT_WEAR ); + player_character.assign_activity( ACT_WEAR ); if( by_charges ) { if( from_vehicle ) { - g->u.activity.targets.emplace_back( vehicle_cursor( *squares[srcarea].veh, squares[srcarea].vstor ), - sitem->items.front() ); + player_character.activity.targets.emplace_back( vehicle_cursor( *squares[srcarea].veh, + squares[srcarea].vstor ), + sitem->items.front() ); } else { - g->u.activity.targets.emplace_back( map_cursor( squares[srcarea].pos ), sitem->items.front() ); + player_character.activity.targets.emplace_back( map_cursor( squares[srcarea].pos ), + sitem->items.front() ); } - g->u.activity.values.push_back( amount_to_move ); + player_character.activity.values.push_back( amount_to_move ); } else { for( std::vector::iterator it = sitem->items.begin(); amount_to_move > 0 && it != sitem->items.end(); ++it ) { if( from_vehicle ) { - g->u.activity.targets.emplace_back( vehicle_cursor( *squares[srcarea].veh, squares[srcarea].vstor ), - *it ); + player_character.activity.targets.emplace_back( vehicle_cursor( *squares[srcarea].veh, + squares[srcarea].vstor ), + *it ); } else { - g->u.activity.targets.emplace_back( map_cursor( squares[srcarea].pos ), *it ); + player_character.activity.targets.emplace_back( map_cursor( squares[srcarea].pos ), *it ); } - g->u.activity.values.push_back( 0 ); + player_character.activity.values.push_back( 0 ); --amount_to_move; } } @@ -1200,21 +1220,21 @@ void advanced_inventory::start_activity( const aim_location destarea, const aim_ } if( destarea == AIM_INVENTORY ) { - g->u.assign_activity( player_activity( pickup_activity_actor( - target_items, - quantities, - from_vehicle ? cata::nullopt : cata::optional( g->u.pos() ) - ) ) ); + player_character.assign_activity( player_activity( pickup_activity_actor( + target_items, + quantities, + from_vehicle ? cata::nullopt : cata::optional( player_character.pos() ) + ) ) ); } else { // Stash the destination const tripoint relative_destination = squares[destarea].off; - g->u.assign_activity( player_activity( move_items_activity_actor( - target_items, - quantities, - to_vehicle, - relative_destination - ) ) ); + player_character.assign_activity( player_activity( move_items_activity_actor( + target_items, + quantities, + to_vehicle, + relative_destination + ) ) ); } } } @@ -1251,6 +1271,7 @@ bool advanced_inventory::action_move_item( advanced_inv_listitem *sitem, if( !query_charges( destarea, *sitem, action, amount_to_move ) ) { return false; } + avatar &player_character = get_avatar(); // This makes sure that all item references in the advanced_inventory_pane::items vector // are recalculated, even when they might not have changed, but they could (e.g. items // taken from inventory, but unable to put into the cargo trunk go back into the inventory, @@ -1267,10 +1288,10 @@ bool advanced_inventory::action_move_item( advanced_inv_listitem *sitem, // make sure advanced inventory is reopened after activity completion. do_return_entry(); - g->u.assign_activity( ACT_WEAR ); + player_character.assign_activity( ACT_WEAR ); - g->u.activity.targets.emplace_back( g->u, sitem->items.front() ); - g->u.activity.values.push_back( amount_to_move ); + player_character.activity.targets.emplace_back( player_character, sitem->items.front() ); + player_character.activity.values.push_back( amount_to_move ); // exit so that the activity can be carried out exit = true; @@ -1285,30 +1306,47 @@ bool advanced_inventory::action_move_item( advanced_inv_listitem *sitem, if( srcarea == AIM_WORN && destarea == AIM_INVENTORY ) { // this is ok because worn items are never stacked (can't move more than 1). - g->u.takeoff( idx ); + player_character.takeoff( idx ); // exit so that the action can be carried out exit = true; } else { // important if item is worn - if( g->u.can_unwield( *sitem->items.front() ).success() ) { - g->u.assign_activity( ACT_DROP ); - g->u.activity.placement = squares[destarea].off; + if( player_character.can_unwield( *sitem->items.front() ).success() ) { + player_character.assign_activity( ACT_DROP ); + player_character.activity.placement = squares[destarea].off; // incase there is vehicle cargo space at dest but the player wants to drop to ground if( !to_vehicle ) { - g->u.activity.str_values.push_back( "force_ground" ); + player_character.activity.str_values.push_back( "force_ground" ); } - g->u.activity.targets.push_back( item_location( g->u, sitem->items.front() ) ); - g->u.activity.values.push_back( amount_to_move ); + int remaining_amount = amount_to_move; + for( item *itm : sitem->items ) { + if( remaining_amount <= 0 ) { + break; + } + player_character.activity.targets.emplace_back( player_character, itm ); + const int move_amount = itm->count_by_charges() ? + std::min( remaining_amount, itm->charges ) : 1; + player_character.activity.values.emplace_back( move_amount ); + remaining_amount -= move_amount; + } // exit so that the activity can be carried out exit = true; } } } else { - if( destarea == AIM_INVENTORY && !g->u.can_stash( *sitem->items.front() ) ) { + bool can_stash = false; + if( sitem->items.front()->count_by_charges() ) { + item dummy = *sitem->items.front(); + dummy.charges = amount_to_move; + can_stash = player_character.can_stash( dummy ); + } else { + can_stash = player_character.can_stash( *sitem->items.front() ); + } + if( destarea == AIM_INVENTORY && !can_stash ) { popup( _( "You have no space for %s" ), sitem->items.front()->tname() ); return false; } @@ -1338,8 +1376,9 @@ void advanced_inventory::action_examine( advanced_inv_listitem *sitem, const auto info_startx = [this]() -> int { return colstart + ( src == advanced_inventory::side::left ? w_width / 2 : 0 ); }; + avatar &player_character = get_avatar(); if( spane.get_area() == AIM_INVENTORY || spane.get_area() == AIM_WORN ) { - item_location loc( g->u, sitem->items.front() ); + item_location loc( player_character, sitem->items.front() ); // Setup a "return to AIM" activity. If examining the item creates a new activity // (e.g. reading, reloading, activating), the new activity will be put on top of // "return to AIM". Once the new activity is finished, "return to AIM" comes back @@ -1347,17 +1386,21 @@ void advanced_inventory::action_examine( advanced_inv_listitem *sitem, // If examining the item did not create a new activity, we have to remove // "return to AIM". do_return_entry(); - assert( g->u.has_activity( ACT_ADV_INVENTORY ) ); + assert( player_character.has_activity( ACT_ADV_INVENTORY ) ); + // `inventory_item_menu` may call functions that move items, so we should + // always recalculate during this period to ensure all item references are valid + always_recalc = true; ret = g->inventory_item_menu( loc, info_startx, info_width, src == advanced_inventory::side::left ? game::LEFT_OF_INFO : game::RIGHT_OF_INFO ); - if( !g->u.has_activity( ACT_ADV_INVENTORY ) ) { + always_recalc = false; + if( !player_character.has_activity( ACT_ADV_INVENTORY ) ) { exit = true; } else { - g->u.cancel_activity(); + player_character.cancel_activity(); } // Might have changed a stack (activated an item, repaired an item, etc.) if( spane.get_area() == AIM_INVENTORY ) { - g->u.inv.restack( g->u ); + player_character.inv.restack( player_character ); } recalc = true; } else { @@ -1384,7 +1427,8 @@ void advanced_inventory::display() { init(); - g->u.inv.restack( g->u ); + avatar &player_character = get_avatar(); + player_character.inv.restack( player_character ); input_context ctxt{ register_ctxt() }; @@ -1432,6 +1476,10 @@ void advanced_inventory::display() ui->mark_resize(); ui->on_redraw( [&]( const ui_adaptor & ) { + if( always_recalc ) { + recalc = true; + } + redraw_pane( advanced_inventory::side::left ); redraw_pane( advanced_inventory::side::right ); redraw_sidebar(); @@ -1447,7 +1495,7 @@ void advanced_inventory::display() } while( !exit ) { - if( g->u.moves < 0 ) { + if( player_character.moves < 0 ) { do_return_entry(); return; } @@ -1776,11 +1824,12 @@ bool advanced_inventory::query_charges( aim_location destarea, const advanced_in amount = std::min( cntmax, amount ); } } + Character &player_character = get_player_character(); // Inventory has a weight capacity, map and vehicle don't have that if( destarea == AIM_INVENTORY || destarea == AIM_WORN ) { const units::mass unitweight = it.weight() / ( by_charges ? it.charges : 1 ); - const units::mass max_weight = g->u.has_trait( trait_DEBUG_STORAGE ) ? - units::mass_max : g->u.weight_capacity() * 4 - g->u.weight_carried(); + const units::mass max_weight = player_character.has_trait( trait_DEBUG_STORAGE ) ? + units::mass_max : player_character.weight_capacity() * 4 - player_character.weight_carried(); if( unitweight > 0_gram && unitweight * amount > max_weight ) { const int weightmax = max_weight / unitweight; if( weightmax <= 0 ) { @@ -1794,7 +1843,7 @@ bool advanced_inventory::query_charges( aim_location destarea, const advanced_in if( destarea == AIM_WORN ) { const auto &id = sitem.items.front()->typeId(); // how many slots are available for the item? - const int slots_available = MAX_WORN_PER_TYPE - g->u.amount_worn( id ); + const int slots_available = MAX_WORN_PER_TYPE - player_character.amount_worn( id ); // base the amount to equip on amount of slots available amount = std::min( slots_available, input_amount ); } @@ -1858,8 +1907,9 @@ void advanced_inventory::draw_minimap() static const std::array sides = {{left, right}}; // get the center of the window tripoint pc = {getmaxx( minimap ) / 2, getmaxy( minimap ) / 2, 0}; + Character &player_character = get_player_character(); // draw the 3x3 tiles centered around player - get_map().draw( minimap, g->u.pos() ); + get_map().draw( minimap, player_character.pos() ); for( auto s : sides ) { char sym = get_minimap_sym( s ); if( sym == '\0' ) { @@ -1885,7 +1935,7 @@ void advanced_inventory::draw_minimap() } if( !invert_left || !invert_right ) { - g->u.draw( minimap, g->u.pos(), invert_left || invert_right ); + player_character.draw( minimap, player_character.pos(), invert_left || invert_right ); } } @@ -1930,10 +1980,11 @@ void advanced_inventory::swap_panes() void advanced_inventory::do_return_entry() { + Character &player_character = get_player_character(); // only save pane settings save_settings( true ); - g->u.assign_activity( ACT_ADV_INVENTORY ); - g->u.activity.auto_resume = true; + player_character.assign_activity( ACT_ADV_INVENTORY ); + player_character.activity.auto_resume = true; save_state->exit_code = aim_exit::re_entry; } diff --git a/src/advanced_inv.h b/src/advanced_inv.h index 29baf1e1da147..28267a33c9774 100644 --- a/src/advanced_inv.h +++ b/src/advanced_inv.h @@ -81,6 +81,7 @@ class advanced_inventory int colstart = 0; bool recalc = false; + bool always_recalc = false; /** * Which panels is active (item moved from there). */ diff --git a/src/advanced_inv_area.cpp b/src/advanced_inv_area.cpp index ee86e9714d993..a75b5dfc5dc34 100644 --- a/src/advanced_inv_area.cpp +++ b/src/advanced_inv_area.cpp @@ -65,8 +65,10 @@ void advanced_inv_area::init() vstor = -1; // must update in main function volume = 0_ml; + volume_veh = 0_ml; // must update in main function weight = 0_gram; + weight_veh = 0_gram; map &here = get_map(); switch( id ) { case AIM_INVENTORY: diff --git a/src/advanced_inv_area.h b/src/advanced_inv_area.h index 744544c279c71..41294e996faa8 100644 --- a/src/advanced_inv_area.h +++ b/src/advanced_inv_area.h @@ -68,7 +68,9 @@ class advanced_inv_area std::string flags; // total volume and weight of items currently there units::volume volume; + units::volume volume_veh; units::mass weight; + units::mass weight_veh; // maximal count / volume of items there. int max_size = 0; // appears as part of the legend at the top right diff --git a/src/advanced_inv_listitem.cpp b/src/advanced_inv_listitem.cpp index 77ebbd5139a94..b1b52c32286d3 100644 --- a/src/advanced_inv_listitem.cpp +++ b/src/advanced_inv_listitem.cpp @@ -16,7 +16,7 @@ advanced_inv_listitem::advanced_inv_listitem( item *an_item, int index, int coun , stacks( count ) , volume( an_item->volume() * stacks ) , weight( an_item->weight() * stacks ) - , cat( &an_item->get_category() ) + , cat( &an_item->get_category_of_contents() ) , from_vehicle( from_vehicle ) { items.push_back( an_item ); @@ -35,7 +35,7 @@ advanced_inv_listitem::advanced_inv_listitem( const std::vector &list, i stacks( list.size() ), volume( list.front()->volume() * stacks ), weight( list.front()->weight() * stacks ), - cat( &list.front()->get_category() ), + cat( &list.front()->get_category_of_contents() ), from_vehicle( from_vehicle ) { assert( stacks >= 1 ); diff --git a/src/advanced_inv_pane.cpp b/src/advanced_inv_pane.cpp index 60534b6f88f56..622d7ba586229 100644 --- a/src/advanced_inv_pane.cpp +++ b/src/advanced_inv_pane.cpp @@ -129,8 +129,6 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, bool vehicle_override ) { assert( square.id != AIM_ALL ); - square.volume = 0_ml; - square.weight = 0_gram; if( !square.canputitems() ) { return; } @@ -139,8 +137,12 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, // Existing items are *not* cleared on purpose, this might be called // several times in case all surrounding squares are to be shown. if( square.id == AIM_INVENTORY ) { + square.volume = 0_ml; + square.weight = 0_gram; items = u.get_AIM_inventory( *this, square ); } else if( square.id == AIM_WORN ) { + square.volume = 0_ml; + square.weight = 0_gram; auto iter = u.worn.begin(); for( size_t i = 0; i < u.worn.size(); ++i, ++iter ) { advanced_inv_listitem it( &*iter, i, 1, square.id, false ); @@ -152,6 +154,8 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, items.push_back( it ); } } else if( square.id == AIM_CONTAINER ) { + square.volume = 0_ml; + square.weight = 0_gram; item *cont = square.get_container( in_vehicle() ); if( cont != nullptr ) { if( !cont->is_container_empty() ) { @@ -166,6 +170,13 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, } } else { bool is_in_vehicle = square.can_store_in_vehicle() && ( in_vehicle() || vehicle_override ); + if( is_in_vehicle ) { + square.volume_veh = 0_ml; + square.weight_veh = 0_gram; + } else { + square.volume = 0_ml; + square.weight = 0_gram; + } const advanced_inv_area::itemstack &stacks = is_in_vehicle ? square.i_stacked( square.veh->get_items( square.vstor ) ) : square.i_stacked( m.i_at( square.pos ) ); @@ -175,8 +186,13 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, if( is_filtered( *it.items.front() ) ) { continue; } - square.volume += it.volume; - square.weight += it.weight; + if( is_in_vehicle ) { + square.volume_veh += it.volume; + square.weight_veh += it.weight; + } else { + square.volume += it.volume; + square.weight += it.weight; + } items.push_back( it ); } } diff --git a/src/animation.cpp b/src/animation.cpp index 9a43828fb16e5..42d3bb5bfeceb 100644 --- a/src/animation.cpp +++ b/src/animation.cpp @@ -84,7 +84,7 @@ class bullet_animation : public basic_animation bool is_point_visible( const tripoint &p, int margin = 0 ) { - return g->is_in_viewport( p, margin ) && g->u.sees( p ); + return g->is_in_viewport( p, margin ) && get_player_character().sees( p ); } bool is_radius_visible( const tripoint ¢er, int radius ) @@ -303,20 +303,21 @@ void explosion_handler::draw_custom_explosion( const tripoint &, // Start by getting rid of everything except current z-level std::map neighbors; + avatar &player_character = get_avatar(); #if defined(TILES) if( !use_tiles ) { for( const auto &pr : all_area ) { - const tripoint relative_point = relative_view_pos( g->u, pr.first ); + const tripoint relative_point = relative_view_pos( player_character, pr.first ); if( relative_point.z == 0 ) { neighbors[pr.first] = explosion_tile{ N_NO_NEIGHBORS, pr.second }; } } } else { // In tiles mode, the coordinates have to be absolute - const tripoint view_center = relative_view_pos( g->u, g->u.pos() ); + const tripoint view_center = relative_view_pos( player_character, player_character.pos() ); for( const auto &pr : all_area ) { // Relative point is only used for z level check - const tripoint relative_point = relative_view_pos( g->u, pr.first ); + const tripoint relative_point = relative_view_pos( player_character, pr.first ); if( relative_point.z == view_center.z ) { neighbors[pr.first] = explosion_tile{ N_NO_NEIGHBORS, pr.second }; } @@ -324,7 +325,7 @@ void explosion_handler::draw_custom_explosion( const tripoint &, } #else for( const auto &pr : all_area ) { - const tripoint relative_point = relative_view_pos( g->u, pr.first ); + const tripoint relative_point = relative_view_pos( player_character, pr.first ); if( relative_point.z == 0 ) { neighbors[pr.first] = explosion_tile{ N_NO_NEIGHBORS, pr.second }; } @@ -439,7 +440,8 @@ void draw_bullet_curses( map &m, const tripoint &t, const char bullet, const tri return; } - const tripoint vp = g->u.pos() + g->u.view_offset; + avatar &player_character = get_avatar(); + const tripoint vp = player_character.pos() + player_character.view_offset; if( vp.z != t.z ) { return; @@ -447,7 +449,7 @@ void draw_bullet_curses( map &m, const tripoint &t, const char bullet, const tri shared_ptr_fast bullet_cb = make_shared_fast( [&]() { if( p != nullptr && p->z == vp.z ) { - m.drawsq( g->w_terrain, g->u, *p, false, true, vp ); + m.drawsq( g->w_terrain, player_character, *p, false, true, vp ); } mvwputch( g->w_terrain, t.xy() - vp.xy() + point( POSX, POSY ), c_red, bullet ); } ); @@ -628,7 +630,7 @@ void draw_line_curses( game &g, const tripoint ¢er, const std::vector &points ) { + map &here = get_map(); for( const tripoint &p : points ) { - g.m.drawsq( g.w_terrain, g.u, p, true, true ); + here.drawsq( g.w_terrain, g.u, p, true, true ); } const tripoint p = points.empty() ? tripoint {POSX, POSY, 0} : @@ -733,36 +736,7 @@ void game::draw_weather( const weather_printable &w ) return; } - static const std::string weather_acid_drop {"weather_acid_drop"}; - static const std::string weather_rain_drop {"weather_rain_drop"}; - static const std::string weather_snowflake {"weather_snowflake"}; - - std::string weather_name; - switch( w.wtype ) { - // Acid weathers; uses acid droplet tile, fallthrough intended - case WEATHER_ACID_DRIZZLE: - case WEATHER_ACID_RAIN: - weather_name = weather_acid_drop; - break; - // Normal rainy weathers; uses normal raindrop tile, fallthrough intended - case WEATHER_LIGHT_DRIZZLE: - case WEATHER_DRIZZLE: - case WEATHER_RAINY: - case WEATHER_THUNDER: - case WEATHER_LIGHTNING: - weather_name = weather_rain_drop; - break; - // Snowy weathers; uses snowflake tile, fallthrough intended - case WEATHER_FLURRIES: - case WEATHER_SNOW: - case WEATHER_SNOWSTORM: - weather_name = weather_snowflake; - break; - default: - break; - } - - tilecontext->init_draw_weather( w, std::move( weather_name ) ); + tilecontext->init_draw_weather( w, w.wtype->tiles_animation ); } #else void game::draw_weather( const weather_printable &w ) diff --git a/src/armor_layers.cpp b/src/armor_layers.cpp index f3fc57eab24a2..8f8d539ce76b2 100644 --- a/src/armor_layers.cpp +++ b/src/armor_layers.cpp @@ -742,7 +742,7 @@ void player::sort_armor() } worn.splice( to, worn, tmp_worn[selected] ); selected = leftListIndex; - reset_encumbrance(); + calc_encumbrance(); } }; @@ -817,7 +817,7 @@ void player::sort_armor() } ); std::copy( worn_copy.begin(), worn_copy.end(), worn.begin() ); - reset_encumbrance(); + calc_encumbrance(); } else if( action == "EQUIP_ARMOR" ) { // filter inventory for all items that are armor/clothing item_location loc = game_menus::inv::wear( *this ); diff --git a/src/ascii_art.cpp b/src/ascii_art.cpp index a2fb9a66736b8..f39b5aaf88018 100644 --- a/src/ascii_art.cpp +++ b/src/ascii_art.cpp @@ -3,7 +3,7 @@ #include "assign.h" #include "generic_factory.h" -static const int ascii_art_width = 42; +static const int ascii_art_width = 41; namespace { diff --git a/src/auto_pickup.cpp b/src/auto_pickup.cpp index ca2777e160844..7d8a4a917653e 100644 --- a/src/auto_pickup.cpp +++ b/src/auto_pickup.cpp @@ -6,8 +6,8 @@ #include #include -#include "avatar.h" #include "cata_utility.h" +#include "character.h" #include "color.h" #include "cursesdef.h" #include "debug.h" @@ -77,6 +77,7 @@ void user_interface::show() int iLine = 0; int iColumn = 1; int iStartPos = 0; + Character &player_character = get_player_character(); ui.on_redraw( [&]( const ui_adaptor & ) { // Redraw the border @@ -99,7 +100,7 @@ void user_interface::show() tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "ove" ) ) + 2; tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "nable" ) ) + 2; tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "isable" ) ) + 2; - if( !g->u.name.empty() ) { + if( !player_character.name.empty() ) { shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "est" ) ); } tmpx = 0; @@ -363,7 +364,7 @@ void user_interface::show() iLine--; iColumn = 1; } - } else if( action == "TEST_RULE" && currentPageNonEmpty && !g->u.name.empty() ) { + } else if( action == "TEST_RULE" && currentPageNonEmpty && !player_character.name.empty() ) { cur_rules[iLine].test_pattern(); } else if( action == "SWITCH_AUTO_PICKUP_OPTION" ) { // TODO: Now that NPCs use this function, it could be used for them too @@ -389,9 +390,10 @@ void player_settings::show() { user_interface ui; + Character &player_character = get_player_character(); ui.title = _( " AUTO PICKUP MANAGER " ); ui.tabs.emplace_back( _( "[]" ), global_rules ); - if( !g->u.name.empty() ) { + if( !player_character.name.empty() ) { ui.tabs.emplace_back( _( "[]" ), character_rules ); } ui.is_autopickup = true; @@ -403,7 +405,7 @@ void player_settings::show() } save_global(); - if( !g->u.name.empty() ) { + if( !player_character.name.empty() ) { save_character(); } invalidate(); diff --git a/src/avatar.cpp b/src/avatar.cpp index ca499dc994a2b..d46ec33f52c09 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -131,6 +131,7 @@ avatar::avatar() show_map_memory = true; active_mission = nullptr; grab_type = object_type::NONE; + calorie_diary.push_front( daily_calories{} ); } void avatar::toggle_map_memory() @@ -414,6 +415,12 @@ bool avatar::read( item &it, const bool continuous ) } return false; } + + if( it.get_use( "learn_spell" ) ) { + it.get_use( "learn_spell" )->call( *this, it, it.active, pos() ); + return true; + } + const int time_taken = time_to_read( it, *reader ); add_msg( m_debug, "avatar::read: time_taken = %d", time_taken ); @@ -428,6 +435,7 @@ bool avatar::read( item &it, const bool continuous ) add_msg( m_info, _( "%s reads aloud…" ), reader->disp_name() ); } assign_activity( act ); + g->events().send( getID(), it.typeId() ); return true; } @@ -439,6 +447,7 @@ bool avatar::read( item &it, const bool continuous ) } else { add_msg( m_info, get_hint() ); } + g->events().send( getID(), it.typeId() ); mod_moves( -100 ); return false; } @@ -671,7 +680,7 @@ bool avatar::read( item &it, const bool continuous ) elem->add_morale( MORALE_BOOK, 0, book_fun_for( it, *elem ) * 15, decay_start + 30_minutes, decay_start, false, it.type ); } - + g->events().send( getID(), it.typeId() ); return true; } @@ -1268,7 +1277,8 @@ void avatar::reset_stats() // Dodge-related effects mod_dodge_bonus( mabuff_dodge_bonus() - - ( encumb( bp_leg_l ) + encumb( bp_leg_r ) ) / 20.0f - encumb( bp_torso ) / 10.0f ); + ( encumb( bodypart_id( "leg_l" ) ) + encumb( bodypart_id( "leg_r" ) ) ) / 20.0f - encumb( + bodypart_id( "torso" ) ) / 10.0f ); // Whiskers don't work so well if they're covered if( has_trait( trait_WHISKERS ) && !wearing_something_on( bodypart_id( "mouth" ) ) ) { mod_dodge_bonus( 1 ); @@ -1629,6 +1639,34 @@ bool avatar::invoke_item( item *used, const std::string &method ) return Character::invoke_item( used, method ); } +void avatar::advance_daily_calories() +{ + calorie_diary.push_front( daily_calories{} ); + if( calorie_diary.size() > 30 ) { + calorie_diary.pop_back(); + } +} + +void avatar::add_spent_calories( int cal ) +{ + calorie_diary.front().spent += cal; +} + +void avatar::add_gained_calories( int cal ) +{ + calorie_diary.front().gained += cal; +} + +std::string avatar::total_daily_calories_string() const +{ + std::string ret = " gained spent total\n"; + int num_day = 1; + for( const daily_calories &day : calorie_diary ) { + ret += string_format( "%2d %6d %6d %6d\n", num_day++, day.gained, day.spent, day.total() ); + } + return ret; +} + points_left::points_left() { limit = MULTI_POOL; diff --git a/src/avatar.h b/src/avatar.h index 1f43441b5eac9..1be14fd49a503 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -224,6 +224,35 @@ class avatar : public player return mon_visible; } + struct daily_calories { + int spent; + int gained; + int total() const { + return gained - spent; + } + + void serialize( JsonOut &json ) const { + json.start_object(); + + json.member( "spent", spent ); + json.member( "gained", gained ); + + json.end_object(); + }; + void deserialize( JsonIn &jsin ) { + JsonObject data = jsin.get_object(); + + data.read( "spent", spent ); + data.read( "gained", gained ); + }; + }; + // called once a day; adds a new daily_calories to the + // front of the list and pops off the back if there are more than 30 + void advance_daily_calories(); + void add_spent_calories( int cal ) override; + void add_gained_calories( int cal ) override; + std::string total_daily_calories_string() const; + private: map_memory player_map_memory; bool show_map_memory; @@ -249,6 +278,11 @@ class avatar : public player * The currently active mission, or null if no mission is currently in progress. */ mission *active_mission; + /** + * The amont of calories spent and gained per day for the last 30 days. + * the back is popped off and a new one added to the front at midnight each day + */ + std::list calorie_diary; // Items the player has identified. std::unordered_set items_identified; diff --git a/src/avatar_action.cpp b/src/avatar_action.cpp index 20ee21ace8e63..709816c8fb9d4 100644 --- a/src/avatar_action.cpp +++ b/src/avatar_action.cpp @@ -118,6 +118,14 @@ bool avatar_action::move( avatar &you, map &m, const tripoint &d ) // Well that sure was easy return true; } + bool via_ramp = false; + if( m.has_flag( TFLAG_RAMP_UP, dest_loc ) ) { + dest_loc.z += 1; + via_ramp = true; + } else if( m.has_flag( TFLAG_RAMP_DOWN, dest_loc ) ) { + dest_loc.z -= 1; + via_ramp = true; + } if( m.has_flag( TFLAG_MINEABLE, dest_loc ) && g->mostseen == 0 && get_option( "AUTO_FEATURES" ) && get_option( "AUTO_MINING" ) && @@ -212,11 +220,6 @@ bool avatar_action::move( avatar &you, map &m, const tripoint &d ) } } - if( d.z == 0 && ramp_move( you, m, dest_loc ) ) { - // TODO: Make it work nice with automove (if it doesn't do so already?) - return false; - } - if( you.has_effect( effect_amigara ) ) { int curdist = INT_MAX; int newdist = INT_MAX; @@ -377,7 +380,7 @@ bool avatar_action::move( avatar &you, map &m, const tripoint &d ) add_msg( m_info, _( "%s to dive underwater." ), press_x( ACTION_MOVE_DOWN ) ); } - avatar_action::swim( get_map(), g->u, dest_loc ); + avatar_action::swim( get_map(), get_avatar(), dest_loc ); } g->on_move_effects(); @@ -397,7 +400,7 @@ bool avatar_action::move( avatar &you, map &m, const tripoint &d ) } return true; } - if( g->walk_move( dest_loc ) ) { + if( g->walk_move( dest_loc, via_ramp ) ) { return true; } if( g->phasing_move( dest_loc ) ) { @@ -689,7 +692,7 @@ static bool gunmode_checks_weapon( avatar &you, const map &m, std::vectoru.mounted_creature.get(); + monster *mons = get_player_character().mounted_creature.get(); if( !mons->type->mech_weapon.is_empty() ) { is_mech_weapon = true; } @@ -838,7 +841,7 @@ void avatar_action::fire_wielded_weapon( avatar &you ) you.assign_activity( aim_activity_actor::use_wielded(), false ); } -void avatar_action::fire_ranged_mutation( avatar &you, const item &fake_gun ) +void avatar_action::fire_ranged_mutation( Character &you, const item &fake_gun ) { you.assign_activity( aim_activity_actor::use_mutation( fake_gun ), false ); } @@ -933,23 +936,29 @@ bool avatar_action::eat_here( avatar &you ) void avatar_action::eat( avatar &you ) { item_location loc = game_menus::inv::consume( you ); - avatar_action::eat( you, loc, you.activity.values ); + std::string filter; + if( !you.activity.str_values.empty() ) { + filter = you.activity.str_values.back(); + } + avatar_action::eat( you, loc, you.activity.values, filter ); } void avatar_action::eat( avatar &you, const item_location &loc ) { - avatar_action::eat( you, loc, std::vector() ); + avatar_action::eat( you, loc, std::vector(), std::string() ); } void avatar_action::eat( avatar &you, const item_location &loc, - std::vector consume_menu_selections ) + std::vector consume_menu_selections, + const std::string &consume_menu_filter ) { if( !loc ) { you.cancel_activity(); add_msg( _( "Never mind." ) ); return; } - you.assign_activity( player_activity( consume_activity_actor( loc, consume_menu_selections ) ) ); + you.assign_activity( player_activity( consume_activity_actor( loc, consume_menu_selections, + consume_menu_filter ) ) ); } void avatar_action::plthrow( avatar &you, item_location loc, @@ -960,7 +969,7 @@ void avatar_action::plthrow( avatar &you, item_location loc, return; } if( you.is_mounted() ) { - monster *mons = g->u.mounted_creature.get(); + monster *mons = get_player_character().mounted_creature.get(); if( mons->has_flag( MF_RIDEABLE_MECH ) ) { if( !mons->check_mech_powered() ) { add_msg( m_bad, _( "Your %s refuses to move as its batteries have been drained." ), diff --git a/src/avatar_action.h b/src/avatar_action.h index fbed8231365f9..9c88f775cbef8 100644 --- a/src/avatar_action.h +++ b/src/avatar_action.h @@ -6,12 +6,13 @@ #include "point.h" #include "units.h" +class aim_activity_actor; class avatar; +class Character; class item; class item_location; class map; class turret_data; -class aim_activity_actor; namespace avatar_action { @@ -19,7 +20,8 @@ namespace avatar_action /** Eat food or fuel 'E' (or 'a') */ void eat( avatar &you ); void eat( avatar &you, const item_location &loc ); -void eat( avatar &you, const item_location &loc, std::vector consume_menu_selections ); +void eat( avatar &you, const item_location &loc, std::vector consume_menu_selections, + const std::string &consume_menu_filter ); // special rules for eating: grazing etc // returns false if no rules are needed bool eat_here( avatar &you ); @@ -53,7 +55,7 @@ bool can_fire_weapon( avatar &you, const map &m, const item &weapon ); void fire_wielded_weapon( avatar &you ); /** Stores fake gun specified by the mutation and starts interactive aiming */ -void fire_ranged_mutation( avatar &you, const item &fake_gun ); +void fire_ranged_mutation( Character &you, const item &fake_gun ); /** Stores fake gun specified by the bionic and starts interactive aiming */ void fire_ranged_bionic( avatar &you, const item &fake_gun, const units::energy &cost_per_shot ); diff --git a/src/ballistics.cpp b/src/ballistics.cpp index ea14c5aa3ff26..f03aa4e8fc7f1 100644 --- a/src/ballistics.cpp +++ b/src/ballistics.cpp @@ -8,8 +8,8 @@ #include #include -#include "avatar.h" #include "calendar.h" +#include "character.h" #include "creature.h" #include "damage.h" #include "debug.h" @@ -49,10 +49,11 @@ static void drop_or_embed_projectile( const dealt_projectile_attack &attack ) } const tripoint &pt = attack.end_point; + Character &player_character = get_player_character(); if( effects.count( "SHATTER_SELF" ) ) { // Drop the contents, not the thrown item - if( g->u.sees( pt ) ) { + if( player_character.sees( pt ) ) { add_msg( _( "The %s shatters!" ), drop_item.tname() ); } @@ -70,7 +71,7 @@ static void drop_or_embed_projectile( const dealt_projectile_attack &attack ) if( effects.count( "BURST" ) ) { // Drop the contents, not the thrown item - if( g->u.sees( pt ) ) { + if( player_character.sees( pt ) ) { add_msg( _( "The %s bursts!" ), drop_item.tname() ); } @@ -107,7 +108,7 @@ static void drop_or_embed_projectile( const dealt_projectile_attack &attack ) if( embed ) { mon->add_item( dropped_item ); - if( g->u.sees( *mon ) ) { + if( player_character.sees( *mon ) ) { add_msg( _( "The %1$s embeds in %2$s!" ), dropped_item.tname(), mon->disp_name() ); } } else { @@ -122,7 +123,7 @@ static void drop_or_embed_projectile( const dealt_projectile_attack &attack ) } if( effects.count( "ACT_ON_RANGED_HIT" ) ) { // Don't drop if it exploded - do_drop = !dropped_item.process( nullptr, attack.end_point, true ); + do_drop = !dropped_item.activate_thrown( attack.end_point ); } map &here = get_map(); @@ -138,7 +139,7 @@ static void drop_or_embed_projectile( const dealt_projectile_attack &attack ) } const trap &tr = here.tr_at( pt ); if( tr.triggered_by_item( dropped_item ) ) { - tr.trigger( pt, nullptr, &dropped_item ); + tr.trigger( pt, dropped_item ); } } } diff --git a/src/basecamp.cpp b/src/basecamp.cpp index 02031287c8751..5b73156bf110e 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -223,7 +223,7 @@ std::string basecamp::om_upgrade_description( const std::string &bldg, bool trun comp = string_format( _( "Notes:\n%s\n\nSkills used: %s\n%s\n" ), making.description, making.required_all_skills_string(), comp ); if( !trunc ) { - time_duration base_time = making.batch_duration(); + time_duration base_time = making.batch_duration( get_player_character() ); comp += string_format( _( "Risk: None\nTime: %s\n" ), to_string( base_camps::to_workdays( base_time ) ) ); } @@ -711,8 +711,10 @@ basecamp_action_components::basecamp_action_components( bool basecamp_action_components::choose_components() { const auto filter = is_crafting_component; + avatar &player_character = get_avatar(); const requirement_data *req = - making_.deduped_requirements().select_alternative( g->u, base_._inv, filter, batch_size_ ); + making_.deduped_requirements().select_alternative( player_character, base_._inv, filter, + batch_size_ ); if( !req ) { return false; } @@ -722,8 +724,8 @@ bool basecamp_action_components::choose_components() } for( const auto &it : req->get_components() ) { comp_selection is = - g->u.select_item_component( it, batch_size_, base_._inv, true, filter, - !base_.by_radio ); + player_character.select_item_component( it, batch_size_, base_._inv, true, filter, + !base_.by_radio ); if( is.use_from == usage_from::cancel ) { return false; } @@ -732,8 +734,8 @@ bool basecamp_action_components::choose_components() // this may consume pseudo-resources from fake items for( const auto &it : req->get_tools() ) { comp_selection ts = - g->u.select_tool_component( it, batch_size_, base_._inv, DEFAULT_HOTKEYS, true, - !base_.by_radio ); + player_character.select_tool_component( it, batch_size_, base_._inv, DEFAULT_HOTKEYS, true, + !base_.by_radio ); if( ts.use_from == usage_from::cancel ) { return false; } @@ -751,13 +753,15 @@ void basecamp_action_components::consume_components() target_map = map_.get(); } const tripoint &origin = target_map->getlocal( base_.get_dumping_spot() ); + avatar &player_character = get_avatar(); for( const comp_selection &sel : item_selections_ ) { - g->u.consume_items( *target_map, sel, batch_size_, is_crafting_component, origin, - basecamp::inv_range ); + player_character.consume_items( *target_map, sel, batch_size_, is_crafting_component, origin, + basecamp::inv_range ); } // this may consume pseudo-resources from fake items for( const comp_selection &sel : tool_selections_ ) { - g->u.consume_tools( *target_map, sel, batch_size_, origin, basecamp::inv_range, &base_ ); + player_character.consume_tools( *target_map, sel, batch_size_, origin, basecamp::inv_range, + &base_ ); } // go back and consume the actual resources for( basecamp_resource &bcp_r : base_.resources ) { diff --git a/src/behavior.cpp b/src/behavior.cpp index 92e18fcf4c7a8..ef301ed09572b 100644 --- a/src/behavior.cpp +++ b/src/behavior.cpp @@ -36,7 +36,7 @@ behavior_return node_t::tick( const oracle_t *subject ) const { if( children.empty() ) { status_t result = status_t::running; - for( std::pair< predicate_type, std::string > predicate_pair : conditions ) { + for( const std::pair< predicate_type, std::string > &predicate_pair : conditions ) { result = predicate_pair.first( subject, predicate_pair.second ); if( result != status_t::running ) { break; @@ -46,7 +46,7 @@ behavior_return node_t::tick( const oracle_t *subject ) const } else { assert( strategy != nullptr ); status_t result = status_t::running; - for( std::pair< predicate_type, std::string > predicate_pair : conditions ) { + for( const std::pair< predicate_type, std::string > &predicate_pair : conditions ) { result = predicate_pair.first( subject, predicate_pair.second ); if( result != status_t::running ) { break; diff --git a/src/bionics.cpp b/src/bionics.cpp index 981039cd816df..342a50ea14a33 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -64,6 +64,7 @@ #include "point.h" #include "projectile.h" #include "requirements.h" +#include "ret_val.h" #include "rng.h" #include "sounds.h" #include "string_formatter.h" @@ -281,6 +282,7 @@ void bionic_data::load( const JsonObject &jsobj, const std::string & ) optional( jsobj, was_loaded, "fake_item", fake_item, itype_id() ); optional( jsobj, was_loaded, "enchantments", enchantments ); + optional( jsobj, was_loaded, "spell_on_activation", spell_on_activate ); optional( jsobj, was_loaded, "weight_capacity_modifier", weight_capacity_modifier, 1.0f ); optional( jsobj, was_loaded, "exothermic_power_gen", exothermic_power_gen ); @@ -505,7 +507,7 @@ void npc::check_or_use_weapon_cbm( const bionic_id &cbm_id ) if( is_armed() ) { stow_item( weapon ); } - if( g->u.sees( pos() ) ) { + if( get_player_character().sees( pos() ) ) { add_msg( m_info, _( "%s activates their %s." ), disp_name(), bio.info().name ); } @@ -559,6 +561,11 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) } } + if( !bio.activate_spell( *this ) ) { + // the spell this bionic uses was unable to be cast + return false; + } + // We can actually activate now, do activation-y things mod_power_level( -bio.info().power_activate ); @@ -595,6 +602,15 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) avatar_action::fire_ranged_bionic( g->u, item( bio.info().fake_item ), bio.info().power_activate ); } else if( bio.info().has_flag( flag_BIO_WEAPON ) ) { if( weapon.has_flag( flag_NO_UNWIELD ) ) { + cata::optional active_bio_weapon_index = active_bionic_weapon_index(); + if( active_bio_weapon_index && deactivate_bionic( *active_bio_weapon_index, eff_only ) ) { + // restore state and try again + refund_power(); + bio.powered = false; + // note: deep recursion is not possible, as `deactivate_bionic` won't return true second time + return activate_bionic( b, eff_only, close_bionics_ui ); + } + add_msg_if_player( m_info, _( "Deactivate your %s first!" ), weapon.tname() ); refund_power(); bio.powered = false; @@ -638,7 +654,7 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) } else if( bio.id == bio_evap ) { add_msg_activate(); const w_point weatherPoint = *g->weather.weather_precise; - int humidity = get_local_humidity( weatherPoint.humidity, g->weather.weather, + int humidity = get_local_humidity( weatherPoint.humidity, get_weather().weather_id, g->is_sheltered( g->u.pos() ) ); // thirst units = 5 mL int water_available = std::lround( humidity * 3.0 / 100.0 ); @@ -1005,7 +1021,7 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) const w_point weatherPoint = *g->weather.weather_precise; add_msg_if_player( m_info, _( "Relative Humidity: %s." ), print_humidity( - get_local_humidity( weatherPoint.humidity, g->weather.weather, + get_local_humidity( weatherPoint.humidity, get_weather().weather_id, g->is_sheltered( g->u.pos() ) ) ) ); add_msg_if_player( m_info, _( "Pressure: %s." ), print_pressure( static_cast( weatherPoint.pressure ) ) ); @@ -1111,7 +1127,7 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) } // Recalculate stats (strength, mods from pain etc.) that could have been affected - reset_encumbrance(); + calc_encumbrance(); reset(); // Also reset crafting inventory cache if this bionic spawned a fake item @@ -1122,39 +1138,71 @@ bool Character::activate_bionic( int b, bool eff_only, bool *close_bionics_ui ) return true; } -bool Character::deactivate_bionic( int b, bool eff_only ) +cata::optional Character::active_bionic_weapon_index() const { - bionic &bio = ( *my_bionics )[b]; + if( weapon.is_null() ) { + return cata::nullopt; + } - if( bio.incapacitated_time > 0_turns ) { - add_msg( m_info, _( "Your %s is shorting out and can't be deactivated." ), - bio.info().name ); - return false; + for( int i = 0; i < static_cast( my_bionics->size() ); i++ ) { + const bionic &bio = ( *my_bionics )[ i ]; + if( bio.powered && bio.info().has_flag( flag_BIO_WEAPON ) && + weapon.typeId() == bio.info().fake_item ) { + return i; + } } - if( bio.info().is_remote_fueled ) { - reset_remote_fuel(); + return cata::nullopt; +} + +ret_val Character::can_deactivate_bionic( int b, bool eff_only ) const +{ + bionic &bio = ( *my_bionics )[b]; + + if( bio.incapacitated_time > 0_turns ) { + return ret_val::make_failure( _( "Your %s is shorting out and can't be deactivated." ), + bio.info().name ); } - // Just do the effect, no stat changing or messages if( !eff_only ) { if( !bio.powered ) { // It's already off! - return false; + return ret_val::make_failure(); } if( !bio.info().has_flag( flag_BIO_TOGGLED ) ) { // It's a fire-and-forget bionic, we can't turn it off but have to wait for //it to run out of charge - add_msg_if_player( m_info, _( "You can't deactivate your %s manually!" ), - bio.info().name ); - return false; + return ret_val::make_failure( _( "You can't deactivate your %s manually!" ), + bio.info().name ); } if( get_power_level() < bio.info().power_deactivate ) { - add_msg( m_info, _( "You don't have the power to deactivate your %s." ), - bio.info().name ); - return false; + return ret_val::make_failure( _( "You don't have the power to deactivate your %s." ), + bio.info().name ); + } + } + + return ret_val::make_success(); +} + +bool Character::deactivate_bionic( int b, bool eff_only ) +{ + const auto can_deactivate = can_deactivate_bionic( b, eff_only ); + + if( !can_deactivate.success() ) { + if( !can_deactivate.str().empty() ) { + add_msg( m_info, can_deactivate.str() ); } + return false; + } + + bionic &bio = ( *my_bionics )[b]; + if( bio.info().is_remote_fueled ) { + reset_remote_fuel(); + } + + // Just do the effect, no stat changing or messages + if( !eff_only ) { //We can actually deactivate now, do deactivation-y things mod_power_level( -bio.info().power_deactivate ); bio.powered = false; @@ -1189,7 +1237,7 @@ bool Character::deactivate_bionic( int b, bool eff_only ) } // Recalculate stats (strength, mods from pain etc.) that could have been affected - reset_encumbrance(); + calc_encumbrance(); reset(); if( !bio.id->enchantments.empty() ) { recalculate_enchantment_cache(); @@ -1268,8 +1316,11 @@ bool Character::burn_fuel( int b, bool start ) } if( !bio.has_flag( flag_SAFE_FUEL_OFF ) && - get_power_level() + units::from_kilojoule( fuel_energy ) * effective_efficiency - > get_max_power_level() ) { + ( ( get_power_level() + units::from_kilojoule( fuel_energy ) * effective_efficiency > + get_max_power_level() ) || + ( ( ( get_power_level() + units::from_kilojoule( fuel_energy ) * effective_efficiency ) > + ( get_max_power_level() * bio.get_safe_fuel_thresh() ) ) + ) ) ) { if( is_metabolism_powered ) { add_msg_player_or_npc( m_info, _( "Your %s turns off to not waste calories." ), _( "'s %s turns off to not waste calories." ), @@ -1297,7 +1348,7 @@ bool Character::burn_fuel( int b, bool start ) mod_power_level( power_gain ); } else if( is_perpetual_fuel ) { if( fuel == fuel_type_sun_light && g->is_in_sunlight( pos() ) ) { - const weather_type &wtype = current_weather( pos() ); + const weather_type_id &wtype = current_weather( pos() ); const float tick_sunlight = incident_sunlight( wtype, calendar::turn ); const double intensity = tick_sunlight / default_daylight_level(); mod_power_level( units::from_kilojoule( fuel_energy ) * intensity * effective_efficiency ); @@ -1663,40 +1714,36 @@ void Character::process_bionic( int b ) static_cast( bio_hydraulics ) ); } else if( bio.id == bio_nanobots ) { if( get_power_level() >= 40_J ) { - std::forward_list bleeding_bp_parts; - for( const body_part bp : all_body_parts ) { - if( has_effect( effect_bleed, bp ) ) { - bleeding_bp_parts.push_front( static_cast( bp ) ); + std::forward_list bleeding_bp_parts; + for( const bodypart_id bp : get_all_body_parts() ) { + if( has_effect( effect_bleed, bp->token ) ) { + bleeding_bp_parts.push_front( bp ); + } + } + std::vector damaged_hp_parts; + for( const std::pair &part : get_body() ) { + const int hp_cur = part.second.get_hp_cur(); + if( hp_cur > 0 && hp_cur < part.second.get_hp_max() ) { + damaged_hp_parts.push_back( part.first.id() ); } } - std::vector damaged_hp_parts; - for( int i = 0; i < num_hp_parts; i++ ) { - if( hp_cur[i] > 0 && hp_cur[i] < hp_max[i] ) { - damaged_hp_parts.push_back( i ); - // only healed and non-hp parts will have a chance of bleeding removal - bleeding_bp_parts.remove( static_cast( hp_to_bp( static_cast( i ) ) ) ); + for( const bodypart_id &i : bleeding_bp_parts ) { + // effectively reduces by 1 intensity level + if( get_stored_kcal() >= 15 ) { + get_effect( effect_bleed, i->token ).mod_duration( -get_effect( effect_bleed, + i->token ).get_int_dur_factor() ); + mod_stored_kcal( -15 ); + } else { + bleeding_bp_parts.clear(); + break; } } if( calendar::once_every( 60_turns ) ) { - bool try_to_heal_bleeding = true; if( get_stored_kcal() >= 5 && !damaged_hp_parts.empty() ) { - const hp_part part_to_heal = static_cast( damaged_hp_parts[ rng( 0, - damaged_hp_parts.size() - 1 ) ] ); + const bodypart_id part_to_heal = damaged_hp_parts[ rng( 0, damaged_hp_parts.size() - 1 ) ]; heal( part_to_heal, 1 ); mod_stored_kcal( -5 ); - const body_part bp_healed = hp_to_bp( part_to_heal ); - int hp_percent = static_cast( hp_cur[part_to_heal] ) / hp_max[part_to_heal] * 100; - if( has_effect( effect_bleed, bp_healed ) && rng( 0, 100 ) < hp_percent ) { - remove_effect( effect_bleed, bp_healed ); - try_to_heal_bleeding = false; - } } - - // if no bleed was removed, try to remove it on some other part - if( try_to_heal_bleeding && !bleeding_bp_parts.empty() && rng( 0, 1 ) == 1 ) { - remove_effect( effect_bleed, static_cast( bleeding_bp_parts.front() ) ); - } - } if( !damaged_hp_parts.empty() || !bleeding_bp_parts.empty() ) { mod_power_level( -40_J ); @@ -1728,8 +1775,8 @@ void Character::process_bionic( int b ) // Aero-Evaporator provides water at 60 watts with 2 L / kWh efficiency // which is 10 mL per 5 minutes. Humidity can modify the amount gained. if( calendar::once_every( 5_minutes ) ) { - const w_point weatherPoint = *g->weather.weather_precise; - int humidity = get_local_humidity( weatherPoint.humidity, g->weather.weather, + const w_point weatherPoint = *get_weather().weather_precise; + int humidity = get_local_humidity( weatherPoint.humidity, get_weather().weather_id, g->is_sheltered( g->u.pos() ) ); // in thirst units = 5 mL water int water_available = std::lround( humidity * 3.0 / 100.0 ); @@ -1763,10 +1810,8 @@ void Character::process_bionic( int b ) void Character::roll_critical_bionics_failure( body_part bp ) { - const hp_part limb = bp_to_hp( bp ); - - if( one_in( hp_cur[limb] / 4 ) ) { - hp_cur[limb] -= hp_cur[limb]; + if( one_in( get_part_hp_cur( convert_bp( bp ).id() ) / 4 ) ) { + set_part_hp_cur( convert_bp( bp ).id(), 0 ); } } @@ -2326,6 +2371,9 @@ bool Character::can_install_bionics( const itype &type, Character &installer, bo debugmsg( "Tried to install NULL bionic" ); return false; } + if( has_trait( trait_DEBUG_BIONICS ) ) { + return true; + } if( is_mounted() ) { return false; } @@ -2694,7 +2742,7 @@ void Character::add_bionic( const bionic_id &b ) } } - reset_encumbrance(); + calc_encumbrance(); recalc_sight_limits(); if( !b->enchantments.empty() ) { recalculate_enchantment_cache(); @@ -2731,7 +2779,7 @@ void Character::remove_bionic( const bionic_id &b ) } *my_bionics = new_my_bionics; - reset_encumbrance(); + calc_encumbrance(); recalc_sight_limits(); if( !b->enchantments.empty() ) { recalculate_enchantment_cache(); @@ -2829,8 +2877,42 @@ void bionic::toggle_safe_fuel_mod() } if( !has_flag( flag_SAFE_FUEL_OFF ) ) { set_flag( flag_SAFE_FUEL_OFF ); + set_safe_fuel_thresh( 2.0 ); } else { - remove_flag( flag_SAFE_FUEL_OFF ); + uilist tmenu; + tmenu.text = _( "Chose Safe Fuel Level Threshold" ); + tmenu.addentry( 1, true, 'o', _( "Full Power" ) ); + if( get_auto_start_thresh() < 0.80 ) { + tmenu.addentry( 2, true, 't', _( "Above 80 %%" ) ); + } + if( get_auto_start_thresh() < 0.55 ) { + tmenu.addentry( 3, true, 'f', _( "Above 55 %%" ) ); + } + if( get_auto_start_thresh() < 0.30 ) { + tmenu.addentry( 4, true, 's', _( "Above 30 %%" ) ); + } + tmenu.query(); + + switch( tmenu.ret ) { + case 1: + remove_flag( flag_SAFE_FUEL_OFF ); + set_safe_fuel_thresh( 1.0 ); + break; + case 2: + remove_flag( flag_SAFE_FUEL_OFF ); + set_safe_fuel_thresh( 0.80 ); + break; + case 3: + remove_flag( flag_SAFE_FUEL_OFF ); + set_safe_fuel_thresh( 0.55 ); + break; + case 4: + remove_flag( flag_SAFE_FUEL_OFF ); + set_safe_fuel_thresh( 0.30 ); + break; + default: + break; + } } } @@ -2843,9 +2925,15 @@ void bionic::toggle_auto_start_mod() uilist tmenu; tmenu.text = _( "Chose Start Power Level Threshold" ); tmenu.addentry( 1, true, 'o', _( "No Power Left" ) ); - tmenu.addentry( 2, true, 't', _( "Below 25 %%" ) ); - tmenu.addentry( 3, true, 'f', _( "Below 50 %%" ) ); - tmenu.addentry( 4, true, 's', _( "Below 75 %%" ) ); + if( get_safe_fuel_thresh() > 0.25 ) { + tmenu.addentry( 2, true, 't', _( "Below 25 %%" ) ); + } + if( get_safe_fuel_thresh() > 0.50 ) { + tmenu.addentry( 3, true, 'f', _( "Below 50 %%" ) ); + } + if( get_safe_fuel_thresh() > 0.75 ) { + tmenu.addentry( 4, true, 's', _( "Below 75 %%" ) ); + } tmenu.query(); switch( tmenu.ret ) { @@ -2884,6 +2972,21 @@ bool bionic::is_auto_start_on() const return get_auto_start_thresh() > -1.0; } +float bionic::get_safe_fuel_thresh() const +{ + return safe_fuel_threshold; +} + +bool bionic::is_safe_fuel_on() const +{ + return get_safe_fuel_thresh() < 2.0; +} + +void bionic::set_safe_fuel_thresh( float val ) +{ + safe_fuel_threshold = val; +} + void bionic::serialize( JsonOut &json ) const { json.start_object(); @@ -2900,6 +3003,9 @@ void bionic::serialize( JsonOut &json ) const if( is_auto_start_on() ) { json.member( "auto_start_threshold", auto_start_threshold ); } + if( is_safe_fuel_on() ) { + json.member( "safe_fuel_threshold", safe_fuel_threshold ); + } json.end_object(); } @@ -2923,6 +3029,9 @@ void bionic::deserialize( JsonIn &jsin ) if( jo.has_float( "auto_start_threshold" ) ) { auto_start_threshold = jo.get_float( "auto_start_threshold" ); } + if( jo.has_float( "safe_fuel_threshold" ) ) { + safe_fuel_threshold = jo.get_float( "safe_fuel_threshold" ); + } if( jo.has_array( "bionic_tags" ) ) { for( const std::string line : jo.get_array( "bionic_tags" ) ) { bionic_tags.insert( line ); diff --git a/src/bionics.h b/src/bionics.h index 872bc68fdb18c..b8dd19c7d3a80 100644 --- a/src/bionics.h +++ b/src/bionics.h @@ -12,10 +12,12 @@ #include "bodypart.h" #include "calendar.h" #include "flat_set.h" +#include "magic.h" #include "optional.h" #include "translations.h" #include "type_id.h" #include "units.h" +#include "value_ptr.h" class JsonIn; class JsonObject; @@ -85,6 +87,7 @@ struct bionic_data { /** bionic enchantments */ std::vector enchantments; + cata::value_ptr spell_on_activate; /** * Body part slots used to install this bionic, mapped to the amount of space required. */ @@ -178,12 +181,18 @@ struct bionic { float get_auto_start_thresh() const; bool is_auto_start_on() const; + void set_safe_fuel_thresh( float val ); + float get_safe_fuel_thresh() const; + bool is_safe_fuel_on() const; + bool activate_spell( Character &caster ); + void serialize( JsonOut &json ) const; void deserialize( JsonIn &jsin ); private: // generic bionic specific flags cata::flat_set bionic_tags; float auto_start_threshold = -1.0; + float safe_fuel_threshold = -1.0; }; // A simpler wrapper to allow forward declarations of it. std::vector can not diff --git a/src/bionics_ui.cpp b/src/bionics_ui.cpp index db94ec0b93062..5bac6b8558d13 100644 --- a/src/bionics_ui.cpp +++ b/src/bionics_ui.cpp @@ -194,7 +194,10 @@ static std::string build_bionic_poweronly_string( const bionic &bio ) } if( !bio.has_flag( flag_SAFE_FUEL_OFF ) && ( !bio.info().fuel_opts.empty() || bio.info().is_remote_fueled ) ) { - properties.push_back( _( "(fuel saving ON)" ) ); + //properties.push_back( _( "(fuel saving ON)" ) ); + const std::string label = string_format( _( "(fuel saving ON > %d %%)" ), + static_cast( bio.get_safe_fuel_thresh() * 100 ) ); + properties.push_back( label ); } if( bio.is_auto_start_on() && ( !bio.info().fuel_opts.empty() || bio.info().is_remote_fueled ) ) { const std::string label = string_format( _( "(auto start < %d %%)" ), @@ -267,13 +270,16 @@ static void draw_description( const catacurses::window &win, const bionic &bio ) } static void draw_connectors( const catacurses::window &win, const point &start, - int last_x, const bionic_id &bio_id ) + int last_x, const bionic_id &bio_id, const std::map &bp_to_pos ) { const int LIST_START_Y = 7; // first: pos_y, second: occupied slots std::vector> pos_and_num; for( const std::pair, size_t> &elem : bio_id->occupied_bodyparts ) { - pos_and_num.emplace_back( static_cast( elem.first->token ) + LIST_START_Y, elem.second ); + auto pos = bp_to_pos.find( elem.first ); + if( pos != bp_to_pos.end() ) { + pos_and_num.emplace_back( static_cast( pos->second ) + LIST_START_Y, elem.second ); + } } if( pos_and_num.empty() || !get_option < bool >( "CBM_SLOTS_ENABLED" ) ) { return; @@ -525,12 +531,14 @@ void player::power_bionics() int max_width = 0; std::vector bps; + std::map bp_to_pos; for( const bodypart_id &bp : get_all_body_parts() ) { const int total = get_total_bionics_slots( bp ); const std::string s = string_format( "%s: %d/%d", body_part_name_as_heading( bp, 1 ), total - get_free_bionics_slots( bp ), total ); bps.push_back( s ); + bp_to_pos.emplace( bp.id(), bps.size() - 1 ); max_width = std::max( max_width, utf8_width( s ) ); } const int pos_x = WIDTH - 2 - max_width; @@ -567,11 +575,11 @@ void player::power_bionics() if( is_highlighted && menu_mode != EXAMINING && get_option < bool >( "CBM_SLOTS_ENABLED" ) ) { const bionic_id bio_id = ( *current_bionic_list )[i]->id; draw_connectors( wBio, point( utf8_width( desc ) + 3, list_start_y + i - scroll_position ), - pos_x - 2, bio_id ); + pos_x - 2, bio_id, bp_to_pos ); // redraw highlighted (occupied) body parts for( const std::pair, size_t> &elem : bio_id->occupied_bodyparts ) { - const int i = static_cast( elem.first->token ); + const int i = bp_to_pos[elem.first]; mvwprintz( wBio, point( pos_x, i + list_start_y ), c_yellow, bps[i] ); } } diff --git a/src/bodypart.cpp b/src/bodypart.cpp index 110bf6d1ec3fd..15f4f7c20e49c 100644 --- a/src/bodypart.cpp +++ b/src/bodypart.cpp @@ -52,25 +52,6 @@ std::string enum_to_string( side data ) abort(); } -template<> -std::string enum_to_string( hp_part data ) -{ - switch( data ) { - // *INDENT-OFF* - case hp_part::hp_head: return "head"; - case hp_part::hp_torso: return "torso"; - case hp_part::hp_arm_l: return "arm_l"; - case hp_part::hp_arm_r: return "arm_r"; - case hp_part::hp_leg_l: return "leg_l"; - case hp_part::hp_leg_r: return "leg_r"; - // *INDENT-ON* - case hp_part::num_hp_parts: - break; - } - debugmsg( "Invalid hp_part" ); - abort(); -} - } // namespace io namespace @@ -217,6 +198,11 @@ void body_part_type::load( const JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "hit_difficulty", hit_difficulty ); mandatory( jo, was_loaded, "hit_size_relative", hit_size_relative ); + mandatory( jo, was_loaded, "base_hp", base_hp ); + optional( jo, was_loaded, "stat_hp_mods", hp_mods ); + + optional( jo, was_loaded, "is_limb", is_limb, false ); + mandatory( jo, was_loaded, "legacy_id", legacy_id ); token = legacy_id_to_enum( legacy_id ); @@ -381,3 +367,140 @@ void body_part_set::fill( const std::vector &bps ) parts.insert( bp.id() ); } } + +bodypart_id bodypart::get_id() const +{ + return id; +} + +void bodypart::set_hp_to_max() +{ + hp_cur = hp_max; +} + +bool bodypart::is_at_max_hp() const +{ + return hp_cur == hp_max; +} + +int bodypart::get_hp_cur() const +{ + return hp_cur; +} + +int bodypart::get_hp_max() const +{ + return hp_max; +} + +int bodypart::get_healed_total() const +{ + return healed_total; +} + +int bodypart::get_damage_bandaged() const +{ + return damage_bandaged; +} + +int bodypart::get_damage_disinfected() const +{ + return damage_disinfected; +} + +encumbrance_data bodypart::get_encumbrance_data() const +{ + return encumb_data; +} + +void bodypart::set_hp_cur( int set ) +{ + hp_cur = set; +} + +void bodypart::set_hp_max( int set ) +{ + hp_max = set; +} + +void bodypart::set_healed_total( int set ) +{ + healed_total = set; +} + +void bodypart::set_damage_bandaged( int set ) +{ + damage_bandaged = set; +} + +void bodypart::set_damage_disinfected( int set ) +{ + damage_disinfected = set; +} + +void bodypart::set_encumbrance_data( encumbrance_data set ) +{ + encumb_data = set; +} + +void bodypart::mod_hp_cur( int mod ) +{ + hp_cur += mod; +} + +void bodypart::mod_hp_max( int mod ) +{ + hp_max += mod; +} + +void bodypart::mod_healed_total( int mod ) +{ + healed_total += mod; +} + +void bodypart::mod_damage_bandaged( int mod ) +{ + damage_bandaged += mod; +} + +void bodypart::mod_damage_disinfected( int mod ) +{ + damage_disinfected += mod; +} + +void bodypart::serialize( JsonOut &json ) const +{ + json.start_object(); + json.member( "id", id ); + json.member( "hp_cur", hp_cur ); + json.member( "hp_max", hp_max ); + json.member( "damage_bandaged", damage_bandaged ); + json.member( "damage_disinfected", damage_disinfected ); + json.end_object(); +} + +void bodypart::deserialize( JsonIn &jsin ) +{ + JsonObject jo = jsin.get_object(); + jo.read( "id", id, true ); + jo.read( "hp_cur", hp_cur, true ); + jo.read( "hp_max", hp_max, true ); + jo.read( "damage_bandaged", damage_bandaged, true ); + jo.read( "damage_disinfected", damage_disinfected, true ); +} + +void stat_hp_mods::load( const JsonObject &jsobj ) +{ + optional( jsobj, was_loaded, "str_mod", str_mod, 3.0f ); + optional( jsobj, was_loaded, "dex_mod", dex_mod, 0.0f ); + optional( jsobj, was_loaded, "int_mod", int_mod, 0.0f ); + optional( jsobj, was_loaded, "per_mod", str_mod, 0.0f ); + + optional( jsobj, was_loaded, "health_mod", health_mod, 0.0f ); +} + +void stat_hp_mods::deserialize( JsonIn &jsin ) +{ + const JsonObject &jo = jsin.get_object(); + load( jo ); +} diff --git a/src/bodypart.h b/src/bodypart.h index 1d1449cdec3f1..14e8a5bd61f65 100644 --- a/src/bodypart.h +++ b/src/bodypart.h @@ -8,12 +8,16 @@ #include #include +#include "enums.h" #include "flat_set.h" #include "int_id.h" #include "string_id.h" #include "translations.h" class JsonObject; +class JsonIn; +class JsonOut; + template struct enum_traits; // The order is important ; pldata.h has to be in the same order @@ -66,6 +70,20 @@ struct body_part_type; using bodypart_str_id = string_id; using bodypart_id = int_id; +struct stat_hp_mods { + + float str_mod = 3.0f; + float dex_mod = 0.0f; + float int_mod = 0.0f; + float per_mod = 0.0f; + + float health_mod = 0.0f; + + bool was_loaded = false; + void load( const JsonObject &jsobj ); + void deserialize( JsonIn &jsin ); +}; + struct body_part_type { public: bodypart_str_id id; @@ -106,11 +124,14 @@ struct body_part_type { //Morale parameters float hot_morale_mod = 0; float cold_morale_mod = 0; - float stylish_bonus = 0; - int squeamish_penalty = 0; + int base_hp = 60; + stat_hp_mods hp_mods; + + bool is_limb = false; + void load( const JsonObject &jo, const std::string &src ); void finalize(); void check() const; @@ -131,6 +152,95 @@ struct body_part_type { int bionic_slots_ = 0; }; +struct layer_details { + + std::vector pieces; + int max = 0; + int total = 0; + + void reset(); + int layer( int encumbrance ); + + bool operator ==( const layer_details &rhs ) const { + return max == rhs.max && + total == rhs.total && + pieces == rhs.pieces; + } +}; + +struct encumbrance_data { + int encumbrance = 0; + int armor_encumbrance = 0; + int layer_penalty = 0; + + std::array( layer_level::NUM_LAYER_LEVELS )> + layer_penalty_details; + + void layer( const layer_level level, const int encumbrance ) { + layer_penalty += layer_penalty_details[static_cast( level )].layer( encumbrance ); + } + + void reset() { + *this = encumbrance_data(); + } + + bool operator ==( const encumbrance_data &rhs ) const { + return encumbrance == rhs.encumbrance && + armor_encumbrance == rhs.armor_encumbrance && + layer_penalty == rhs.layer_penalty && + layer_penalty_details == rhs.layer_penalty_details; + } +}; + +class bodypart +{ + private: + bodypart_str_id id; + + int hp_cur; + int hp_max; + + int healed_total = 0; + int damage_bandaged = 0; + int damage_disinfected = 0; + + encumbrance_data encumb_data; + + public: + bodypart(): id( bodypart_str_id( "num_bp" ) ), hp_cur( 0 ), hp_max( 0 ) {} + bodypart( bodypart_str_id id ): id( id ), hp_cur( id->base_hp ), hp_max( id->base_hp ) {} + + bodypart_id get_id() const; + + void set_hp_to_max(); + bool is_at_max_hp() const; + + int get_hp_cur() const; + int get_hp_max() const; + int get_healed_total() const; + int get_damage_bandaged() const; + int get_damage_disinfected() const; + + encumbrance_data get_encumbrance_data() const; + + void set_hp_cur( int set ); + void set_hp_max( int set ); + void set_healed_total( int set ); + void set_damage_bandaged( int set ); + void set_damage_disinfected( int set ); + + void set_encumbrance_data( encumbrance_data set ); + + void mod_hp_cur( int mod ); + void mod_hp_max( int mod ); + void mod_healed_total( int mod ); + void mod_damage_bandaged( int mod ); + void mod_damage_disinfected( int mod ); + + void serialize( JsonOut &json ) const; + void deserialize( JsonIn &jsin ); +}; + class body_part_set { private: diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index d058232b725ff..219f8781167d0 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -1029,11 +1029,12 @@ void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int const int min_row = 0; const int max_row = s.y; + avatar &player_character = get_avatar(); //limit the render area to maximum view range (121x121 square centered on player) - const int min_visible_x = g->u.posx() % SEEX; - const int min_visible_y = g->u.posy() % SEEY; - const int max_visible_x = ( g->u.posx() % SEEX ) + ( MAPSIZE - 1 ) * SEEX; - const int max_visible_y = ( g->u.posy() % SEEY ) + ( MAPSIZE - 1 ) * SEEY; + const int min_visible_x = player_character.posx() % SEEX; + const int min_visible_y = player_character.posy() % SEEY; + const int max_visible_x = ( player_character.posx() % SEEX ) + ( MAPSIZE - 1 ) * SEEX; + const int max_visible_y = ( player_character.posy() % SEEY ) + ( MAPSIZE - 1 ) * SEEY; const auto &ch = here.access_cache( center.z ); @@ -1044,7 +1045,7 @@ void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int } //retrieve night vision goggle status once per draw - auto vision_cache = g->u.get_vision_modes(); + auto vision_cache = player_character.get_vision_modes(); nv_goggles_activated = vision_cache[NV_GOGGLES]; // check that the creature for which we'll draw the visibility map is still alive at that point @@ -1239,7 +1240,8 @@ void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int const Creature *critter = g->critter_at( pos, true ); if( has_draw_override( pos ) || has_memory_at( pos ) || - ( critter && ( g->u.sees_with_infrared( *critter ) || g->u.sees_with_specials( *critter ) ) ) ) { + ( critter && ( player_character.sees_with_infrared( *critter ) || + player_character.sees_with_specials( *critter ) ) ) ) { invisible[0] = true; } else { @@ -1405,16 +1407,17 @@ void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int draw_highlight(); void_highlight(); } - } else if( g->u.view_offset != tripoint_zero && !g->u.in_vehicle ) { + } else if( player_character.view_offset != tripoint_zero && !player_character.in_vehicle ) { // check to see if player is located at ter draw_from_id_string( "cursor", C_NONE, empty_string, tripoint( g->ter_view_p.xy(), center.z ), 0, 0, lit_level::LIT, false ); } - if( g->u.controlling_vehicle ) { + if( player_character.controlling_vehicle ) { if( cata::optional indicator_offset = g->get_veh_dir_indicator_location( true ) ) { - draw_from_id_string( "cursor", C_NONE, empty_string, indicator_offset->xy() + tripoint( g->u.posx(), - g->u.posy(), center.z ), + draw_from_id_string( "cursor", C_NONE, empty_string, + indicator_offset->xy() + tripoint( player_character.posx(), + player_character.posy(), center.z ), 0, 0, lit_level::LIT, false ); } } @@ -1850,7 +1853,7 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, default: // player if( id.substr( 7 ) == "player_" ) { - seed = g->u.name[0]; + seed = get_player_character().name[0]; break; } // NPC @@ -2112,7 +2115,7 @@ bool cata_tiles::draw_terrain_below( const tripoint &p, const lit_level, int &, const auto low_override = draw_below_override.find( p ); const bool low_overridden = low_override != draw_below_override.end(); if( low_overridden ? !low_override->second : ( invisible[0] || - !here.need_draw_lower_floor( p ) ) ) { + here.dont_draw_lower_floor( p ) ) ) { return false; } @@ -2206,7 +2209,7 @@ bool cata_tiles::draw_terrain( const tripoint &p, const lit_level ll, int &heigh } const std::string &tname = t.id().str(); if( here.check_seen_cache( p ) ) { - g->u.memorize_tile( here.getabs( p ), tname, subtile, rotation ); + get_avatar().memorize_tile( here.getabs( p ), tname, subtile, rotation ); } // draw the actual terrain if there's no override if( !neighborhood_overridden ) { @@ -2247,8 +2250,9 @@ bool cata_tiles::draw_terrain( const tripoint &p, const lit_level ll, int &heigh bool cata_tiles::has_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); return !t.tile.empty(); } return false; @@ -2256,8 +2260,9 @@ bool cata_tiles::has_memory_at( const tripoint &p ) const bool cata_tiles::has_terrain_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 2 ) == "t_" ) { return true; } @@ -2267,8 +2272,9 @@ bool cata_tiles::has_terrain_memory_at( const tripoint &p ) const bool cata_tiles::has_furniture_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 2 ) == "f_" ) { return true; } @@ -2278,8 +2284,9 @@ bool cata_tiles::has_furniture_memory_at( const tripoint &p ) const bool cata_tiles::has_trap_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 3 ) == "tr_" ) { return true; } @@ -2289,8 +2296,9 @@ bool cata_tiles::has_trap_memory_at( const tripoint &p ) const bool cata_tiles::has_vpart_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 3 ) == "vp_" ) { return true; } @@ -2300,8 +2308,9 @@ bool cata_tiles::has_vpart_memory_at( const tripoint &p ) const memorized_terrain_tile cata_tiles::get_terrain_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 2 ) == "t_" ) { return t; } @@ -2311,8 +2320,9 @@ memorized_terrain_tile cata_tiles::get_terrain_memory_at( const tripoint &p ) co memorized_terrain_tile cata_tiles::get_furniture_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 2 ) == "f_" ) { return t; } @@ -2322,8 +2332,9 @@ memorized_terrain_tile cata_tiles::get_furniture_memory_at( const tripoint &p ) memorized_terrain_tile cata_tiles::get_trap_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 3 ) == "tr_" ) { return t; } @@ -2333,8 +2344,9 @@ memorized_terrain_tile cata_tiles::get_trap_memory_at( const tripoint &p ) const memorized_terrain_tile cata_tiles::get_vpart_memory_at( const tripoint &p ) const { - if( g->u.should_show_map_memory() ) { - const memorized_terrain_tile t = g->u.get_memorized_tile( get_map().getabs( p ) ); + avatar &player_character = get_avatar(); + if( player_character.should_show_map_memory() ) { + const memorized_terrain_tile t = player_character.get_memorized_tile( get_map().getabs( p ) ); if( t.tile.substr( 0, 3 ) == "vp_" ) { return t; } @@ -2345,6 +2357,7 @@ memorized_terrain_tile cata_tiles::get_vpart_memory_at( const tripoint &p ) cons bool cata_tiles::draw_furniture( const tripoint &p, const lit_level ll, int &height_3d, const bool ( &invisible )[5] ) { + avatar &player_character = get_avatar(); const auto override = furniture_override.find( p ); const bool overridden = override != furniture_override.end(); bool neighborhood_overridden = overridden; @@ -2371,7 +2384,7 @@ bool cata_tiles::draw_furniture( const tripoint &p, const lit_level ll, int &hei get_tile_values( f.to_i(), neighborhood, subtile, rotation ); const std::string &fname = f.id().str(); if( here.check_seen_cache( p ) ) { - g->u.memorize_tile( here.getabs( p ), fname, subtile, rotation ); + player_character.memorize_tile( here.getabs( p ), fname, subtile, rotation ); } // draw the actual furniture if there's no override if( !neighborhood_overridden ) { @@ -2431,10 +2444,11 @@ bool cata_tiles::draw_trap( const tripoint &p, const lit_level ll, int &height_3 } } + avatar &player_character = get_avatar(); map &here = get_map(); // first memorize the actual trap - const trap_id &tr = here.tr_at( p ).loadid; - if( tr && !invisible[0] && tr.obj().can_see( p, g->u ) ) { + const trap &tr = here.tr_at( p ); + if( !tr.is_null() && !invisible[0] && tr.can_see( p, player_character ) ) { const int neighborhood[4] = { static_cast( here.tr_at( p + point_south ).loadid ), static_cast( here.tr_at( p + point_east ).loadid ), @@ -2443,10 +2457,10 @@ bool cata_tiles::draw_trap( const tripoint &p, const lit_level ll, int &height_3 }; int subtile = 0; int rotation = 0; - get_tile_values( tr.to_i(), neighborhood, subtile, rotation ); - const std::string trname = tr.id().str(); + get_tile_values( tr.loadid.to_i(), neighborhood, subtile, rotation ); + const std::string trname = tr.loadid.id().str(); if( here.check_seen_cache( p ) ) { - g->u.memorize_tile( here.getabs( p ), trname, subtile, rotation ); + player_character.memorize_tile( here.getabs( p ), trname, subtile, rotation ); } // draw the actual trap if there's no override if( !neighborhood_overridden ) { @@ -2454,9 +2468,10 @@ bool cata_tiles::draw_trap( const tripoint &p, const lit_level ll, int &height_3 nv_goggles_activated, height_3d ); } } - if( overridden || ( !invisible[0] && neighborhood_overridden && tr.obj().can_see( p, g->u ) ) ) { + if( overridden || ( !invisible[0] && neighborhood_overridden && + tr.can_see( p, player_character ) ) ) { // and then draw the override trap - const trap_id &tr2 = overridden ? override->second : tr; + const trap_id &tr2 = overridden ? override->second : tr.loadid; if( tr2 ) { // both the current and neighboring overrides may change the appearance // of the tile, so always re-calculate it. @@ -2550,7 +2565,7 @@ bool cata_tiles::draw_field_or_item( const tripoint &p, const lit_level ll, int mon_id = std::get<1>( it_override->second ); hilite = std::get<2>( it_override->second ); it_type = item::find_type( it_id ); - } else if( !invisible[0] && here.sees_some_items( p, g->u ) ) { + } else if( !invisible[0] && here.sees_some_items( p, get_player_character() ) ) { const maptile &tile = here.maptile_at( p ); const item &itm = tile.get_uppermost_item(); const mtype *const mon = itm.get_mtype(); @@ -2584,7 +2599,7 @@ bool cata_tiles::draw_vpart_below( const tripoint &p, const lit_level /*ll*/, in const auto low_override = draw_below_override.find( p ); const bool low_overridden = low_override != draw_below_override.end(); if( low_overridden ? !low_override->second : ( invisible[0] || - !get_map().need_draw_lower_floor( p ) ) ) { + get_map().dont_draw_lower_floor( p ) ) ) { return false; } tripoint pbelow( p.xy(), p.z - 1 ); @@ -2612,9 +2627,10 @@ bool cata_tiles::draw_vpart( const tripoint &p, lit_level ll, int &height_3d, const int subtile = part_mod == 1 ? open_ : part_mod == 2 ? broken : 0; const int rotation = veh.face.dir(); const std::string vpname = "vp_" + vp_id.str(); - if( !veh.forward_velocity() && !veh.player_in_control( g->u ) && + avatar &player_character = get_avatar(); + if( !veh.forward_velocity() && !veh.player_in_control( player_character ) && here.check_seen_cache( p ) ) { - g->u.memorize_tile( here.getabs( p ), vpname, subtile, rotation ); + player_character.memorize_tile( here.getabs( p ), vpname, subtile, rotation ); } if( !overridden ) { const cata::optional cargopart = vp.part_with_feature( "CARGO", true ); @@ -2661,7 +2677,7 @@ bool cata_tiles::draw_critter_at_below( const tripoint &p, const lit_level, int const auto low_override = draw_below_override.find( p ); const bool low_overridden = low_override != draw_below_override.end(); if( low_overridden ? !low_override->second : ( invisible[0] || - !get_map().need_draw_lower_floor( p ) ) ) { + get_map().dont_draw_lower_floor( p ) ) ) { return false; } @@ -2674,11 +2690,13 @@ bool cata_tiles::draw_critter_at_below( const tripoint &p, const lit_level, int return false; } + Character &player_character = get_player_character(); // Check if the player can actually see the critter. We don't care if // it's via infrared or not, just whether or not they're seen. If not, // we can bail. - if( !g->u.sees( *critter ) && !( g->u.sees_with_infrared( *critter ) || - g->u.sees_with_specials( *critter ) ) ) { + if( !player_character.sees( *critter ) && + !( player_character.sees_with_infrared( *critter ) || + player_character.sees_with_specials( *critter ) ) ) { return false; } @@ -2715,6 +2733,7 @@ bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3 bool is_player; bool sees_player; Creature::Attitude attitude; + Character &player_character = get_player_character(); const auto override = monster_override.find( p ); if( override != monster_override.end() ) { const mtype_id id = std::get<0>( override->second ); @@ -2736,8 +2755,9 @@ bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3 } const Creature &critter = *pcritter; - if( !g->u.sees( critter ) ) { - if( g->u.sees_with_infrared( critter ) || g->u.sees_with_specials( critter ) ) { + if( !player_character.sees( critter ) ) { + if( player_character.sees_with_infrared( critter ) || + player_character.sees_with_specials( critter ) ) { return draw_from_id_string( "infrared_creature", C_NONE, empty_string, p, 0, 0, lit_level::LIT, false, height_3d ); } @@ -2780,7 +2800,7 @@ bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3 } result = draw_from_id_string( chosen_id, ent_category, ent_subcategory, p, subtile, rot_facing, ll, false, height_3d ); - sees_player = m->sees( g->u ); + sees_player = m->sees( player_character ); attitude = m->attitude_to( g-> u ); } } @@ -2798,7 +2818,8 @@ bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3 } else { // invisible const Creature *critter = g->critter_at( p, true ); - if( critter && ( g->u.sees_with_infrared( *critter ) || g->u.sees_with_specials( *critter ) ) ) { + if( critter && ( player_character.sees_with_infrared( *critter ) || + player_character.sees_with_specials( *critter ) ) ) { // try drawing infrared creature if invisible and not overridden // return directly without drawing overlay return draw_from_id_string( "infrared_creature", C_NONE, empty_string, p, 0, 0, @@ -2852,7 +2873,8 @@ bool cata_tiles::draw_zombie_revival_indicators( const tripoint &pos, const lit_ { map &here = get_map(); if( tileset_ptr->find_tile_type( ZOMBIE_REVIVAL_INDICATOR ) && !invisible[0] && - item_override.find( pos ) == item_override.end() && here.could_see_items( pos, g->u ) ) { + item_override.find( pos ) == item_override.end() && + here.could_see_items( pos, get_player_character() ) ) { for( item &i : here.i_at( pos ) ) { if( i.can_revive() ) { return draw_from_id_string( ZOMBIE_REVIVAL_INDICATOR, C_NONE, empty_string, pos, 0, 0, @@ -3265,7 +3287,7 @@ void cata_tiles::draw_line() return; } static std::string line_overlay = "animation_line"; - if( !is_target_line || g->u.sees( line_pos ) ) { + if( !is_target_line || get_player_character().sees( line_pos ) ) { for( auto it = line_trajectory.begin(); it != line_trajectory.end() - 1; ++it ) { draw_from_id_string( line_overlay, *it, 0, 0, lit_level::LIT, false ); } @@ -3303,6 +3325,7 @@ void cata_tiles::draw_weather_frame() void cata_tiles::draw_sct_frame( std::multimap &overlay_strings ) { const bool use_font = get_option( "ANIMATION_SCT_USE_FONT" ); + Character &player_character = get_player_character(); for( auto iter = SCT.vSCT.begin(); iter != SCT.vSCT.end(); ++iter ) { const point iD( iter->getPosX(), iter->getPosY() ); @@ -3331,7 +3354,7 @@ void cata_tiles::draw_sct_frame( std::multimap &overlay_s if( tileset_ptr->find_tile_type( generic_id ) ) { draw_from_id_string( generic_id, C_NONE, empty_string, - iD + tripoint( iOffsetX, iOffsetY, g->u.pos().z ), 0, 0, lit_level::LIT, false ); + iD + tripoint( iOffsetX, iOffsetY, player_character.pos().z ), 0, 0, lit_level::LIT, false ); } if( tile_iso ) { @@ -3346,10 +3369,11 @@ void cata_tiles::draw_sct_frame( std::multimap &overlay_s void cata_tiles::draw_zones_frame() { + Character &player_character = get_player_character(); for( int iY = zone_start.y; iY <= zone_end.y; ++ iY ) { for( int iX = zone_start.x; iX <= zone_end.x; ++iX ) { draw_from_id_string( "highlight", C_NONE, empty_string, - zone_offset.xy() + tripoint( iX, iY, g->u.pos().z ), + zone_offset.xy() + tripoint( iX, iY, player_character.pos().z ), 0, 0, lit_level::LIT, false ); } } diff --git a/src/cata_variant.cpp b/src/cata_variant.cpp index d8725ffffe294..d715ff572ce6c 100644 --- a/src/cata_variant.cpp +++ b/src/cata_variant.cpp @@ -18,7 +18,6 @@ std::string enum_to_string( cata_variant_type type ) case cata_variant_type::chrono_seconds: return "chrono_seconds"; case cata_variant_type::debug_menu_index: return "debug_menu_index"; case cata_variant_type::efftype_id: return "efftype_id"; - case cata_variant_type::hp_part: return "hp_part"; case cata_variant_type::int_: return "int"; case cata_variant_type::itype_id: return "itype_id"; case cata_variant_type::matype_id: return "matype_id"; diff --git a/src/cata_variant.h b/src/cata_variant.h index d3b020f05bcc3..9fbbd39cee4bc 100644 --- a/src/cata_variant.h +++ b/src/cata_variant.h @@ -24,7 +24,6 @@ template struct enum_traits; enum body_part : int; enum class mutagen_technique : int; -enum hp_part : int; namespace debug_menu { @@ -45,7 +44,6 @@ enum class cata_variant_type : int { chrono_seconds, debug_menu_index, efftype_id, - hp_part, int_, itype_id, matype_id, @@ -167,7 +165,7 @@ struct convert_enum { }; // These are the specializations of convert for each value type. -static_assert( static_cast( cata_variant_type::num_types ) == 30, +static_assert( static_cast( cata_variant_type::num_types ) == 29, "This assert is a reminder to add conversion support for any new types to the " "below specializations" ); @@ -230,9 +228,6 @@ struct convert : convert_string_id struct convert : convert_string_id {}; -template<> -struct convert : convert_enum {}; - template<> struct convert { using type = int; diff --git a/src/character.cpp b/src/character.cpp index d56878b4269bc..b8d2ffc15d019 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -12,6 +12,7 @@ #include "action.h" #include "activity_handlers.h" +#include "activity_type.h" #include "anatomy.h" #include "avatar.h" #include "bionics.h" @@ -62,6 +63,7 @@ #include "overmapbuffer.h" #include "pathfinding.h" #include "player.h" +#include "proficiency.h" #include "ret_val.h" #include "rng.h" #include "scent_map.h" @@ -146,6 +148,7 @@ static const efftype_id effect_hunger_near_starving( "hunger_near_starving" ); static const efftype_id effect_hunger_satisfied( "hunger_satisfied" ); static const efftype_id effect_hunger_starving( "hunger_starving" ); static const efftype_id effect_hunger_very_hungry( "hunger_very_hungry" ); +static const efftype_id effect_hypovolemia( "hypovolemia" ); static const efftype_id effect_in_pit( "in_pit" ); static const efftype_id effect_infected( "infected" ); static const efftype_id effect_jetinjector( "jetinjector" ); @@ -189,6 +192,7 @@ static const itype_id itype_UPS_off( "UPS_off" ); static const skill_id skill_archery( "archery" ); static const skill_id skill_dodge( "dodge" ); +static const skill_id skill_firstaid( "firstaid" ); static const skill_id skill_pistol( "pistol" ); static const skill_id skill_rifle( "rifle" ); static const skill_id skill_shotgun( "shotgun" ); @@ -338,6 +342,7 @@ static const std::string flag_BELTED( "BELTED" ); static const std::string flag_BLIND( "BLIND" ); static const std::string flag_DEAF( "DEAF" ); static const std::string flag_DISABLE_SIGHTS( "DISABLE_SIGHTS" ); +static const std::string flag_EFFECT_IMPEDING( "EFFECT_IMPEDING" ); static const std::string flag_EFFECT_INVISIBLE( "EFFECT_INVISIBLE" ); static const std::string flag_EFFECT_NIGHT_VISION( "EFFECT_NIGHT_VISION" ); static const std::string flag_FIX_NEARSIGHT( "FIX_NEARSIGHT" ); @@ -358,6 +363,7 @@ static const std::string flag_SEMITANGIBLE( "SEMITANGIBLE" ); static const std::string flag_SKINTIGHT( "SKINTIGHT" ); static const std::string flag_SPEEDLOADER( "SPEEDLOADER" ); static const std::string flag_SPLINT( "SPLINT" ); +static const std::string flag_TOURNIQUET( "TOURNIQUET" ); static const std::string flag_STURDY( "STURDY" ); static const std::string flag_SWIMMABLE( "SWIMMABLE" ); static const std::string flag_SWIM_GOGGLES( "SWIM_GOGGLES" ); @@ -367,6 +373,8 @@ static const std::string flag_USE_UPS( "USE_UPS" ); static const mtype_id mon_player_blob( "mon_player_blob" ); static const mtype_id mon_shadow_snake( "mon_shadow_snake" ); +static const vitamin_id vitamin_blood( "blood" ); + namespace io { @@ -399,15 +407,11 @@ Character &get_player_character() Character::Character() : visitable(), - damage_bandaged( {{ 0 }} ), - damage_disinfected( {{ 0 }} ), cached_time( calendar::before_time_starts ), id( -1 ), next_climate_control_check( calendar::before_time_starts ), last_climate_control_ret( false ) { - hp_cur.fill( 0 ); - hp_max.fill( 1 ); randomize_blood(); str_max = 0; dex_max = 0; @@ -440,7 +444,6 @@ Character::Character() : healthy_calories = 55000; stored_calories = healthy_calories; initialize_stomach_contents(); - healed_total = { { 0, 0, 0, 0, 0, 0 } }; name.clear(); custom_profession.clear(); @@ -594,7 +597,7 @@ int Character::effective_dispersion( int dispersion ) const /** @EFFECT_PER penalizes sight dispersion when low. */ dispersion += ranged_per_mod(); - dispersion += encumb( bp_eyes ) / 2; + dispersion += encumb( bodypart_id( "eyes" ) ) / 2; return std::max( dispersion, 0 ); } @@ -663,7 +666,7 @@ double Character::aim_speed_dex_modifier() const double Character::aim_speed_encumbrance_modifier() const { - return ( encumb( bp_hand_l ) + encumb( bp_hand_r ) ) / 10.0; + return ( encumb( bodypart_id( "hand_l" ) ) + encumb( bodypart_id( "hand_r" ) ) ) / 10.0; } double Character::aim_cap_from_volume( const item &gun ) const @@ -945,9 +948,10 @@ int Character::swim_speed() const ret -= hand_bonus_mult * ( 60 + str_cur * 5 ); } /** @EFFECT_SWIMMING increases swim speed */ - ret += ( 50 - get_skill_level( skill_swimming ) * 2 ) * ( ( encumb( bp_leg_l ) + encumb( - bp_leg_r ) ) / 10 ); - ret += ( 80 - get_skill_level( skill_swimming ) * 3 ) * ( encumb( bp_torso ) / 10 ); + ret += ( 50 - get_skill_level( skill_swimming ) * 2 ) * ( ( encumb( bodypart_id( "leg_l" ) ) + + encumb( + bodypart_id( "leg_r" ) ) ) / 10 ); + ret += ( 80 - get_skill_level( skill_swimming ) * 3 ) * ( encumb( bodypart_id( "torso" ) ) / 10 ); if( get_skill_level( skill_swimming ) < 10 ) { for( auto &i : worn ) { ret += i.volume() / 125_ml * ( 10 - get_skill_level( skill_swimming ) ); @@ -1310,10 +1314,10 @@ int Character::get_working_arm_count() const } int limb_count = 0; - if( !is_limb_disabled( hp_arm_l ) ) { + if( !is_limb_disabled( bodypart_id( "arm_l" ) ) ) { limb_count++; } - if( !is_limb_disabled( hp_arm_r ) ) { + if( !is_limb_disabled( bodypart_id( "arm_r" ) ) ) { limb_count++; } if( has_bionic( bio_blaster ) && limb_count > 0 ) { @@ -1327,25 +1331,25 @@ int Character::get_working_arm_count() const int Character::get_working_leg_count() const { int limb_count = 0; - if( !is_limb_broken( hp_leg_l ) ) { + if( !is_limb_broken( bodypart_id( "leg_l" ) ) ) { limb_count++; } - if( !is_limb_broken( hp_leg_r ) ) { + if( !is_limb_broken( bodypart_id( "leg_r" ) ) ) { limb_count++; } return limb_count; } -bool Character::is_limb_disabled( hp_part limb ) const +bool Character::is_limb_disabled( const bodypart_id &limb ) const { - return hp_cur[limb] <= hp_max[limb] * .125; + return get_part_hp_cur( limb ) <= get_part_hp_max( limb ) * .125; } // this is the source of truth on if a limb is broken so all code to determine // if a limb is broken should point here to make any future changes to breaking easier -bool Character::is_limb_broken( hp_part limb ) const +bool Character::is_limb_broken( const bodypart_id &limb ) const { - return hp_cur[limb] == 0; + return get_part_hp_cur( limb ) == 0; } bool Character::can_run() const @@ -1559,6 +1563,29 @@ void Character::try_remove_webs() } } +void Character::try_remove_impeding_effect() +{ + for( const effect &eff : get_effects_with_flag( flag_EFFECT_IMPEDING ) ) { + const efftype_id &eff_id = eff.get_id(); + if( is_mounted() ) { + auto mon = mounted_creature.get(); + if( x_in_y( mon->type->melee_dice * mon->type->melee_sides, + 6 * get_effect_int( eff_id ) ) ) { + add_msg( _( "The %s breaks free!" ), mon->get_name() ); + mon->remove_effect( eff_id ); + remove_effect( eff_id ); + } + /** @EFFECT_STR increases chance to escape webs */ + } else if( x_in_y( get_str(), 6 * get_effect_int( eff_id ) ) ) { + add_msg_player_or_npc( m_good, _( "You free yourself!" ), + _( " frees themselves!" ) ); + remove_effect( eff_id ); + } else { + add_msg_if_player( _( "You try to free yourself, but can't!" ) ); + } + } +} + bool Character::move_effects( bool attacking ) { if( has_effect( effect_downed ) ) { @@ -1586,6 +1613,11 @@ bool Character::move_effects( bool attacking ) try_remove_crushed(); return false; } + if( has_effect_with_flag( flag_EFFECT_IMPEDING ) ) { + try_remove_impeding_effect(); + return false; + } + // Below this point are things that allow for movement if they succeed // Currently we only have one thing that forces movement if you succeed, should we get more @@ -1628,6 +1660,10 @@ void Character::wait_effects( bool attacking ) try_remove_webs(); return; } + if( has_effect_with_flag( flag_EFFECT_IMPEDING ) ) { + try_remove_impeding_effect(); + return; + } if( has_effect( effect_grabbed ) && !attacking && !try_remove_grab() ) { return; } @@ -1713,7 +1749,6 @@ void Character::process_turn() void Character::recalc_hp() { - int new_max_hp[num_hp_parts]; int str_boost_val = 0; cata::optional str_boost = skill_boost::get( "str" ); if( str_boost ) { @@ -1726,28 +1761,13 @@ void Character::recalc_hp() // Mutated toughness stacks with starting, by design. float hp_mod = 1.0f + mutation_value( "hp_modifier" ) + mutation_value( "hp_modifier_secondary" ); float hp_adjustment = mutation_value( "hp_adjustment" ) + ( str_boost_val * 3 ); - for( auto &elem : new_max_hp ) { - /** @EFFECT_STR_MAX increases base hp */ - elem = 60 + str_max * 3 + hp_adjustment + get_fat_to_hp(); - elem *= hp_mod; - } - if( has_trait( trait_GLASSJAW ) ) { - new_max_hp[hp_head] *= 0.8; - } - for( int i = 0; i < num_hp_parts; i++ ) { - // Only recalculate when max changes, - // otherwise we end up walking all over due to rounding errors. - if( new_max_hp[i] == hp_max[i] ) { - continue; - } - // hp_max must be positive to avoiud undefined behavior. - hp_max[i] = std::max( hp_max[i], 1 ); - float max_hp_ratio = static_cast( new_max_hp[i] ) / - static_cast( hp_max[i] ); - hp_cur[i] = std::ceil( static_cast( hp_cur[i] ) * max_hp_ratio ); - hp_cur[i] = std::max( std::min( hp_cur[i], new_max_hp[i] ), 1 ); - hp_max[i] = new_max_hp[i]; - } + calc_all_parts_hp( hp_mod, hp_adjustment, str_max, dex_max, per_max, int_max, get_healthy(), + get_fat_to_hp() ); +} + +int Character::get_part_hp_max( const bodypart_id &id ) const +{ + return enchantment_cache.modify_value( enchant_vals::mod::MAX_HP, Creature::get_part_hp_max( id ) ); } // This must be called when any of the following change: @@ -1790,6 +1810,8 @@ void Character::recalc_sight_limits() sight_max = 10; } + sight_max = enchantment_cache.modify_value( enchant_vals::mod::SIGHT_RANGE, sight_max ); + // Debug-only NV, by vache's request if( has_trait( trait_DEBUG_NIGHTVISION ) ) { vision_mode_cache.set( DEBUG_NIGHTVISION ); @@ -1868,7 +1890,7 @@ float Character::get_vision_threshold( float light_level ) const LIGHT_AMBIENT_MINIMAL ) / ( LIGHT_AMBIENT_LIT - LIGHT_AMBIENT_MINIMAL ) ); - float range = get_per() / 3.0f - encumb( bp_eyes ) / 10.0f; + float range = get_per() / 3.0f - encumb( bodypart_id( "eyes" ) ) / 10.0f; if( vision_mode_cache[NV_GOGGLES] || vision_mode_cache[NIGHTVISION_3] || vision_mode_cache[FULL_ELFA_VISION] || vision_mode_cache[CEPH_VISION] ) { range += 10; @@ -1906,7 +1928,7 @@ void Character::check_item_encumbrance_flag() } if( update_required ) { - reset_encumbrance(); + calc_encumbrance(); } } @@ -2028,12 +2050,12 @@ units::energy Character::get_power_level() const units::energy Character::get_max_power_level() const { - return max_power_level; + return enchantment_cache.modify_value( enchant_vals::mod::BIONIC_POWER, max_power_level ); } void Character::set_power_level( const units::energy &npower ) { - power_level = std::min( npower, max_power_level ); + power_level = std::min( npower, get_max_power_level() ); } void Character::set_max_power_level( const units::energy &npower_max ) @@ -2045,15 +2067,15 @@ void Character::mod_power_level( const units::energy &npower ) { // units::energy is an int, so avoid overflow by converting it to a int64_t, then adding them // If the result is greater than the max power level, set power to max - int64_t power = static_cast( units::to_millijoule( power_level ) ) + + int64_t power = static_cast( units::to_millijoule( get_power_level() ) ) + static_cast( units::to_millijoule( npower ) ); units::energy new_power; - if( power > units::to_millijoule( max_power_level ) ) { - new_power = max_power_level; + if( power > units::to_millijoule( get_max_power_level() ) ) { + new_power = get_max_power_level(); } else { - new_power = power_level + npower; + new_power = get_power_level() + npower; } - power_level = clamp( new_power, 0_kJ, max_power_level ); + set_power_level( clamp( new_power, 0_kJ, get_max_power_level() ) ); } void Character::mod_max_power_level( const units::energy &npower_max ) @@ -2063,22 +2085,22 @@ void Character::mod_max_power_level( const units::energy &npower_max ) bool Character::is_max_power() const { - return power_level >= max_power_level; + return get_power_level() >= get_max_power_level(); } bool Character::has_power() const { - return power_level > 0_kJ; + return get_power_level() > 0_kJ; } bool Character::has_max_power() const { - return max_power_level > 0_kJ; + return get_max_power_level() > 0_kJ; } bool Character::enough_power_for( const bionic_id &bid ) const { - return power_level >= bid->power_activate; + return get_power_level() >= bid->power_activate; } std::vector Character::get_fuel_available( const bionic_id &bio ) const @@ -2195,7 +2217,8 @@ int Character::get_standard_stamina_cost( item *thrown_item ) //If the item is thrown, override with the thrown item instead. const int weight_cost = ( thrown_item == nullptr ) ? this->weapon.weight() / ( 16_gram ) : thrown_item->weight() / ( 16_gram ); - const int encumbrance_cost = this->encumb( bp_arm_l ) + this->encumb( bp_arm_r ); + const int encumbrance_cost = this->encumb( bodypart_id( "arm_l" ) ) + this->encumb( + bodypart_id( "arm_r" ) ); return ( weight_cost + encumbrance_cost + 50 ) * -1; } @@ -2228,7 +2251,7 @@ cata::optional::iterator> Character::wear_item( const item &to_w moves -= item_wear_cost( to_wear ); for( const bodypart_id &bp : get_all_body_parts() ) { - if( to_wear.covers( bp ) && encumb( bp->token ) >= 40 ) { + if( to_wear.covers( bp ) && encumb( bp ) >= 40 ) { add_msg_if_player( m_warning, bp == bodypart_id( "eyes" ) ? _( "Your %s are very encumbered! %s" ) : _( "Your %s is very encumbered! %s" ), @@ -2257,7 +2280,7 @@ cata::optional::iterator> Character::wear_item( const item &to_w inv.update_cache_with_item( *new_item_it ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); return new_item_it; } @@ -2306,30 +2329,14 @@ std::vector Character::nearby( const return res; } -int Character::i_add_to_container( const item &it, const bool unloading ) -{ - int charges = it.count(); - if( unloading || !it.count_by_charges() ) { - return charges; - } - - charges -= weapon.fill_with( *it.type, charges ); - for( item &worn_it : worn ) { - if( charges > 0 ) { - charges -= worn_it.fill_with( *it.type, charges ); - } else { - break; - } - } - - return charges; -} - item_pocket *Character::best_pocket( const item &it, const item *avoid ) { - item_pocket *ret = weapon.best_pocket( it ); + item_pocket *ret = nullptr; + if( &weapon != &it && &weapon != avoid ) { + ret = weapon.best_pocket( it ); + } for( item &worn_it : worn ) { - if( &worn_it == avoid ) { + if( &worn_it == &it || &worn_it == avoid ) { continue; } item_pocket *internal_pocket = worn_it.best_pocket( it ); @@ -2346,7 +2353,7 @@ item_pocket *Character::best_pocket( const item &it, const item *avoid ) return ret; } -item *Character::try_add( item it, const item *avoid ) +item *Character::try_add( item it, const item *avoid, const bool allow_wield ) { itype_id item_type_id = it.typeId(); last_item = item_type_id; @@ -2377,7 +2384,7 @@ item *Character::try_add( item it, const item *avoid ) return nullptr; } } else { - if( wield( it ) ) { + if( allow_wield && wield( it ) ) { ret = &weapon; } else { return nullptr; @@ -2396,12 +2403,17 @@ item *Character::try_add( item it, const item *avoid ) return ret; } -item &Character::i_add( item it, bool /* should_stack */, const item *avoid ) +item &Character::i_add( item it, bool /* should_stack */, const item *avoid, const bool allow_drop, + const bool allow_wield ) { - item *added = try_add( it, avoid ); + item *added = try_add( it, avoid, /*allow_wield=*/allow_wield ); if( added == nullptr ) { - if( !wield( it ) ) { - return get_map().add_item_or_charges( pos(), it ); + if( !allow_wield || !wield( it ) ) { + if( allow_drop ) { + return get_map().add_item_or_charges( pos(), it ); + } else { + return null_item_reference(); + } } else { return weapon; } @@ -2454,10 +2466,6 @@ std::vector Character::all_items_loc() std::vector Character::top_items_loc() { std::vector ret; - if( has_weapon() ) { - item_location weap_loc( *this, &weapon ); - ret.push_back( weap_loc ); - } for( item &worn_it : worn ) { item_location worn_loc( *this, &worn_it ); ret.push_back( worn_loc ); @@ -2872,45 +2880,55 @@ units::mass Character::weight_carried_with_tweaks( const item_tweaks &tweaks ) c units::mass ret = 0_gram; for( auto &i : worn ) { if( !without.count( &i ) ) { + for( auto j : i.contents.all_items_ptr( item_pocket::pocket_type::CONTAINER ) ) { + if( j->count_by_charges() ) { + ret -= get_selected_stack_weight( j, without ); + } else if( without.count( j ) ) { + ret -= j->weight(); + } + } ret += i.weight(); } } - // Items in inventory - const inventory &i = tweaks.replace_inv ? tweaks.replace_inv->get() : inv; - ret += i.weight_without( without ); - // Wielded item units::mass weaponweight = 0_gram; - auto weapon_it = without.find( &weapon ); - if( weapon_it == without.end() ) { - weaponweight = weapon.weight(); - } else { - int subtract_count = ( *weapon_it ).second; - if( weapon.count_by_charges() ) { - item copy = weapon; - copy.charges -= subtract_count; - if( copy.charges < 0 ) { - debugmsg( "Trying to remove more charges than the wielded item has" ); - copy.charges = 0; + if( !without.count( &weapon ) ) { + weaponweight += weapon.weight(); + for( auto i : weapon.contents.all_items_ptr( item_pocket::pocket_type::CONTAINER ) ) { + if( i->count_by_charges() ) { + weaponweight -= get_selected_stack_weight( i, without ); + } else if( without.count( i ) ) { + weaponweight -= i->weight(); } - weaponweight = copy.weight(); - } else if( subtract_count > 1 ) { - debugmsg( "Trying to remove more than one wielded item" ); } + } else if( weapon.count_by_charges() ) { + weaponweight += weapon.weight() - get_selected_stack_weight( &weapon, without ); } + // Exclude wielded item if using lifting tool - if( weaponweight + ret > weight_capacity() ) { - if( g->new_game || best_nearby_lifting_assist() < weaponweight ) { - ret += weaponweight; - } - } else { + if( ( weaponweight + ret <= weight_capacity() ) || ( g->new_game || + best_nearby_lifting_assist() < weaponweight ) ) { ret += weaponweight; } return ret; } +units::mass Character::get_selected_stack_weight( const item *i, + const std::map &without ) const +{ + auto stack = without.find( i ); + if( stack != without.end() ) { + int selected = stack->second; + item copy = *i; + copy.charges = selected; + return copy.weight(); + } + + return 0_gram; +} + units::volume Character::volume_carried_with_tweaks( const std::vector> &locations ) const @@ -2924,8 +2942,50 @@ units::volume Character::volume_carried_with_tweaks( const units::volume Character::volume_carried_with_tweaks( const item_tweaks &tweaks ) const { - const inventory &i = tweaks.replace_inv ? tweaks.replace_inv->get() : inv; - return tweaks.without_items ? i.volume_without( *tweaks.without_items ) : i.volume(); + const std::map empty; + const std::map &without = tweaks.without_items ? tweaks.without_items->get() : + empty; + + // Worn items + units::volume ret = 0_ml; + for( auto &i : worn ) { + if( !without.count( &i ) ) { + for( auto j : i.contents.all_items_top( item_pocket::pocket_type::CONTAINER ) ) { + if( j->count_by_charges() ) { + ret += j->volume() - get_selected_stack_volume( j, without ); + } else if( !without.count( j ) ) { + ret += j->volume(); + } + } + } + } + + // Wielded item + if( !without.count( &weapon ) ) { + for( auto i : weapon.contents.all_items_top( item_pocket::pocket_type::CONTAINER ) ) { + if( i->count_by_charges() ) { + ret += i->volume() - get_selected_stack_volume( i, without ); + } else if( !without.count( i ) ) { + ret += i->volume(); + } + } + } + + return ret; +} + +units::volume Character::get_selected_stack_volume( const item *i, + const std::map &without ) const +{ + auto stack = without.find( i ); + if( stack != without.end() ) { + int selected = stack->second; + item copy = *i; + copy.charges = selected; + return copy.volume(); + } + + return 0_ml; } units::mass Character::weight_capacity() const @@ -2959,6 +3019,8 @@ units::mass Character::weight_capacity() const ret += 22500_gram; } + ret = enchantment_cache.modify_value( enchant_vals::mod::CARRY_WEIGHT, ret ); + if( ret < 0_gram ) { ret = 0_gram; } @@ -3063,7 +3125,7 @@ ret_val Character::can_wear( const item &it, bool with_equip_change ) cons if( !it.covers( bp ) ) { continue; } - if( is_limb_broken( bp_to_hp( bp->token ) ) && !worn_with_flag( flag_SPLINT, bp ) ) { + if( is_limb_broken( bp ) && !worn_with_flag( flag_SPLINT, bp ) ) { need_splint = true; break; } @@ -3075,6 +3137,30 @@ ret_val Character::can_wear( const item &it, bool with_equip_change ) cons } } + if( it.has_flag( flag_TOURNIQUET ) ) { + bool need_tourniquet = false; + for( const bodypart_id &bp : get_all_body_parts() ) { + if( !it.covers( bp ) ) { + continue; + } + effect e = get_effect( effect_bleed, bp->token ); + if( !e.is_null() && e.get_intensity() > e.get_max_intensity() / 4 && + !worn_with_flag( flag_TOURNIQUET, bp ) ) { + need_tourniquet = true; + break; + } + } + if( !need_tourniquet ) { + std::string msg; + if( is_player() ) { + msg = _( "You don't need a tourniquet to stop the bleeding." ); + } else { + msg = string_format( _( "%s doesn't need a tourniquet to stop the bleeding." ), name ); + } + return ret_val::make_failure( msg ); + } + } + if( it.has_flag( flag_RESTRICT_HANDS ) && !has_two_arms() ) { return ret_val::make_failure( ( is_player() ? _( "You don't have enough arms to wear that." ) : string_format( _( "%s doesn't have enough arms to wear that." ), name ) ) ); @@ -3175,7 +3261,12 @@ ret_val Character::can_wear( const item &it, bool with_equip_change ) cons ret_val Character::can_unwield( const item &it ) const { if( it.has_flag( "NO_UNWIELD" ) ) { - return ret_val::make_failure( _( "You cannot unwield your %s." ), it.tname() ); + cata::optional wi; + // check if "it" is currently wielded fake bionic weapon that can be deactivated + if( !( is_wielding( it ) && ( wi = active_bionic_weapon_index() ) && + can_deactivate_bionic( *wi ).success() ) ) { + return ret_val::make_failure( _( "You cannot unwield your %s." ), it.tname() ); + } } return ret_val::make_success(); @@ -3463,6 +3554,7 @@ void Character::normalize() martial_arts_data.reset_style(); weapon = item( "null", 0 ); + set_body(); recalc_hp(); } @@ -3619,25 +3711,22 @@ bool Character::has_nv() return nv; } -void Character::reset_encumbrance() +void Character::calc_encumbrance() { - encumbrance_cache_dirty = true; + calc_encumbrance( item() ); } -std::array Character::calc_encumbrance() const +void Character::calc_encumbrance( const item &new_item ) { - return calc_encumbrance( item() ); -} - -std::array Character::calc_encumbrance( const item &new_item ) const -{ - - std::array enc; + std::map enc; item_encumb( enc, new_item ); mut_cbm_encumb( enc ); - return enc; + for( const std::pair &elem : enc ) { + set_part_encumbrance_data( elem.first, elem.second ); + } + } units::mass Character::get_weight() const @@ -3656,29 +3745,6 @@ units::mass Character::get_weight() const return ret; } -std::array Character::get_encumbrance() const -{ - if( encumbrance_cache_dirty ) { - encumbrance_cache = calc_encumbrance(); - encumbrance_cache_dirty = false; - } - return encumbrance_cache; -} - -std::array Character::get_encumbrance( const item &new_item ) const -{ - return calc_encumbrance( new_item ); -} - -int Character::extraEncumbrance( const layer_level level, const int bp ) const -{ - if( encumbrance_cache_dirty ) { - encumbrance_cache = calc_encumbrance(); - encumbrance_cache_dirty = false; - } - return encumbrance_cache[bp].layer_penalty_details[static_cast( level )].total; -} - bool Character::change_side( item &it, bool interactive ) { if( !it.swap_side() ) { @@ -3698,7 +3764,7 @@ bool Character::change_side( item &it, bool interactive ) } mod_moves( -250 ); - reset_encumbrance(); + calc_encumbrance(); return true; } @@ -3717,12 +3783,10 @@ bool Character::change_side( item_location &loc, bool interactive ) return change_side( *loc, interactive ); } -static void layer_item( std::array &vals, - const item &it, - std::array &highest_layer_so_far, - bool power_armor, const Character &c ) +static void layer_item( std::map &vals, const item &it, + std::map &highest_layer_so_far, bool power_armor, const Character &c ) { - const auto item_layer = it.get_layer(); + const layer_level item_layer = it.get_layer(); int encumber_val = it.get_encumber( c ); // For the purposes of layering penalty, set a min of 2 and a max of 10 per item. int layering_encumbrance = std::min( 10, std::max( 2, encumber_val ) ); @@ -3745,17 +3809,16 @@ static void layer_item( std::array &vals, if( !covered_parts.test( bp.id() ) ) { continue; } - highest_layer_so_far[bp->token] = - std::max( highest_layer_so_far[bp->token], item_layer ); + highest_layer_so_far[bp] = std::max( highest_layer_so_far[bp], item_layer ); // Apply layering penalty to this layer, as well as any layer worn // within it that would normally be worn outside of it. for( layer_level penalty_layer = item_layer; - penalty_layer <= highest_layer_so_far[bp->token]; ++penalty_layer ) { - vals[bp->token].layer( penalty_layer, layering_encumbrance ); + penalty_layer <= highest_layer_so_far[bp]; ++penalty_layer ) { + vals[bp].layer( penalty_layer, layering_encumbrance ); } - vals[bp->token].armor_encumbrance += armorenc; + vals[bp].armor_encumbrance += armorenc; } } @@ -3940,12 +4003,12 @@ std::list::iterator Character::position_to_wear_new_item( const item &new_ * This is currently handled by each of these articles of clothing * being on a different layer and/or body part, therefore accumulating no encumbrance. */ -void Character::item_encumb( std::array &vals, +void Character::item_encumb( std::map &vals, const item &new_item ) const { // reset all layer data - vals = std::array(); + vals = std::map(); // Figure out where new_item would be worn std::list::const_iterator new_item_position = worn.end(); @@ -3958,8 +4021,7 @@ void Character::item_encumb( std::array &vals, // Track highest layer observed so far so we can penalize out-of-order // items - std::array highest_layer_so_far; - std::fill( highest_layer_so_far.begin(), highest_layer_so_far.end(), layer_level::PERSONAL ); + std::map highest_layer_so_far; const bool power_armored = is_wearing_active_power_armor(); for( auto w_it = worn.begin(); w_it != worn.end(); ++w_it ) { @@ -3974,7 +4036,7 @@ void Character::item_encumb( std::array &vals, } // make sure values are sane - for( const body_part bp : all_body_parts ) { + for( const bodypart_id &bp : get_all_body_parts() ) { encumbrance_data &elem = vals[bp]; elem.armor_encumbrance = std::max( 0, elem.armor_encumbrance ); @@ -3984,44 +4046,40 @@ void Character::item_encumb( std::array &vals, } } -int Character::encumb( body_part bp ) const +int Character::encumb( const bodypart_id &bp ) const { - if( encumbrance_cache_dirty ) { - encumbrance_cache = calc_encumbrance(); - encumbrance_cache_dirty = false; - } - return encumbrance_cache[bp].encumbrance; + return get_part_encumbrance_data( bp ).encumbrance; } -static void apply_mut_encumbrance( std::array &vals, +static void apply_mut_encumbrance( std::map &vals, const trait_id &mut, const body_part_set &oversize ) { for( const std::pair &enc : mut->encumbrance_always ) { - vals[enc.first->token].encumbrance += enc.second; + vals[enc.first.id()].encumbrance += enc.second; } for( const std::pair &enc : mut->encumbrance_covered ) { if( !oversize.test( enc.first ) ) { - vals[enc.first->token].encumbrance += enc.second; + vals[enc.first.id()].encumbrance += enc.second; } } } -void Character::mut_cbm_encumb( std::array &vals ) const +void Character::mut_cbm_encumb( std::map &vals ) const { for( const bionic_id &bid : get_bionics() ) { for( const std::pair &element : bid->encumbrance ) { - vals[element.first->token].encumbrance += element.second; + vals[element.first.id()].encumbrance += element.second; } } if( has_active_bionic( bio_shock_absorber ) ) { - for( auto &val : vals ) { - val.encumbrance += 3; // Slight encumbrance to all parts except eyes + for( std::pair &val : vals ) { + val.second.encumbrance += 3; // Slight encumbrance to all parts except eyes } - vals[bp_eyes].encumbrance -= 3; + vals[bodypart_id( "eyes" )].encumbrance -= 3; } // Lower penalty for bps covered only by XL armor @@ -4294,6 +4352,11 @@ int Character::get_stored_kcal() const void Character::mod_stored_kcal( int nkcal ) { + if( nkcal > 0 ) { + add_gained_calories( nkcal ); + } else { + add_spent_calories( -nkcal ); + } set_stored_kcal( stored_calories + nkcal ); } @@ -4535,7 +4598,7 @@ void Character::on_damage_of_type( int adjusted_damage, damage_type type, const } const std::map &bodyparts = info.occupied_bodyparts; if( bodyparts.find( bp.id() ) != bodyparts.end() ) { - const int bp_hp = hp_cur[bp_to_hp( bp->token )]; + const int bp_hp = get_part_hp_cur( bp ); // The chance to incapacitate is as high as 50% if the attack deals damage equal to one third of the body part's current health. if( x_in_y( adjusted_damage * 3, bp_hp ) && one_in( 2 ) ) { if( i.incapacitated_time == 0_turns ) { @@ -4586,38 +4649,36 @@ void Character::regen( int rate_multiplier ) } // include healing effects - for( int i = 0; i < num_hp_parts; i++ ) { - const bodypart_id &bp = convert_bp( hp_to_bp( static_cast( i ) ) ).id(); + for( const bodypart_id &bp : get_all_body_parts( true ) ) { float healing = healing_rate_medicine( rest, bp ) * to_turns( 5_minutes ); - int healing_apply = roll_remainder( healing ); - healed_bp( i, healing_apply ); - heal( bp->token, healing_apply ); - if( damage_bandaged[i] > 0 ) { - damage_bandaged[i] -= healing_apply; - if( damage_bandaged[i] <= 0 ) { - damage_bandaged[i] = 0; + mod_part_healed_total( bp, healing_apply ); + heal( bp, healing_apply ); + if( get_part_damage_bandaged( bp ) > 0 ) { + mod_part_damage_bandaged( bp, -healing_apply ); + if( get_part_damage_bandaged( bp ) <= 0 ) { + set_part_damage_bandaged( bp, 0 ); remove_effect( effect_bandaged, bp->token ); add_msg_if_player( _( "Bandaged wounds on your %s healed." ), body_part_name( bp ) ); } } - if( damage_disinfected[i] > 0 ) { - damage_disinfected[i] -= healing_apply; - if( damage_disinfected[i] <= 0 ) { - damage_disinfected[i] = 0; + if( get_part_damage_disinfected( bp ) > 0 ) { + mod_part_damage_disinfected( bp, -healing_apply ); + if( get_part_damage_disinfected( bp ) <= 0 ) { + set_part_damage_disinfected( bp, 0 ); remove_effect( effect_disinfected, bp->token ); add_msg_if_player( _( "Disinfected wounds on your %s healed." ), body_part_name( bp ) ); } } // remove effects if the limb was healed by other way - if( has_effect( effect_bandaged, bp->token ) && ( hp_cur[i] == hp_max[i] ) ) { - damage_bandaged[i] = 0; + if( has_effect( effect_bandaged, bp->token ) && ( get_part( bp )->is_at_max_hp() ) ) { + set_part_damage_bandaged( bp, 0 ); remove_effect( effect_bandaged, bp->token ); add_msg_if_player( _( "Bandaged wounds on your %s healed." ), body_part_name( bp ) ); } - if( has_effect( effect_disinfected, bp->token ) && ( hp_cur[i] == hp_max[i] ) ) { - damage_disinfected[i] = 0; + if( has_effect( effect_disinfected, bp->token ) && ( get_part( bp )->is_at_max_hp() ) ) { + set_part_damage_disinfected( bp, 0 ); remove_effect( effect_disinfected, bp->token ); add_msg_if_player( _( "Disinfected wounds on your %s healed." ), body_part_name( bp ) ); } @@ -4630,11 +4691,11 @@ void Character::regen( int rate_multiplier ) void Character::enforce_minimum_healing() { - for( int i = 0; i < num_hp_parts; i++ ) { - if( healed_total[i] <= 0 ) { - heal( static_cast( i ), 1 ); + for( const bodypart_id &bp : get_all_body_parts() ) { + if( get_part_healed_total( bp ) <= 0 ) { + heal( bp, 1 ); } - healed_total[i] = 0; + set_part_healed_total( bp, 0 ); } } @@ -4699,6 +4760,11 @@ void Character::update_body( const time_point &from, const time_point &to ) } const int five_mins = ticks_between( from, to, 5_minutes ); if( five_mins > 0 ) { + if( !activity.is_null() ) { + decrease_activity_level( activity.id()->exertion_level() ); + } else { + reset_activity_level(); + } check_needs_extremes(); update_needs( five_mins ); regen( five_mins ); @@ -4706,15 +4772,12 @@ void Character::update_body( const time_point &from, const time_point &to ) // TODO: change @ref med to take time_duration mend( five_mins * to_turns( 5_minutes ) ); } - if( ticks_between( from, to, 24_hours ) > 0 ) { + if( ticks_between( from, to, 24_hours ) > 0 && !has_trait_flag( "NO_MINIMAL_HEALING" ) ) { enforce_minimum_healing(); } const int thirty_mins = ticks_between( from, to, 30_minutes ); if( thirty_mins > 0 ) { - if( activity.is_null() ) { - reset_activity_level(); - } // Radiation kills health even at low doses update_health( has_trait( trait_RADIOGENIC ) ? 0 : -get_rad() ); get_sick(); @@ -4722,6 +4785,12 @@ void Character::update_body( const time_point &from, const time_point &to ) for( const auto &v : vitamin::all() ) { const time_duration rate = vitamin_rate( v.first ); + + // No blood volume regeneration if body lacks fluids + if( v.first == vitamin_blood && has_effect( effect_hypovolemia ) && get_thirst() > 240 ) { + continue; + } + if( rate > 0_turns ) { int qty = ticks_between( from, to, rate ); if( qty > 0 ) { @@ -4737,6 +4806,10 @@ void Character::update_body( const time_point &from, const time_point &to ) } } + if( is_avatar() && ticks_between( from, to, 24_hours ) > 0 ) { + as_avatar()->advance_daily_calories(); + } + do_skill_rust(); } @@ -5029,8 +5102,7 @@ needs_rates Character::calc_needs_rates() const needs_rates rates; rates.hunger = metabolic_rate(); - // TODO: this is where calculating basal metabolic rate, in kcal per day would go - rates.kcal = 2500.0; + rates.kcal = get_bmr(); add_msg_if_player( m_debug, "Metabolic rate: %.2f", rates.hunger ); @@ -5099,6 +5171,9 @@ needs_rates Character::calc_needs_rates() const rates.thirst *= 0.25f; } + rates.fatigue = enchantment_cache.modify_value( enchant_vals::mod::FATIGUE, rates.fatigue ); + rates.thirst = enchantment_cache.modify_value( enchant_vals::mod::THIRST, rates.thirst ); + return rates; } @@ -5110,13 +5185,13 @@ void Character::check_needs_extremes() _( "You have a sudden heart attack!" ), _( " has a sudden heart attack!" ) ); g->events().send( getID(), efftype_id() ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else if( get_stim() < -200 || get_painkiller() > 240 ) { add_msg_player_or_npc( m_bad, _( "Your breathing stops completely." ), _( "'s breathing stops completely." ) ); g->events().send( getID(), efftype_id() ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else if( has_effect( effect_jetinjector ) && get_effect_dur( effect_jetinjector ) > 40_minutes ) { if( !( has_trait( trait_NOPAIN ) ) ) { add_msg_player_or_npc( m_bad, @@ -5127,19 +5202,19 @@ void Character::check_needs_extremes() _( "'s heart spasms and stops." ) ); } g->events().send( getID(), effect_jetinjector ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else if( get_effect_dur( effect_adrenaline ) > 50_minutes ) { add_msg_player_or_npc( m_bad, _( "Your heart spasms and stops." ), _( "'s heart spasms and stops." ) ); g->events().send( getID(), effect_adrenaline ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else if( get_effect_int( effect_drunk ) > 4 ) { add_msg_player_or_npc( m_bad, _( "Your breathing slows down to a stop." ), _( "'s breathing slows down to a stop." ) ); g->events().send( getID(), effect_drunk ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } // check if we've starved @@ -5147,7 +5222,7 @@ void Character::check_needs_extremes() if( get_stored_kcal() <= 0 ) { add_msg_if_player( m_bad, _( "You have starved to death." ) ); g->events().send( getID() ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else { if( calendar::once_every( 12_hours ) ) { std::string category; @@ -5187,7 +5262,7 @@ void Character::check_needs_extremes() if( get_thirst() >= 1200 ) { add_msg_if_player( m_bad, _( "You have died of dehydration." ) ); g->events().send( getID() ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); } else if( get_thirst() >= 1000 && calendar::once_every( 30_minutes ) ) { add_msg_if_player( m_warning, _( "Even your eyes feel dry…" ) ); } else if( get_thirst() >= 800 && calendar::once_every( 30_minutes ) ) { @@ -5453,9 +5528,11 @@ void Character::update_bodytemp() -1.5f * get_fatigue() ) ); // Sunlight - const int sunlight_warmth = g->is_in_sunlight( pos() ) ? ( g->weather.weather == WEATHER_SUNNY ? - 1000 : - 500 ) : 0; + const int sunlight_warmth = g->is_in_sunlight( pos() ) ? + ( get_weather().weather_id->sun_intensity == + sun_intensity_type::high ? + 1000 : + 500 ) : 0; const int best_fire = get_heat_radiation( pos(), true ); const int lying_warmth = use_floor_warmth ? floor_warmth( pos() ) : 0; @@ -5496,8 +5573,7 @@ void Character::update_bodytemp() bp ) / 100.0 ) ); // Calculate windchill int windchill = get_local_windchill( player_local_temp, - get_local_humidity( weather.humidity, g->weather.weather, - sheltered ), + get_local_humidity( weather.humidity, get_weather().weather_id, sheltered ), bp_windpower ); // If you're standing in water, air temperature is replaced by water temperature. No wind. // Convert to 0.01C @@ -6046,21 +6122,15 @@ Character::comfort_response_t Character::base_comfort_value( const tripoint &p ) int Character::blood_loss( const bodypart_id &bp ) const { - int hp_cur_sum = 1; - int hp_max_sum = 1; + int hp_cur_sum = get_part_hp_cur( bp ); + int hp_max_sum = get_part_hp_max( bp ); if( bp == bodypart_id( "leg_l" ) || bp == bodypart_id( "leg_r" ) ) { - hp_cur_sum = hp_cur[hp_leg_l] + hp_cur[hp_leg_r]; - hp_max_sum = hp_max[hp_leg_l] + hp_max[hp_leg_r]; + hp_cur_sum = get_part_hp_cur( bodypart_id( "leg_l" ) ) + get_part_hp_cur( bodypart_id( "leg_r" ) ); + hp_max_sum = get_part_hp_max( bodypart_id( "leg_l" ) ) + get_part_hp_max( bodypart_id( "leg_r" ) ); } else if( bp == bodypart_id( "arm_l" ) || bp == bodypart_id( "arm_r" ) ) { - hp_cur_sum = hp_cur[hp_arm_l] + hp_cur[hp_arm_r]; - hp_max_sum = hp_max[hp_arm_l] + hp_max[hp_arm_r]; - } else if( bp == bodypart_id( "torso" ) ) { - hp_cur_sum = hp_cur[hp_torso]; - hp_max_sum = hp_max[hp_torso]; - } else if( bp == bodypart_id( "head" ) ) { - hp_cur_sum = hp_cur[hp_head]; - hp_max_sum = hp_max[hp_head]; + hp_cur_sum = get_part_hp_cur( bodypart_id( "arm_l" ) ) + get_part_hp_cur( bodypart_id( "arm_r" ) ); + hp_max_sum = get_part_hp_max( bodypart_id( "arm_l" ) ) + get_part_hp_max( bodypart_id( "arm_r" ) ); } hp_cur_sum = std::min( hp_max_sum, std::max( 0, hp_cur_sum ) ); @@ -6080,10 +6150,10 @@ float Character::get_hit_base() const return get_dex() / 4.0f; } -hp_part Character::body_window( const std::string &menu_header, - bool show_all, bool precise, - int normal_bonus, int head_bonus, int torso_bonus, - float bleed, float bite, float infect, float bandage_power, float disinfectant_power ) const +bodypart_id Character::body_window( const std::string &menu_header, + bool show_all, bool precise, + int normal_bonus, int head_bonus, int torso_bonus, + int bleed, float bite, float infect, float bandage_power, float disinfectant_power ) const { /* This struct establishes some kind of connection between the hp_part (which can be healed and * have HP) and the body_part. Note that there are more body_parts than hp_parts. For example: @@ -6091,24 +6161,23 @@ hp_part Character::body_window( const std::string &menu_header, struct healable_bp { mutable bool allowed; bodypart_id bp; - hp_part hp; std::string name; // Translated name as it appears in the menu. int bonus; }; /* The array of the menu entries show to the player. The entries are displayed in this order, * it may be changed here. */ - std::array parts = { { - { false, bodypart_id( "head" ), hp_head, _( "Head" ), head_bonus }, - { false, bodypart_id( "torso" ), hp_torso, _( "Torso" ), torso_bonus }, - { false, bodypart_id( "arm_l" ), hp_arm_l, _( "Left Arm" ), normal_bonus }, - { false, bodypart_id( "arm_r" ), hp_arm_r, _( "Right Arm" ), normal_bonus }, - { false, bodypart_id( "leg_l" ), hp_leg_l, _( "Left Leg" ), normal_bonus }, - { false, bodypart_id( "leg_r" ), hp_leg_r, _( "Right Leg" ), normal_bonus }, + std::array parts = { { + { false, bodypart_id( "head" ), _( "Head" ), head_bonus }, + { false, bodypart_id( "torso" ), _( "Torso" ), torso_bonus }, + { false, bodypart_id( "arm_l" ), _( "Left Arm" ), normal_bonus }, + { false, bodypart_id( "arm_r" ), _( "Right Arm" ), normal_bonus }, + { false, bodypart_id( "leg_l" ), _( "Left Leg" ), normal_bonus }, + { false, bodypart_id( "leg_r" ), _( "Right Leg" ), normal_bonus }, } }; int max_bp_name_len = 0; - for( const auto &e : parts ) { + for( const healable_bp &e : parts ) { max_bp_name_len = std::max( max_bp_name_len, utf8_width( e.name ) ); } @@ -6120,20 +6189,19 @@ hp_part Character::body_window( const std::string &menu_header, bool is_valid_choice = false; for( size_t i = 0; i < parts.size(); i++ ) { - const auto &e = parts[i]; + const healable_bp &e = parts[i]; const bodypart_id &bp = e.bp; const body_part bp_token = bp->token; - const hp_part hp = e.hp; - const int maximal_hp = hp_max[hp]; - const int current_hp = hp_cur[hp]; + const int maximal_hp = get_part_hp_max( bp ); + const int current_hp = get_part_hp_cur( bp ); // This will c_light_gray if the part does not have any effects cured by the item/effect // (e.g. it cures only bites, but the part does not have a bite effect) - const nc_color state_col = limb_color( bp, bleed > 0.0f, bite > 0.0f, infect > 0.0f ); + const nc_color state_col = limb_color( bp, bleed > 0, bite > 0.0f, infect > 0.0f ); const bool has_curable_effect = state_col != c_light_gray; // The same as in the main UI sidebar. Independent of the capability of the healing item/effect! const nc_color all_state_col = limb_color( bp, true, true, true ); // Broken means no HP can be restored, it requires surgical attention. - const bool limb_is_broken = is_limb_broken( hp ); + const bool limb_is_broken = is_limb_broken( bp ); const bool limb_is_mending = worn_with_flag( flag_SPLINT, bp ); if( show_all ) { @@ -6208,11 +6276,13 @@ hp_part Character::body_window( const std::string &menu_header, if( bleeding ) { desc += colorize( string_format( "%s: %s", get_effect( effect_bleed, bp_token ).get_speed_name(), get_effect( effect_bleed, bp_token ).disp_short_desc() ), c_red ) + "\n"; - if( bleed > 0.0f ) { - desc += colorize( string_format( _( "Chance to stop: %d %%" ), - static_cast( bleed * 100 ) ), c_light_green ) + "\n"; + if( bleed > 0 ) { + int percent = static_cast( bleed * 100 / get_effect_int( effect_bleed, bp_token ) ); + percent = std::min( percent, 100 ); + desc += colorize( string_format( _( "Expected reduction of bleeding by: %d %%" ), percent ), + c_light_green ) + "\n"; } else { - desc += colorize( _( "This will not stop the bleeding." ), + desc += colorize( _( "This will not affect the bleeding." ), c_yellow ) + "\n"; } } @@ -6294,9 +6364,9 @@ hp_part Character::body_window( const std::string &menu_header, bmenu.query(); if( bmenu.ret >= 0 && static_cast( bmenu.ret ) < parts.size() && parts[bmenu.ret].allowed ) { - return parts[bmenu.ret].hp; + return parts[bmenu.ret].bp; } else { - return num_hp_parts; + return bodypart_id( "num_bp" ); } } @@ -6308,7 +6378,8 @@ nc_color Character::limb_color( const bodypart_id &bp, bool bleed, bool bite, bo const body_part bp_token = bp->token; int color_bit = 0; nc_color i_color = c_light_gray; - if( bleed && has_effect( effect_bleed, bp_token ) ) { + const int intense = get_effect_int( effect_bleed, bp_token ); + if( bleed && intense > 0 ) { color_bit += 1; } if( bite && has_effect( effect_bite, bp_token ) ) { @@ -6319,7 +6390,13 @@ nc_color Character::limb_color( const bodypart_id &bp, bool bleed, bool bite, bo } switch( color_bit ) { case 1: - i_color = c_red; + if( intense < 11 ) { + i_color = c_light_red; + } else if( intense < 21 ) { + i_color = c_red; + } else { + i_color = c_red_red; + } break; case 10: i_color = c_blue; @@ -6328,10 +6405,18 @@ nc_color Character::limb_color( const bodypart_id &bp, bool bleed, bool bite, bo i_color = c_green; break; case 11: - i_color = c_magenta; + if( intense < 21 ) { + i_color = c_magenta; + } else { + i_color = c_magenta_red; + } break; case 101: - i_color = c_yellow; + if( intense < 21 ) { + i_color = c_yellow; + } else { + i_color = c_yellow_red; + } break; } @@ -6882,52 +6967,6 @@ float Character::rest_quality() const return has_effect( effect_sleep ) ? 1.0f : 0.0f; } -hp_part Character::bp_to_hp( const body_part bp ) -{ - switch( bp ) { - case bp_head: - case bp_eyes: - case bp_mouth: - return hp_head; - case bp_torso: - return hp_torso; - case bp_arm_l: - case bp_hand_l: - return hp_arm_l; - case bp_arm_r: - case bp_hand_r: - return hp_arm_r; - case bp_leg_l: - case bp_foot_l: - return hp_leg_l; - case bp_leg_r: - case bp_foot_r: - return hp_leg_r; - default: - return num_hp_parts; - } -} - -body_part Character::hp_to_bp( const hp_part hpart ) -{ - switch( hpart ) { - case hp_head: - return bp_head; - case hp_torso: - return bp_torso; - case hp_arm_l: - return bp_arm_l; - case hp_arm_r: - return bp_arm_r; - case hp_leg_l: - return bp_leg_l; - case hp_leg_r: - return bp_leg_r; - default: - return num_bp; - } -} - std::string Character::extended_description() const { std::string ss; @@ -6950,15 +6989,13 @@ std::string Character::extended_description() const // This is a stripped-down version of the body_window function // This should be extracted into a separate function later on - for( const bodypart_id bp : bps ) { + for( const bodypart_id &bp : bps ) { const std::string &bp_heading = body_part_name_as_heading( bp, 1 ); - hp_part hp = bp_to_hp( bp->token ); - const int maximal_hp = hp_max[hp]; - const int current_hp = hp_cur[hp]; const nc_color state_col = limb_color( bp, true, true, true ); nc_color name_color = state_col; - auto hp_bar = get_hp_bar( current_hp, maximal_hp, false ); + std::pair hp_bar = get_hp_bar( get_part_hp_cur( bp ), get_part_hp_max( bp ), + false ); ss += colorize( left_justify( bp_heading, longest ), name_color ); ss += colorize( hp_bar.first, hp_bar.second ); @@ -7120,7 +7157,7 @@ float Character::healing_rate( float at_rest_quality ) const final_rate *= 1.0f + primary_hp_mod; } - return final_rate; + return enchantment_cache.modify_value( enchant_vals::mod::REGEN_HP, final_rate ); } float Character::healing_rate_medicine( float at_rest_quality, const bodypart_id &bp ) const @@ -7344,9 +7381,10 @@ int Character::get_bmr() const Values are for males, and average! */ const int equation_constant = 5; - return std::ceil( metabolic_rate_base() * activity_level * ( units::to_gram - ( bodyweight() / 100.0 ) + - ( 6.25 * height() ) - ( 5 * age() ) + equation_constant ) ); + const double base_bmr_calc = metabolic_rate_base() * activity_level * ( units::to_gram + ( bodyweight() / 100.0 ) + + ( 6.25 * height() ) - ( 5 * age() ) + equation_constant ); + return std::ceil( enchantment_cache.modify_value( enchant_vals::mod::METABOLISM, base_bmr_calc ) ); } void Character::increase_activity_level( float new_level ) @@ -7565,6 +7603,7 @@ int Character::get_stamina_max() const static const std::string max_stamina_modifier( "max_stamina_modifier" ); int maxStamina = get_option< int >( player_max_stamina ); maxStamina *= Character::mutation_value( max_stamina_modifier ); + maxStamina = enchantment_cache.modify_value( enchant_vals::mod::MAX_STAMINA, maxStamina ); return maxStamina; } @@ -7640,7 +7679,9 @@ void Character::update_stamina( int turns ) mutation_value( stamina_regen_modifier ) + ( mutation_value( "max_stamina_modifier" ) - 1.0f ) ); // But mouth encumbrance interferes, even with mutated stamina. stamina_recovery += stamina_multiplier * std::max( 1.0f, - base_regen_rate - ( encumb( bp_mouth ) / 5.0f ) ); + base_regen_rate - ( encumb( bodypart_id( "mouth" ) ) / 5.0f ) ); + stamina_recovery = enchantment_cache.modify_value( enchant_vals::mod::REGEN_STAMINA, + stamina_recovery ); // TODO: recovering stamina causes hunger/thirst/fatigue. // TODO: Tiredness slowing recovery @@ -7697,6 +7738,10 @@ bool Character::invoke_item( item *used, const std::string &method, const tripoi if( !has_enough_charges( *used, true ) ) { return false; } + if( used->is_medication() && !can_use_heal_item( *used ) ) { + add_msg_if_player( m_bad, _( "Your biology is not compatible with that healing item." ) ); + return false; + } item *actually_used = used->get_usable_item( method ); if( actually_used == nullptr ) { @@ -7710,7 +7755,6 @@ bool Character::invoke_item( item *used, const std::string &method, const tripoi return false; } // Prevent accessing the item as it may have been deleted by the invoked iuse function. - if( used->is_tool() || actually_used->is_medication() ) { return consume_charges( *actually_used, charges_used ); } else if( used->is_bionic() || used->is_deployable() || method == "place_trap" ) { @@ -7912,9 +7956,9 @@ int Character::item_handling_cost( const item &it, bool penalties, int base_cost // For single handed items use the least encumbered hand if( it.is_two_handed( *this ) ) { - mv += encumb( bp_hand_l ) + encumb( bp_hand_r ); + mv += encumb( bodypart_id( "hand_l" ) ) + encumb( bodypart_id( "hand_r" ) ); } else { - mv += std::min( encumb( bp_hand_l ), encumb( bp_hand_r ) ); + mv += std::min( encumb( bodypart_id( "hand_l" ) ), encumb( bodypart_id( "hand_r" ) ) ); } return std::max( mv, 0 ); @@ -8041,7 +8085,7 @@ int Character::get_shout_volume() const // Balanced around whisper for wearing bondage mask // and noise ~= 10 (door smashing) for wearing dust mask for character with strength = 8 /** @EFFECT_STR increases shouting volume */ - const int penalty = encumb( bp_mouth ) * 3 / 2; + const int penalty = encumb( bodypart_id( "mouth" ) ) * 3 / 2; int noise = base + str_cur * shout_multiplier - penalty; // Minimum noise volume possible after all reductions. @@ -8052,6 +8096,8 @@ int Character::get_shout_volume() const noise = std::max( minimum_noise, noise ); } + noise = enchantment_cache.modify_value( enchant_vals::mod::SHOUT_NOISE, noise ); + // Screaming underwater is not good for oxygen and harder to do overall if( underwater ) { noise = std::max( minimum_noise, noise / 2 ); @@ -8109,7 +8155,7 @@ void Character::shout( std::string msg, bool order ) } } - const int penalty = encumb( bp_mouth ) * 3 / 2; + const int penalty = encumb( bodypart_id( "mouth" ) ) * 3 / 2; // TODO: indistinct noise descriptions should be handled in the sounds code if( noise <= minimum_noise ) { add_msg_if_player( m_warning, @@ -8171,33 +8217,36 @@ tripoint Character::adjacent_tile() const // Don't consider player position continue; } + if( g->critter_at( p ) != nullptr ) { + continue; + } + if( here.impassable( p ) ) { + continue; + } const trap &curtrap = here.tr_at( p ); - if( g->critter_at( p ) == nullptr && here.passable( p ) && - ( curtrap.is_null() || curtrap.is_benign() ) ) { - // Only consider tile if unoccupied, passable and has no traps - dangerous_fields = 0; - auto &tmpfld = here.field_at( p ); - for( auto &fld : tmpfld ) { - const field_entry &cur = fld.second; - if( cur.is_dangerous() ) { - dangerous_fields++; - } + // If we don't known a trap here, the spot "appears" to be good, so consider it. + // Same if we know a benign trap (as it's not dangerous). + if( curtrap.can_see( p, *this ) && !curtrap.is_benign() ) { + continue; + } + // Only consider tile if unoccupied, passable and has no traps + dangerous_fields = 0; + auto &tmpfld = here.field_at( p ); + for( auto &fld : tmpfld ) { + const field_entry &cur = fld.second; + if( cur.is_dangerous() ) { + dangerous_fields++; } + } - if( dangerous_fields == 0 ) { - ret.push_back( p ); - } + if( dangerous_fields == 0 ) { + ret.push_back( p ); } } return random_entry( ret, pos() ); // player position if no valid adjacent tiles } -void Character::healed_bp( int bp, int amount ) -{ - healed_total[bp] += amount; -} - void Character::set_fac_id( const std::string &my_fac_id ) { fac_id = faction_id( my_fac_id ); @@ -8698,18 +8747,17 @@ void Character::apply_damage( Creature *source, bodypart_id hurt, int dam, const // Or if we're debugging and don't want to die return; } - body_part enum_bp = hurt->token; - hp_part hurtpart = bp_to_hp( enum_bp ); - if( hurtpart == num_hp_parts ) { + + if( hurt == bodypart_id( "num_bp" ) ) { debugmsg( "Wacky body part hurt!" ); - hurtpart = hp_torso; + hurt = bodypart_id( "torso" ); } mod_pain( dam / 2 ); - const int dam_to_bodypart = std::min( dam, hp_cur[hurtpart] ); + const int dam_to_bodypart = std::min( dam, get_part_hp_cur( hurt ) ); - hp_cur[hurtpart] -= dam_to_bodypart; + mod_part_hp_cur( hurt, - dam_to_bodypart ); g->events().send( getID(), dam_to_bodypart ); if( !weapon.is_null() && !as_player()->can_wield( weapon ).success() && @@ -8719,9 +8767,9 @@ void Character::apply_damage( Creature *source, bodypart_id hurt, int dam, const put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, { weapon } ); i_rem( &weapon ); } - if( has_effect( effect_mending, enum_bp ) && ( source == nullptr || + if( has_effect( effect_mending, hurt->token ) && ( source == nullptr || !source->is_hallucination() ) ) { - effect &e = get_effect( effect_mending, enum_bp ); + effect &e = get_effect( effect_mending, hurt->token ); float remove_mend = dam / 20.0f; e.mod_duration( -e.get_max_duration() * remove_mend ); } @@ -8733,10 +8781,10 @@ void Character::apply_damage( Creature *source, bodypart_id hurt, int dam, const if( !bypass_med ) { // remove healing effects if damaged int remove_med = roll_remainder( dam / 5.0f ); - if( remove_med > 0 && has_effect( effect_bandaged, enum_bp ) ) { + if( remove_med > 0 && has_effect( effect_bandaged, hurt->token ) ) { remove_med -= reduce_healing_effect( effect_bandaged, remove_med, hurt ); } - if( remove_med > 0 && has_effect( effect_disinfected, enum_bp ) ) { + if( remove_med > 0 && has_effect( effect_disinfected, hurt->token ) ) { reduce_healing_effect( effect_disinfected, remove_med, hurt ); } } @@ -8762,8 +8810,7 @@ dealt_damage_instance Character::deal_damage( Creature *source, bodypart_id bp, //monster hits player melee SCT.add( point( posx(), posy() ), direction_from( point_zero, point( posx() - source->posx(), posy() - source->posy() ) ), - get_hp_bar( dam, get_hp_max( player::bp_to_hp( bp->token ) ) ).first, m_bad, - body_part_name( bp ), m_neutral ); + get_hp_bar( dam, get_hp_max( bp ) ).first, m_bad, body_part_name( bp ), m_neutral ); } } @@ -8919,72 +8966,23 @@ int Character::reduce_healing_effect( const efftype_id &eff_id, int remove_med, void Character::heal_bp( bodypart_id bp, int dam ) { - heal( bp->token, dam ); + heal( bp, dam ); } -void Character::heal( body_part healed, int dam ) -{ - hp_part healpart; - switch( healed ) { - case bp_eyes: - // Fall through to head damage - case bp_mouth: - // Fall through to head damage - case bp_head: - healpart = hp_head; - break; - case bp_torso: - healpart = hp_torso; - break; - case bp_hand_l: - // Shouldn't happen, but fall through to arms - debugmsg( "Heal against hands!" ); - /* fallthrough */ - case bp_arm_l: - healpart = hp_arm_l; - break; - case bp_hand_r: - // Shouldn't happen, but fall through to arms - debugmsg( "Heal against hands!" ); - /* fallthrough */ - case bp_arm_r: - healpart = hp_arm_r; - break; - case bp_foot_l: - // Shouldn't happen, but fall through to legs - debugmsg( "Heal against feet!" ); - /* fallthrough */ - case bp_leg_l: - healpart = hp_leg_l; - break; - case bp_foot_r: - // Shouldn't happen, but fall through to legs - debugmsg( "Heal against feet!" ); - /* fallthrough */ - case bp_leg_r: - healpart = hp_leg_r; - break; - default: - debugmsg( "Wacky body part healed!" ); - healpart = hp_torso; - } - heal( healpart, dam ); -} - -void Character::heal( hp_part healed, int dam ) +void Character::heal( const bodypart_id &healed, int dam ) { if( !is_limb_broken( healed ) ) { - int effective_heal = std::min( dam, hp_max[healed] - hp_cur[healed] ); - hp_cur[healed] += effective_heal; + int effective_heal = std::min( dam, get_part_hp_max( healed ) - get_part_hp_cur( healed ) ); + mod_part_hp_cur( healed, effective_heal ); g->events().send( getID(), effective_heal ); } } void Character::healall( int dam ) { - for( int healed_part = 0; healed_part < num_hp_parts; healed_part++ ) { - heal( static_cast( healed_part ), dam ); - healed_bp( healed_part, dam ); + for( const bodypart_id &bp : get_all_body_parts() ) { + heal( bp, dam ); + mod_part_healed_total( bp, dam ); } } @@ -8994,11 +8992,10 @@ void Character::hurtall( int dam, Creature *source, bool disturb /*= true*/ ) return; } - for( int i = 0; i < num_hp_parts; i++ ) { - const hp_part bp = static_cast( i ); + for( const bodypart_id &bp : get_all_body_parts() ) { // Don't use apply_damage here or it will annoy the player with 6 queries - const int dam_to_bodypart = std::min( dam, hp_cur[bp] ); - hp_cur[bp] -= dam_to_bodypart; + const int dam_to_bodypart = std::min( dam, get_part_hp_cur( bp ) ); + mod_part_hp_cur( bp, - dam_to_bodypart ); g->events().send( getID(), dam_to_bodypart ); } @@ -9010,8 +9007,7 @@ void Character::hurtall( int dam, Creature *source, bool disturb /*= true*/ ) int Character::hitall( int dam, int vary, Creature *source ) { int damage_taken = 0; - for( int i = 0; i < num_hp_parts; i++ ) { - const bodypart_id bp = convert_bp( hp_to_bp( static_cast( i ) ) ).id(); + for( const bodypart_id &bp : get_all_body_parts( true ) ) { int ddam = vary ? dam * rng( 100 - vary, 100 ) / 100 : dam; int cut = 0; auto damage = damage_instance::physical( ddam, cut, 0 ); @@ -9023,7 +9019,8 @@ int Character::hitall( int dam, int vary, Creature *source ) void Character::on_hurt( Creature *source, bool disturb /*= true*/ ) { if( has_trait( trait_ADRENALINE ) && !has_effect( effect_adrenaline ) && - ( hp_cur[hp_head] < 25 || hp_cur[hp_torso] < 15 ) ) { + ( get_part_hp_cur( bodypart_id( "head" ) ) < 25 || + get_part_hp_cur( bodypart_id( "torso" ) ) < 15 ) ) { add_effect( effect_adrenaline, 20_minutes ); } @@ -9133,8 +9130,8 @@ void Character::blossoms() void Character::update_vitamins( const vitamin_id &vit ) { - if( is_npc() ) { - return; // NPCs cannot develop vitamin diseases + if( is_npc() && vit->type() != vitamin_type::COUNTER ) { + return; // NPCs cannot develop vitamin diseases, bypass for special } efftype_id def = vit.obj().deficiency(); @@ -9366,6 +9363,38 @@ units::volume Character::volume_capacity() const return volume_capacity; } +units::volume Character::volume_capacity_with_tweaks( const + std::vector> + &locations ) const +{ + std::map dropping; + for( const std::pair &location_pair : locations ) { + dropping.emplace( location_pair.first.get_item(), location_pair.second ); + } + return volume_capacity_with_tweaks( { dropping } ); +} + +units::volume Character::volume_capacity_with_tweaks( const item_tweaks &tweaks ) const +{ + const std::map empty; + const std::map &without = tweaks.without_items ? tweaks.without_items->get() : + empty; + + units::volume volume_capacity = 0_ml; + + if( !without.count( &weapon ) ) { + volume_capacity += weapon.contents.total_container_capacity(); + } + + for( auto &i : worn ) { + if( !without.count( &i ) ) { + volume_capacity += i.contents.total_container_capacity(); + } + } + + return volume_capacity; +} + units::volume Character::volume_carried() const { return volume_capacity() - free_space(); @@ -9777,12 +9806,12 @@ int Character::bonus_item_warmth( const bodypart_id &bp ) const } // If the player's head is not encumbered, check if hood can be put up - if( bp == bodypart_id( "head" ) && encumb( bp_head ) < 10 ) { + if( bp == bodypart_id( "head" ) && encumb( bodypart_id( "head" ) ) < 10 ) { ret += bestwarmth( worn, "HOOD" ); } // If the player's mouth is not encumbered, check if collar can be put up - if( bp == bodypart_id( "mouth" ) && encumb( bp_mouth ) < 10 ) { + if( bp == bodypart_id( "mouth" ) && encumb( bodypart_id( "mouth" ) ) < 10 ) { ret += bestwarmth( worn, "COLLAR" ); } @@ -10461,10 +10490,10 @@ int Character::run_cost( int base_cost, bool diag ) const } // Linearly increase move cost relative to individual leg hp. - movecost += 50 * ( 1 - std::sqrt( static_cast( hp_cur[hp_leg_l] ) / - static_cast( hp_max[hp_leg_l] ) ) ); - movecost += 50 * ( 1 - std::sqrt( static_cast( hp_cur[hp_leg_r] ) / - static_cast( hp_max[hp_leg_r] ) ) ); + movecost += 50 * ( 1 - std::sqrt( static_cast( get_part_hp_cur( bodypart_id( "leg_l" ) ) ) / + static_cast( get_part_hp_max( bodypart_id( "leg_l" ) ) ) ) ); + movecost += 50 * ( 1 - std::sqrt( static_cast( get_part_hp_cur( bodypart_id( "leg_r" ) ) ) / + static_cast( get_part_hp_max( bodypart_id( "leg_r" ) ) ) ) ); movecost *= mutation_value( "movecost_modifier" ); if( flatground ) { @@ -10516,8 +10545,8 @@ int Character::run_cost( int base_cost, bool diag ) const } movecost += - ( ( encumb( bp_foot_l ) + encumb( bp_foot_r ) ) * 2.5 + - ( encumb( bp_leg_l ) + encumb( bp_leg_r ) ) * 1.5 ) / 10; + ( ( encumb( bodypart_id( "foot_l" ) ) + encumb( bodypart_id( "foot_r" ) ) ) * 2.5 + + ( encumb( bodypart_id( "leg_l" ) ) + encumb( bodypart_id( "leg_r" ) ) ) * 1.5 ) / 10; // ROOTS3 does slow you down as your roots are probing around for nutrients, // whether you want them to or not. ROOTS1 is just too squiggly without shoes @@ -10720,7 +10749,7 @@ bool Character::can_hear( const tripoint &source, const int volume ) const } const int dist = rl_dist( source, pos() ); const float volume_multiplier = hearing_ability(); - return ( volume - weather::sound_attn( g->weather.weather ) ) * volume_multiplier >= dist; + return ( volume - get_weather().weather_id->sound_attn ) * volume_multiplier >= dist; } float Character::hearing_ability() const @@ -10795,16 +10824,12 @@ bool Character::has_weapon() const return !unarmed_attack(); } -int Character::get_hp() const -{ - return get_hp( num_hp_parts ); -} - int Character::get_lowest_hp() const { // Set lowest_hp to an arbitrarily large number. int lowest_hp = 999; - for( int cur_hp : this->hp_cur ) { + for( const std::pair &elem : get_body() ) { + const int cur_hp = elem.second.get_hp_cur(); if( cur_hp < lowest_hp ) { lowest_hp = cur_hp; } @@ -10812,35 +10837,6 @@ int Character::get_lowest_hp() const return lowest_hp; } -int Character::get_hp( hp_part bp ) const -{ - if( bp < num_hp_parts ) { - return hp_cur[bp]; - } - int hp_total = 0; - for( int i = 0; i < num_hp_parts; ++i ) { - hp_total += hp_cur[i]; - } - return hp_total; -} - -int Character::get_hp_max() const -{ - return get_hp_max( num_hp_parts ); -} - -int Character::get_hp_max( hp_part bp ) const -{ - if( bp < num_hp_parts ) { - return hp_max[bp]; - } - int hp_total = 0; - for( int i = 0; i < num_hp_parts; ++i ) { - hp_total += hp_max[i]; - } - return hp_total; -} - Creature::Attitude Character::attitude_to( const Creature &other ) const { const auto m = dynamic_cast( &other ); @@ -10884,6 +10880,11 @@ Creature::Attitude Character::attitude_to( const Creature &other ) const return Attitude::NEUTRAL; } +npc_attitude Character::get_attitude() const +{ + return NPCATT_NULL; +} + bool Character::sees( const tripoint &t, bool, int ) const { const int wanted_range = rl_dist( pos(), t ); @@ -11047,10 +11048,25 @@ int Character::intimidation() const if( has_effect( effect_drunk ) ) { ret -= 4; } - + ret = enchantment_cache.modify_value( enchant_vals::mod::SOCIAL_INTIMIDATE, ret ); return ret; } +bool Character::has_proficiency( const proficiency_id &prof ) const +{ + return _proficiencies.count( prof ); +} + +void Character::add_proficiency( const proficiency_id &prof ) +{ + _proficiencies.insert( prof ); +} + +const std::set &Character::proficiencies() const +{ + return _proficiencies; +} + bool Character::defer_move( const tripoint &next ) { // next must be adjacent to current pos diff --git a/src/character.h b/src/character.h index c7fa82c3c7c72..7925167545bb2 100644 --- a/src/character.h +++ b/src/character.h @@ -70,6 +70,7 @@ struct needs_rates; struct pathfinding_settings; struct points_left; template struct enum_traits; +enum npc_attitude : int; using drop_location = std::pair; using drop_locations = std::list; @@ -226,46 +227,6 @@ enum class rechargeable_cbm : int { other }; -struct layer_details { - - std::vector pieces; - int max = 0; - int total = 0; - - void reset(); - int layer( int encumbrance ); - - bool operator ==( const layer_details &rhs ) const { - return max == rhs.max && - total == rhs.total && - pieces == rhs.pieces; - } -}; - -struct encumbrance_data { - int encumbrance = 0; - int armor_encumbrance = 0; - int layer_penalty = 0; - - std::array( layer_level::NUM_LAYER_LEVELS )> - layer_penalty_details; - - void layer( const layer_level level, const int encumbrance ) { - layer_penalty += layer_penalty_details[static_cast( level )].layer( encumbrance ); - } - - void reset() { - *this = encumbrance_data(); - } - - bool operator ==( const encumbrance_data &rhs ) const { - return encumbrance == rhs.encumbrance && - armor_encumbrance == rhs.armor_encumbrance && - layer_penalty == rhs.layer_penalty && - layer_penalty_details == rhs.layer_penalty_details; - } -}; - struct aim_type { std::string name; std::string action; @@ -345,6 +306,8 @@ class Character : public Creature, public visitable bool in_species( const species_id &spec ) const override; // Turned to false for simulating NPCs on distant missions so they don't drop all their gear in sight bool death_drops; + // Is currently in control of a vehicle + bool controlling_vehicle = false; enum class comfort_level : int { impossible = -999, @@ -583,19 +546,11 @@ class Character : public Creature, public visitable /** Handles stat and bonus reset. */ void reset() override; - /** Recalculates encumbrance cache. */ - void reset_encumbrance(); /** Returns ENC provided by armor, etc. */ - int encumb( body_part bp ) const; + int encumb( const bodypart_id &bp ) const; /** Returns body weight plus weight of inventory and worn/wielded items */ units::mass get_weight() const override; - /** Get encumbrance for all body parts. */ - std::array get_encumbrance() const; - /** Get encumbrance for all body parts as if `new_item` was also worn. */ - std::array get_encumbrance( const item &new_item ) const; - /** Get encumbrance penalty per layer & body part */ - int extraEncumbrance( layer_level level, int bp ) const; /** Returns true if the character is wearing power armor */ bool is_wearing_power_armor( bool *hasHelmet = nullptr ) const; @@ -639,6 +594,7 @@ class Character : public Creature, public visitable void try_remove_heavysnare(); void try_remove_crushed(); void try_remove_webs(); + void try_remove_impeding_effect(); /** Check against the character's current movement mode */ bool movement_mode_is( const move_mode_id &mode ) const; @@ -666,6 +622,7 @@ class Character : public Creature, public visitable /** Recalculates HP after a change to max strength */ void recalc_hp(); + int get_part_hp_max( const bodypart_id &id ) const; /** Modifies the player's sight values * Must be called when any of the following change: * This must be called when any of the following change: @@ -849,11 +806,6 @@ class Character : public Creature, public visitable void activate_mutation( const trait_id &mutation ); void deactivate_mutation( const trait_id &mut ); - /** Converts a body_part to an hp_part */ - static hp_part bp_to_hp( body_part bp ); - /** Converts an hp_part to a body_part */ - static body_part hp_to_bp( hp_part hpart ); - bool can_mount( const monster &critter ) const; void mount_creature( monster &z ); bool is_mounted() const; @@ -870,9 +822,9 @@ class Character : public Creature, public visitable /** Returns the number of functioning legs */ int get_working_leg_count() const; /** Returns true if the limb is disabled(12.5% or less hp)*/ - bool is_limb_disabled( hp_part limb ) const; + bool is_limb_disabled( const bodypart_id &limb ) const; /** Returns true if the limb is broken */ - bool is_limb_broken( hp_part limb ) const; + bool is_limb_broken( const bodypart_id &limb ) const; /** source of truth of whether a Character can run */ bool can_run() const; /** Hurts all body parts for dam, no armor reduction */ @@ -883,9 +835,8 @@ class Character : public Creature, public visitable void on_hurt( Creature *source, bool disturb = true ); /** Heals a body_part for dam */ void heal_bp( bodypart_id bp, int dam ) override; - void heal( body_part healed, int dam ); - /** Heals an hp_part for dam */ - void heal( hp_part healed, int dam ); + /** Heals an part for dam */ + void heal( const bodypart_id &healed, int dam ); /** Heals all body parts for dam */ void healall( int dam ); @@ -907,10 +858,10 @@ class Character : public Creature, public visitable * bandage_power - quality of bandage * disinfectant_power - quality of disinfectant */ - hp_part body_window( const std::string &menu_header, - bool show_all, bool precise, - int normal_bonus, int head_bonus, int torso_bonus, - float bleed, float bite, float infect, float bandage_power, float disinfectant_power ) const; + bodypart_id body_window( const std::string &menu_header, + bool show_all, bool precise, + int normal_bonus, int head_bonus, int torso_bonus, + int bleed, float bite, float infect, float bandage_power, float disinfectant_power ) const; // Returns color which this limb would have in healing menus nc_color limb_color( const bodypart_id &bp, bool bleed, bool bite, bool infect ) const; @@ -978,13 +929,8 @@ class Character : public Creature, public visitable /** Applies stat mods to character. */ void apply_mods( const trait_id &mut, bool add_remove ); - /** Recalculate encumbrance for all body parts. */ - std::array calc_encumbrance() const; - /** Recalculate encumbrance for all body parts as if `new_item` was also worn. */ - std::array calc_encumbrance( const item &new_item ) const; - /** Applies encumbrance from mutations and bionics only */ - void mut_cbm_encumb( std::array &vals ) const; + void mut_cbm_encumb( std::map &vals ) const; /** Return the position in the worn list where new_item would be * put by default */ @@ -993,12 +939,16 @@ class Character : public Creature, public visitable /** Applies encumbrance from items only * If new_item is not null, then calculate under the asumption that it * is added to existing work items. */ - void item_encumb( std::array &vals, - const item &new_item ) const; + void item_encumb( std::map &vals, const item &new_item ) const; std::array, num_bp> mut_drench; public: + /** Recalculate encumbrance for all body parts. */ + void calc_encumbrance(); + /** Recalculate encumbrance for all body parts as if `new_item` was also worn. */ + void calc_encumbrance( const item &new_item ); + // recalculates enchantment cache by iterating through all held, worn, and wielded items void recalculate_enchantment_cache(); // gets add and mult value from enchantment cache @@ -1123,6 +1073,12 @@ class Character : public Creature, public visitable /** Handles bionic effects over time of the entered bionic */ void process_bionic( int b ); + /** finds the index of the bionic that corresponds to the currently wielded fake item + * i.e. bionic is `BIONIC_WEAPON` and weapon.typeId() == bio.info().fake_item */ + cata::optional active_bionic_weapon_index() const; + /** Checks if bionic can be deactivated (e.g. it's not incapacitaded and power level is sufficient) + * returns either success or failure with log message */ + ret_val can_deactivate_bionic( int b, bool eff_only = false ) const; /** Handles bionic deactivation effects of the entered bionic, returns if anything * deactivated */ bool deactivate_bionic( int b, bool eff_only = false ); @@ -1319,7 +1275,7 @@ class Character : public Creature, public visitable // returns a list of all item_location the character has, including items contained in other items. // only for CONTAINER pocket type; does not look for magazines std::vector all_items_loc(); - // Returns list of all the top level item_lodation the character has. Includes worn and held items. + // Returns list of all the top level item_lodation the character has. Includes worn items but excludes items held on hand. std::vector top_items_loc(); /** Return the item pointer of the item with given invlet, return nullptr if * the player does not have such an item with that invlet. Don't use this on npcs. @@ -1347,20 +1303,14 @@ class Character : public Creature, public visitable item &used_weapon(); /*@}*/ - /** - * Try to find containers that can contain @it and fills them up as much as possible. - * Does not work for items that are not count by charges. - * @param unloading Do not try to add to a container when the item was intentionally unloaded. - * @return Remaining charges which could not be stored on the character. - */ - int i_add_to_container( const item &it, bool unloading ); /** * Adds the item to the character's worn items or wields it, or prompts if the Character cannot pick it up. * @avoid is the item to not put @it into */ - item &i_add( item it, bool should_stack = true, const item *avoid = nullptr ); + item &i_add( item it, bool should_stack = true, const item *avoid = nullptr, bool allow_drop = true, + bool allow_wield = true ); /** tries to add to the character's inventory without a popup. returns nullptr if it fails. */ - item *try_add( item it, const item *avoid = nullptr ); + item *try_add( item it, const item *avoid = nullptr, bool allow_wield = true ); /** * Try to pour the given liquid into the given container/vehicle. The transferred charges are @@ -1485,12 +1435,18 @@ class Character : public Creature, public visitable units::mass weight_carried_with_tweaks( const item_tweaks &tweaks ) const; units::mass weight_carried_with_tweaks( const std::vector> &locations ) const; + units::mass get_selected_stack_weight( const item *i, + const std::map &without ) const; units::volume volume_carried_with_tweaks( const item_tweaks &tweaks ) const; units::volume volume_carried_with_tweaks( const std::vector> - &locations ) - const; + &locations ) const; + units::volume get_selected_stack_volume( const item *i, + const std::map &without ) const; units::mass weight_capacity() const override; units::volume volume_capacity() const; + units::volume volume_capacity_with_tweaks( const item_tweaks &tweaks ) const; + units::volume volume_capacity_with_tweaks( const std::vector> + &locations ) const; units::volume free_space() const; bool can_pickVolume( const item &it, bool safe = false ) const; @@ -1594,6 +1550,12 @@ class Character : public Creature, public visitable /** Returns a value used when attempting to intimidate NPC's */ int intimidation() const; + // --------------- Proficiency Stuff ---------------- + // (bit short at the moment) + bool has_proficiency( const proficiency_id &prof ) const; + void add_proficiency( const proficiency_id &prof ); + const std::set &proficiencies() const; + // --------------- Other Stuff --------------- /** return the calendar::turn the character expired */ @@ -1708,7 +1670,6 @@ class Character : public Creature, public visitable bool male = false; std::list worn; - std::array hp_cur, hp_max, damage_bandaged, damage_disinfected; bool nv_cached = false; // Means player sit inside vehicle on the tile he is now bool in_vehicle = false; @@ -1834,6 +1795,10 @@ class Character : public Creature, public visitable float get_bmi() const; // returns amount of calories burned in a day given various metabolic factors int get_bmr() const; + // add spent calories to calorie diary (if avatar) + virtual void add_spent_calories( int /* cal */ ) {}; + // add gained calories to calorie diary (if avatar) + virtual void add_gained_calories( int /* gained */ ) {}; // Reset age and height to defaults for consistent test results void reset_chargen_attributes(); // age in years, determined at character creation @@ -1930,11 +1895,6 @@ class Character : public Creature, public visitable void shout( std::string msg = "", bool order = false ); /** Handles Character vomiting effects */ void vomit(); - // adds total healing to the bodypart. this is only a counter. - void healed_bp( int bp, int amount ); - - // the amount healed per bodypart per day - std::array healed_total; std::map mutation_category_level; @@ -2215,6 +2175,8 @@ class Character : public Creature, public visitable float hearing_ability() const; using trap_map = std::map; + // Use @ref trap::can_see to check whether a character knows about a + // specific trap - it will consider visibile and known traps. bool knows_trap( const tripoint &pos ) const; void add_known_trap( const tripoint &pos, const trap &t ); /** Define color for displaying the body temperature */ @@ -2225,14 +2187,10 @@ class Character : public Creature, public visitable // see Creature::sees bool sees( const Creature &critter ) const override; Attitude attitude_to( const Creature &other ) const override; + virtual npc_attitude get_attitude() const; // used in debugging all health int get_lowest_hp() const; - - int get_hp( hp_part bp ) const override; - int get_hp() const override; - int get_hp_max( hp_part bp ) const override; - int get_hp_max() const override; bool has_weapon() const override; void shift_destination( const point &shift ); // Auto move methods @@ -2299,8 +2257,6 @@ class Character : public Creature, public visitable trap_map known_traps; mutable std::map cached_info; - mutable std::array encumbrance_cache; - mutable bool encumbrance_cache_dirty = true; bool bio_soporific_powered_at_last_sleep_check = false; /** last time we checked for sleep */ time_point last_sleep_check = calendar::turn_zero; @@ -2328,6 +2284,8 @@ class Character : public Creature, public visitable // --------------- Values --------------- pimpl _skills; + std::set _proficiencies; + // Cached vision values. std::bitset vision_mode_cache; int sight_max = 0; @@ -2376,6 +2334,7 @@ class Character : public Creature, public visitable void suffer_from_artifacts(); void suffer_from_stimulants( int current_stim ); void suffer_without_sleep( int sleep_deprivation ); + void suffer_from_tourniquet(); /** * Check whether the other creature is in range and can be seen by this creature. * @param critter Creature to check for visibility diff --git a/src/clothing_mod.cpp b/src/clothing_mod.cpp index 44633ab5d5592..98a57dba61f29 100644 --- a/src/clothing_mod.cpp +++ b/src/clothing_mod.cpp @@ -51,7 +51,6 @@ std::string enum_to_string( clothing_mod_type data ) case clothing_mod_type_bullet: return "bullet"; case clothing_mod_type_encumbrance: return "encumbrance"; case clothing_mod_type_warmth: return "warmth"; - case clothing_mod_type_storage: return "storage"; case clothing_mod_type_invalid: return "invalid"; // *INDENT-ON* case num_clothing_mod_types: diff --git a/src/clothing_mod.h b/src/clothing_mod.h index 2ee05a58fe5ce..dc6dab13657fa 100644 --- a/src/clothing_mod.h +++ b/src/clothing_mod.h @@ -22,7 +22,6 @@ enum clothing_mod_type : int { clothing_mod_type_bullet, clothing_mod_type_encumbrance, clothing_mod_type_warmth, - clothing_mod_type_storage, clothing_mod_type_invalid, num_clothing_mod_types }; @@ -69,7 +68,6 @@ constexpr std::array all_clothing_mod_types = {{ clothing_mod_type_bullet, clothing_mod_type_encumbrance, clothing_mod_type_warmth, - clothing_mod_type_storage, clothing_mod_type_invalid } }; diff --git a/src/clzones.cpp b/src/clzones.cpp index 90f102b9b9758..620bfad839580 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -248,15 +248,15 @@ loot_options::query_loot_result loot_options::query_loot() plot_options::query_seed_result plot_options::query_seed() { - player &p = g->u; + Character &player_character = get_player_character(); - std::vector seed_inv = p.items_with( []( const item & itm ) { + std::vector seed_inv = player_character.items_with( []( const item & itm ) { return itm.is_seed(); } ); auto &mgr = zone_manager::get_manager(); map &here = get_map(); const std::unordered_set &zone_src_set = mgr.get_near( zone_type_id( "LOOT_SEEDS" ), - here.getabs( p.pos() ), 60 ); + here.getabs( player_character.pos() ), 60 ); for( const tripoint &elem : zone_src_set ) { tripoint elem_loc = here.getlocal( elem ); for( item &it : here.i_at( elem_loc ) ) { @@ -573,7 +573,8 @@ void zone_manager::cache_data() auto &cache = area_cache[type_hash]; // Draw marked area - for( const tripoint &p : tripoint_range( elem.get_start_point(), elem.get_end_point() ) ) { + for( const tripoint &p : tripoint_range( elem.get_start_point(), + elem.get_end_point() ) ) { cache.insert( p ); } } @@ -594,7 +595,8 @@ void zone_manager::cache_vzones() // TODO: looks very similar to the above cache_data - maybe merge it? // Draw marked area - for( const tripoint &p : tripoint_range( elem->get_start_point(), elem->get_end_point() ) ) { + for( const tripoint &p : tripoint_range( elem->get_start_point(), + elem->get_end_point() ) ) { cache.insert( p ); } } @@ -805,7 +807,7 @@ cata::optional zone_manager::get_nearest( const zone_type_id &type, co zone_type_id zone_manager::get_near_zone_type_for_item( const item &it, const tripoint &where, int range ) const { - const item_category &cat = it.get_category(); + const item_category &cat = it.get_category_of_contents(); if( has_near( zone_type_id( "LOOT_CUSTOM" ), where, range ) ) { if( !get_near( zone_type_id( "LOOT_CUSTOM" ), where, range, &it ).empty() ) { diff --git a/src/computer_session.cpp b/src/computer_session.cpp index 6af7043ee2527..1b47e817320ab 100644 --- a/src/computer_session.cpp +++ b/src/computer_session.cpp @@ -109,6 +109,7 @@ void computer_session::use() refresh(); } ); + avatar &player_character = get_avatar(); // Login print_line( _( "Logging into %s…" ), comp.name ); if( comp.security > 0 ) { @@ -130,7 +131,7 @@ void computer_session::use() return; case ynq::yes: - if( !hack_attempt( g->u ) ) { + if( !hack_attempt( player_character ) ) { if( comp.failures.empty() ) { query_any( _( "Maximum login attempts exceeded. Press any key…" ) ); reset_terminal(); @@ -161,7 +162,12 @@ void computer_session::use() computer_menu.fselected = sel; for( size_t i = 0; i < options_size; i++ ) { - computer_menu.addentry( i, true, MENU_AUTOASSIGN, comp.options[i].name ); + bool activatable = can_activate( comp.options[i].action ); + std::string action_name = comp.options[i].name; + if( !activatable ) { + action_name = string_format( _( "%s (UNAVAILABLE)" ), action_name ); + } + computer_menu.addentry( i, activatable, MENU_AUTOASSIGN, action_name ); } ui_manager::redraw(); @@ -177,7 +183,7 @@ void computer_session::use() if( current.security + comp.alerts > 0 ) { print_error( _( "Password required." ) ); if( query_bool( _( "Hack into system?" ) ) ) { - if( !hack_attempt( g->u, current.security ) ) { + if( !hack_attempt( player_character, current.security ) ) { activate_random_failure(); reset_terminal(); return; @@ -233,7 +239,8 @@ static item *pick_usb() return it.typeId() == itype_usb_drive; }; - item_location loc = game_menus::inv::titled_filter_menu( filter, g->u, _( "Choose drive:" ) ); + item_location loc = game_menus::inv::titled_filter_menu( filter, get_avatar(), + _( "Choose drive:" ) ); if( loc ) { return &*loc; } @@ -242,12 +249,14 @@ static item *pick_usb() static void remove_submap_turrets() { + Character &player_character = get_player_character(); map &here = get_map(); for( monster &critter : g->all_monsters() ) { // Check 1) same overmap coords, 2) turret, 3) hostile - if( ms_to_omt_copy( here.getabs( critter.pos() ) ) == ms_to_omt_copy( here.getabs( g->u.pos() ) ) && + if( ms_to_omt_copy( here.getabs( critter.pos() ) ) == ms_to_omt_copy( here.getabs( + player_character.pos() ) ) && critter.has_flag( MF_CONSOLE_DESPAWN ) && - critter.attitude_to( g->u ) == Creature::Attitude::HOSTILE ) { + critter.attitude_to( player_character ) == Creature::Attitude::HOSTILE ) { g->remove_zombie( critter ); } } @@ -305,12 +314,57 @@ computer_session::computer_action_functions = { { COMPACT_UNLOCK_DISARM, &computer_session::action_unlock_disarm }, }; +bool computer_session::can_activate( computer_action action ) +{ + switch( action ) { + case COMPACT_LOCK: + return get_map().has_nearby_ter( get_player_character().pos(), t_door_metal_c, 8 ); + break; + + case COMPACT_RELEASE: + case COMPACT_RELEASE_DISARM: + return get_map().has_nearby_ter( get_player_character().pos(), t_reinforced_glass, 25 ); + break; + + case COMPACT_RELEASE_BIONICS: + return get_map().has_nearby_ter( get_player_character().pos(), t_reinforced_glass, 3 ); + break; + + case COMPACT_TERMINATE: { + map &here = get_map(); + for( const tripoint &p : here.points_on_zlevel() ) { + monster *const mon = g->critter_at( p ); + if( !mon ) { + continue; + } + if( ( here.ter( p + tripoint_north ) == t_reinforced_glass && + here.ter( p + tripoint_south ) == t_concrete_wall ) || + ( here.ter( p + tripoint_south ) == t_reinforced_glass && + here.ter( p + tripoint_north ) == t_concrete_wall ) ) { + return true; + } + } + return false; + break; + } + + case COMPACT_UNLOCK: + case COMPACT_UNLOCK_DISARM: + return get_map().has_nearby_ter( get_player_character().pos(), t_door_metal_locked, 8 ); + break; + + default: + return true; + break; + } +} + void computer_session::activate_function( computer_action action ) { const auto it = computer_action_functions.find( action ); if( it != computer_action_functions.end() ) { // Token move cost for any action, if an action takes longer decrement moves further. - g->u.moves -= 30; + get_player_character().moves -= 30; ( this->*( it->second ) )(); } } @@ -323,7 +377,8 @@ void computer_session::action_open_disarm() void computer_session::action_open() { - get_map().translate_radius( t_door_metal_locked, t_floor, 25.0, g->u.pos(), true ); + get_map().translate_radius( t_door_metal_locked, t_floor, 25.0, get_player_character().pos(), + true ); query_any( _( "Doors opened. Press any key…" ) ); } @@ -334,7 +389,8 @@ void computer_session::action_open() // player position to determine which terrain tiles to edit. void computer_session::action_lock() { - get_map().translate_radius( t_door_metal_c, t_door_metal_locked, 8.0, g->u.pos(), true ); + get_map().translate_radius( t_door_metal_c, t_door_metal_locked, 8.0, get_player_character().pos(), + true ); query_any( _( "Lock enabled. Press any key…" ) ); } @@ -346,21 +402,22 @@ void computer_session::action_unlock_disarm() void computer_session::action_unlock() { - get_map().translate_radius( t_door_metal_locked, t_door_metal_c, 8.0, g->u.pos(), true ); + get_map().translate_radius( t_door_metal_locked, t_door_metal_c, 8.0, get_player_character().pos(), + true ); query_any( _( "Lock disabled. Press any key…" ) ); } //Toll is required for the church computer/mechanism to function void computer_session::action_toll() { - sounds::sound( g->u.pos(), 120, sounds::sound_t::music, + sounds::sound( get_player_character().pos(), 120, sounds::sound_t::music, //~ the sound of a church bell ringing _( "Bohm… Bohm… Bohm…" ), true, "environment", "church_bells" ); } void computer_session::action_sample() { - g->u.moves -= 30; + get_player_character().moves -= 30; map &here = get_map(); for( const tripoint &p : here.points_on_zlevel() ) { if( here.ter( p ) != t_sewage_pump ) { @@ -394,9 +451,12 @@ void computer_session::action_sample() void computer_session::action_release() { g->events().send(); - sounds::sound( g->u.pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", + Character &player_character = get_player_character(); + sounds::sound( player_character.pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), false, + "environment", "alarm" ); - get_map().translate_radius( t_reinforced_glass, t_thconc_floor, 25.0, g->u.pos(), true ); + get_map().translate_radius( t_reinforced_glass, t_thconc_floor, 25.0, player_character.pos(), + true ); query_any( _( "Containment shields opened. Press any key…" ) ); } @@ -408,15 +468,18 @@ void computer_session::action_release_disarm() void computer_session::action_release_bionics() { - sounds::sound( g->u.pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", + Character &player_character = get_player_character(); + sounds::sound( player_character.pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), false, + "environment", "alarm" ); - get_map().translate_radius( t_reinforced_glass, t_thconc_floor, 3.0, g->u.pos(), true ); + get_map().translate_radius( t_reinforced_glass, t_thconc_floor, 3.0, player_character.pos(), true ); query_any( _( "Containment shields opened. Press any key…" ) ); } void computer_session::action_terminate() { g->events().send(); + Character &player_character = get_player_character(); map &here = get_map(); for( const tripoint &p : here.points_on_zlevel() ) { monster *const mon = g->critter_at( p ); @@ -427,7 +490,7 @@ void computer_session::action_terminate() here.ter( p + tripoint_south ) == t_concrete_wall ) || ( here.ter( p + tripoint_south ) == t_reinforced_glass && here.ter( p + tripoint_north ) == t_concrete_wall ) ) { - mon->die( &g->u ); + mon->die( &player_character ); } } query_any( _( "Subjects terminated. Press any key…" ) ); @@ -460,14 +523,15 @@ void computer_session::action_cascade() return; } g->events().send(); + tripoint player_pos = get_player_character().pos(); map &here = get_map(); std::vector cascade_points; - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_pos, 10 ) ) { if( here.ter( dest ) == t_radio_tower ) { cascade_points.push_back( dest ); } } - explosion_handler::resonance_cascade( random_entry( cascade_points, g->u.pos() ) ); + explosion_handler::resonance_cascade( random_entry( cascade_points, player_pos ) ); } void computer_session::action_research() @@ -479,7 +543,7 @@ void computer_session::action_research() if( !log.has_value() ) { log = to_translation( "No data found." ); } else { - g->u.moves -= 70; + get_player_character().moves -= 70; } print_text( "%s", log.value() ); @@ -497,7 +561,7 @@ void computer_session::action_research() void computer_session::action_radio_archive() { - g->u.moves -= 300; + get_player_character().moves -= 300; sfx::fade_audio_channel( sfx::channel::radio, 100 ); sfx::play_ambient_variant_sound( "radio", "inaudible_chatter", 100, sfx::channel::radio, 2000 ); @@ -514,8 +578,9 @@ void computer_session::action_radio_archive() void computer_session::action_maps() { - g->u.moves -= 30; - const tripoint center = g->u.global_omt_location(); + Character &player_character = get_player_character(); + player_character.moves -= 30; + const tripoint center = player_character.global_omt_location(); overmap_buffer.reveal( center.xy(), 40, 0 ); query_any( _( "Surface map data downloaded. Local anomalous-access error logged. Press any key…" ) ); @@ -525,8 +590,9 @@ void computer_session::action_maps() void computer_session::action_map_sewer() { - g->u.moves -= 30; - const tripoint center = g->u.global_omt_location(); + Character &player_character = get_player_character(); + player_character.moves -= 30; + const tripoint center = player_character.global_omt_location(); for( int i = -60; i <= 60; i++ ) { for( int j = -60; j <= 60; j++ ) { point offset( i, j ); @@ -543,8 +609,9 @@ void computer_session::action_map_sewer() void computer_session::action_map_subway() { - g->u.moves -= 30; - const tripoint center = g->u.global_omt_location(); + Character &player_character = get_player_character(); + player_character.moves -= 30; + const tripoint center = player_character.global_omt_location(); for( int i = -60; i <= 60; i++ ) { for( int j = -60; j <= 60; j++ ) { point offset( i, j ); @@ -576,7 +643,7 @@ void computer_session::action_miss_disarm() void computer_session::action_list_bionics() { - g->u.moves -= 30; + get_player_character().moves -= 30; std::vector names; int more = 0; map &here = get_map(); @@ -622,7 +689,8 @@ void computer_session::action_elevator_on() void computer_session::action_amigara_log() { - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; reset_terminal(); print_line( _( "NEPower Mine(%d:%d) Log" ), g->get_levx(), g->get_levy() ); print_text( "%s", SNIPPET.random_from_category( "amigara1" ).value_or( translation() ) ); @@ -630,7 +698,7 @@ void computer_session::action_amigara_log() if( !query_bool( _( "Continue reading?" ) ) ) { return; } - g->u.moves -= 30; + player_character.moves -= 30; reset_terminal(); print_line( _( "NEPower Mine(%d:%d) Log" ), g->get_levx(), g->get_levy() ); print_text( "%s", SNIPPET.random_from_category( "amigara2" ).value_or( translation() ) ); @@ -638,7 +706,7 @@ void computer_session::action_amigara_log() if( !query_bool( _( "Continue reading?" ) ) ) { return; } - g->u.moves -= 30; + player_character.moves -= 30; reset_terminal(); print_line( _( "NEPower Mine(%d:%d) Log" ), g->get_levx(), g->get_levy() ); print_text( "%s", SNIPPET.random_from_category( "amigara3" ).value_or( translation() ) ); @@ -659,7 +727,7 @@ void computer_session::action_amigara_log() if( !query_bool( _( "Continue reading?" ) ) ) { return; } - g->u.moves -= 30; + player_character.moves -= 30; reset_terminal(); print_line( _( "SITE %d%d%d\n" "PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), @@ -676,8 +744,9 @@ void computer_session::action_amigara_log() void computer_session::action_amigara_start() { g->timed_events.add( timed_event_type::AMIGARA, calendar::turn + 1_minutes ); - if( !g->u.has_artifact_with( AEP_PSYSHIELD ) ) { - g->u.add_effect( effect_amigara, 2_minutes ); + Character &player_character = get_player_character(); + if( !player_character.has_artifact_with( AEP_PSYSHIELD ) ) { + player_character.add_effect( effect_amigara, 2_minutes ); } // Disable this action to prevent further amigara events, which would lead to // further amigara monster, which would lead to further artifacts. @@ -686,7 +755,7 @@ void computer_session::action_amigara_start() void computer_session::action_complete_disable_external_power() { - for( auto miss : g->u.get_active_missions() ) { + for( auto miss : get_avatar().get_active_missions() ) { static const mission_type_id commo_2 = mission_type_id( "MISSION_OLD_GUARD_NEC_COMMO_2" ); if( miss->mission_id() == commo_2 ) { print_error( _( "--ACCESS GRANTED--" ) ); @@ -702,15 +771,16 @@ void computer_session::action_complete_disable_external_power() void computer_session::action_repeater_mod() { - if( g->u.has_amount( itype_radio_repeater_mod, 1 ) ) { - for( auto miss : g->u.get_active_missions() ) { + avatar &player_character = get_avatar(); + if( player_character.has_amount( itype_radio_repeater_mod, 1 ) ) { + for( auto miss : player_character.get_active_missions() ) { static const mission_type_id commo_3 = mission_type_id( "MISSION_OLD_GUARD_NEC_COMMO_3" ), commo_4 = mission_type_id( "MISSION_OLD_GUARD_NEC_COMMO_4" ); if( miss->mission_id() == commo_3 || miss->mission_id() == commo_4 ) { miss->step_complete( 1 ); print_error( _( "Repeater mod installed…" ) ); print_error( _( "Mission Complete!" ) ); - g->u.use_amount( itype_radio_repeater_mod, 1 ); + player_character.use_amount( itype_radio_repeater_mod, 1 ); query_any(); comp.options.clear(); activate_failure( COMPFAIL_SHUTDOWN ); @@ -731,7 +801,7 @@ void computer_session::action_download_software() debugmsg( _( "Computer couldn't find its mission!" ) ); return; } - g->u.moves -= 30; + get_player_character().moves -= 30; item software( miss->get_item_id(), 0 ); software.mission_id = comp.mission_id; usb->contents.clear_items(); @@ -745,9 +815,10 @@ void computer_session::action_download_software() void computer_session::action_blood_anal() { - g->u.moves -= 70; + Character &player_character = get_player_character(); + player_character.moves -= 70; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 2 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 2 ) ) { if( here.ter( dest ) == t_centrifuge ) { map_stack items = here.i_at( dest ); if( items.empty() ) { @@ -791,9 +862,10 @@ void computer_session::action_blood_anal() void computer_session::action_data_anal() { - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 2 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 2 ) ) { if( here.ter( dest ) == t_floor_blue ) { print_error( _( "PROCESSING DATA" ) ); map_stack items = here.i_at( dest ); @@ -811,7 +883,7 @@ void computer_session::action_data_anal() if( items.only_item().typeId() == itype_black_box ) { print_line( _( "Memory Bank: Military Hexron Encryption\nPrinting Transcript\n" ) ); item transcript( "black_box_transcript", calendar::turn ); - here.add_item_or_charges( g->u.pos(), transcript ); + here.add_item_or_charges( player_character.pos(), transcript ); } else { print_line( _( "Memory Bank: Unencrypted\nNothing of interest.\n" ) ); } @@ -949,10 +1021,11 @@ void computer_session::action_srcf_seal() void computer_session::action_srcf_elevator() { - if( !g->u.has_amount( itype_sarcophagus_access_code, 1 ) ) { + Character &player_character = get_player_character(); + if( !player_character.has_amount( itype_sarcophagus_access_code, 1 ) ) { print_error( _( "Access code required!" ) ); } else { - g->u.use_amount( itype_sarcophagus_access_code, 1 ); + player_character.use_amount( itype_sarcophagus_access_code, 1 ); reset_terminal(); print_line( _( "\nPower: Backup Only\nRadiation Level: Very Dangerous\nOperational: Overridden\n\n" ) ); @@ -969,17 +1042,18 @@ void computer_session::action_srcf_elevator() //irradiates food at t_rad_platform, adds radiation void computer_session::action_irradiator() { - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; bool error = false; bool platform_exists = false; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 10 ) ) { if( here.ter( dest ) == t_rad_platform ) { platform_exists = true; if( here.i_at( dest ).empty() ) { print_error( _( "ERROR: Processing platform empty." ) ); } else { - g->u.moves -= 300; + player_character.moves -= 300; for( auto it = here.i_at( dest ).begin(); it != here.i_at( dest ).end(); ++it ) { // actual food processing itype_id irradiated_type( "irradiated_" + it->typeId().str() ); @@ -996,7 +1070,8 @@ void computer_session::action_irradiator() print_error( _( " >> Radiation spike detected!\n" ) ); print_error( _( "WARNING [912]: Catastrophic malfunction! Contamination detected!" ) ); print_error( _( "EMERGENCY PROCEDURE [1]: Evacuate. Evacuate. Evacuate.\n" ) ); - sounds::sound( g->u.pos(), 30, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", + sounds::sound( player_character.pos(), 30, sounds::sound_t::alarm, _( "an alarm sound!" ), false, + "environment", "alarm" ); here.i_rem( dest, it ); here.make_rubble( dest ); @@ -1008,9 +1083,9 @@ void computer_session::action_irradiator() dest ) > 0 ? rl_dist( radorigin, dest ) : 1 ) ); } if( here.pl_sees( dest, 10 ) ) { - g->u.irradiate( rng_float( 50, 250 ) / rl_dist( g->u.pos(), dest ) ); + player_character.irradiate( rng_float( 50, 250 ) / rl_dist( player_character.pos(), dest ) ); } else { - g->u.irradiate( rng_float( 20, 100 ) / rl_dist( g->u.pos(), dest ) ); + player_character.irradiate( rng_float( 20, 100 ) / rl_dist( player_character.pos(), dest ) ); } query_any( _( "EMERGENCY SHUTDOWN! Press any key…" ) ); error = true; @@ -1025,7 +1100,7 @@ void computer_session::action_irradiator() } // if unshielded, rad source irradiates player directly, reduced by distance to source if( here.pl_sees( dest, 10 ) ) { - g->u.irradiate( rng_float( 5, 25 ) / rl_dist( g->u.pos(), dest ) ); + player_character.irradiate( rng_float( 5, 25 ) / rl_dist( player_character.pos(), dest ) ); } } if( !error && platform_exists ) { @@ -1047,7 +1122,8 @@ void computer_session::action_irradiator() // geiger counter for irradiator, primary measurement at t_rad_platform, secondary at player loacation void computer_session::action_geiger() { - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; tripoint platform; bool source_exists = false; int sum_rads = 0; @@ -1055,7 +1131,7 @@ void computer_session::action_geiger() int tiles_counted = 0; map &here = get_map(); print_error( _( "RADIATION MEASUREMENTS:" ) ); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 10 ) ) { if( here.ter( dest ) == t_rad_platform ) { source_exists = true; platform = dest; @@ -1078,8 +1154,9 @@ void computer_session::action_geiger() print_error( _( "GEIGER COUNTER @ ZONE:… MAX %s mSv/h." ), peak_rad ); print_newline(); } - print_error( _( "GEIGER COUNTER @ CONSOLE:… %s mSv/h." ), here.get_radiation( g->u.pos() ) ); - print_error( _( "PERSONAL DOSIMETRY:… %s mSv." ), g->u.get_rad() ); + print_error( _( "GEIGER COUNTER @ CONSOLE:… %s mSv/h." ), + here.get_radiation( player_character.pos() ) ); + print_error( _( "PERSONAL DOSIMETRY:… %s mSv." ), player_character.get_rad() ); print_newline(); query_any( _( "Press any key…" ) ); } @@ -1088,7 +1165,8 @@ void computer_session::action_geiger() // ensure only bay of each type in range void computer_session::action_conveyor() { - g->u.moves -= 300; + Character &player_character = get_player_character(); + player_character.moves -= 300; tripoint loading; // red tile = loading bay tripoint unloading; // green tile = unloading bay tripoint platform; // radiation platform = middle point @@ -1096,7 +1174,7 @@ void computer_session::action_conveyor() bool u_exists = false; bool p_exists = false; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 10 ) ) { if( here.ter( dest ) == t_rad_platform ) { platform = dest; p_exists = true; @@ -1141,9 +1219,10 @@ void computer_session::action_conveyor() // toggles reinforced glass shutters open->closed and closed->open depending on their current state void computer_session::action_shutters() { - g->u.moves -= 300; + Character &player_character = get_player_character(); + player_character.moves -= 300; get_map().translate_radius( t_reinforced_glass_shutter_open, t_reinforced_glass_shutter, 8.0, - g->u.pos(), + player_character.pos(), true, true ); query_any( _( "Toggling shutters. Press any key…" ) ); } @@ -1151,12 +1230,13 @@ void computer_session::action_shutters() // extract radiation source material from irradiator void computer_session::action_extract_rad_source() { + Character &player_character = get_player_character(); if( query_yn( _( "Operation irreversible. Extract radioactive material?" ) ) ) { - g->u.moves -= 300; + player_character.moves -= 300; tripoint platform; bool p_exists = false; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 10 ) ) { if( here.ter( dest ) == t_rad_platform ) { platform = dest; p_exists = true; @@ -1164,7 +1244,7 @@ void computer_session::action_extract_rad_source() } if( p_exists ) { here.spawn_item( platform, itype_cobalt_60, rng( 8, 15 ) ); - here.translate_radius( t_rad_platform, t_concrete, 8.0, g->u.pos(), true ); + here.translate_radius( t_rad_platform, t_concrete, 8.0, player_character.pos(), true ); comp.remove_option( COMPACT_IRRADIATOR ); comp.remove_option( COMPACT_EXTRACT_RAD_SOURCE ); query_any( _( "Extraction sequence complete… Press any key." ) ); @@ -1177,11 +1257,12 @@ void computer_session::action_extract_rad_source() // remove shock vent fields; check for existing plutonium generators in radius void computer_session::action_deactivate_shock_vent() { - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; bool has_vent = false; bool has_generator = false; map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 10 ) ) { + for( const tripoint &dest : here.points_in_radius( player_character.pos(), 10 ) ) { if( here.get_field( dest, fd_shock_vent ) != nullptr ) { has_vent = true; } @@ -1243,9 +1324,9 @@ void computer_session::failure_shutdown() { bool found_tile = false; map &here = get_map(); - for( const tripoint &p : here.points_in_radius( g->u.pos(), 1 ) ) { + for( const tripoint &p : here.points_in_radius( get_player_character().pos(), 1 ) ) { if( here.has_flag( flag_CONSOLE, p ) ) { - here.ter_set( p, t_console_broken ); + here.furn_set( p, furn_str_id( "f_console_broken" ) ); add_msg( m_bad, _( "The console shuts down." ) ); found_tile = true; } @@ -1255,7 +1336,7 @@ void computer_session::failure_shutdown() } for( const tripoint &p : here.points_on_zlevel() ) { if( here.has_flag( flag_CONSOLE, p ) ) { - here.ter_set( p, t_console_broken ); + here.furn_set( p, furn_str_id( "f_console_broken" ) ); add_msg( m_bad, _( "The console shuts down." ) ); } } @@ -1263,19 +1344,22 @@ void computer_session::failure_shutdown() void computer_session::failure_alarm() { - g->events().send( g->u.getID() ); - sounds::sound( g->u.pos(), 60, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", + Character &player_character = get_player_character(); + g->events().send( player_character.getID() ); + sounds::sound( player_character.pos(), 60, sounds::sound_t::alarm, _( "an alarm sound!" ), false, + "environment", "alarm" ); if( g->get_levz() > 0 && !g->timed_events.queued( timed_event_type::WANTED ) ) { g->timed_events.add( timed_event_type::WANTED, calendar::turn + 30_minutes, 0, - g->u.global_sm_location() ); + player_character.global_sm_location() ); } } void computer_session::failure_manhacks() { int num_robots = rng( 4, 8 ); - const tripoint_range range = get_map().points_in_radius( g->u.pos(), 3 ); + const tripoint_range range = + get_map().points_in_radius( get_player_character().pos(), 3 ); for( int i = 0; i < num_robots; i++ ) { if( g->place_critter_within( mon_manhack, range ) ) { add_msg( m_warning, _( "Manhacks drop from compartments in the ceiling." ) ); @@ -1286,7 +1370,8 @@ void computer_session::failure_manhacks() void computer_session::failure_secubots() { int num_robots = 1; - const tripoint_range range = get_map().points_in_radius( g->u.pos(), 3 ); + const tripoint_range range = + get_map().points_in_radius( get_player_character().pos(), 3 ); for( int i = 0; i < num_robots; i++ ) { if( g->place_critter_within( mon_secubot, range ) ) { add_msg( m_warning, _( "Secubots emerge from compartments in the floor." ) ); @@ -1297,11 +1382,12 @@ void computer_session::failure_secubots() void computer_session::failure_damage() { add_msg( m_neutral, _( "The console shocks you." ) ); - if( g->u.is_elec_immune() ) { + Character &player_character = get_player_character(); + if( player_character.is_elec_immune() ) { add_msg( m_good, _( "You're protected from electric shocks." ) ); } else { add_msg( m_bad, _( "Your body is damaged by the electric shock!" ) ); - g->u.hurtall( rng( 1, 10 ), nullptr ); + player_character.hurtall( rng( 1, 10 ), nullptr ); } } @@ -1351,7 +1437,7 @@ void computer_session::failure_pump_leak() void computer_session::failure_amigara() { g->timed_events.add( timed_event_type::AMIGARA, calendar::turn + 30_seconds ); - g->u.add_effect( effect_amigara, 2_minutes ); + get_player_character().add_effect( effect_amigara, 2_minutes ); explosion_handler::explosion( tripoint( rng( 0, MAPSIZE_X ), rng( 0, MAPSIZE_Y ), g->get_levz() ), 10, 0.7, false, 10 ); @@ -1365,7 +1451,7 @@ void computer_session::failure_destroy_blood() { print_error( _( "ERROR: Disruptive Spin" ) ); map &here = get_map(); - for( const tripoint &dest : here.points_in_radius( g->u.pos(), 2 ) ) { + for( const tripoint &dest : here.points_in_radius( get_player_character().pos(), 2 ) ) { if( here.ter( dest ) == t_centrifuge ) { map_stack items = here.i_at( dest ); if( items.empty() ) { @@ -1391,7 +1477,7 @@ void computer_session::failure_destroy_data() { print_error( _( "ERROR: ACCESSING DATA MALFUNCTION" ) ); map &here = get_map(); - for( const tripoint &p : here.points_in_radius( g->u.pos(), 2 ) ) { + for( const tripoint &p : here.points_in_radius( get_player_character().pos(), 2 ) ) { if( here.ter( p ) == t_floor_blue ) { map_stack items = here.i_at( p ); if( items.empty() ) { @@ -1418,9 +1504,10 @@ void computer_session::action_emerg_ref_center() const mission_type_id &mission_type = mission_type_id( "MISSION_REACH_REFUGEE_CENTER" ); tripoint mission_target; + avatar &player_character = get_avatar(); // Check completed missions too, so people can't repeatedly get the mission. - const std::vector completed_missions = g->u.get_completed_missions(); - std::vector missions = g->u.get_active_missions(); + const std::vector completed_missions = player_character.get_completed_missions(); + std::vector missions = player_character.get_active_missions(); missions.insert( missions.end(), completed_missions.begin(), completed_missions.end() ); const bool has_mission = std::any_of( missions.begin(), missions.end(), [ &mission_type, @@ -1435,7 +1522,7 @@ void computer_session::action_emerg_ref_center() if( !has_mission ) { const auto mission = mission::reserve_new( mission_type, character_id() ); - mission->assign( g->u ); + mission->assign( player_character ); mission_target = mission->get_target(); } @@ -1447,8 +1534,8 @@ void computer_session::action_emerg_ref_center() "4PM AT 555-0164.\n" "\n" "IF YOU WOULD LIKE TO SPEAK WITH SOMEONE IN PERSON OR WOULD LIKE\n" - "TO WRITE US A LETTER PLEASE SEND IT TO…\n" ), rl_dist( g->u.pos(), mission_target ), - direction_name_short( direction_from( g->u.pos(), mission_target ) ) ); + "TO WRITE US A LETTER PLEASE SEND IT TO…\n" ), rl_dist( player_character.pos(), mission_target ), + direction_name_short( direction_from( player_character.pos(), mission_target ) ) ); query_any( _( "Press any key to continue…" ) ); reset_terminal(); diff --git a/src/computer_session.h b/src/computer_session.h index f4db88ec18f42..33e068b88e5a6 100644 --- a/src/computer_session.h +++ b/src/computer_session.h @@ -34,6 +34,13 @@ class computer_session * the main system security. */ bool hack_attempt( player &p, int Security = -1 ); + /** + * Checks whether the specified action can be activated (has any effect) + * @return True for actions that either have an effect or require no special conditions, + otherwise false (e.g. false for COMPACT_UNLOCK if no locked doors are in range). + */ + bool can_activate( computer_action action ); + // Called by use() void activate_function( computer_action action ); // ...but we can also choose a specific failure. diff --git a/src/condition.cpp b/src/condition.cpp index 030844864de4b..29f2756bf4eb1 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -50,7 +50,7 @@ static const efftype_id effect_currently_busy( "currently_busy" ); std::string get_talk_varname( const JsonObject &jo, const std::string &member, bool check_value ) { if( !jo.has_string( "type" ) || !jo.has_string( "context" ) || - ( check_value && !jo.has_string( "value" ) ) ) { + ( check_value && !( jo.has_string( "value" ) || jo.has_member( "time" ) ) ) ) { jo.throw_error( "invalid " + member + " condition in " + jo.str() ); } const std::string &var_basename = jo.get_string( member ); @@ -176,7 +176,7 @@ void conditional_t::set_u_has_mission( const JsonObject &jo ) { const std::string &mission = jo.get_string( "u_has_mission" ); condition = [mission]( const T & ) { - for( auto miss_it : g->u.get_active_missions() ) { + for( auto miss_it : get_avatar().get_active_missions() ) { if( miss_it->mission_id() == mission_type_id( mission ) ) { return true; } @@ -405,12 +405,16 @@ template void conditional_t::set_has_var( const JsonObject &jo, const std::string &member, bool is_npc ) { const std::string var_name = get_talk_varname( jo, member, false ); - const std::string &value = jo.get_string( "value" ); - condition = [var_name, value, is_npc]( const T & d ) { + const std::string &value = jo.has_member( "value" ) ? jo.get_string( "value" ) : std::string(); + const bool time_check = jo.has_member( "time" ) && jo.get_bool( "time" ); + condition = [var_name, value, time_check, is_npc]( const T & d ) { player *actor = d.alpha; if( is_npc ) { actor = dynamic_cast( d.beta ); } + if( time_check ) { + return !actor->get_value( var_name ).empty(); + } return actor->get_value( var_name ) == value; }; } @@ -457,6 +461,53 @@ void conditional_t::set_compare_var( const JsonObject &jo, const std::string }; } +template +void conditional_t::set_compare_time_since_var( const JsonObject &jo, const std::string &member, + bool is_npc ) +{ + const std::string var_name = get_talk_varname( jo, member, false ); + const std::string &op = jo.get_string( "op" ); + const int value = to_turns( read_from_json_string( *jo.get_raw( "time" ), + time_duration::units ) ); + condition = [var_name, op, value, is_npc]( const T & d ) { + player *actor = d.alpha; + if( is_npc ) { + actor = dynamic_cast( d.beta ); + } + + int stored_value = 0; + const std::string &var = actor->get_value( var_name ); + if( var.empty() ) { + return false; + } else { + stored_value = std::stoi( var ); + } + stored_value += value; + int now = to_turn( calendar::turn ); + + if( op == "==" ) { + return stored_value == now; + + } else if( op == "!=" ) { + return stored_value != now; + + } else if( op == "<=" ) { + return now <= stored_value; + + } else if( op == ">=" ) { + return now >= stored_value; + + } else if( op == "<" ) { + return now < stored_value; + + } else if( op == ">" ) { + return now > stored_value; + } + + return false; + }; +} + template void conditional_t::set_npc_role_nearby( const JsonObject &jo ) { @@ -715,7 +766,7 @@ template void conditional_t::set_npc_friend() { condition = []( const T & d ) { - return d.beta->is_friendly( g->u ); + return d.beta->is_friendly( get_player_character() ); }; } @@ -828,7 +879,7 @@ template void conditional_t::set_u_has_camp() { condition = []( const T & ) { - return !g->u.camps.empty(); + return !get_player_character().camps.empty(); }; } @@ -1041,6 +1092,10 @@ conditional_t::conditional_t( const JsonObject &jo ) set_compare_var( jo, "u_compare_var" ); } else if( jo.has_string( "npc_compare_var" ) ) { set_compare_var( jo, "npc_compare_var", is_npc ); + } else if( jo.has_string( "u_compare_time_since_var" ) ) { + set_compare_time_since_var( jo, "u_compare_time_since_var" ); + } else if( jo.has_string( "npc_compare_time_since_var" ) ) { + set_compare_time_since_var( jo, "npc_compare_time_since_var", is_npc ); } else if( jo.has_string( "npc_role_nearby" ) ) { set_npc_role_nearby( jo ); } else if( jo.has_int( "npc_allies" ) ) { diff --git a/src/condition.h b/src/condition.h index baa2b77058eef..49d53def09611 100644 --- a/src/condition.h +++ b/src/condition.h @@ -40,7 +40,8 @@ const std::unordered_set complex_conds = { { "npc_aim_rule", "npc_engagement_rule", "npc_rule", "npc_override", "npc_cbm_reserve_rule", "npc_cbm_recharge_rule", "days_since_cataclysm", "is_season", "mission_goal", "u_has_var", "npc_has_var", - "u_has_skill", "npc_has_skill", "u_know_recipe", "u_compare_var", "npc_compare_var" + "u_has_skill", "npc_has_skill", "u_know_recipe", "u_compare_var", "npc_compare_var", + "u_compare_time_since_var", "npc_compare_time_since_var" } }; } // namespace dialogue_data @@ -75,6 +76,8 @@ struct conditional_t { void set_has_trait_flag( const JsonObject &jo, const std::string &member, bool is_npc = false ); void set_has_var( const JsonObject &jo, const std::string &member, bool is_npc = false ); void set_compare_var( const JsonObject &jo, const std::string &member, bool is_npc = false ); + void set_compare_time_since_var( const JsonObject &jo, const std::string &member, + bool is_npc = false ); void set_has_activity( bool is_npc = false ); void set_is_riding( bool is_npc = false ); void set_npc_has_class( const JsonObject &jo ); diff --git a/src/construction.cpp b/src/construction.cpp index 6c2cfe62de99c..754bd2438b414 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -107,6 +107,8 @@ bool check_empty_up_OK( const tripoint & ); // tile is empty and below OVERMAP_H bool check_up_OK( const tripoint & ); // tile is below OVERMAP_HEIGHT bool check_down_OK( const tripoint & ); // tile is above OVERMAP_DEPTH bool check_no_trap( const tripoint & ); +bool check_ramp_low( const tripoint & ); +bool check_ramp_high( const tripoint & ); // Special actions to be run post-terrain-mod static void done_nothing( const tripoint & ) {} @@ -123,6 +125,8 @@ void done_window_curtains( const tripoint & ); void done_extract_maybe_revert_to_dirt( const tripoint & ); void done_mark_firewood( const tripoint & ); void done_mark_practice_target( const tripoint & ); +void done_ramp_low( const tripoint & ); +void done_ramp_high( const tripoint & ); void failure_standard( const tripoint & ); void failure_deconstruct( const tripoint & ); @@ -159,8 +163,9 @@ static bool has_pre_terrain( const construction &con, const tripoint &p ) static bool has_pre_terrain( const construction &con ) { - for( const tripoint &p : get_map().points_in_radius( g->u.pos(), 1 ) ) { - if( p != g->u.pos() && has_pre_terrain( con, p ) ) { + tripoint avatar_pos = get_player_character().pos(); + for( const tripoint &p : get_map().points_in_radius( avatar_pos, 1 ) ) { + if( p != avatar_pos && has_pre_terrain( con, p ) ) { return true; } } @@ -203,9 +208,11 @@ static void load_available_constructions( std::vector &available, debugmsg( "load_available_constructions called before finalization" ); return; } + avatar &player_character = get_avatar(); for( auto &it : constructions ) { if( it.on_display && ( !hide_unconstructable || - ( can_construct( it ) && player_can_build( g->u, g->u.crafting_inventory(), it ) ) ) ) { + ( can_construct( it ) && + player_can_build( player_character, player_character.crafting_inventory(), it ) ) ) ) { bool already_have_it = false; for( auto &avail_it : available ) { if( avail_it == it.description ) { @@ -240,12 +247,13 @@ static void draw_grid( const catacurses::window &w, const int list_width ) static nc_color construction_color( const std::string &con_name, bool highlight ) { nc_color col = c_dark_gray; - if( g->u.has_trait( trait_DEBUG_HS ) ) { + Character &player_character = get_player_character(); + if( player_character.has_trait( trait_DEBUG_HS ) ) { col = c_white; } else if( can_construct( con_name ) ) { construction *con_first = nullptr; std::vector cons = constructions_by_desc( con_name ); - const inventory &total_inv = g->u.crafting_inventory(); + const inventory &total_inv = player_character.crafting_inventory(); for( auto &con : cons ) { if( con->requirements->can_make_with_inventory( total_inv, is_crafting_component ) ) { con_first = con; @@ -255,7 +263,7 @@ static nc_color construction_color( const std::string &con_name, bool highlight if( con_first != nullptr ) { col = c_white; for( const auto &pr : con_first->required_skills ) { - int s_lvl = g->u.get_skill_level( pr.first ); + int s_lvl = player_character.get_skill_level( pr.first ); if( s_lvl < pr.second ) { col = c_red; } else if( s_lvl < pr.second * 1.25 ) { @@ -325,7 +333,8 @@ construction_id construction_menu( const bool blueprint ) std::vector construct_buffer_breakpoints; int total_project_breakpoints = 0; int current_construct_breakpoint = 0; - const inventory &total_inv = g->u.crafting_inventory(); + avatar &player_character = get_avatar(); + const inventory &total_inv = player_character.crafting_inventory(); input_context ctxt( "CONSTRUCTION" ); ctxt.register_action( "UP", to_translation( "Move cursor up" ) ); @@ -443,9 +452,9 @@ construction_id construction_menu( const bool blueprint ) } else { std::string current_line = _( "Required skills: " ) + enumerate_as_string( current_con->required_skills.begin(), current_con->required_skills.end(), - []( const std::pair &skill ) { + [&player_character]( const std::pair &skill ) { nc_color col; - int s_lvl = g->u.get_skill_level( skill.first ); + int s_lvl = player_character.get_skill_level( skill.first ); if( s_lvl < skill.second ) { col = c_red; } else if( s_lvl < skill.second * 1.25 ) { @@ -767,8 +776,8 @@ construction_id construction_menu( const bool blueprint ) continue; } if( !blueprint ) { - if( player_can_build( g->u, total_inv, constructs[select] ) ) { - if( !player_can_see_to_build( g->u, constructs[select] ) ) { + if( player_can_build( player_character, total_inv, constructs[select] ) ) { + if( !player_can_see_to_build( player_character, constructs[select] ) ) { add_msg( m_info, _( "It is too dark to construct right now." ) ); } else { ui.reset(); @@ -877,8 +886,9 @@ bool can_construct( const construction &con, const tripoint &p ) bool can_construct( const construction &con ) { - for( const tripoint &p : get_map().points_in_radius( g->u.pos(), 1 ) ) { - if( p != g->u.pos() && can_construct( con, p ) ) { + tripoint avatar_pos = get_player_character().pos(); + for( const tripoint &p : get_map().points_in_radius( avatar_pos, 1 ) ) { + if( p != avatar_pos && can_construct( con, p ) ) { return true; } } @@ -887,14 +897,16 @@ bool can_construct( const construction &con ) void place_construction( const std::string &desc ) { - const inventory &total_inv = g->u.crafting_inventory(); + avatar &player_character = get_avatar(); + const inventory &total_inv = player_character.crafting_inventory(); std::vector cons = constructions_by_desc( desc ); std::map valid; map &here = get_map(); - for( const tripoint &p : here.points_in_radius( g->u.pos(), 1 ) ) { + for( const tripoint &p : here.points_in_radius( player_character.pos(), 1 ) ) { for( const auto *con : cons ) { - if( p != g->u.pos() && can_construct( *con, p ) && player_can_build( g->u, total_inv, *con ) ) { + if( p != player_character.pos() && can_construct( *con, p ) && + player_can_build( player_character, total_inv, *con ) ) { valid[ p ] = con; } } @@ -903,8 +915,8 @@ void place_construction( const std::string &desc ) shared_ptr_fast draw_valid = make_shared_fast( [&]() { map &here = get_map(); for( auto &elem : valid ) { - here.drawsq( g->w_terrain, g->u, elem.first, true, false, - g->u.pos() + g->u.view_offset ); + here.drawsq( g->w_terrain, player_character, elem.first, true, false, + player_character.pos() + player_character.view_offset ); } } ); g->add_draw_callback( draw_valid ); @@ -937,21 +949,21 @@ void place_construction( const std::string &desc ) // Special handling for constructions that take place on existing traps. // Basically just don't add the unfinished construction trap. // TODO: handle this cleaner, instead of adding a special case to pit iexamine. - if( here.tr_at( pnt ).loadid == tr_null ) { + if( here.tr_at( pnt ).is_null() ) { here.trap_set( pnt, tr_unfinished_construction ); } // Use up the components for( const auto &it : con.requirements->get_components() ) { - std::list tmp = g->u.consume_items( it, 1, is_crafting_component ); + std::list tmp = player_character.consume_items( it, 1, is_crafting_component ); used.splice( used.end(), tmp ); } pc.components = used; here.partial_con_set( pnt, pc ); for( const auto &it : con.requirements->get_tools() ) { - g->u.consume_tools( it ); + player_character.consume_tools( it ); } - g->u.assign_activity( ACT_BUILD ); - g->u.activity.placement = here.getabs( pnt ); + player_character.assign_activity( ACT_BUILD ); + player_character.activity.placement = here.getabs( pnt ); } void complete_construction( player *p ) @@ -965,7 +977,7 @@ void complete_construction( player *p ) partial_con *pc = here.partial_con_at( terp ); if( !pc ) { debugmsg( "No partial construction found at activity placement in complete_construction()" ); - if( here.tr_at( terp ).loadid == tr_unfinished_construction ) { + if( here.tr_at( terp ) == tr_unfinished_construction ) { here.remove_trap( terp ); } if( p->is_npc() ) { @@ -988,7 +1000,7 @@ void complete_construction( player *p ) // Friendly NPCs gain exp from assisting or watching... // TODO: NPCs watching other NPCs do stuff and learning from it if( p->is_player() ) { - for( auto &elem : g->u.get_crafting_helpers() ) { + for( auto &elem : get_avatar().get_crafting_helpers() ) { if( elem->meets_skill_requirements( built ) ) { add_msg( m_info, _( "%s assists you with the work…" ), elem->name ); } else { @@ -999,7 +1011,7 @@ void complete_construction( player *p ) award_xp( *elem ); } } - if( here.tr_at( terp ).loadid == tr_unfinished_construction ) { + if( here.tr_at( terp ) == tr_unfinished_construction ) { here.remove_trap( terp ); } here.partial_con_remove( terp ); @@ -1055,6 +1067,8 @@ void complete_construction( player *p ) bool construct::check_empty( const tripoint &p ) { map &here = get_map(); + // @TODO should check for *visible* traps only. But calling code must + // first know how to handle constructing on top of an invisible trap! return ( here.has_flag( flag_FLAT, p ) && !here.has_furn( p ) && g->is_empty( p ) && here.tr_at( p ).is_null() && here.i_at( p ).empty() && !here.veh_at( p ) ); @@ -1118,24 +1132,44 @@ bool construct::check_no_trap( const tripoint &p ) return get_map().tr_at( p ).is_null(); } +bool construct::check_ramp_high( const tripoint &p ) +{ + if( check_up_OK( p ) && check_up_OK( p + tripoint_above ) ) { + for( const point &car_d : four_cardinal_directions ) { + // check adjacent points on the z-level above for a completed down ramp + if( get_map().has_flag( TFLAG_RAMP_DOWN, p + car_d + tripoint_above ) ) { + return true; + } + } + } + return false; +} + +bool construct::check_ramp_low( const tripoint &p ) +{ + return check_up_OK( p ) && check_up_OK( p + tripoint_above ); +} + void construct::done_trunk_plank( const tripoint &/*p*/ ) { int num_logs = rng( 2, 3 ); + Character &player_character = get_player_character(); for( int i = 0; i < num_logs; ++i ) { - iuse::cut_log_into_planks( g->u ); + iuse::cut_log_into_planks( player_character ); } } void construct::done_grave( const tripoint &p ) { + Character &player_character = get_player_character(); map &here = get_map(); map_stack its = here.i_at( p ); for( item it : its ) { if( it.is_corpse() ) { if( it.get_corpse_name().empty() ) { if( it.get_mtype()->has_flag( MF_HUMAN ) ) { - if( g->u.has_trait( trait_SPIRITUAL ) ) { - g->u.add_morale( MORALE_FUNERAL, 50, 75, 1_days, 1_hours ); + if( player_character.has_trait( trait_SPIRITUAL ) ) { + player_character.add_morale( MORALE_FUNERAL, 50, 75, 1_days, 1_hours ); add_msg( m_good, _( "You feel relieved after providing last rites for this human being, whose name is lost in the Cataclysm." ) ); } else { @@ -1143,8 +1177,8 @@ void construct::done_grave( const tripoint &p ) } } } else { - if( g->u.has_trait( trait_SPIRITUAL ) ) { - g->u.add_morale( MORALE_FUNERAL, 50, 75, 1_days, 1_hours ); + if( player_character.has_trait( trait_SPIRITUAL ) ) { + player_character.add_morale( MORALE_FUNERAL, 50, 75, 1_days, 1_hours ); add_msg( m_good, _( "You feel sadness, but also relief after providing last rites for %s, whose name you will keep in your memory." ), it.get_corpse_name() ); @@ -1155,11 +1189,12 @@ void construct::done_grave( const tripoint &p ) } } g->events().send( - g->u.getID(), it.get_mtype()->id, it.get_corpse_name() ); + player_character.getID(), it.get_mtype()->id, it.get_corpse_name() ); } } - if( g->u.has_quality( qual_CUT ) ) { - iuse::handle_ground_graffiti( g->u, nullptr, _( "Inscribe something on the grave?" ), p ); + if( player_character.has_quality( qual_CUT ) ) { + iuse::handle_ground_graffiti( player_character, nullptr, _( "Inscribe something on the grave?" ), + p ); } else { add_msg( m_neutral, _( "Unfortunately you don't have anything sharp to place an inscription on the grave." ) ); @@ -1208,7 +1243,7 @@ void construct::done_vehicle( const tripoint &p ) return; } veh->name = name; - veh->install_part( point_zero, vpart_from_item( g->u.lastconsumed ) ); + veh->install_part( point_zero, vpart_from_item( get_avatar().lastconsumed ) ); // Update the vehicle cache immediately, // or the vehicle will be invisible for the first couple of turns. @@ -1225,6 +1260,21 @@ void construct::done_deconstruct( const tripoint &p ) add_msg( m_info, _( "That %s can not be disassembled!" ), f.name() ); return; } + if( f.id.id() == furn_str_id( "f_console_broken" ) ) { + if( g->u.get_skill_level( skill_electronics ) >= 1 ) { + g->u.practice( skill_electronics, 20, 4 ); + } + } + if( f.id.id() == furn_str_id( "f_console" ) ) { + if( g->u.get_skill_level( skill_electronics ) >= 1 ) { + g->u.practice( skill_electronics, 40, 8 ); + } + } + if( f.id.id() == furn_str_id( "f_machinery_electronic" ) ) { + if( g->u.get_skill_level( skill_electronics ) >= 1 ) { + g->u.practice( skill_electronics, 40, 8 ); + } + } if( f.deconstruct.furn_set.str().empty() ) { here.furn_set( p, f_null ); } else { @@ -1252,14 +1302,15 @@ void construct::done_deconstruct( const tripoint &p ) } done_deconstruct( top ); } + avatar &player_character = get_avatar(); if( t.id.id() == t_console_broken ) { - if( g->u.get_skill_level( skill_electronics ) >= 1 ) { - g->u.practice( skill_electronics, 20, 4 ); + if( player_character.get_skill_level( skill_electronics ) >= 1 ) { + player_character.practice( skill_electronics, 20, 4 ); } } if( t.id.id() == t_console ) { - if( g->u.get_skill_level( skill_electronics ) >= 1 ) { - g->u.practice( skill_electronics, 40, 8 ); + if( player_character.get_skill_level( skill_electronics ) >= 1 ) { + player_character.practice( skill_electronics, 40, 8 ); } } here.ter_set( p, t.deconstruct.ter_set ); @@ -1273,9 +1324,10 @@ static void unroll_digging( const int numer_of_2x4s ) // refund components! item rope( "rope_30" ); map &here = get_map(); - here.add_item_or_charges( g->u.pos(), rope ); + tripoint avatar_pos = get_player_character().pos(); + here.add_item_or_charges( avatar_pos, rope ); // presuming 2x4 to conserve lumber. - here.spawn_item( g->u.pos(), itype_2x4, numer_of_2x4s ); + here.spawn_item( avatar_pos, itype_2x4, numer_of_2x4s ); } void construct::done_digormine_stair( const tripoint &p, bool dig ) @@ -1287,13 +1339,15 @@ void construct::done_digormine_stair( const tripoint &p, bool dig ) tmpmap.load( tripoint( pos_sm.xy(), pos_sm.z - 1 ), false ); const tripoint local_tmp = tmpmap.getlocal( abs_pos ); - bool dig_muts = g->u.has_trait( trait_PAINRESIST_TROGLO ) || g->u.has_trait( trait_STOCKY_TROGLO ); + Character &player_character = get_player_character(); + bool dig_muts = player_character.has_trait( trait_PAINRESIST_TROGLO ) || + player_character.has_trait( trait_STOCKY_TROGLO ); int no_mut_penalty = dig_muts ? 10 : 0; int mine_penalty = dig ? 0 : 10; - g->u.mod_stored_nutr( 5 + mine_penalty + no_mut_penalty ); - g->u.mod_thirst( 5 + mine_penalty + no_mut_penalty ); - g->u.mod_fatigue( 10 + mine_penalty + no_mut_penalty ); + player_character.mod_stored_nutr( 5 + mine_penalty + no_mut_penalty ); + player_character.mod_thirst( 5 + mine_penalty + no_mut_penalty ); + player_character.mod_fatigue( 10 + mine_penalty + no_mut_penalty ); if( tmpmap.ter( local_tmp ) == t_lava ) { if( !( query_yn( _( "The rock feels much warmer than normal. Proceed?" ) ) ) ) { @@ -1357,12 +1411,14 @@ void construct::done_mine_upstair( const tripoint &p ) return; } - bool dig_muts = g->u.has_trait( trait_PAINRESIST_TROGLO ) || g->u.has_trait( trait_STOCKY_TROGLO ); + Character &player_character = get_player_character(); + bool dig_muts = player_character.has_trait( trait_PAINRESIST_TROGLO ) || + player_character.has_trait( trait_STOCKY_TROGLO ); int no_mut_penalty = dig_muts ? 15 : 0; - g->u.mod_stored_nutr( 20 + no_mut_penalty ); - g->u.mod_thirst( 20 + no_mut_penalty ); - g->u.mod_fatigue( 25 + no_mut_penalty ); + player_character.mod_stored_nutr( 20 + no_mut_penalty ); + player_character.mod_thirst( 20 + no_mut_penalty ); + player_character.mod_fatigue( 25 + no_mut_penalty ); add_msg( _( "You drill out a passage, heading for the surface." ) ); here.ter_set( p.xy(), t_stairs_up ); // There's the bottom half @@ -1380,13 +1436,13 @@ void construct::done_wood_stairs( const tripoint &p ) void construct::done_window_curtains( const tripoint & ) { map &here = get_map(); + tripoint avatar_pos = get_player_character().pos(); // copied from iexamine::curtains - here.spawn_item( g->u.pos(), itype_nail, 1, 4 ); - here.spawn_item( g->u.pos(), itype_sheet, 2 ); - here.spawn_item( g->u.pos(), itype_stick ); - here.spawn_item( g->u.pos(), itype_string_36 ); - g->u.add_msg_if_player( - _( "After boarding up the window the curtains and curtain rod are left." ) ); + here.spawn_item( avatar_pos, itype_nail, 1, 4 ); + here.spawn_item( avatar_pos, itype_sheet, 2 ); + here.spawn_item( avatar_pos, itype_stick ); + here.spawn_item( avatar_pos, itype_string_36 ); + add_msg( _( "After boarding up the window the curtains and curtain rod are left." ) ); } void construct::done_extract_maybe_revert_to_dirt( const tripoint &p ) @@ -1416,6 +1472,18 @@ void construct::done_mark_practice_target( const tripoint &p ) get_map().trap_set( p, tr_practice_target ); } +void construct::done_ramp_low( const tripoint &p ) +{ + const tripoint top = p + tripoint_above; + get_map().ter_set( top, ter_id( "t_ramp_down_low" ) ); +} + +void construct::done_ramp_high( const tripoint &p ) +{ + const tripoint top = p + tripoint_above; + get_map().ter_set( top, ter_id( "t_ramp_down_high" ) ); +} + void construct::failure_standard( const tripoint & ) { add_msg( m_info, _( "You cannot build there!" ) ); @@ -1519,7 +1587,9 @@ void load_construction( const JsonObject &jo ) { "check_empty_up_OK", construct::check_empty_up_OK }, { "check_up_OK", construct::check_up_OK }, { "check_down_OK", construct::check_down_OK }, - { "check_no_trap", construct::check_no_trap } + { "check_no_trap", construct::check_no_trap }, + { "check_ramp_low", construct::check_ramp_low }, + { "check_ramp_high", construct::check_ramp_high } } }; static const std::map> post_special_map = {{ @@ -1535,7 +1605,9 @@ void load_construction( const JsonObject &jo ) { "done_window_curtains", construct::done_window_curtains }, { "done_extract_maybe_revert_to_dirt", construct::done_extract_maybe_revert_to_dirt }, { "done_mark_firewood", construct::done_mark_firewood }, - { "done_mark_practice_target", construct::done_mark_practice_target } + { "done_mark_practice_target", construct::done_mark_practice_target }, + { "done_ramp_low", construct::done_ramp_low }, + { "done_ramp_high", construct::done_ramp_high } } }; std::map> explain_fail_map; @@ -1637,7 +1709,7 @@ int construction::adjusted_time() const int final_time = time; int assistants = 0; - for( auto &elem : g->u.get_crafting_helpers() ) { + for( auto &elem : get_avatar().get_crafting_helpers() ) { if( elem->meets_skill_requirements( *this ) ) { assistants++; } diff --git a/src/consumption.cpp b/src/consumption.cpp index 48e5ef53c148c..d2d950e370eee 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -538,11 +538,15 @@ time_duration Character::vitamin_rate( const vitamin_id &vit ) const int Character::vitamin_mod( const vitamin_id &vit, int qty, bool capped ) { - auto it = vitamin_levels.find( vit ); - if( it == vitamin_levels.end() ) { + if( !vit.is_valid() ) { + debugmsg( "Vitamin with id %s does not exist, and cannot be modified", vit.str() ); return 0; } - const auto &v = it->first.obj(); + // What's going on here? Emplace returns either an iterator to the inserted + // item or, if it already exists, an iterator to the (unchanged) extant item + // (Okay, technically it returns a pair, the iterator is what we want) + auto it = vitamin_levels.emplace( vit, 0 ).first; + const vitamin &v = *it->first; if( qty > 0 ) { // Accumulations can never occur from food sources @@ -1337,11 +1341,13 @@ bool Character::consume_effects( item &food ) units::volume water_vol = ( food.type->comestible->quench > 0 ) ? food.type->comestible->quench * 5_ml : 0_ml; units::volume food_vol = food.base_volume() - water_vol; - units::mass food_weight = ( food.weight() / food.count() ) - units::from_gram( units::to_milliliter( - water_vol ) ); //water is 1 gram per milliliter + units::mass food_weight = ( food.weight() / food.count() ); double ratio = 1.0f; if( units::to_gram( food_weight ) != 0 ) { ratio = std::max( static_cast( food_nutrients.kcal ) / units::to_gram( food_weight ), 1.0 ); + if( ratio > 3.0f ) { + ratio = std::sqrt( 3 * ratio ); + } } food_summary ingested{ @@ -1349,6 +1355,10 @@ bool Character::consume_effects( item &food ) food_vol * ratio, food_nutrients }; + add_msg( m_debug, + "Effective volume: %d (solid) %d (liquid)\n multiplier: %g calories: %d, weight: %d", + units::to_milliliter( ingested.solids ), units::to_milliliter( ingested.water ), ratio, + food_nutrients.kcal, units::to_gram( food_weight ) ); // Maybe move tapeworm to digestion if( has_effect( effect_tapeworm ) ) { ingested.nutr /= 2; @@ -1430,7 +1440,7 @@ bool Character::feed_furnace_with( item &it ) return false; } if( it.is_favorite && - !g->u.query_yn( _( "Are you sure you want to eat your favorited %s?" ), it.tname() ) ) { + !get_avatar().query_yn( _( "Are you sure you want to eat your favorited %s?" ), it.tname() ) ) { return false; } diff --git a/src/coordinates.h b/src/coordinates.h index 3aaff85dc9e5d..b4abca602e448 100644 --- a/src/coordinates.h +++ b/src/coordinates.h @@ -8,6 +8,482 @@ #include "enums.h" #include "game_constants.h" #include "point.h" +#include "debug.h" + +namespace coords +{ + +enum class scale { + map_square, + submap, + overmap_terrain, + segment, + overmap, + vehicle +}; + +constexpr scale ms = scale::map_square; +constexpr scale sm = scale::submap; +constexpr scale omt = scale::overmap_terrain; +constexpr scale seg = scale::segment; +constexpr scale om = scale::overmap; + +constexpr int map_squares_per( scale s ) +{ + static_assert( SEEX == SEEY, "we assume submaps are square" ); + static_assert( OMAPX == OMAPY, "we assume overmaps are square" ); + + switch( s ) { + case scale::map_square: + return 1; + case scale::submap: + return SEEX; + case scale::overmap_terrain: + return SEEX * 2; + case scale::segment: + return SEG_SIZE * map_squares_per( scale::overmap_terrain ); + case scale::overmap: + return OMAPX * map_squares_per( scale::overmap_terrain ); + default: + constexpr_fatal( 0, "Requested scale of %d", s ); + } +} + +enum class origin { + relative, // this is a special origin that can be added to any other + abs, // the global absolute origin for the entire game + submap, // from corner of submap + overmap_terrain, // from corner of overmap_terrain + overmap, // from corner of overmap +}; + +constexpr origin origin_from_scale( scale s ) +{ + switch( s ) { + case scale::submap: + return origin::submap; + case scale::overmap_terrain: + return origin::overmap_terrain; + case scale::overmap: + return origin::overmap; + default: + constexpr_fatal( origin::abs, "Requested origin for scale %d", s ); + } +} + +// A generic coordinate-type-safe point. +// Point should be the underlying representation type (either point or +// tripoint). +// Scale and Origin define the coordinate system for the point. +template +class coord_point +{ + public: + static constexpr int dimension = Point::dimension; + + constexpr coord_point() = default; + explicit constexpr coord_point( const Point &p ) : + raw_( p ) + {} + template + constexpr coord_point( T x, T y ) : raw_( x, y ) {} + template + constexpr coord_point( T x, T y, T z ) : raw_( x, y, z ) {} + template + constexpr coord_point( const coord_point &xy, T z ) : + raw_( xy.raw(), z ) + {} + + constexpr Point &raw() { + return raw_; + } + constexpr const Point &raw() const { + return raw_; + } + + constexpr auto &x() { + return raw_.x; + } + constexpr auto x() const { + return raw_.x; + } + constexpr auto &y() { + return raw_.y; + } + constexpr auto y() const { + return raw_.y; + } + constexpr auto xy() const { + return coord_point( raw_.xy() ); + } + constexpr auto &z() { + return raw_.z; + } + constexpr auto z() const { + return raw_.z; + } + + std::string to_string() const { + return raw_.to_string(); + } + + void serialize( JsonOut &jsout ) const { + raw().serialize( jsout ); + } + void deserialize( JsonIn &jsin ) { + raw().deserialize( jsin ); + } + + coord_point &operator+=( const coord_point &r ) { + raw_ += r.raw(); + return *this; + } + + coord_point &operator-=( const coord_point &r ) { + raw_ -= r.raw(); + return *this; + } + + coord_point &operator+=( const point &r ) { + raw_ += r; + return *this; + } + + coord_point &operator-=( const point &r ) { + raw_ -= r; + return *this; + } + + coord_point &operator+=( const tripoint &r ) { + raw_ += r; + return *this; + } + + coord_point &operator-=( const tripoint &r ) { + raw_ -= r; + return *this; + } + + friend inline coord_point operator+( const coord_point &l, const point &r ) { + return coord_point( l.raw() + r ); + } + + friend inline coord_point operator+( const coord_point &l, const tripoint &r ) { + return coord_point( l.raw() + r ); + } + + friend inline coord_point operator-( const coord_point &l, const point &r ) { + return coord_point( l.raw() - r ); + } + + friend inline coord_point operator-( const coord_point &l, const tripoint &r ) { + return coord_point( l.raw() - r ); + } + private: + Point raw_; +}; + +template +constexpr inline bool operator==( const coord_point &l, + const coord_point &r ) +{ + return l.raw() == r.raw(); +} + +template +constexpr inline bool operator!=( const coord_point &l, + const coord_point &r ) +{ + return l.raw() != r.raw(); +} + +template +constexpr inline bool operator<( const coord_point &l, + const coord_point &r ) +{ + return l.raw() < r.raw(); +} + +template +constexpr inline auto operator+( + const coord_point &l, + const coord_point &r ) +{ + using PointResult = decltype( PointL() + PointR() ); + return coord_point( l.raw() + r.raw() ); +} + +template < typename PointL, typename PointR, origin OriginR, scale Scale, + // enable_if to prevent ambiguity with above when both args are + // relative + typename = std::enable_if_t < OriginR != origin::relative >> +constexpr inline auto operator+( + const coord_point &l, + const coord_point &r ) +{ + using PointResult = decltype( PointL() + PointR() ); + return coord_point( l.raw() + r.raw() ); +} + +template +constexpr inline auto operator-( + const coord_point &l, + const coord_point &r ) +{ + using PointResult = decltype( PointL() + PointR() ); + return coord_point( l.raw() - r.raw() ); +} + +template < typename PointL, typename PointR, origin Origin, scale Scale, + // enable_if to prevent ambiguity with above when both args are + // relative + typename = std::enable_if_t < Origin != origin::relative >> +constexpr inline auto operator-( + const coord_point &l, + const coord_point &r ) +{ + using PointResult = decltype( PointL() + PointR() ); + return coord_point( l.raw() - r.raw() ); +} + +// Only relative points can be multiplied by a constant +template +constexpr inline coord_point operator*( + int l, const coord_point &r ) +{ + return coord_point( l * r.raw() ); +} + +template +constexpr inline coord_point operator*( + const coord_point &r, int l ) +{ + return coord_point( r.raw() * l ); +} + +template +inline std::ostream &operator<<( std::ostream &os, const coord_point &p ) +{ + return os << p.raw(); +} + +template +struct project_to_impl; + +template +struct project_to_impl { + template + coord_point operator()( + const coord_point &src ) { + return coord_point( multiply_xy( src.raw(), ScaleUp ) ); + } +}; + +template +struct project_to_impl<0, ScaleDown, ResultScale> { + template + coord_point operator()( + const coord_point &src ) { + return coord_point( + divide_xy_round_to_minus_infinity( src.raw(), ScaleDown ) ); + } +}; + +template +inline coord_point project_to( + const coord_point &src ) +{ + constexpr int scale_down = map_squares_per( ResultScale ) / map_squares_per( SourceScale ); + constexpr int scale_up = map_squares_per( SourceScale ) / map_squares_per( ResultScale ); + return project_to_impl()( src ); +} + +template +struct quotient_remainder_helper { + constexpr static origin RemainderOrigin = origin_from_scale( CoarseScale ); + using quotient_type = coord_point; + using quotient_type_tripoint = coord_point; + using remainder_type = coord_point; + using remainder_type_tripoint = coord_point; +}; + +template +struct quotient_remainder_point { + using helper = quotient_remainder_helper; + using quotient_type = typename helper::quotient_type; + using remainder_type = typename helper::remainder_type; + + quotient_type quotient; + remainder_type remainder; + + // For assigning to std::tie( q, r ); + operator std::tuple() { + return std::tie( quotient, remainder ); + } +}; + +template +struct quotient_remainder_tripoint { + using helper = quotient_remainder_helper; + using quotient_type = typename helper::quotient_type; + using quotient_type_tripoint = typename helper::quotient_type_tripoint; + using remainder_type = typename helper::remainder_type; + using remainder_type_tripoint = typename helper::remainder_type_tripoint; + + // Annoyingly, for the conversion operators below to work correctly, we + // need to have point and tripoint version of both quotient and remainder + // ready here, so that we can take references to any of them. + // Luckily the entire lifetime of this struct should be pretty short, so + // the compiler can do its magic to remove the overhead of initializing the + // ones that don't actually get used. + quotient_type quotient; + remainder_type remainder; + quotient_type_tripoint quotient_tripoint; + remainder_type_tripoint remainder_tripoint; + + // For assigning to std::tie( q, r ); + // Exactly one of the two resulting types should be a tripoint, so that the + // z-coordinate doesn't get duplicated. + operator std::tuple() { + return std::tie( quotient_tripoint, remainder ); + } + operator std::tuple() { + return std::tie( quotient, remainder_tripoint ); + } +}; + +// project_remain returns a helper struct, intended to be used with std::tie +// to pull out the two components of the result. +// For exmaple, when splitting a point: +// point_abs_sm val; +// point_abs_om quotient; +// point_om_sm remainder; +// std::tie( quotient, remainder ) = project_remain( val ); +// If passing a tripoint to project_remain, you must choose exactly one of the +// quotient or remainder to get the z coordinate. Both of these should work: +// tripoint_abs_sm val; +// tripoint_abs_om quotient; +// point_om_sm remainder; +// std::tie( quotient, remainder ) = project_remain( val ); +// +// point_abs_om quotient; +// tripoint_om_sm remainder; +// std::tie( quotient, remainder ) = project_remain( val ); +template +inline quotient_remainder_point project_remain( + const coord_point &src ) +{ + constexpr int ScaleDown = map_squares_per( ResultScale ) / map_squares_per( SourceScale ); + static_assert( ScaleDown > 0, "You can only project to coarser coordinate systems" ); + constexpr static origin RemainderOrigin = origin_from_scale( ResultScale ); + coord_point quotient( + divide_xy_round_to_minus_infinity( src.raw(), ScaleDown ) ); + coord_point remainder( + src.raw() - quotient.raw() * ScaleDown ); + + return { quotient, remainder }; +} + +template +inline quotient_remainder_tripoint project_remain( + const coord_point &src ) +{ + quotient_remainder_point point_result = + project_remain( src.xy() ); + return { point_result.quotient, point_result.remainder, + { point_result.quotient, src.z() }, { point_result.remainder, src.z() } }; +} + +template +inline auto project_combine( + const coord_point &coarse, + const coord_point &fine ) +{ + static_assert( origin_from_scale( CoarseScale ) == FineOrigin, + "given point types are not compatible for combination" ); + static_assert( PointL::dimension != 3 || PointR::dimension != 3, + "two tripoints should not be combined; it's unclear how to handle z" ); + using PointResult = decltype( PointL() + PointR() ); + const coord_point refined_coarse = + project_to( coarse ); + return coord_point( refined_coarse.raw() + fine.raw() ); +} + +} // namespace coords + +namespace std +{ + +template +struct hash> { + std::size_t operator()( const coords::coord_point &p ) const { + const hash h{}; + return h( p.raw() ); + } +}; + +} // namespace std + +/** Typedefs for point types with coordinate mnemonics. + * + * Each name is of the form (tri)point__ where tells you the + * context in which the point has meaning, and tells you what one unit + * of the point means. + * + * For example: + * point_omt_ms is the position of a map square within an overmap terrain. + * tripoint_rel_sm is a relative tripoint submap offset. + */ +/*@{*/ +using point_rel_ms = coords::coord_point; +using point_abs_ms = coords::coord_point; +using point_sm_ms = coords::coord_point; +using point_omt_ms = coords::coord_point; +using point_abs_sm = coords::coord_point; +using point_omt_sm = coords::coord_point; +using point_om_sm = coords::coord_point; +using point_abs_omt = coords::coord_point; +using point_om_omt = coords::coord_point; +using point_abs_seg = coords::coord_point; +using point_abs_om = coords::coord_point; + +using tripoint_rel_ms = coords::coord_point; +using tripoint_abs_ms = coords::coord_point; +using tripoint_sm_ms = coords::coord_point; +using tripoint_omt_ms = coords::coord_point; +using tripoint_abs_sm = coords::coord_point; +using tripoint_om_sm = coords::coord_point; +using tripoint_abs_omt = coords::coord_point; +using tripoint_abs_seg = coords::coord_point; +using tripoint_abs_om = coords::coord_point; +/*@}*/ + +using coords::project_to; +using coords::project_remain; +using coords::project_combine; + +template +std::vector> + closest_points_first( const coords::coord_point &loc, + int min_dist, int max_dist ) +{ + std::vector raw_result = closest_points_first( loc.raw(), min_dist, max_dist ); + std::vector> result; + result.reserve( raw_result.size() ); + std::transform( raw_result.begin(), raw_result.end(), std::back_inserter( result ), + []( const Point & p ) { + return coords::coord_point( p ); + } ); + return result; +} +template +std::vector> + closest_points_first( const coords::coord_point &loc, + int max_dist ) +{ + return closest_points_first( loc, 0, max_dist ); +} /* find appropriate subdivided coordinates for absolute tile coordinate. * This is less obvious than one might think, for negative coordinates, so this diff --git a/src/craft_command.cpp b/src/craft_command.cpp index dccb358556af3..5ab051b448607 100644 --- a/src/craft_command.cpp +++ b/src/craft_command.cpp @@ -127,6 +127,9 @@ void craft_command::execute( const tripoint &new_loc ) "Start crafting anyway?" ), rec->result_name() ) ) { return; } + } else if( !rec->character_has_required_proficiencies( *crafter ) ) { + popup( _( "You don't have the required proficiencies to craft this!" ) ); + return; } else { debugmsg( "Tried to start craft without sufficient charges" ); return; diff --git a/src/crafting.cpp b/src/crafting.cpp index a47f4c21cd3b4..0ec2697d80965 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -377,14 +377,14 @@ int player::available_assistant_count( const recipe &rec ) const int player::base_time_to_craft( const recipe &rec, int batch_size ) const { const size_t assistants = available_assistant_count( rec ); - return rec.batch_time( batch_size, 1.0f, assistants ); + return rec.batch_time( *this, batch_size, 1.0f, assistants ); } int player::expected_time_to_craft( const recipe &rec, int batch_size, bool in_progress ) const { const size_t assistants = available_assistant_count( rec ); float modifier = crafting_speed_multiplier( rec, in_progress ); - return rec.batch_time( batch_size, modifier, assistants ); + return rec.batch_time( *this, batch_size, modifier, assistants ); } bool player::check_eligible_containers_for_crafting( const recipe &rec, int batch_size ) const @@ -472,7 +472,7 @@ std::vector player::get_eligible_containers_for_crafting() const map &here = get_map(); // get all potential containers within PICKUP_RANGE tiles including vehicles - for( const tripoint &loc : closest_tripoints_first( pos(), PICKUP_RANGE ) ) { + for( const tripoint &loc : closest_points_first( pos(), PICKUP_RANGE ) ) { // can not reach this -> can not access its contents if( pos() != loc && !here.clear_path( pos(), loc, PICKUP_RANGE, 1, 100 ) ) { continue; @@ -506,6 +506,10 @@ bool player::can_make( const recipe *r, int batch_size ) return false; } + if( !r->character_has_required_proficiencies( *this ) ) { + return false; + } + return r->deduped_requirements().can_make_with_inventory( crafting_inv, r->get_component_filter(), batch_size ); } @@ -516,6 +520,10 @@ bool player::can_start_craft( const recipe *rec, recipe_filter_flags flags, int return false; } + if( !rec->character_has_required_proficiencies( *this ) ) { + return false; + } + const inventory &inv = crafting_inventory(); return rec->deduped_requirements().can_make_with_inventory( inv, rec->get_component_filter( flags ), batch_size, craft_flags::start_only ); @@ -663,7 +671,7 @@ static item *set_item_inventory( player &p, item &newit ) static item_location set_item_map( const tripoint &loc, item &newit ) { // Includes loc - for( const tripoint &tile : closest_tripoints_first( loc, 2 ) ) { + for( const tripoint &tile : closest_points_first( loc, 2 ) ) { // Pass false to disallow overflow, null_item_reference indicates failure. item *it_on_map = &get_map().add_item_or_charges( tile, newit, false ); if( it_on_map != &null_item_reference() ) { @@ -733,7 +741,7 @@ void player::start_craft( craft_command &command, const tripoint &loc ) // In case we were wearing something just consumed if( !craft.components.empty() ) { - reset_encumbrance(); + calc_encumbrance(); } item_location craft_in_world; @@ -786,8 +794,9 @@ void player::start_craft( craft_command &command, const tripoint &loc ) uilist amenu; amenu.text = string_format( pgettext( "in progress craft", "What to do with the %s?" ), craft.display_name() ); - amenu.addentry( WIELD_CRAFT, !weapon.has_flag( flag_NO_UNWIELD ), '1', - _( "Dispose of your wielded %s and start working." ), weapon.tname() ); + + amenu.addentry( WIELD_CRAFT, can_unwield( weapon ).success(), + '1', _( "Dispose of your wielded %s and start working." ), weapon.tname() ); amenu.addentry( DROP_CRAFT, true, '2', _( "Put it down and start working." ) ); const bool can_stash = can_pickVolume( craft ) && can_pickWeight( craft, !get_option( "DANGEROUS_PICKUPS" ) ); @@ -801,7 +810,7 @@ void player::start_craft( craft_command &command, const tripoint &loc ) if( cata::optional it_loc = wield_craft( *this, craft ) ) { craft_in_world = *it_loc; } else { - // This almost certianly shouldn't happen + // This almost certainly shouldn't happen put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, {craft} ); } break; @@ -957,7 +966,14 @@ double player::crafting_success_roll( const recipe &making ) const return 2; } - return skill_roll / diff_roll; + float prof_multiplier = 1.0f; + for( const recipe_proficiency &recip : making.proficiencies ) { + if( !recip.required && !has_proficiency( recip.id ) ) { + prof_multiplier *= recip.fail_multiplier; + } + } + + return ( skill_roll / diff_roll ) * prof_multiplier; } int item::get_next_failure_point() const @@ -1130,7 +1146,7 @@ void player::complete_craft( item &craft, const tripoint &loc ) std::max( get_skill_level( making.skill_used ), 1 ) * std::max( get_int(), 1 ); const double time_to_learn = 1000 * 8 * std::pow( difficulty, 4 ) / learning_speed; - if( x_in_y( making.time, time_to_learn ) ) { + if( x_in_y( making.time_to_craft_moves( *this ), time_to_learn ) ) { learn_recipe( &making ); add_msg( m_good, _( "You memorized the recipe for %s!" ), making.result_name() ); @@ -1263,6 +1279,10 @@ bool player::can_continue_craft( item &craft ) const requirement_data continue_reqs = craft.get_continue_reqs(); + if( !rec.character_has_required_proficiencies( *this ) ) { + return false; + } + // Avoid building an inventory from the map if we don't have to, as it is expensive if( !continue_reqs.is_empty() ) { @@ -1993,8 +2013,9 @@ bool player::disassemble( item_location target, bool interactive ) return false; } + avatar &player_character = get_avatar(); const auto &r = recipe_dictionary::get_uncraft( obj.typeId() ); - if( !obj.is_owned_by( g->u, true ) ) { + if( !obj.is_owned_by( player_character, true ) ) { if( !query_yn( _( "Disassembling the %s may anger the people who own it, continue?" ), obj.tname() ) ) { return false; @@ -2002,15 +2023,15 @@ bool player::disassemble( item_location target, bool interactive ) if( obj.get_owner() ) { std::vector witnesses; for( npc &elem : g->all_npcs() ) { - if( rl_dist( elem.pos(), g->u.pos() ) < MAX_VIEW_DISTANCE && elem.get_faction() && - obj.is_owned_by( elem ) && elem.sees( g->u.pos() ) ) { + if( rl_dist( elem.pos(), player_character.pos() ) < MAX_VIEW_DISTANCE && elem.get_faction() && + obj.is_owned_by( elem ) && elem.sees( player_character.pos() ) ) { elem.say( "", 7 ); npc *npc_to_add = &elem; witnesses.push_back( npc_to_add ); } } if( !witnesses.empty() ) { - if( g->u.add_faction_warning( obj.get_owner() ) ) { + if( player_character.add_faction_warning( obj.get_owner() ) ) { for( npc *elem : witnesses ) { elem->make_angry(); } @@ -2055,12 +2076,12 @@ bool player::disassemble( item_location target, bool interactive ) if( activity.id() != ACT_DISASSEMBLE ) { if( num_dis != 0 ) { - assign_activity( ACT_DISASSEMBLE, r.time * num_dis ); + assign_activity( ACT_DISASSEMBLE, r.time_to_craft_moves( *this ) * num_dis ); } else { - assign_activity( ACT_DISASSEMBLE, r.time ); + assign_activity( ACT_DISASSEMBLE, r.time_to_craft_moves( *this ) ); } } else if( activity.moves_left <= 0 ) { - activity.moves_left = r.time; + activity.moves_left = r.time_to_craft_moves( *this ); } // index is used as a bool that indicates if we want recursive uncraft. @@ -2144,7 +2165,7 @@ void player::complete_disassemble() return; } - activity.moves_left = next_recipe.time; + activity.moves_left = next_recipe.time_to_craft_moves( *this ); } void player::complete_disassemble( item_location &target, const recipe &dis ) @@ -2276,7 +2297,7 @@ void player::complete_disassemble( item_location &target, const recipe &dis ) item act_item = newit; if( act_item.has_temperature() ) { - act_item.set_item_temperature( temp_to_kelvin( g->weather.get_temperature( loc ) ) ); + act_item.set_item_temperature( temp_to_kelvin( get_weather().get_temperature( loc ) ) ); } // Refitted clothing disassembles into refitted components (when applicable) diff --git a/src/crafting_gui.cpp b/src/crafting_gui.cpp index 5eb59cb3ad566..56a4d109054b8 100644 --- a/src/crafting_gui.cpp +++ b/src/crafting_gui.cpp @@ -241,8 +241,9 @@ const recipe *select_crafting_recipe( int &batch_size ) auto all_items_filter = r->get_component_filter( recipe_filter_flags::none ); auto no_rotten_filter = r->get_component_filter( recipe_filter_flags::no_rotten ); const deduped_requirement_data &req = r->deduped_requirements(); + has_proficiencies = r->character_has_required_proficiencies( get_player_character() ); can_craft = req.can_make_with_inventory( - inv, all_items_filter, batch_size, craft_flags::start_only ); + inv, all_items_filter, batch_size, craft_flags::start_only ) && has_proficiencies; can_craft_non_rotten = req.can_make_with_inventory( inv, no_rotten_filter, batch_size, craft_flags::start_only ); const requirement_data &simple_req = r->simple_requirements(); @@ -252,6 +253,7 @@ const recipe *select_crafting_recipe( int &batch_size ) bool can_craft; bool can_craft_non_rotten; bool apparently_craftable; + bool has_proficiencies; nc_color selected_color() const { return can_craft ? can_craft_non_rotten ? h_white : h_brown : h_dark_gray; @@ -496,6 +498,9 @@ const recipe *select_crafting_recipe( int &batch_size ) _( "Other skills: %s" ), current[line]->required_skills_string( &g->u, false, false ) ); + ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, _( "Proficiencies Required: %s" ), + current[line]->required_proficiencies_string( get_player_character() ) ); + const int expected_turns = g->u.expected_time_to_craft( *current[line], count ) / to_moves( 1_turns ); ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, @@ -512,23 +517,29 @@ const recipe *select_crafting_recipe( int &batch_size ) current[line]->has_flag( flag_BLIND_EASY ) ? _( "Easy" ) : current[line]->has_flag( flag_BLIND_HARD ) ? _( "Hard" ) : _( "Impossible" ) ) ); - if( available[line].can_craft && !available[line].can_craft_non_rotten ) { + const bool can_craft_this = available[line].can_craft; + if( can_craft_this && !available[line].can_craft_non_rotten ) { ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, _( "Will use rotten ingredients" ) ); } const bool too_complex = current[line]->deduped_requirements().is_too_complex(); - if( available[line].can_craft && too_complex ) { + if( can_craft_this && too_complex ) { ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, _( "Due to the complex overlapping requirements, this " "recipe may appear to be craftable " "when it is not." ) ); } - if( !available[line].can_craft && available[line].apparently_craftable ) { + if( !can_craft_this && available[line].apparently_craftable && available[line].has_proficiencies ) { ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, _( "Cannot be crafted because the same item is needed " "for multiple components" ) ); } + if( !can_craft_this && !available[line].has_proficiencies ) { + ypos += fold_and_print( w_data, point( xpos, ypos ), pane, col, + _( "Cannot be crafted because you lack" + " the required proficiencies." ) ); + } ypos += print_items( *current[line], w_data, point( xpos, ypos ), col, batch ? line + 1 : 1 ); } diff --git a/src/creature.cpp b/src/creature.cpp index 430af8795292a..ec758074aab4d 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -48,6 +48,7 @@ static const anatomy_id anatomy_human_anatomy( "human_anatomy" ); +static const efftype_id effect_bleed( "bleed" ); static const efftype_id effect_blind( "blind" ); static const efftype_id effect_bounced( "bounced" ); static const efftype_id effect_downed( "downed" ); @@ -315,7 +316,7 @@ bool Creature::sees( const tripoint &t, bool is_avatar, int range_mod ) const static bool overlaps_vehicle( const std::set &veh_area, const tripoint &pos, const int area ) { - for( const tripoint &tmp : tripoint_range( pos - tripoint( area, area, 0 ), + for( const tripoint &tmp : tripoint_range( pos - tripoint( area, area, 0 ), pos + tripoint( area - 1, area - 1, 0 ) ) ) { if( veh_area.count( tmp ) > 0 ) { return true; @@ -656,13 +657,15 @@ void Creature::deal_projectile_attack( Creature *source, dealt_projectile_attack game_message_type gmtSCTcolor = m_neutral; if( magic ) { damage_mult *= rng_float( 0.9, 1.1 ); - } else if( goodhit < accuracy_headshot && max_damage * crit_multiplier > get_hp_max( hp_head ) ) { + } else if( goodhit < accuracy_headshot && + max_damage * crit_multiplier > get_hp_max( bodypart_id( "head" ) ) ) { message = _( "Headshot!" ); gmtSCTcolor = m_headshot; damage_mult *= rng_float( 0.95, 1.05 ); damage_mult *= crit_multiplier; bp_hit = bodypart_id( "head" ); // headshot hits the head, of course - } else if( goodhit < accuracy_critical && max_damage * crit_multiplier > get_hp_max( hp_torso ) ) { + } else if( goodhit < accuracy_critical && + max_damage * crit_multiplier > get_hp_max( bodypart_id( "torso" ) ) ) { message = _( "Critical!" ); gmtSCTcolor = m_critical; damage_mult *= rng_float( 0.75, 1.0 ); @@ -696,8 +699,7 @@ void Creature::deal_projectile_attack( Creature *source, dealt_projectile_attack impact.mult_damage( damage_mult ); if( proj_effects.count( "NOGIB" ) > 0 ) { - float dmg_ratio = static_cast( impact.total_damage() ) / get_hp_max( player::bp_to_hp( - bp_hit->token ) ); + float dmg_ratio = static_cast( impact.total_damage() ) / get_hp_max( bp_hit ); if( dmg_ratio > 1.25f ) { impact.mult_damage( 1.0f / dmg_ratio ); } @@ -901,6 +903,16 @@ void Creature::deal_damage_handle_type( const damage_unit &du, bodypart_id bp, i div = 3.0f; break; + case DT_CUT: + case DT_STAB: + case DT_BULLET: + // these are bleed inducing damage types + if( is_avatar() || is_npc() ) { + as_character()->make_bleed( bp, 1_minutes * rng( 1, adjusted_damage ) ); + } else { + add_effect( effect_bleed, 1_minutes * rng( 1, adjusted_damage ), bp->token ); + } + default: break; } @@ -1144,7 +1156,7 @@ bool Creature::has_effect_with_flag( const std::string &flag, body_part bp ) con { for( auto &elem : *effects ) { for( const std::pair &_it : elem.second ) { - if( bp == _it.first && _it.second.has_flag( flag ) ) { + if( ( bp == _it.first || bp == num_bp ) && _it.second.has_flag( flag ) ) { return true; } } @@ -1152,6 +1164,19 @@ bool Creature::has_effect_with_flag( const std::string &flag, body_part bp ) con return false; } +std::vector Creature::get_effects_with_flag( const std::string &flag ) const +{ + std::vector effs; + for( auto &elem : *effects ) { + for( const std::pair &_it : elem.second ) { + if( _it.second.has_flag( flag ) ) { + effs.push_back( _it.second ); + } + } + } + return effs; +} + effect &Creature::get_effect( const efftype_id &eff_id, body_part bp ) { return const_cast( const_cast( this )->get_effect( eff_id, bp ) ); @@ -1434,6 +1459,162 @@ void Creature::set_anatomy( const anatomy_id &anat ) creature_anatomy = anat; } +std::map Creature::get_body() const +{ + return body; +} + +void Creature::set_body() +{ + for( const bodypart_id &bp : get_anatomy()->get_bodyparts() ) { + body.emplace( bp.id(), bodypart( bp.id() ) ); + } +} + +void Creature::calc_all_parts_hp( float hp_mod, float hp_adjustment, int str_max, int dex_max, + int per_max, int int_max, int healthy_mod, int fat_to_max_hp ) +{ + for( std::pair &part : body ) { + int new_max = ( part.first->base_hp + str_max * part.first->hp_mods.str_mod + dex_max * + part.first->hp_mods.dex_mod + int_max * part.first->hp_mods.int_mod + per_max * + part.first->hp_mods.per_mod + part.first->hp_mods.health_mod * healthy_mod + fat_to_max_hp + + hp_adjustment ) * hp_mod; + + if( has_trait( trait_id( "GLASSJAW" ) ) && part.first == bodypart_str_id( "head" ) ) { + new_max *= 0.8; + } + + float max_hp_ratio = static_cast( new_max ) / + static_cast( part.second.get_hp_max() ); + + int new_cur = std::ceil( static_cast( part.second.get_hp_cur() ) * max_hp_ratio ); + + part.second.set_hp_max( std::max( new_max, 1 ) ); + part.second.set_hp_cur( std::max( std::min( new_cur, new_max ), 1 ) ); + } +} + + +bodypart *Creature::get_part( const bodypart_id &id ) +{ + auto found = body.find( id.id() ); + if( found == body.end() ) { + debugmsg( "Could not find bodypart %s in %s's body", id.id().c_str(), get_name() ); + return nullptr; + } + return &found->second; +} + +bodypart Creature::get_part( const bodypart_id &id ) const +{ + auto found = body.find( id.id() ); + if( found == body.end() ) { + debugmsg( "Could not find bodypart %s in %s's body", id.id().c_str(), get_name() ); + return bodypart(); + } + return found->second; +} + +int Creature::get_part_hp_cur( const bodypart_id &id ) const +{ + return get_part( id ).get_hp_cur(); +} + +int Creature::get_part_hp_max( const bodypart_id &id ) const +{ + return get_part( id ).get_hp_max(); +} + +int Creature::get_part_healed_total( const bodypart_id &id ) const +{ + return get_part( id ).get_healed_total(); +} + +int Creature::get_part_damage_disinfected( const bodypart_id &id ) const +{ + return get_part( id ).get_damage_disinfected(); +} + +int Creature::get_part_damage_bandaged( const bodypart_id &id ) const +{ + return get_part( id ).get_damage_bandaged(); +} + +encumbrance_data Creature::get_part_encumbrance_data( const bodypart_id &id ) const +{ + return get_part( id ).get_encumbrance_data(); +} + +void Creature::set_part_hp_cur( const bodypart_id &id, int set ) +{ + get_part( id )->set_hp_cur( set ); +} + +void Creature::set_part_hp_max( const bodypart_id &id, int set ) +{ + get_part( id )->set_hp_max( set ); +} + +void Creature::set_part_healed_total( const bodypart_id &id, int set ) +{ + get_part( id )->set_healed_total( set ); +} + +void Creature::set_part_damage_disinfected( const bodypart_id &id, int set ) +{ + get_part( id )->set_damage_disinfected( set ); +} + +void Creature::set_part_damage_bandaged( const bodypart_id &id, int set ) +{ + get_part( id )->set_damage_bandaged( set ); +} + +void Creature::set_part_encumbrance_data( const bodypart_id &id, encumbrance_data set ) +{ + get_part( id )->set_encumbrance_data( set ); +} + +void Creature::mod_part_hp_cur( const bodypart_id &id, int mod ) +{ + get_part( id )->mod_hp_cur( mod ); +} + +void Creature::mod_part_hp_max( const bodypart_id &id, int mod ) +{ + get_part( id )->mod_hp_max( mod ); +} + +void Creature::mod_part_healed_total( const bodypart_id &id, int mod ) +{ + get_part( id )->mod_healed_total( mod ); +} + +void Creature::mod_part_damage_disinfected( const bodypart_id &id, int mod ) +{ + get_part( id )->mod_damage_disinfected( mod ); +} + +void Creature::mod_part_damage_bandaged( const bodypart_id &id, int mod ) +{ + get_part( id )->mod_damage_bandaged( mod ); +} + +void Creature::set_all_parts_hp_cur( const int set ) +{ + for( std::pair &elem : body ) { + elem.second.set_hp_cur( set ); + } +} + +void Creature::set_all_parts_hp_to_max() +{ + for( std::pair &elem : body ) { + elem.second.set_hp_to_max(); + } +} + + bodypart_id Creature::get_random_body_part( bool main ) const { // TODO: Refuse broken limbs, adjust for mutations @@ -1443,17 +1624,49 @@ bodypart_id Creature::get_random_body_part( bool main ) const std::vector Creature::get_all_body_parts( bool only_main ) const { - // TODO: Remove broken parts, parts removed by mutations etc. + std::vector all_bps; + for( const std::pair &elem : body ) { + if( only_main && elem.first->main_part != elem.first ) { + continue; + } + all_bps.push_back( elem.first ); + } - const std::vector all_bps = get_anatomy()->get_bodyparts(); - std::vector main_bps; + return all_bps; +} - for( const bodypart_id bp : all_bps ) { - if( bp->main_part.id() == bp ) { - main_bps.emplace_back( bp ); - } +int Creature::get_hp( const bodypart_id &bp ) const +{ + if( bp != bodypart_id( "num_bp" ) ) { + return get_part_hp_cur( bp ); + } + int hp_total = 0; + for( const std::pair &elem : get_body() ) { + hp_total += elem.second.get_hp_cur(); + } + return hp_total; +} + +int Creature::get_hp() const +{ + return get_hp( bodypart_id( "num_bp" ) ); +} + +int Creature::get_hp_max( const bodypart_id &bp ) const +{ + if( bp != bodypart_id( "num_bp" ) ) { + return get_part_hp_max( bp ); } - return only_main ? main_bps : all_bps; + int hp_total = 0; + for( const std::pair &elem : get_body() ) { + hp_total += elem.second.get_hp_max(); + } + return hp_total; +} + +int Creature::get_hp_max() const +{ + return get_hp_max( bodypart_id( "num_bp" ) ); } int Creature::get_speed_base() const @@ -1711,7 +1924,7 @@ void Creature::process_damage_over_time() const int dmg_amount = DoT->amount; if( dmg_amount < 0 ) { heal_bp( bp.id(), -dmg_amount ); - } else { + } else if( dmg_amount > 0 ) { deal_damage( nullptr, bp.id(), damage_instance( DoT->type, dmg_amount ) ); } } diff --git a/src/creature.h b/src/creature.h index ce419182ace38..cd622e94ea74e 100644 --- a/src/creature.h +++ b/src/creature.h @@ -43,7 +43,6 @@ struct point; enum damage_type : int; enum m_flag : int; -enum hp_part : int; struct damage_instance; struct damage_unit; struct dealt_damage_instance; @@ -242,6 +241,12 @@ class Creature virtual const avatar *as_avatar() const { return nullptr; } + virtual monster *as_monster() { + return nullptr; + } + virtual const monster *as_monster() const { + return nullptr; + } /** return the direction the creature is facing, for sdl horizontal flip **/ FacingDirection facing = FacingDirection::RIGHT; /** Returns true for non-real Creatures used temporarily; i.e. fake NPC's used for turret fire. */ @@ -488,6 +493,7 @@ class Creature bool has_effect( const efftype_id &eff_id, body_part bp = num_bp ) const; /** Check if creature has any effect with the given flag. */ bool has_effect_with_flag( const std::string &flag, body_part bp = num_bp ) const; + std::vector get_effects_with_flag( const std::string &flag ) const; /** Return the effect that matches the given arguments exactly. */ const effect &get_effect( const efftype_id &eff_id, body_part bp = num_bp ) const; effect &get_effect( const efftype_id &eff_id, body_part bp = num_bp ); @@ -561,10 +567,10 @@ class Creature virtual int get_speed() const; virtual creature_size get_size() const = 0; - virtual int get_hp( hp_part bp ) const = 0; - virtual int get_hp() const = 0; - virtual int get_hp_max( hp_part bp ) const = 0; - virtual int get_hp_max() const = 0; + virtual int get_hp( const bodypart_id &bp ) const; + virtual int get_hp() const; + virtual int get_hp_max( const bodypart_id &bp ) const; + virtual int get_hp_max() const; virtual int hp_percentage() const = 0; virtual bool made_of( const material_id &m ) const = 0; virtual bool made_of_any( const std::set &ms ) const = 0; @@ -583,17 +589,57 @@ class Creature return false; } + private: + /**anatomy is the plan of the creature's body*/ anatomy_id creature_anatomy = anatomy_id( "default_anatomy" ); + /**this is the actual body of the creature*/ + std::map body; + public: anatomy_id get_anatomy() const; void set_anatomy( const anatomy_id &anat ); bodypart_id get_random_body_part( bool main = false ) const; /** - * Returns body parts in order in which they should be displayed. + * Returns body parts this creature have. * @param only_main If true, only displays parts that can have hit points */ std::vector get_all_body_parts( bool only_main = false ) const; + std::map get_body() const; + void set_body(); + void calc_all_parts_hp( float hp_mod = 0.0, float hp_adjust = 0.0, int str_max = 0, + int dex_max = 0, int per_max = 0, int int_max = 0, int healthy_mod = 0, + int fat_to_max_hp = 0 ); + bodypart *get_part( const bodypart_id &id ); + bodypart get_part( const bodypart_id &id ) const; + + int get_part_hp_cur( const bodypart_id &id ) const; + int get_part_hp_max( const bodypart_id &id ) const; + + int get_part_healed_total( const bodypart_id &id ) const; + int get_part_damage_disinfected( const bodypart_id &id ) const; + int get_part_damage_bandaged( const bodypart_id &id ) const; + + encumbrance_data get_part_encumbrance_data( const bodypart_id &id )const; + + void set_part_hp_cur( const bodypart_id &id, int set ); + void set_part_hp_max( const bodypart_id &id, int set ); + void set_part_healed_total( const bodypart_id &id, int set ); + void set_part_damage_disinfected( const bodypart_id &id, int set ); + void set_part_damage_bandaged( const bodypart_id &id, int set ); + + void set_part_encumbrance_data( const bodypart_id &id, encumbrance_data set ); + + void mod_part_hp_cur( const bodypart_id &id, int mod ); + void mod_part_hp_max( const bodypart_id &id, int mod ); + void mod_part_healed_total( const bodypart_id &id, int mod ); + void mod_part_damage_disinfected( const bodypart_id &id, int mod ); + void mod_part_damage_bandaged( const bodypart_id &id, int mod ); + + + void set_all_parts_hp_cur( int set ); + void set_all_parts_hp_to_max(); + virtual int get_speed_base() const; virtual int get_speed_bonus() const; virtual int get_block_bonus() const; diff --git a/src/debug.h b/src/debug.h index 4f8ab2ffc385a..f6d4834ed7199 100644 --- a/src/debug.h +++ b/src/debug.h @@ -80,6 +80,21 @@ inline void realDebugmsg( const char *const filename, const char *const line, std::forward( args )... ) ); } +// A fatal error for use in constexpr functions +// This exists for compatibility reasons. On gcc 5.3 we need a +// different implementation that is messier. +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67371 +// Pass a placeholder return value to be used on gcc 5.3 (it won't +// actually be returned, it's just needed for the type), and then +// args as if to debugmsg for the remaining args. +#if defined(__GNUC__) && __GNUC__ < 6 +#define constexpr_fatal(ret, ...) \ + do { return false ? ( ret ) : ( abort(), ( ret ) ); } while(false) +#else +#define constexpr_fatal(ret, ...) \ + do { debugmsg(__VA_ARGS__); abort(); } while(false) +#endif + /** * Used to generate game report information. */ diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index 0cb117f2c76fb..cd609212a2ca6 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -89,6 +89,7 @@ #include "ui.h" #include "ui_manager.h" #include "units.h" +#include "vehicle.h" #include "veh_type.h" #include "vitamin.h" #include "vpart_position.h" @@ -102,8 +103,6 @@ static const mtype_id mon_generator( "mon_generator" ); static const trait_id trait_ASTHMA( "ASTHMA" ); -class vehicle; - extern std::map> > nested_mapgen; @@ -145,6 +144,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::DISPLAY_HORDES: return "DISPLAY_HORDES"; case debug_menu::debug_menu_index::TEST_IT_GROUP: return "TEST_IT_GROUP"; case debug_menu::debug_menu_index::DAMAGE_SELF: return "DAMAGE_SELF"; + case debug_menu::debug_menu_index::BLEED_SELF: return "BLEED_SELF"; case debug_menu::debug_menu_index::SHOW_SOUND: return "SHOW_SOUND"; case debug_menu::debug_menu_index::DISPLAY_WEATHER: return "DISPLAY_WEATHER"; case debug_menu::debug_menu_index::DISPLAY_SCENTS: return "DISPLAY_SCENTS"; @@ -177,6 +177,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::LEVEL_SPELLS: return "LEVEL_SPELLS"; case debug_menu::debug_menu_index::TEST_MAP_EXTRA_DISTRIBUTION: return "TEST_MAP_EXTRA_DISTRIBUTION"; case debug_menu::debug_menu_index::NESTED_MAPGEN: return "NESTED_MAPGEN"; + case debug_menu::debug_menu_index::VEHICLE_BATTERY_CHARGE: return "VEHICLE_BATTERY_CHARGE"; // *INDENT-ON* case debug_menu::debug_menu_index::last: break; @@ -212,6 +213,7 @@ static int player_uilist() { uilist_entry( debug_menu_index::UNLOCK_RECIPES, true, 'r', _( "Unlock all recipes" ) ) }, { uilist_entry( debug_menu_index::EDIT_PLAYER, true, 'p', _( "Edit player/NPC" ) ) }, { uilist_entry( debug_menu_index::DAMAGE_SELF, true, 'd', _( "Damage self" ) ) }, + { uilist_entry( debug_menu_index::BLEED_SELF, true, 'b', _( "Bleed self" ) ) }, { uilist_entry( debug_menu_index::SET_AUTOMOVE, true, 'a', _( "Set automove route" ) ) }, }; if( !spell_type::get_all().empty() ) { @@ -275,6 +277,15 @@ static int game_uilist() return uilist( _( "Game…" ), uilist_initializer ); } +static int vehicle_uilist() +{ + std::vector uilist_initializer = { + { uilist_entry( debug_menu_index::VEHICLE_BATTERY_CHARGE, true, 'b', _( "Change [b]attery charge" ) ) }, + }; + + return uilist( _( "Vehicle…" ), uilist_initializer ); +} + static int teleport_uilist() { const std::vector uilist_initializer = { @@ -336,6 +347,7 @@ static cata::optional debug_menu_uilist( bool display_all_entr { uilist_entry( 6, true, 'g', _( "Game…" ) ) }, { uilist_entry( 2, true, 's', _( "Spawning…" ) ) }, { uilist_entry( 3, true, 'p', _( "Player…" ) ) }, + { uilist_entry( 7, true, 'v', _( "Vehicle…" ) ) }, { uilist_entry( 4, true, 't', _( "Teleport…" ) ) }, { uilist_entry( 5, true, 'm', _( "Map…" ) ) }, }; @@ -375,6 +387,9 @@ static cata::optional debug_menu_uilist( bool display_all_entr case 6: action = game_uilist(); break; + case 7: + action = vehicle_uilist(); + break; default: return cata::nullopt; @@ -623,36 +638,49 @@ void character_edit_menu() } break; case D_HP: { + const int torso_hp = p.get_part_hp_cur( bodypart_id( "torso" ) ); + const int head_hp = p.get_part_hp_cur( bodypart_id( "head" ) ); + const int arm_l_hp = p.get_part_hp_cur( bodypart_id( "arm_l" ) ); + const int arm_r_hp = p.get_part_hp_cur( bodypart_id( "arm_r" ) ); + const int leg_l_hp = p.get_part_hp_cur( bodypart_id( "leg_l" ) ); + const int leg_r_hp = p.get_part_hp_cur( bodypart_id( "leg_r" ) ); uilist smenu; - smenu.addentry( 0, true, 'q', "%s: %d", _( "Torso" ), p.hp_cur[hp_torso] ); - smenu.addentry( 1, true, 'w', "%s: %d", _( "Head" ), p.hp_cur[hp_head] ); - smenu.addentry( 2, true, 'a', "%s: %d", _( "Left arm" ), p.hp_cur[hp_arm_l] ); - smenu.addentry( 3, true, 's', "%s: %d", _( "Right arm" ), p.hp_cur[hp_arm_r] ); - smenu.addentry( 4, true, 'z', "%s: %d", _( "Left leg" ), p.hp_cur[hp_leg_l] ); - smenu.addentry( 5, true, 'x', "%s: %d", _( "Right leg" ), p.hp_cur[hp_leg_r] ); + smenu.addentry( 0, true, 'q', "%s: %d", _( "Torso" ), torso_hp ); + smenu.addentry( 1, true, 'w', "%s: %d", _( "Head" ), head_hp ); + smenu.addentry( 2, true, 'a', "%s: %d", _( "Left arm" ), arm_l_hp ); + smenu.addentry( 3, true, 's', "%s: %d", _( "Right arm" ), arm_r_hp ); + smenu.addentry( 4, true, 'z', "%s: %d", _( "Left leg" ), leg_l_hp ); + smenu.addentry( 5, true, 'x', "%s: %d", _( "Right leg" ), leg_r_hp ); smenu.addentry( 6, true, 'e', "%s: %d", _( "All" ), p.get_lowest_hp() ); smenu.query(); - int *bp_ptr = nullptr; + bodypart_str_id bp = bodypart_str_id( "no_a_real_part" ); + int bp_ptr = -1; bool all_select = false; switch( smenu.ret ) { case 0: - bp_ptr = &p.hp_cur[hp_torso]; + bp = bodypart_str_id( "torso" ); + bp_ptr = torso_hp; break; case 1: - bp_ptr = &p.hp_cur[hp_head]; + bp = bodypart_str_id( "head" ); + bp_ptr = head_hp; break; case 2: - bp_ptr = &p.hp_cur[hp_arm_l]; + bp = bodypart_str_id( "arm_l" ); + bp_ptr = arm_l_hp; break; case 3: - bp_ptr = &p.hp_cur[hp_arm_r]; + bp = bodypart_str_id( "arm_r" ); + bp_ptr = arm_r_hp; break; case 4: - bp_ptr = &p.hp_cur[hp_leg_l]; + bp = bodypart_str_id( "leg_l" ); + bp_ptr = leg_l_hp; break; case 5: - bp_ptr = &p.hp_cur[hp_leg_r]; + bp = bodypart_str_id( "leg_r" ); + bp_ptr = leg_r_hp; break; case 6: all_select = true; @@ -661,19 +689,17 @@ void character_edit_menu() break; } - if( bp_ptr != nullptr ) { + if( bp.is_valid() ) { int value; - if( query_int( value, _( "Set the hitpoints to? Currently: %d" ), *bp_ptr ) && value >= 0 ) { - *bp_ptr = value; + if( query_int( value, _( "Set the hitpoints to? Currently: %d" ), bp_ptr ) && value >= 0 ) { + p.set_part_hp_cur( bp.id(), value ); p.reset_stats(); } } else if( all_select ) { int value; if( query_int( value, _( "Set the hitpoints to? Currently: %d" ), p.get_lowest_hp() ) && value >= 0 ) { - for( int &cur_hp : p.hp_cur ) { - cur_hp = value; - } + p.set_all_parts_hp_cur( value ); p.reset_stats(); } } @@ -1247,6 +1273,7 @@ void debug() std::sort( sorted.begin(), sorted.end(), []( std::pair a, std::pair b ) { return a.second != b.second ? a.second > b.second : a.first < b.first; } ); + popup( u.total_daily_calories_string() ); for( auto &m_flag_stat : sorted ) { mfus += string_format( "%s;%d\n", io::enum_to_string( m_flag_stat.first ), m_flag_stat.second ); @@ -1256,15 +1283,13 @@ void debug() popup_top( "Monster flag usage statistics were dumped to debug.log and cleared." ); std::string s = _( "Location %d:%d in %d:%d, %s\n" ); - s += _( "Current turn: %d.\n%s\n" ); + s += _( "Current turn: %d.\n" ); s += ngettext( "%d creature exists.\n", "%d creatures exist.\n", g->num_creatures() ); popup_top( s.c_str(), u.posx(), g->u.posy(), g->get_levx(), g->get_levy(), overmap_buffer.ter( g->u.global_omt_location() )->get_name(), to_turns( calendar::turn - calendar::turn_zero ), - get_option( "RANDOM_NPC" ) ? _( "NPCs are going to spawn." ) : - _( "NPCs are NOT going to spawn." ), g->num_creatures() ); for( const npc &guy : g->all_npcs() ) { tripoint t = guy.global_sm_location(); @@ -1295,7 +1320,7 @@ void debug() case debug_menu_index::KILL_NPCS: for( npc &guy : g->all_npcs() ) { add_msg( _( "%s's head implodes!" ), guy.name ); - guy.hp_cur[bp_head] = 0; + guy.set_part_hp_cur( bodypart_id( "head" ), 0 ); } break; @@ -1330,11 +1355,20 @@ void debug() if( veh_menu.ret >= 0 && veh_menu.ret < static_cast( veh_strings.size() ) ) { // Didn't cancel const vproto_id &selected_opt = veh_strings[veh_menu.ret].second; - // TODO: Allow picking this when add_vehicle has 3d argument tripoint dest = u.pos(); - vehicle *veh = here.add_vehicle( selected_opt, dest, -90, 100, 0 ); - if( veh != nullptr ) { - here.board_vehicle( dest, &u ); + uilist veh_cond_menu; + veh_cond_menu.text = _( "Vehicle condition" ); + veh_cond_menu.addentry( 0, true, MENU_AUTOASSIGN, _( "Light damage" ) ); + veh_cond_menu.addentry( 1, true, MENU_AUTOASSIGN, _( "Undamaged" ) ); + veh_cond_menu.addentry( 2, true, MENU_AUTOASSIGN, _( "Disabled (tires or engine)" ) ); + veh_cond_menu.query(); + + if( veh_cond_menu.ret >= 0 && veh_cond_menu.ret < 3 ) { + // TODO: Allow picking this when add_vehicle has 3d argument + vehicle *veh = here.add_vehicle( selected_opt, dest, -90, 100, veh_cond_menu.ret - 1 ); + if( veh != nullptr ) { + here.board_vehicle( dest, &u ); + } } } } @@ -1375,7 +1409,7 @@ void debug() artifact_natural_property prop = static_cast( rng( ARTPROP_NULL + 1, ARTPROP_MAX - 1 ) ); here.create_anomaly( *center, prop ); - here.spawn_natural_artifact( *center, prop ); + here.spawn_artifact( *center, relic_procgen_id( "alien_reality" ) ); } break; @@ -1392,15 +1426,16 @@ void debug() weather_menu.text = _( "Select new weather pattern:" ); weather_menu.addentry( 0, true, MENU_AUTOASSIGN, g->weather.weather_override == WEATHER_NULL ? _( "Keep normal weather patterns" ) : _( "Disable weather forcing" ) ); - for( int weather_id = 1; weather_id < NUM_WEATHER_TYPES; weather_id++ ) { - weather_menu.addentry( weather_id, true, MENU_AUTOASSIGN, - weather::name( static_cast( weather_id ) ) ); + for( size_t i = 0; i < weather_types::get_all().size(); i++ ) { + weather_menu.addentry( i, true, MENU_AUTOASSIGN, + weather_types::get_all()[i].name ); } weather_menu.query(); - if( weather_menu.ret >= 0 && weather_menu.ret < NUM_WEATHER_TYPES ) { - weather_type selected_weather = static_cast( weather_menu.ret ); + if( weather_menu.ret >= 0 && + static_cast( weather_menu.ret ) < weather_types::get_all().size() ) { + const weather_type_id selected_weather = weather_types::get_all()[weather_menu.ret].id; g->weather.weather_override = selected_weather; g->weather.set_nextweather( calendar::turn ); } @@ -1470,13 +1505,19 @@ void debug() // Damage Self case debug_menu_index::DAMAGE_SELF: { + const int torso_hp = u.get_part_hp_cur( bodypart_id( "torso" ) ); + const int head_hp = u.get_part_hp_cur( bodypart_id( "head" ) ); + const int arm_l_hp = u.get_part_hp_cur( bodypart_id( "arm_l" ) ); + const int arm_r_hp = u.get_part_hp_cur( bodypart_id( "arm_r" ) ); + const int leg_l_hp = u.get_part_hp_cur( bodypart_id( "leg_l" ) ); + const int leg_r_hp = u.get_part_hp_cur( bodypart_id( "leg_r" ) ); uilist smenu; - smenu.addentry( 0, true, 'q', "%s: %d", _( "Torso" ), u.hp_cur[hp_torso] ); - smenu.addentry( 1, true, 'w', "%s: %d", _( "Head" ), u.hp_cur[hp_head] ); - smenu.addentry( 2, true, 'a', "%s: %d", _( "Left arm" ), u.hp_cur[hp_arm_l] ); - smenu.addentry( 3, true, 's', "%s: %d", _( "Right arm" ), u.hp_cur[hp_arm_r] ); - smenu.addentry( 4, true, 'z', "%s: %d", _( "Left leg" ), u.hp_cur[hp_leg_l] ); - smenu.addentry( 5, true, 'x', "%s: %d", _( "Right leg" ), u.hp_cur[hp_leg_r] ); + smenu.addentry( 0, true, 'q', "%s: %d", _( "Torso" ), torso_hp ); + smenu.addentry( 1, true, 'w', "%s: %d", _( "Head" ), head_hp ); + smenu.addentry( 2, true, 'a', "%s: %d", _( "Left arm" ), arm_l_hp ); + smenu.addentry( 3, true, 's', "%s: %d", _( "Right arm" ), arm_r_hp ); + smenu.addentry( 4, true, 'z', "%s: %d", _( "Left leg" ), leg_l_hp ); + smenu.addentry( 5, true, 'x', "%s: %d", _( "Right leg" ), leg_r_hp ); smenu.query(); bodypart_id part; int dbg_damage; @@ -1509,6 +1550,46 @@ void debug() } break; + // Add bleeding + case debug_menu_index::BLEED_SELF: { + uilist smenu; + smenu.addentry( 0, true, 'q', _( "Torso" ) ); + smenu.addentry( 1, true, 'w', _( "Head" ) ); + smenu.addentry( 2, true, 'a', _( "Left arm" ) ); + smenu.addentry( 3, true, 's', _( "Right arm" ) ); + smenu.addentry( 4, true, 'z', _( "Left leg" ) ); + smenu.addentry( 5, true, 'x', _( "Right leg" ) ); + smenu.query(); + bodypart_id part; + int intensity = 0; + switch( smenu.ret ) { + case 0: + part = bodypart_id( "torso" ); + break; + case 1: + part = bodypart_id( "head" ); + break; + case 2: + part = bodypart_id( "arm_l" ); + break; + case 3: + part = bodypart_id( "arm_r" ); + break; + case 4: + part = bodypart_id( "leg_l" ); + break; + case 5: + part = bodypart_id( "leg_r" ); + break; + default: + break; + } + if( query_int( intensity, _( "Add bleeding duration in minutes, equal to intensity:" ) ) ) { + u.make_bleed( part, 1_minutes * intensity ); + } + } + break; + case debug_menu_index::SHOW_SOUND: { #if defined(TILES) const auto &sounds_to_draw = sounds::get_monster_sounds(); @@ -1856,6 +1937,32 @@ void debug() case debug_menu_index::TEST_MAP_EXTRA_DISTRIBUTION: MapExtras::debug_spawn_test(); break; + + case debug_menu_index::VEHICLE_BATTERY_CHARGE: { + + optional_vpart_position v_part_pos = here.veh_at( u.pos() ); + if( !v_part_pos ) { + add_msg( m_bad, _( "There's no vehicle there." ) ); + break; + } + + int amount = 0; + string_input_popup popup; + popup + .title( _( "By how much? (in kJ, negative to discharge)" ) ) + .width( 30 ) + .edit( amount ); + if( !popup.canceled() ) { + vehicle &veh = v_part_pos->vehicle(); + if( amount >= 0 ) { + veh.charge_battery( amount, false ); + } else { + veh.discharge_battery( -amount, false ); + } + } + break; + } + case debug_menu_index::last: return; } diff --git a/src/debug_menu.h b/src/debug_menu.h index e5451397611e2..9f3bbb30a667a 100644 --- a/src/debug_menu.h +++ b/src/debug_menu.h @@ -44,6 +44,7 @@ enum class debug_menu_index : int { DISPLAY_HORDES, TEST_IT_GROUP, DAMAGE_SELF, + BLEED_SELF, SHOW_SOUND, DISPLAY_WEATHER, DISPLAY_SCENTS, @@ -76,6 +77,7 @@ enum class debug_menu_index : int { LEVEL_SPELLS, TEST_MAP_EXTRA_DISTRIBUTION, NESTED_MAPGEN, + VEHICLE_BATTERY_CHARGE, last }; diff --git a/src/descriptions.cpp b/src/descriptions.cpp index 01210d004a48a..d8b7e9ffbecb6 100644 --- a/src/descriptions.cpp +++ b/src/descriptions.cpp @@ -155,7 +155,7 @@ std::string map_data_common_t::extended_description() const if( has_any_harvest ) { ss << "--" << std::endl; - int player_skill = get_avatar().get_skill_level( skill_survival ); + int player_skill = get_player_character().get_skill_level( skill_survival ); ss << _( "You could harvest the following things from it:" ) << std::endl; // Group them by identical ids to avoid repeating same blocks of data // First, invert the mapping: season->id to id->seasons diff --git a/src/dialogue.h b/src/dialogue.h index 4f5921be746c0..401c02459990b 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -332,7 +332,7 @@ struct dynamic_line_t { public: dynamic_line_t() = default; - dynamic_line_t( const std::string &line ); + dynamic_line_t( const translation &line ); dynamic_line_t( const JsonObject &jo ); dynamic_line_t( const JsonArray &ja ); static dynamic_line_t from_member( const JsonObject &jo, const std::string &member_name ); diff --git a/src/dump.cpp b/src/dump.cpp index 703bb07d5a825..97c55317fe7e3 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -8,8 +8,8 @@ #include #include -#include "avatar.h" #include "bodypart.h" +#include "character.h" #include "compatibility.h" // needed for the workaround for the std::to_string bug in some compilers #include "damage.h" #include "flat_set.h" @@ -109,7 +109,7 @@ bool game::dump_stats( const std::string &what, dump_mode mode, auto dump = [&rows]( const item & obj ) { std::vector r; r.push_back( obj.tname( 1, false ) ); - r.push_back( to_string( obj.get_encumber( g->u ) ) ); + r.push_back( to_string( obj.get_encumber( get_player_character() ) ) ); r.push_back( to_string( obj.get_warmth() ) ); r.push_back( to_string( to_gram( obj.weight() ) ) ); r.push_back( to_string( obj.get_coverage() ) ); @@ -161,7 +161,7 @@ bool game::dump_stats( const std::string &what, dump_mode mode, for( const itype *e : item_controller->all() ) { item food( e, calendar::turn, item::solitary_tag {} ); - if( food.is_food() && g->u.can_eat( food ).success() ) { + if( food.is_food() && get_player_character().can_eat( food ).success() ) { dump( food ); } } @@ -223,7 +223,7 @@ bool game::dump_stats( const std::string &what, dump_mode mode, dump( test_npcs[ "S1" ], gun ); - if( gun.type->gun->barrel_length > 0_ml ) { + if( gun.type->gun->barrel_volume > 0_ml ) { gun.put_in( item( "barrel_small" ), item_pocket::pocket_type::MOD ); dump( test_npcs[ "S1" ], gun ); } diff --git a/src/editmap.cpp b/src/editmap.cpp index 1612f7a3fdf34..4852877175a8a 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -463,7 +463,7 @@ void editmap::uber_draw_ter( const catacurses::window &w, map *m ) if( refresh_mplans ) { hilights["mplan"].points.clear(); } - for( const tripoint &p : tripoint_range( start, end ) ) { + for( const tripoint &p : tripoint_range( start, end ) ) { int sym = game_map ? '%' : ' '; if( p.x >= 0 && p.x < msize && p.y >= 0 && p.y < msize ) { if( game_map ) { @@ -777,7 +777,7 @@ void editmap::update_view_with_help( const std::string &txt, const std::string & } const trap &cur_trap = here.tr_at( target ); - if( cur_trap.loadid != tr_null ) { + if( !cur_trap.is_null() ) { mvwprintz( w_info, point( 1, off ), cur_trap.color, _( "trap: %s (%d)" ), cur_trap.name(), cur_trap.loadid.to_i() ); off++; // 11 @@ -959,9 +959,7 @@ std::string describe( const furn_t &type ) template<> std::string describe( const trap &type ) { - return string_format( _( "Visible: %d\nAvoidance: %d\nDifficulty: %d\nBenign: %s" ), - type.get_visibility(), type.get_avoidance(), type.get_difficulty(), - type.is_benign() ? _( "Yes" ) : _( "No" ) ); + return type.debug_describe(); } template diff --git a/src/effect.cpp b/src/effect.cpp index e72a4c2c0eab4..3687844dd2f86 100644 --- a/src/effect.cpp +++ b/src/effect.cpp @@ -1419,3 +1419,22 @@ std::string texitify_healing_power( const int power ) } return ""; } +std::string texitify_bandage_power( const int power ) +{ + if( power < 5 ) { + return colorize( _( "miniscule" ), c_red ); + } else if( power < 10 ) { + return colorize( _( "small" ), c_light_red ); + } else if( power < 15 ) { + return colorize( _( "moderate" ), c_yellow ); + } else if( power < 20 ) { + return colorize( _( "good" ), c_light_green ); + } else if( power < 30 ) { + return colorize( _( "excellent" ), c_light_green ); + } else if( power < 51 ) { + return colorize( _( "outstanding" ), c_green ); + } else { + debugmsg( "Converted value out of bounds." ); + } + return ""; +} diff --git a/src/effect.h b/src/effect.h index e7e1748c366ed..dde40ad1c6727 100644 --- a/src/effect.h +++ b/src/effect.h @@ -295,6 +295,7 @@ void reset_effect_types(); std::string texitify_base_healing_power( int power ); std::string texitify_healing_power( int power ); +std::string texitify_bandage_power( int power ); // Inheritance here allows forward declaration of the map in class Creature. // Storing body_part as an int to make things easier for hash and JSON diff --git a/src/event.cpp b/src/event.cpp index 77e2b3a2e720a..2c632e43ecddc 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -16,6 +16,7 @@ std::string enum_to_string( event_type data ) case event_type::avatar_moves: return "avatar_moves"; case event_type::awakes_dark_wyrms: return "awakes_dark_wyrms"; case event_type::becomes_wanted: return "becomes_wanted"; + case event_type::broken_bone: return "broken_bone"; case event_type::broken_bone_mends: return "broken_bone_mends"; case event_type::buries_corpse: return "buries_corpse"; case event_type::causes_resonance_cascade: return "causes_resonance_cascade"; @@ -36,11 +37,15 @@ std::string enum_to_string( event_type data ) case event_type::crosses_marloss_threshold: return "crosses_marloss_threshold"; case event_type::crosses_mutation_threshold: return "crosses_mutation_threshold"; case event_type::crosses_mycus_threshold: return "crosses_mycus_threshold"; + case event_type::cuts_tree: return "cuts_tree"; case event_type::dermatik_eggs_hatch: return "dermatik_eggs_hatch"; case event_type::dermatik_eggs_injected: return "dermatik_eggs_injected"; case event_type::destroys_triffid_grove: return "destroys_triffid_grove"; case event_type::dies_from_asthma_attack: return "dies_from_asthma_attack"; case event_type::dies_from_drug_overdose: return "dies_from_drug_overdose"; + case event_type::dies_from_bleeding: return "dies_from_bleeding"; + case event_type::dies_from_hypovolemia: return "dies_from_hypovolemia"; + case event_type::dies_from_redcells_loss: return "dies_from_redcells_loss"; case event_type::dies_of_infection: return "dies_of_infection"; case event_type::dies_of_starvation: return "dies_of_starvation"; case event_type::dies_of_thirst: return "dies_of_thirst"; @@ -70,6 +75,7 @@ std::string enum_to_string( event_type data ) case event_type::player_fails_conduct: return "player_fails_conduct"; case event_type::player_gets_achievement: return "player_gets_achievement"; case event_type::player_levels_spell: return "player_levels_spell"; + case event_type::reads_book: return "reads_book"; case event_type::releases_subspace_specimens: return "releases_subspace_specimens"; case event_type::removes_cbm: return "removes_cbm"; case event_type::seals_hazardous_material_sarcophagus: return "seals_hazardous_material_sarcophagus"; @@ -104,7 +110,7 @@ DEFINE_EVENT_HELPER_FIELDS( event_spec_empty ) DEFINE_EVENT_HELPER_FIELDS( event_spec_character ) DEFINE_EVENT_HELPER_FIELDS( event_spec_character_item ) -static_assert( static_cast( event_type::num_event_types ) == 72, +static_assert( static_cast( event_type::num_event_types ) == 78, "This static_assert is a reminder to add a definition below when you add a new " "event_type. If your event_spec specialization inherits from another struct for " "its fields definition then you probably don't need a definition here." ); @@ -118,6 +124,7 @@ DEFINE_EVENT_FIELDS( activates_artifact ) DEFINE_EVENT_FIELDS( administers_mutagen ) DEFINE_EVENT_FIELDS( avatar_enters_omt ) DEFINE_EVENT_FIELDS( avatar_moves ) +DEFINE_EVENT_FIELDS( broken_bone ) DEFINE_EVENT_FIELDS( broken_bone_mends ) DEFINE_EVENT_FIELDS( buries_corpse ) DEFINE_EVENT_FIELDS( character_forgets_spell ) diff --git a/src/event.h b/src/event.h index 21054e1e86626..219e141dda260 100644 --- a/src/event.h +++ b/src/event.h @@ -31,6 +31,7 @@ enum class event_type : int { avatar_moves, awakes_dark_wyrms, becomes_wanted, + broken_bone, broken_bone_mends, buries_corpse, causes_resonance_cascade, @@ -51,11 +52,15 @@ enum class event_type : int { crosses_marloss_threshold, crosses_mutation_threshold, crosses_mycus_threshold, + cuts_tree, dermatik_eggs_hatch, dermatik_eggs_injected, destroys_triffid_grove, dies_from_asthma_attack, dies_from_drug_overdose, + dies_from_bleeding, + dies_from_hypovolemia, + dies_from_redcells_loss, dies_of_infection, dies_of_starvation, dies_of_thirst, @@ -85,6 +90,7 @@ enum class event_type : int { player_fails_conduct, player_gets_achievement, player_levels_spell, + reads_book, releases_subspace_specimens, removes_cbm, seals_hazardous_material_sarcophagus, @@ -155,7 +161,7 @@ struct event_spec_character_item { }; }; -static_assert( static_cast( event_type::num_event_types ) == 72, +static_assert( static_cast( event_type::num_event_types ) == 78, "This static_assert is to remind you to add a specialization for your new " "event_type below" ); @@ -210,6 +216,15 @@ struct event_spec : event_spec_empty {}; template<> struct event_spec : event_spec_character {}; +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "part", cata_variant_type::body_part }, + } + }; +}; + template<> struct event_spec { static constexpr std::array, 2> fields = {{ @@ -349,6 +364,9 @@ struct event_spec { template<> struct event_spec : event_spec_character {}; +template<> +struct event_spec : event_spec_character {}; + template<> struct event_spec : event_spec_character {}; @@ -370,6 +388,15 @@ struct event_spec { }; }; +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + template<> struct event_spec : event_spec_character {}; @@ -580,6 +607,9 @@ struct event_spec { }; }; +template<> +struct event_spec : event_spec_character_item {}; + template<> struct event_spec { static constexpr std::array, 2> fields = {{ diff --git a/src/explosion.cpp b/src/explosion.cpp index 1c86a4a5173b8..4b5499d0caa09 100644 --- a/src/explosion.cpp +++ b/src/explosion.cpp @@ -220,7 +220,7 @@ static void do_blast( const tripoint &p, const float power, continue; } - if( bashed.count( dest ) != 0 ) { + if( bashed.count( dest ) == 0 ) { bashed.insert( dest ); // Up to 200% bonus for shaped charge // But not if the explosion is fiery, then only half the force and no bonus @@ -387,7 +387,7 @@ static std::vector shrapnel( const tripoint &src, int power, // TODO: Calculate range based on max effective range for projectiles. // Basically bisect between 0 and map diameter using shrapnel_calc(). // Need to update shadowcasting to support limiting range without adjusting initial distance. - const tripoint_range area = here.points_on_zlevel( src.z ); + const tripoint_range area = here.points_on_zlevel( src.z ); here.build_obstacle_cache( area.min(), area.max() + tripoint_south_east, obstacle_cache ); @@ -657,7 +657,7 @@ void emp_blast( const tripoint &p ) if( sight ) { add_msg( _( "The %s is rendered non-functional!" ), here.tername( p2 ) ); } - here.ter_set( p2, t_console_broken ); + here.furn_set( p2, furn_str_id( "f_machinery_electronic" ) ); return; } // TODO: More terrain effects. diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index 26a529b2d9992..eefe9587cd31e 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -1595,7 +1595,8 @@ void basecamp::start_upgrade( const std::string &bldg, const point &dir, return; } - time_duration work_days = base_camps::to_workdays( making.batch_duration() ); + time_duration work_days = base_camps::to_workdays( making.batch_duration( + get_player_character() ) ); npc_ptr comp = nullptr; if( making.required_skills.empty() ) { if( making.skill_used.is_valid() ) { @@ -2151,7 +2152,7 @@ void basecamp::start_fortifications( std::string &bldg_exp ) return; } trips += 2; - build_time += making.batch_duration(); + build_time += making.batch_duration( get_player_character() ); dist += rl_dist( fort_om.xy(), omt_pos.xy() ); travel_time += companion_travel_time_calc( fort_om, omt_pos, 0_minutes, 2 ); } @@ -2252,7 +2253,8 @@ void basecamp::start_crafting( const std::string &cur_id, const point &cur_dir, return; } - time_duration work_days = base_camps::to_workdays( making.batch_duration( batch_size ) ); + time_duration work_days = base_camps::to_workdays( making.batch_duration( get_player_character(), + batch_size ) ); npc_ptr comp = start_mission( miss_id + cur_dir_id, work_days, true, _( "begins to work…" ), false, {}, making.required_skills ); @@ -2609,7 +2611,8 @@ bool basecamp::upgrade_return( const point &dir, const std::string &miss, const tripoint upos = e->second.pos; const recipe &making = recipe_id( bldg ).obj(); - time_duration work_days = base_camps::to_workdays( making.batch_duration() ); + time_duration work_days = base_camps::to_workdays( making.batch_duration( + get_player_character() ) ); npc_ptr comp = companion_choose_return( miss, work_days ); if( comp == nullptr ) { @@ -3041,7 +3044,7 @@ int basecamp::recipe_batch_max( const recipe &making ) const for( size_t batch_size = 1000; batch_size > 0; batch_size /= 10 ) { for( int iter = 0; iter < max_checks; iter++ ) { time_duration work_days = base_camps::to_workdays( making.batch_duration( - max_batch + batch_size ) ); + get_player_character(), max_batch + batch_size ) ); int food_req = time_to_food( work_days ); bool can_make = making.deduped_requirements().can_make_with_inventory( _inv, making.get_component_filter(), max_batch + batch_size ); @@ -3676,7 +3679,7 @@ std::string basecamp::craft_description( const recipe_id &itm ) } comp = string_format( _( "Skill used: %s\nDifficulty: %d\n%s\nTime: %s\n" ), making.skill_used.obj().name(), making.difficulty, comp, - to_string( base_camps::to_workdays( making.batch_duration() ) ) ); + to_string( base_camps::to_workdays( making.batch_duration( get_player_character() ) ) ) ); return comp; } diff --git a/src/field.cpp b/src/field.cpp index bbf8102195051..062b09d867694 100644 --- a/src/field.cpp +++ b/src/field.cpp @@ -130,6 +130,11 @@ int field_entry::set_field_intensity( int new_intensity ) } +void field_entry::mod_field_intensity( int mod ) +{ + set_field_intensity( get_field_intensity() + mod ); +} + time_duration field_entry::get_field_age() const { return age; diff --git a/src/field.h b/src/field.h index 38aabd02041a4..1668c8cf3d56d 100644 --- a/src/field.h +++ b/src/field.h @@ -62,6 +62,7 @@ class field_entry int get_field_intensity() const; // Allows you to modify the intensity of the current field entry. int set_field_intensity( int new_intensity ); + void mod_field_intensity( int mod ); /// @returns @ref age. time_duration get_field_age() const; diff --git a/src/field_type.cpp b/src/field_type.cpp index c08adb314a043..fa21bd996e471 100644 --- a/src/field_type.cpp +++ b/src/field_type.cpp @@ -250,6 +250,8 @@ void field_type::load( const JsonObject &jo, const std::string & ) optional( jo, was_loaded, "display_field", display_field, false ); optional( jo, was_loaded, "wandering_field", wandering_field_id, "fd_null" ); + optional( jo, was_loaded, "decrease_intensity_on_contact", decrease_intensity_on_contact, false ); + bash_info.load( jo, "bash", map_bash_info::field ); if( was_loaded && jo.has_member( "copy-from" ) && looks_like.empty() ) { looks_like = jo.get_string( "copy-from" ); @@ -316,6 +318,7 @@ const std::vector &field_types::get_all() field_type_id fd_null, fd_blood, fd_bile, + fd_extinguisher, fd_gibs_flesh, fd_gibs_veggy, fd_web, @@ -373,6 +376,7 @@ void field_types::set_field_type_ids() fd_null = field_type_id( "fd_null" ); fd_blood = field_type_id( "fd_blood" ); fd_bile = field_type_id( "fd_bile" ); + fd_extinguisher = field_type_id( "fd_extinguisher" ); fd_gibs_flesh = field_type_id( "fd_gibs_flesh" ); fd_gibs_veggy = field_type_id( "fd_gibs_veggy" ); fd_web = field_type_id( "fd_web" ); diff --git a/src/field_type.h b/src/field_type.h index a83ef1b17428a..6110bc4db642b 100644 --- a/src/field_type.h +++ b/src/field_type.h @@ -163,6 +163,8 @@ struct field_type { field_type_id wandering_field; std::string looks_like; + bool decrease_intensity_on_contact = false; + public: const field_intensity_level &get_intensity_level( int level = 0 ) const; std::string get_name( int level = 0 ) const { @@ -268,6 +270,7 @@ field_type get_field_type_by_legacy_enum( int legacy_enum_id ); extern field_type_id fd_null, fd_blood, fd_bile, + fd_extinguisher, fd_gibs_flesh, fd_gibs_veggy, fd_web, diff --git a/src/game.cpp b/src/game.cpp index 8ef03519de322..21b8ed31c44d2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -249,6 +249,8 @@ static const trait_id trait_PARKOUR( "PARKOUR" ); static const trait_id trait_VINES2( "VINES2" ); static const trait_id trait_VINES3( "VINES3" ); static const trait_id trait_THICKSKIN( "THICKSKIN" ); +static const trait_id trait_NPC_STATIC_NPC( "NPC_STATIC_NPC" ); +static const trait_id trait_NPC_STARTING_NPC( "NPC_STARTING_NPC" ); static const trap_str_id tr_unfinished_construction( "tr_unfinished_construction" ); @@ -275,8 +277,8 @@ bool is_valid_in_w_terrain( const point &p ) static void achievement_attained( const achievement *a, bool achievements_enabled ) { if( achievements_enabled ) { - g->u.add_msg_if_player( m_good, _( "You completed the achievement \"%s\"." ), - a->name() ); + add_msg( m_good, _( "You completed the achievement \"%s\"." ), + a->name() ); } g->events().send( a->id, achievements_enabled ); } @@ -287,7 +289,7 @@ static void achievement_failed( const achievement *a, bool achievements_enabled return; } if( achievements_enabled ) { - g->u.add_msg_if_player( m_bad, _( "You lost the conduct \"%s\"." ), a->name() ); + add_msg( m_bad, _( "You lost the conduct \"%s\"." ), a->name() ); } g->events().send( a->id, achievements_enabled ); } @@ -574,7 +576,7 @@ void game::setup() load_world_modfiles( ui ); - m = map( get_option( "ZLEVELS" ) ); + m = map( true ); next_npc_id = character_id( 1 ); next_mission_id = 1; @@ -587,7 +589,7 @@ void game::setup() calendar::set_eternal_season( ::get_option( "ETERNAL_SEASON" ) ); calendar::set_season_length( ::get_option( "SEASON_LENGTH" ) ); - weather.weather = WEATHER_CLEAR; // Start with some nice weather... + weather.weather_id = WEATHER_CLEAR; // Weather shift in 30 weather.nextweather = calendar::start_of_cataclysm + time_duration::from_hours( get_option( "INITIAL_TIME" ) ) + 30_minutes; @@ -704,10 +706,8 @@ bool game::start_game() get_auto_notes_settings().clear(); get_auto_notes_settings().default_initialize(); - //Put some NPCs in there! - if( get_option( "STARTING_NPC" ) == "always" || - ( get_option( "STARTING_NPC" ) == "scenario" && - !g->scen->has_flag( "LONE_START" ) ) ) { + // spawn the starting NPC, assuming it's not disallowed by the scenario + if( !g->scen->has_flag( "LONE_START" ) ) { create_starting_npcs(); } //Load NPCs. Set nearby npcs to active. @@ -787,7 +787,7 @@ bool game::start_game() } } for( auto &e : u.inv_dump() ) { - e->set_owner( g->u ); + e->set_owner( get_player_character() ); } // Now that we're done handling coordinates, ensure the player's submap is in the center of the map update_map( u ); @@ -946,11 +946,6 @@ const kill_tracker &game::get_kill_tracker() const void game::create_starting_npcs() { - if( !get_option( "STATIC_NPC" ) || - get_option( "STARTING_NPC" ) == "never" ) { - return; //Do not generate a starting npc. - } - //We don't want more than one starting npc per starting location const int radius = 1; if( !overmap_buffer.get_npcs_near_player( radius ).empty() ) { @@ -1090,7 +1085,7 @@ bool game::cleanup_at_end() point( iOffsetX, iOffsetY ) ); draw_border( w_rip ); - sfx::do_player_death_hurt( g->u, true ); + sfx::do_player_death_hurt( get_player_character(), true ); sfx::fade_audio_group( sfx::group::weather, 2000 ); sfx::fade_audio_group( sfx::group::time_of_day, 2000 ); sfx::fade_audio_group( sfx::group::context_themes, 2000 ); @@ -1573,8 +1568,7 @@ bool game::do_turn() } if( get_levz() >= 0 && !u.is_underwater() ) { - do_rain( weather.weather ); - weather::effect( weather.weather )(); + handle_weather_effects( weather.weather_id ); } const bool player_is_sleeping = u.has_effect( effect_sleep ); @@ -1801,6 +1795,7 @@ int get_heat_radiation( const tripoint &location, bool direct ) // Stored as intensity-distance pairs int temp_mod = 0; int best_fire = 0; + Character &player_character = get_player_character(); map &here = get_map(); for( const tripoint &dest : here.points_in_radius( location, 6 ) ) { int heat_intensity = 0; @@ -1810,14 +1805,14 @@ int get_heat_radiation( const tripoint &location, bool direct ) int ffire = maptile_field_intensity( mt, fd_fire ); if( ffire > 0 ) { heat_intensity = ffire; - } else if( here.tr_at( dest ).loadid == tr_lava ) { + } else if( here.tr_at( dest ) == tr_lava ) { heat_intensity = 3; } if( heat_intensity == 0 ) { // No heat source here continue; } - if( g->u.pos() == location ) { + if( player_character.pos() == location ) { if( !here.pl_line_of_sight( dest, -1 ) ) { continue; } @@ -1843,8 +1838,7 @@ int get_convection_temperature( const tripoint &location ) int temp_mod = 0; map &here = get_map(); // Directly on lava tiles - int lava_mod = here.tr_at( location ).loadid == tr_lava ? - fd_fire.obj().get_convection_temperature_mod() : 0; + int lava_mod = here.tr_at( location ) == tr_lava ? fd_fire->get_convection_temperature_mod() : 0; // Modifier from fields for( auto fd : here.field_at( location ) ) { // Nullify lava modifier when there is open fire @@ -2001,6 +1995,7 @@ static void handle_contents_changed( const item_location &acted_item ) } item_location parent = acted_item; item_pocket *pocket = nullptr; + Character &player_character = get_player_character(); do { item_location child = parent; parent = parent.parent_item(); @@ -2016,7 +2011,7 @@ static void handle_contents_changed( const item_location &acted_item ) pocket->on_contents_changed(); if( pocket->will_spill() ) { - pocket->handle_liquid_or_spill( g->u ); + pocket->handle_liquid_or_spill( player_character ); } } while( parent.where() == item_location::type::container ); } @@ -2104,6 +2099,9 @@ static hint_rating rate_action_use( const avatar &you, const item &it ) return hint_rating::good; } } else if( it.is_food() || it.is_medication() || it.is_book() || it.is_armor() ) { + if( it.is_medication() && !you.can_use_heal_item( it ) ) { + return hint_rating::cant; + } // The rating is subjective, could be argued as hint_rating::cant or hint_rating::good as well return hint_rating::iffy; } else if( it.type->has_use() ) { @@ -2577,6 +2575,7 @@ input_context get_default_mode_input_context() ctxt.register_action( "autoattack" ); ctxt.register_action( "ignore_enemy" ); ctxt.register_action( "whitelist_enemy" ); + ctxt.register_action( "workout" ); ctxt.register_action( "save" ); ctxt.register_action( "quicksave" ); #if !defined(RELEASE) @@ -2934,7 +2933,7 @@ bool game::load( const save_t &name ) validate_linked_vehicles(); update_map( u ); for( auto &e : u.inv_dump() ) { - e->set_owner( g->u ); + e->set_owner( get_player_character() ); } // legacy, needs to be here as we access the map. if( !u.getID().is_valid() ) { @@ -3121,7 +3120,7 @@ bool game::save_player_data() }, _( "player map memory" ) ); const bool saved_log = write_to_file( playerfile + SAVE_EXTENSION_LOG, [&]( std::ostream & fout ) { - fout << memorial().dump(); + memorial().save( fout ); }, _( "player memorial" ) ); #if defined(__ANDROID__) const bool saved_shortcuts = write_to_file( playerfile + SAVE_EXTENSION_SHORTCUTS, [&]( @@ -3260,11 +3259,15 @@ void game::write_memorial_file( std::string sLastWords ) std::strftime( buffer, suffix_len, "%Y-%m-%d-%H-%M-%S", std::localtime( &t ) ); memorial_file_path << buffer; - memorial_file_path << ".txt"; + const std::string text_path_string = memorial_file_path.str() + ".txt"; + const std::string json_path_string = memorial_file_path.str() + ".json"; + + write_to_file( text_path_string, [&]( std::ostream & fout ) { + memorial().write_text_memorial( fout, sLastWords ); + }, _( "player memorial" ) ); - const std::string path_string = memorial_file_path.str(); - write_to_file( memorial_file_path.str(), [&]( std::ostream & fout ) { - memorial().write( fout, sLastWords ); + write_to_file( json_path_string, [&]( std::ostream & fout ) { + memorial().write_json_memorial( fout ); }, _( "player memorial" ) ); } @@ -3308,7 +3311,7 @@ void game::display_faction_epilogues() struct npc_dist_to_player { const tripoint ppos{}; - npc_dist_to_player() : ppos( g->u.global_omt_location() ) { } + npc_dist_to_player() : ppos( get_player_character().global_omt_location() ) { } // Operator overload required to leverage sort API. bool operator()( const shared_ptr_fast &a, const shared_ptr_fast &b ) const { @@ -3323,7 +3326,8 @@ void game::disp_NPCs() { const tripoint ppos = u.global_omt_location(); const tripoint &lpos = u.pos(); - std::vector> npcs = overmap_buffer.get_npcs_near_player( 100 ); + const int scan_range = 120; + std::vector> npcs = overmap_buffer.get_npcs_near_player( scan_range ); std::sort( npcs.begin(), npcs.end(), npc_dist_to_player() ); catacurses::window w; @@ -3343,13 +3347,22 @@ void game::disp_NPCs() mvwprintz( w, point( 0, 1 ), c_white, _( "Your local position: %d, %d, %d" ), lpos.x, lpos.y, lpos.z ); size_t i; + int static_npc_count = 0; + for( i = 0; i < npcs.size(); i++ ) { + if( + npcs[i]->has_trait( trait_NPC_STARTING_NPC ) || npcs[i]->has_trait( trait_NPC_STATIC_NPC ) ) { + static_npc_count++; + } + } + mvwprintz( w, point( 0, 2 ), c_white, _( "Total NPCs within %d OMTs: %d. %d are static NPCs." ), + scan_range, npcs.size(), static_npc_count ); for( i = 0; i < 20 && i < npcs.size(); i++ ) { const tripoint apos = npcs[i]->global_omt_location(); - mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %d, %d, %d", npcs[i]->name, + mvwprintz( w, point( 0, i + 4 ), c_white, "%s: %d, %d, %d", npcs[i]->name, apos.x, apos.y, apos.z ); } for( const monster &m : all_monsters() ) { - mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %d, %d, %d", m.name(), + mvwprintz( w, point( 0, i + 4 ), c_white, "%s: %d, %d, %d", m.name(), m.posx(), m.posy(), m.posz() ); ++i; } @@ -3514,8 +3527,10 @@ static shared_ptr_fast create_zone_callback( } } if( zone_blink && zone_start && zone_end ) { - const point offset2( g->u.view_offset.xy() + point( g->u.posx() - getmaxx( g->w_terrain ) / 2, - g->u.posy() - getmaxy( g->w_terrain ) / 2 ) ); + avatar &player_character = get_avatar(); + const point offset2( player_character.view_offset.xy() + + point( player_character.posx() - getmaxx( g->w_terrain ) / 2, + player_character.posy() - getmaxy( g->w_terrain ) / 2 ) ); tripoint offset; #if defined(TILES) @@ -3721,7 +3736,7 @@ void game::draw_ter( const tripoint ¢er, const bool looking, const bool draw draw_veh_dir_indicator( true ); } // Place the cursor over the player as is expected by screen readers. - wmove( w_terrain, -center.xy() + g->u.pos().xy() + point( POSX, POSY ) ); + wmove( w_terrain, -center.xy() + get_player_character().pos().xy() + point( POSX, POSY ) ); } cata::optional game::get_veh_dir_indicator_location( bool next ) const @@ -3931,7 +3946,9 @@ void game::draw_minimap() } } - const int sight_points = g->u.overmap_sight_range( g->light_level( g->u.posz() ) ); + Character &player_character = get_player_character(); + const int sight_points = player_character.overmap_sight_range( g->light_level( + player_character.posz() ) ); for( int i = -3; i <= 3; i++ ) { for( int j = -3; j <= 3; j++ ) { if( i > -3 && i < 3 && j > -3 && j < 3 ) { @@ -3945,7 +3962,7 @@ void game::draw_minimap() omx, omy, get_levz() }; if( overmap_buffer.seen( omp ) - && g->u.overmap_los( cur_pos, sight_points ) ) { + && player_character.overmap_los( cur_pos, sight_points ) ) { mvwputch( w_minimap, point( i + 3, j + 3 ), c_green, overmap_buffer.get_horde_size( omp ) > HORDE_VISIBILITY_SIZE * 2 ? 'Z' : 'z' ); } @@ -3978,7 +3995,7 @@ float game::natural_light_level( const int zlev ) const ret = default_daylight_level(); } - ret += weather::light_modifier( weather.weather ); + ret += get_weather().weather_id->light_modifier; // Artifact light level changes here. Even though some of these only have an effect // aboveground it is cheaper performance wise to simply iterate through the entire @@ -4370,7 +4387,7 @@ void game::mon_info_update( ) if( ( !safemode_empty && safemode_state == rule_state::BLACKLISTED ) || ( safemode_empty && ( MATT_ATTACK == matt || MATT_FOLLOW == matt ) ) ) { - if( index < 8 && critter.sees( g->u ) ) { + if( index < 8 && critter.sees( get_player_character() ) ) { dangerous[index] = true; } @@ -5034,7 +5051,7 @@ static bool can_place_monster( const monster &mon, const tripoint &p ) } static cata::optional choose_where_to_place_monster( const monster &mon, - const tripoint_range &range ) + const tripoint_range &range ) { return random_point( range, [&]( const tripoint & p ) { return can_place_monster( mon, p ); @@ -5082,7 +5099,7 @@ monster *game::place_critter_around( const shared_ptr_fast &mon, return critter_tracker->add( mon ) ? mon.get() : nullptr; } -monster *game::place_critter_within( const mtype_id &id, const tripoint_range &range ) +monster *game::place_critter_within( const mtype_id &id, const tripoint_range &range ) { // TODO: change this into an assert, it must never happen. if( id.is_null() ) { @@ -5092,7 +5109,7 @@ monster *game::place_critter_within( const mtype_id &id, const tripoint_range &r } monster *game::place_critter_within( const shared_ptr_fast &mon, - const tripoint_range &range ) + const tripoint_range &range ) { const cata::optional where = choose_where_to_place_monster( *mon, range ); if( !where ) { @@ -5104,7 +5121,8 @@ monster *game::place_critter_within( const shared_ptr_fast &mon, size_t game::num_creatures() const { - return critter_tracker->size() + active_npc.size() + 1; // 1 == g->u + // Plus one for the player. + return critter_tracker->size() + active_npc.size() + 1; } bool game::update_zombie_pos( const monster &critter, const tripoint &pos ) @@ -5122,6 +5140,25 @@ void game::clear_zombies() critter_tracker->clear(); } +bool game::find_nearby_spawn_point( const Character &target, const mtype_id &mt, int min_radius, + int max_radius, tripoint &point ) +{ + tripoint target_point; + //find a legal outdoor place to spawn based on the specified radius, + //we just try a bunch of random points and use the first one that works, it none do then no spawn + for( int attempts = 0; attempts < 15; attempts++ ) { + target_point = target.pos() + tripoint( rng( -max_radius, max_radius ), + rng( -max_radius, max_radius ), 0 ); + if( can_place_monster( mt->id, target_point ) && + get_map().is_outside( target_point ) && + rl_dist( target_point, get_player_character().pos() ) > min_radius ) { + point = target_point; + return true; + } + } + return false; +} + /** * Attempts to spawn a hallucination at given location. * Returns false if the hallucination couldn't be spawned for whatever reason, such as @@ -5144,7 +5181,16 @@ bool game::spawn_hallucination( const tripoint &p ) } } - const mtype_id &mt = MonsterGenerator::generator().get_valid_hallucination(); + return spawn_hallucination( p, MonsterGenerator::generator().get_valid_hallucination() ); +} +/** + * Attempts to spawn a hallucination at given location. + * Returns false if the hallucination couldn't be spawned for whatever reason, such as + * a monster already in the target square. + * @return Whether or not a hallucination was successfully spawned. + */ +bool game::spawn_hallucination( const tripoint &p, const mtype_id &mt ) +{ const shared_ptr_fast phantasm = make_shared_fast( mt ); phantasm->hallucination = true; phantasm->spawn( p ); @@ -5235,8 +5281,8 @@ bool game::is_empty( const tripoint &p ) bool game::is_in_sunlight( const tripoint &p ) { - return ( m.is_outside( p ) && light_level( p.z ) >= 40 && - ( weather.weather == WEATHER_CLEAR || weather.weather == WEATHER_SUNNY ) ); + return ( m.is_outside( p ) && light_level( p.z ) >= 40 && !is_night( calendar::turn ) && + get_weather().weather_id->sun_intensity >= sun_intensity_type::normal ); } bool game::is_sheltered( const tripoint &p ) @@ -5254,6 +5300,11 @@ bool game::revive_corpse( const tripoint &p, item &it ) debugmsg( "Tried to revive a non-corpse." ); return false; } + // If this is not here, the game may attempt to spawn a monster before the map exists, + // leading to it querying for furniture, and crashing. + if( g->new_game ) { + return false; + } shared_ptr_fast newmon_ptr = make_shared_fast ( it.get_mtype()->id ); if( it.has_var( "zombie_form" ) ) { // if the monster can reanimate has a zombie @@ -5304,7 +5355,7 @@ void game::save_cyborg( item *cyborg, const tripoint &couch_pos, player &install difficulty - 4 * assist_bonus ), installer ); int success = chance_of_success - rng( 1, 100 ); - if( !g->u.query_yn( + if( !get_avatar().query_yn( _( "WARNING: %i percent chance of SEVERE damage to all body parts! Continue anyway?" ), 100 - static_cast( chance_of_success ) ) ) { return; @@ -5567,7 +5618,7 @@ void game::control_vehicle() int num_valid_controls = 0; cata::optional vehicle_position; cata::optional vehicle_controls; - for( const tripoint elem : m.points_in_radius( g->u.pos(), 1 ) ) { + for( const tripoint elem : m.points_in_radius( get_player_character().pos(), 1 ) ) { if( const optional_vpart_position vp = m.veh_at( elem ) ) { const cata::optional controls = vp.value().part_with_feature( "CONTROLS", true ); if( controls ) { @@ -5768,7 +5819,7 @@ static std::string get_fire_fuel_string( const tripoint &examp ) } time_duration fire_age = fire->get_field_age(); // half-life inclusion - int mod = 5 - g->u.get_skill_level( skill_survival ); + int mod = 5 - get_player_character().get_skill_level( skill_survival ); mod = std::max( mod, 0 ); if( fire_age >= 0_turns ) { if( mod >= 4 ) { // = survival level 0-1 @@ -5899,11 +5950,8 @@ void game::examine( const tripoint &examp ) none = false; } - if( !m.tr_at( examp ).is_null() && !u.is_mounted() ) { - iexamine::trap( u, examp ); - } else if( !m.tr_at( examp ).is_null() && u.is_mounted() ) { - add_msg( m_warning, _( "You cannot do that while mounted." ) ); - } + // trap::iexamine will handle the invisible traps. + m.tr_at( examp ).examine( examp ); // In case of teleport trap or somesuch if( player_pos != u.pos() ) { @@ -6286,7 +6334,7 @@ void game::print_trap_info( const tripoint &lp, const catacurses::window &w_look if( tr.can_see( lp, u ) ) { partial_con *pc = m.partial_con_at( lp ); std::string tr_name; - if( pc && tr.loadid == tr_unfinished_construction ) { + if( pc && tr == tr_unfinished_construction ) { const construction &built = pc->id.obj(); tr_name = string_format( _( "Unfinished task: %s, %d%% complete" ), built.description, pc->counter / 100000 ); @@ -6484,7 +6532,7 @@ void game::zones_manager() ui.position( point_zero, point_zero ); return; } - offsetX = get_option( "SIDEBAR_POSITION" ) == "left" ? + offsetX = get_option( "SIDEBAR_POSITION" ) != "left" ? TERMX - width : 0; const int w_zone_height = TERMY - zone_ui_height; max_rows = w_zone_height - 2; @@ -6722,8 +6770,8 @@ void game::zones_manager() break; } - mgr.add( name, id, g->u.get_faction()->id, false, true, position->first, - position->second, options ); + mgr.add( name, id, get_player_character().get_faction()->id, false, true, + position->first, position->second, options ); zones = get_zones(); active_index = zone_cnt - 1; @@ -7216,7 +7264,7 @@ std::vector game::find_nearby_items( int iRadius ) return ret; } - for( auto &points_p_it : closest_tripoints_first( u.pos(), iRadius ) ) { + for( auto &points_p_it : closest_points_first( u.pos(), iRadius ) ) { if( points_p_it.y >= u.posy() - iRadius && points_p_it.y <= u.posy() + iRadius && u.sees( points_p_it ) && m.sees_some_items( points_p_it, u ) ) { @@ -7245,7 +7293,8 @@ std::vector game::find_nearby_items( int iRadius ) void draw_trail( const tripoint &start, const tripoint &end, const bool bDrawX ) { std::vector pts; - tripoint center = g->u.pos() + g->u.view_offset; + avatar &player_character = get_avatar(); + tripoint center = player_character.pos() + player_character.view_offset; if( start != end ) { //Draw trail pts = line_to( start, end, 0, 0 ); @@ -7265,8 +7314,8 @@ void draw_trail( const tripoint &start, const tripoint &end, const bool bDrawX ) if( pts.empty() ) { mvwputch( g->w_terrain, point( POSX, POSY ), c_white, sym ); } else { - mvwputch( g->w_terrain, pts.back().xy() - g->u.view_offset.xy() + - point( POSX - g->u.posx(), POSY - g->u.posy() ), + mvwputch( g->w_terrain, pts.back().xy() - player_character.view_offset.xy() + + point( POSX - player_character.posx(), POSY - player_character.posy() ), c_white, sym ); } } @@ -7279,7 +7328,7 @@ void game::draw_trail_to_square( const tripoint &t, bool bDrawX ) static void centerlistview( const tripoint &active_item_position, int ui_width ) { - player &u = g->u; + player &u = get_avatar(); if( get_option( "SHIFT_LIST_ITEM_VIEW" ) != "false" ) { u.view_offset.z = active_item_position.z; if( get_option( "SHIFT_LIST_ITEM_VIEW" ) == "centered" ) { @@ -8075,7 +8124,7 @@ game::vmenu_ret game::list_monsters( const std::vector &monster_list const auto critter = monster_list[iCurMon]; const bool selected = iCurMon == iActive; ++iCurMon; - if( critter->sees( g->u ) ) { + if( critter->sees( u ) ) { mvwprintz( w_monsters, point( 0, y ), c_yellow, "!" ); } bool is_npc = false; @@ -8369,8 +8418,8 @@ static void add_disassemblables( uilist &menu, const auto &msg = string_format( pgettext( "butchery menu", "%s (%d)" ), it.tname(), stack.second ); menu.addentry_col( menu_index++, true, hotkey, msg, - to_string_clipped( time_duration::from_turns( recipe_dictionary::get_uncraft( - it.typeId() ).time / 100 ) ) ); + to_string_clipped( recipe_dictionary::get_uncraft( + it.typeId() ).time_to_craft( get_player_character() ) ) ); hotkey = -1; } } @@ -8379,25 +8428,26 @@ static void add_disassemblables( uilist &menu, // Butchery sub-menu and time calculation static void butcher_submenu( const std::vector &corpses, int corpse = -1 ) { + avatar &player_character = get_avatar(); auto cut_time = [&]( butcher_type bt ) { int time_to_cut = 0; if( corpse != -1 ) { - time_to_cut = butcher_time_to_cut( g->u, *corpses[corpse], bt ); + time_to_cut = butcher_time_to_cut( player_character, *corpses[corpse], bt ); } else { for( const map_stack::iterator &it : corpses ) { - time_to_cut += butcher_time_to_cut( g->u, *it, bt ); + time_to_cut += butcher_time_to_cut( player_character, *it, bt ); } } return to_string_clipped( time_duration::from_turns( time_to_cut / 100 ) ); }; - const bool enough_light = g->u.fine_detail_vision_mod() <= 4; + const bool enough_light = player_character.fine_detail_vision_mod() <= 4; - const int factor = g->u.max_quality( quality_id( "BUTCHER" ) ); + const int factor = player_character.max_quality( quality_id( "BUTCHER" ) ); const std::string msgFactor = factor > INT_MIN ? string_format( _( "Your best tool has %d butchering." ), factor ) : _( "You have no butchering tool." ); - const int factorD = g->u.max_quality( quality_id( "CUT_FINE" ) ); + const int factorD = player_character.max_quality( quality_id( "CUT_FINE" ) ); const std::string msgFactorD = factorD > INT_MIN ? string_format( _( "Your best tool has %d fine cutting." ), factorD ) : _( "You have no fine cutting tool." ); @@ -8498,25 +8548,25 @@ static void butcher_submenu( const std::vector &corpses, in smenu.query(); switch( smenu.ret ) { case static_cast( butcher_type::QUICK ): - g->u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true ); break; case static_cast( butcher_type::FULL ): - g->u.assign_activity( activity_id( "ACT_BUTCHER_FULL" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_BUTCHER_FULL" ), 0, true ); break; case static_cast( butcher_type::FIELD_DRESS ): - g->u.assign_activity( activity_id( "ACT_FIELD_DRESS" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_FIELD_DRESS" ), 0, true ); break; case static_cast( butcher_type::SKIN ): - g->u.assign_activity( activity_id( "ACT_SKIN" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_SKIN" ), 0, true ); break; case static_cast( butcher_type::QUARTER ): - g->u.assign_activity( activity_id( "ACT_QUARTER" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_QUARTER" ), 0, true ); break; case static_cast( butcher_type::DISMEMBER ): - g->u.assign_activity( activity_id( "ACT_DISMEMBER" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_DISMEMBER" ), 0, true ); break; case static_cast( butcher_type::DISSECT ): - g->u.assign_activity( activity_id( "ACT_DISSECT" ), 0, true ); + player_character.assign_activity( activity_id( "ACT_DISSECT" ), 0, true ); break; default: return; @@ -8672,7 +8722,8 @@ void game::butcher() int time_to_disassemble = 0; int time_to_disassemble_all = 0; for( const auto &stack : disassembly_stacks ) { - const int time = recipe_dictionary::get_uncraft( stack.first->typeId() ).time; + const int time = recipe_dictionary::get_uncraft( stack.first->typeId() ).time_to_craft_moves( + get_player_character() ); time_to_disassemble += time; time_to_disassemble_all += time * stack.second; } @@ -8941,11 +8992,11 @@ void game::reload_weapon( bool try_everything ) vehicle *veh = veh_pointer_or_null( m.veh_at( u.pos() ) ); turret_data turret; if( veh && ( turret = veh->turret_query( u.pos() ) ) && turret.can_reload() ) { - item::reload_option opt = g->u.select_ammo( *turret.base(), true ); + item::reload_option opt = u.select_ammo( *turret.base(), true ); if( opt ) { - g->u.assign_activity( activity_id( "ACT_RELOAD" ), opt.moves(), opt.qty() ); - g->u.activity.targets.emplace_back( turret.base() ); - g->u.activity.targets.push_back( std::move( opt.ammo ) ); + u.assign_activity( activity_id( "ACT_RELOAD" ), opt.moves(), opt.qty() ); + u.activity.targets.emplace_back( turret.base() ); + u.activity.targets.push_back( std::move( opt.ammo ) ); } return; } @@ -8964,6 +9015,10 @@ void game::wield( item_location loc ) debugmsg( "ERROR: tried to wield null item" ); return; } + if( &u.weapon != &*loc && u.weapon.has_item( *loc ) ) { + add_msg( m_info, _( "You need to put the bag away before trying to wield something from it." ) ); + return; + } if( u.is_armed() ) { const bool is_unwielding = u.is_wielding( *loc ); const auto ret = u.can_unwield( *loc ); @@ -8983,14 +9038,6 @@ void game::wield( item_location loc ) return; } } - if( !loc ) { - /** - * If we lost the location here, that means the thing we're - * trying to wield was inside a wielded item. - */ - add_msg( m_info, "You need to put the bag away before trying to wield something from it." ); - return; - } const auto ret = u.can_wield( *loc ); if( !ret.success() ) { @@ -9012,7 +9059,7 @@ void game::wield( item_location loc ) item to_wield = *loc.get_item(); item_location::type location_type = loc.where(); tripoint pos = loc.position(); - const int obtain_cost = loc.obtain_cost( g->u ); + const int obtain_cost = loc.obtain_cost( u ); int worn_index = INT_MIN; if( u.is_worn( *loc.get_item() ) ) { auto ret = u.can_takeoff( *loc.get_item() ); @@ -9030,7 +9077,7 @@ void game::wield( item_location loc ) switch( location_type ) { case item_location::type::container: // this will not cause things to spill, as it is inside another item - loc = loc.obtain( g->u ); + loc = loc.obtain( u ); wield( loc ); break; case item_location::type::character: @@ -9214,8 +9261,7 @@ bool game::prompt_dangerous_tile( const tripoint &dest_loc ) const !query_yn( _( "Really step into %s?" ), enumerate_as_string( harmful_stuff ) ) ) { return false; } - if( !harmful_stuff.empty() && u.is_mounted() && - m.tr_at( dest_loc ).loadid == tr_ledge ) { + if( !harmful_stuff.empty() && u.is_mounted() && m.tr_at( dest_loc ) == tr_ledge ) { add_msg( m_warning, _( "Your %s refuses to move over that ledge!" ), u.mounted_creature->get_name() ); return false; @@ -9240,7 +9286,7 @@ std::vector game::get_dangerous_tile( const tripoint &dest_loc ) co true ) ); // HACK: Hack for now, later ledge should stop being a trap // Note: in non-z-level mode, ledges obey different rules and so should be handled as regular traps - if( tr.loadid == tr_ledge && m.has_zlevels() ) { + if( tr == tr_ledge && m.has_zlevels() ) { if( !boardable ) { harmful_stuff.emplace_back( tr.name() ); } @@ -9272,7 +9318,7 @@ std::vector game::get_dangerous_tile( const tripoint &dest_loc ) co return harmful_stuff; } -bool game::walk_move( const tripoint &dest_loc ) +bool game::walk_move( const tripoint &dest_loc, const bool via_ramp ) { if( m.has_flag_ter( TFLAG_SMALL_PASSAGE, dest_loc ) ) { if( u.get_size() > creature_size::medium ) { @@ -9415,7 +9461,8 @@ bool game::walk_move( const tripoint &dest_loc ) multiplier *= 3; } - const int mcost = m.combined_movecost( u.pos(), dest_loc, grabbed_vehicle, modifier ) * multiplier; + const int mcost = m.combined_movecost( u.pos(), dest_loc, grabbed_vehicle, modifier, + via_ramp ) * multiplier; if( grabbed_move( dest_loc - u.pos() ) ) { return true; } else if( mcost == 0 ) { @@ -9963,14 +10010,14 @@ void game::place_player_overmap( const tripoint &om_dest ) place_player( player_pos ); } -bool game::phasing_move( const tripoint &dest_loc ) +bool game::phasing_move( const tripoint &dest_loc, const bool via_ramp ) { if( !u.has_active_bionic( bionic_id( "bio_probability_travel" ) ) || u.get_power_level() < 250_kJ ) { return false; } - if( dest_loc.z != u.posz() ) { + if( dest_loc.z != u.posz() && !via_ramp ) { // No vertical phasing yet return false; } @@ -10063,6 +10110,10 @@ bool game::grabbed_furn_move( const tripoint &dp ) !m.veh_at( fdest ) && ( !has_floor || m.tr_at( fdest ).is_null() ) ); + // @TODO: it should be possible to move over invisible traps. This should probably + // trigger the trap. + // The current check (no move if trap) allows a player to detect invisible traps by + // attempting to move stuff onto it. const furn_t furntype = m.furn( fpos ).obj(); const int src_items = m.i_at( fpos ).size(); @@ -10385,7 +10436,7 @@ void game::fling_creature( Creature *c, const int &dir, float flvel, bool contro // Fall down to the ground - always on the last reached tile if( !m.has_flag( "SWIMMABLE", c->pos() ) ) { - const trap_id trap_under_creature = m.tr_at( c->pos() ).loadid; + const trap &trap_under_creature = m.tr_at( c->pos() ); // Didn't smash into a wall or a floor so only take the fall damage if( thru && trap_under_creature == tr_ledge ) { m.creature_on_trap( *c, false ); @@ -10426,7 +10477,7 @@ static cata::optional point_selection_menu( const std::vectoru.pos(); + const tripoint &upos = get_player_character().pos(); uilist pmenu; pmenu.title = _( "Climb where?" ); int num = 0; @@ -10677,7 +10728,7 @@ void game::vertical_move( int movez, bool force, bool peeking ) remove_zombie( critter ); } } - auto mons = critter_tracker->find( g->u.pos() ); + auto mons = critter_tracker->find( u.pos() ); if( mons != nullptr ) { critter_tracker->remove( *mons ); } @@ -10700,7 +10751,8 @@ void game::vertical_move( int movez, bool force, bool peeking ) if( ladder && !critter.climbs() ) { continue; } - if( critter.attack_target() == &g->u || ( !critter.has_effect( effect_ridden ) && + Creature *target = critter.attack_target(); + if( ( target && target->is_avatar() ) || ( !critter.has_effect( effect_ridden ) && critter.has_effect( effect_pet ) && critter.friendly == -1 && !critter.has_effect( effect_tied ) ) ) { monsters_following.push_back( &critter ); @@ -10721,7 +10773,7 @@ void game::vertical_move( int movez, bool force, bool peeking ) m.unboard_vehicle( np->pos() ); } } - const tripoint old_pos = g->u.pos(); + const tripoint old_pos = u.pos(); const tripoint old_abs_pos = m.getabs( old_pos ); point submap_shift; vertical_shift( z_after ); @@ -10731,12 +10783,12 @@ void game::vertical_move( int movez, bool force, bool peeking ) if( u.is_mounted() ) { if( stored_mount ) { assert( !m.has_zlevels() ); - stored_mount->spawn( g->u.pos() ); + stored_mount->spawn( u.pos() ); if( critter_tracker->add( stored_mount ) ) { u.mounted_creature = stored_mount; } } else { - u.mounted_creature->setpos( g->u.pos() ); + u.mounted_creature->setpos( u.pos() ); } } // if an NPC or monster is on the stiars when player ascends/descends @@ -10787,7 +10839,7 @@ void game::vertical_move( int movez, bool force, bool peeking ) } if( !npcs_to_bring.empty() ) { // Would look nicer randomly scrambled - std::vector candidates = closest_tripoints_first( u.pos(), 1 ); + std::vector candidates = closest_points_first( u.pos(), 1 ); candidates.erase( std::remove_if( candidates.begin(), candidates.end(), [this]( const tripoint & c ) { return !is_empty( c ); @@ -10796,6 +10848,8 @@ void game::vertical_move( int movez, bool force, bool peeking ) for( const auto &np : npcs_to_bring ) { const auto found = std::find_if( candidates.begin(), candidates.end(), [this, np]( const tripoint & c ) { + // @TODO NPC should appear on top of invisible traps (and trigger them), + // instead of magically choosing tiles without dangerous traps. return !np->is_dangerous_fields( m.field_at( c ) ) && m.tr_at( c ).is_benign(); } ); if( found != candidates.end() ) { @@ -10816,9 +10870,9 @@ void game::vertical_move( int movez, bool force, bool peeking ) // This ugly check is here because of stair teleport bullshit // TODO: Remove stair teleport bullshit - if( rl_dist( g->u.pos(), old_pos ) <= 1 ) { + if( rl_dist( u.pos(), old_pos ) <= 1 ) { for( monster *m : monsters_following ) { - m->set_dest( g->u.pos() ); + m->set_dest( u.pos() ); } } @@ -11111,7 +11165,7 @@ void game::vertical_notes( int z_before, int z_after ) } } -point game::update_map( player &p ) +point game::update_map( Character &p ) { point p2( p.posx(), p.posy() ); return update_map( p2.x, p2.y ); @@ -11514,20 +11568,31 @@ void game::perhaps_add_random_npc() return; } // Create a new NPC? - // Only allow NPCs on 0 z-level, otherwise they can bug out due to lack of spots - if( !get_option( "RANDOM_NPC" ) || ( !m.has_zlevels() && get_levz() != 0 ) ) { + + double spawn_time = get_option( "NPC_SPAWNTIME" ); + if( spawn_time == 0.0 ) { return; } - float density = get_option( "NPC_DENSITY" ); - static constexpr int density_search_radius = 60; - const float npc_num = overmap_buffer.get_npcs_near_player( density_search_radius ).size(); - if( npc_num > 0.0 ) { + // spawn algorithm is a chance per hour, but the config is specified in average days + // actual chance per hour is (100 / 24 ) / days + static constexpr double days_to_rate_factor = 100.0 / 24; + double spawn_rate = days_to_rate_factor / spawn_time; + static constexpr int radius_spawn_range = 90; + std::vector> npcs = overmap_buffer.get_npcs_near_player( radius_spawn_range ); + size_t npc_num = npcs.size(); + for( auto &npc : npcs ) { + if( npc->has_trait( trait_NPC_STATIC_NPC ) || npc->has_trait( trait_NPC_STARTING_NPC ) ) { + npc_num--; + } + } + + if( npc_num > 0 ) { // 100%, 80%, 64%, 52%, 41%, 33%... - density *= std::pow( 0.8f, npc_num ); + spawn_rate *= std::pow( 0.8f, npc_num ); } - if( !x_in_y( density, 100 ) ) { + if( !x_in_y( spawn_rate, 100 ) ) { return; } bool spawn_allowed = false; @@ -11537,7 +11602,6 @@ void game::perhaps_add_random_npc() if( counter >= 10 ) { return; } - static constexpr int radius_spawn_range = 120; const tripoint u_omt = u.global_omt_location(); spawn_point = u_omt + point( rng( -radius_spawn_range, radius_spawn_range ), rng( -radius_spawn_range, radius_spawn_range ) ); @@ -11559,6 +11623,7 @@ void game::perhaps_add_random_npc() faction_id( "no_faction" ) ); tmp->set_fac( new_solo_fac ? new_solo_fac->id : faction_id( "no_faction" ) ); // adds the npc to the correct overmap. + // Only spawn random NPCs on z-level 0 tripoint submap_spawn = omt_to_sm_copy( spawn_point ); tmp->spawn_at_sm( tripoint( submap_spawn.xy(), 0 ) ); overmap_buffer.insert_npc( tmp ); @@ -11639,7 +11704,7 @@ void game::display_visibility() uilist creature_menu; int num_creatures = 0; creature_menu.addentry( num_creatures++, true, MENU_AUTOASSIGN, "%s", _( "You" ) ); - locations.emplace_back( g->u.pos() ); // add player first. + locations.emplace_back( get_player_character().pos() ); // add player first. for( const Creature &critter : g->all_creatures() ) { if( critter.is_player() ) { continue; @@ -11820,7 +11885,7 @@ void game::process_artifact( item &it, player &p ) case ARTC_PORTAL: for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) { m.remove_field( dest, fd_fatigue ); - if( m.tr_at( dest ).loadid == tr_portal ) { + if( m.tr_at( dest ) == tr_portal ) { add_msg( m_good, _( "The portal collapses!" ) ); m.remove_trap( dest ); it.charges++; @@ -11962,7 +12027,7 @@ void game::process_artifact( item &it, player &p ) //Check if an artifact's extra charge requirements are currently met bool check_art_charge_req( item &it ) { - player &p = g->u; + avatar &p = get_avatar(); bool reqsmet = true; const bool worn = p.is_worn( it ); const bool wielded = ( &it == &p.weapon ); @@ -12260,7 +12325,7 @@ void game::add_artifact_dreams( ) { //If player is sleeping, get a dream from a carried artifact //Don't need to check that player is sleeping here, that's done before calling - std::list art_items = g->u.get_artifact_items(); + std::list art_items = get_avatar().get_artifact_items(); std::vector valid_arts; std::vector> valid_dreams; // Tracking separately so we only need to check its req once @@ -12328,7 +12393,7 @@ std::vector game::allies() { return get_npcs_if( [&]( const npc & guy ) { if( !guy.is_hallucination() ) { - return guy.is_ally( g->u ); + return guy.is_ally( get_player_character() ); } else { return false; } @@ -12388,7 +12453,7 @@ bool game::non_dead_range::iterator::valid() if( critter->is_npc() ) { return !static_cast( critter )->is_dead(); } - return true; // must be g->u + return true; // must be the avatar } game::monster_range::monster_range( game &game_ref ) diff --git a/src/game.h b/src/game.h index 509b4218ef7dc..44d0eaa7f41e3 100644 --- a/src/game.h +++ b/src/game.h @@ -88,7 +88,6 @@ enum safe_mode_type { }; enum body_part : int; -enum weather_type : int; enum action_id : int; struct special_game; @@ -106,6 +105,7 @@ class player; class save_t; class scenario; class stats_tracker; +template class tripoint_range; class vehicle; struct WORLD; @@ -149,6 +149,10 @@ class game friend class editmap; friend class advanced_inventory; friend class main_menu; + friend map &get_map(); + friend Character &get_player_character(); + friend avatar &get_avatar(); + friend weather_manager &get_weather(); public: game(); ~game(); @@ -335,9 +339,9 @@ class game monster *place_critter_around( const mtype_id &id, const tripoint ¢er, int radius ); monster *place_critter_around( const shared_ptr_fast &mon, const tripoint ¢er, int radius ); - monster *place_critter_within( const mtype_id &id, const tripoint_range &range ); + monster *place_critter_within( const mtype_id &id, const tripoint_range &range ); monster *place_critter_within( const shared_ptr_fast &mon, - const tripoint_range &range ); + const tripoint_range &range ); /** @} */ /** * Returns the approximate number of creatures in the reality bubble. @@ -352,6 +356,11 @@ class game void clear_zombies(); /** Spawns a hallucination at a determined position. */ bool spawn_hallucination( const tripoint &p ); + /** Spawns a hallucination at a determined position of a given monster. */ + bool spawn_hallucination( const tripoint &p, const mtype_id &mt ); + /** Finds somewhere to spawn a monster. */ + bool find_nearby_spawn_point( const Character &target, const mtype_id &mt, int min_radius, + int max_radius, tripoint &point ); /** Swaps positions of two creatures */ bool swap_critters( Creature &, Creature & ); @@ -554,7 +563,7 @@ class game Creature *is_hostile_very_close(); // Handles shifting coordinates transparently when moving between submaps. // Helper to make calling with a player pointer less verbose. - point update_map( player &p ); + point update_map( Character &p ); point update_map( int &x, int &y ); void update_overmap_seen(); // Update which overmap tiles we can see @@ -741,9 +750,9 @@ class game bool npc_menu( npc &who ); // Handle phasing through walls, returns true if it handled the move - bool phasing_move( const tripoint &dest ); + bool phasing_move( const tripoint &dest, bool via_ramp = false ); // Regular movement. Returns false if it failed for any reason - bool walk_move( const tripoint &dest ); + bool walk_move( const tripoint &dest, bool via_ramp = false ); void on_move_effects(); private: // Game-start procedures @@ -964,9 +973,8 @@ class game pimpl memorial_logger_ptr; pimpl spell_events_ptr; - public: - /** Make map a reference here, to avoid map.h in game.h */ map &m; + public: avatar &u; scent_map &scent; timed_event_manager &timed_events; diff --git a/src/game_constants.h b/src/game_constants.h index 992deb9350c07..3ca2b90b1cae7 100644 --- a/src/game_constants.h +++ b/src/game_constants.h @@ -160,10 +160,10 @@ constexpr int SIMPLEX_NOISE_RANDOM_SEED_LIMIT = 32768; * did this activity for a longer period of time. */ constexpr float NO_EXERCISE = 1.2f; -constexpr float LIGHT_EXERCISE = 1.375f; -constexpr float MODERATE_EXERCISE = 1.55f; -constexpr float ACTIVE_EXERCISE = 1.725f; -constexpr float EXTRA_EXERCISE = 1.9f; +constexpr float LIGHT_EXERCISE = 2.0f; +constexpr float MODERATE_EXERCISE = 4.5f; +constexpr float ACTIVE_EXERCISE = 8.0f; +constexpr float EXTRA_EXERCISE = 10.0f; // these are the lower bounds of each of the weight classes. namespace character_weight_category diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index 6fd14fd68d518..cbd0adc129b3c 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -468,7 +468,7 @@ class disassemble_inventory_preset : public pickup_inventory_preset }, _( "YIELD" ) ); append_cell( [ this ]( const item_location & loc ) { - return to_string_clipped( time_duration::from_turns( get_recipe( loc ).time / 100 ) ); + return to_string_clipped( get_recipe( loc ).time_to_craft( get_player_character() ) ); }, _( "TIME" ) ); } @@ -1297,7 +1297,7 @@ void game_menus::inv::insert_items( avatar &you, item_location &holster ) item &it = *holstered_item.first; bool success = false; if( !it.count_by_charges() || it.count() == holstered_item.second ) { - if( holster->can_contain( it ) ) { + if( holster->contents.can_contain( it ).success() ) { holster->put_in( it, item_pocket::pocket_type::CONTAINER ); holstered_item.first.remove_item(); success = true; @@ -1306,7 +1306,7 @@ void game_menus::inv::insert_items( avatar &you, item_location &holster ) item item_copy( it ); item_copy.charges = holstered_item.second; if( holster->can_contain( item_copy ) ) { - holster->put_in( it, item_pocket::pocket_type::CONTAINER ); + holster->put_in( item_copy, item_pocket::pocket_type::CONTAINER ); it.charges -= holstered_item.second; success = true; } diff --git a/src/gamemode_tutorial.cpp b/src/gamemode_tutorial.cpp index 044a618fd437d..20ee208fdd855 100644 --- a/src/gamemode_tutorial.cpp +++ b/src/gamemode_tutorial.cpp @@ -121,9 +121,7 @@ bool tutorial_game::init() g->u.int_cur = g->u.int_max; g->u.dex_cur = g->u.dex_max; - for( int i = 0; i < num_hp_parts; i++ ) { - g->u.hp_cur[i] = g->u.hp_max[i]; - } + g->u.set_all_parts_hp_to_max(); const oter_id rock( "rock" ); //~ default name for the tutorial diff --git a/src/gates.cpp b/src/gates.cpp index 71a0e178799a9..091f654fbf926 100644 --- a/src/gates.cpp +++ b/src/gates.cpp @@ -218,7 +218,7 @@ void gates::open_gate( const tripoint &pos ) } } - if( g->u.sees( pos ) ) { + if( get_player_character().sees( pos ) ) { if( open ) { add_msg( gate.open_message ); } else if( close ) { @@ -277,7 +277,7 @@ void doors::close_door( map &m, Character &who, const tripoint &closep ) const int inside_closable = veh->next_part_to_close( vpart ); const int openable = veh->next_part_to_open( vpart ); if( closable >= 0 ) { - if( !veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( !veh->handle_potential_theft( get_avatar() ) ) { return; } veh->close( closable ); diff --git a/src/grab.cpp b/src/grab.cpp index ffa5a942f3d76..a4526ad0c4564 100644 --- a/src/grab.cpp +++ b/src/grab.cpp @@ -27,7 +27,7 @@ bool game::grabbed_veh_move( const tripoint &dp ) } vehicle *grabbed_vehicle = &grabbed_vehicle_vp->vehicle(); if( !grabbed_vehicle || - !grabbed_vehicle->handle_potential_theft( dynamic_cast( g->u ) ) ) { + !grabbed_vehicle->handle_potential_theft( get_avatar() ) ) { return false; } const int grabbed_part = grabbed_vehicle_vp->part_index(); @@ -185,7 +185,10 @@ bool game::grabbed_veh_move( const tripoint &dp ) m.displace_vehicle( *grabbed_vehicle, final_dp_veh ); - if( !grabbed_vehicle ) { + if( grabbed_vehicle ) { + m.level_vehicle( *grabbed_vehicle ); + grabbed_vehicle->check_falling_or_floating(); + } else { debugmsg( "Grabbed vehicle disappeared" ); return false; } diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 5962b2fae79f4..d896ee2d6917b 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -110,10 +110,11 @@ static const bionic_id bio_remote( "bio_remote" ); static const trait_id trait_HIBERNATE( "HIBERNATE" ); static const trait_id trait_PROF_CHURL( "PROF_CHURL" ); -static const trait_id trait_PROF_HELI_PILOT( "PROF_HELI_PILOT" ); static const trait_id trait_SHELL2( "SHELL2" ); static const trait_id trait_WAYFARER( "WAYFARER" ); +static const proficiency_id proficiency_prof_helicopter_pilot( "prof_helicopter_pilot" ); + static const std::string flag_LITCIG( "LITCIG" ); static const std::string flag_LOCKED( "LOCKED" ); static const std::string flag_MAGIC_FOCUS( "MAGIC_FOCUS" ); @@ -221,7 +222,7 @@ input_context game::get_player_input( std::string &action ) } //x% of the Viewport, only shown on visible areas - const auto weather_info = get_weather_animation( weather.weather ); + const auto weather_info = weather.weather_id->weather_animation; point offset( u.view_offset.xy() + point( -getmaxx( w_terrain ) / 2 + u.posx(), -getmaxy( w_terrain ) / 2 + u.posy() ) ); @@ -243,7 +244,7 @@ input_context game::get_player_input( std::string &action ) weather_printable wPrint; wPrint.colGlyph = weather_info.color; wPrint.cGlyph = weather_info.glyph; - wPrint.wtype = weather.weather; + wPrint.wtype = weather.weather_id; wPrint.vdrops.clear(); ctxt.set_timeout( 125 ); @@ -436,7 +437,7 @@ static void pldrive( const tripoint &p ) } } if( p.z != 0 ) { - if( !u.has_trait( trait_PROF_HELI_PILOT ) ) { + if( !u.has_proficiency( proficiency_prof_helicopter_pilot ) ) { u.add_msg_if_player( m_info, _( "You have no idea how to make the vehicle fly." ) ); return; } @@ -792,7 +793,7 @@ static void smash() if( !u.has_weapon() && hard_target ) { int dam = roll_remainder( 5.0 * ( 1 - glove_coverage / 100.0 ) ); - if( u.hp_cur[hp_arm_r] > u.hp_cur[hp_arm_l] ) { + if( u.get_part_hp_cur( bodypart_id( "arm_r" ) ) > u.get_part_hp_cur( bodypart_id( "arm_l" ) ) ) { u.deal_damage( nullptr, bodypart_id( "hand_r" ), damage_instance( DT_BASH, dam ) ); } else { u.deal_damage( nullptr, bodypart_id( "hand_l" ), damage_instance( DT_BASH, dam ) ); @@ -1372,7 +1373,8 @@ static void open_movement_mode_menu() for( size_t i = 0; i < modes.size(); ++i ) { const move_mode_id &curr = modes[i]; - as_m.entries.emplace_back( i, u.can_switch_to( curr ), curr->letter(), curr->name() ); + as_m.entries.emplace_back( static_cast( i ), u.can_switch_to( curr ), curr->letter(), + curr->name() ); } as_m.entries.emplace_back( cycle, u.can_switch_to( u.current_movement_mode()->cycle() ), '"', _( "Cycle move mode" ) ); @@ -1389,9 +1391,11 @@ static void open_movement_mode_menu() } } +static bool assign_spellcasting( avatar &you, spell &sp, bool fake_spell ); + static void cast_spell() { - player &u = g->u; + avatar &u = g->u; std::vector spells = u.magic.spells(); @@ -1421,35 +1425,45 @@ static void cast_spell() spell &sp = *u.magic.get_spells()[spell_index]; - if( u.is_armed() && !sp.has_flag( spell_flag::NO_HANDS ) && - !u.weapon.has_flag( flag_MAGIC_FOCUS ) ) { + assign_spellcasting( u, sp, false ); +} + +// returns if the spell was assigned +static bool assign_spellcasting( avatar &you, spell &sp, bool fake_spell ) +{ + if( you.is_armed() && !sp.has_flag( spell_flag::NO_HANDS ) && + !you.weapon.has_flag( flag_MAGIC_FOCUS ) ) { add_msg( game_message_params{ m_bad, gmf_bypass_cooldown }, _( "You need your hands free to cast this spell!" ) ); - return; + return false; } - if( !u.magic.has_enough_energy( u, sp ) ) { + if( !you.magic.has_enough_energy( you, sp ) ) { add_msg( game_message_params{ m_bad, gmf_bypass_cooldown }, _( "You don't have enough %s to cast the spell." ), sp.energy_string() ); - return; + return false; } - if( sp.energy_source() == magic_energy_type::hp && !u.has_quality( qual_CUT ) ) { + if( sp.energy_source() == magic_energy_type::hp && !you.has_quality( qual_CUT ) ) { add_msg( game_message_params{ m_bad, gmf_bypass_cooldown }, _( "You cannot cast Blood Magic without a cutting implement." ) ); - return; + return false; } - player_activity cast_spell( ACT_SPELLCASTING, sp.casting_time( u ) ); + player_activity cast_spell( ACT_SPELLCASTING, sp.casting_time( you ) ); // [0] this is used as a spell level override for items casting spells - cast_spell.values.emplace_back( -1 ); + if( fake_spell ) { + cast_spell.values.emplace_back( sp.get_level() ); + } else { + cast_spell.values.emplace_back( -1 ); + } // [1] if this value is 1, the spell never fails cast_spell.values.emplace_back( 0 ); // [2] this value overrides the mana cost if set to 0 cast_spell.values.emplace_back( 1 ); cast_spell.name = sp.id().c_str(); - if( u.magic.casting_ignore ) { + if( you.magic.casting_ignore ) { const std::vector ignored_distractions = { distraction_type::noise, distraction_type::pain, @@ -1465,7 +1479,19 @@ static void cast_spell() cast_spell.ignore_distraction( ignored ); } } - u.assign_activity( cast_spell, false ); + you.assign_activity( cast_spell, false ); + return true; +} + +// this is here because it shares some things in common with cast_spell +bool bionic::activate_spell( Character &caster ) +{ + if( !caster.is_avatar() || !id->spell_on_activate ) { + // the return value tells us if the spell fails. if it has no spell it can't fail + return true; + } + spell sp = id->spell_on_activate->get_spell(); + return assign_spellcasting( *caster.as_avatar(), sp, true ); } void game::open_consume_item_menu() @@ -2227,6 +2253,12 @@ bool game::handle_action() } break; + case ACTION_WORKOUT: + if( query_yn( _( "Start workout?" ) ) ) { + u.assign_activity( player_activity( workout_activity_actor( u.pos() ) ) ); + } + break; + case ACTION_SUICIDE: if( query_yn( _( "Commit suicide?" ) ) ) { if( query_yn( _( "REALLY commit suicide?" ) ) ) { diff --git a/src/iexamine.cpp b/src/iexamine.cpp index b72dc283f3485..a6efac7f6eb92 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -63,6 +63,7 @@ #include "messages.h" #include "mission_companion.h" #include "monster.h" +#include "morale_types.h" #include "mtype.h" #include "npc.h" #include "options.h" @@ -102,11 +103,20 @@ static const activity_id ACT_FORAGE( "ACT_FORAGE" ); static const activity_id ACT_OPERATION( "ACT_OPERATION" ); static const activity_id ACT_PLANT_SEED( "ACT_PLANT_SEED" ); +static const efftype_id effect_antibiotic( "antibiotic" ); +static const efftype_id effect_bite( "bite" ); +static const efftype_id effect_bleed( "bleed" ); +static const efftype_id effect_disinfected( "disinfected" ); static const efftype_id effect_earphones( "earphones" ); +static const efftype_id effect_infected( "infected" ); static const efftype_id effect_mending( "mending" ); static const efftype_id effect_pkill2( "pkill2" ); static const efftype_id effect_sleep( "sleep" ); +static const efftype_id effect_strong_antibiotic( "strong_antibiotic" ); +static const efftype_id effect_strong_antibiotic_visible( "strong_antibiotic_visible" ); static const efftype_id effect_teleglow( "teleglow" ); +static const efftype_id effect_tetanus( "tetanus" ); +static const efftype_id effect_weak_antibiotic( "weak_antibiotic" ); static const itype_id itype_2x4( "2x4" ); static const itype_id itype_bot_broken_cyborg( "bot_broken_cyborg" ); @@ -148,6 +158,7 @@ static const skill_id skill_cooking( "cooking" ); static const skill_id skill_fabrication( "fabrication" ); static const skill_id skill_mechanics( "mechanics" ); static const skill_id skill_survival( "survival" ); +static const skill_id skill_traps( "traps" ); static const trait_id trait_AMORPHOUS( "AMORPHOUS" ); static const trait_id trait_ARACHNID_ARMS_OK( "ARACHNID_ARMS_OK" ); @@ -888,7 +899,7 @@ void iexamine::elevator( player &p, const tripoint &examp ) } else if( here.ter( critter.pos() ) == ter_id( "t_elevator" ) ) { tripoint critter_omt = ms_to_omt_copy( here.getabs( critter.pos() ) ); if( critter_omt == new_floor_omt ) { - for( const tripoint &candidate : closest_tripoints_first( critter.pos(), 10 ) ) { + for( const tripoint &candidate : closest_points_first( critter.pos(), 10 ) ) { if( here.ter( candidate ) != ter_id( "t_elevator" ) && here.passable( candidate ) && !g->critter_at( candidate ) ) { @@ -911,7 +922,7 @@ void iexamine::elevator( player &p, const tripoint &examp ) tripoint critter_omt = ms_to_omt_copy( here.getabs( critter.pos() ) ); if( critter_omt == original_floor_omt ) { - for( const tripoint &candidate : closest_tripoints_first( p.pos(), 10 ) ) { + for( const tripoint &candidate : closest_points_first( p.pos(), 10 ) ) { if( here.ter( candidate ) == ter_id( "t_elevator" ) && candidate != p.pos() && !g->critter_at( candidate ) ) { @@ -1065,7 +1076,7 @@ void iexamine::rubble( player &p, const tripoint &examp ) return; } map &here = get_map(); - if( ( here.veh_at( examp ) || !here.tr_at( examp ).is_null() || + if( ( here.veh_at( examp ) || here.can_see_trap_at( examp, p ) || g->critter_at( examp ) != nullptr ) && !query_yn( _( "Clear up that %s?" ), here.furnname( examp ) ) ) { return; @@ -1139,9 +1150,11 @@ void iexamine::bars( player &p, const tripoint &examp ) return; } map &here = get_map(); - if( ( ( p.encumb( bp_torso ) ) >= 10 ) && ( ( p.encumb( bp_head ) ) >= 10 ) && - ( p.encumb( bp_foot_l ) >= 10 || - p.encumb( bp_foot_r ) >= 10 ) ) { // Most likely places for rigid gear that would catch on the bars. + if( ( ( p.encumb( bodypart_id( "torso" ) ) ) >= 10 ) && + ( ( p.encumb( bodypart_id( "head" ) ) ) >= 10 ) && + ( p.encumb( bodypart_id( "foot_l" ) ) >= 10 || + p.encumb( bodypart_id( "foot_r" ) ) >= + 10 ) ) { // Most likely places for rigid gear that would catch on the bars. add_msg( m_info, _( "Your amorphous body could slip though the %s, but your cumbersome gear can't." ), here.tername( examp ) ); @@ -1989,7 +2002,7 @@ void iexamine::egg_sack_generic( player &p, const tripoint &examp, here.furn_set( examp, f_egg_sacke ); int monster_count = 0; if( one_in( 2 ) ) { - for( const tripoint &nearby_pos : closest_tripoints_first( examp, 1 ) ) { + for( const tripoint &nearby_pos : closest_points_first( examp, 1 ) ) { if( !one_in( 3 ) ) { continue; } else if( g->place_critter_at( montype, nearby_pos ) ) { @@ -3553,7 +3566,7 @@ void iexamine::shrub_wildveggies( player &p, const tripoint &examp ) // Ask if there's something possibly more interesting than this shrub here if( ( !here.i_at( examp ).empty() || here.veh_at( examp ) || - !here.tr_at( examp ).is_null() || + here.can_see_trap_at( examp, p ) || g->critter_at( examp ) != nullptr ) && !query_yn( _( "Forage through %s?" ), here.tername( examp ) ) ) { none( p, examp ); @@ -3680,57 +3693,98 @@ void iexamine::recycle_compactor( player &, const tripoint &examp ) } } -void iexamine::trap( player &p, const tripoint &examp ) +void trap::examine( const tripoint &examp ) const { map &here = get_map(); - const auto &tr = here.tr_at( examp ); - if( !p.is_player() || tr.is_null() ) { + + // If the player can't see the trap, they can't interact with it. + if( !can_see( examp, g->u ) ) { return; } - const int possible = tr.get_difficulty(); - bool seen = tr.can_see( examp, p ); - if( tr.loadid == tr_unfinished_construction || here.partial_con_at( examp ) ) { - partial_con *pc = here.partial_con_at( examp ); - if( pc ) { - if( g->u.fine_detail_vision_mod() > 4 && !g->u.has_trait( trait_DEBUG_HS ) ) { - add_msg( m_info, _( "It is too dark to construct right now." ) ); - return; - } - const construction &built = pc->id.obj(); - if( !query_yn( _( "Unfinished task: %s, %d%% complete here, continue construction?" ), - built.description, pc->counter / 100000 ) ) { - if( query_yn( _( "Cancel construction?" ) ) ) { - here.disarm_trap( examp ); - for( const item &it : pc->components ) { - here.add_item_or_charges( g->u.pos(), it ); - } - here.partial_con_remove( examp ); - return; - } else { - return; + + if( g->u.is_mounted() ) { + add_msg( m_warning, _( "You cannot do that while mounted." ) ); + return; + } + + if( partial_con *const pc = here.partial_con_at( examp ) ) { + if( g->u.fine_detail_vision_mod() > 4 && !g->u.has_trait( trait_DEBUG_HS ) ) { + add_msg( m_info, _( "It is too dark to construct right now." ) ); + return; + } + const construction &built = pc->id.obj(); + if( !query_yn( _( "Unfinished task: %s, %d%% complete here, continue construction?" ), + built.description, pc->counter / 100000 ) ) { + if( query_yn( _( "Cancel construction?" ) ) ) { + on_disarmed( here, examp ); + for( const item &it : pc->components ) { + here.add_item_or_charges( g->u.pos(), it ); } - } else { - g->u.assign_activity( ACT_BUILD ); - g->u.activity.placement = here.getabs( examp ); - return; + here.partial_con_remove( examp ); } } else { - return; + g->u.assign_activity( ACT_BUILD ); + g->u.activity.placement = here.getabs( examp ); } + return; } - if( seen && possible >= 99 ) { - add_msg( m_info, _( "That %s looks too dangerous to mess with. Best leave it alone." ), - tr.name() ); + if( can_not_be_disarmed() ) { + add_msg( m_info, _( "That %s looks too dangerous to mess with. Best leave it alone." ), name() ); return; } - // Some traps are not actual traps. Those should get a different query. - if( seen && possible == 0 && - tr.get_avoidance() == 0 ) { // Separated so saying no doesn't trigger the other query. - if( query_yn( _( "There is a %s there. Take down?" ), tr.name() ) ) { - here.disarm_trap( examp ); + + // Some traps are not actual traps. Those should get a different query, no skill checks, and the option to grab it right away. + if( easy_take_down() ) { // Separated so saying no doesn't trigger the other query. + if( !query_yn( _( "There is a %s there. Take down?" ), name() ) ) { + return; } - } else if( seen && query_yn( _( "There is a %s there. Disarm?" ), tr.name() ) ) { - here.disarm_trap( examp ); + add_msg( _( "The %s is taken down." ), name() ); + on_disarmed( here, examp ); + return; + } + + if( query_yn( _( "There is a %s there. Disarm?" ), name() ) ) { + const int tSkillLevel = g->u.get_skill_level( skill_traps ); + int roll = rng( tSkillLevel, 4 * tSkillLevel ); + + ///\EFFECT_PER increases chance of disarming trap + + ///\EFFECT_DEX increases chance of disarming trap + + ///\EFFECT_TRAPS increases chance of disarming trap + while( ( rng( 5, 20 ) < g->u.per_cur || rng( 1, 20 ) < g->u.dex_cur ) && roll < 50 ) { + roll++; + } + if( roll >= difficulty ) { + add_msg( _( "You disarm the trap!" ) ); + const int morale_buff = avoidance * 0.4 + difficulty + rng( 0, 4 ); + g->u.rem_morale( MORALE_FAILURE ); + g->u.add_morale( MORALE_ACCOMPLISHMENT, morale_buff, 40 ); + on_disarmed( here, examp ); + if( difficulty > 1.25 * tSkillLevel ) { // failure might have set off trap + g->u.practice( skill_traps, 1.5 * ( difficulty - tSkillLevel ) ); + } + } else if( roll >= difficulty * .8 ) { + add_msg( _( "You fail to disarm the trap." ) ); + const int morale_debuff = -rng( 6, 18 ); + g->u.rem_morale( MORALE_ACCOMPLISHMENT ); + g->u.add_morale( MORALE_FAILURE, morale_debuff, -40 ); + if( difficulty > 1.25 * tSkillLevel ) { + g->u.practice( skill_traps, 1.5 * ( difficulty - tSkillLevel ) ); + } + } else { + add_msg( m_bad, _( "You fail to disarm the trap, and you set it off!" ) ); + const int morale_debuff = -rng( 12, 24 ); + g->u.rem_morale( MORALE_ACCOMPLISHMENT ); + g->u.add_morale( MORALE_FAILURE, morale_debuff, -40 ); + trigger( examp, g->u ); + if( difficulty - roll <= 6 ) { + // Give xp for failing, but not if we failed terribly (in which + // case the trap may not be disarmable). + g->u.practice( skill_traps, 2 * difficulty ); + } + } + return; } } @@ -3978,14 +4032,14 @@ cata::optional iexamine::getNearFilledGasTank( const tripoint ¢er, map &here = get_map(); for( const tripoint &tmp : here.points_in_radius( center, SEEX * 2 ) ) { - auto checkingTerr = here.ter( tmp ); + auto check_for_fuel_tank = here.furn( tmp ); if( fuel_type == "gasoline" ) { - if( checkingTerr != ter_str_id( "t_gas_tank" ) ) { + if( check_for_fuel_tank != furn_str_id( "f_gas_tank" ) ) { continue; } } else if( fuel_type == "diesel" ) { - if( checkingTerr != ter_str_id( "t_diesel_tank" ) ) { + if( check_for_fuel_tank != furn_str_id( "f_diesel_tank" ) ) { continue; } } @@ -4587,6 +4641,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) INSTALL_CBM, UNINSTALL_CBM, BONESETTING, + TREAT_WOUNDS, }; bool adjacent_couch = false; @@ -4669,6 +4724,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) amenu.addentry( INSTALL_CBM, true, 'i', _( "Choose Compact Bionic Module to install" ) ); amenu.addentry( UNINSTALL_CBM, true, 'u', _( "Choose installed bionic to uninstall" ) ); amenu.addentry( BONESETTING, true, 's', _( "Splint broken limbs" ) ); + amenu.addentry( TREAT_WOUNDS, true, 'w', _( "Treat wounds" ) ); amenu.query(); @@ -4793,9 +4849,8 @@ void iexamine::autodoc( player &p, const tripoint &examp ) case BONESETTING: { int broken_limbs_count = 0; - for( int i = 0; i < num_hp_parts; i++ ) { - const bool broken = patient.is_limb_broken( static_cast( i ) ); - const bodypart_id &part = convert_bp( player::hp_to_bp( static_cast( i ) ) ).id(); + for( const bodypart_id &part : patient.get_all_body_parts( true ) ) { + const bool broken = patient.is_limb_broken( part ); effect &existing_effect = patient.get_effect( effect_mending, part->token ); // Skip part if not broken or already healed 50% if( !broken || ( !existing_effect.is_null() && @@ -4811,9 +4866,9 @@ void iexamine::autodoc( player &p, const tripoint &examp ) // TODO: fail here if unable to perform the action, i.e. can't wear more, trait mismatch. if( !patient.worn_with_flag( flag_SPLINT, part ) ) { item splint; - if( i == hp_arm_l || i == hp_arm_r ) { + if( part == bodypart_id( "arm_l" ) || part == bodypart_id( "arm_r" ) ) { splint = item( "arm_splint", 0 ); - } else if( i == hp_leg_l || i == hp_leg_r ) { + } else if( part == bodypart_id( "leg_l" ) || part == bodypart_id( "leg_r" ) ) { splint = item( "leg_splint", 0 ); } item &equipped_splint = patient.i_add( splint ); @@ -4831,6 +4886,69 @@ void iexamine::autodoc( player &p, const tripoint &examp ) break; } + case TREAT_WOUNDS: { + if( !patient.has_effect( effect_bleed ) && !patient.has_effect( effect_infected ) && + !patient.has_effect( effect_bite ) ) { + p.add_msg_player_or_npc( m_info, _( "You don't have any wounds that need treatment." ), + _( " doesn't have any wounds that need treatment." ) ); + return; + } + + if( patient.has_effect( effect_infected ) || patient.has_effect( effect_tetanus ) ) { + if( patient.has_effect( effect_strong_antibiotic ) || + patient.has_effect( effect_antibiotic ) || + patient.has_effect( effect_weak_antibiotic ) ) { + patient.add_msg_player_or_npc( m_info, + _( "The autodoc detected a bacterial infection in your body, but as it also detected you've already taken antibiotics, it decided not to apply another dose right now." ), + _( "The autodoc detected a bacterial infection in 's body, but as it also detected you've already taken antibiotics, it decided not to apply another dose right now." ) ); + } else { + patient.add_effect( effect_strong_antibiotic, 12_hours ); + patient.add_effect( effect_strong_antibiotic_visible, rng( 9_hours, 15_hours ) ); + patient.mod_pain( 3 ); + patient.add_msg_player_or_npc( m_good, + _( "The autodoc detected a bacterial infection in your body and injected antibiotics to treat it." ), + _( "The autodoc detected a bacterial infection in 's body and injected antibiotics to treat it." ) ); + + if( patient.has_effect( effect_tetanus ) ) { + if( one_in( 3 ) ) { + patient.remove_effect( effect_tetanus ); + patient.add_msg_if_player( m_good, _( "The muscle spasms start to go away." ) ); + } else { + patient.add_msg_if_player( m_warning, _( "The medication does nothing to help the spasms." ) ); + } + } + } + } + + for( const bodypart_id &bp_healed : patient.get_all_body_parts( true ) ) { + if( patient.has_effect( effect_bleed, bp_healed->token ) ) { + patient.remove_effect( effect_bleed, bp_healed->token ); + patient.add_msg_player_or_npc( m_good, + _( "The autodoc detected a bleeding on your %s and applied a hemostatic drug to stop it." ), + _( "The autodoc detected a bleeding on 's %s and applied a hemostatic drug to stop it." ), + body_part_name( bp_healed ) ); + } + + if( patient.has_effect( effect_bite, bp_healed->token ) ) { + patient.remove_effect( effect_bite, bp_healed->token ); + patient.add_msg_player_or_npc( m_good, + _( "The autodoc detected an open wound on your %s and applied a disinfectant to clean it." ), + _( "The autodoc detected an open wound on 's %s and applied a disinfectant to clean it." ), + body_part_name( bp_healed ) ); + + // Fixed disinfectant intensity of 4 disinfectant_power + 10 first aid skill level of autodoc. + const int disinfectant_intensity = 14; + patient.add_effect( effect_disinfected, 1_turns, bp_healed->token ); + effect &e = patient.get_effect( effect_disinfected, bp_healed->token ); + e.set_duration( e.get_int_dur_factor() * disinfectant_intensity ); + patient.set_part_damage_disinfected( bp_healed, + patient.get_part_hp_max( bp_healed ) - patient.get_part_hp_cur( bp_healed ) ); + } + } + patient.moves -= 500; + break; + } + default: return; } @@ -5878,6 +5996,15 @@ void iexamine::workbench_internal( player &p, const tripoint &examp, } } +void iexamine::workout( player &p, const tripoint &examp ) +{ + if( !query_yn( _( "Use the %s to exercise?" ), get_map().furnname( examp ) ) ) { + none( p, examp ); + return; + } + p.assign_activity( player_activity( workout_activity_actor( examp ) ) ); +} + /** * Given then name of one of the above functions, returns the matching function * pointer. If no match is found, defaults to iexamine::none but prints out a @@ -5942,7 +6069,6 @@ iexamine_function iexamine_function_from_string( const std::string &function_nam { "tree_maple_tapped", &iexamine::tree_maple_tapped }, { "shrub_wildveggies", &iexamine::shrub_wildveggies }, { "recycle_compactor", &iexamine::recycle_compactor }, - { "trap", &iexamine::trap }, { "water_source", &iexamine::water_source }, { "clean_water_source", &iexamine::clean_water_source }, { "reload_furniture", &iexamine::reload_furniture }, @@ -5964,7 +6090,8 @@ iexamine_function iexamine_function_from_string( const std::string &function_nam { "quern_examine", &iexamine::quern_examine }, { "smoker_options", &iexamine::smoker_options }, { "open_safe", &iexamine::open_safe }, - { "workbench", &iexamine::workbench } + { "workbench", &iexamine::workbench }, + { "workout", &iexamine::workout } } }; diff --git a/src/iexamine.h b/src/iexamine.h index 9e4b2e2ca4c33..2c59f1743d7f0 100644 --- a/src/iexamine.h +++ b/src/iexamine.h @@ -82,7 +82,6 @@ void shrub_marloss( player &p, const tripoint &examp ); void tree_marloss( player &p, const tripoint &examp ); void shrub_wildveggies( player &p, const tripoint &examp ); void recycle_compactor( player &p, const tripoint &examp ); -void trap( player &p, const tripoint &examp ); void water_source( player &p, const tripoint &examp ); void clean_water_source( player &, const tripoint &examp ); void kiln_empty( player &p, const tripoint &examp ); @@ -111,6 +110,7 @@ void open_safe( player &p, const tripoint &examp ); void workbench( player &p, const tripoint &examp ); void workbench_internal( player &p, const tripoint &examp, const cata::optional &part ); +void workout( player &p, const tripoint &examp ); bool pour_into_keg( const tripoint &pos, item &liquid ); cata::optional getGasPumpByNumber( const tripoint &p, int number ); diff --git a/src/init.cpp b/src/init.cpp index 20132236b1e48..22d0846f93365 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -69,6 +69,7 @@ #include "overmap_connection.h" #include "overmap_location.h" #include "profession.h" +#include "proficiency.h" #include "recipe_dictionary.h" #include "recipe_groups.h" #include "regional_settings.h" @@ -90,6 +91,8 @@ #include "veh_type.h" #include "vehicle_group.h" #include "vitamin.h" +#include "weather.h" +#include "weather_type.h" #include "worldfactory.h" DynamicDataLoader::DynamicDataLoader() @@ -201,7 +204,9 @@ void DynamicDataLoader::initialize() add( "EXTERNAL_OPTION", &load_external_option ); add( "json_flag", &json_flag::load ); add( "fault", &fault::load_fault ); + add( "relic_procgen_data", &relic_procgen_data::load_relic_procgen_data ); add( "field_type", &field_types::load ); + add( "weather_type", &weather_types::load ); add( "ammo_effect", &ammo_effects::load ); add( "emit", &emit::load_emit ); add( "activity_type", &activity_type::load ); @@ -211,6 +216,7 @@ void DynamicDataLoader::initialize() add( "bionic", &bionic_data::load_bionic ); add( "profession", &profession::load_profession ); add( "profession_item_substitutions", &profession::load_item_substitutions ); + add( "proficiency", &proficiency::load_proficiencies ); add( "skill", &Skill::load_skill ); add( "skill_display_type", &SkillDisplayType::load ); add( "dream", &dream::load ); @@ -520,6 +526,7 @@ void DynamicDataLoader::unload_data() overmap_specials::reset(); overmap_terrains::reset(); profession::reset(); + proficiency::reset(); quality::reset(); reset_monster_adjustment(); recipe_dictionary::reset(); @@ -553,6 +560,7 @@ void DynamicDataLoader::unload_data() vehicle_prototype::reset(); vitamin::reset(); vpart_info::reset(); + weather_types::reset(); } void DynamicDataLoader::finalize_loaded_data() @@ -571,6 +579,7 @@ void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) using named_entry = std::pair>; const std::vector entries = {{ { _( "Body parts" ), &body_part_type::finalize_all }, + { _( "Weather types" ), &weather_types::finalize_all }, { _( "Field types" ), &field_types::finalize_all }, { _( "Ammo effects" ), &ammo_effects::finalize_all }, { _( "Emissions" ), &emit::finalize }, @@ -653,6 +662,7 @@ void DynamicDataLoader::check_consistency( loading_ui &ui ) } }, { _( "Vitamins" ), &vitamin::check_consistency }, + { _( "Weather types" ), &weather_types::check_consistency }, { _( "Field types" ), &field_types::check_consistency }, { _( "Ammo effects" ), &ammo_effects::check_consistency }, { _( "Emissions" ), &emit::check_consistency }, diff --git a/src/inventory.cpp b/src/inventory.cpp index 6955f0e8ba87d..ca1f21e9859ea 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -261,6 +261,7 @@ void inventory::update_cache_with_item( item &newit ) char inventory::find_usable_cached_invlet( const itype_id &item_type ) { + Character &player_character = get_player_character(); // Some of our preferred letters might already be used. for( auto invlet : invlet_cache.invlets_for( item_type ) ) { // Don't overwrite user assignments. @@ -268,7 +269,7 @@ char inventory::find_usable_cached_invlet( const itype_id &item_type ) continue; } // Check if anything is using this invlet. - if( g->u.invlet_to_item( invlet ) != nullptr ) { + if( player_character.invlet_to_item( invlet ) != nullptr ) { continue; } return invlet; @@ -281,6 +282,7 @@ item &inventory::add_item( item newit, bool keep_invlet, bool assign_invlet, boo { binned = false; + Character &player_character = get_player_character(); if( should_stack ) { // See if we can't stack this item. for( auto &elem : items ) { @@ -302,7 +304,7 @@ item &inventory::add_item( item newit, bool keep_invlet, bool assign_invlet, boo return elem.back(); } else if( keep_invlet && assign_invlet && it_ref->invlet == newit.invlet ) { // If keep_invlet is true, we'll be forcing other items out of their current invlet. - assign_empty_invlet( *it_ref, g->u ); + assign_empty_invlet( *it_ref, player_character ); } } } @@ -410,7 +412,7 @@ void inventory::form_from_map( const tripoint &origin, int range, const Characte bool assign_invlet, bool clear_path ) { - form_from_map( g->m, origin, range, pl, assign_invlet, clear_path ); + form_from_map( get_map(), origin, range, pl, assign_invlet, clear_path ); } void inventory::form_from_zone( map &m, std::unordered_set &zone_pts, const Character *pl, @@ -434,7 +436,7 @@ void inventory::form_from_map( map &m, const tripoint &origin, int range, const m.reachable_flood_steps( reachable_pts, origin, range, 1, 100 ); } else { // Fill reachable points with points_in_radius - tripoint_range in_radius = m.points_in_radius( origin, range ); + tripoint_range in_radius = m.points_in_radius( origin, range ); for( const tripoint &p : in_radius ) { reachable_pts.emplace_back( p ); } @@ -457,8 +459,6 @@ void inventory::form_from_map( map &m, std::vector pts, const Characte // NOTE: This only works if the pseudo item has a MAGAZINE pocket, not a MAGAZINE_WELL! item furn_ammo( ammo, calendar::turn, count_charges_in_list( ammo, m.i_at( p ) ) ); furn_item.put_in( furn_ammo, item_pocket::pocket_type::MAGAZINE ); - } else { - debugmsg( "ERROR: Furniture crafting pseudo item does not have magazine for ammo" ); } furn_item.item_tags.insert( "PSEUDO" ); add_item( furn_item ); @@ -879,6 +879,8 @@ item *inventory::most_appropriate_painkiller( int pain ) void inventory::rust_iron_items() { + Character &player_character = get_player_character(); + map &here = get_map(); for( auto &elem : items ) { for( auto &elem_stack_iter : elem ) { if( elem_stack_iter.made_of( material_id( "iron" ) ) && @@ -896,7 +898,7 @@ void inventory::rust_iron_items() elem_stack_iter.base_volume().value() ) / 250 ) ) ) ) && // ^season length ^14/5*0.75/pi (from volume of sphere) //Freshwater without oxygen rusts slower than air - g->m.water_from( g->u.pos() ).typeId() == itype_salt_water ) { + here.water_from( player_character.pos() ).typeId() == itype_salt_water ) { elem_stack_iter.inc_damage( DT_ACID ); // rusting never completely destroys an item add_msg( m_bad, _( "Your %s is damaged by rust." ), elem_stack_iter.tname() ); } @@ -1042,8 +1044,7 @@ void inventory::assign_empty_invlet( item &it, const Character &p, const bool fo if( cur_inv.count() < inv_chars.size() ) { // XXX YUCK I don't know how else to get the keybindings // FIXME: Find a better way to get bound keys - avatar &u = g->u; - inventory_selector selector( u ); + inventory_selector selector( get_avatar() ); for( const auto &inv_char : inv_chars ) { if( assigned_invlet.count( inv_char ) ) { @@ -1103,11 +1104,12 @@ void inventory::update_invlet( item &newit, bool assign_invlet ) } } + Character &player_character = get_player_character(); // Remove letters that have been assigned to other items in the inventory if( newit.invlet ) { char tmp_invlet = newit.invlet; newit.invlet = '\0'; - if( g->u.invlet_to_item( tmp_invlet ) == nullptr ) { + if( player_character.invlet_to_item( tmp_invlet ) == nullptr ) { newit.invlet = tmp_invlet; } } @@ -1120,7 +1122,7 @@ void inventory::update_invlet( item &newit, bool assign_invlet ) // Give the item an invlet if it has none if( !newit.invlet ) { - assign_empty_invlet( newit, g->u ); + assign_empty_invlet( newit, player_character ); } } } diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index b3b8728fd825e..38c4105806d3d 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -1,12 +1,10 @@ #include "inventory_ui.h" -#include "avatar.h" #include "cata_utility.h" #include "catacharset.h" #include "character.h" #include "colony.h" #include "debug.h" -#include "game.h" #include "ime.h" #include "inventory.h" #include "item.h" @@ -18,7 +16,6 @@ #include "optional.h" #include "options.h" #include "output.h" -#include "player.h" #include "point.h" #include "string_formatter.h" #include "string_id.h" @@ -114,10 +111,11 @@ class selection_column_preset : public inventory_selector_preset } nc_color get_color( const inventory_entry &entry ) const override { + Character &player_character = get_player_character(); if( entry.is_item() ) { - if( &*entry.any_item() == &g->u.weapon ) { + if( &*entry.any_item() == &player_character.weapon ) { return c_light_blue; - } else if( g->u.is_worn( *entry.any_item() ) ) { + } else if( player_character.is_worn( *entry.any_item() ) ) { return c_cyan; } } @@ -171,7 +169,7 @@ nc_color inventory_entry::get_invlet_color() const { if( !is_selectable() ) { return c_dark_gray; - } else if( g->u.inv.assigned_invlet.count( get_invlet() ) ) { + } else if( get_player_character().inv.assigned_invlet.count( get_invlet() ) ) { return c_yellow; } else { return c_white; @@ -232,9 +230,10 @@ inventory_selector_preset::inventory_selector_preset() bool inventory_selector_preset::sort_compare( const inventory_entry &lhs, const inventory_entry &rhs ) const { + Character &player_character = get_player_character(); // Place items with an assigned inventory letter first, since the player cared enough to assign them - const bool left_fav = g->u.inv.assigned_invlet.count( lhs.any_item()->invlet ); - const bool right_fav = g->u.inv.assigned_invlet.count( rhs.any_item()->invlet ); + const bool left_fav = player_character.inv.assigned_invlet.count( lhs.any_item()->invlet ); + const bool right_fav = player_character.inv.assigned_invlet.count( rhs.any_item()->invlet ); if( left_fav == right_fav ) { return lhs.cached_name.compare( rhs.cached_name ) < 0; // Simple alphabetic order } else if( left_fav ) { @@ -576,7 +575,7 @@ size_t inventory_column::page_of( const inventory_entry &entry ) const } bool inventory_column::has_available_choices() const { - if( !allows_selecting() ) { + if( !allows_selecting() || !activatable() ) { return false; } for( size_t i = 0; i < entries.size(); ++i ) { @@ -637,17 +636,21 @@ void inventory_column::set_stack_favorite( const item_location &location, bool f { const item *selected_item = location.get_item(); std::list to_favorite; + map &here = get_map(); + Character &player_character = get_player_character(); if( location.where() == item_location::type::character ) { - int position = g->u.get_item_position( selected_item ); + int position = player_character.get_item_position( selected_item ); if( position < 0 ) { - g->u.i_at( position ).set_favorite( !selected_item->is_favorite ); // worn/wielded + // worn/wielded + player_character.i_at( position ).set_favorite( !selected_item->is_favorite ); } else { - g->u.inv.set_stack_favorite( position, !selected_item->is_favorite ); // in inventory + // in inventory + player_character.inv.set_stack_favorite( position, !selected_item->is_favorite ); } } else if( location.where() == item_location::type::map ) { - map_stack items = g->m.i_at( location.position() ); + map_stack items = here.i_at( location.position() ); for( auto &item : items ) { if( item.stacks_with( *selected_item ) ) { @@ -658,7 +661,7 @@ void inventory_column::set_stack_favorite( const item_location &location, bool f item->set_favorite( favorite ); } } else if( location.where() == item_location::type::vehicle ) { - const cata::optional vp = g->m.veh_at( + const cata::optional vp = here.veh_at( location.position() ).part_with_feature( "CARGO", true ); assert( vp ); @@ -910,13 +913,13 @@ size_t inventory_column::get_entry_indent( const inventory_entry &entry ) const if( get_option( "ITEM_SYMBOLS" ) ) { res += 2; } - if( allows_selecting() && multiselect ) { + if( allows_selecting() && activatable() && multiselect ) { res += 2; } return res; } -int inventory_column::reassign_custom_invlets( const player &p, int min_invlet, int max_invlet ) +int inventory_column::reassign_custom_invlets( const Character &p, int min_invlet, int max_invlet ) { int cur_invlet = min_invlet; for( auto &elem : entries ) { @@ -1048,7 +1051,7 @@ void inventory_column::draw( const catacurses::window &win, const point &p ) mvwputch( win, point( xx, yy ), color, entry.any_item()->symbol() ); xx += 2; } - if( allows_selecting() && multiselect ) { + if( allows_selecting() && activatable() && multiselect ) { if( entry.chosen_count == 0 ) { mvwputch( win, point( xx, yy ), c_dark_gray, '-' ); } else if( entry.chosen_count >= entry.get_available_count() ) { @@ -1287,10 +1290,14 @@ void inventory_selector::add_contained_items( item_location &container ) void inventory_selector::add_contained_items( item_location &container, inventory_column &column ) { + if( container->has_flag( "NO_UNLOAD" ) ) { + return; + } + for( item *it : container->contents.all_items_top() ) { item_location child( container, it ); add_contained_items( child, column ); - add_item( column, std::move( child ) ); + add_entry( column, std::vector( 1, child ) ); } } @@ -1324,9 +1331,10 @@ void inventory_selector::add_character_items( Character &character ) void inventory_selector::add_map_items( const tripoint &target ) { - if( g->m.accessible_items( target ) ) { - map_stack items = g->m.i_at( target ); - const std::string name = to_upper_case( g->m.name( target ) ); + map &here = get_map(); + if( here.accessible_items( target ) ) { + map_stack items = here.i_at( target ); + const std::string name = to_upper_case( here.name( target ) ); const item_category map_cat( name, no_translation( name ), 100 ); add_items( map_column, [ &target ]( item * it ) { @@ -1342,7 +1350,8 @@ void inventory_selector::add_map_items( const tripoint &target ) void inventory_selector::add_vehicle_items( const tripoint &target ) { - const cata::optional vp = g->m.veh_at( target ).part_with_feature( "CARGO", true ); + const cata::optional vp = + get_map().veh_at( target ).part_with_feature( "CARGO", true ); if( !vp ) { return; } @@ -1367,9 +1376,10 @@ void inventory_selector::add_vehicle_items( const tripoint &target ) void inventory_selector::add_nearby_items( int radius ) { if( radius >= 0 ) { - for( const tripoint &pos : closest_tripoints_first( u.pos(), radius ) ) { + map &here = get_map(); + for( const tripoint &pos : closest_points_first( u.pos(), radius ) ) { // can not reach this -> can not access its contents - if( u.pos() != pos && !g->m.clear_path( u.pos(), pos, rl_dist( u.pos(), pos ), 1, 100 ) ) { + if( u.pos() != pos && !here.clear_path( u.pos(), pos, rl_dist( u.pos(), pos ), 1, 100 ) ) { continue; } add_map_items( pos ); @@ -1798,7 +1808,7 @@ void inventory_selector::draw_footer( const catacurses::window &w ) const mvwprintz( w_inv, point( 2, getmaxy( w_inv ) - 1 ), c_cyan, "< " ); mvwprintz( w_inv, point( ( getmaxx( w_inv ) / 2 ) - 4, getmaxy( w_inv ) - 1 ), c_cyan, " >" ); - std::string new_filter = spopup->query_string( /*loop=*/false, /*draw_only=*/true ); + spopup->query_string( /*loop=*/false, /*draw_only=*/true ); } else { int filter_offset = 0; if( has_available_choices() || !filter.empty() ) { @@ -1828,7 +1838,7 @@ void inventory_selector::draw_footer( const catacurses::window &w ) const } } -inventory_selector::inventory_selector( player &u, const inventory_selector_preset &preset ) +inventory_selector::inventory_selector( Character &u, const inventory_selector_preset &preset ) : u( u ) , preset( preset ) , ctxt( "INVENTORY" ) @@ -2125,7 +2135,7 @@ item_location inventory_pick_selector::execute() } } -inventory_multiselector::inventory_multiselector( player &p, +inventory_multiselector::inventory_multiselector( Character &p, const inventory_selector_preset &preset, const std::string &selection_column_title ) : inventory_selector( p, preset ), @@ -2147,7 +2157,7 @@ void inventory_multiselector::rearrange_columns( size_t client_width ) selection_col->set_visibility( !is_overflown( client_width ) ); } -inventory_compare_selector::inventory_compare_selector( player &p ) : +inventory_compare_selector::inventory_compare_selector( Character &p ) : inventory_multiselector( p, default_preset, _( "ITEMS TO COMPARE" ) ) {} std::pair inventory_compare_selector::execute() @@ -2218,7 +2228,7 @@ void inventory_compare_selector::toggle_entry( inventory_entry *entry ) } inventory_iuse_selector::inventory_iuse_selector( - player &p, + Character &p, const std::string &selector_title, const inventory_selector_preset &preset, const GetStats &get_st @@ -2282,12 +2292,10 @@ drop_locations inventory_iuse_selector::execute() count = 0; } } - drop_locations dropped_pos_and_qty; - for( const std::pair &use_pair : to_use ) { - item_location loc( u, const_cast( use_pair.first ) ); - dropped_pos_and_qty.push_back( std::make_pair( loc, use_pair.second ) ); + for( const std::pair &use_pair : to_use ) { + dropped_pos_and_qty.push_back( std::make_pair( *use_pair.first, use_pair.second ) ); } return dropped_pos_and_qty; @@ -2295,17 +2303,26 @@ drop_locations inventory_iuse_selector::execute() void inventory_iuse_selector::set_chosen_count( inventory_entry &entry, size_t count ) { - const item *it = &*entry.any_item(); + const item_location &it = entry.any_item(); if( count == 0 ) { entry.chosen_count = 0; - const auto iter = to_use.find( it ); - if( iter != to_use.end() ) { - to_use.erase( iter ); + for( const item_location &loc : entry.locations ) { + to_use.erase( &loc ); } } else { entry.chosen_count = std::min( std::min( count, max_chosen_count ), entry.get_available_count() ); - to_use[it] = entry.chosen_count; + if( it->count_by_charges() ) { + to_use[&it] = entry.chosen_count; + } else { + for( const item_location &loc : entry.locations ) { + if( count == 0 ) { + break; + } + to_use[&loc] = 1; + count--; + } + } } on_change( entry ); @@ -2319,7 +2336,7 @@ inventory_selector::stats inventory_iuse_selector::get_raw_stats() const return stats{{ stat{{ "", "", "", "" }}, stat{{ "", "", "", "" }} }}; } -inventory_drop_selector::inventory_drop_selector( player &p, +inventory_drop_selector::inventory_drop_selector( Character &p, const inventory_selector_preset &preset, const std::string &selection_column_title ) : inventory_multiselector( p, preset, selection_column_title ), max_chosen_count( std::numeric_limits::max() ) @@ -2352,18 +2369,16 @@ void inventory_drop_selector::process_selected( int &count, void inventory_drop_selector::deselect_contained_items() { - std::vector container; - std::vector contained; + std::vector inventory_items; for( std::pair &drop : dropping ) { item_location loc_front = drop.first; - if( loc_front.where() != item_location::type::container ) { - container.push_back( loc_front ); - } else { - contained.push_back( loc_front ); - } + inventory_items.push_back( loc_front ); } - for( item_location loc_contained : contained ) { - for( item_location loc_container : container ) { + for( item_location loc_contained : inventory_items ) { + for( item_location loc_container : inventory_items ) { + if( loc_container == loc_contained ) { + continue; + } if( loc_container->has_item( *loc_contained ) ) { for( inventory_column *col : get_all_columns() ) { for( inventory_entry *selected : col->get_entries( []( const inventory_entry & @@ -2373,8 +2388,10 @@ void inventory_drop_selector::deselect_contained_items() if( !selected->is_item() ) { continue; } - if( selected->locations.front() == loc_contained ) { - set_chosen_count( *selected, 0 ); + for( const item_location &selected_loc : selected->locations ) { + if( selected_loc == loc_contained ) { + set_chosen_count( *selected, 0 ); + } } } } @@ -2416,11 +2433,12 @@ drop_locations inventory_drop_selector::execute() const auto filter_to_nonfavorite_and_nonworn = []( const inventory_entry & entry ) { return entry.is_item() && !entry.any_item()->is_favorite && - !g->u.is_worn( *entry.any_item() ); + !get_player_character().is_worn( *entry.any_item() ); }; const auto selected( get_active_column().get_entries( filter_to_nonfavorite_and_nonworn ) ); process_selected( count, selected ); + deselect_contained_items(); } else if( input.action == "RIGHT" ) { const auto selected( get_active_column().get_all_selected() ); @@ -2525,5 +2543,5 @@ inventory_selector::stats inventory_drop_selector::get_raw_stats() const u.weight_carried_with_tweaks( dropping ), u.weight_capacity(), u.volume_carried_with_tweaks( dropping ), - u.volume_capacity() ); + u.volume_capacity_with_tweaks( dropping ) ); } diff --git a/src/inventory_ui.h b/src/inventory_ui.h index c7ca68d1c1712..5fb8397915964 100644 --- a/src/inventory_ui.h +++ b/src/inventory_ui.h @@ -27,7 +27,6 @@ class Character; class item; -class player; class string_input_popup; struct tripoint; class ui_adaptor; @@ -233,7 +232,7 @@ class inventory_holster_preset : public inventory_selector_preset /** Does this entry satisfy the basic preset conditions? */ bool is_shown( const item_location &contained ) const override { - return holster->can_contain( *contained ) && !holster->has_item( *contained ); + return holster->contents.can_contain( *contained ).success() && !holster->has_item( *contained ); } private: // this is the item that we are putting something into @@ -257,6 +256,7 @@ class inventory_column /** * Can this column be activated? * @return Whether the column contains selectable entries. + * Note: independent from 'allows_selecting' */ virtual bool activatable() const; /** Is this column visible? */ @@ -266,9 +266,10 @@ class inventory_column /** * Does this column allow selecting? * "Cosmetic" columns (list of selected items) can explicitly prohibit selecting. + * Note: independent from 'activatable' */ virtual bool allows_selecting() const { - return activatable(); + return true; } size_t page_index() const { @@ -336,7 +337,7 @@ class inventory_column /** Resets width to original (unchanged). */ virtual void reset_width( const std::vector &all_columns ); /** Returns next custom inventory letter. */ - int reassign_custom_invlets( const player &p, int min_invlet, int max_invlet ); + int reassign_custom_invlets( const Character &p, int min_invlet, int max_invlet ); /** Reorder entries, repopulate titles, adjust to the new height. */ virtual void prepare_paging( const std::string &filter = "" ); /** @@ -479,7 +480,7 @@ class selection_column : public inventory_column class inventory_selector { public: - inventory_selector( player &u, const inventory_selector_preset &preset = default_preset ); + inventory_selector( Character &u, const inventory_selector_preset &preset = default_preset ); virtual ~inventory_selector(); /** These functions add items from map / vehicles. */ void add_contained_items( item_location &container ); @@ -519,7 +520,7 @@ class inventory_selector bool keep_open = false; protected: - player &u; + Character &u; const inventory_selector_preset &preset; /** @@ -698,7 +699,7 @@ inventory_selector::stat display_stat( const std::string &caption, int cur_value class inventory_pick_selector : public inventory_selector { public: - inventory_pick_selector( player &p, + inventory_pick_selector( Character &p, const inventory_selector_preset &preset = default_preset ) : inventory_selector( p, preset ) {} @@ -708,7 +709,7 @@ class inventory_pick_selector : public inventory_selector class inventory_multiselector : public inventory_selector { public: - inventory_multiselector( player &p, const inventory_selector_preset &preset = default_preset, + inventory_multiselector( Character &p, const inventory_selector_preset &preset = default_preset, const std::string &selection_column_title = "" ); protected: void rearrange_columns( size_t client_width ) override; @@ -720,7 +721,7 @@ class inventory_multiselector : public inventory_selector class inventory_compare_selector : public inventory_multiselector { public: - inventory_compare_selector( player &p ); + inventory_compare_selector( Character &p ); std::pair execute(); protected: @@ -734,8 +735,8 @@ class inventory_compare_selector : public inventory_multiselector class inventory_iuse_selector : public inventory_multiselector { public: - using GetStats = std::function & )>; - inventory_iuse_selector( player &p, + using GetStats = std::function & )>; + inventory_iuse_selector( Character &p, const std::string &selector_title, const inventory_selector_preset &preset = default_preset, const GetStats & = {} ); @@ -747,14 +748,14 @@ class inventory_iuse_selector : public inventory_multiselector private: GetStats get_stats; - std::map to_use; + std::map to_use; size_t max_chosen_count; }; class inventory_drop_selector : public inventory_multiselector { public: - inventory_drop_selector( player &p, + inventory_drop_selector( Character &p, const inventory_selector_preset &preset = default_preset, const std::string &selection_column_title = _( "ITEMS TO DROP" ) ); drop_locations execute(); @@ -769,4 +770,6 @@ class inventory_drop_selector : public inventory_multiselector std::vector> dropping; size_t max_chosen_count; }; + + #endif // CATA_SRC_INVENTORY_UI_H diff --git a/src/item.cpp b/src/item.cpp index 465ef5bc7e1c0..b2dfec884c567 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -102,11 +102,13 @@ static const ammotype ammo_plutonium( "plutonium" ); static const item_category_id item_category_drugs( "drugs" ); static const item_category_id item_category_food( "food" ); static const item_category_id item_category_maps( "maps" ); +static const item_category_id item_category_container( "container" ); static const efftype_id effect_cig( "cig" ); static const efftype_id effect_shakes( "shakes" ); static const efftype_id effect_sleep( "sleep" ); static const efftype_id effect_weed_high( "weed_high" ); +static const efftype_id effect_bleed( "bleed" ); static const fault_id fault_gun_blackpowder( "fault_gun_blackpowder" ); @@ -193,6 +195,7 @@ static const std::string flag_HIDDEN_HALLU( "HIDDEN_HALLU" ); static const std::string flag_HIDDEN_POISON( "HIDDEN_POISON" ); static const std::string flag_HOT( "HOT" ); static const std::string flag_IRREMOVABLE( "IRREMOVABLE" ); +static const std::string flag_BURNOUT( "BURNOUT" ); static const std::string flag_IS_ARMOR( "IS_ARMOR" ); static const std::string flag_IS_PET_ARMOR( "IS_PET_ARMOR" ); static const std::string flag_IS_UPS( "IS_UPS" ); @@ -249,6 +252,7 @@ static const std::string flag_SKINTIGHT( "SKINTIGHT" ); static const std::string flag_SLOW_WIELD( "SLOW_WIELD" ); static const std::string flag_SPEEDLOADER( "SPEEDLOADER" ); static const std::string flag_SPLINT( "SPLINT" ); +static const std::string flag_TOURNIQUET( "TOURNIQUET" ); static const std::string flag_STR_DRAW( "STR_DRAW" ); static const std::string flag_TOBACCO( "TOBACCO" ); static const std::string flag_UNARMED_WEAPON( "UNARMED_WEAPON" ); @@ -559,6 +563,11 @@ item &item::activate() return *this; } +bool item::activate_thrown( const tripoint &pos ) +{ + return type->invoke( get_avatar(), *this, pos ); +} + units::energy item::set_energy( const units::energy &qty ) { if( !is_battery() ) { @@ -586,6 +595,7 @@ item &item::ammo_set( const itype_id &ammo, int qty ) const ammotype &ammo_type = ammo->ammo->type; if( qty < 0 ) { // completely fill an integral or existing magazine + //if( magazine_current() ) then we need capacity of the magazine instead of the item maybe? if( magazine_integral() || magazine_current() ) { qty = ammo_capacity( ammo_type ); @@ -622,7 +632,8 @@ item &item::ammo_set( const itype_id &ammo, int qty ) // check ammo is valid for the item const itype *atype = item_controller->find_template( ammo ); if( atype->ammo && ammo_types().count( atype->ammo->type ) == 0 && - !magazine_compatible().count( atype->get_id() ) ) { + !magazine_compatible().count( atype->get_id() ) && !( magazine_current() && + magazine_current()->ammo_types().count( atype->ammo->type ) ) ) { debugmsg( "Tried to set invalid ammo of %s for %s", atype->nname( qty ), tname() ); return *this; } @@ -871,6 +882,36 @@ item item::in_container( const itype_id &cont, int qty ) const return *this; } +void item::update_modified_pockets() +{ + cata::optional mag_or_mag_well; + std::vector container_pockets; + + for( const pocket_data &pocket : type->pockets ) { + if( pocket.type == item_pocket::pocket_type::CONTAINER ) { + container_pockets.push_back( &pocket ); + } else if( pocket.type == item_pocket::pocket_type::MAGAZINE || + pocket.type == item_pocket::pocket_type::MAGAZINE_WELL ) { + mag_or_mag_well = &pocket; + } + } + + for( const item *mod : mods() ) { + if( mod->type->mod ) { + for( const pocket_data &pocket : mod->type->mod->add_pockets ) { + if( pocket.type == item_pocket::pocket_type::CONTAINER ) { + container_pockets.push_back( &pocket ); + } else if( pocket.type == item_pocket::pocket_type::MAGAZINE || + pocket.type == item_pocket::pocket_type::MAGAZINE_WELL ) { + mag_or_mag_well = &pocket; + } + } + } + } + + contents.update_modified_pockets( mag_or_mag_well, container_pockets ); +} + int item::charges_per_volume( const units::volume &vol ) const { if( count_by_charges() ) { @@ -1020,10 +1061,14 @@ bool item::merge_charges( const item &rhs ) return true; } -void item::put_in( const item &payload, item_pocket::pocket_type pk_type ) +ret_val item::put_in( const item &payload, item_pocket::pocket_type pk_type ) { - contents.insert_item( payload, pk_type ); + ret_val result = contents.insert_item( payload, pk_type ); + if( pk_type == item_pocket::pocket_type::MOD ) { + update_modified_pockets(); + } on_contents_changed(); + return result; } void item::set_var( const std::string &name, const int value ) @@ -1159,9 +1204,10 @@ static std::string get_freshness_description( const item &food_item ) time_left = shelf_life; } + Character &player_character = get_player_character(); if( food_item.is_fresh() ) { // Fresh food is assumed to be obviously so regardless of skill. - if( g->u.can_estimate_rot() ) { + if( player_character.can_estimate_rot() ) { return string_format( _( "* This food looks as fresh as it can be. " "It still has %s until it spoils." ), to_string_approx( time_left ) ); @@ -1170,7 +1216,7 @@ static std::string get_freshness_description( const item &food_item ) } } else if( food_item.is_going_bad() ) { // Old food likewise is assumed to be fairly obvious. - if( g->u.can_estimate_rot() ) { + if( player_character.can_estimate_rot() ) { return string_format( _( "* This food looks old. " "It's just %s from becoming inedible." ), to_string_approx( time_left ) ); @@ -1180,7 +1226,7 @@ static std::string get_freshness_description( const item &food_item ) } } - if( !g->u.can_estimate_rot() ) { + if( !player_character.can_estimate_rot() ) { // Unskilled characters only get a hint that more information exists... return _( "* This food looks fine. If you were more skilled in " "cooking or survival, you might be able to make a better estimation." ); @@ -1365,7 +1411,7 @@ double item::effective_dps( const player &guy, monster &mon ) const { const float mon_dodge = mon.get_dodge(); float base_hit = guy.get_dex() / 4.0f + guy.get_hit_weapon( *this ); - base_hit *= std::max( 0.25f, 1.0f - guy.encumb( bp_torso ) / 100.0f ); + base_hit *= std::max( 0.25f, 1.0f - guy.encumb( bodypart_id( "torso" ) ) / 100.0f ); float mon_defense = mon_dodge + mon.size_melee_penalty() / 5.0; constexpr double hit_trials = 10000.0; const int rng_mean = std::max( std::min( static_cast( base_hit - mon_defense ), 20 ), @@ -1481,7 +1527,7 @@ std::map item::dps( const bool for_display, const bool for_ std::map item::dps( const bool for_display, const bool for_calc ) const { - return dps( for_display, for_calc, g->u ); + return dps( for_display, for_calc, get_avatar() ); } double item::average_dps( const player &guy ) const @@ -1671,9 +1717,10 @@ void item::med_info( const item *med_item, std::vector &info, const it info.push_back( iteminfo( "MED", _( "Quench: " ), med_com->quench ) ); } + Character &player_character = get_player_character(); if( med_item->get_comestible_fun() != 0 && parts->test( iteminfo_parts::MED_JOY ) ) { info.push_back( iteminfo( "MED", _( "Enjoyability: " ), - g->u.fun_for( *med_item ).first ) ); + player_character.fun_for( *med_item ).first ) ); } if( med_com->stim != 0 && parts->test( iteminfo_parts::MED_STIMULATION ) ) { @@ -1689,7 +1736,7 @@ void item::med_info( const item *med_item, std::vector &info, const it if( parts->test( iteminfo_parts::MED_CONSUME_TIME ) ) { info.push_back( iteminfo( "MED", _( "Consume time: " ), - to_string( g->u.get_consume_time( *med_item ) ) ) ); + to_string( player_character.get_consume_time( *med_item ) ) ) ); } if( med_com->addict && parts->test( iteminfo_parts::DESCRIPTION_MED_ADDICTING ) ) { @@ -1703,12 +1750,13 @@ void item::food_info( const item *food_item, std::vector &info, nutrients min_nutr; nutrients max_nutr; + Character &player_character = get_player_character(); std::string recipe_exemplar = get_var( "recipe_exemplar", "" ); if( recipe_exemplar.empty() ) { - min_nutr = max_nutr = g->u.compute_effective_nutrients( *food_item ); + min_nutr = max_nutr = player_character.compute_effective_nutrients( *food_item ); } else { std::tie( min_nutr, max_nutr ) = - g->u.compute_nutrient_range( *food_item, recipe_id( recipe_exemplar ) ); + player_character.compute_nutrient_range( *food_item, recipe_id( recipe_exemplar ) ); } bool show_nutr = parts->test( iteminfo_parts::FOOD_NUTRITION ) || @@ -1739,7 +1787,7 @@ void item::food_info( const item *food_item, std::vector &info, } } - const std::pair fun_for_food_item = g->u.fun_for( *food_item ); + const std::pair fun_for_food_item = player_character.fun_for( *food_item ); if( fun_for_food_item.first != 0 && parts->test( iteminfo_parts::FOOD_JOY ) ) { info.push_back( iteminfo( "FOOD", _( "Enjoyability: " ), fun_for_food_item.first ) ); } @@ -1749,24 +1797,24 @@ void item::food_info( const item *food_item, std::vector &info, std::abs( static_cast( food_item->charges ) * batch ) ) ); } if( food_item->corpse != nullptr && parts->test( iteminfo_parts::FOOD_SMELL ) && - ( debug || ( g != nullptr && ( g->u.has_trait( trait_CARNIVORE ) || - g->u.has_artifact_with( AEP_SUPER_CLAIRVOYANCE ) ) ) ) ) { + ( debug || ( g != nullptr && ( player_character.has_trait( trait_CARNIVORE ) || + player_character.has_artifact_with( AEP_SUPER_CLAIRVOYANCE ) ) ) ) ) { info.push_back( iteminfo( "FOOD", _( "Smells like: " ) + food_item->corpse->nname() ) ); } if( parts->test( iteminfo_parts::FOOD_CONSUME_TIME ) ) { info.push_back( iteminfo( "FOOD", _( "Consume time: " ), - to_string( g->u.get_consume_time( *food_item ) ) ) ); + to_string( player_character.get_consume_time( *food_item ) ) ) ); } auto format_vitamin = [&]( const std::pair &v, bool display_vitamins ) { const bool is_vitamin = v.first->type() == vitamin_type::VITAMIN; // only display vitamins that we actually require - if( g->u.vitamin_rate( v.first ) == 0_turns || v.second == 0 || + if( player_character.vitamin_rate( v.first ) == 0_turns || v.second == 0 || display_vitamins != is_vitamin || v.first->has_flag( flag_NO_DISPLAY ) ) { return std::string(); } - const double multiplier = g->u.vitamin_rate( v.first ) / 1_days * 100; + const double multiplier = player_character.vitamin_rate( v.first ) / 1_days * 100; const int min_value = min_nutr.get_vitamin( v.first ); const int max_value = v.second; const int min_rda = std::lround( min_value * multiplier ); @@ -1800,14 +1848,14 @@ void item::food_info( const item *food_item, std::vector &info, insert_separation_line( info ); if( parts->test( iteminfo_parts::FOOD_ALLERGEN ) - && g->u.allergy_type( *food_item ) != morale_type( "morale_null" ) ) { + && player_character.allergy_type( *food_item ) != morale_type( "morale_null" ) ) { info.emplace_back( "DESCRIPTION", _( "* This food will cause an allergic reaction." ) ); } if( food_item->has_flag( flag_CANNIBALISM ) && parts->test( iteminfo_parts::FOOD_CANNIBALISM ) ) { - if( !g->u.has_trait_flag( trait_flag_CANNIBAL ) ) { + if( !player_character.has_trait_flag( trait_flag_CANNIBAL ) ) { info.emplace_back( "DESCRIPTION", _( "* This food contains human flesh." ) ); } else { @@ -1822,7 +1870,8 @@ void item::food_info( const item *food_item, std::vector &info, } ///\EFFECT_SURVIVAL >=3 allows detection of poisonous food - if( food_item->has_flag( flag_HIDDEN_POISON ) && g->u.get_skill_level( skill_survival ) >= 3 && + if( food_item->has_flag( flag_HIDDEN_POISON ) && + player_character.get_skill_level( skill_survival ) >= 3 && parts->test( iteminfo_parts::FOOD_POISON ) ) { info.emplace_back( "DESCRIPTION", _( "* On closer inspection, this appears to be " @@ -1830,7 +1879,8 @@ void item::food_info( const item *food_item, std::vector &info, } ///\EFFECT_SURVIVAL >=5 allows detection of hallucinogenic food - if( food_item->has_flag( flag_HIDDEN_HALLU ) && g->u.get_skill_level( skill_survival ) >= 5 && + if( food_item->has_flag( flag_HIDDEN_HALLU ) && + player_character.get_skill_level( skill_survival ) >= 5 && parts->test( iteminfo_parts::FOOD_HALLUCINOGENIC ) ) { info.emplace_back( "DESCRIPTION", _( "* On closer inspection, this appears to be " @@ -1859,18 +1909,19 @@ void item::food_info( const item *food_item, std::vector &info, _( "* It was frozen once and after thawing became mushy and " "tasteless. It will rot quickly if thawed again." ) ); } - if( food_item->has_flag( flag_NO_PARASITES ) && g->u.get_skill_level( skill_cooking ) >= 3 ) { + if( food_item->has_flag( flag_NO_PARASITES ) && + player_character.get_skill_level( skill_cooking ) >= 3 ) { info.emplace_back( "DESCRIPTION", _( "* It seems that deep freezing killed all " "parasites." ) ); } if( food_item->rotten() ) { - if( g->u.has_bionic( bio_digestion ) ) { + if( player_character.has_bionic( bio_digestion ) ) { info.push_back( iteminfo( "DESCRIPTION", _( "This food has started to rot, " "but your bionic digestion can tolerate " "it." ) ) ); - } else if( g->u.has_trait( trait_SAPROVORE ) ) { + } else if( player_character.has_trait( trait_SAPROVORE ) ) { info.push_back( iteminfo( "DESCRIPTION", _( "This food has started to rot, " "but you can tolerate it." ) ) ); @@ -2075,7 +2126,8 @@ void item::gun_info( const item *mod, std::vector &info, const iteminf } } - int max_gun_range = loaded_mod->gun_range( &g->u ); + avatar &player_character = get_avatar(); + int max_gun_range = loaded_mod->gun_range( &player_character ); if( max_gun_range > 0 && parts->test( iteminfo_parts::GUN_MAX_RANGE ) ) { info.emplace_back( "GUN", _( "Maximum range: " ), "", iteminfo::no_flags, max_gun_range ); @@ -2127,7 +2179,7 @@ void item::gun_info( const item *mod, std::vector &info, const iteminf // if effective sight dispersion differs from actual sight dispersion display both int act_disp = mod->sight_dispersion(); - int eff_disp = g->u.effective_dispersion( act_disp ); + int eff_disp = player_character.effective_dispersion( act_disp ); int adj_disp = eff_disp - act_disp; if( parts->test( iteminfo_parts::GUN_DISPERSION_SIGHT ) ) { @@ -2147,16 +2199,16 @@ void item::gun_info( const item *mod, std::vector &info, const iteminf bool bipod = mod->has_flag( flag_BIPOD ); - if( loaded_mod->gun_recoil( g->u ) ) { + if( loaded_mod->gun_recoil( player_character ) ) { if( parts->test( iteminfo_parts::GUN_RECOIL ) ) { info.emplace_back( "GUN", _( "Effective recoil: " ), "", iteminfo::no_newline | iteminfo::lower_is_better, - loaded_mod->gun_recoil( g->u ) ); + loaded_mod->gun_recoil( player_character ) ); } if( bipod && parts->test( iteminfo_parts::GUN_RECOIL_BIPOD ) ) { info.emplace_back( "GUN", "bipod_recoil", _( " (with bipod )" ), iteminfo::lower_is_better | iteminfo::no_name, - loaded_mod->gun_recoil( g->u, true ) ); + loaded_mod->gun_recoil( player_character, true ) ); } } info.back().bNewLine = true; @@ -2223,8 +2275,8 @@ void item::gun_info( const item *mod, std::vector &info, const iteminf if( parts->test( iteminfo_parts::GUN_AIMING_STATS ) ) { insert_separation_line( info ); info.emplace_back( "GUN", _( "Base aim speed: " ), "", iteminfo::no_flags, - g->u.aim_per_move( *mod, MAX_RECOIL ) ); - for( const aim_type &type : g->u.get_aim_types( *mod ) ) { + player_character.aim_per_move( *mod, MAX_RECOIL ) ); + for( const aim_type &type : player_character.get_aim_types( *mod ) ) { // Nameless aim levels don't get an entry. if( type.name.empty() ) { continue; @@ -2233,11 +2285,11 @@ void item::gun_info( const item *mod, std::vector &info, const iteminf // distinct tag per aim type. const std::string tag = "GUN_" + type.name; info.emplace_back( tag, string_format( "%s", type.name ) ); - int max_dispersion = g->u.get_weapon_dispersion( *loaded_mod ).max(); + int max_dispersion = player_character.get_weapon_dispersion( *loaded_mod ).max(); int range = range_with_even_chance_of_good_hit( max_dispersion + type.threshold ); info.emplace_back( tag, _( "Even chance of good hit at range: " ), _( "" ), iteminfo::no_flags, range ); - int aim_mv = g->u.gun_engagement_moves( *mod, type.threshold ); + int aim_mv = player_character.gun_engagement_moves( *mod, type.threshold ); info.emplace_back( tag, _( "Time to reach aim level: " ), _( " moves" ), iteminfo::lower_is_better, aim_mv ); } @@ -2488,8 +2540,9 @@ void item::armor_info( std::vector &info, const iteminfo_query *parts, return; } - int encumbrance = get_encumber( g->u ); - const sizing sizing_level = get_sizing( g->u, encumbrance != 0 ); + Character &player_character = get_player_character(); + int encumbrance = get_encumber( player_character ); + const sizing sizing_level = get_sizing( player_character, encumbrance != 0 ); const std::string space = " "; body_part_set covered_parts = get_covered_body_parts(); bool covers_anything = covered_parts.any(); @@ -2615,7 +2668,7 @@ void item::armor_info( std::vector &info, const iteminfo_query *parts, if( const islot_armor *t = find_armor_data() ) { if( t->max_encumber != t->encumber ) { const int encumbrance_when_full = - get_encumber( g->u, encumber_flags::assume_full ); + get_encumber( player_character, encumber_flags::assume_full ); info.push_back( iteminfo( "ARMOR", space + _( "Encumbrance when full: " ), "", iteminfo::no_newline | iteminfo::lower_is_better, encumbrance_when_full ) ); @@ -2662,20 +2715,6 @@ void item::animal_armor_info( std::vector &info, const iteminfo_query if( !is_pet_armor() ) { return; } - int converted_storage_scale = 0; - const double converted_storage = round_up( convert_volume( type->pet_armor->storage.value(), - &converted_storage_scale ), 2 ); - if( parts->test( iteminfo_parts::ARMOR_STORAGE ) && converted_storage > 0 ) { - const std::string space = " "; - const iteminfo::flags f = converted_storage_scale == 0 ? iteminfo::no_flags : iteminfo::is_decimal; - info.push_back( iteminfo( "ARMOR", space + _( "Storage: " ), - string_format( " %s", volume_units_abbr() ), - f, converted_storage ) ); - } - - // Whatever the last entry was, we want a newline at this point - info.back().bNewLine = true; - armor_protection_info( info, parts, batch, debug ); } @@ -2686,8 +2725,9 @@ void item::armor_fit_info( std::vector &info, const iteminfo_query *pa return; } - int encumbrance = get_encumber( g->u ); - const sizing sizing_level = get_sizing( g->u, encumbrance != 0 ); + Character &player_character = get_player_character(); + int encumbrance = get_encumber( player_character ); + const sizing sizing_level = get_sizing( player_character, encumbrance != 0 ); if( has_flag( flag_HELMET_COMPAT ) && parts->test( iteminfo_parts::DESCRIPTION_FLAGS_HELMETCOMPAT ) ) { @@ -2851,11 +2891,12 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, if( !book.skill && !type->can_use( "MA_MANUAL" ) && parts->test( iteminfo_parts::BOOK_SUMMARY ) ) { info.push_back( iteminfo( "BOOK", _( "Just for fun." ) ) ); } + avatar &player_character = get_avatar(); if( type->can_use( "MA_MANUAL" ) && parts->test( iteminfo_parts::BOOK_SUMMARY ) ) { info.push_back( iteminfo( "BOOK", _( "Some sort of martial arts training " "manual." ) ) ); - if( g->u.has_identified( typeId() ) ) { + if( player_character.has_identified( typeId() ) ) { const matype_id style_to_learn = martial_art_learned_from( *type ); info.push_back( iteminfo( "BOOK", string_format( _( "You can learn %s style " @@ -2874,9 +2915,9 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, info.push_back( iteminfo( "BOOK", _( "It can be understood by " "beginners." ) ) ); } - if( g->u.has_identified( typeId() ) ) { + if( player_character.has_identified( typeId() ) ) { if( book.skill ) { - const SkillLevel &skill = g->u.get_skill_level_object( book.skill ); + const SkillLevel &skill = player_character.get_skill_level_object( book.skill ); if( skill.can_train() && parts->test( iteminfo_parts::BOOK_SKILLRANGE_MAX ) ) { const std::string skill_name = book.skill->name(); std::string fmt = string_format( _( "Can bring your %s skill to " @@ -2901,11 +2942,11 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, _( "Requires intelligence of to easily " "read." ), iteminfo::lower_is_better, book.intel ) ); } - if( g->u.book_fun_for( *this, g->u ) != 0 && + if( player_character.book_fun_for( *this, player_character ) != 0 && parts->test( iteminfo_parts::BOOK_MORALECHANGE ) ) { info.push_back( iteminfo( "BOOK", "", _( "Reading this book affects your morale by " ), - iteminfo::show_plus, g->u.book_fun_for( *this, g->u ) ) ); + iteminfo::show_plus, player_character.book_fun_for( *this, player_character ) ) ); } if( parts->test( iteminfo_parts::BOOK_TIMEPERCHAPTER ) ) { std::string fmt = ngettext( @@ -2925,7 +2966,7 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, } if( book.chapters > 0 && parts->test( iteminfo_parts::BOOK_NUMUNREADCHAPTERS ) ) { - const int unread = get_remaining_chapters( g->u ); + const int unread = get_remaining_chapters( player_character ); std::string fmt = ngettext( "This book has unread chapter.", "This book has unread chapters.", unread ); @@ -2935,8 +2976,9 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, if( parts->test( iteminfo_parts::BOOK_INCLUDED_RECIPES ) ) { std::vector recipe_list; for( const islot_book::recipe_with_description_t &elem : book.recipes ) { - const bool knows_it = g->u.knows_recipe( elem.recipe ); - const bool can_learn = g->u.get_skill_level( elem.recipe->skill_used ) >= elem.skill_level; + const bool knows_it = player_character.knows_recipe( elem.recipe ); + const bool can_learn = player_character.get_skill_level( elem.recipe->skill_used ) >= + elem.skill_level; // If the player knows it, they recognize it even if it's not clearly stated. if( elem.is_hidden() && !knows_it ) { continue; @@ -3074,6 +3116,24 @@ void item::tool_info( std::vector &info, const iteminfo_query *parts, } else if( has_flag( flag_USES_BIONIC_POWER ) ) { info.emplace_back( "DESCRIPTION", _( "* This tool runs on bionic power." ) ); + } else if( has_flag( flag_BURNOUT ) && parts->test( iteminfo_parts::TOOL_BURNOUT ) ) { + int percent_left = 100 * ammo_remaining() / type->maximum_charges(); + std::string feedback; + if( percent_left == 100 ) { + feedback = _( "It's new, and ready to burn." ); + } else if( percent_left >= 75 ) { + feedback = _( "Almost new, with much material to burn." ); + } else if( percent_left >= 50 ) { + feedback = _( "More than a quarter has burned away." ); + } else if( percent_left >= 25 ) { + feedback = _( "More than half has burned away." ); + } else if( percent_left >= 10 ) { + feedback = _( "Less than a quarter left to burn." ); + } else { + feedback = _( "Almost completely burned out." ); + } + feedback = _( "Fuel: " ) + feedback; + info.push_back( iteminfo( "DESCRIPTION", feedback ) ); } } @@ -3126,7 +3186,7 @@ void item::disassembly_info( std::vector &info, const iteminfo_query * const recipe &dis = recipe_dictionary::get_uncraft( typeId() ); const requirement_data &req = dis.disassembly_requirements(); if( !req.is_empty() ) { - const std::string approx_time = to_string_approx( time_duration::from_turns( dis.time / 100 ) ); + const std::string approx_time = to_string_approx( dis.time_to_craft( get_player_character() ) ); const requirement_data::alter_item_comp_vector &comps_list = req.get_components(); const std::string comps_str = enumerate_as_string( comps_list.begin(), comps_list.end(), @@ -3409,9 +3469,11 @@ void item::combat_info( std::vector &info, const iteminfo_query *parts } } + Character &player_character = get_player_character(); // display which martial arts styles character can use with this weapon if( parts->test( iteminfo_parts::DESCRIPTION_APPLICABLEMARTIALARTS ) ) { - const std::string valid_styles = g->u.martial_arts_data.enumerate_known_styles( typeId() ); + const std::string valid_styles = player_character.martial_arts_data.enumerate_known_styles( + typeId() ); if( !valid_styles.empty() ) { insert_separation_line( info ); info.push_back( iteminfo( "DESCRIPTION", @@ -3435,13 +3497,13 @@ void item::combat_info( std::vector &info, const iteminfo_query *parts } ///\EFFECT_MELEE >2 allows seeing melee damage stats on weapons - if( ( g->u.get_skill_level( skill_melee ) > 2 && + if( ( player_character.get_skill_level( skill_melee ) > 2 && ( dmg_bash || dmg_cut || dmg_stab || type->m_to_hit > 0 ) ) || debug_mode ) { damage_instance non_crit; - g->u.roll_all_damage( false, non_crit, true, *this ); + player_character.roll_all_damage( false, non_crit, true, *this ); damage_instance crit; - g->u.roll_all_damage( true, crit, true, *this ); - int attack_cost = g->u.attack_speed( *this ); + player_character.roll_all_damage( true, crit, true, *this ); + int attack_cost = player_character.attack_speed( *this ); insert_separation_line( info ); if( parts->test( iteminfo_parts::DESCRIPTION_MELEEDMG ) ) { info.push_back( iteminfo( "DESCRIPTION", _( "Average melee damage:" ) ) ); @@ -3450,9 +3512,9 @@ void item::combat_info( std::vector &info, const iteminfo_query *parts if( parts->test( iteminfo_parts::DESCRIPTION_MELEEDMG_CRIT ) ) { info.push_back( iteminfo( "DESCRIPTION", string_format( _( "Critical hit chance %d%% - %d%%" ), - static_cast( g->u.crit_chance( 0, 100, *this ) * + static_cast( player_character.crit_chance( 0, 100, *this ) * 100 ), - static_cast( g->u.crit_chance( 100, 0, *this ) * + static_cast( player_character.crit_chance( 100, 0, *this ) * 100 ) ) ) ); } // Bash damage @@ -3576,8 +3638,9 @@ void item::final_info( std::vector &info, const iteminfo_query *parts, } } + avatar &player_character = get_avatar(); if( parts->test( iteminfo_parts::DESCRIPTION_ALLERGEN ) ) { - if( is_armor() && g->u.has_trait( trait_WOOLALLERGY ) && + if( is_armor() && player_character.has_trait( trait_WOOLALLERGY ) && ( made_of( material_id( "wool" ) ) || item_tags.count( "wooled" ) ) ) { info.push_back( iteminfo( "DESCRIPTION", _( "* This clothing will give you an allergic " @@ -3784,8 +3847,9 @@ void item::final_info( std::vector &info, const iteminfo_query *parts, if( parts->test( iteminfo_parts::DESCRIPTION_APPLICABLE_RECIPES ) ) { // with the inventory display allowing you to select items, showing the things you could make with contained items could be confusing. itype_id tid = typeId(); - const inventory &crafting_inv = g->u.crafting_inventory(); - const recipe_subset available_recipe_subset = g->u.get_available_recipes( crafting_inv ); + const inventory &crafting_inv = player_character.crafting_inventory(); + const recipe_subset available_recipe_subset = player_character.get_available_recipes( + crafting_inv ); const std::set &item_recipes = available_recipe_subset.of_component( tid ); if( item_recipes.empty() ) { @@ -3960,7 +4024,7 @@ const std::string &item::symbol() const nc_color item::color_in_inventory() const { // TODO: make a const reference - avatar &u = g->u; + avatar &player_character = get_avatar(); // Only item not otherwise colored gets colored as favorite nc_color ret = is_favorite ? c_white : c_light_gray; @@ -3970,10 +4034,12 @@ nc_color item::color_in_inventory() const static_cast( iuse->get_actor_ptr() ); for( const std::string &spell_id_str : actor_ptr->spells ) { const spell_id sp_id( spell_id_str ); - if( u.magic.knows_spell( sp_id ) && !u.magic.get_spell( sp_id ).is_max_level() ) { + if( player_character.magic.knows_spell( sp_id ) && + !player_character.magic.get_spell( sp_id ).is_max_level() ) { ret = c_yellow; } - if( !u.magic.knows_spell( sp_id ) && u.magic.can_learn_spell( u, sp_id ) ) { + if( !player_character.magic.knows_spell( sp_id ) && + player_character.magic.can_learn_spell( player_character, sp_id ) ) { return c_light_blue; } } @@ -3981,14 +4047,14 @@ nc_color item::color_in_inventory() const ret = c_cyan; } else if( has_flag( flag_LITCIG ) ) { ret = c_red; - } else if( is_armor() && u.has_trait( trait_WOOLALLERGY ) && + } else if( is_armor() && player_character.has_trait( trait_WOOLALLERGY ) && ( made_of( material_id( "wool" ) ) || item_tags.count( "wooled" ) ) ) { ret = c_red; } else if( is_filthy() || item_tags.count( "DIRTY" ) ) { ret = c_brown; } else if( is_bionic() ) { - if( !u.has_bionic( type->bionic->id ) ) { - ret = u.bionic_installation_issues( type->bionic->id ).empty() ? c_green : c_red; + if( !player_character.has_bionic( type->bionic->id ) ) { + ret = player_character.bionic_installation_issues( type->bionic->id ).empty() ? c_green : c_red; } else if( !has_flag( flag_NO_STERILE ) ) { ret = c_dark_gray; } @@ -4004,7 +4070,7 @@ nc_color item::color_in_inventory() const // Give color priority to allergy (allergy > inedible by freeze or other conditions) // TODO: refactor u.will_eat to let this section handle coloring priority without duplicating code. - if( u.allergy_type( *food ) != morale_type( "morale_null" ) ) { + if( player_character.allergy_type( *food ) != morale_type( "morale_null" ) ) { return c_red; } @@ -4014,7 +4080,7 @@ nc_color item::color_in_inventory() const // Red: morale penalty // Yellow: will rot soon // Cyan: will rot eventually - const ret_val rating = u.will_eat( *food ); + const ret_val rating = player_character.will_eat( *food ); // TODO: More colors switch( rating.value() ) { case EDIBLE: @@ -4046,8 +4112,9 @@ nc_color item::color_in_inventory() const // Gun with integrated mag counts as both for( const ammotype &at : ammo_types() ) { // get_ammo finds uncontained ammo, find_ammo finds ammo in magazines - bool has_ammo = !u.get_ammo( at ).empty() || !u.find_ammo( *this, false, -1 ).empty(); - bool has_mag = magazine_integral() || !u.find_ammo( *this, true, -1 ).empty(); + bool has_ammo = !player_character.get_ammo( at ).empty() || + !player_character.find_ammo( *this, false, -1 ).empty(); + bool has_mag = magazine_integral() || !player_character.find_ammo( *this, true, -1 ).empty(); if( has_ammo && has_mag ) { ret = c_green; break; @@ -4060,10 +4127,10 @@ nc_color item::color_in_inventory() const // Likewise, ammo is green if you have guns that use it // ltred if you have the gun but no mags // Gun with integrated mag counts as both - bool has_gun = u.has_item_with( [this]( const item & i ) { + bool has_gun = player_character.has_item_with( [this]( const item & i ) { return i.is_gun() && i.ammo_types().count( ammo_type() ); } ); - bool has_mag = u.has_item_with( [this]( const item & i ) { + bool has_mag = player_character.has_item_with( [this]( const item & i ) { return ( i.is_gun() && i.magazine_integral() && i.ammo_types().count( ammo_type() ) ) || ( i.is_magazine() && i.ammo_types().count( ammo_type() ) ); } ); @@ -4075,31 +4142,31 @@ nc_color item::color_in_inventory() const } else if( is_magazine() ) { // Magazines are green if you have guns and ammo for them // ltred if you have one but not the other - bool has_gun = u.has_item_with( [this]( const item & it ) { + bool has_gun = player_character.has_item_with( [this]( const item & it ) { return it.is_gun() && it.magazine_compatible().count( typeId() ) > 0; } ); - bool has_ammo = !u.find_ammo( *this, false, -1 ).empty(); + bool has_ammo = !player_character.find_ammo( *this, false, -1 ).empty(); if( has_gun && has_ammo ) { ret = c_green; } else if( has_gun || has_ammo ) { ret = c_light_red; } } else if( is_book() ) { - if( u.has_identified( typeId() ) ) { + if( player_character.has_identified( typeId() ) ) { const islot_book &tmp = *type->book; if( tmp.skill && // Book can improve skill: blue - u.get_skill_level_object( tmp.skill ).can_train() && - u.get_skill_level( tmp.skill ) >= tmp.req && - u.get_skill_level( tmp.skill ) < tmp.level ) { + player_character.get_skill_level_object( tmp.skill ).can_train() && + player_character.get_skill_level( tmp.skill ) >= tmp.req && + player_character.get_skill_level( tmp.skill ) < tmp.level ) { ret = c_light_blue; } else if( type->can_use( "MA_MANUAL" ) && - !u.martial_arts_data.has_martialart( martial_art_learned_from( *type ) ) ) { + !player_character.martial_arts_data.has_martialart( martial_art_learned_from( *type ) ) ) { ret = c_light_blue; } else if( tmp.skill && // Book can't improve skill right now, but maybe later: pink - u.get_skill_level_object( tmp.skill ).can_train() && - u.get_skill_level( tmp.skill ) < tmp.level ) { + player_character.get_skill_level_object( tmp.skill ).can_train() && + player_character.get_skill_level( tmp.skill ) < tmp.level ) { ret = c_pink; - } else if( !u.studied_all_recipes( + } else if( !player_character.studied_all_recipes( *type ) ) { // Book can't improve skill anymore, but has more recipes: yellow ret = c_yellow; } @@ -4115,26 +4182,32 @@ void item::on_wear( Character &p ) if( is_sided() && get_side() == side::BOTH ) { if( has_flag( flag_SPLINT ) ) { set_side( side::LEFT ); - if( ( covers( bodypart_id( "leg_l" ) ) && p.is_limb_broken( hp_leg_r ) && + if( ( covers( bodypart_id( "leg_l" ) ) && p.is_limb_broken( bodypart_id( "leg_r" ) ) && !p.worn_with_flag( flag_SPLINT, bodypart_id( "leg_r" ) ) ) || - ( covers( bodypart_id( "arm_l" ) ) && p.is_limb_broken( hp_arm_r ) && + ( covers( bodypart_id( "arm_l" ) ) && p.is_limb_broken( bodypart_id( "arm_r" ) ) && !p.worn_with_flag( flag_SPLINT, bodypart_id( "arm_r" ) ) ) ) { set_side( side::RIGHT ); } + } else if( has_flag( flag_TOURNIQUET ) ) { + set_side( side::LEFT ); + if( ( covers( bodypart_id( "leg_l" ) ) && p.has_effect( effect_bleed, bp_leg_r ) && + !p.worn_with_flag( flag_TOURNIQUET, bodypart_id( "leg_r" ) ) ) || + ( covers( bodypart_id( "arm_l" ) ) && p.has_effect( effect_bleed, bp_arm_r ) && + !p.worn_with_flag( flag_TOURNIQUET, bodypart_id( "arm_r" ) ) ) ) { + set_side( side::RIGHT ); + } } else { // for sided items wear the item on the side which results in least encumbrance int lhs = 0; int rhs = 0; set_side( side::LEFT ); - const auto left_enc = p.get_encumbrance( *this ); - for( const body_part bp : all_body_parts ) { - lhs += left_enc[bp].encumbrance; + for( const bodypart_id &bp : p.get_all_body_parts() ) { + lhs += p.get_part_encumbrance_data( bp ).encumbrance; } set_side( side::RIGHT ); - const auto right_enc = p.get_encumbrance( *this ); - for( const body_part bp : all_body_parts ) { - rhs += right_enc[bp].encumbrance; + for( const bodypart_id &bp : p.get_all_body_parts() ) { + rhs += p.get_part_encumbrance_data( bp ).encumbrance; } set_side( lhs <= rhs ? side::LEFT : side::RIGHT ); @@ -4142,11 +4215,11 @@ void item::on_wear( Character &p ) } // TODO: artifacts currently only work with the player character - if( &p == &g->u && type->artifact ) { + if( p.is_avatar() && type->artifact ) { g->add_artifact_messages( type->artifact->effects_worn ); } // if game is loaded - don't want ownership assigned during char creation - if( g->u.getID().is_valid() ) { + if( get_player_character().getID().is_valid() ) { handle_pickup_ownership( p ); } p.on_item_wear( *this ); @@ -4164,7 +4237,7 @@ void item::on_takeoff( Character &p ) void item::on_wield( player &p, int mv ) { // TODO: artifacts currently only work with the player character - if( &p == &g->u && type->artifact ) { + if( p.is_avatar() && type->artifact ) { g->add_artifact_messages( type->artifact->effects_wielded ); } @@ -4209,7 +4282,7 @@ void item::on_wield( player &p, int mv ) msg = _( "You wield your %s." ); } // if game is loaded - don't want ownership assigned during char creation - if( g->u.getID().is_valid() ) { + if( get_player_character().getID().is_valid() ) { handle_pickup_ownership( p ); } p.add_msg_if_player( m_neutral, msg, tname() ); @@ -4227,15 +4300,16 @@ void item::handle_pickup_ownership( Character &c ) if( is_owned_by( c ) ) { return; } + Character &player_character = get_player_character(); // Add ownership to item if unowned if( owner.is_null() ) { set_owner( c ); } else { - if( !is_owned_by( c ) && &c == &g->u ) { + if( !is_owned_by( c ) && c.is_avatar() ) { std::vector witnesses; for( npc &elem : g->all_npcs() ) { - if( rl_dist( elem.pos(), g->u.pos() ) < MAX_VIEW_DISTANCE && elem.get_faction() && - is_owned_by( elem ) && elem.sees( g->u.pos() ) ) { + if( rl_dist( elem.pos(), player_character.pos() ) < MAX_VIEW_DISTANCE && + elem.get_faction() && is_owned_by( elem ) && elem.sees( player_character.pos() ) ) { elem.say( "", 7 ); npc *npc_to_add = &elem; witnesses.push_back( npc_to_add ); @@ -4267,11 +4341,11 @@ void item::on_pickup( Character &p ) return; } // TODO: artifacts currently only work with the player character - if( &p == &g->u && type->artifact ) { + if( p.is_avatar() && type->artifact ) { g->add_artifact_messages( type->artifact->effects_carried ); } // if game is loaded - don't want ownership assigned during char creation - if( g->u.getID().is_valid() ) { + if( get_player_character().getID().is_valid() ) { handle_pickup_ownership( p ); } contents.on_pickup( p ); @@ -4412,11 +4486,13 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t maintext = label( quantity ); } + Character &player_character = get_player_character(); std::string tagtext; if( is_food() ) { - if( has_flag( flag_HIDDEN_POISON ) && g->u.get_skill_level( skill_survival ) >= 3 ) { + if( has_flag( flag_HIDDEN_POISON ) && player_character.get_skill_level( skill_survival ) >= 3 ) { tagtext += _( " (poisonous)" ); - } else if( has_flag( flag_HIDDEN_HALLU ) && g->u.get_skill_level( skill_survival ) >= 5 ) { + } else if( has_flag( flag_HIDDEN_HALLU ) && + player_character.get_skill_level( skill_survival ) >= 5 ) { tagtext += _( " (hallucinogenic)" ); } } @@ -4449,7 +4525,7 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t } } - const sizing sizing_level = get_sizing( g->u, get_encumber( g->u ) != 0 ); + const sizing sizing_level = get_sizing( player_character, get_encumber( player_character ) != 0 ); if( sizing_level == sizing::human_sized_small_char ) { tagtext += _( " (too big)" ); @@ -4500,7 +4576,7 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t if( has_flag( flag_WET ) ) { tagtext += _( " (wet)" ); } - if( already_used_by_player( g->u ) ) { + if( already_used_by_player( player_character ) ) { tagtext += _( " (used)" ); } if( active && ( has_flag( flag_WATER_EXTINGUISH ) || has_flag( flag_LITCIG ) ) ) { @@ -4580,13 +4656,14 @@ std::string item::display_name( unsigned int quantity ) const sidetxt = string_format( " (%s)", _( "right" ) ); break; } + avatar &player_character = get_avatar(); int amount = 0; int max_amount = 0; bool show_amt = false; // We should handle infinite charges properly in all cases. if( is_book() && get_chapters() > 0 ) { // a book which has remaining unread chapters - amount = get_remaining_chapters( g->u ); + amount = get_remaining_chapters( player_character ); } else if( magazine_current() ) { show_amt = true; const item *mag = magazine_current(); @@ -4665,7 +4742,7 @@ std::string item::display_name( unsigned int quantity ) const // HACK: This is a hack to prevent possible crashing when displaying maps as items during character creation if( is_map() && calendar::turn != calendar::turn_zero ) { const city *c = overmap_buffer.closest_city( omt_to_sm_copy( get_var( "reveal_map_center_omt", - g->u.global_omt_location() ) ) ).city; + player_character.global_omt_location() ) ) ).city; if( c != nullptr ) { name = string_format( "%s %s", c->name, name ); } @@ -4797,7 +4874,7 @@ units::mass item::weight( bool, bool integral ) const // reduce weight for sawn-off weapons capped to the apportioned weight of the barrel if( gunmod_find( itype_barrel_small ) ) { - const units::volume b = type->gun->barrel_length; + const units::volume b = type->gun->barrel_volume; const units::mass max_barrel_weight = units::from_gram( to_milliliter( b ) ); const units::mass barrel_weight = units::from_gram( b.value() * type->weight.value() / type->volume.value() ); @@ -4929,7 +5006,7 @@ units::volume item::volume( bool integral ) const if( has_flag( flag_COLLAPSIBLE_STOCK ) ) { // consider only the base size of the gun (without mods) int tmpvol = get_var( "volume", - ( type->volume - type->gun->barrel_length ) / units::legacy_volume_factor ); + ( type->volume - type->gun->barrel_volume ) / units::legacy_volume_factor ); if( tmpvol <= 3 ) { // intentional NOP } else if( tmpvol <= 5 ) { @@ -4948,7 +5025,7 @@ units::volume item::volume( bool integral ) const } if( gunmod_find( itype_barrel_small ) ) { - ret -= type->gun->barrel_length; + ret -= type->gun->barrel_volume; } } @@ -5652,7 +5729,7 @@ bool item::ready_to_revive( const tripoint &pos ) const if( !can_revive() ) { return false; } - if( g->m.veh_at( pos ) ) { + if( get_map().veh_at( pos ) ) { return false; } if( !calendar::once_every( 1_seconds ) ) { @@ -5668,7 +5745,7 @@ bool item::ready_to_revive( const tripoint &pos ) const // If we're a special revival zombie, wait to get up until the player is nearby. const bool isReviveSpecial = has_flag( flag_REVIVE_SPECIAL ); if( isReviveSpecial ) { - const int distance = rl_dist( pos, g->u.pos() ); + const int distance = rl_dist( pos, get_player_character().pos() ); if( distance > 3 ) { return false; } @@ -6577,6 +6654,13 @@ bool item::is_reloadable_helper( const itype_id &ammo, bool now ) const return false; } } + //Now single shoted gun also has magazine_well slot for speedloader + //If ammo is not an ammo it may be dangerous to use parameters like ammo->ammo->type + //It is complicated: normal magazine in addition to speedloader? Magazines of mods? + if( now && !ammo->ammo ) { + return magazine_compatible().count( ammo ); + } + return now ? ammo_remaining() < ammo_capacity( ammo->ammo->type ) : true; } return magazine_compatible().count( ammo ); @@ -7065,16 +7149,12 @@ int item::ammo_remaining() const } if( is_tool() ) { - // dirty hack for UPS, hopefully temporary - if( typeId() == itype_UPS_off || typeId() == itype_adv_UPS_off ) { - return charges; - } if( ammo_types().empty() || !contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE ) ) { // includes auxiliary gunmods if( has_flag( flag_USES_BIONIC_POWER ) ) { - int power = units::to_kilojoule( g->u.get_power_level() ); + int power = units::to_kilojoule( get_player_character().get_power_level() ); return power; } return charges; @@ -7097,6 +7177,15 @@ int item::ammo_remaining() const return res; } + // Handle non-magazines with ammo_restriction in a CONTAINER type pocket (like quivers) + if( !ammo_types().empty() ) { + int res = 0; + for( const item *e : contents.all_items_top( item_pocket::pocket_type::CONTAINER ) ) { + res += e->charges; + } + return res; + } + return 0; } @@ -7166,9 +7255,10 @@ int item::ammo_consume( int qty, const tripoint &pos ) if( !contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE ) || ( is_tool() && type->tool->ammo_id.empty() ) ) { qty = std::min( qty, charges ); + Character &player_character = get_player_character(); if( has_flag( flag_USES_BIONIC_POWER ) ) { - charges = units::to_kilojoule( g->u.get_power_level() ); - g->u.mod_power_level( units::from_kilojoule( -qty ) ); + charges = units::to_kilojoule( player_character.get_power_level() ); + player_character.mod_power_level( units::from_kilojoule( -qty ) ); } charges -= qty; if( charges == 0 ) { @@ -7326,23 +7416,8 @@ itype_id item::magazine_default( bool conversion ) const return itype_id::NULL_ID(); } -std::set item::magazine_compatible( bool conversion ) const +std::set item::magazine_compatible( bool /* conversion */ ) const { - std::set mags = {}; - // mods that define magazine_adaptor may override the items usual magazines - const std::vector &mods = is_gun() ? gunmods() : toolmods(); - for( const item *m : mods ) { - if( !m->type->mod->magazine_adaptor.empty() ) { - for( const ammotype &atype : ammo_types( conversion ) ) { - if( m->type->mod->magazine_adaptor.count( atype ) ) { - std::set magazines_for_atype = m->type->mod->magazine_adaptor.find( atype )->second; - mags.insert( magazines_for_atype.begin(), magazines_for_atype.end() ); - } - } - return mags; - } - } - return contents.magazine_compatible(); } @@ -7366,6 +7441,11 @@ std::vector item::gunmods() const return contents.gunmods(); } +std::vector item::mods() const +{ + return contents.mods(); +} + item *item::gunmod_find( const itype_id &mod ) { std::vector mods = gunmods(); @@ -8270,7 +8350,8 @@ int item::fill_with( const itype &contained, const int amount ) item_pocket *pocket = best_pocket( contained_item ); if( pocket == nullptr ) { - debugmsg( "tried to put an item in a container that cannot contain it" ); + debugmsg( "tried to put an item (%s) in a container (%s) that cannot contain it", + contained_item.typeId().str(), typeId().str() ); return 0; } @@ -8391,6 +8472,15 @@ const item_category &item::get_category() const return type->category_force.is_valid() ? type->category_force.obj() : null_category; } +const item_category &item::get_category_of_contents() const +{ + if( type->category_force == item_category_container && contents.num_item_stacks() == 1 ) { + return contents.only_item().get_category(); + } else { + return this->get_category(); + } +} + iteminfo::iteminfo( const std::string &Type, const std::string &Name, const std::string &Fmt, flags Flags, double Value ) { @@ -8527,7 +8617,7 @@ bool item_compare_by_charges( const item &left, const item &right ) } static const std::string USED_BY_IDS( "USED_BY_IDS" ); -bool item::already_used_by_player( const player &p ) const +bool item::already_used_by_player( const Character &p ) const { const auto it = item_vars.find( USED_BY_IDS ); if( it == item_vars.end() ) { @@ -8704,7 +8794,7 @@ bool item::process_temperature_rot( float insulation, const tripoint &pos, const weather_generator &wgen = g->weather.get_cur_weather_gen(); const unsigned int seed = g->get_seed(); - int local_mod = g->new_game ? 0 : g->m.get_temperature( pos ); + int local_mod = g->new_game ? 0 : get_map().get_temperature( pos ); int enviroment_mod; // Toilets and vending machines will try to get the heat radiation and convection during mapgen and segfault. @@ -9022,11 +9112,16 @@ void item::process_artifact( player *carrier, const tripoint & /*pos*/ ) // don't consider npcs. Also they are not processed when laying on the ground. // TODO: change game::process_artifact to work with npcs, // TODO: consider moving game::process_artifact here. - if( carrier == &g->u ) { + if( carrier && carrier->is_avatar() ) { g->process_artifact( *this, *carrier ); } } +void item::overwrite_relic( const relic &nrelic ) +{ + this->relic_data = cata::make_value( nrelic ); +} + void item::process_relic( Character *carrier ) { if( !is_relic() ) { @@ -9069,7 +9164,7 @@ bool item::process_corpse( player *carrier, const tripoint &pos ) } if( rng( 0, volume() / units::legacy_volume_factor ) > burnt && g->revive_corpse( pos, *this ) ) { if( carrier == nullptr ) { - if( g->u.sees( pos ) ) { + if( get_player_character().sees( pos ) ) { if( corpse->in_species( species_ROBOT ) ) { add_msg( m_warning, _( "A nearby robot has repaired itself and stands up!" ) ); } else { @@ -9094,13 +9189,15 @@ bool item::process_corpse( player *carrier, const tripoint &pos ) bool item::process_fake_mill( player * /*carrier*/, const tripoint &pos ) { - if( g->m.furn( pos ) != furn_str_id( "f_wind_mill_active" ) && - g->m.furn( pos ) != furn_str_id( "f_water_mill_active" ) ) { + map &here = get_map(); + if( here.furn( pos ) != furn_str_id( "f_wind_mill_active" ) && + here.furn( pos ) != furn_str_id( "f_water_mill_active" ) ) { item_counter = 0; return true; //destroy fake mill } if( age() >= 6_hours || item_counter == 0 ) { - iexamine::mill_finalize( g->u, pos, birthday() ); //activate effects when timers goes to zero + iexamine::mill_finalize( get_avatar(), pos, + birthday() ); //activate effects when timers goes to zero return true; //destroy fake mill item } @@ -9109,8 +9206,9 @@ bool item::process_fake_mill( player * /*carrier*/, const tripoint &pos ) bool item::process_fake_smoke( player * /*carrier*/, const tripoint &pos ) { - if( g->m.furn( pos ) != furn_str_id( "f_smoking_rack_active" ) && - g->m.furn( pos ) != furn_str_id( "f_metal_smoking_rack_active" ) ) { + map &here = get_map(); + if( here.furn( pos ) != furn_str_id( "f_smoking_rack_active" ) && + here.furn( pos ) != furn_str_id( "f_metal_smoking_rack_active" ) ) { item_counter = 0; return true; //destroy fake smoke } @@ -9133,6 +9231,7 @@ bool item::process_litcig( player *carrier, const tripoint &pos ) if( !active ) { return false; } + map &here = get_map(); // if carried by someone: if( carrier != nullptr ) { time_duration duration = 15_seconds; @@ -9153,24 +9252,24 @@ bool item::process_litcig( player *carrier, const tripoint &pos ) ( carrier->has_trait( trait_JITTERY ) && one_in( 200 ) ) ) { carrier->add_msg_if_player( m_bad, _( "Your shaking hand causes you to drop your %s." ), tname() ); - g->m.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this ); + here.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this ); return true; // removes the item that has just been added to the map } if( carrier->has_effect( effect_sleep ) ) { carrier->add_msg_if_player( m_bad, _( "You fall asleep and drop your %s." ), tname() ); - g->m.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this ); + here.add_item_or_charges( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), *this ); return true; // removes the item that has just been added to the map } } else { // If not carried by someone, but laying on the ground: if( item_counter % 5 == 0 ) { // lit cigarette can start fires - if( g->m.flammable_items_at( pos ) || - g->m.has_flag( flag_FLAMMABLE, pos ) || - g->m.has_flag( flag_FLAMMABLE_ASH, pos ) ) { - g->m.add_field( pos, fd_fire, 1 ); + if( here.flammable_items_at( pos ) || + here.has_flag( flag_FLAMMABLE, pos ) || + here.has_flag( flag_FLAMMABLE_ASH, pos ) ) { + here.add_field( pos, fd_fire, 1 ); } } } @@ -9188,7 +9287,7 @@ bool item::process_litcig( player *carrier, const tripoint &pos ) convert( itype_joint_roach ); if( carrier != nullptr ) { carrier->add_effect( effect_weed_high, 1_minutes ); // one last puff - g->m.add_field( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), fd_weedsmoke, 2 ); + here.add_field( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), fd_weedsmoke, 2 ); weed_msg( *carrier ); } } @@ -9206,33 +9305,27 @@ bool item::process_extinguish( player *carrier, const tripoint &pos ) bool submerged = false; bool precipitation = false; bool windtoostrong = false; - w_point weatherPoint = *g->weather.weather_precise; - int windpower = g->weather.windspeed; - switch( g->weather.weather ) { - case WEATHER_LIGHT_DRIZZLE: + w_point weatherPoint = *get_weather().weather_precise; + int windpower = get_weather().windspeed; + switch( get_weather().weather_id->precip ) { + case precip_class::very_light: precipitation = one_in( 100 ); break; - case WEATHER_DRIZZLE: - case WEATHER_FLURRIES: + case precip_class::light: precipitation = one_in( 50 ); break; - case WEATHER_RAINY: - case WEATHER_SNOW: - precipitation = one_in( 25 ); - break; - case WEATHER_THUNDER: - case WEATHER_LIGHTNING: - case WEATHER_SNOWSTORM: + case precip_class::heavy: precipitation = one_in( 10 ); break; default: break; } - if( in_inv && g->m.has_flag( flag_DEEP_WATER, pos ) ) { + map &here = get_map(); + if( in_inv && here.has_flag( flag_DEEP_WATER, pos ) ) { extinguish = true; submerged = true; } - if( ( !in_inv && g->m.has_flag( flag_LIQUID, pos ) ) || + if( ( !in_inv && here.has_flag( flag_LIQUID, pos ) ) || ( precipitation && !g->is_sheltered( pos ) ) ) { extinguish = true; } @@ -9270,7 +9363,7 @@ bool item::process_extinguish( player *carrier, const tripoint &pos ) if( type->tool->revert_to ) { convert( *type->tool->revert_to ); } else { - type->invoke( carrier != nullptr ? *carrier : g->u, *this, pos, "transform" ); + type->invoke( carrier != nullptr ? *carrier : get_avatar(), *this, pos, "transform" ); } } @@ -9285,7 +9378,8 @@ cata::optional item::get_cable_target( Character *p, const tripoint &p if( state != "pay_out_cable" && state != "cable_charger_link" ) { return cata::nullopt; } - const optional_vpart_position vp_pos = g->m.veh_at( pos ); + map &here = get_map(); + const optional_vpart_position vp_pos = here.veh_at( pos ); if( vp_pos ) { const cata::optional seat = vp_pos.part_with_feature( "BOARDABLE", true ); if( seat && p == seat->vehicle().get_passenger( seat->part_index() ) ) { @@ -9296,7 +9390,7 @@ cata::optional item::get_cable_target( Character *p, const tripoint &p tripoint source2( get_var( "source_x", 0 ), get_var( "source_y", 0 ), get_var( "source_z", 0 ) ); tripoint source( source2 ); - return g->m.getlocal( source ); + return here.getlocal( source ); } bool item::process_cable( player *carrier, const tripoint &pos ) @@ -9333,7 +9427,8 @@ bool item::process_cable( player *carrier, const tripoint &pos ) return false; } - if( !g->m.veh_at( *source ) || ( source->z != g->get_levz() && !g->m.has_zlevels() ) ) { + map &here = get_map(); + if( !here.veh_at( *source ) || ( source->z != g->get_levz() && !here.has_zlevels() ) ) { if( carrier->has_item( *this ) ) { carrier->add_msg_if_player( m_bad, _( "You notice the cable has come loose!" ) ); } @@ -9425,6 +9520,7 @@ bool item::process_tool( player *carrier, const tripoint &pos ) } } + avatar &player_character = get_avatar(); // if insufficient available charges shutdown the tool if( energy > 0 ) { if( carrier && has_flag( flag_USE_UPS ) ) { @@ -9433,7 +9529,7 @@ bool item::process_tool( player *carrier, const tripoint &pos ) // invoking the object can convert the item to another type const bool had_revert_to = type->tool->revert_to.has_value(); - type->invoke( carrier != nullptr ? *carrier : g->u, *this, pos ); + type->invoke( carrier != nullptr ? *carrier : player_character, *this, pos ); if( had_revert_to ) { deactivate( carrier ); return false; @@ -9442,7 +9538,7 @@ bool item::process_tool( player *carrier, const tripoint &pos ) } } - type->tick( carrier != nullptr ? *carrier : g->u, *this, pos ); + type->tick( carrier != nullptr ? *carrier : player_character, *this, pos ); return false; } @@ -9457,12 +9553,12 @@ bool item::process_blackpowder_fouling( player *carrier ) return false; } -bool item::process( player *carrier, const tripoint &pos, bool activate, float insulation, +bool item::process( player *carrier, const tripoint &pos, float insulation, temperature_flag flag, float spoil_multiplier_parent ) { - contents.process( carrier, pos, activate, type->insulation_factor * insulation, flag, + contents.process( carrier, pos, type->insulation_factor * insulation, flag, spoil_multiplier_parent ); - return process_internal( carrier, pos, activate, insulation, flag, spoil_multiplier_parent ); + return process_internal( carrier, pos, insulation, flag, spoil_multiplier_parent ); } void item::set_last_rot_check( const time_point &pt ) @@ -9470,7 +9566,7 @@ void item::set_last_rot_check( const time_point &pt ) last_rot_check = pt; } -bool item::process_internal( player *carrier, const tripoint &pos, bool activate, +bool item::process_internal( player *carrier, const tripoint &pos, float insulation, const temperature_flag flag, float spoil_modifier ) { if( has_flag( flag_ETHEREAL_ITEM ) ) { @@ -9489,9 +9585,6 @@ bool item::process_internal( player *carrier, const tripoint &pos, bool activate return process_blackpowder_fouling( carrier ); } - if( activate ) { - return type->invoke( carrier != nullptr ? *carrier : g->u, *this, pos ); - } // How this works: it checks what kind of processing has to be done // (e.g. for food, for drying towels, lit cigars), and if that matches, // call the processing function. If that function returns true, the item @@ -9510,14 +9603,15 @@ bool item::process_internal( player *carrier, const tripoint &pos, bool activate } if( item_counter == 0 && type->countdown_action ) { - type->countdown_action.call( carrier ? *carrier : g->u, *this, false, pos ); + type->countdown_action.call( carrier ? *carrier : get_avatar(), *this, false, pos ); if( type->countdown_destroy ) { return true; } } + map &here = get_map(); for( const emit_id &e : type->emits ) { - g->m.emit_field( pos, e ); + here.emit_field( pos, e ); } if( has_flag( flag_FAKE_SMOKE ) && process_fake_smoke( carrier, pos ) ) { @@ -9555,7 +9649,7 @@ bool item::process_internal( player *carrier, const tripoint &pos, bool activate if( has_temperature() && process_temperature_rot( insulation, pos, carrier, flag, spoil_modifier ) ) { if( is_comestible() ) { - g->m.rotten_item_spawn( *this, pos ); + here.rotten_item_spawn( *this, pos ); } return true; } @@ -9833,7 +9927,7 @@ bool item::is_filthy() const bool item::on_drop( const tripoint &pos ) { - return on_drop( pos, g->m ); + return on_drop( pos, get_map() ); } bool item::on_drop( const tripoint &pos, map &m ) @@ -9845,8 +9939,9 @@ bool item::on_drop( const tripoint &pos, map &m ) item_tags.insert( "DIRTY" ); } - g->u.flag_encumbrance(); - return type->drop_action && type->drop_action.call( g->u, *this, false, pos ); + avatar &player_character = get_avatar(); + player_character.flag_encumbrance(); + return type->drop_action && type->drop_action.call( player_character, *this, false, pos ); } time_duration item::age() const @@ -10011,7 +10106,7 @@ units::volume item::check_for_free_space( const item *it ) const if( containedPockets.success() ) { volume += check_for_free_space( container ); - for( auto pocket : containedPockets.value() ) { + for( const auto &pocket : containedPockets.value() ) { if( pocket.rigid() ) { volume += pocket.remaining_volume(); } diff --git a/src/item.h b/src/item.h index 773cd3dfd4424..bed8e0a9b7dc6 100644 --- a/src/item.h +++ b/src/item.h @@ -231,6 +231,14 @@ class item : public visitable /** Filter converting instance to active state */ item &activate(); + /** + * Invoke use function on a thrown item that had "ACT_ON_RANGED_HIT" flag. + * The function is called on the spot where the item landed. + * @param pos position + * @return true if the item was destroyed (exploded) + */ + bool activate_thrown( const tripoint &pos ); + /** * Add or remove energy from a battery. * If adding the specified energy quantity would go over the battery's capacity fill @@ -455,6 +463,9 @@ class item : public visitable // Returns the category of this item. const item_category &get_category() const; + // Returns the category of item inside this item. I.e. "can of meat" would be food, instead of container. + // If there are multiple items/stacks or none then it defaults to category of this item. + const item_category &get_category_of_contents() const; class reload_option { @@ -684,6 +695,13 @@ class item : public visitable /** Whether this is container. Note that container does not necessarily means it's * suitable for liquids. */ bool is_container() const; + + /** + * Updates the pockets of this item to be correct based on the mods that are installed. + * Pockets which are modified that contain an item will be spilled + * NOTE: This assumes that there is always one and only one pocket where ammo goes (mag or mag well) + */ + void update_modified_pockets(); // for pocket update stuff, which pocket is @contained in? // returns a nullptr if the item is not contaiend, and prints a debug message item_pocket *contained_where( const item &contained ); @@ -730,9 +748,9 @@ class item : public visitable return contents.has_pocket_type( item_pocket::pocket_type::CONTAINER ); } /** - * Puts the given item into this one, no checks are performed. + * Puts the given item into this one. */ - void put_in( const item &payload, item_pocket::pocket_type pk_type ); + ret_val put_in( const item &payload, item_pocket::pocket_type pk_type ); /** * Returns this item into its default container. If it does not have a default container, @@ -1086,7 +1104,7 @@ class item : public visitable * Check whether the item has been marked (by calling mark_as_used_by_player) * as used by this specific player. */ - bool already_used_by_player( const player &p ) const; + bool already_used_by_player( const Character &p ) const; /** * Marks the item as being used by this specific player, it remains unmarked * for other players. The player is identified by its id. @@ -1111,7 +1129,7 @@ class item : public visitable * should than delete the item wherever it was stored. * Returns false if the item is not destroyed. */ - bool process( player *carrier, const tripoint &pos, bool activate, float insulation = 1, + bool process( player *carrier, const tripoint &pos, float insulation = 1, temperature_flag flag = temperature_flag::NORMAL, float spoil_multiplier_parent = 1.0f ); /** @@ -1141,6 +1159,8 @@ class item : public visitable void process_artifact( player *carrier, const tripoint &pos ); void process_relic( Character *carrier ); + void overwrite_relic( const relic &nrelic ); + bool destroyed_at_zero_charges() const; // Most of the is_whatever() functions call the same function in our itype bool is_null() const; // True if type is NULL, or points to the null item (id == 0) @@ -1749,19 +1769,17 @@ class item : public visitable const itype *ammo_data() const; /** Specific ammo type, returns "null" if item is neither ammo nor loaded with any */ itype_id ammo_current() const; - /** Set of ammo types (@ref ammunition_type) used by item - * @param conversion whether to include the effect of any flags or mods which convert the type - * @return empty set if item does not use a specific ammo type (and is consequently not reloadable) */ - std::set ammo_types( bool conversion = true ) const; - /** Ammo type of an ammo item * @return ammotype of ammo item or a null id if the item is not ammo */ ammotype ammo_type() const; - /** Get default ammo used by item or a null id if item does not have a default ammo type + /** Ammo types (@ref ammunition_type) the item magazine pocket can contain. * @param conversion whether to include the effect of any flags or mods which convert the type - * @return itype_id::NULL_ID() if item does not use a specific ammo type - * (and is consequently not reloadable) */ + * @return empty set if item does not have a magazine for a specific ammo type */ + std::set ammo_types( bool conversion = true ) const; + /** Default ammo for the the item magazine pocket, if item has ammo_types(). + * @param conversion whether to include the effect of any flags or mods which convert the type + * @return itype_id::NULL_ID() if item does have a magazine for a specific ammo type */ itype_id ammo_default( bool conversion = true ) const; /** Get default ammo for the first ammotype common to an item and its current magazine or "NULL" if none exists @@ -1807,6 +1825,8 @@ class item : public visitable std::vector gunmods(); std::vector gunmods() const; + std::vector mods() const; + /** Get first attached gunmod matching type or nullptr if no such mod or item is not a gun */ item *gunmod_find( const itype_id &mod ); const item *gunmod_find( const itype_id &mod ) const; @@ -2110,7 +2130,7 @@ class item : public visitable bool use_amount_internal( const itype_id &it, int &quantity, std::list &used, const std::function &filter = return_true ); const use_function *get_use_internal( const std::string &use_name ) const; - bool process_internal( player *carrier, const tripoint &pos, bool activate, float insulation = 1, + bool process_internal( player *carrier, const tripoint &pos, float insulation = 1, temperature_flag flag = temperature_flag::NORMAL, float spoil_modifier = 1.0f ); /** * Calculate the thermal energy and temperature change of the item diff --git a/src/item_action.cpp b/src/item_action.cpp index d9b773b4917c0..dc93f78f2cef2 100644 --- a/src/item_action.cpp +++ b/src/item_action.cpp @@ -261,7 +261,7 @@ void game::item_action_menu() kmenu.text = _( "Execute which action?" ); kmenu.input_category = "ITEM_ACTIONS"; input_context ctxt( "ITEM_ACTIONS" ); - for( const auto &id : item_actions ) { + for( const std::pair &id : item_actions ) { ctxt.register_action( id.first, id.second.name ); kmenu.additional_actions.emplace_back( id.first, id.second.name ); } diff --git a/src/item_contents.cpp b/src/item_contents.cpp index 0d0d3c9e33034..8b14c7a56126b 100644 --- a/src/item_contents.cpp +++ b/src/item_contents.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "avatar.h" #include "character.h" @@ -147,8 +148,8 @@ bool pocket_favorite_callback::key( const input_context &, const input_event &ev } std::sort( itype_initializer.begin(), itype_initializer.end(), localized_compare ); - for( const std::pair it : nearby_itypes ) { - selector_menu.addentry( it.first ); + for( const std::string &it : itype_initializer ) { + selector_menu.addentry( it ); } selector_menu.query(); @@ -190,6 +191,10 @@ item_contents::item_contents( const std::vector &pockets ) contents.push_back( item_pocket( &data ) ); } } +bool item_contents::empty_real() const +{ + return contents.empty(); +} bool item_contents::empty() const { @@ -247,7 +252,7 @@ bool item_contents::bigger_on_the_inside( const units::volume &container_volume } } } - return container_volume < min_logical_volume; + return container_volume <= min_logical_volume; } size_t item_contents::size() const @@ -255,6 +260,17 @@ size_t item_contents::size() const return contents.size(); } +void item_contents::read_mods( const item_contents &read_input ) +{ + for( const item_pocket &pocket : read_input.contents ) { + if( pocket.saved_type() == item_pocket::pocket_type::MOD ) { + for( const item *it : pocket.all_items_top() ) { + insert_item( *it, item_pocket::pocket_type::MOD ); + } + } + } +} + void item_contents::combine( const item_contents &read_input ) { std::vector uninserted_items; @@ -262,6 +278,18 @@ void item_contents::combine( const item_contents &read_input ) for( const item_pocket &pocket : read_input.contents ) { if( pocket_index < contents.size() ) { + if( pocket.saved_type() == item_pocket::pocket_type::MOD ) { + // this is already handled in item_contents::read_mods + ++pocket_index; + continue; + } else if( pocket.saved_type() == item_pocket::pocket_type::MIGRATION || + pocket.saved_type() == item_pocket::pocket_type::CORPSE ) { + for( const item *it : pocket.all_items_top() ) { + insert_item( *it, pocket.saved_type() ); + } + ++pocket_index; + continue; + } auto current_pocket_iter = contents.begin(); std::advance( current_pocket_iter, pocket_index ); @@ -287,50 +315,76 @@ void item_contents::combine( const item_contents &read_input ) } for( const item &uninserted_item : uninserted_items ) { - insert_item( uninserted_item, item_pocket::pocket_type::MIGRATION ); + if( !insert_item( uninserted_item, item_pocket::pocket_type::MOD ).success() ) { + insert_item( uninserted_item, item_pocket::pocket_type::MIGRATION ); + } } } -ret_val item_contents::find_pocket_for( const item &it, - item_pocket::pocket_type pk_type ) -{ - static item_pocket *null_pocket = nullptr; - ret_val ret = ret_val::make_failure( null_pocket, - _( "is not a container" ) ); - for( item_pocket &pocket : contents ) { - if( !pocket.is_type( pk_type ) ) { - continue; - } - if( pk_type != item_pocket::pocket_type::CONTAINER && - pk_type != item_pocket::pocket_type::MAGAZINE && - pk_type != item_pocket::pocket_type::MAGAZINE_WELL && - pocket.is_type( pk_type ) ) { - return ret_val::make_success( &pocket, "special pocket type override" ); +struct item_contents::item_contents_helper { + // Static helper function to implement the const and non-const versions of + // find_pocket_for with less code duplication + template + using pocket_type = std::conditional_t < + std::is_const::value, + const item_pocket, + item_pocket + >; + + template + static ret_val*> find_pocket_for( + ItemContents &contents, const item &it, item_pocket::pocket_type pk_type ) { + using my_pocket_type = pocket_type; + static constexpr item_pocket *null_pocket = nullptr; + + std::vector failure_messages; + int num_pockets_of_type = 0; + + for( my_pocket_type &pocket : contents.contents ) { + if( !pocket.is_type( pk_type ) ) { + continue; + } + if( pk_type != item_pocket::pocket_type::CONTAINER && + pk_type != item_pocket::pocket_type::MAGAZINE && + pk_type != item_pocket::pocket_type::MAGAZINE_WELL && + pocket.is_type( pk_type ) ) { + return ret_val::make_success( + &pocket, "special pocket type override" ); + } + ++num_pockets_of_type; + ret_val ret_contain = pocket.can_contain( it ); + if( ret_contain.success() ) { + return ret_val::make_success( &pocket, ret_contain.str() ); + } else { + failure_messages.push_back( ret_contain.str() ); + } } - ret_val ret_contain = pocket.can_contain( it ); - if( ret_contain.success() ) { - return ret_val::make_success( &pocket, ret_contain.str() ); + + if( failure_messages.empty() ) { + return ret_val::make_failure( null_pocket, _( "is not a container" ) ); } + std::sort( failure_messages.begin(), failure_messages.end(), localized_compare ); + failure_messages.erase( + std::unique( failure_messages.begin(), failure_messages.end() ), + failure_messages.end() ); + return ret_val::make_failure( + null_pocket, + ngettext( "pocket unacceptable because %s", "pockets unacceptable because %s", + num_pockets_of_type ), + enumerate_as_string( failure_messages, enumeration_conjunction::or_ ) ); } - return ret; +}; + +ret_val item_contents::find_pocket_for( const item &it, + item_pocket::pocket_type pk_type ) +{ + return item_contents_helper::find_pocket_for( *this, it, pk_type ); } ret_val item_contents::find_pocket_for( const item &it, item_pocket::pocket_type pk_type ) const { - static item_pocket *null_pocket = nullptr; - ret_val ret = ret_val::make_failure( null_pocket, - _( "is not a container" ) ); - for( const item_pocket &pocket : contents ) { - if( !pocket.is_type( pk_type ) ) { - continue; - } - ret_val ret_contain = pocket.can_contain( it ); - if( ret_contain.success() ) { - return ret_val::make_success( &pocket, ret_contain.str() ); - } - } - return ret; + return item_contents_helper::find_pocket_for( *this, it, pk_type ); } int item_contents::obtain_cost( const item &it ) const @@ -360,17 +414,17 @@ ret_val item_contents::insert_item( const item &it, item_pocket::pocket_ty // LAST is invalid, so we assume it will be a regular container pk_type = item_pocket::pocket_type::CONTAINER; } - ret_val pocket = find_pocket_for( it, pk_type ); + ret_val pocket = find_pocket_for( it, pk_type ); if( pocket.value() == nullptr ) { - return ret_val::make_failure( "No success" ); + return ret_val::make_failure( "Found no suitable pocket for item" ); } ret_val pocket_contain_code = pocket.value()->insert_item( it ); if( pocket_contain_code.success() ) { return ret_val::make_success(); } - return ret_val::make_failure( "No success" ); + return ret_val::make_failure( "Failed to insert into pocket" ); } void item_contents::force_insert_item( const item &it, item_pocket::pocket_type pk_type ) @@ -607,10 +661,8 @@ std::set item_contents::ammo_types() const { std::set ret; for( const item_pocket &pocket : contents ) { - if( pocket.is_type( item_pocket::pocket_type::MAGAZINE ) ) { - for( const ammotype &ammo : pocket.ammo_types() ) { - ret.emplace( ammo ); - } + for( const ammotype &ammo : pocket.ammo_types() ) { + ret.emplace( ammo ); } } return ret; @@ -817,12 +869,14 @@ const item &item_contents::only_item() const return null_item_reference(); } for( const item_pocket &pocket : contents ) { - if( pocket.empty() || !pocket.is_type( item_pocket::pocket_type::CONTAINER ) ) { + if( pocket.empty() || !( pocket.is_type( item_pocket::pocket_type::CONTAINER ) || + pocket.is_type( item_pocket::pocket_type::SOFTWARE ) ) ) { continue; } // the first item we come to is the only one. return pocket.front(); } + return null_item_reference(); } @@ -905,37 +959,62 @@ std::list item_contents::all_items_top() const std::list item_contents::all_items_ptr( item_pocket::pocket_type pk_type ) { - std::list all_items_internal; - for( item_pocket &pocket : contents ) { - if( pocket.is_type( pk_type ) ) { - std::list contained_items = pocket.all_items_ptr( pk_type ); - all_items_internal.insert( all_items_internal.end(), contained_items.begin(), - contained_items.end() ); - } + return all_items_top_recursive( pk_type ); +} + +std::list item_contents::all_items_ptr( item_pocket::pocket_type pk_type ) const +{ + return all_items_top_recursive( pk_type ); +} + +std::list item_contents::all_items_ptr() const +{ + std::list all_items_internal; + for( int i = item_pocket::pocket_type::CONTAINER; i < item_pocket::pocket_type::LAST; i++ ) { + std::list inserted{ all_items_top_recursive( static_cast( i ) ) }; + all_items_internal.insert( all_items_internal.end(), inserted.begin(), inserted.end() ); } return all_items_internal; } -std::list item_contents::all_items_ptr( item_pocket::pocket_type pk_type ) const +std::list item_contents::all_items_top_recursive( item_pocket::pocket_type pk_type ) +const { std::list all_items_internal; for( const item_pocket &pocket : contents ) { if( pocket.is_type( pk_type ) ) { - std::list contained_items = pocket.all_items_ptr( pk_type ); + std::list contained_items = pocket.all_items_top(); all_items_internal.insert( all_items_internal.end(), contained_items.begin(), contained_items.end() ); + std::list recursion_items; + for( const item *it : contained_items ) { + recursion_items = it->contents.all_items_top_recursive( pk_type ); + all_items_internal.insert( all_items_internal.end(), recursion_items.begin(), + recursion_items.end() ); + } } } + return all_items_internal; } -std::list item_contents::all_items_ptr() const +std::list item_contents::all_items_top_recursive( item_pocket::pocket_type pk_type ) { - std::list all_items_internal; - for( int i = item_pocket::pocket_type::CONTAINER; i < item_pocket::pocket_type::LAST; i++ ) { - std::list inserted{ all_items_ptr( static_cast( i ) ) }; - all_items_internal.insert( all_items_internal.end(), inserted.begin(), inserted.end() ); + std::list< item *> all_items_internal; + for( item_pocket &pocket : contents ) { + if( pocket.is_type( pk_type ) ) { + std::list< item *> contained_items = pocket.all_items_top(); + all_items_internal.insert( all_items_internal.end(), contained_items.begin(), + contained_items.end() ); + std::list< item *> recursion_items; + for( item *it : contained_items ) { + recursion_items = it->contents.all_items_top_recursive( pk_type ); + all_items_internal.insert( all_items_internal.end(), recursion_items.begin(), + recursion_items.end() ); + } + } } + return all_items_internal; } @@ -981,6 +1060,83 @@ std::vector item_contents::gunmods() const return mods; } +std::vector item_contents::mods() const +{ + std::vector mods; + for( const item_pocket &pocket : contents ) { + if( pocket.is_type( item_pocket::pocket_type::MOD ) ) { + for( const item *it : pocket.all_items_top() ) { + mods.insert( mods.end(), it ); + } + } + } + return mods; +} + +void item_contents::update_modified_pockets( + const cata::optional &mag_or_mag_well, + std::vector container_pockets ) +{ + for( auto pocket_iter = contents.begin(); pocket_iter != contents.end(); ) { + item_pocket &pocket = *pocket_iter; + if( pocket.is_type( item_pocket::pocket_type::CONTAINER ) ) { + + const pocket_data *current = pocket.get_pocket_data(); + bool found = false; + // this loop is to make sure the pockets on the current item are already here from @container_pockets, + // so we don't need to clear them (saving the favorite data) + for( auto container_pocket = container_pockets.begin(); container_pocket != container_pockets.end(); + ) { + // comparing pointers because each pocket is uniquely defined in json as its own. + if( *container_pocket == current ) { + container_pocket = container_pockets.erase( container_pocket ); + found = true; + // there will not be more than one pocket with the same pocket_data pointer, so exit early + break; + } else { + ++container_pocket; + } + } + + if( !found ) { + if( !pocket.empty() ) { + // in case the debugmsg wasn't clear, this should never happen + debugmsg( "Oops! deleted some items when updating pockets that were added via toolmods" ); + } + pocket_iter = contents.erase( pocket_iter ); + } else { + ++pocket_iter; + } + + } else if( pocket.is_type( item_pocket::pocket_type::MAGAZINE ) || + pocket.is_type( item_pocket::pocket_type::MAGAZINE_WELL ) ) { + if( mag_or_mag_well ) { + if( pocket.get_pocket_data() != *mag_or_mag_well ) { + if( !pocket.empty() ) { + // in case the debugmsg wasn't clear, this should never happen + debugmsg( "Oops! deleted some items when updating pockets that were added via toolmods" ); + } + contents.push_back( item_pocket( *mag_or_mag_well ) ); + pocket_iter = contents.erase( pocket_iter ); + } else { + ++pocket_iter; + } + } else { + // no mag or mag well, so it needs to be erased + pocket_iter = contents.erase( pocket_iter ); + } + } else { + ++pocket_iter; + } + } + + // we've deleted all of the superfluous copies already, so time to add the new pockets + for( const pocket_data *container_pocket : container_pockets ) { + contents.push_back( item_pocket( container_pocket ) ); + } + +} + std::set item_contents::magazine_compatible() const { std::set ret; @@ -1087,13 +1243,13 @@ void item_contents::remove_internal( const std::function &filter } } -void item_contents::process( player *carrier, const tripoint &pos, bool activate, float insulation, +void item_contents::process( player *carrier, const tripoint &pos, float insulation, temperature_flag flag, float spoil_multiplier_parent ) { for( item_pocket &pocket : contents ) { // no reason to check mods, they won't rot if( !pocket.is_type( item_pocket::pocket_type::MOD ) ) { - pocket.process( carrier, pos, activate, insulation, flag, spoil_multiplier_parent ); + pocket.process( carrier, pos, insulation, flag, spoil_multiplier_parent ); } } } diff --git a/src/item_contents.h b/src/item_contents.h index b6132d70f31c8..9c8570bd79d84 100644 --- a/src/item_contents.h +++ b/src/item_contents.h @@ -46,6 +46,8 @@ class item_contents ret_val can_contain_rigid( const item &it ) const; ret_val can_contain( const item &it ) const; bool can_contain_liquid( bool held_or_ground ) const; + // does not ignore mods + bool empty_real() const; bool empty() const; // ignores all pockets except CONTAINER pockets to check if this contents is empty. bool empty_container() const; @@ -81,6 +83,11 @@ class item_contents std::vector gunmods(); /** gets all gunmods in the item */ std::vector gunmods() const; + + std::vector mods() const; + + void update_modified_pockets( const cata::optional &mag_or_mag_well, + std::vector container_pockets ); // all magazines compatible with any pockets. // this only checks MAGAZINE_WELL std::set magazine_compatible() const; @@ -206,7 +213,7 @@ class item_contents * Is part of the recursive call of item::process. see that function for additional comments * NOTE: this destroys the items that get processed */ - void process( player *carrier, const tripoint &pos, bool activate, float insulation = 1, + void process( player *carrier, const tripoint &pos, float insulation = 1, temperature_flag flag = temperature_flag::NORMAL, float spoil_multiplier_parent = 1.0f ); void migrate_item( item &obj, const std::set &migrations ); @@ -226,6 +233,8 @@ class item_contents void info( std::vector &info, const iteminfo_query *parts ) const; + // reads the items in the MOD pocket first + void read_mods( const item_contents &read_input ); void combine( const item_contents &read_input ); void serialize( JsonOut &json ) const; @@ -240,7 +249,15 @@ class item_contents ret_val find_pocket_for( const item &it, item_pocket::pocket_type pk_type = item_pocket::pocket_type::CONTAINER ) const; + //called by all_items_ptr to recursively get all items without duplicating items in nested pockets + std::list all_items_top_recursive( item_pocket::pocket_type pk_type ) const; + //called by all_items_ptr to recursively get all items without duplicating items in nested pockets + std::list all_items_top_recursive( item_pocket::pocket_type pk_type ); + std::list contents; + + struct item_contents_helper; + friend struct item_contents_helper; }; #endif // CATA_SRC_ITEM_CONTENTS_H diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 4a6db77b826ef..9a828c1caa1e7 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -70,6 +70,13 @@ const itype &string_id::obj() const return result ? *result : dummy; } +/** @relates string_id */ +template<> +bool string_id::is_valid() const +{ + return item_controller->has_template( *this ); +} + static item_category_id calc_category( const itype &obj ); static void set_allergy_flags( itype &item_template ); static void hflesh_to_flesh( itype &item_template ); @@ -963,7 +970,6 @@ void Item_factory::init() add_iuse( "TAZER2", &iuse::tazer2 ); add_iuse( "TELEPORT", &iuse::teleport ); add_iuse( "THORAZINE", &iuse::thorazine ); - add_iuse( "THROWABLE_EXTINGUISHER_ACT", &iuse::throwable_extinguisher_act ); add_iuse( "TOWEL", &iuse::towel ); add_iuse( "TRIMMER_OFF", &iuse::trimmer_off ); add_iuse( "TRIMMER_ON", &iuse::trimmer_on ); @@ -1072,9 +1078,13 @@ void Item_factory::check_definitions() const if( item_contents( type->pockets ).bigger_on_the_inside( volume ) ) { msg += "is bigger on the inside. consider using TARDIS flag.\n"; } - for( const pocket_data &data : type->pockets ) { - msg += data.check_definition(); - } + } + } + + for( const pocket_data &data : type->pockets ) { + std::string pocket_error = data.check_definition(); + if( !pocket_error.empty() ) { + msg += "problem with pocket: " + pocket_error; } } @@ -1246,8 +1256,8 @@ void Item_factory::check_definitions() const } } } - if( type->gun->barrel_length < 0_ml ) { - msg += "gun barrel length cannot be negative\n"; + if( type->gun->barrel_volume < 0_ml ) { + msg += "gun barrel volume cannot be negative\n"; } if( !type->gun->skill_used ) { @@ -1544,10 +1554,16 @@ void Item_factory::load( islot_artifact &slot, const JsonObject &jo, const std:: load_optional_enum_array( slot.effects_worn, jo, "effects_worn" ); } -void Item_factory::load( islot_milling &slot, const JsonObject &jo, const std::string & ) +void islot_milling::load( const JsonObject &jo ) { - assign( jo, "into", slot.into_ ); - assign( jo, "conversion_rate", slot.conversion_rate_ ); + optional( jo, was_loaded, "into", into_ ); + optional( jo, was_loaded, "conversion_rate", conversion_rate_ ); +} + +void islot_milling::deserialize( JsonIn &jsin ) +{ + const JsonObject jo = jsin.get_object(); + load( jo ); } void islot_ammo::load( const JsonObject &jo ) @@ -1595,31 +1611,63 @@ void Item_factory::load_ammo( const JsonObject &jo, const std::string &src ) } } -void Item_factory::load( islot_engine &slot, const JsonObject &jo, const std::string & ) +void islot_engine::load( const JsonObject &jo ) +{ + optional( jo, was_loaded, "displacement", displacement ); +} + +void islot_engine::deserialize( JsonIn &jsin ) { - assign( jo, "displacement", slot.displacement ); + const JsonObject jo = jsin.get_object(); + load( jo ); } void Item_factory::load_engine( const JsonObject &jo, const std::string &src ) { itype def; if( load_definition( jo, src, def ) ) { - load_slot( def.engine, jo, src ); + if( def.was_loaded ) { + if( def.engine ) { + def.engine->was_loaded = true; + } else { + def.engine = cata::make_value(); + def.engine->was_loaded = true; + } + } else { + def.engine = cata::make_value(); + } + def.engine->load( jo ); load_basic_info( jo, def, src ); } } -void Item_factory::load( islot_wheel &slot, const JsonObject &jo, const std::string & ) +void islot_wheel::load( const JsonObject &jo ) +{ + optional( jo, was_loaded, "diameter", diameter ); + optional( jo, was_loaded, "width", width ); +} + +void islot_wheel::deserialize( JsonIn &jsin ) { - assign( jo, "diameter", slot.diameter ); - assign( jo, "width", slot.width ); + const JsonObject jo = jsin.get_object(); + load( jo ); } void Item_factory::load_wheel( const JsonObject &jo, const std::string &src ) { itype def; if( load_definition( jo, src, def ) ) { - load_slot( def.wheel, jo, src ); + if( def.was_loaded ) { + if( def.wheel ) { + def.wheel->was_loaded = true; + } else { + def.wheel = cata::make_value(); + def.wheel->was_loaded = true; + } + } else { + def.wheel = cata::make_value(); + } + def.wheel->load( jo ); load_basic_info( jo, def, src ); } } @@ -1676,7 +1724,7 @@ void Item_factory::load( islot_gun &slot, const JsonObject &jo, const std::strin assign( jo, "reload", slot.reload_time, strict, 0 ); assign( jo, "reload_noise", slot.reload_noise, strict ); assign( jo, "reload_noise_volume", slot.reload_noise_volume, strict, 0 ); - assign( jo, "barrel_length", slot.barrel_length, strict, 0_ml ); + assign( jo, "barrel_volume", slot.barrel_volume, strict, 0_ml ); assign( jo, "built_in_mods", slot.built_in_mods, strict ); assign( jo, "default_mods", slot.default_mods, strict ); assign( jo, "ups_charges", slot.ups_charges, strict, 0 ); @@ -1775,7 +1823,6 @@ void islot_pet_armor::load( const JsonObject &jo ) optional( jo, was_loaded, "pet_bodytype", bodytype ); optional( jo, was_loaded, "environmental_protection", env_resist, 0 ); optional( jo, was_loaded, "environmental_protection_with_filter", env_resist_w_filter, 0 ); - optional( jo, was_loaded, "storage", storage, volume_reader{}, 0_ml ); optional( jo, was_loaded, "power_armor", power_armor, false ); } @@ -1861,6 +1908,8 @@ void Item_factory::load( islot_mod &slot, const JsonObject &jo, const std::strin slot.magazine_adaptor[ ammo ].insert( itype_id( line ) ); } } + + optional( jo, false, "pocket_mods", slot.add_pockets ); } void Item_factory::load_toolmod( const JsonObject &jo, const std::string &src ) @@ -2060,10 +2109,16 @@ void Item_factory::load( islot_comestible &slot, const JsonObject &jo, const std } -void Item_factory::load( islot_brewable &slot, const JsonObject &jo, const std::string & ) +void islot_brewable::load( const JsonObject &jo ) { - assign( jo, "time", slot.time, false, 1_turns ); - jo.read( "results", slot.results, true ); + optional( jo, was_loaded, "time", time, 1_turns ); + mandatory( jo, was_loaded, "results", results ); +} + +void islot_brewable::deserialize( JsonIn &jsin ) +{ + const JsonObject jo = jsin.get_object(); + load( jo ); } void Item_factory::load_comestible( const JsonObject &jo, const std::string &src ) @@ -2168,17 +2223,32 @@ void Item_factory::load_magazine( const JsonObject &jo, const std::string &src ) } } -void Item_factory::load( islot_battery &slot, const JsonObject &jo, const std::string & ) +void islot_battery::load( const JsonObject &jo ) +{ + mandatory( jo, was_loaded, "max_capacity", max_capacity ); +} + +void islot_battery::deserialize( JsonIn &jsin ) { - slot.max_capacity = read_from_json_string( *jo.get_raw( "max_capacity" ), - units::energy_units ); + const JsonObject jo = jsin.get_object(); + load( jo ); } void Item_factory::load_battery( const JsonObject &jo, const std::string &src ) { itype def; if( load_definition( jo, src, def ) ) { - load_slot( def.battery, jo, src ); + if( def.was_loaded ) { + if( def.battery ) { + def.battery->was_loaded = true; + } else { + def.battery = cata::make_value(); + def.battery->was_loaded = true; + } + } else { + def.battery = cata::make_value(); + } + def.battery->load( jo ); load_basic_info( jo, def, src ); } } @@ -2588,10 +2658,10 @@ void Item_factory::load_basic_info( const JsonObject &jo, itype &def, const std: assign( jo, "ammo_data", def.ammo, src == "dda" ); assign( jo, "seed_data", def.seed, src == "dda" ); load_slot_optional( def.artifact, jo, "artifact_data", src ); - load_slot_optional( def.brewable, jo, "brewable", src ); + assign( jo, "brewable", def.brewable, src == "dda" ); load_slot_optional( def.fuel, jo, "fuel", src ); load_slot_optional( def.relic_data, jo, "relic_data", src ); - load_slot_optional( def.milling_data, jo, "milling", src ); + assign( jo, "milling", def.milling_data, src == "dda" ); // optional gunmod slot may also specify mod data if( jo.has_member( "gunmod_data" ) ) { diff --git a/src/item_factory.h b/src/item_factory.h index c7c853835766b..ab739ee5d775d 100644 --- a/src/item_factory.h +++ b/src/item_factory.h @@ -298,19 +298,14 @@ class Item_factory void load( islot_tool &slot, const JsonObject &jo, const std::string &src ); void load( islot_comestible &slot, const JsonObject &jo, const std::string &src ); - void load( islot_brewable &slot, const JsonObject &jo, const std::string &src ); void load( islot_mod &slot, const JsonObject &jo, const std::string &src ); - void load( islot_engine &slot, const JsonObject &jo, const std::string &src ); - void load( islot_wheel &slot, const JsonObject &jo, const std::string &src ); void load( islot_fuel &slot, const JsonObject &jo, const std::string &src ); void load( islot_gun &slot, const JsonObject &jo, const std::string &src ); void load( islot_gunmod &slot, const JsonObject &jo, const std::string &src ); void load( islot_magazine &slot, const JsonObject &jo, const std::string &src ); - void load( islot_battery &slot, const JsonObject &jo, const std::string &src ); void load( islot_bionic &slot, const JsonObject &jo, const std::string &src ); void load( islot_artifact &slot, const JsonObject &jo, const std::string &src ); void load( relic &slot, const JsonObject &jo, const std::string &src ); - void load( islot_milling &slot, const JsonObject &jo, const std::string &src ); //json data handlers void emplace_usage( std::map &container, const std::string &iuse_id ); diff --git a/src/item_group.cpp b/src/item_group.cpp index ddfaa377a1ae1..10bb167b12919 100644 --- a/src/item_group.cpp +++ b/src/item_group.cpp @@ -378,6 +378,7 @@ void Item_modifier::modify( item &new_item ) const if( !cont.is_null() ) { cont.put_in( new_item, item_pocket::pocket_type::CONTAINER ); + cont.seal(); new_item = cont; } @@ -386,6 +387,7 @@ void Item_modifier::modify( item &new_item ) const for( const item &it : contentitems ) { new_item.put_in( it, item_pocket::pocket_type::CONTAINER ); } + new_item.seal(); } for( auto &flag : custom_flags ) { diff --git a/src/item_location.cpp b/src/item_location.cpp index 313d4f0368e08..0474e4034b4ff 100644 --- a/src/item_location.cpp +++ b/src/item_location.cpp @@ -3,7 +3,6 @@ #include #include -#include "avatar.h" #include "character.h" #include "character_id.h" #include "color.h" @@ -19,7 +18,6 @@ #include "map.h" #include "map_selector.h" #include "optional.h" -#include "player.h" #include "point.h" #include "safe_reference.h" #include "translations.h" @@ -186,7 +184,7 @@ class item_location::impl::item_on_map : public item_location::impl } std::string describe( const Character *ch ) const override { - std::string res = g->m.name( cur ); + std::string res = get_map().name( cur ); if( ch ) { res += std::string( " " ) += direction_suffix( ch->pos(), cur ); } @@ -217,7 +215,7 @@ class item_location::impl::item_on_map : public item_location::impl obj = *target(); } - int mv = dynamic_cast( &ch )->item_handling_cost( obj, true, MAP_HANDLING_PENALTY ); + int mv = ch.item_handling_cost( obj, true, MAP_HANDLING_PENALTY ); mv += 100 * rl_dist( ch.pos(), cur ); // TODO: handle unpacking costs @@ -444,8 +442,7 @@ class item_location::impl::item_on_vehicle : public item_location::impl obj = *target(); } - int mv = dynamic_cast( &ch )->item_handling_cost( obj, true, - VEHICLE_HANDLING_PENALTY ); + int mv = ch.item_handling_cost( obj, true, VEHICLE_HANDLING_PENALTY ); mv += 100 * rl_dist( ch.pos(), cur.veh.global_part_pos3( cur.part ) ); // TODO: handle unpacking costs @@ -658,7 +655,7 @@ void item_location::deserialize( JsonIn &js ) } else { // This is for migrating saves before npc item locations were supported and all // character item locations were assumed to be on g->u - who_id = g->u.getID(); + who_id = get_player_character().getID(); } ptr.reset( new impl::item_on_person( who_id, idx ) ); @@ -666,7 +663,7 @@ void item_location::deserialize( JsonIn &js ) ptr.reset( new impl::item_on_map( pos, idx ) ); } else if( type == "vehicle" ) { - vehicle *const veh = veh_pointer_or_null( g->m.veh_at( pos ) ); + vehicle *const veh = veh_pointer_or_null( get_map().veh_at( pos ) ); int part = obj.get_int( "part" ); if( veh && part >= 0 && part < veh->part_count() ) { ptr.reset( new impl::item_on_vehicle( vehicle_cursor( *veh, part ), idx ) ); diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index 75b4c5ecdd72f..40ff5bbc0ea62 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -1,10 +1,10 @@ #include "item_pocket.h" +#include "ammo.h" #include "assign.h" #include "cata_utility.h" #include "crafting.h" #include "enums.h" -#include "game.h" #include "generic_factory.h" #include "handle_liquid.h" #include "item.h" @@ -46,11 +46,18 @@ std::string pocket_data::check_definition() const type == item_pocket::pocket_type::MIGRATION ) { return ""; } + if( max_contains_volume() == 0_ml ) { + return "has zero max volume\n"; + } if( magazine_well > 0_ml && rigid ) { return "rigid overrides magazine_well\n"; } if( magazine_well >= max_contains_volume() ) { - return "magazine well larger than pocket volume. consider using rigid instead.\n"; + return string_format( + "magazine well (%s) larger than pocket volume (%s); " + "consider using rigid instead.\n", + quantity_to_string( magazine_well ), + quantity_to_string( max_contains_volume() ) ); } if( max_item_volume && *max_item_volume < min_item_volume ) { return "max_item_volume is greater than min_item_volume. no item can fit.\n"; @@ -58,6 +65,30 @@ std::string pocket_data::check_definition() const if( ( watertight || airtight ) && min_item_volume > 0_ml ) { return "watertight or gastight is incompatible with min_item_volume\n"; } + for( const itype_id &it : item_id_restriction ) { + if( !it.is_valid() ) { + return string_format( "item_id %s used in restriction invalid\n", it.str() ); + } + if( it->phase == phase_id::LIQUID && !watertight ) { + return string_format( "restricted to liquid item %s but not watertight\n", + it->get_id().str() ); + } + if( it->phase == phase_id::GAS && !airtight ) { + return string_format( "restricted to gas item %s but not airtight\n", + it->get_id().str() ); + } + } + for( const std::pair &ammo_res : ammo_restriction ) { + const itype_id &it = ammo_res.first->default_ammotype(); + if( it->phase == phase_id::LIQUID && !watertight ) { + return string_format( "restricted to liquid item %s but not watertight\n", + it->get_id().str() ); + } + if( it->phase == phase_id::GAS && !airtight ) { + return string_format( "restricted to gas item %s but not airtight\n", + it->get_id().str() ); + } + } return ""; } @@ -251,7 +282,9 @@ bool item_pocket::stacks_with( const item_pocket &rhs ) const bool item_pocket::is_funnel_container( units::volume &bigger_than ) const { - static const std::vector allowed_liquids{ + // should not be static, since after reloading some members of the item objects, + // such as item types, may be invalidated. + const std::vector allowed_liquids{ item( "water", calendar::turn_zero, 1 ), item( "water_acid", calendar::turn_zero, 1 ), item( "water_acid_weak", calendar::turn_zero, 1 ) @@ -628,7 +661,7 @@ bool item_pocket::detonate( const tripoint &pos, std::vector &drops ) return false; } -bool item_pocket::process( const itype &type, player *carrier, const tripoint &pos, bool activate, +bool item_pocket::process( const itype &type, player *carrier, const tripoint &pos, float insulation, const temperature_flag flag ) { bool processed = false; @@ -638,7 +671,7 @@ bool item_pocket::process( const itype &type, player *carrier, const tripoint &p // is not changed, the item is still fresh. it->set_last_rot_check( calendar::turn ); } - if( it->process( carrier, pos, activate, type.insulation_factor * insulation, flag ) ) { + if( it->process( carrier, pos, type.insulation_factor * insulation, flag ) ) { it = contents.erase( it ); processed = true; } else { @@ -706,9 +739,20 @@ void item_pocket::general_info( std::vector &info, int pocket_number, info.emplace_back( "DESCRIPTION", pocket_num ); } - info.push_back( vol_to_info( "CONTAINER", _( "Volume: " ), volume_capacity() ) ); - info.push_back( weight_to_info( "CONTAINER", _( " Weight: " ), weight_capacity() ) ); - info.back().bNewLine = true; + // Show volume/weight for normal containers, or ammo capacity if ammo_restriction is defined + if( data->ammo_restriction.empty() ) { + info.push_back( vol_to_info( "CONTAINER", _( "Volume: " ), volume_capacity() ) ); + info.push_back( weight_to_info( "CONTAINER", _( " Weight: " ), weight_capacity() ) ); + info.back().bNewLine = true; + } else { + for( const ammotype &at : ammo_types() ) { + const std::string fmt = string_format( ngettext( " round of %s", + " rounds of %s", ammo_capacity( at ) ), + at->name() ); + info.emplace_back( "MAGAZINE", _( "Holds: " ), fmt, iteminfo::no_flags, + ammo_capacity( at ) ); + } + } if( data->max_item_length != 0_mm ) { info.back().bNewLine = true; @@ -772,7 +816,7 @@ void item_pocket::general_info( std::vector &info, int pocket_number, info.emplace_back( "DESCRIPTION", string_format( _( "This pocket expands at %.0f%% of the rate of volume of items inside." ), - data->weight_multiplier * 100 ) ); + data->volume_multiplier * 100 ) ); } } @@ -800,12 +844,19 @@ void item_pocket::contents_info( std::vector &info, int pocket_number, info.emplace_back( "DESCRIPTION", _( "This pocket is sealed." ) ); } - info.emplace_back( vol_to_info( "CONTAINER", _( "Volume: " ), contains_volume() ) ); - info.emplace_back( vol_to_info( "CONTAINER", _( " of " ), volume_capacity() ) ); - - info.back().bNewLine = true; - info.emplace_back( weight_to_info( "CONTAINER", _( "Weight: " ), contains_weight() ) ); - info.emplace_back( weight_to_info( "CONTAINER", _( " of " ), weight_capacity() ) ); + if( data->ammo_restriction.empty() ) { + // With no ammo_restriction defined, show current volume/weight, and total capacity + info.emplace_back( vol_to_info( "CONTAINER", _( "Volume: " ), contains_volume() ) ); + info.emplace_back( vol_to_info( "CONTAINER", _( " of " ), volume_capacity() ) ); + info.back().bNewLine = true; + info.emplace_back( weight_to_info( "CONTAINER", _( "Weight: " ), contains_weight() ) ); + info.emplace_back( weight_to_info( "CONTAINER", _( " of " ), weight_capacity() ) ); + } else { + // With ammo_restriction, total capacity does not matter, but show current volume/weight + info.emplace_back( vol_to_info( "CONTAINER", _( "Volume: " ), contains_volume() ) ); + info.back().bNewLine = true; + info.emplace_back( weight_to_info( "CONTAINER", _( "Weight: " ), contains_weight() ) ); + } bool contents_header = false; for( const item &contents_item : contents ) { @@ -939,6 +990,7 @@ ret_val item_pocket::can_contain( const item &it ) co // liquids and gases avoid the size limit altogether // soft items also avoid the size limit if( !it.made_of( phase_id::LIQUID ) && !it.made_of( phase_id::GAS ) && + !it.is_frozen_liquid() && !it.is_soft() && data->max_item_volume && it.volume() > *data->max_item_volume ) { return ret_val::make_failure( @@ -1032,6 +1084,7 @@ void item_pocket::overflow( const tripoint &pos ) // no items to overflow return; } + map &here = get_map(); // first remove items that shouldn't be in there anyway for( auto iter = contents.begin(); iter != contents.end(); ) { ret_val ret_contain = can_contain( *iter ); @@ -1039,7 +1092,7 @@ void item_pocket::overflow( const tripoint &pos ) ( !ret_contain.success() && ret_contain.value() != contain_code::ERR_NO_SPACE && ret_contain.value() != contain_code::ERR_CANNOT_SUPPORT ) ) { - g->m.add_item_or_charges( pos, *iter ); + here.add_item_or_charges( pos, *iter ); iter = contents.erase( iter ); } else { ++iter; @@ -1063,7 +1116,7 @@ void item_pocket::overflow( const tripoint &pos ) if( overflow_count > 0 ) { ammo.charges -= overflow_count; item dropped_ammo( ammo.typeId(), ammo.birthday(), overflow_count ); - g->m.add_item_or_charges( pos, contents.front() ); + here.add_item_or_charges( pos, contents.front() ); total_qty -= overflow_count; } if( ammo.count() == 0 ) { @@ -1082,7 +1135,7 @@ void item_pocket::overflow( const tripoint &pos ) return left.volume() > right.volume(); } ); while( remaining_volume() < 0_ml && !contents.empty() ) { - g->m.add_item_or_charges( pos, contents.front() ); + here.add_item_or_charges( pos, contents.front() ); contents.pop_front(); } } @@ -1091,7 +1144,7 @@ void item_pocket::overflow( const tripoint &pos ) return left.weight() > right.weight(); } ); while( remaining_weight() < 0_gram && !contents.empty() ) { - g->m.add_item_or_charges( pos, contents.front() ); + here.add_item_or_charges( pos, contents.front() ); contents.pop_front(); } } @@ -1107,14 +1160,15 @@ void item_pocket::on_pickup( Character &guy ) void item_pocket::on_contents_changed() { - _sealed = false; + unseal(); restack(); } bool item_pocket::spill_contents( const tripoint &pos ) { + map &here = get_map(); for( item &it : contents ) { - g->m.add_item_or_charges( pos, it ); + here.add_item_or_charges( pos, it ); } contents.clear(); @@ -1172,11 +1226,11 @@ void item_pocket::remove_rotten( const tripoint &pnt ) } } -void item_pocket::process( player *carrier, const tripoint &pos, bool activate, float insulation, +void item_pocket::process( player *carrier, const tripoint &pos, float insulation, temperature_flag flag, float spoil_multiplier_parent ) { for( auto iter = contents.begin(); iter != contents.end(); ) { - if( iter->process( carrier, pos, activate, insulation, flag, + if( iter->process( carrier, pos, insulation, flag, // spoil multipliers on pockets are not additive or multiplicative, they choose the best std::min( spoil_multiplier_parent, spoil_multiplier() ) ) ) { iter = contents.erase( iter ); @@ -1221,6 +1275,11 @@ bool item_pocket::airtight() const return data->airtight; } +const pocket_data *item_pocket::get_pocket_data() const +{ + return data; +} + void item_pocket::add( const item &it, item **ret ) { contents.push_back( it ); @@ -1351,16 +1410,13 @@ units::volume pocket_data::max_contains_volume() const return t.ammo && ammo_restriction.count( t.ammo->type ); } ); // Figure out which has the greatest volume and calculate on that basis - std::map max_ammo_volume_by_type{}; + units::volume max_total_volume = 0_ml; for( const auto *ammo_type : ammo_types ) { - units::volume &max_ammo_volume = max_ammo_volume_by_type[ammo_type->ammo->type]; int stack_size = ammo_type->stack_size ? ammo_type->stack_size : 1; - max_ammo_volume = std::max( max_ammo_volume, ammo_type->volume / stack_size ); - } - units::volume max_total_volume = 0_ml; - for( const std::pair &p : max_ammo_volume_by_type ) { - max_total_volume = std::max( max_total_volume, - p.second * ammo_restriction.at( p.first ) ); + int max_count = ammo_restriction.at( ammo_type->ammo->type ); + units::volume this_volume = + 1_ml * divide_round_up( ammo_type->volume / 1_ml * max_count, stack_size ); + max_total_volume = std::max( max_total_volume, this_volume ); } return max_total_volume; } diff --git a/src/item_pocket.h b/src/item_pocket.h index c752ba72e11a4..376f33f2fafe5 100644 --- a/src/item_pocket.h +++ b/src/item_pocket.h @@ -121,6 +121,8 @@ class item_pocket // exceptions are MOD, CORPSE, SOFTWARE, MIGRATION, etc. bool is_standard_type() const; + const pocket_data *get_pocket_data() const; + std::list all_items_top(); std::list all_items_top() const; std::list all_items_ptr( pocket_type pk_type ); @@ -196,7 +198,7 @@ class item_pocket bool sealed() const; std::string translated_sealed_prefix() const; bool detonate( const tripoint &p, std::vector &drops ); - bool process( const itype &type, player *carrier, const tripoint &pos, bool activate, + bool process( const itype &type, player *carrier, const tripoint &pos, float insulation, temperature_flag flag ); void remove_all_ammo( Character &guy ); void remove_all_mods( Character &guy ); @@ -222,7 +224,7 @@ class item_pocket * Is part of the recursive call of item::process. see that function for additional comments * NOTE: this destroys the items that get processed */ - void process( player *carrier, const tripoint &pos, bool activate, float insulation = 1, + void process( player *carrier, const tripoint &pos, float insulation = 1, temperature_flag flag = temperature_flag::NORMAL, float spoil_multiplier_parent = 1.0f ); pocket_type saved_type() const { return _saved_type; diff --git a/src/iteminfo_query.h b/src/iteminfo_query.h index 4611a14d2b0c9..89782e0bf6022 100644 --- a/src/iteminfo_query.h +++ b/src/iteminfo_query.h @@ -124,7 +124,6 @@ enum class iteminfo_parts : size_t { ARMOR_COVERAGE, ARMOR_WARMTH, ARMOR_ENCUMBRANCE, - ARMOR_STORAGE, ARMOR_PROTECTION, BOOK_SUMMARY, @@ -148,6 +147,7 @@ enum class iteminfo_parts : size_t { TOOL_MAGAZINE_CURRENT, TOOL_MAGAZINE_COMPATIBLE, TOOL_CAPACITY, + TOOL_BURNOUT, DESCRIPTION_COMPONENTS_MADEFROM, DESCRIPTION_COMPONENTS_DISASSEMBLE, diff --git a/src/itype.h b/src/itype.h index d67de2ddff838..bfa90e749ecf4 100644 --- a/src/itype.h +++ b/src/itype.h @@ -17,6 +17,7 @@ #include "explosion.h" #include "game_constants.h" #include "item_contents.h" +#include "item_pocket.h" #include "iuse.h" // use_function #include "optional.h" #include "pldata.h" // add_type @@ -200,6 +201,11 @@ struct islot_brewable { /** How long for this brew to ferment. */ time_duration time = 0_turns; + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); }; struct islot_armor { @@ -278,10 +284,6 @@ struct islot_pet_armor { * Environmental protection of a gas mask with installed filter. */ int env_resist_w_filter = 0; - /** - * How much storage this items provides when worn. - */ - units::volume storage = 0_ml; /** * The maximum volume a pet can be and wear this armor */ @@ -385,6 +387,13 @@ struct islot_mod { /** If non-empty replaces the compatible magazines for the parent item */ std::map< ammotype, std::set > magazine_adaptor; + /** + * Pockets the mod will add to the item. + * Any MAGAZINE_WELL or MAGAZINE type pockets will be overwritten, + * and CONTAINER pockets will be added. + */ + std::vector add_pockets; + /** Proportional adjustment of parent item ammo capacity */ float capacity_multiplier = 1.0; }; @@ -418,6 +427,11 @@ struct islot_engine { public: /** for combustion engines the displacement (cc) */ int displacement = 0; + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); }; struct islot_wheel { @@ -427,6 +441,11 @@ struct islot_wheel { /** width of wheel (inches) */ int width = 0; + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); }; struct fuel_explosion { @@ -498,7 +517,7 @@ struct islot_gun : common_ranged_data { /** * Length of gun barrel, if positive allows sawing down of the barrel */ - units::volume barrel_length = 0_ml; + units::volume barrel_volume = 0_ml; /** * Effects that are applied to the ammo when fired. */ @@ -648,6 +667,11 @@ struct islot_magazine { struct islot_battery { /** Maximum energy the battery can store */ units::energy max_capacity; + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); }; struct islot_ammo : common_ranged_data { @@ -809,6 +833,11 @@ class islot_milling public: itype_id into_; double conversion_rate_; + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); }; struct itype { @@ -907,7 +936,7 @@ struct itype { /** Weight of item ( or each stack member ) */ units::mass weight = 0_gram; - /** Weight difference with the part it replaces for mods */ + /** Weight difference with the part it replaces for mods (defaults to weight) */ units::mass integral_weight = -1_gram; /** diff --git a/src/iuse.cpp b/src/iuse.cpp index 900a37a409afd..b8e0482312837 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -480,7 +480,7 @@ int iuse::sewage( player *p, item *it, bool, const tripoint & ) int iuse::honeycomb( player *p, item *it, bool, const tripoint & ) { - g->m.spawn_item( p->pos(), itype_wax, 2 ); + get_map().spawn_item( p->pos(), itype_wax, 2 ); return it->type->charges_to_use(); } @@ -705,17 +705,18 @@ int iuse::fungicide( player *p, item *it, bool, const tripoint & ) } p->remove_effect( effect_spores ); int spore_count = rng( 1, 6 ); - for( const tripoint &dest : g->m.points_in_radius( p->pos(), 1 ) ) { + map &here = get_map(); + for( const tripoint &dest : here.points_in_radius( p->pos(), 1 ) ) { if( spore_count == 0 ) { break; } if( dest == p->pos() ) { continue; } - if( g->m.passable( dest ) && x_in_y( spore_count, 8 ) ) { + if( here.passable( dest ) && x_in_y( spore_count, 8 ) ) { if( monster *const mon_ptr = g->critter_at( dest ) ) { monster &critter = *mon_ptr; - if( g->u.sees( dest ) && + if( get_player_character().sees( dest ) && !critter.type->in_species( species_FUNGUS ) ) { add_msg( m_warning, _( "The %s is covered in tiny spores!" ), critter.name() ); @@ -873,9 +874,10 @@ int iuse::meth( player *p, item *it, bool, const tripoint & ) } else { duration *= ( p->has_trait( trait_LIGHTWEIGHT ) ? 1.8 : 1.5 ); } + map &here = get_map(); // breathe out some smoke for( int i = 0; i < 3; i++ ) { - g->m.add_field( {p->posx() + static_cast( rng( -2, 2 ) ), p->posy() + static_cast( rng( -2, 2 ) ), p->posz()}, + here.add_field( {p->posx() + static_cast( rng( -2, 2 ) ), p->posy() + static_cast( rng( -2, 2 ) ), p->posz()}, fd_methsmoke, 2 ); } } else { @@ -1302,9 +1304,10 @@ int iuse::purify_smart( player *p, item *it, bool, const tripoint & ) static void spawn_spores( const player &p ) { int spores_spawned = 0; - fungal_effects fe( *g, g->m ); - for( const tripoint &dest : closest_tripoints_first( p.pos(), 4 ) ) { - if( g->m.impassable( dest ) ) { + map &here = get_map(); + fungal_effects fe( *g, here ); + for( const tripoint &dest : closest_points_first( p.pos(), 4 ) ) { + if( here.impassable( dest ) ) { continue; } float dist = rl_dist( dest, p.pos() ); @@ -1426,7 +1429,7 @@ static void marloss_common( player &p, item &it, const trait_id ¤t_color ) } p.set_mutation( trait_THRESH_MARLOSS ); - g->m.ter_set( p.pos(), t_marloss ); + get_map().ter_set( p.pos(), t_marloss ); g->events().send( p.getID() ); p.add_msg_if_player( m_good, _( "You wake up in a marloss bush. Almost *cradled* in it, actually, as though it grew there for you." ) ); @@ -1566,8 +1569,9 @@ int iuse::mycus( player *p, item *it, bool t, const tripoint &pos ) p->add_msg_if_player( m_good, _( "Even now, our fruits adapt to better serve local physiology." ) ); p->add_msg_if_player( m_good, _( "As, in time, shall we adapt to better welcome those who have not received us." ) );*/ - fungal_effects fe( *g, g->m ); - for( const tripoint &nearby_pos : g->m.points_in_radius( p->pos(), 3 ) ) { + map &here = get_map(); + fungal_effects fe( *g, here ); + for( const tripoint &nearby_pos : here.points_in_radius( p->pos(), 3 ) ) { fe.marlossify( nearby_pos ); } p->rem_addiction( add_type::MARLOSS_R ); @@ -1819,16 +1823,17 @@ int iuse::remove_all_mods( player *p, item *, bool, const tripoint & ) return 0; } -static bool good_fishing_spot( tripoint pos ) +static bool good_fishing_spot( tripoint pos, player *p ) { std::unordered_set fishable_locations = g->get_fishable_locations( 60, pos ); std::vector fishables = g->get_fishable_monsters( fishable_locations ); + map &here = get_map(); // isolated little body of water with no definite fish population - const oter_id &cur_omt = overmap_buffer.ter( ms_to_omt_copy( g->m.getabs( pos ) ) ); + const oter_id &cur_omt = overmap_buffer.ter( ms_to_omt_copy( here.getabs( pos ) ) ); std::string om_id = cur_omt.id().c_str(); - if( fishables.empty() && !g->m.has_flag( "CURRENT", pos ) && + if( fishables.empty() && !here.has_flag( "CURRENT", pos ) && om_id.find( "river_" ) == std::string::npos && !cur_omt->is_lake() && !cur_omt->is_lake_shore() ) { - g->u.add_msg_if_player( m_info, _( "You doubt you will have much luck catching fish here" ) ); + p->add_msg_if_player( m_info, _( "You doubt you will have much luck catching fish here" ) ); return false; } return true; @@ -1844,9 +1849,10 @@ int iuse::fishing_rod( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } + map &here = get_map(); cata::optional found; - for( const tripoint &pnt : g->m.points_in_radius( p->pos(), 1 ) ) { - if( g->m.has_flag( flag_FISHABLE, pnt ) && good_fishing_spot( pnt ) ) { + for( const tripoint &pnt : here.points_in_radius( p->pos(), 1 ) ) { + if( here.has_flag( flag_FISHABLE, pnt ) && good_fishing_spot( pnt, p ) ) { found = pnt; break; } @@ -1864,6 +1870,7 @@ int iuse::fishing_rod( player *p, item *it, bool, const tripoint & ) int iuse::fish_trap( player *p, item *it, bool t, const tripoint &pos ) { + map &here = get_map(); if( !t ) { // Handle deploying fish trap. if( it->active ) { @@ -1895,16 +1902,16 @@ int iuse::fish_trap( player *p, item *it, bool t, const tripoint &pos ) } const tripoint pnt = *pnt_; - if( !g->m.has_flag( "FISHABLE", pnt ) ) { + if( !here.has_flag( "FISHABLE", pnt ) ) { p->add_msg_if_player( m_info, _( "You can't fish there!" ) ); return 0; } - if( !good_fishing_spot( pnt ) ) { + if( !good_fishing_spot( pnt, p ) ) { return 0; } it->active = true; it->set_age( 0_turns ); - g->m.add_item_or_charges( pnt, *it ); + here.add_item_or_charges( pnt, *it ); p->i_rem( it ); p->add_msg_if_player( m_info, _( "You place the fish trap, in three hours or so you may catch some fish." ) ); @@ -1920,7 +1927,7 @@ int iuse::fish_trap( player *p, item *it, bool t, const tripoint &pos ) if( it->age() > 3_hours ) { it->active = false; - if( !g->m.has_flag( "FISHABLE", pos ) ) { + if( !here.has_flag( "FISHABLE", pos ) ) { return 0; } @@ -1968,7 +1975,7 @@ int iuse::fish_trap( player *p, item *it, bool t, const tripoint &pos ) if( chosen_fish->fish_population <= 0 ) { g->catch_a_monster( chosen_fish, pos, p, 300_hours ); //catch the fish! } else { - g->m.add_item_or_charges( pos, item::make_corpse( chosen_fish->type->id, + here.add_item_or_charges( pos, item::make_corpse( chosen_fish->type->id, calendar::turn + rng( 0_turns, 3_hours ) ) ); } @@ -1985,7 +1992,7 @@ int iuse::fish_trap( player *p, item *it, bool t, const tripoint &pos ) //but it's not as comfortable as if you just put fishes in the same tile with the trap. //Also: corpses and comestibles do not rot in containers like this, but on the ground they will rot. //we don't know when it was caught so use a random turn - g->m.add_item_or_charges( pos, item::make_corpse( fish_mon, it->birthday() + rng( 0_turns, + here.add_item_or_charges( pos, item::make_corpse( fish_mon, it->birthday() + rng( 0_turns, 3_hours ) ) ); break; //this can happen only once } @@ -2011,8 +2018,9 @@ int iuse::extinguisher( player *p, item *it, bool, const tripoint & ) p->moves -= to_moves( 2_seconds ); + map &here = get_map(); // Reduce the strength of fire (if any) in the target tile. - g->m.mod_field_intensity( dest, fd_fire, 0 - rng( 2, 3 ) ); + here.add_field( dest, fd_extinguisher, 3, 10_turns ); // Also spray monsters in that tile. if( monster *const mon_ptr = g->critter_at( dest, true ) ) { @@ -2023,14 +2031,15 @@ int iuse::extinguisher( player *p, item *it, bool, const tripoint & ) blind = true; critter.add_effect( effect_blind, rng( 1_minutes, 2_minutes ) ); } - if( g->u.sees( critter ) ) { + Character &player_character = get_player_character(); + if( player_character.sees( critter ) ) { p->add_msg_if_player( _( "The %s is sprayed!" ), critter.name() ); if( blind ) { p->add_msg_if_player( _( "The %s looks blinded." ), critter.name() ); } } if( critter.made_of( phase_id::LIQUID ) ) { - if( g->u.sees( critter ) ) { + if( player_character.sees( critter ) ) { p->add_msg_if_player( _( "The %s is frozen!" ), critter.name() ); } critter.apply_damage( p, bodypart_id( "torso" ), rng( 20, 60 ) ); @@ -2039,11 +2048,11 @@ int iuse::extinguisher( player *p, item *it, bool, const tripoint & ) } // Slightly reduce the strength of fire immediately behind the target tile. - if( g->m.passable( dest ) ) { + if( here.passable( dest ) ) { dest.x += ( dest.x - p->posx() ); dest.y += ( dest.y - p->posy() ); - g->m.mod_field_intensity( dest, fd_fire, std::min( 0 - rng( 0, 1 ) + rng( 0, 1 ), 0 ) ); + here.mod_field_intensity( dest, fd_fire, std::min( 0 - rng( 0, 1 ) + rng( 0, 1 ), 0 ) ); } return it->type->charges_to_use(); @@ -2066,7 +2075,7 @@ int iuse::rm13armor_off( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( _( "Electro-reactive armor system: ONLINE." ) ); p->add_msg_if_player( _( "All systems nominal." ) ); it->convert( itype_id( oname ) ).active = true; - p->reset_encumbrance(); + p->calc_encumbrance(); return it->type->charges_to_use(); } } @@ -2086,7 +2095,7 @@ int iuse::rm13armor_on( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( _( "Shutting down." ) ); p->add_msg_if_player( _( "Your RM13 combat armor turns off." ) ); it->convert( itype_id( oname ) ).active = false; - p->reset_encumbrance(); + p->calc_encumbrance(); } return it->type->charges_to_use(); } @@ -2401,11 +2410,13 @@ int iuse::hammer( player *p, item *it, bool, const tripoint & ) t_rdoor_boarded_damaged }; - const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id ter = g->m.ter( pnt ); + const ter_id ter = here.ter( pnt ); const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end(); return is_allowed; @@ -2417,7 +2428,7 @@ int iuse::hammer( player *p, item *it, bool, const tripoint & ) return 0; } const tripoint &pnt = *pnt_; - const ter_id type = g->m.ter( pnt ); + const ter_id type = here.ter( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( _( "You try to hit yourself with the hammer." ) ); @@ -2465,13 +2476,14 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) f_coffin_c }; - const std::function f = [&allowed_ter_id, - &allowed_furn_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &allowed_furn_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id ter = g->m.ter( pnt ); - const auto furn = g->m.furn( pnt ); + const ter_id ter = here.ter( pnt ); + const auto furn = here.furn( pnt ); const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end() || allowed_furn_id.find( furn ) != allowed_furn_id.end(); @@ -2484,8 +2496,8 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) return 0; } const tripoint &pnt = *pnt_; - const ter_id type = g->m.ter( pnt ); - const furn_id furn = g->m.furn( pnt ); + const ter_id type = here.ter( pnt ); + const furn_id furn = here.furn( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( m_info, _( "You attempt to pry open your wallet " @@ -2518,12 +2530,12 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) difficulty = 6; } else if( type == t_door_c ) { p->add_msg_if_player( m_info, _( "You notice the door is unlocked, so you simply open it." ) ); - g->m.ter_set( pnt, t_door_o ); + here.ter_set( pnt, t_door_o ); p->mod_moves( -100 ); return 0; } else if( type == t_door_c_peep ) { p->add_msg_if_player( m_info, _( "You notice the door is unlocked, so you simply open it." ) ); - g->m.ter_set( pnt, t_door_o_peep ); + here.ter_set( pnt, t_door_o_peep ); p->mod_moves( -100 ); return 0; } else if( type == t_manhole_cover ) { @@ -2580,19 +2592,19 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) if( dice( 4, difficulty ) < dice( 4, p->str_cur ) ) { p->add_msg_if_player( m_good, succ_action ); - if( g->m.furn( pnt ) == f_crate_c ) { - g->m.furn_set( pnt, f_crate_o ); - } else if( g->m.furn( pnt ) == f_coffin_c ) { - g->m.furn_set( pnt, f_coffin_o ); + if( here.furn( pnt ) == f_crate_c ) { + here.furn_set( pnt, f_crate_o ); + } else if( here.furn( pnt ) == f_coffin_c ) { + here.furn_set( pnt, f_coffin_o ); } else { - g->m.ter_set( pnt, new_type ); + here.ter_set( pnt, new_type ); } if( noisy ) { sounds::sound( pnt, 12, sounds::sound_t::combat, _( "crunch!" ), true, "tool", "crowbar" ); } if( type == t_manhole_cover ) { - g->m.spawn_item( pnt, itype_manhole_cover ); + here.spawn_item( pnt, itype_manhole_cover ); } if( type == t_door_locked_alarm ) { g->events().send( p->getID() ); @@ -2613,10 +2625,10 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) p->str_cur ) ) { p->add_msg_if_player( m_mixed, _( "You break the glass." ) ); sounds::sound( pnt, 24, sounds::sound_t::combat, _( "glass breaking!" ), true, "smash", "glass" ); - g->m.ter_set( pnt, t_window_frame ); - g->m.spawn_item( pnt, itype_sheet, 2 ); - g->m.spawn_item( pnt, itype_stick ); - g->m.spawn_item( pnt, itype_string_36 ); + here.ter_set( pnt, t_window_frame ); + here.spawn_item( pnt, itype_sheet, 2 ); + here.spawn_item( pnt, itype_stick ); + here.spawn_item( pnt, itype_string_36 ); return it->type->charges_to_use(); } } @@ -2646,10 +2658,11 @@ int iuse::makemound( player *p, item *it, bool t, const tripoint & ) return 0; } - if( g->m.has_flag( flag_PLOWABLE, pnt ) && !g->m.has_flag( flag_PLANT, pnt ) ) { + map &here = get_map(); + if( here.has_flag( flag_PLOWABLE, pnt ) && !here.has_flag( flag_PLANT, pnt ) ) { p->add_msg_if_player( _( "You start churning up the earth here." ) ); p->assign_activity( ACT_CHURN, 18000, -1, p->get_item_position( it ) ); - p->activity.placement = g->m.getabs( pnt ); + p->activity.placement = here.getabs( pnt ); return it->type->charges_to_use(); } else { p->add_msg_if_player( _( "You can't churn up this ground." ) ); @@ -2775,7 +2788,7 @@ static digging_moves_and_byproducts dig_pit_moves_and_byproducts( player *p, ite // Modify the number of moves based on the help. // TODO: this block of code is all over the place and could probably be consolidated. - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = p->get_num_crafting_helpers( 3 ); moves = moves * ( 1 - ( helpersize / 10 ) ); ter_id result_terrain; @@ -2799,19 +2812,20 @@ int iuse::dig( player *p, item *it, bool t, const tripoint & ) } const tripoint dig_point = p->pos(); - const bool can_dig_here = g->m.has_flag( "DIGGABLE", dig_point ) && - !g->m.has_furn( dig_point ) && - g->m.tr_at( dig_point ).is_null() && - ( g->m.ter( dig_point ) == t_grave_new || g->m.i_at( dig_point ).empty() ) && - !g->m.veh_at( dig_point ); + map &here = get_map(); + const bool can_dig_here = here.has_flag( "DIGGABLE", dig_point ) && + !here.has_furn( dig_point ) && + !here.can_see_trap_at( dig_point, *p ) && + ( here.ter( dig_point ) == t_grave_new || here.i_at( dig_point ).empty() ) && + !here.veh_at( dig_point ); if( !can_dig_here ) { p->add_msg_if_player( _( "You can't dig a pit in this location. Ensure it is clear diggable ground with no items or obstacles." ) ); return 0; } - const bool can_deepen = g->m.has_flag( "DIGGABLE_CAN_DEEPEN", dig_point ); - const bool grave = g->m.ter( dig_point ) == t_grave; + const bool can_deepen = here.has_flag( "DIGGABLE_CAN_DEEPEN", dig_point ); + const bool grave = here.ter( dig_point ) == t_grave; if( !p->crafting_inventory().has_quality( qual_DIG, 2 ) ) { if( can_deepen ) { @@ -2823,8 +2837,8 @@ int iuse::dig( player *p, item *it, bool t, const tripoint & ) } } - const std::function f = []( const tripoint & pnt ) { - return g->m.passable( pnt ); + const std::function f = [&here]( const tripoint & pnt ) { + return here.passable( pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -2842,28 +2856,28 @@ int iuse::dig( player *p, item *it, bool t, const tripoint & ) } if( grave ) { - if( g->u.has_trait( trait_SPIRITUAL ) && !g->u.has_trait( trait_PSYCHOPATH ) && - g->u.query_yn( _( "Would you really touch the sacred resting place of the dead?" ) ) ) { + if( p->has_trait( trait_SPIRITUAL ) && !p->has_trait( trait_PSYCHOPATH ) && + p->query_yn( _( "Would you really touch the sacred resting place of the dead?" ) ) ) { add_msg( m_info, _( "Exhuming a grave is really against your beliefs." ) ); - g->u.add_morale( MORALE_GRAVEDIGGER, -50, -100, 48_hours, 12_hours ); + p->add_morale( MORALE_GRAVEDIGGER, -50, -100, 48_hours, 12_hours ); if( one_in( 3 ) ) { - g->u.vomit(); + p->vomit(); } - } else if( g->u.has_trait( trait_PSYCHOPATH ) ) { + } else if( p->has_trait( trait_PSYCHOPATH ) ) { p->add_msg_if_player( m_good, _( "Exhuming a grave is fun now, where there is no one to object." ) ); - g->u.add_morale( MORALE_GRAVEDIGGER, 25, 50, 2_hours, 1_hours ); - } else if( !g->u.has_trait( trait_EATDEAD ) && - !g->u.has_trait( trait_SAPROVORE ) ) { + p->add_morale( MORALE_GRAVEDIGGER, 25, 50, 2_hours, 1_hours ); + } else if( !p->has_trait( trait_EATDEAD ) && + !p->has_trait( trait_SAPROVORE ) ) { p->add_msg_if_player( m_bad, _( "Exhuming this grave is utterly disgusting!" ) ); - g->u.add_morale( MORALE_GRAVEDIGGER, -25, -50, 2_hours, 1_hours ); + p->add_morale( MORALE_GRAVEDIGGER, -25, -50, 2_hours, 1_hours ); if( one_in( 5 ) ) { p->vomit(); } } } - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = p->get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); break; @@ -2900,11 +2914,13 @@ int iuse::dig_channel( player *p, item *it, bool t, const tripoint & ) tripoint west = dig_point + point_west; tripoint east = dig_point + point_east; - const bool can_dig_here = g->m.has_flag( flag_DIGGABLE, dig_point ) && - !g->m.has_furn( dig_point ) && - g->m.tr_at( dig_point ).is_null() && g->m.i_at( dig_point ).empty() && !g->m.veh_at( dig_point ) && - ( g->m.has_flag( flag_CURRENT, north ) || g->m.has_flag( flag_CURRENT, south ) || - g->m.has_flag( flag_CURRENT, east ) || g->m.has_flag( flag_CURRENT, west ) ); + map &here = get_map(); + const bool can_dig_here = here.has_flag( flag_DIGGABLE, dig_point ) && + !here.has_furn( dig_point ) && + !here.can_see_trap_at( dig_point, *p ) && here.i_at( dig_point ).empty() && + !here.veh_at( dig_point ) && + ( here.has_flag( flag_CURRENT, north ) || here.has_flag( flag_CURRENT, south ) || + here.has_flag( flag_CURRENT, east ) || here.has_flag( flag_CURRENT, west ) ); if( !can_dig_here ) { p->add_msg_if_player( @@ -2912,8 +2928,8 @@ int iuse::dig_channel( player *p, item *it, bool t, const tripoint & ) return 0; } - const std::function f = []( const tripoint & pnt ) { - return g->m.passable( pnt ); + const std::function f = [&here]( const tripoint & pnt ) { + return here.passable( pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -2930,7 +2946,7 @@ int iuse::dig_channel( player *p, item *it, bool t, const tripoint & ) return 0; } - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = p->get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); break; @@ -2968,11 +2984,13 @@ int iuse::fill_pit( player *p, item *it, bool t, const tripoint & ) t_dirtmound }; - const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id type = g->m.ter( pnt ); + const ter_id type = here.ter( pnt ); return ( allowed_ter_id.find( type ) != allowed_ter_id.end() ); }; @@ -2982,7 +3000,7 @@ int iuse::fill_pit( player *p, item *it, bool t, const tripoint & ) return 0; } const tripoint &pnt = *pnt_; - const ter_id ter = g->m.ter( pnt ); + const ter_id ter = here.ter( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( m_info, _( "You decide not to bury yourself that early." ) ); @@ -3003,8 +3021,8 @@ int iuse::fill_pit( player *p, item *it, bool t, const tripoint & ) } else { return 0; } - const std::vector helpers = g->u.get_crafting_helpers(); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const std::vector helpers = p->get_crafting_helpers(); + const int helpersize = p->get_num_crafting_helpers( 3 ); moves = moves * ( 1 - ( helpersize / 10 ) ); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); @@ -3030,7 +3048,7 @@ int iuse::clear_rubble( player *p, item *it, bool, const tripoint & ) return 0; } const std::function f = []( const tripoint & pnt ) { - return g->m.has_flag( "RUBBLE", pnt ); + return get_map().has_flag( "RUBBLE", pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -3045,12 +3063,12 @@ int iuse::clear_rubble( player *p, item *it, bool, const tripoint & ) } int bonus = std::max( it->get_quality( quality_id( "DIG" ) ) - 1, 1 ); - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = p->get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); break; } - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = p->get_num_crafting_helpers( 3 ); const int moves = to_moves( 30_seconds ) * ( 1 - ( helpersize / 10 ) ); player_activity act( ACT_CLEAR_RUBBLE, moves / bonus, bonus ); p->assign_activity( act ); @@ -3066,15 +3084,16 @@ int iuse::siphon( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const std::function f = []( const tripoint & pnt ) { - const optional_vpart_position vp = g->m.veh_at( pnt ); + map &here = get_map(); + const std::function f = [&here]( const tripoint & pnt ) { + const optional_vpart_position vp = here.veh_at( pnt ); return !!vp; }; vehicle *v = nullptr; bool found_more_than_one = false; - for( const tripoint &pos : g->m.points_in_radius( g->u.pos(), 1 ) ) { - const optional_vpart_position vp = g->m.veh_at( pos ); + for( const tripoint &pos : here.points_in_radius( p->pos(), 1 ) ) { + const optional_vpart_position vp = here.veh_at( pos ); if( !vp ) { continue; } @@ -3096,7 +3115,7 @@ int iuse::siphon( player *p, item *it, bool, const tripoint & ) if( !pnt_ ) { return 0; } - const optional_vpart_position vp = g->m.veh_at( *pnt_ ); + const optional_vpart_position vp = here.veh_at( *pnt_ ); if( vp ) { v = &vp->vehicle(); } @@ -3337,23 +3356,24 @@ int iuse::jackhammer( player *p, item *it, bool, const tripoint &pos ) pnt = *pnt_; } - if( !g->m.has_flag( "MINEABLE", pnt ) ) { + map &here = get_map(); + if( !here.has_flag( "MINEABLE", pnt ) ) { p->add_msg_if_player( m_info, _( "You can't drill there." ) ); return 0; } - if( g->m.veh_at( pnt ) ) { + if( here.veh_at( pnt ) ) { p->add_msg_if_player( _( "There's a vehicle in the way!" ) ); return 0; } int moves = to_moves( 30_minutes ); - if( g->m.move_cost( pnt ) == 2 ) { + if( here.move_cost( pnt ) == 2 ) { // We're breaking up some flat surface like pavement, which is much easier moves /= 2; } - const std::vector helpers = g->u.get_crafting_helpers(); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const std::vector helpers = p->get_crafting_helpers(); + const int helpersize = p->get_num_crafting_helpers( 3 ); moves *= ( 1 - ( helpersize / 10 ) ); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); @@ -3361,9 +3381,9 @@ int iuse::jackhammer( player *p, item *it, bool, const tripoint &pos ) } p->assign_activity( ACT_JACKHAMMER, moves, -1, p->get_item_position( it ) ); - p->activity.placement = g->m.getabs( pnt ); + p->activity.placement = here.getabs( pnt ); p->add_msg_if_player( _( "You start drilling into the %1$s with your %2$s." ), - g->m.tername( pnt ), it->tname() ); + here.tername( pnt ), it->tname() ); return it->type->charges_to_use(); } @@ -3405,7 +3425,7 @@ int iuse::pick_lock( player *p, item *it, bool, const tripoint &pos ) } you.assign_activity( lockpick_activity_actor( duration, item_location( you, it ), cata::nullopt, - g->m.getabs( *target ) ) ); + get_map().getabs( *target ) ) ); return it->type->charges_to_use(); } @@ -3433,24 +3453,25 @@ int iuse::pickaxe( player *p, item *it, bool, const tripoint &pos ) pnt = *pnt_; } - if( !g->m.has_flag( "MINEABLE", pnt ) ) { + map &here = get_map(); + if( !here.has_flag( "MINEABLE", pnt ) ) { p->add_msg_if_player( m_info, _( "You can't mine there." ) ); return 0; } - if( g->m.veh_at( pnt ) ) { + if( here.veh_at( pnt ) ) { p->add_msg_if_player( _( "There's a vehicle in the way!" ) ); return 0; } int moves = to_moves( 20_minutes ); moves += ( ( MAX_STAT + 4 ) - std::min( p->str_cur, MAX_STAT ) ) * to_moves( 5_minutes ); - if( g->m.move_cost( pnt ) == 2 ) { + if( here.move_cost( pnt ) == 2 ) { // We're breaking up some flat surface like pavement, which is much easier moves /= 2; } - const std::vector helpers = g->u.get_crafting_helpers(); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const std::vector helpers = p->get_crafting_helpers(); + const int helpersize = p->get_num_crafting_helpers( 3 ); moves *= ( 1 - ( helpersize / 10 ) ); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); @@ -3459,9 +3480,9 @@ int iuse::pickaxe( player *p, item *it, bool, const tripoint &pos ) p->assign_activity( ACT_PICKAXE, moves, -1 ); p->activity.targets.push_back( item_location( *p, it ) ); - p->activity.placement = g->m.getabs( pnt ); + p->activity.placement = here.getabs( pnt ); p->add_msg_if_player( _( "You strike the %1$s with your %2$s." ), - g->m.tername( pnt ), it->tname() ); + here.tername( pnt ), it->tname() ); return 0; // handled when the activity finishes } @@ -3489,32 +3510,34 @@ int iuse::burrow( player *p, item *it, bool, const tripoint &pos ) pnt = *pnt_; } - if( !g->m.has_flag( "MINEABLE", pnt ) ) { + map &here = get_map(); + if( !here.has_flag( "MINEABLE", pnt ) ) { p->add_msg_if_player( m_info, _( "You can't burrow there." ) ); return 0; } - if( g->m.veh_at( pnt ) ) { + if( here.veh_at( pnt ) ) { p->add_msg_if_player( _( "There's a vehicle in the way!" ) ); return 0; } int moves = to_moves( 5_minutes ); moves += ( ( MAX_STAT + 3 ) - std::min( p->str_cur, MAX_STAT ) ) * to_moves( 2_minutes ); - if( g->m.move_cost( pnt ) == 2 ) { + if( here.move_cost( pnt ) == 2 ) { // We're breaking up some flat surface like pavement, which is much easier moves /= 2; } p->assign_activity( ACT_BURROW, moves, -1, 0 ); p->activity.placement = pnt; p->add_msg_if_player( _( "You start tearing into the %1$s with your %2$s." ), - g->m.tername( pnt ), it->tname() ); + here.tername( pnt ), it->tname() ); return 0; // handled when the activity finishes } int iuse::geiger( player *p, item *it, bool t, const tripoint &pos ) { + map &here = get_map(); if( t ) { // Every-turn use when it's on - const int rads = g->m.get_radiation( pos ); + const int rads = here.get_radiation( pos ); if( rads == 0 ) { return it->type->charges_to_use(); } @@ -3567,7 +3590,7 @@ int iuse::geiger( player *p, item *it, bool t, const tripoint &pos ) return 0; } const tripoint &pnt = *pnt_; - if( pnt == g->u.pos() ) { + if( pnt == p->pos() ) { p->add_msg_if_player( m_info, _( "Your radiation level: %d mSv (%d mSv from items)" ), p->get_rad(), p->leak_level( "RADIOACTIVE" ) ); break; @@ -3582,7 +3605,7 @@ int iuse::geiger( player *p, item *it, bool t, const tripoint &pos ) } case 1: p->add_msg_if_player( m_info, _( "The ground's radiation level: %d mSv/h" ), - g->m.get_radiation( p->pos() ) ); + here.get_radiation( p->pos() ) ); break; case 2: p->add_msg_if_player( _( "The geiger counter's scan LED turns on." ) ); @@ -3620,17 +3643,19 @@ int iuse::can_goo( player *p, item *it, bool, const tripoint & ) int tries = 0; tripoint goop; goop.z = p->posz(); + map &here = get_map(); do { goop.x = p->posx() + rng( -2, 2 ); goop.y = p->posy() + rng( -2, 2 ); tries++; - } while( g->m.impassable( goop ) && tries < 10 ); + } while( here.impassable( goop ) && tries < 10 ); if( tries == 10 ) { return 0; } + Character &player_character = get_player_character(); if( monster *const mon_ptr = g->critter_at( goop ) ) { monster &critter = *mon_ptr; - if( g->u.sees( goop ) ) { + if( player_character.sees( goop ) ) { add_msg( _( "Black goo emerges from the canister and envelopes a %s!" ), critter.name() ); } @@ -3639,7 +3664,7 @@ int iuse::can_goo( player *p, item *it, bool, const tripoint & ) critter.set_speed_base( critter.get_speed_base() - rng( 5, 25 ) ); critter.set_hp( critter.get_speed() ); } else { - if( g->u.sees( goop ) ) { + if( player_character.sees( goop ) ) { add_msg( _( "Living black goo emerges from the canister!" ) ); } if( monster *const goo = g->place_critter_at( mon_blob, goop ) ) { @@ -3653,13 +3678,13 @@ int iuse::can_goo( player *p, item *it, bool, const tripoint & ) goop.x = p->posx() + rng( -2, 2 ); goop.y = p->posy() + rng( -2, 2 ); tries++; - found = g->m.passable( goop ) && g->m.tr_at( goop ).is_null(); + found = here.passable( goop ) && here.tr_at( goop ).is_null(); } while( !found && tries < 10 ); if( found ) { - if( g->u.sees( goop ) ) { + if( player_character.sees( goop ) ) { add_msg( m_warning, _( "A nearby splatter of goo forms into a goo pit." ) ); } - g->m.trap_set( goop, tr_goo ); + here.trap_set( goop, tr_goo ); } else { return 0; } @@ -3667,28 +3692,6 @@ int iuse::can_goo( player *p, item *it, bool, const tripoint & ) return it->type->charges_to_use(); } -int iuse::throwable_extinguisher_act( player *, item *it, bool, const tripoint &pos ) -{ - if( pos.x == -999 || pos.y == -999 ) { - return 0; - } - if( g->m.get_field( pos, fd_fire ) != nullptr ) { - sounds::sound( pos, 50, sounds::sound_t::combat, _( "Bang!" ), false, "explosion", "small" ); - // Reduce the strength of fire (if any) in the target tile. - g->m.mod_field_intensity( pos, fd_fire, 0 - 2 ); - // Slightly reduce the strength of fire around and in the target tile. - for( const tripoint &dest : g->m.points_in_radius( pos, 1 ) ) { - if( g->m.passable( dest ) && dest != pos ) { - g->m.mod_field_intensity( dest, fd_fire, 0 - rng( 0, 2 ) ); - } - } - it->charges = -1; - return 1; - } - it->active = false; - return 0; -} - int iuse::granade( player *p, item *it, bool, const tripoint & ) { p->add_msg_if_player( _( "You pull the pin on the Granade." ) ); @@ -3703,6 +3706,7 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) if( pos.x == -999 || pos.y == -999 ) { return 0; } + map &here = get_map(); if( t ) { // Simple timer effects // Vol 0 = only heard if you hold it sounds::sound( pos, 0, sounds::sound_t::electronic_speech, _( "Merged!" ), @@ -3718,12 +3722,13 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) auto modified_stat = current_stat + modify_by; current_stat = std::max( current_stat, std::min( 15, modified_stat ) ); }; + avatar &player_character = get_avatar(); switch( effect_roll ) { case 1: sounds::sound( pos, 100, sounds::sound_t::electronic_speech, _( "BUGFIXES!" ), true, "speech", it->typeId().str() ); explosion_handler::draw_explosion( pos, explosion_radius, c_light_cyan ); - for( const tripoint &dest : g->m.points_in_radius( pos, explosion_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, explosion_radius ) ) { monster *const mon = g->critter_at( dest, true ); if( mon && ( mon->type->in_species( species_INSECT ) || mon->is_hallucination() ) ) { mon->die_in_explosion( nullptr ); @@ -3735,7 +3740,7 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) sounds::sound( pos, 100, sounds::sound_t::electronic_speech, _( "BUFFS!" ), true, "speech", it->typeId().str() ); explosion_handler::draw_explosion( pos, explosion_radius, c_green ); - for( const tripoint &dest : g->m.points_in_radius( pos, explosion_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, explosion_radius ) ) { if( monster *const mon_ptr = g->critter_at( dest ) ) { monster &critter = *mon_ptr; critter.set_speed_base( @@ -3750,20 +3755,22 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) buff_stat( person->int_max, rng( 0, person->int_max / 2 ) ); /** @EFFECT_PER_MAX increases possible granade per buff for NPCs */ buff_stat( person->per_max, rng( 0, person->per_max / 2 ) ); - } else if( g->u.pos() == dest ) { + } else if( player_character.pos() == dest ) { /** @EFFECT_STR_MAX increases possible granade str buff */ - buff_stat( g->u.str_max, rng( 0, g->u.str_max / 2 ) ); + buff_stat( player_character.str_max, rng( 0, player_character.str_max / 2 ) ); /** @EFFECT_DEX_MAX increases possible granade dex buff */ - buff_stat( g->u.dex_max, rng( 0, g->u.dex_max / 2 ) ); + buff_stat( player_character.dex_max, rng( 0, player_character.dex_max / 2 ) ); /** @EFFECT_INT_MAX increases possible granade int buff */ - buff_stat( g->u.int_max, rng( 0, g->u.int_max / 2 ) ); + buff_stat( player_character.int_max, rng( 0, player_character.int_max / 2 ) ); /** @EFFECT_PER_MAX increases possible granade per buff */ - buff_stat( g->u.per_max, rng( 0, g->u.per_max / 2 ) ); - g->u.recalc_hp(); - for( int part = 0; part < num_hp_parts; part++ ) { - g->u.hp_cur[part] *= 1 + rng( 0, 20 ) * .1; - if( g->u.hp_cur[part] > g->u.hp_max[part] ) { - g->u.hp_cur[part] = g->u.hp_max[part]; + buff_stat( player_character.per_max, rng( 0, player_character.per_max / 2 ) ); + player_character.recalc_hp(); + for( const bodypart_id &bp : player_character.get_all_body_parts() ) { + player_character.set_part_hp_cur( bp, player_character.get_part_hp_cur( bp ) * rng_float( 1, + 1.2 ) ); + const int hp_max = player_character.get_part_hp_max( bp ); + if( player_character.get_part_hp_cur( bp ) > hp_max ) { + player_character.set_part_hp_cur( bp, hp_max ); } } } @@ -3774,7 +3781,7 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) sounds::sound( pos, 100, sounds::sound_t::electronic_speech, _( "NERFS!" ), true, "speech", it->typeId().str() ); explosion_handler::draw_explosion( pos, explosion_radius, c_red ); - for( const tripoint &dest : g->m.points_in_radius( pos, explosion_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, explosion_radius ) ) { if( monster *const mon_ptr = g->critter_at( dest ) ) { monster &critter = *mon_ptr; critter.set_speed_base( @@ -3789,19 +3796,20 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) person->int_max -= rng( 0, person->int_max / 2 ); /** @EFFECT_PER_MAX increases possible granade per debuff for NPCs (NEGATIVE) */ person->per_max -= rng( 0, person->per_max / 2 ); - } else if( g->u.pos() == dest ) { + } else if( player_character.pos() == dest ) { /** @EFFECT_STR_MAX increases possible granade str debuff (NEGATIVE) */ - g->u.str_max -= rng( 0, g->u.str_max / 2 ); + player_character.str_max -= rng( 0, player_character.str_max / 2 ); /** @EFFECT_DEX_MAX increases possible granade dex debuff (NEGATIVE) */ - g->u.dex_max -= rng( 0, g->u.dex_max / 2 ); + player_character.dex_max -= rng( 0, player_character.dex_max / 2 ); /** @EFFECT_INT_MAX increases possible granade int debuff (NEGATIVE) */ - g->u.int_max -= rng( 0, g->u.int_max / 2 ); + player_character.int_max -= rng( 0, player_character.int_max / 2 ); /** @EFFECT_PER_MAX increases possible granade per debuff (NEGATIVE) */ - g->u.per_max -= rng( 0, g->u.per_max / 2 ); - g->u.recalc_hp(); - for( int part = 0; part < num_hp_parts; part++ ) { - if( g->u.hp_cur[part] > 0 ) { - g->u.hp_cur[part] = rng( 1, g->u.hp_cur[part] ); + player_character.per_max -= rng( 0, player_character.per_max / 2 ); + player_character.recalc_hp(); + for( const bodypart_id &bp : player_character.get_all_body_parts() ) { + const int hp_cur = player_character.get_part_hp_cur( bp ); + if( hp_cur > 0 ) { + player_character.set_part_hp_cur( bp, rng( 1, hp_cur ) ); } } } @@ -3812,7 +3820,7 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) sounds::sound( pos, 100, sounds::sound_t::electronic_speech, _( "REVERTS!" ), true, "speech", it->typeId().str() ); explosion_handler::draw_explosion( pos, explosion_radius, c_pink ); - for( const tripoint &dest : g->m.points_in_radius( pos, explosion_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, explosion_radius ) ) { if( monster *const mon_ptr = g->critter_at( dest ) ) { monster &critter = *mon_ptr; critter.set_speed_base( critter.type->speed ); @@ -3820,9 +3828,9 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) critter.clear_effects(); } else if( npc *const person = g->critter_at( dest ) ) { person->environmental_revert_effect(); - } else if( g->u.pos() == dest ) { - g->u.environmental_revert_effect(); - do_purify( g->u ); + } else if( player_character.pos() == dest ) { + player_character.environmental_revert_effect(); + do_purify( player_character ); } } break; @@ -3830,9 +3838,9 @@ int iuse::granade_act( player *p, item *it, bool t, const tripoint &pos ) sounds::sound( pos, 100, sounds::sound_t::electronic_speech, _( "BEES!" ), true, "speech", it->typeId().str() ); explosion_handler::draw_explosion( pos, explosion_radius, c_yellow ); - for( const tripoint &dest : g->m.points_in_radius( pos, explosion_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, explosion_radius ) ) { if( one_in( 5 ) && !g->critter_at( dest ) ) { - g->m.add_field( dest, fd_bees, rng( 1, 3 ) ); + here.add_field( dest, fd_bees, rng( 1, 3 ) ); } } break; @@ -3860,8 +3868,9 @@ int iuse::acidbomb_act( player *p, item *it, bool, const tripoint &pos ) { if( !p->has_item( *it ) ) { it->charges = -1; - for( const tripoint &tmp : g->m.points_in_radius( pos.x == -999 ? p->pos() : pos, 1 ) ) { - g->m.add_field( tmp, fd_acid, 3 ); + map &here = get_map(); + for( const tripoint &tmp : here.points_in_radius( pos.x == -999 ? p->pos() : pos, 1 ) ) { + here.add_field( tmp, fd_acid, 3 ); } return 1; } @@ -3881,17 +3890,18 @@ int iuse::grenade_inc_act( player *p, item *it, bool t, const tripoint &pos ) p->add_msg_if_player( m_info, _( "You've already released the handle, try throwing it instead." ) ); return 0; } else { // blow up + map &here = get_map(); int num_flames = rng( 3, 5 ); for( int current_flame = 0; current_flame < num_flames; current_flame++ ) { tripoint dest( pos + point( rng( -5, 5 ), rng( -5, 5 ) ) ); std::vector flames = line_to( pos, dest, 0, 0 ); for( auto &flame : flames ) { - g->m.add_field( flame, fd_fire, rng( 0, 2 ) ); + here.add_field( flame, fd_fire, rng( 0, 2 ) ); } } explosion_handler::explosion( pos, 8, 0.8, true ); - for( const tripoint &dest : g->m.points_in_radius( pos, 2 ) ) { - g->m.add_field( dest, fd_incendiary, 3 ); + for( const tripoint &dest : here.points_in_radius( pos, 2 ) ) { + here.add_field( dest, fd_incendiary, 3 ); } } @@ -3924,6 +3934,13 @@ int iuse::molotov_lit( player *p, item *it, bool t, const tripoint &pos ) { if( pos.x == -999 || pos.y == -999 ) { return 0; + } else if( !t ) { + map &here = get_map(); + for( const tripoint &pt : here.points_in_radius( pos, 1, 0 ) ) { + const int intensity = 1 + one_in( 3 ) + one_in( 5 ); + here.add_field( pt, fd_fire, intensity ); + } + return 1; } else if( it->charges > 0 ) { p->add_msg_if_player( m_info, _( "You've already lit the %s, try throwing it instead." ), it->tname() ); @@ -3934,13 +3951,7 @@ int iuse::molotov_lit( player *p, item *it, bool t, const tripoint &pos ) p->add_msg_if_player( _( "Your lit Molotov goes out." ) ); it->convert( itype_molotov ).active = false; } - } else { - if( !t ) { - for( auto &pt : g->m.points_in_radius( pos, 1, 0 ) ) { - const int intensity = 1 + one_in( 3 ) + one_in( 5 ); - g->m.add_field( pt, fd_fire, intensity ); - } - } + return 0; } return 0; } @@ -4057,7 +4068,7 @@ int iuse::pheromone( player *p, item *it, bool, const tripoint &pos ) p->moves -= 15; int converts = 0; - for( const tripoint &dest : g->m.points_in_radius( pos, 4 ) ) { + for( const tripoint &dest : get_map().points_in_radius( pos, 4 ) ) { monster *const mon_ptr = g->critter_at( dest, true ); if( !mon_ptr ) { continue; @@ -4070,7 +4081,7 @@ int iuse::pheromone( player *p, item *it, bool, const tripoint &pos ) } } - if( g->u.sees( *p ) ) { + if( get_player_character().sees( *p ) ) { if( converts == 0 ) { add_msg( _( "…but nothing happens." ) ); } else if( converts == 1 ) { @@ -4092,7 +4103,7 @@ int iuse::portal( player *p, item *it, bool, const tripoint & ) return 0; } tripoint t( p->posx() + rng( -2, 2 ), p->posy() + rng( -2, 2 ), p->posz() ); - g->m.trap_set( t, tr_portal ); + get_map().trap_set( t, tr_portal ); return it->type->charges_to_use(); } @@ -4286,7 +4297,8 @@ static std::string get_music_description() return _( "a sweet guitar solo!" ); } -void iuse::play_music( player &p, const tripoint &source, const int volume, const int max_morale ) +void iuse::play_music( Character &p, const tripoint &source, const int volume, + const int max_morale ) { // TODO: what about other "player", e.g. when a NPC is listening or when the PC is listening, // the other characters around should be able to profit as well. @@ -4462,7 +4474,7 @@ int iuse::gasmask( player *p, item *it, bool t, const tripoint &pos ) if( t ) { // Normal use if( p->is_worn( *it ) ) { // calculate amount of absorbed gas per filter charge - const field &gasfield = g->m.field_at( pos ); + const field &gasfield = get_map().field_at( pos ); for( auto &dfield : gasfield ) { const field_entry &entry = dfield.second; if( entry.get_gas_absorption_factor() > 0 ) { @@ -4745,7 +4757,7 @@ int iuse::dog_whistle( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( _( "You blow your dog whistle." ) ); for( monster &critter : g->all_monsters() ) { if( critter.friendly != 0 && critter.has_flag( MF_DOGFOOD ) ) { - bool u_see = g->u.sees( critter ); + bool u_see = get_player_character().sees( critter ); if( critter.has_effect( effect_docile ) ) { if( u_see ) { p->add_msg_if_player( _( "Your %s looks ready to attack." ), critter.name() ); @@ -4764,9 +4776,10 @@ int iuse::dog_whistle( player *p, item *it, bool, const tripoint & ) int iuse::call_of_tindalos( player *p, item *it, bool, const tripoint & ) { - for( const tripoint &dest : g->m.points_in_radius( p->pos(), 12 ) ) { - if( g->m.is_cornerfloor( dest ) ) { - g->m.add_field( dest, fd_tindalos_rift, 3 ); + map &here = get_map(); + for( const tripoint &dest : here.points_in_radius( p->pos(), 12 ) ) { + if( here.is_cornerfloor( dest ) ) { + here.add_field( dest, fd_tindalos_rift, 3 ); add_msg( m_info, _( "You hear a low-pitched echoing howl." ) ); } } @@ -4790,7 +4803,7 @@ int iuse::blood_draw( player *p, item *it, bool, const tripoint & ) item blood( "blood", calendar::turn ); bool drew_blood = false; bool acid_blood = false; - for( item &map_it : g->m.i_at( point( p->posx(), p->posy() ) ) ) { + for( item &map_it : get_map().i_at( point( p->posx(), p->posy() ) ) ) { if( map_it.is_corpse() && query_yn( _( "Draw blood from %s?" ), colorize( map_it.tname(), map_it.color_in_inventory() ) ) ) { @@ -4846,7 +4859,7 @@ int iuse::mind_splicer( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - for( item &map_it : g->m.i_at( point( p->posx(), p->posy() ) ) ) { + for( item &map_it : get_map().i_at( point( p->posx(), p->posy() ) ) ) { if( map_it.typeId() == itype_rmi2_corpse && query_yn( _( "Use the mind splicer kit on the %s?" ), colorize( map_it.tname(), map_it.color_in_inventory() ) ) ) { @@ -4879,7 +4892,7 @@ int iuse::mind_splicer( player *p, item *it, bool, const tripoint & ) return 0; } -void iuse::cut_log_into_planks( player &p ) +void iuse::cut_log_into_planks( Character &p ) { if( p.is_mounted() ) { p.add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); @@ -4889,7 +4902,7 @@ void iuse::cut_log_into_planks( player &p ) p.add_msg_if_player( _( "You cut the log into planks." ) ); p.assign_activity( ACT_CHOP_PLANKS, moves, -1 ); - p.activity.placement = g->m.getabs( p.pos() ); + p.activity.placement = get_map().getabs( p.pos() ); } int iuse::lumber( player *p, item *it, bool t, const tripoint & ) @@ -4901,10 +4914,11 @@ int iuse::lumber( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } + map &here = get_map(); // Check if player is standing on any lumber - for( item &i : g->m.i_at( p->pos() ) ) { + for( item &i : here.i_at( p->pos() ) ) { if( i.typeId() == itype_log ) { - g->m.i_rem( p->pos(), &i ); + here.i_rem( p->pos(), &i ); cut_log_into_planks( *p ); return it->type->charges_to_use(); } @@ -4938,7 +4952,7 @@ static int chop_moves( player *p, item *it ) const int attr = it->has_flag( "POWERED" ) ? p->dex_cur : p->str_cur; int moves = to_moves( time_duration::from_minutes( 60 - attr ) / std::pow( 2, quality - 1 ) ); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = p->get_num_crafting_helpers( 3 ); moves = moves * ( 1 - ( helpersize / 10 ) ); return moves; } @@ -4952,11 +4966,12 @@ int iuse::chop_tree( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const std::function f = []( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = [&here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - return g->m.has_flag( "TREE", pnt ); + return here.has_flag( "TREE", pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -4974,13 +4989,13 @@ int iuse::chop_tree( player *p, item *it, bool t, const tripoint & ) return 0; } int moves = chop_moves( p, it ); - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = p->get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); break; } p->assign_activity( ACT_CHOP_TREE, moves, -1, p->get_item_position( it ) ); - p->activity.placement = g->m.getabs( pnt ); + p->activity.placement = here.getabs( pnt ); return it->type->charges_to_use(); } @@ -4999,8 +5014,9 @@ int iuse::chop_logs( player *p, item *it, bool t, const tripoint & ) t_trunk, t_stump }; - const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { - const ter_id type = g->m.ter( pnt ); + map &here = get_map(); + const std::function f = [&allowed_ter_id, &here]( const tripoint & pnt ) { + const ter_id type = here.ter( pnt ); const bool is_allowed_terrain = allowed_ter_id.find( type ) != allowed_ter_id.end(); return is_allowed_terrain; }; @@ -5017,13 +5033,13 @@ int iuse::chop_logs( player *p, item *it, bool t, const tripoint & ) } int moves = chop_moves( p, it ); - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = p->get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); break; } p->assign_activity( ACT_CHOP_LOGS, moves, -1, p->get_item_position( it ) ); - p->activity.placement = g->m.getabs( pnt ); + p->activity.placement = here.getabs( pnt ); return it->type->charges_to_use(); } @@ -5065,13 +5081,14 @@ int iuse::oxytorch( player *p, item *it, bool, const tripoint & ) f_rack }; - const std::function f = [&allowed_ter_id, - &allowed_furn_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &allowed_furn_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id ter = g->m.ter( pnt ); - const auto furn = g->m.furn( pnt ); + const ter_id ter = here.ter( pnt ); + const auto furn = here.furn( pnt ); const bool is_allowed = ( allowed_ter_id.find( ter ) != allowed_ter_id.end() ) || ( allowed_furn_id.find( furn ) != allowed_furn_id.end() ); @@ -5084,8 +5101,8 @@ int iuse::oxytorch( player *p, item *it, bool, const tripoint & ) return 0; } const tripoint &pnt = *pnt_; - const ter_id ter = g->m.ter( pnt ); - const furn_id furn = g->m.furn( pnt ); + const ter_id ter = here.ter( pnt ); + const furn_id furn = here.furn( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( m_info, _( "Yuck. Acetylene gas smells weird." ) ); @@ -5155,13 +5172,14 @@ int iuse::hacksaw( player *p, item *it, bool t, const tripoint & ) const std::set allowed_furn_id { f_rack }; - const std::function f = [&allowed_ter_id, - &allowed_furn_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &allowed_furn_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id ter = g->m.ter( pnt ); - const auto furn = g->m.furn( pnt ); + const ter_id ter = here.ter( pnt ); + const auto furn = here.furn( pnt ); const bool is_allowed = ( allowed_ter_id.find( ter ) != allowed_ter_id.end() ) || ( allowed_furn_id.find( furn ) != allowed_furn_id.end() ); @@ -5174,7 +5192,7 @@ int iuse::hacksaw( player *p, item *it, bool t, const tripoint & ) return 0; } const tripoint &pnt = *pnt_; - const ter_id ter = g->m.ter( pnt ); + const ter_id ter = here.ter( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( m_info, _( "Why would you do that?" ) ); @@ -5186,7 +5204,7 @@ int iuse::hacksaw( player *p, item *it, bool t, const tripoint & ) } int moves; - if( ter == t_chainfence_posts || g->m.furn( pnt ) == f_rack ) { + if( ter == t_chainfence_posts || here.furn( pnt ) == f_rack ) { moves = to_moves( 2_minutes ); } else if( ter == t_window_enhanced || ter == t_window_enhanced_noglass ) { moves = to_moves( 5_minutes ); @@ -5216,11 +5234,13 @@ int iuse::boltcutters( player *p, item *it, bool, const tripoint & ) t_chaingate_l, t_chainfence }; - const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { - if( pnt == g->u.pos() ) { + map &here = get_map(); + const std::function f = + [&allowed_ter_id, &here, p]( const tripoint & pnt ) { + if( pnt == p->pos() ) { return false; } - const ter_id ter = g->m.ter( pnt ); + const ter_id ter = here.ter( pnt ); const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end(); return is_allowed; }; @@ -5231,7 +5251,7 @@ int iuse::boltcutters( player *p, item *it, bool, const tripoint & ) return 0; } const tripoint &pnt = *pnt_; - const ter_id type = g->m.ter( pnt ); + const ter_id type = here.ter( pnt ); if( !f( pnt ) ) { if( pnt == p->pos() ) { p->add_msg_if_player( m_info, @@ -5244,15 +5264,15 @@ int iuse::boltcutters( player *p, item *it, bool, const tripoint & ) if( type == t_chaingate_l ) { p->moves -= to_moves( 1_seconds ); - g->m.ter_set( pnt, t_chaingate_c ); + here.ter_set( pnt, t_chaingate_c ); sounds::sound( pnt, 5, sounds::sound_t::combat, _( "Gachunk!" ), true, "tool", "boltcutters" ); - g->m.spawn_item( point( p->posx(), p->posy() ), "scrap", 3 ); + here.spawn_item( point( p->posx(), p->posy() ), "scrap", 3 ); } else if( type == t_chainfence ) { p->moves -= to_moves( 5_seconds ); - g->m.ter_set( pnt, t_chainfence_posts ); + here.ter_set( pnt, t_chainfence_posts ); sounds::sound( pnt, 5, sounds::sound_t::combat, _( "Snick, snick, gachunk!" ), true, "tool", "boltcutters" ); - g->m.spawn_item( pnt, "wire", 20 ); + here.spawn_item( pnt, "wire", 20 ); } else { return 0; } @@ -5279,9 +5299,10 @@ int iuse::mop( player *p, item *it, bool, const tripoint & ) fd_slime, fd_sludge }; - const std::function f = [&to_check]( const tripoint & pnt ) { - if( !g->m.has_flag( "LIQUIDCONT", pnt ) ) { - map_stack items = g->m.i_at( pnt ); + map &here = get_map(); + const std::function f = [&to_check, &here]( const tripoint & pnt ) { + if( !here.has_flag( "LIQUIDCONT", pnt ) ) { + map_stack items = here.i_at( pnt ); auto found = std::find_if( items.begin(), items.end(), []( const item & it ) { return it.made_of( phase_id::LIQUID ); } ); @@ -5289,13 +5310,13 @@ int iuse::mop( player *p, item *it, bool, const tripoint & ) return true; } } - field &fld = g->m.field_at( pnt ); + field &fld = here.field_at( pnt ); for( field_type_id fid : to_check ) { if( fld.find_field_c( fid ) ) { return true; } } - if( const optional_vpart_position vp = g->m.veh_at( pnt ) ) { + if( const optional_vpart_position vp = here.veh_at( pnt ) ) { vehicle *const veh = &vp->vehicle(); std::vector parts_here = veh->parts_at_relative( vp->mount(), true ); for( int elem : parts_here ) { @@ -5333,9 +5354,9 @@ int iuse::mop( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You move the mop around, unsure whether it's doing any good." ) ); p->moves -= 15; if( one_in( 3 ) ) { - g->m.mop_spills( pnt ); + here.mop_spills( pnt ); } - } else if( g->m.mop_spills( pnt ) ) { + } else if( here.mop_spills( pnt ) ) { p->add_msg_if_player( m_info, _( "You mop up the spill." ) ); p->moves -= 15; } else { @@ -5368,6 +5389,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) num_used += rng( 1, art->effects_activated.size() - num_used ); } + map &here = get_map(); std::vector effects = art->effects_activated; for( size_t i = 0; i < num_used && !effects.empty(); i++ ) { const art_effect_active used = random_entry_removed( effects ); @@ -5388,7 +5410,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) for( int n = 0; n < dist; n++ ) { bolt.x += dir.x; bolt.y += dir.y; - g->m.add_field( {bolt, p->posz()}, fd_electricity, rng( 2, 3 ) ); + here.add_field( {bolt, p->posz()}, fd_electricity, rng( 2, 3 ) ); if( one_in( 4 ) ) { if( dir.x == 0 ) { dir.x = rng( 0, 1 ) * 2 - 1; @@ -5433,9 +5455,9 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) case AEA_BLOOD: { bool blood = false; - for( const tripoint &tmp : g->m.points_in_radius( p->pos(), 4 ) ) { - if( !one_in( 4 ) && g->m.add_field( tmp, fd_blood, 3 ) && - ( blood || g->u.sees( tmp ) ) ) { + for( const tripoint &tmp : here.points_in_radius( p->pos(), 4 ) ) { + if( !one_in( 4 ) && here.add_field( tmp, fd_blood, 3 ) && + ( blood || get_player_character().sees( tmp ) ) ) { blood = true; } } @@ -5448,14 +5470,14 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) case AEA_FATIGUE: { p->add_msg_if_player( m_warning, _( "The fabric of space seems to decay." ) ); point p2( rng( p->posx() - 3, p->posx() + 3 ), rng( p->posy() - 3, p->posy() + 3 ) ); - g->m.add_field( {p2, p->posz()}, fd_fatigue, rng( 1, 2 ) ); + here.add_field( {p2, p->posz()}, fd_fatigue, rng( 1, 2 ) ); } break; case AEA_ACIDBALL: { if( const cata::optional acidball = g->look_around() ) { - for( const tripoint &tmp : g->m.points_in_radius( *acidball, 1 ) ) { - g->m.add_field( tmp, fd_acid, rng( 2, 3 ) ); + for( const tripoint &tmp : here.points_in_radius( *acidball, 1 ) ) { + here.add_field( tmp, fd_acid, rng( 2, 3 ) ); } } } @@ -5464,12 +5486,12 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) case AEA_PULSE: sounds::sound( p->pos(), 30, sounds::sound_t::combat, _( "The earth shakes!" ), true, "misc", "earthquake" ); - for( const tripoint &pt : g->m.points_in_radius( p->pos(), 2 ) ) { - g->m.bash( pt, 40 ); - g->m.bash( pt, 40 ); // Multibash effect, so that doors &c will fall - g->m.bash( pt, 40 ); - if( g->m.is_bashable( pt ) && rng( 1, 10 ) >= 3 ) { - g->m.bash( pt, 999, false, true ); + for( const tripoint &pt : here.points_in_radius( p->pos(), 2 ) ) { + here.bash( pt, 40 ); + here.bash( pt, 40 ); // Multibash effect, so that doors &c will fall + here.bash( pt, 40 ); + if( here.is_bashable( pt ) && rng( 1, 10 ) >= 3 ) { + here.bash( pt, 999, false, true ); } } break; @@ -5480,7 +5502,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) break; case AEA_CONFUSED: - for( const tripoint &dest : g->m.points_in_radius( p->pos(), 8 ) ) { + for( const tripoint &dest : here.points_in_radius( p->pos(), 8 ) ) { if( monster *const mon = g->critter_at( dest, true ) ) { mon->add_effect( effect_stunned, rng( 5_turns, 15_turns ) ); } @@ -5488,7 +5510,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) break; case AEA_ENTRANCE: - for( const tripoint &dest : g->m.points_in_radius( p->pos(), 8 ) ) { + for( const tripoint &dest : here.points_in_radius( p->pos(), 8 ) ) { monster *const mon = g->critter_at( dest, true ); if( mon && mon->friendly == 0 && rng( 0, 600 ) > mon->get_hp() ) { mon->make_friendly(); @@ -5549,8 +5571,8 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) case AEA_RADIATION: add_msg( m_warning, _( "Horrible gases are emitted!" ) ); - for( const tripoint &dest : g->m.points_in_radius( p->pos(), 1 ) ) { - g->m.add_field( dest, fd_nuke_gas, rng( 2, 3 ) ); + for( const tripoint &dest : here.points_in_radius( p->pos(), 1 ) ) { + here.add_field( dest, fd_nuke_gas, rng( 2, 3 ) ); } break; @@ -5575,10 +5597,10 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) case AEA_FIRESTORM: { p->add_msg_if_player( m_bad, _( "Fire rains down around you!" ) ); - std::vector ps = closest_tripoints_first( p->pos(), 3 ); + std::vector ps = closest_points_first( p->pos(), 3 ); for( auto p_it : ps ) { if( !one_in( 3 ) ) { - g->m.add_field( p_it, fd_fire, 1 + rng( 0, 1 ) * rng( 0, 1 ), 3_minutes ); + here.add_field( p_it, fd_fire, 1 + rng( 0, 1 ) * rng( 0, 1 ), 3_minutes ); } } break; @@ -5637,7 +5659,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) monp.x = ( one_in( 2 ) ? p->posx() - 5 : p->posx() + 5 ); monp.y = rng( p->posy() - 5, p->posy() + 5 ); } - if( !g->m.sees( monp, p->pos(), 10 ) ) { + if( !here.sees( monp, p->pos(), 10 ) ) { continue; } if( monster *const spawned = g->place_critter_at( mon_shadow, monp ) ) { @@ -5689,25 +5711,26 @@ int iuse::spray_can( player *p, item *it, bool, const tripoint & ) return handle_ground_graffiti( *p, it, _( "Spray what?" ), dest_.value() ); } -int iuse::handle_ground_graffiti( player &p, item *it, const std::string &prefix, +int iuse::handle_ground_graffiti( Character &p, item *it, const std::string &prefix, const tripoint &where ) { + map &here = get_map(); string_input_popup popup; std::string message = popup .title( prefix + " " + _( "(To delete, clear the text and confirm)" ) ) - .text( g->m.has_graffiti_at( where ) ? g->m.graffiti_at( where ) : std::string() ) + .text( here.has_graffiti_at( where ) ? here.graffiti_at( where ) : std::string() ) .identifier( "graffiti" ) .query_string(); if( popup.canceled() ) { return 0; } - bool grave = g->m.ter( where ) == t_grave_new; + bool grave = here.ter( where ) == t_grave_new; int move_cost; if( message.empty() ) { - if( g->m.has_graffiti_at( where ) ) { - move_cost = 3 * g->m.graffiti_at( where ).length(); - g->m.delete_graffiti( where ); + if( here.has_graffiti_at( where ) ) { + move_cost = 3 * here.graffiti_at( where ).length(); + here.delete_graffiti( where ); if( grave ) { p.add_msg_if_player( m_info, _( "You blur the inscription on the grave." ) ); } else { @@ -5717,7 +5740,7 @@ int iuse::handle_ground_graffiti( player &p, item *it, const std::string &prefix return 0; } } else { - g->m.set_graffiti( where, message ); + here.set_graffiti( where, message ); if( grave ) { p.add_msg_if_player( m_info, _( "You carve an inscription on the grave." ) ); } else { @@ -5773,7 +5796,7 @@ int iuse::heatpack( player *p, item *it, bool, const tripoint & ) int iuse::heat_food( player *p, item *it, bool, const tripoint & ) { - if( g->m.has_nearby_fire( p->pos() ) ) { + if( get_map().has_nearby_fire( p->pos() ) ) { heat_item( *p ); } else if( p->has_active_bionic( bio_tools ) && p->get_power_level() > 10_kJ && query_yn( _( "There is no fire around, use your integrated toolset instead?" ) ) ) { @@ -5823,7 +5846,7 @@ int iuse::towel( player *p, item *it, bool t, const tripoint & ) return towel_common( p, it, t ); } -int iuse::towel_common( player *p, item *it, bool t ) +int iuse::towel_common( Character *p, item *it, bool t ) { if( t ) { // Continuous usage, do nothing as not initiated by the player, this is for @@ -5901,21 +5924,22 @@ int iuse::unfold_generic( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - vehicle *veh = g->m.add_vehicle( vproto_id( "none" ), p->pos(), 0, 0, 0, false ); + map &here = get_map(); + vehicle *veh = here.add_vehicle( vproto_id( "none" ), p->pos(), 0, 0, 0, false ); if( veh == nullptr ) { p->add_msg_if_player( m_info, _( "There's no room to unfold the %s." ), it->tname() ); return 0; } veh->name = it->get_var( "vehicle_name" ); if( !veh->restore( it->get_var( "folding_bicycle_parts" ) ) ) { - g->m.destroy_vehicle( veh ); + here.destroy_vehicle( veh ); return 0; } const bool can_float = size( veh->get_avail_parts( "FLOATS" ) ) > 2; - const auto invalid_pos = []( const tripoint & pp, bool can_float ) { - return ( g->m.has_flag_ter( TFLAG_DEEP_WATER, pp ) && !can_float ) || - g->m.veh_at( pp ) || g->m.impassable( pp ); + const auto invalid_pos = [&here]( const tripoint & pp, bool can_float ) { + return ( here.has_flag_ter( TFLAG_DEEP_WATER, pp ) && !can_float ) || + here.veh_at( pp ) || here.impassable( pp ); }; for( const vpart_reference &vp : veh->get_all_parts() ) { if( vp.info().location != "structure" ) { @@ -5924,12 +5948,12 @@ int iuse::unfold_generic( player *p, item *it, bool, const tripoint & ) const tripoint pp = vp.pos(); if( invalid_pos( pp, can_float ) ) { p->add_msg_if_player( m_info, _( "There's no room to unfold the %s." ), it->tname() ); - g->m.destroy_vehicle( veh ); + here.destroy_vehicle( veh ); return 0; } } - g->m.add_vehicle_to_cache( veh ); + here.add_vehicle_to_cache( veh ); std::string unfold_msg = it->get_var( "unfold_msg" ); if( unfold_msg.empty() ) { @@ -6108,7 +6132,8 @@ int iuse::gun_repair( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You need a mechanics skill of 2 to use this repair kit." ) ); return 0; } - item_location loc = game_menus::inv::titled_menu( g->u, ( "Select the firearm to repair" ) ); + item_location loc = game_menus::inv::titled_menu( get_avatar(), + ( "Select the firearm to repair" ) ); if( !loc ) { p->add_msg_if_player( m_info, _( "You do not have that item!" ) ); return 0; @@ -6206,11 +6231,15 @@ int iuse::toolmod_attach( player *p, item *it, bool, const tripoint & ) return false; } + // cannot mod non-tool, or a tool with existing mods, or a battery currently installed + if( !e.is_tool() || !e.toolmods().empty() || e.magazine_current() ) { + return false; + } + // can only attach to unmodified tools that use compatible ammo - return e.is_tool() && e.toolmods().empty() && !e.magazine_current() && - std::any_of( it->type->mod->acceptable_ammo.begin(), + return std::any_of( it->type->mod->acceptable_ammo.begin(), it->type->mod->acceptable_ammo.end(), [&]( const ammotype & at ) { - return e.ammo_types( false ).count( at ); + return e.type->tool->ammo_id.count( at ); } ); }; @@ -6978,9 +7007,9 @@ struct extended_photo_def : public JsonDeserializer, public JsonSerializer { static std::string colorized_trap_name_at( const tripoint &point ) { - const trap &trap = g->m.tr_at( point ); + const trap &trap = get_map().tr_at( point ); std::string name; - if( !trap.is_null() && trap.get_visibility() <= 1 ) { + if( trap.can_see( point, get_player_character() ) ) { name = colorize( trap.name(), trap.color ) + _( " on " ); } return name; @@ -6989,7 +7018,7 @@ static std::string colorized_trap_name_at( const tripoint &point ) static std::string colorized_field_description_at( const tripoint &point ) { std::string field_text; - const field &field = g->m.field_at( point ); + const field &field = get_map().field_at( point ); const field_entry *entry = field.find_field( field.displayed_field_type() ); if( entry ) { field_text = string_format( _( description_affixes.at( field.displayed_description_affix() ) ), @@ -7020,7 +7049,7 @@ static std::string colorized_item_description( const item &item ) static item get_top_item_at_point( const tripoint &point, const units::volume &min_visible_volume ) { - map_stack items = g->m.i_at( point ); + map_stack items = get_map().i_at( point ); // iterate from topmost item down to ground for( const item &it : items ) { if( it.volume() > min_visible_volume ) { @@ -7034,9 +7063,10 @@ static item get_top_item_at_point( const tripoint &point, static std::string colorized_ter_name_flags_at( const tripoint &point, const std::vector &flags, const std::vector &ter_whitelist ) { - const ter_id ter = g->m.ter( point ); + map &here = get_map(); + const ter_id ter = here.ter( point ); std::string name = colorize( ter->name(), ter->color() ); - const std::string &graffiti_message = g->m.graffiti_at( point ); + const std::string &graffiti_message = here.graffiti_at( point ); if( !graffiti_message.empty() ) { name += string_format( _( " with graffiti \"%s\"" ), graffiti_message ); @@ -7069,10 +7099,11 @@ static std::string colorized_feature_description_at( const tripoint ¢er_poin const units::volume &min_visible_volume ) { item_found = false; - const furn_id furn = g->m.furn( center_point ); + map &here = get_map(); + const furn_id furn = here.furn( center_point ); if( furn != f_null && furn.is_valid() ) { std::string furn_str = colorize( furn->name(), c_yellow ); - std::string sign_message = g->m.get_signage( center_point ); + std::string sign_message = here.get_signage( center_point ); if( !sign_message.empty() ) { furn_str += string_format( _( " with message \"%s\"" ), sign_message ); } @@ -7211,8 +7242,10 @@ static object_names_collection enumerate_objects_around_point( const tripoint &p std::unordered_set &ignored_points, std::unordered_set &vehicles_recorded ) { - const tripoint_range bounds = g->m.points_in_radius( bounds_center_point, bounds_radius ); - const tripoint_range points_in_radius = g->m.points_in_radius( point, radius ); + map &here = get_map(); + const tripoint_range bounds = + here.points_in_radius( bounds_center_point, bounds_radius ); + const tripoint_range points_in_radius = here.points_in_radius( point, radius ); int dist = rl_dist( camera_pos, point ); bool item_found = false; @@ -7226,7 +7259,7 @@ static object_names_collection enumerate_objects_around_point( const tripoint &p // store objects in radius for( const tripoint &point_around_figure : points_in_radius ) { if( !bounds.is_point_inside( point_around_figure ) || - !g->m.sees( camera_pos, point_around_figure, dist + radius ) || + !here.sees( camera_pos, point_around_figure, dist + radius ) || ( ignored_points.find( point_around_figure ) != ignored_points.end() && !( point_around_figure == point && create_figure_desc ) ) ) { continue; // disallow photos with not visible objects @@ -7239,7 +7272,7 @@ static object_names_collection enumerate_objects_around_point( const tripoint &p const item item = get_top_item_at_point( point_around_figure, volume_to_search ); - const optional_vpart_position veh_part_pos = g->m.veh_at( point_around_figure ); + const optional_vpart_position veh_part_pos = here.veh_at( point_around_figure ); std::string unusual_ter_desc = colorized_ter_name_flags_at( point_around_figure, camera_ter_whitelist_flags, camera_ter_whitelist_types ); @@ -7363,7 +7396,8 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, std::string timestamp = to_string( time_point( calendar::turn ) ); int dist = rl_dist( camera_pos, aim_point ); - const tripoint_range bounds = g->m.points_in_radius( aim_point, 2 ); + map &here = get_map(); + const tripoint_range bounds = here.points_in_radius( aim_point, 2 ); extended_photo_def photo; bool need_store_weather = false; int outside_tiles_num = 0; @@ -7381,14 +7415,14 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, // first scan for critters and mark nearby furniture, vehicles and items for( const tripoint ¤t : bounds ) { - if( !g->m.sees( camera_pos, current, dist + 3 ) ) { + if( !here.sees( camera_pos, current, dist + 3 ) ) { continue; // disallow photos with non-visible objects } monster *const mon = g->critter_at( current, false ); avatar *guy = g->critter_at( current ); total_tiles_num++; - if( g->m.is_outside( current ) ) { + if( here.is_outside( current ) ) { need_store_weather = true; outside_tiles_num++; } @@ -7398,7 +7432,7 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, Creature *creature; if( mon && mon->has_effect( effect_ridden ) ) { // only player can ride, see monexamine::mount_pet - guy = &g->u; + guy = &get_avatar(); description_figures_appearance[ mon->name() ] = "\"" + mon->type->get_description() + "\""; } @@ -7467,15 +7501,15 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, std::string ter_name = colorized_ter_name_flags_at( aim_point, {}, {} ); const std::string field_desc = colorized_field_description_at( aim_point ); - bool found_vehicle_aim_point = g->m.veh_at( aim_point ).has_value(), + bool found_vehicle_aim_point = here.veh_at( aim_point ).has_value(), found_furniture_aim_point = !furn_desc.empty(); // colorized_feature_description_at do not update flag if no furniture found, so need to check again if( !found_furniture_aim_point ) { found_item_aim_point = !item.is_null(); } - const ter_id ter_aim = g->m.ter( aim_point ); - const furn_id furn_aim = g->m.furn( aim_point ); + const ter_id ter_aim = here.ter( aim_point ); + const furn_id furn_aim = here.furn( aim_point ); if( !description_figures_status.empty() ) { std::string names = enumerate_as_string( description_figures_status.begin(), @@ -7492,7 +7526,7 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, + " " + figure_status.second; } } else if( found_vehicle_aim_point ) { - const optional_vpart_position veh_part_pos = g->m.veh_at( aim_point ); + const optional_vpart_position veh_part_pos = here.veh_at( aim_point ); const std::string veh_name = colorize( veh_part_pos->vehicle().disp_name(), c_light_blue ); photo.name = veh_name; photo_text += veh_name + "."; @@ -7567,7 +7601,7 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, obj_list ); } - const oter_id &cur_ter = overmap_buffer.ter( ms_to_omt_copy( g->m.getabs( aim_point ) ) ); + const oter_id &cur_ter = overmap_buffer.ter( ms_to_omt_copy( here.getabs( aim_point ) ) ); std::string overmap_desc = string_format( _( "In the background you can see a %s" ), colorize( cur_ter->get_name(), cur_ter->get_color() ) ); if( outside_tiles_num == total_tiles_num ) { @@ -7596,9 +7630,8 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, } else { photo_text += _( "It is day. " ); } - - const weather_datum w_data = weather_data( g->weather.weather ); - photo_text += string_format( _( "The weather is %s." ), colorize( w_data.name, w_data.color ) ); + photo_text += string_format( _( "The weather is %s." ), colorize( get_weather().weather_id->name, + get_weather().weather_id->color ) ); } for( const auto &figure : description_figures_appearance ) { @@ -7772,6 +7805,7 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) return 0; } + map &here = get_map(); if( c_shot == choice ) { const cata::optional aim_point_ = g->look_around(); @@ -7781,7 +7815,7 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) } tripoint aim_point = *aim_point_; bool incorrect_focus = false; - tripoint_range aim_bounds = g->m.points_in_radius( aim_point, 2 ); + tripoint_range aim_bounds = here.points_in_radius( aim_point, 2 ); std::vector trajectory = line_to( p->pos(), aim_point, 0, 0 ); trajectory.push_back( aim_point ); @@ -7796,12 +7830,12 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) const tripoint trajectory_point = *point_it; if( point_it != trajectory.end() ) { const tripoint next_point = *( point_it + 1 ); // Trajectory ends on last visible tile - if( !g->m.sees( p->pos(), next_point, rl_dist( p->pos(), next_point ) + 3 ) ) { + if( !here.sees( p->pos(), next_point, rl_dist( p->pos(), next_point ) + 3 ) ) { p->add_msg_if_player( _( "You have the wrong camera focus." ) ); incorrect_focus = true; // recalculate target point aim_point = trajectory_point; - aim_bounds = g->m.points_in_radius( trajectory_point, 2 ); + aim_bounds = here.points_in_radius( trajectory_point, 2 ); } } @@ -8034,7 +8068,7 @@ int iuse::ehandcuffs( player *p, item *it, bool t, const tripoint &pos ) if( t ) { - if( g->m.has_flag( "SWIMMABLE", pos.xy() ) ) { + if( get_map().has_flag( "SWIMMABLE", pos.xy() ) ) { it->item_tags.erase( "NO_UNWIELD" ); it->ammo_unset(); it->active = false; @@ -8254,8 +8288,9 @@ int iuse::radiocaron( player *p, item *it, bool t, const tripoint &pos ) static void sendRadioSignal( player &p, const std::string &signal ) { - for( const tripoint &loc : g->m.points_in_radius( p.pos(), 30 ) ) { - for( item &it : g->m.i_at( loc ) ) { + map &here = get_map(); + for( const tripoint &loc : here.points_in_radius( p.pos(), 30 ) ) { + for( item &it : here.i_at( loc ) ) { if( it.has_flag( "RADIO_ACTIVATION" ) && it.has_flag( signal ) ) { sounds::sound( p.pos(), 6, sounds::sound_t::alarm, _( "beep" ), true, "misc", "beep" ); if( it.has_flag( "RADIO_INVOKE_PROC" ) ) { @@ -8312,6 +8347,7 @@ int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) _( "Press red button" ), _( "Press blue button" ), _( "Press green button" ) } ); + map &here = get_map(); if( choice < 0 ) { return 0; } else if( choice == 0 ) { @@ -8319,7 +8355,7 @@ int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) it->active = false; p->remove_value( "remote_controlling" ); } else { - std::list> rc_pairs = g->m.get_rc_items(); + std::list> rc_pairs = here.get_rc_items(); tripoint rc_item_location = {999, 999, 999}; // TODO: grab the closest car or similar? for( auto &rc_pairs_rc_pair : rc_pairs ) { @@ -8446,7 +8482,7 @@ static vehicle *pickveh( const tripoint ¢er, bool advanced ) pmenu.title = _( "Select vehicle to access" ); std::vector< vehicle * > vehs; - for( auto &veh : g->m.get_vehicles() ) { + for( auto &veh : get_map().get_vehicles() ) { auto &v = veh.v; if( rl_dist( center, v->global_pos3() ) < 40 && v->fuel_left( itype_battery, true ) > 0 && @@ -8518,7 +8554,8 @@ int iuse::remoteveh( player *p, item *it, bool t, const tripoint &pos ) return 0; } - point p2( g->u.view_offset.xy() ); + avatar &player_character = get_avatar(); + point p2( player_character.view_offset.xy() ); vehicle *veh = pickveh( pos, choice == 0 ); @@ -8531,7 +8568,7 @@ int iuse::remoteveh( player *p, item *it, bool t, const tripoint &pos ) } if( choice == 0 ) { - if( g->u.has_trait( trait_WAYFARER ) ) { + if( p->has_trait( trait_WAYFARER ) ) { add_msg( m_info, _( "Despite using a controller, you still refuse to take control of this vehicle." ) ); } else { @@ -8552,8 +8589,8 @@ int iuse::remoteveh( player *p, item *it, bool t, const tripoint &pos ) } } - g->u.view_offset.x = p2.x; - g->u.view_offset.y = p2.y; + player_character.view_offset.x = p2.x; + player_character.view_offset.y = p2.y; return it->type->charges_to_use(); } @@ -8595,7 +8632,7 @@ static bool multicooker_hallu( player &p ) } else { p.add_msg_if_player( m_info, _( "You're surrounded by aggressive multi-cookers!" ) ); - for( const tripoint &pn : g->m.points_in_radius( p.pos(), 1 ) ) { + for( const tripoint &pn : get_map().points_in_radius( p.pos(), 1 ) ) { if( monster *const m = g->place_critter_at( mon_hallu_multicooker, pn ) ) { m->hallucination = true; } @@ -8648,7 +8685,7 @@ int iuse::autoclave( player *p, item *it, bool t, const tripoint &pos ) if( clean_cbm ) { empty = false; if( query_yn( _( "Autoclave already contains a CBM. Do you want to remove it?" ) ) ) { - g->m.add_item( pos, *clean_cbm ); + get_map().add_item( pos, *clean_cbm ); it->remove_item( *clean_cbm ); if( !query_yn( _( "Do you want to use the autoclave?" ) ) ) { return 0; @@ -8873,7 +8910,7 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) std::vector dishes; - inventory crafting_inv = g->u.crafting_inventory(); + inventory crafting_inv = p->crafting_inventory(); //add some tools and qualities. we can't add this qualities to json, because multicook must be used only by activating, not as component other crafts. crafting_inv.push_back( item( "hotplate", 0 ) ); //hotplate inside crafting_inv.push_back( item( "tongs", 0 ) ); //some recipes requires tongs @@ -8882,7 +8919,7 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) int counter = 0; - for( const auto &r : g->u.get_learned_recipes().in_category( "CC_FOOD" ) ) { + for( const auto &r : get_avatar().get_learned_recipes().in_category( "CC_FOOD" ) ) { if( multicooked_subcats.count( r->subcategory ) > 0 ) { dishes.push_back( r ); const bool can_make = r->deduped_requirements().can_make_with_inventory( @@ -8902,9 +8939,9 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) const recipe *meal = dishes[choice]; int mealtime; if( it->get_var( "MULTI_COOK_UPGRADE" ) == "UPGRADE" ) { - mealtime = meal->time; + mealtime = meal->time_to_craft_moves( *p ); } else { - mealtime = meal->time * 2; + mealtime = meal->time_to_craft_moves( *p ) * 2; } const int all_charges = charges_to_start + mealtime / ( it->type->tool->power_draw / 10000 ); @@ -8954,7 +8991,7 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) bool has_tools = true; - const inventory &cinv = g->u.crafting_inventory(); + const inventory &cinv = p->crafting_inventory(); if( !cinv.has_amount( itype_soldering_iron, 1 ) ) { p->add_msg_if_player( m_warning, _( "You need a %s." ), @@ -9030,6 +9067,7 @@ int iuse::tow_attach( player *p, item *it, bool, const tripoint & ) it->process( p, p->pos(), false ); p->moves -= 15; }; + map &here = get_map(); if( initial_state == "attach_first" ) { const cata::optional posp_ = choose_adjacent( _( "Attach cable to the vehicle that will do the towing." ) ); @@ -9037,7 +9075,7 @@ int iuse::tow_attach( player *p, item *it, bool, const tripoint & ) return 0; } const tripoint posp = *posp_; - const optional_vpart_position vp = g->m.veh_at( posp ); + const optional_vpart_position vp = here.veh_at( posp ); if( !vp ) { p->add_msg_if_player( _( "There's no vehicle there." ) ); return 0; @@ -9054,19 +9092,19 @@ int iuse::tow_attach( player *p, item *it, bool, const tripoint & ) return 0; } } - const tripoint &abspos = g->m.getabs( posp ); + const tripoint &abspos = here.getabs( posp ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); it->set_var( "source_z", g->get_levz() ); set_cable_active( p, it, "pay_out_cable" ); } } else { - const auto confirm_source_vehicle = []( player * p, item * it, const bool detach_if_missing ) { + const auto confirm_source_vehicle = [&here]( player * p, item * it, const bool detach_if_missing ) { tripoint source_global( it->get_var( "source_x", 0 ), it->get_var( "source_y", 0 ), it->get_var( "source_z", 0 ) ); - tripoint source_local = g->m.getlocal( source_global ); - const optional_vpart_position source_vp = g->m.veh_at( source_local ); + tripoint source_local = here.getlocal( source_global ); + const optional_vpart_position source_vp = here.veh_at( source_local ); vehicle *const source_veh = veh_pointer_or_null( source_vp ); if( detach_if_missing && source_veh == nullptr ) { if( p->has_item( *it ) ) { @@ -9104,7 +9142,7 @@ int iuse::tow_attach( player *p, item *it, bool, const tripoint & ) } const tripoint vpos = *vpos_; - const optional_vpart_position target_vp = g->m.veh_at( vpos ); + const optional_vpart_position target_vp = here.veh_at( vpos ); if( !target_vp ) { p->add_msg_if_player( _( "There's no vehicle there." ) ); return 0; @@ -9176,6 +9214,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) p->find_remote_fuel(); } }; + map &here = get_map(); if( initial_state == "attach_first" ) { if( has_bio_cable ) { uilist kmenu; @@ -9223,25 +9262,25 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) return 0; } const tripoint posp = *posp_; - const optional_vpart_position vp = g->m.veh_at( posp ); - auto ter = g->m.ter( posp ); + const optional_vpart_position vp = here.veh_at( posp ); + auto ter = here.ter( posp ); if( !vp && ter != t_chainfence ) { p->add_msg_if_player( _( "There's no vehicle there." ) ); return 0; } else { - const auto abspos = g->m.getabs( posp ); + const auto abspos = here.getabs( posp ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); it->set_var( "source_z", g->get_levz() ); set_cable_active( p, it, "pay_out_cable" ); } } else { - const auto confirm_source_vehicle = []( player * p, item * it, const bool detach_if_missing ) { + const auto confirm_source_vehicle = [&here]( player * p, item * it, const bool detach_if_missing ) { tripoint source_global( it->get_var( "source_x", 0 ), it->get_var( "source_y", 0 ), it->get_var( "source_z", 0 ) ); - tripoint source_local = g->m.getlocal( source_global ); - const optional_vpart_position source_vp = g->m.veh_at( source_local ); + tripoint source_local = here.getlocal( source_global ); + const optional_vpart_position source_vp = here.veh_at( source_local ); vehicle *const source_veh = veh_pointer_or_null( source_vp ); if( detach_if_missing && source_veh == nullptr ) { if( p != nullptr && p->has_item( *it ) ) { @@ -9334,12 +9373,12 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) } const tripoint vpos = *vpos_; - const optional_vpart_position target_vp = g->m.veh_at( vpos ); + const optional_vpart_position target_vp = here.veh_at( vpos ); if( !target_vp ) { p->add_msg_if_player( _( "There's no vehicle there." ) ); return 0; } else if( cable_cbm ) { - const auto abspos = g->m.getabs( vpos ); + const auto abspos = here.getabs( vpos ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); it->set_var( "source_z", g->get_levz() ); @@ -9356,7 +9395,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) return 0; } - tripoint target_global = g->m.getabs( vpos ); + tripoint target_global = here.getabs( vpos ); // TODO: make sure there is always a matching vpart id here. Maybe transform this into // a iuse_actor class, or add a check in item_factory. const vpart_id vpid( it->typeId().str() ); @@ -9364,7 +9403,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) point vcoords = source_vp->mount(); vehicle_part source_part( vpid, vcoords, item( *it ) ); source_part.target.first = target_global; - source_part.target.second = g->m.getabs( target_veh->global_pos3() ); + source_part.target.second = here.getabs( target_veh->global_pos3() ); source_veh->install_part( vcoords, source_part ); vcoords = target_vp->mount(); @@ -9373,7 +9412,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) it->get_var( "source_y", 0 ), it->get_var( "source_z", 0 ) ); target_part.target.first = source_global; - target_part.target.second = g->m.getabs( source_veh->global_pos3() ); + target_part.target.second = here.getabs( source_veh->global_pos3() ); target_veh->install_part( vcoords, target_part ); if( p != nullptr && p->has_item( *it ) ) { @@ -9419,7 +9458,7 @@ int iuse::weather_tool( player *p, item *it, bool, const tripoint & ) const w_point weatherPoint = *g->weather.weather_precise; /* Possibly used twice. Worth spending the time to precalculate. */ - const auto player_local_temp = g->weather.get_temperature( g->u.pos() ); + const auto player_local_temp = g->weather.get_temperature( p->pos() ); if( it->typeId() == itype_weather_reader ) { p->add_msg_if_player( m_neutral, _( "The %s's monitor slowly outputs the data…" ), @@ -9438,13 +9477,13 @@ int iuse::weather_tool( player *p, item *it, bool, const tripoint & ) if( it->typeId() == itype_hygrometer ) { p->add_msg_if_player( m_neutral, _( "The %1$s reads %2$s." ), it->tname(), - print_humidity( get_local_humidity( weatherPoint.humidity, g->weather.weather, - g->is_sheltered( g->u.pos() ) ) ) ); + print_humidity( get_local_humidity( weatherPoint.humidity, get_weather().weather_id, + g->is_sheltered( p->pos() ) ) ) ); } else { p->add_msg_if_player( m_neutral, _( "Relative Humidity: %s." ), - print_humidity( get_local_humidity( weatherPoint.humidity, g->weather.weather, - g->is_sheltered( g->u.pos() ) ) ) ); + print_humidity( get_local_humidity( weatherPoint.humidity, get_weather().weather_id, + g->is_sheltered( p->pos() ) ) ) ); } } if( it->has_flag( "BAROMETER" ) ) { @@ -9460,7 +9499,7 @@ int iuse::weather_tool( player *p, item *it, bool, const tripoint & ) if( it->typeId() == itype_weather_reader ) { int vehwindspeed = 0; - if( optional_vpart_position vp = g->m.veh_at( p->pos() ) ) { + if( optional_vpart_position vp = get_map().veh_at( p->pos() ) ) { vehwindspeed = std::abs( vp->vehicle().velocity / 100 ); // For mph } const oter_id &cur_om_ter = overmap_buffer.ter( p->global_omt_location() ); @@ -9658,7 +9697,8 @@ int iuse::capture_monster_act( player *p, item *it, bool, const tripoint &pos ) int iuse::ladder( player *p, item *, bool, const tripoint & ) { - if( !g->m.has_zlevels() ) { + map &here = get_map(); + if( !here.has_zlevels() ) { debugmsg( "Ladder can't be used in non-z-level mode" ); return 0; } @@ -9672,14 +9712,14 @@ int iuse::ladder( player *p, item *, bool, const tripoint & ) } const tripoint pnt = *pnt_; - if( !g->is_empty( pnt ) || g->m.has_furn( pnt ) ) { + if( !g->is_empty( pnt ) || here.has_furn( pnt ) ) { p->add_msg_if_player( m_bad, _( "Can't place it there." ) ); return 0; } p->add_msg_if_player( _( "You set down the ladder." ) ); p->moves -= to_moves( 5_seconds ); - g->m.furn_set( pnt, furn_str_id( "f_ladder" ) ); + here.furn_set( pnt, furn_str_id( "f_ladder" ) ); return 1; } @@ -9775,12 +9815,12 @@ int iuse::wash_items( player *p, bool soft_items, bool hard_items ) ( hard_items && !location->is_soft() ) ); } ); auto make_raw_stats = [available_water, available_cleanser]( - const std::map &items + const std::map &locs ) { units::volume total_volume = 0_ml; - for( const auto &p : items ) { - total_volume += p.first->volume() * p.second / - ( p.first->count_by_charges() ? p.first->charges : 1 ); + for( const auto &p : locs ) { + total_volume += ( *p.first )->base_volume() * p.second / + ( ( *p.first )->count_by_charges() ? ( *p.first )->charges : 1 ); } washing_requirements required = washing_requirements_for_volume( total_volume ); auto to_string = []( int val ) -> std::string { @@ -9809,7 +9849,6 @@ int iuse::wash_items( player *p, bool soft_items, bool hard_items ) if( to_clean.empty() ) { return 0; } - // Determine if we have enough water and cleanser for all the items. units::volume total_volume = 0_ml; for( drop_location pair : to_clean ) { @@ -9818,7 +9857,7 @@ int iuse::wash_items( player *p, bool soft_items, bool hard_items ) return 0; } item &i = *pair.first; - total_volume += i.volume() * pair.second / ( i.count_by_charges() ? i.charges : 1 ); + total_volume += i.base_volume() * pair.second / ( i.count_by_charges() ? i.charges : 1 ); } washing_requirements required = washing_requirements_for_volume( total_volume ); @@ -9834,8 +9873,8 @@ int iuse::wash_items( player *p, bool soft_items, bool hard_items ) required.cleanser ); return 0; } - const std::vector helpers = g->u.get_crafting_helpers(); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const std::vector helpers = p->get_crafting_helpers(); + const int helpersize = p->get_num_crafting_helpers( 3 ); required.time = required.time * ( 1 - ( helpersize / 10 ) ); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); @@ -9843,7 +9882,6 @@ int iuse::wash_items( player *p, bool soft_items, bool hard_items ) } // Assign the activity values. p->assign_activity( ACT_WASH, required.time ); - for( const drop_location &pair : to_clean ) { p->activity.targets.push_back( pair.first ); p->activity.values.push_back( pair.second ); @@ -9869,18 +9907,19 @@ int iuse::break_stick( player *p, item *it, bool, const tripoint & ) comps.push_back( item_comp( it->typeId(), 1 ) ); p->consume_items( comps, 1, is_crafting_component ); int chance = rng( 0, 100 ); + map &here = get_map(); if( chance <= 20 ) { p->add_msg_if_player( _( "You try to break the stick in two, but it shatters into splinters." ) ); - g->m.spawn_item( p->pos(), "splinter", 2 ); + here.spawn_item( p->pos(), "splinter", 2 ); return 1; } else if( chance <= 40 ) { p->add_msg_if_player( _( "The stick breaks clean into two parts." ) ); - g->m.spawn_item( p->pos(), "stick", 2 ); + here.spawn_item( p->pos(), "stick", 2 ); return 1; } else if( chance <= 100 ) { p->add_msg_if_player( _( "You break the stick, but one half shatters into splinters." ) ); - g->m.spawn_item( p->pos(), "stick", 1 ); - g->m.spawn_item( p->pos(), "splinter", 1 ); + here.spawn_item( p->pos(), "stick", 1 ); + here.spawn_item( p->pos(), "splinter", 1 ); return 1; } return 0; diff --git a/src/iuse.h b/src/iuse.h index 55bb787b31df7..5930baf9b27dc 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -188,7 +188,6 @@ int talking_doll( player *, item *, bool, const tripoint & ); int tazer( player *, item *, bool, const tripoint & ); int tazer2( player *, item *, bool, const tripoint & ); int teleport( player *, item *, bool, const tripoint & ); -int throwable_extinguisher_act( player *, item *, bool, const tripoint & ); int toolmod_attach( player *, item *, bool, const tripoint & ); int tow_attach( player *, item *, bool, const tripoint & ); int towel( player *, item *, bool, const tripoint & ); @@ -229,15 +228,15 @@ int disassemble( player *, item *, bool, const tripoint & ); int artifact( player *, item *, bool, const tripoint & ); // Helper functions for other iuse functions -void cut_log_into_planks( player & ); -void play_music( player &p, const tripoint &source, int volume, int max_morale ); -int towel_common( player *, item *, bool ); +void cut_log_into_planks( Character & ); +void play_music( Character &p, const tripoint &source, int volume, int max_morale ); +int towel_common( Character *, item *, bool ); // Helper for validating a potential taget of robot control bool robotcontrol_can_target( player *, const monster & ); // Helper for handling pesky wannabe-artists -int handle_ground_graffiti( player &p, item *it, const std::string &prefix, +int handle_ground_graffiti( Character &p, item *it, const std::string &prefix, const tripoint &where ); } // namespace iuse diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index 2505092d11f29..2b47fa8490fc0 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -97,6 +97,7 @@ static const efftype_id effect_asthma( "asthma" ); static const efftype_id effect_bandaged( "bandaged" ); static const efftype_id effect_bite( "bite" ); static const efftype_id effect_bleed( "bleed" ); +static const efftype_id effect_pet( "pet" ); static const efftype_id effect_disinfected( "disinfected" ); static const efftype_id effect_downed( "downed" ); static const efftype_id effect_infected( "infected" ); @@ -272,7 +273,7 @@ int iuse_transform::use( player &p, item &it, bool t, const tripoint &pos ) cons it.put_in( *obj, item_pocket::pocket_type::CONTAINER ); } if( p.is_worn( *obj ) ) { - p.reset_encumbrance(); + p.calc_encumbrance(); p.update_bodytemp(); p.on_worn_item_transform( obj_copy, *obj ); } @@ -369,6 +370,7 @@ int unpack_actor::use( player &p, item &it, bool, const tripoint & ) const p.add_msg_if_player( _( "You unpack the %s." ), it.tname() ); + map &here = get_map(); for( item &content : items ) { if( content.is_armor() ) { if( items_fit ) { @@ -388,7 +390,7 @@ int unpack_actor::use( player &p, item &it, bool, const tripoint & ) const content.set_flag( "FILTHY" ); } - g->m.add_item_or_charges( p.pos(), content ); + here.add_item_or_charges( p.pos(), content ); } p.i_rem( &it ); @@ -474,13 +476,14 @@ std::unique_ptr explosion_iuse::clone() const // They must also be passable. static std::vector points_for_gas_cloud( const tripoint ¢er, int radius ) { + map &here = get_map(); std::vector result; - for( const auto &p : closest_tripoints_first( center, radius ) ) { - if( g->m.impassable( p ) ) { + for( const auto &p : closest_points_first( center, radius ) ) { + if( here.impassable( p ) ) { continue; } if( p != center ) { - if( !g->m.clear_path( center, p, radius, 1, 100 ) ) { + if( !here.clear_path( center, p, radius, 1, 100 ) ) { // Can not splatter gas from center to that point, something is in the way continue; } @@ -550,20 +553,21 @@ int explosion_iuse::use( player &p, item &it, bool t, const tripoint &pos ) cons if( do_flashbang ) { explosion_handler::flashbang( pos, flashbang_player_immune ); } + map &here = get_map(); if( fields_radius >= 0 && fields_type.id() ) { std::vector gas_sources = points_for_gas_cloud( pos, fields_radius ); for( auto &gas_source : gas_sources ) { const int field_intensity = rng( fields_min_intensity, fields_max_intensity ); - g->m.add_field( gas_source, fields_type, field_intensity, 1_turns ); + here.add_field( gas_source, fields_type, field_intensity, 1_turns ); } } if( scrambler_blast_radius >= 0 ) { - for( const tripoint &dest : g->m.points_in_radius( pos, scrambler_blast_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, scrambler_blast_radius ) ) { explosion_handler::scrambler_blast( dest ); } } if( emp_blast_radius >= 0 ) { - for( const tripoint &dest : g->m.points_in_radius( pos, emp_blast_radius ) ) { + for( const tripoint &dest : here.points_in_radius( pos, emp_blast_radius ) ) { explosion_handler::emp_blast( dest ); } } @@ -618,7 +622,7 @@ int unfold_vehicle_iuse::use( player &p, item &it, bool, const tripoint & ) cons } } - vehicle *veh = g->m.add_vehicle( vehicle_id, p.pos(), 0, 0, 0, false ); + vehicle *veh = get_map().add_vehicle( vehicle_id, p.pos(), 0, 0, 0, false ); if( veh == nullptr ) { p.add_msg_if_player( m_info, _( "There's no room to unfold the %s." ), it.tname() ); return 0; @@ -720,7 +724,7 @@ void consume_drug_iuse::info( const item &, std::vector &dump ) const { const std::string vits = enumerate_as_string( vitamins.begin(), vitamins.end(), []( const decltype( vitamins )::value_type & v ) { - const time_duration rate = g->u.vitamin_rate( v.first ); + const time_duration rate = get_player_character().vitamin_rate( v.first ); if( rate <= 0_turns ) { return std::string(); } @@ -785,10 +789,11 @@ int consume_drug_iuse::use( player &p, item &it, bool, const tripoint & ) const for( const auto &stat_adjustment : stat_adjustments ) { p.mod_stat( stat_adjustment.first, stat_adjustment.second ); } + map &here = get_map(); for( const auto &field : fields_produced ) { const field_type_id fid = field_type_id( field.first ); for( int i = 0; i < 3; i++ ) { - g->m.add_field( {p.posx() + static_cast( rng( -2, 2 ) ), p.posy() + static_cast( rng( -2, 2 ) ), p.posz()}, + here.add_field( {p.posx() + static_cast( rng( -2, 2 ) ), p.posy() + static_cast( rng( -2, 2 ) ), p.posz()}, fid, field.second ); } @@ -859,6 +864,7 @@ void place_monster_iuse::load( const JsonObject &obj ) obj.read( "difficulty", difficulty ); obj.read( "moves", moves ); obj.read( "place_randomly", place_randomly ); + obj.read( "is_pet", is_pet ); if( obj.has_array( "skills" ) ) { JsonArray skills_ja = obj.get_array( "skills" ); for( JsonValue s : skills_ja ) { @@ -935,6 +941,9 @@ int place_monster_iuse::use( player &p, item &it, bool, const tripoint & ) const p.add_msg_if_player( m_warning, "%s", _( friendly_msg ) ); } newmon.friendly = -1; + if( is_pet ) { + newmon.add_effect( effect_pet, 1_turns, num_bp, true ); + } } return 1; } @@ -959,11 +968,12 @@ void place_npc_iuse::load( const JsonObject &obj ) int place_npc_iuse::use( player &p, item &, bool, const tripoint & ) const { + map &here = get_map(); cata::optional target_pos; if( place_randomly ) { - const tripoint_range target_range = points_in_radius( p.pos(), 1 ); - target_pos = random_point( target_range, []( const tripoint & t ) { - return !g->m.passable( t ); + const tripoint_range target_range = points_in_radius( p.pos(), 1 ); + target_pos = random_point( target_range, [&here]( const tripoint & t ) { + return !here.passable( t ); } ); } else { const std::string query = _( "Place npc where?" ); @@ -972,12 +982,12 @@ int place_npc_iuse::use( player &p, item &, bool, const tripoint & ) const if( !target_pos ) { return 0; } - if( !g->m.passable( target_pos.value() ) ) { + if( !here.passable( target_pos.value() ) ) { p.add_msg_if_player( m_info, _( "There is no square to spawn npc in!" ) ); return 0; } - g->m.place_npc( target_pos.value().xy(), npc_class_id ); + here.place_npc( target_pos.value().xy(), npc_class_id ); p.mod_moves( -moves ); p.add_msg_if_player( m_info, "%s", _( summon_msg ) ); return 1; @@ -1019,7 +1029,7 @@ int ups_based_armor_actor::use( player &p, item &it, bool t, const tripoint & ) return 0; } it.active = !it.active; - p.reset_encumbrance(); + p.calc_encumbrance(); if( it.active ) { if( activate_msg.empty() ) { p.add_msg_if_player( m_info, _( "You activate your %s." ), it.tname() ); @@ -1110,7 +1120,8 @@ int deploy_furn_actor::use( player &p, item &it, bool, const tripoint &pos ) con return 0; } - optional_vpart_position veh_there = g->m.veh_at( pnt ); + map &here = get_map(); + optional_vpart_position veh_there = here.veh_at( pnt ); if( veh_there.has_value() ) { // TODO: check for protrusion+short furniture, wheels+tiny furniture, NOCOLLIDE flag, etc. // and/or integrate furniture deployment with construction (which already seems to perform these checks sometimes?) @@ -1120,17 +1131,17 @@ int deploy_furn_actor::use( player &p, item &it, bool, const tripoint &pos ) con } // For example: dirt = 2, long grass = 3 - if( g->m.move_cost( pnt ) != 2 && g->m.move_cost( pnt ) != 3 ) { + if( here.move_cost( pnt ) != 2 && here.move_cost( pnt ) != 3 ) { p.add_msg_if_player( m_info, _( "You can't deploy a %s there." ), it.tname() ); return 0; } - if( g->m.has_furn( pnt ) ) { + if( here.has_furn( pnt ) ) { p.add_msg_if_player( m_info, _( "There is already furniture at that location." ) ); return 0; } - g->m.furn_set( pnt, furn_type ); + here.furn_set( pnt, furn_type ); p.mod_moves( to_turns( 2_seconds ) ); return 1; } @@ -1225,14 +1236,15 @@ bool firestarter_actor::prep_firestarter_use( const player &p, tripoint &pos ) p.add_msg_if_player( _( "But you're already smokin' hot." ) ); return false; } - if( g->m.get_field( pos, fd_fire ) ) { + map &here = get_map(); + if( here.get_field( pos, fd_fire ) ) { // check if there's already a fire p.add_msg_if_player( m_info, _( "There is already a fire." ) ); return false; } // Check for a brazier. bool has_unactivated_brazier = false; - for( const item &i : g->m.i_at( pos ) ) { + for( const item &i : here.i_at( pos ) ) { if( i.typeId() == itype_brazier ) { has_unactivated_brazier = true; } @@ -1244,7 +1256,7 @@ bool firestarter_actor::prep_firestarter_use( const player &p, tripoint &pos ) void firestarter_actor::resolve_firestarter_use( player &p, const tripoint &pos ) { - if( g->m.add_field( pos, fd_fire, 1, 10_minutes ) ) { + if( get_map().add_field( pos, fd_fire, 1, 10_minutes ) ) { if( !p.has_trait( trait_PYROMANIA ) ) { p.add_msg_if_player( _( "You successfully light a fire." ) ); } else { @@ -1285,8 +1297,8 @@ float firestarter_actor::light_mod( const tripoint &pos ) const } const float light_level = g->natural_light_level( pos.z ); - if( ( g->weather.weather == WEATHER_CLEAR || g->weather.weather == WEATHER_SUNNY ) && - light_level >= 60.0f && !g->m.has_flag( TFLAG_INDOORS, pos ) ) { + if( get_weather().weather_id->sun_intensity >= sun_intensity_type::normal && + light_level >= 60.0f && !get_map().has_flag( TFLAG_INDOORS, pos ) ) { return std::pow( light_level / 80.0f, 8 ); } @@ -1295,11 +1307,12 @@ float firestarter_actor::light_mod( const tripoint &pos ) const int firestarter_actor::moves_cost_by_fuel( const tripoint &pos ) const { - if( g->m.flammable_items_at( pos, 100 ) ) { + map &here = get_map(); + if( here.flammable_items_at( pos, 100 ) ) { return moves_cost_fast; } - if( g->m.flammable_items_at( pos, 10 ) ) { + if( here.flammable_items_at( pos, 10 ) ) { return ( moves_cost_slow + moves_cost_fast ) / 2; } @@ -1332,7 +1345,7 @@ int firestarter_actor::use( player &p, item &it, bool t, const tripoint &spos ) _( "If the current weather holds, it will take around %d minutes to light a fire." ) : _( "At your skill level, it will take around %d minutes to light a fire." ), moves / to_moves( 1_minutes ) ); - } else if( moves < to_moves( 2_turns ) && g->m.is_flammable( pos ) ) { + } else if( moves < to_moves( 2_turns ) && get_map().is_flammable( pos ) ) { // If less than 2 turns, don't start a long action resolve_firestarter_use( p, pos ); p.mod_moves( -moves ); @@ -1536,13 +1549,18 @@ int salvage_actor::cut_up( player &p, item &it, item_location &cut ) const // Original item has been consumed. cut.remove_item(); // Force an encumbrance update in case they were wearing that item. - p.reset_encumbrance(); + p.calc_encumbrance(); + map &here = get_map(); for( const auto &salvaged : materials_salvaged ) { itype_id mat_name = salvaged.first; int amount = salvaged.second; item result( mat_name, calendar::turn ); if( amount > 0 ) { + if( result.count_by_charges() ) { + result.charges = amount; + amount = 1; + } add_msg( m_good, ngettext( "Salvaged %1$i %2$s.", "Salvaged %1$i %2$s.", amount ), amount, result.display_name( amount ) ); if( filthy ) { @@ -1552,7 +1570,7 @@ int salvage_actor::cut_up( player &p, item &it, item_location &cut ) const p.i_add_or_drop( result, amount ); } else { for( int i = 0; i < amount; i++ ) { - g->m.spawn_an_item( pos.xy(), result, amount, 0 ); + here.add_item_or_charges( pos, result ); } } } else { @@ -1692,7 +1710,7 @@ int inscribe_actor::use( player &p, item &it, bool t, const tripoint & ) const dest_.value() ); } - item_location loc = game_menus::inv::titled_menu( g->u, _( "Inscribe which item?" ) ); + item_location loc = game_menus::inv::titled_menu( get_avatar(), _( "Inscribe which item?" ) ); if( !loc ) { p.add_msg_if_player( m_info, _( "Never mind." ) ); return 0; @@ -1728,7 +1746,7 @@ static heal_actor prepare_dummy() dummy.limb_power = -2; dummy.head_power = -2; dummy.torso_power = -2; - dummy.bleed = 1.0f; + dummy.bleed = 25; dummy.bite = 0.5f; dummy.move_cost = 100; return dummy; @@ -1738,8 +1756,8 @@ bool cauterize_actor::cauterize_effect( player &p, item &it, bool force ) { // TODO: Make this less hacky static const heal_actor dummy = prepare_dummy(); - hp_part hpart = dummy.use_healing_item( p, p, it, force ); - if( hpart != num_hp_parts ) { + bodypart_id hpart = dummy.use_healing_item( p, p, it, force ); + if( hpart != bodypart_id( "num_bp" ) ) { p.add_msg_if_player( m_neutral, _( "You cauterize yourself." ) ); if( !( p.has_trait( trait_NOPAIN ) ) ) { p.mod_pain( 15 ); @@ -1747,9 +1765,11 @@ bool cauterize_actor::cauterize_effect( player &p, item &it, bool force ) } else { p.add_msg_if_player( m_neutral, _( "It itches a little." ) ); } - const body_part bp = player::hp_to_bp( hpart ); - if( p.has_effect( effect_bite, bp ) ) { - p.add_effect( effect_bite, 260_minutes, bp, true ); + if( p.has_effect( effect_bleed, hpart->token ) ) { + p.add_msg_if_player( m_bad, _( "Bleeding has not stopped completely!" ) ); + } + if( p.has_effect( effect_bite, hpart->token ) ) { + p.add_effect( effect_bite, 260_minutes, hpart->token, true ); } p.moves = 0; @@ -2515,7 +2535,7 @@ static item_location get_item_location( player &p, item &it, const tripoint &pos } // Item in a vehicle - if( const optional_vpart_position &vp = g->m.veh_at( pos ) ) { + if( const optional_vpart_position &vp = get_map().veh_at( pos ) ) { vehicle_cursor vc( vp->vehicle(), vp->part_index() ); bool found_in_vehicle = false; vc.visit_items( [&]( const item * e ) { @@ -2586,8 +2606,8 @@ bool repair_item_actor::handle_components( player &pl, const item &fix, // Round up if checking, but roll if actually consuming // TODO: should 250_ml be part of the cost_scaling? const int items_needed = std::max( 1, just_check ? - std::ceil( fix.volume() / 250_ml * cost_scaling ) : - roll_remainder( fix.volume() / 250_ml * cost_scaling ) ); + std::ceil( fix.base_volume() / 250_ml * cost_scaling ) : + roll_remainder( fix.base_volume() / 250_ml * cost_scaling ) ); std::function filter; if( fix.is_filthy() ) { @@ -2835,12 +2855,13 @@ repair_item_actor::repair_type repair_item_actor::default_action( const item &fi return RT_REFIT; } - const bool smol = g->u.has_trait( trait_SMALL2 ) || - g->u.has_trait( trait_SMALL_OK ); + Character &player_character = get_player_character(); + const bool smol = player_character.has_trait( trait_SMALL2 ) || + player_character.has_trait( trait_SMALL_OK ); const bool is_undersized = fix.has_flag( flag_UNDERSIZE ); const bool is_oversized = fix.has_flag( flag_OVERSIZE ); - const bool resizing_matters = fix.get_encumber( g->u ) != 0; + const bool resizing_matters = fix.get_encumber( player_character ) != 0; const bool too_big_while_smol = smol && !is_undersized && !is_oversized; if( too_big_while_smol && can_be_refitted && resizing_matters ) { @@ -3060,7 +3081,7 @@ void heal_actor::load( const JsonObject &obj ) head_scaling = obj.get_float( "head_scaling", scaling_ratio * head_power ); torso_scaling = obj.get_float( "torso_scaling", scaling_ratio * torso_power ); - bleed = obj.get_float( "bleed", 0.0f ); + bleed = obj.get_int( "bleed", 0 ); bite = obj.get_float( "bite", 0.0f ); infect = obj.get_float( "infect", 0.0f ); @@ -3115,8 +3136,8 @@ int heal_actor::use( player &p, item &it, bool, const tripoint &pos ) const } player &patient = get_patient( p, pos ); - const hp_part hpp = use_healing_item( p, patient, it, false ); - if( hpp == num_hp_parts ) { + const bodypart_str_id hpp = use_healing_item( p, patient, it, false ).id(); + if( hpp == bodypart_str_id( "num_bp" ) ) { return 0; } @@ -3133,7 +3154,7 @@ int heal_actor::use( player &p, item &it, bool, const tripoint &pos ) const /** @EFFECT_FIRSTAID speeds up firstaid activity */ p.assign_activity( ACT_FIRSTAID, cost, 0, 0, it.tname() ); p.activity.targets.push_back( item_location( p, &it ) ); - p.activity.values.push_back( hpp ); + p.activity.str_values.push_back( hpp.c_str() ); p.moves = 0; return 0; } @@ -3148,14 +3169,14 @@ std::unique_ptr heal_actor::clone() const return std::make_unique( *this ); } -int heal_actor::get_heal_value( const player &healer, hp_part healed ) const +int heal_actor::get_heal_value( const Character &healer, bodypart_id healed ) const { int heal_base; float bonus_mult; - if( healed == hp_head ) { + if( healed == bodypart_id( "head" ) ) { heal_base = head_power; bonus_mult = head_scaling; - } else if( healed == hp_torso ) { + } else if( healed == bodypart_id( "torso" ) ) { heal_base = torso_power; bonus_mult = torso_scaling; } else { @@ -3171,7 +3192,7 @@ int heal_actor::get_heal_value( const player &healer, hp_part healed ) const return heal_base; } -int heal_actor::get_bandaged_level( const player &healer ) const +int heal_actor::get_bandaged_level( const Character &healer ) const { if( bandages_power > 0 ) { /** @EFFECT_FIRSTAID increases healing item effects */ @@ -3181,7 +3202,7 @@ int heal_actor::get_bandaged_level( const player &healer ) const return bandages_power; } -int heal_actor::get_disinfected_level( const player &healer ) const +int heal_actor::get_disinfected_level( const Character &healer ) const { if( disinfectant_power > 0 ) { /** @EFFECT_FIRSTAID increases healing item effects */ @@ -3191,22 +3212,31 @@ int heal_actor::get_disinfected_level( const player &healer ) const return disinfectant_power; } -int heal_actor::finish_using( player &healer, player &patient, item &it, hp_part healed ) const +int heal_actor::get_stopbleed_level( const Character &healer ) const +{ + if( bleed > 0 ) { + /** @EFFECT_FIRSTAID increases healing item effects */ + return bleed + healer.get_skill_level( skill_firstaid ) / 2; + } + + return bleed; +} + +int heal_actor::finish_using( player &healer, player &patient, item &it, bodypart_id healed ) const { float practice_amount = limb_power * 3.0f; const int dam = get_heal_value( healer, healed ); + const int cur_hp = patient.get_part_hp_cur( healed ); - if( ( patient.hp_cur[healed] >= 1 ) && ( dam > 0 ) ) { // Prevent first-aid from mending limbs + if( ( cur_hp >= 1 ) && ( dam > 0 ) ) { // Prevent first-aid from mending limbs patient.heal( healed, dam ); - } else if( ( patient.hp_cur[healed] >= 1 ) && ( dam < 0 ) ) { - const bodypart_id bp = convert_bp( player::hp_to_bp( healed ) ).id(); - patient.apply_damage( nullptr, bp, -dam ); //hurt takes + damage + } else if( ( cur_hp >= 1 ) && ( dam < 0 ) ) { + patient.apply_damage( nullptr, healed, -dam ); //hurt takes + damage } - const body_part bp_healed = player::hp_to_bp( healed ); - + Character &player_character = get_player_character(); const bool u_see = healer.is_player() || patient.is_player() || - g->u.sees( healer ) || g->u.sees( patient ); + player_character.sees( healer ) || player_character.sees( patient ); const bool player_healing_player = healer.is_player() && patient.is_player(); // Need a helper here - messages are from healer's point of view // but it would be cool if NPCs could use this function too @@ -3223,19 +3253,33 @@ int heal_actor::finish_using( player &healer, player &patient, item &it, hp_part } }; - if( patient.has_effect( effect_bleed, bp_healed ) ) { - if( x_in_y( bleed, 1.0f ) ) { - patient.remove_effect( effect_bleed, bp_healed ); - heal_msg( m_good, _( "You stop the bleeding." ), _( "The bleeding is stopped." ) ); + if( patient.has_effect( effect_bleed, healed->token ) ) { + // small band-aids won't stop big arterial bleeding, but with tourniquet they just might + int pwr = 3 * get_stopbleed_level( healer ); + if( patient.worn_with_flag( "TOURNIQUET", convert_bp( healed->token ) ) ) { + pwr *= 2; + } + if( pwr > patient.get_effect_int( effect_bleed, healed->token ) ) { + effect &wound = patient.get_effect( effect_bleed, healed->token ); + time_duration dur = wound.get_duration() - ( get_stopbleed_level( healer ) * + wound.get_int_dur_factor() ); + wound.set_duration( std::max( 0_turns, dur ) ); + if( wound.get_duration() == 0_turns ) { + heal_msg( m_good, _( "You stop the bleeding." ), _( "The bleeding is stopped." ) ); + } else { + heal_msg( m_good, _( "You reduce the bleeding, but it's not stopped yet." ), + _( "The bleeding is reduced, but not stopped." ) ); + } } else { - heal_msg( m_warning, _( "You fail to stop the bleeding." ), _( "The wound still bleeds." ) ); + heal_msg( m_warning, + _( "Your dressing is too ineffective for a bleeding of this extent, and you fail to stop it." ), + _( "The wound still bleeds." ) ); } - - practice_amount += bleed * 3.0f; + practice_amount += bleed / 3.0f; } - if( patient.has_effect( effect_bite, bp_healed ) ) { + if( patient.has_effect( effect_bite, healed->token ) ) { if( x_in_y( bite, 1.0f ) ) { - patient.remove_effect( effect_bite, bp_healed ); + patient.remove_effect( effect_bite, healed->token ); heal_msg( m_good, _( "You clean the wound." ), _( "The wound is cleaned." ) ); } else { heal_msg( m_warning, _( "Your wound still aches." ), _( "The wound still looks bad." ) ); @@ -3243,10 +3287,10 @@ int heal_actor::finish_using( player &healer, player &patient, item &it, hp_part practice_amount += bite * 3.0f; } - if( patient.has_effect( effect_infected, bp_healed ) ) { + if( patient.has_effect( effect_infected, healed->token ) ) { if( x_in_y( infect, 1.0f ) ) { - const time_duration infected_dur = patient.get_effect_dur( effect_infected, bp_healed ); - patient.remove_effect( effect_infected, bp_healed ); + const time_duration infected_dur = patient.get_effect_dur( effect_infected, healed->token ); + patient.remove_effect( effect_infected, healed->token ); patient.add_effect( effect_recover, infected_dur ); heal_msg( m_good, _( "You disinfect the wound." ), _( "The wound is disinfected." ) ); } else { @@ -3285,18 +3329,20 @@ int heal_actor::finish_using( player &healer, player &patient, item &it, hp_part // apply healing over time effects if( bandages_power > 0 ) { int bandages_intensity = get_bandaged_level( healer ); - patient.add_effect( effect_bandaged, 1_turns, bp_healed ); - effect &e = patient.get_effect( effect_bandaged, bp_healed ); + patient.add_effect( effect_bandaged, 1_turns, healed->token ); + effect &e = patient.get_effect( effect_bandaged, healed->token ); e.set_duration( e.get_int_dur_factor() * bandages_intensity ); - patient.damage_bandaged[healed] = patient.hp_max[healed] - patient.hp_cur[healed]; + patient.set_part_damage_bandaged( healed, + patient.get_part_hp_max( healed ) - patient.get_part_hp_cur( healed ) ); practice_amount += 2 * bandages_intensity; } if( disinfectant_power > 0 ) { int disinfectant_intensity = get_disinfected_level( healer ); - patient.add_effect( effect_disinfected, 1_turns, bp_healed ); - effect &e = patient.get_effect( effect_disinfected, bp_healed ); + patient.add_effect( effect_disinfected, 1_turns, healed->token ); + effect &e = patient.get_effect( effect_disinfected, healed->token ); e.set_duration( e.get_int_dur_factor() * disinfectant_intensity ); - patient.damage_disinfected[healed] = patient.hp_max[healed] - patient.hp_cur[healed]; + patient.set_part_damage_disinfected( healed, + patient.get_part_hp_max( healed ) - patient.get_part_hp_cur( healed ) ); practice_amount += 2 * disinfectant_intensity; } practice_amount = std::max( 9.0f, practice_amount ); @@ -3305,14 +3351,14 @@ int heal_actor::finish_using( player &healer, player &patient, item &it, hp_part return it.type->charges_to_use(); } -static hp_part pick_part_to_heal( +static bodypart_id pick_part_to_heal( const player &healer, const player &patient, const std::string &menu_header, int limb_power, int head_bonus, int torso_bonus, - float bleed_chance, float bite_chance, float infect_chance, + int bleed_stop, float bite_chance, float infect_chance, bool force, float bandage_power, float disinfectant_power ) { - const bool bleed = bleed_chance > 0.0f; + const bool bleed = bleed_stop > 0; const bool bite = bite_chance > 0.0f; const bool infect = infect_chance > 0.0f; const bool precise = &healer == &patient ? @@ -3322,24 +3368,23 @@ static hp_part pick_part_to_heal( /** @EFFECT_FIRSTAID increases precision when using first aid on someone else */ ( healer.get_skill_level( skill_firstaid ) * 4 + healer.per_cur >= 20 ); while( true ) { - hp_part healed_part = patient.body_window( menu_header, force, precise, - limb_power, head_bonus, torso_bonus, - bleed_chance, bite_chance, infect_chance, bandage_power, disinfectant_power ); - if( healed_part == num_hp_parts ) { - return num_hp_parts; + bodypart_id healed_part = patient.body_window( menu_header, force, precise, + limb_power, head_bonus, torso_bonus, + bleed_stop, bite_chance, infect_chance, bandage_power, disinfectant_power ); + if( healed_part == bodypart_id( "num_bp" ) ) { + return bodypart_id( "num_bp" ); } - body_part bp = player::hp_to_bp( healed_part ); - if( ( infect && patient.has_effect( effect_infected, bp ) ) || - ( bite && patient.has_effect( effect_bite, bp ) ) || - ( bleed && patient.has_effect( effect_bleed, bp ) ) ) { + if( ( infect && patient.has_effect( effect_infected, healed_part->token ) ) || + ( bite && patient.has_effect( effect_bite, healed_part->token ) ) || + ( bleed && patient.has_effect( effect_bleed, healed_part->token ) ) ) { return healed_part; } if( patient.is_limb_broken( healed_part ) ) { - if( healed_part == hp_arm_l || healed_part == hp_arm_r ) { + if( healed_part == bodypart_id( "arm_l" ) || healed_part == bodypart_id( "arm_r" ) ) { add_msg( m_info, _( "That arm is broken. It needs surgical attention or a splint." ) ); - } else if( healed_part == hp_leg_l || healed_part == hp_leg_r ) { + } else if( healed_part == bodypart_id( "leg_l" ) || healed_part == bodypart_id( "leg_r" ) ) { add_msg( m_info, _( "That leg is broken. It needs surgical attention or a splint." ) ); } else { add_msg( m_info, "That body part is bugged. It needs developer's attention." ); @@ -3348,57 +3393,58 @@ static hp_part pick_part_to_heal( continue; } - if( force || patient.hp_cur[healed_part] < patient.hp_max[healed_part] ) { + if( force || patient.get_part_hp_cur( healed_part ) < patient.get_part_hp_max( healed_part ) ) { return healed_part; } } } -hp_part heal_actor::use_healing_item( player &healer, player &patient, item &it, bool force ) const +bodypart_id heal_actor::use_healing_item( player &healer, player &patient, item &it, + bool force ) const { - hp_part healed = num_hp_parts; - const int head_bonus = get_heal_value( healer, hp_head ); - const int limb_power = get_heal_value( healer, hp_arm_l ); - const int torso_bonus = get_heal_value( healer, hp_torso ); + bodypart_id healed = bodypart_id( "num_bp" ); + const int head_bonus = get_heal_value( healer, bodypart_id( "head" ) ); + const int limb_power = get_heal_value( healer, bodypart_id( "arm_l" ) ); + const int torso_bonus = get_heal_value( healer, bodypart_id( "torso" ) ); if( !patient.can_use_heal_item( it ) ) { patient.add_msg_player_or_npc( m_bad, _( "Your biology is not compatible with that item." ), _( "'s biology is not compatible with that item." ) ); - return num_hp_parts; // canceled + return bodypart_id( "num_bp" ); // canceled } if( healer.is_npc() ) { - // NPCs heal whatever has sustained the most damaged that they can heal but never - // rebandage parts + // NPCs heal whatever has sustained the most damage that they can heal but don't + // rebandage parts unless they are bleeding significantly int highest_damage = 0; - for( int i = 0; i < num_hp_parts; i++ ) { + for( const std::pair &elem : patient.get_body() ) { + const bodypart &part = elem.second; int damage = 0; - const body_part i_bp = player::hp_to_bp( static_cast( i ) ); - if( ( !patient.has_effect( effect_bandaged, i_bp ) && bandages_power > 0 ) || - ( !patient.has_effect( effect_disinfected, i_bp ) && disinfectant_power > 0 ) ) { - damage += patient.hp_max[i] - patient.hp_cur[i]; - damage += bleed * patient.get_effect_dur( effect_bleed, i_bp ) / 5_minutes; - damage += bite * patient.get_effect_dur( effect_bite, i_bp ) / 10_minutes; - damage += infect * patient.get_effect_dur( effect_infected, i_bp ) / 10_minutes; + if( ( !patient.has_effect( effect_bandaged, elem.first->token ) && bandages_power > 0 ) || + ( !patient.has_effect( effect_disinfected, elem.first->token ) && disinfectant_power > 0 ) ) { + damage += part.get_hp_max() - part.get_hp_cur(); + damage += bite * patient.get_effect_dur( effect_bite, elem.first->token ) / 10_minutes; + damage += infect * patient.get_effect_dur( effect_infected, elem.first->token ) / 10_minutes; + } + if( patient.get_effect_int( effect_bleed, elem.first->token ) > 5 && bleed > 0 ) { + damage += bleed * patient.get_effect_dur( effect_bleed, elem.first->token ) / 5_minutes; } if( damage > highest_damage ) { highest_damage = damage; - healed = static_cast( i ); + healed = elem.first.id(); } } } else if( patient.is_player() ) { // Player healing self - let player select if( healer.activity.id() != ACT_FIRSTAID ) { const std::string menu_header = _( "Select a body part for: " ) + it.tname(); - healed = pick_part_to_heal( healer, patient, menu_header, - limb_power, head_bonus, torso_bonus, - bleed, bite, infect, force, - get_bandaged_level( healer ), + healed = pick_part_to_heal( healer, patient, menu_header, limb_power, head_bonus, torso_bonus, + get_stopbleed_level( healer ), bite, infect, force, get_bandaged_level( healer ), get_disinfected_level( healer ) ); - if( healed == num_hp_parts ) { + if( healed == bodypart_id( "num_bp" ) ) { add_msg( m_info, _( "Never mind." ) ); - return num_hp_parts; // canceled + return bodypart_id( "num_bp" ); // canceled } } // Brick healing if using a first aid kit for the first time. @@ -3407,7 +3453,7 @@ hp_part heal_actor::use_healing_item( player &healer, player &patient, item &it, return healed; } else if( healer.activity.id() == ACT_FIRSTAID ) { // Completed activity, extract body part from it. - healed = static_cast( healer.activity.values[0] ); + healed = bodypart_id( healer.activity.str_values[0] ); } } else { // Player healing NPC @@ -3416,15 +3462,13 @@ hp_part heal_actor::use_healing_item( player &healer, player &patient, item &it, //~ %1$s: patient name, %2$s: healing item name "Select a body part of %1$s for %2$s:" ), patient.disp_name(), it.tname() ); - healed = pick_part_to_heal( healer, patient, menu_header, - limb_power, head_bonus, torso_bonus, - bleed, bite, infect, force, - get_bandaged_level( healer ), + healed = pick_part_to_heal( healer, patient, menu_header, limb_power, head_bonus, torso_bonus, + get_stopbleed_level( healer ), bite, infect, force, get_bandaged_level( healer ), get_disinfected_level( healer ) ); } - if( healed != num_hp_parts ) { - finish_using( healer, patient, it, healed ); + if( healed != bodypart_id( "num_bp" ) ) { + finish_using( healer, patient, it, healed ); } return healed; @@ -3433,10 +3477,11 @@ hp_part heal_actor::use_healing_item( player &healer, player &patient, item &it, void heal_actor::info( const item &, std::vector &dump ) const { if( head_power > 0 || torso_power > 0 || limb_power > 0 || bandages_power > 0 || - disinfectant_power > 0 || bleed > 0.0f || bite > 0.0f || infect > 0.0f ) { + disinfectant_power > 0 || bleed > 0 || bite > 0.0f || infect > 0.0f ) { dump.emplace_back( "HEAL", _( "Healing effects " ) ); } + Character &player_character = get_player_character(); if( head_power > 0 || torso_power > 0 || limb_power > 0 ) { dump.emplace_back( "HEAL", _( "Base healing: " ) ); dump.emplace_back( "HEAL_BASE", _( "Head: " ), "", iteminfo::no_newline, head_power ); @@ -3445,10 +3490,11 @@ void heal_actor::info( const item &, std::vector &dump ) const if( g != nullptr ) { dump.emplace_back( "HEAL", _( "Actual healing: " ) ); dump.emplace_back( "HEAL_ACT", _( "Head: " ), "", iteminfo::no_newline, - get_heal_value( g->u, hp_head ) ); + get_heal_value( player_character, bodypart_id( "head" ) ) ); dump.emplace_back( "HEAL_ACT", _( " Torso: " ), "", iteminfo::no_newline, - get_heal_value( g->u, hp_torso ) ); - dump.emplace_back( "HEAL_ACT", _( " Limbs: " ), get_heal_value( g->u, hp_arm_l ) ); + get_heal_value( player_character, bodypart_id( "torso" ) ) ); + dump.emplace_back( "HEAL_ACT", _( " Limbs: " ), get_heal_value( player_character, + bodypart_id( "arm_l" ) ) ); } } @@ -3457,7 +3503,7 @@ void heal_actor::info( const item &, std::vector &dump ) const texitify_base_healing_power( static_cast( bandages_power ) ) ); if( g != nullptr ) { dump.emplace_back( "HEAL", _( "Actual bandaging quality: " ), - texitify_healing_power( get_bandaged_level( g->u ) ) ); + texitify_healing_power( get_bandaged_level( player_character ) ) ); } } @@ -3466,16 +3512,18 @@ void heal_actor::info( const item &, std::vector &dump ) const texitify_base_healing_power( static_cast( disinfectant_power ) ) ); if( g != nullptr ) { dump.emplace_back( "HEAL", _( "Actual disinfecting quality: " ), - texitify_healing_power( get_disinfected_level( g->u ) ) ); + texitify_healing_power( get_disinfected_level( player_character ) ) ); } } - - if( bleed > 0.0f || bite > 0.0f || infect > 0.0f ) { - dump.emplace_back( "HEAL", _( "Chance to heal (percent): " ) ); - if( bleed > 0.0f ) { - dump.emplace_back( "HEAL", _( "* Bleeding: " ), - static_cast( bleed * 100 ) ); + if( bleed > 0 ) { + dump.emplace_back( "HEAL", _( "Effect on bleeding: " ), texitify_bandage_power( bleed ) ); + if( g != nullptr ) { + dump.emplace_back( "HEAL", _( "Actual effect on bleeding: " ), + texitify_healing_power( get_stopbleed_level( g->u ) ) ); } + } + if( bite > 0.0f || infect > 0.0f ) { + dump.emplace_back( "HEAL", _( "Chance to heal (percent): " ) ); if( bite > 0.0f ) { dump.emplace_back( "HEAL", _( "* Bite: " ), static_cast( bite * 100 ) ); @@ -3485,7 +3533,6 @@ void heal_actor::info( const item &, std::vector &dump ) const static_cast( infect * 100 ) ); } } - dump.emplace_back( "HEAL", _( "Moves to use: " ), move_cost ); } @@ -3525,15 +3572,17 @@ std::unique_ptr place_trap_actor::clone() const static bool is_solid_neighbor( const tripoint &pos, const point &offset ) { + map &here = get_map(); const tripoint a = pos + tripoint( offset, 0 ); const tripoint b = pos - tripoint( offset, 0 ); - return g->m.move_cost( a ) != 2 && g->m.move_cost( b ) != 2; + return here.move_cost( a ) != 2 && here.move_cost( b ) != 2; } static bool has_neighbor( const tripoint &pos, const ter_id &terrain_id ) { - for( const tripoint &t : g->m.points_in_radius( pos, 1, 0 ) ) { - if( g->m.ter( t ) == terrain_id ) { + map &here = get_map(); + for( const tripoint &t : here.points_in_radius( pos, 1, 0 ) ) { + if( here.ter( t ) == terrain_id ) { return true; } } @@ -3547,7 +3596,8 @@ bool place_trap_actor::is_allowed( player &p, const tripoint &pos, const std::st name ); return false; } - if( g->m.move_cost( pos ) != 2 ) { + map &here = get_map(); + if( here.move_cost( pos ) != 2 ) { p.add_msg_if_player( m_info, _( "You can't place a %s there." ), name ); return false; } @@ -3563,14 +3613,14 @@ bool place_trap_actor::is_allowed( player &p, const tripoint &pos, const std::st needs_neighbor_terrain.obj().name() ); return false; } - const trap &existing_trap = g->m.tr_at( pos ); + const trap &existing_trap = here.tr_at( pos ); if( !existing_trap.is_null() ) { if( existing_trap.can_see( pos, p ) ) { p.add_msg_if_player( m_info, _( "You can't place a %s there. It contains a trap already." ), name ); } else { p.add_msg_if_player( m_bad, _( "You trigger a %s!" ), existing_trap.name() ); - existing_trap.trigger( pos, &p ); + existing_trap.trigger( pos, p ); } return false; } @@ -3579,8 +3629,9 @@ bool place_trap_actor::is_allowed( player &p, const tripoint &pos, const std::st static void place_and_add_as_known( player &p, const tripoint &pos, const trap_str_id &id ) { - g->m.trap_set( pos, id ); - const trap &tr = g->m.tr_at( pos ); + map &here = get_map(); + here.trap_set( pos, id ); + const trap &tr = here.tr_at( pos ); if( !tr.can_see( pos, p ) ) { p.add_known_trap( pos, tr ); } @@ -3608,13 +3659,14 @@ int place_trap_actor::use( player &p, item &it, bool, const tripoint & ) const return 0; } + map &here = get_map(); int distance_to_trap_center = unburied_data.trap.obj().get_trap_radius() + outer_layer_trap.obj().get_trap_radius() + 1; if( unburied_data.trap.obj().get_trap_radius() > 0 ) { // Math correction for multi-tile traps pos.x = ( pos.x - p.posx() ) * distance_to_trap_center + p.posx(); pos.y = ( pos.y - p.posy() ) * distance_to_trap_center + p.posy(); - for( const tripoint &t : g->m.points_in_radius( pos, outer_layer_trap.obj().get_trap_radius(), + for( const tripoint &t : here.points_in_radius( pos, outer_layer_trap.obj().get_trap_radius(), 0 ) ) { if( !is_allowed( p, t, it.tname() ) ) { p.add_msg_if_player( m_info, @@ -3626,7 +3678,7 @@ int place_trap_actor::use( player &p, item &it, bool, const tripoint & ) const } const bool has_shovel = p.has_quality( quality_id( "DIG" ), 3 ); - const bool is_diggable = g->m.has_flag( "DIGGABLE", pos ); + const bool is_diggable = here.has_flag( "DIGGABLE", pos ); bool bury = false; if( could_bury && has_shovel && is_diggable ) { bury = query_yn( _( bury_question ) ); @@ -3638,7 +3690,7 @@ int place_trap_actor::use( player &p, item &it, bool, const tripoint & ) const p.mod_moves( -data.moves ); place_and_add_as_known( p, pos, data.trap ); - for( const tripoint &t : g->m.points_in_radius( pos, data.trap.obj().get_trap_radius(), 0 ) ) { + for( const tripoint &t : here.points_in_radius( pos, data.trap.obj().get_trap_radius(), 0 ) ) { if( t != pos ) { place_and_add_as_known( p, t, outer_layer_trap ); } @@ -3654,9 +3706,10 @@ void emit_actor::load( const JsonObject &obj ) int emit_actor::use( player &, item &it, bool, const tripoint &pos ) const { + map &here = get_map(); const float scaling = scale_qty ? it.charges : 1; for( const auto &e : emits ) { - g->m.emit_field( pos, e, scaling ); + here.emit_field( pos, e, scaling ); } return 1; @@ -3716,8 +3769,8 @@ ret_val saw_barrel_actor::can_use_on( const player &, const item &, const return ret_val::make_failure( _( "It's not a gun." ) ); } - if( target.type->gun->barrel_length <= 0_ml ) { - return ret_val::make_failure( _( "The barrel is too short." ) ); + if( target.type->gun->barrel_volume <= 0_ml ) { + return ret_val::make_failure( _( "The barrel is too small." ) ); } if( target.gunmod_find( itype_barrel_small ) ) { @@ -3745,8 +3798,10 @@ std::unique_ptr saw_barrel_actor::clone() const int install_bionic_actor::use( player &p, item &it, bool, const tripoint & ) const { if( p.can_install_bionics( *it.type, p, false ) ) { - p.consume_installation_requirment( it.type->bionic->id ); - p.consume_anesth_requirment( *it.type, p ); + if( !p.has_trait( trait_DEBUG_BIONICS ) ) { + p.consume_installation_requirment( it.type->bionic->id ); + p.consume_anesth_requirment( *it.type, p ); + } return p.install_bionics( *it.type, p, false ) ? it.type->charges_to_use() : 0; } else { return 0; @@ -4030,13 +4085,14 @@ int deploy_tent_actor::use( player &p, item &it, bool, const tripoint & ) const } const tripoint direction = *dir; + map &here = get_map(); // We place the center of the structure (radius + 1) // spaces away from the player. // First check there's enough room. const tripoint center = p.pos() + tripoint( ( radius + 1 ) * direction.x, ( radius + 1 ) * direction.y, 0 ); - for( const tripoint &dest : g->m.points_in_radius( center, radius ) ) { - if( const auto vp = g->m.veh_at( dest ) ) { + for( const tripoint &dest : here.points_in_radius( center, radius ) ) { + if( const auto vp = here.veh_at( dest ) ) { add_msg( m_info, _( "The %s is in the way." ), vp->vehicle().name ); return 0; } @@ -4044,28 +4100,28 @@ int deploy_tent_actor::use( player &p, item &it, bool, const tripoint & ) const add_msg( m_info, _( "The %s is in the way." ), c->disp_name() ); return 0; } - if( g->m.impassable( dest ) || !g->m.has_flag( "FLAT", dest ) ) { + if( here.impassable( dest ) || !here.has_flag( "FLAT", dest ) ) { add_msg( m_info, _( "The %s in that direction isn't suitable for placing the %s." ), - g->m.name( dest ), it.tname() ); + here.name( dest ), it.tname() ); return 0; } - if( g->m.has_furn( dest ) ) { - add_msg( m_info, _( "There is already furniture (%s) there." ), g->m.furnname( dest ) ); + if( here.has_furn( dest ) ) { + add_msg( m_info, _( "There is already furniture (%s) there." ), here.furnname( dest ) ); return 0; } } // Make a square of floor surrounded by wall. - for( const tripoint &dest : g->m.points_in_radius( center, radius ) ) { - g->m.furn_set( dest, wall ); + for( const tripoint &dest : here.points_in_radius( center, radius ) ) { + here.furn_set( dest, wall ); } - for( const tripoint &dest : g->m.points_in_radius( center, radius - 1 ) ) { - g->m.furn_set( dest, floor ); + for( const tripoint &dest : here.points_in_radius( center, radius - 1 ) ) { + here.furn_set( dest, floor ); } // Place the center floor and the door. if( floor_center ) { - g->m.furn_set( center, *floor_center ); + here.furn_set( center, *floor_center ); } - g->m.furn_set( p.pos() + direction, door_closed ); + here.furn_set( p.pos() + direction, door_closed ); add_msg( m_info, _( "You set up the %s on the ground." ), it.tname() ); add_msg( m_info, _( "Examine the center square to pack it up again." ) ); return 1; @@ -4073,8 +4129,9 @@ int deploy_tent_actor::use( player &p, item &it, bool, const tripoint & ) const bool deploy_tent_actor::check_intact( const tripoint ¢er ) const { - for( const tripoint &dest : g->m.points_in_radius( center, radius ) ) { - const furn_id fid = g->m.furn( dest ); + map &here = get_map(); + for( const tripoint &dest : here.points_in_radius( center, radius ) ) { + const furn_id fid = here.furn( dest ); if( dest == center && floor_center ) { if( fid != *floor_center ) { return false; diff --git a/src/iuse_actor.h b/src/iuse_actor.h index 08ddb919df766..dccd8013f536d 100644 --- a/src/iuse_actor.h +++ b/src/iuse_actor.h @@ -30,7 +30,6 @@ class player; struct iteminfo; struct tripoint; -enum hp_part : int; enum body_part : int; class JsonObject; class item_location; @@ -328,6 +327,8 @@ class place_monster_iuse : public iuse_actor std::string hostile_msg; /** Skills used to make the monster not hostile when activated. **/ std::set skills; + /** The monster will be spawned in as a pet. False by default. Can be empty. */ + bool is_pet = false; place_monster_iuse() : iuse_actor( "place_monster" ) { } ~place_monster_iuse() override = default; @@ -893,8 +894,8 @@ class heal_actor : public iuse_actor float disinfectant_power = 0; /** Extra intensity levels gained per skill level when healing limbs. */ float disinfectant_scaling = 0; - /** Chance to remove bleed effect. */ - float bleed = 0; + /** How many levels of bleeding effect intensity can it remove (dressing efficiency). */ + int bleed = 0; /** Chance to remove bite effect. */ float bite = 0; /** Chance to remove infected effect. */ @@ -922,15 +923,17 @@ class heal_actor : public iuse_actor std::set used_up_item_flags; /** How much hp would `healer` heal using this actor on `healed` body part. */ - int get_heal_value( const player &healer, hp_part healed ) const; + int get_heal_value( const Character &healer, bodypart_id healed ) const; /** How many intensity levels will be applied using this actor by `healer`. */ - int get_bandaged_level( const player &healer ) const; + int get_bandaged_level( const Character &healer ) const; /** How many intensity levels will be applied using this actor by `healer`. */ - int get_disinfected_level( const player &healer ) const; + int get_disinfected_level( const Character &healer ) const; + /** How many intensity levels of bleeding will be reduced using this actor by `healer`. */ + int get_stopbleed_level( const Character &healer ) const; /** Does the actual healing. Used by both long and short actions. Returns charges used. */ - int finish_using( player &healer, player &patient, item &it, hp_part healed ) const; + int finish_using( player &healer, player &patient, item &it, bodypart_id healed ) const; - hp_part use_healing_item( player &healer, player &patient, item &it, bool force ) const; + bodypart_id use_healing_item( player &healer, player &patient, item &it, bool force ) const; heal_actor( const std::string &type = "heal" ) : iuse_actor( type ) {} diff --git a/src/kill_tracker.cpp b/src/kill_tracker.cpp index 5cee5f4cccd37..63748db738ee8 100644 --- a/src/kill_tracker.cpp +++ b/src/kill_tracker.cpp @@ -121,7 +121,7 @@ void kill_tracker::notify( const cata::event &e ) switch( e.type() ) { case event_type::character_kills_monster: { character_id killer = e.get( "killer" ); - if( killer != get_avatar().getID() ) { + if( killer != get_player_character().getID() ) { // TODO: add a kill counter for npcs? break; } @@ -131,7 +131,7 @@ void kill_tracker::notify( const cata::event &e ) } case event_type::character_kills_character: { character_id killer = e.get( "killer" ); - if( killer != get_avatar().getID() ) { + if( killer != get_player_character().getID() ) { break; } std::string victim_name = e.get( "victim_name" ); diff --git a/src/lightmap.cpp b/src/lightmap.cpp index 32f81d7d94a8e..29096b3252caa 100644 --- a/src/lightmap.cpp +++ b/src/lightmap.cpp @@ -90,7 +90,7 @@ bool map::build_transparency_cache( const int zlev ) &transparency_cache[0][0], MAPSIZE_X * MAPSIZE_Y, static_cast( LIGHT_TRANSPARENCY_OPEN_AIR ) ); - const float sight_penalty = weather::sight_penalty( g->weather.weather ); + const float sight_penalty = get_weather().weather_id->sight_penalty; // Traverse the submaps in order for( int smx = 0; smx < my_MAPSIZE; ++smx ) { @@ -245,7 +245,7 @@ void map::build_sunlight_cache( int zlev ) const auto &prev_transparency_cache = prev_map_cache.transparency_cache; const auto &prev_floor_cache = prev_map_cache.floor_cache; const auto &outside_cache = map_cache.outside_cache; - const float sight_penalty = weather::sight_penalty( g->weather.weather ); + const float sight_penalty = get_weather().weather_id->sight_penalty; for( int x = 0, prev_x = offset.x; x < MAPSIZE_X; x++, prev_x++ ) { bool x_inbounds = prev_x >= 0 && prev_x < MAPSIZE_X; for( int y = 0, prev_y = offset.y; y < MAPSIZE_Y; y++, prev_y++ ) { diff --git a/src/line.cpp b/src/line.cpp index b9ae11868c703..7f7420720d9bb 100644 --- a/src/line.cpp +++ b/src/line.cpp @@ -158,7 +158,7 @@ void bresenham( const tripoint &loc1, const tripoint &loc2, int t, int t2, } cur.z += s.z; cur.x += s.x; - t += a.x; + t += a.y; if( !interact( cur ) ) { break; } @@ -171,7 +171,7 @@ void bresenham( const tripoint &loc1, const tripoint &loc2, int t, int t2, } cur.y += s.y; cur.z += s.z; - t += a.z; + t += a.x; if( !interact( cur ) ) { break; } diff --git a/src/live_view.cpp b/src/live_view.cpp index ffa8dd666e224..b4748b0bcc0d6 100644 --- a/src/live_view.cpp +++ b/src/live_view.cpp @@ -47,7 +47,7 @@ void live_view::show( const tripoint &p ) const int max_height = TERMY / 2; const int line_limit = max_height - 2; - const visibility_variables &cache = g->m.get_visibility_variables_cache(); + const visibility_variables &cache = get_map().get_visibility_variables_cache(); int line_out = START_LINE; // HACK: using dummy window to get the window height without refreshing. win = catacurses::newwin( 1, width, point_zero ); @@ -60,7 +60,7 @@ void live_view::show( const tripoint &p ) } ); ui->on_redraw( [this]( const ui_adaptor & ) { werase( win ); - const visibility_variables &cache = g->m.get_visibility_variables_cache(); + const visibility_variables &cache = get_map().get_visibility_variables_cache(); int line_out = START_LINE; g->pre_print_all_tile_info( mouse_position, win, line_out, getmaxy( win ) - 2, cache ); draw_border( win ); diff --git a/src/magic.cpp b/src/magic.cpp index eaf0831ff31cc..016e4e64984e9 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -9,7 +9,6 @@ #include #include -#include "avatar.h" #include "calendar.h" #include "cata_utility.h" #include "catacharset.h" @@ -101,6 +100,8 @@ std::string enum_to_string( spell_flag data ) case spell_flag::IGNORE_WALLS: return "IGNORE_WALLS"; case spell_flag::HOSTILE_SUMMON: return "HOSTILE_SUMMON"; case spell_flag::HOSTILE_50: return "HOSTILE_50"; + case spell_flag::FRIENDLY_POLY: return "FRIENDLY_POLY"; + case spell_flag::POLYMORPH_GROUP: return "POLYMORPH_GROUP"; case spell_flag::SILENT: return "SILENT"; case spell_flag::LOUD: return "LOUD"; case spell_flag::VERBAL: return "VERBAL"; @@ -118,6 +119,8 @@ std::string enum_to_string( spell_flag data ) case spell_flag::PAIN_NORESIST: return "PAIN_NORESIST"; case spell_flag::WITH_CONTAINER: return "WITH_CONTAINER"; case spell_flag::SPAWN_GROUP: return "SPAWN_GROUP"; + case spell_flag::IGNITE_FLAMMABLE: return "IGNITE_FLAMMABLE"; + case spell_flag::NO_FAIL: return "NO_FAIL"; case spell_flag::WONDER: return "WONDER"; case spell_flag::LAST: break; } @@ -217,6 +220,7 @@ void spell_type::load( const JsonObject &jo, const std::string & ) effect_map{ { "pain_split", spell_effect::pain_split }, { "target_attack", spell_effect::target_attack }, + { "targeted_polymorph", spell_effect::targeted_polymorph }, { "projectile_attack", spell_effect::projectile_attack }, { "cone_attack", spell_effect::cone_attack }, { "line_attack", spell_effect::line_attack }, @@ -671,7 +675,8 @@ int spell::energy_cost( const Character &guy ) const } if( !has_flag( spell_flag::NO_HANDS ) ) { // the first 10 points of combined encumbrance is ignored, but quickly adds up - const int hands_encumb = std::max( 0, guy.encumb( bp_hand_l ) + guy.encumb( bp_hand_r ) - 10 ); + const int hands_encumb = std::max( 0, + guy.encumb( bodypart_id( "hand_l" ) ) + guy.encumb( bodypart_id( "hand_r" ) ) - 10 ); switch( type->energy_source ) { default: cost += 10 * hands_encumb; @@ -705,8 +710,8 @@ bool spell::can_cast( const Character &guy ) const case magic_energy_type::stamina: return guy.get_stamina() >= energy_cost( guy ); case magic_energy_type::hp: { - for( int i = 0; i < num_hp_parts; i++ ) { - if( energy_cost( guy ) < guy.hp_cur[i] ) { + for( const std::pair &elem : guy.get_body() ) { + if( energy_cost( guy ) < elem.second.get_hp_cur() ) { return true; } } @@ -727,7 +732,7 @@ int spell::get_difficulty() const return type->difficulty; } -int spell::casting_time( const Character &guy ) const +int spell::casting_time( const Character &guy, bool ignore_encumb ) const { // casting time in moves int casting_time = 0; @@ -742,15 +747,19 @@ int spell::casting_time( const Character &guy ) const } else { casting_time = type->base_casting_time; } - if( !has_flag( spell_flag::NO_LEGS ) ) { - // the first 20 points of encumbrance combined is ignored - const int legs_encumb = std::max( 0, guy.encumb( bp_leg_l ) + guy.encumb( bp_leg_r ) - 20 ); - casting_time += legs_encumb * 3; - } - if( has_flag( spell_flag::SOMATIC ) ) { - // the first 20 points of encumbrance combined is ignored - const int arms_encumb = std::max( 0, guy.encumb( bp_arm_l ) + guy.encumb( bp_arm_r ) - 20 ); - casting_time += arms_encumb * 2; + if( !ignore_encumb ) { + if( !has_flag( spell_flag::NO_LEGS ) ) { + // the first 20 points of encumbrance combined is ignored + const int legs_encumb = std::max( 0, + guy.encumb( bodypart_id( "leg_l" ) ) + guy.encumb( bodypart_id( "leg_r" ) ) - 20 ); + casting_time += legs_encumb * 3; + } + if( has_flag( spell_flag::SOMATIC ) ) { + // the first 20 points of encumbrance combined is ignored + const int arms_encumb = std::max( 0, + guy.encumb( bodypart_id( "arm_l" ) ) + guy.encumb( bodypart_id( "arm_r" ) ) - 20 ); + casting_time += arms_encumb * 2; + } } return casting_time; } @@ -770,6 +779,9 @@ std::string spell::message() const float spell::spell_fail( const Character &guy ) const { + if( has_flag( spell_flag::NO_FAIL ) ) { + return 0.0f; + } // formula is based on the following: // exponential curve // effective skill of 0 or less is 100% failure @@ -786,13 +798,14 @@ float spell::spell_fail( const Character &guy ) const float fail_chance = std::pow( ( effective_skill - 30.0f ) / 30.0f, 2 ); if( has_flag( spell_flag::SOMATIC ) && !guy.has_trait_flag( "SUBTLE_SPELL" ) ) { // the first 20 points of encumbrance combined is ignored - const int arms_encumb = std::max( 0, guy.encumb( bp_arm_l ) + guy.encumb( bp_arm_r ) - 20 ); + const int arms_encumb = std::max( 0, + guy.encumb( bodypart_id( "arm_l" ) ) + guy.encumb( bodypart_id( "arm_r" ) ) - 20 ); // each encumbrance point beyond the "gray" color counts as half an additional fail % fail_chance += arms_encumb / 200.0f; } if( has_flag( spell_flag::VERBAL ) && !guy.has_trait_flag( "SILENT_SPELL" ) ) { // a little bit of mouth encumbrance is allowed, but not much - const int mouth_encumb = std::max( 0, guy.encumb( bp_mouth ) - 5 ); + const int mouth_encumb = std::max( 0, guy.encumb( bodypart_id( "mouth" ) ) - 5 ); fail_chance += mouth_encumb / 100.0f; } // concentration spells work better than you'd expect with a higher focus pool @@ -870,7 +883,7 @@ std::string spell::energy_cost_string( const Character &guy ) const return colorize( to_string( energy_cost( guy ) ), c_light_blue ); } if( energy_source() == magic_energy_type::hp ) { - auto pair = get_hp_bar( energy_cost( guy ), guy.get_hp_max() / num_hp_parts ); + auto pair = get_hp_bar( energy_cost( guy ), guy.get_hp_max() / 6 ); return colorize( pair.first, pair.second ); } if( energy_source() == magic_energy_type::stamina ) { @@ -931,11 +944,12 @@ void spell::create_field( const tripoint &at ) const return; } if( one_in( type->field_chance ) ) { - field_entry *field = g->m.get_field( at, *type->field ); + map &here = get_map(); + field_entry *field = here.get_field( at, *type->field ); if( field ) { field->set_field_intensity( field->get_field_intensity() + intensity ); } else { - g->m.add_field( at, *type->field, intensity, -duration_turns() ); + here.add_field( at, *type->field, intensity, -duration_turns() ); } } } @@ -1288,7 +1302,7 @@ void known_magic::serialize( JsonOut &json ) const json.member( "spellbook" ); json.start_array(); - for( auto pair : spellbook ) { + for( const auto &pair : spellbook ) { json.start_object(); json.member( "id", pair.second.id() ); json.member( "xp", pair.second.xp() ); @@ -1410,7 +1424,7 @@ void known_magic::forget_spell( const spell_id &sp ) } add_msg( m_bad, _( "All knowledge of %s leaves you." ), sp->name ); // TODO: add parameter for owner of known_magic for this function - g->events().send( g->u.getID(), sp->id ); + g->events().send( get_player_character().getID(), sp->id ); spellbook.erase( sp ); } @@ -1495,8 +1509,8 @@ bool known_magic::has_enough_energy( const Character &guy, spell &sp ) const case magic_energy_type::stamina: return guy.get_stamina() >= cost; case magic_energy_type::hp: - for( int i = 0; i < num_hp_parts; i++ ) { - if( guy.hp_cur[i] > cost ) { + for( const std::pair &elem : guy.get_body() ) { + if( elem.second.get_hp_cur() > cost ) { return true; } } @@ -1554,8 +1568,8 @@ class spellcasting_callback : public uilist_callback int invlet = 0; invlet = popup_getkey( _( "Choose a new hotkey for this spell." ) ); if( inv_chars.valid( invlet ) ) { - const bool invlet_set = g->u.magic.set_invlet( known_spells[entnum]->id(), invlet, - reserved_invlets ); + const bool invlet_set = + get_player_character().magic.set_invlet( known_spells[entnum]->id(), invlet, reserved_invlets ); if( !invlet_set ) { popup( _( "Hotkey already used." ) ); } else { @@ -1564,7 +1578,7 @@ class spellcasting_callback : public uilist_callback } } else { popup( _( "Hotkey removed." ) ); - g->u.magic.rem_invlet( known_spells[entnum]->id() ); + get_player_character().magic.rem_invlet( known_spells[entnum]->id() ); } return true; } @@ -1597,11 +1611,13 @@ static bool casting_time_encumbered( const spell &sp, const Character &guy ) int encumb = 0; if( !sp.has_flag( spell_flag::NO_LEGS ) ) { // the first 20 points of encumbrance combined is ignored - encumb += std::max( 0, guy.encumb( bp_leg_l ) + guy.encumb( bp_leg_r ) - 20 ); + encumb += std::max( 0, guy.encumb( bodypart_id( "leg_l" ) ) + guy.encumb( + bodypart_id( "leg_r" ) ) - 20 ); } if( sp.has_flag( spell_flag::SOMATIC ) ) { // the first 20 points of encumbrance combined is ignored - encumb += std::max( 0, guy.encumb( bp_arm_l ) + guy.encumb( bp_arm_r ) - 20 ); + encumb += std::max( 0, guy.encumb( bodypart_id( "arm_l" ) ) + guy.encumb( + bodypart_id( "arm_r" ) ) - 20 ); } return encumb > 0; } @@ -1609,7 +1625,9 @@ static bool casting_time_encumbered( const spell &sp, const Character &guy ) static bool energy_cost_encumbered( const spell &sp, const Character &guy ) { if( !sp.has_flag( spell_flag::NO_HANDS ) ) { - return std::max( 0, guy.encumb( bp_hand_l ) + guy.encumb( bp_hand_r ) - 10 ) > 0; + return std::max( 0, guy.encumb( bodypart_id( "hand_l" ) ) + guy.encumb( + bodypart_id( "hand_r" ) ) - 10 ) > + 0; } return false; } @@ -1678,7 +1696,7 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu string_format( "%s: %d", _( "Max Level" ), sp.get_max_level() ) ); print_colored_text( w_menu, point( h_col1, line ), gray, gray, - sp.colorized_fail_percent( g->u ) ); + sp.colorized_fail_percent( get_player_character() ) ); print_colored_text( w_menu, point( h_col2, line++ ), gray, gray, string_format( "%s: %d", _( "Difficulty" ), sp.get_difficulty() ) ); @@ -1692,21 +1710,21 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu line++; } - const bool cost_encumb = energy_cost_encumbered( sp, g->u ); + const bool cost_encumb = energy_cost_encumbered( sp, get_player_character() ); std::string cost_string = cost_encumb ? _( "Casting Cost (impeded)" ) : _( "Casting Cost" ); std::string energy_cur = sp.energy_source() == magic_energy_type::hp ? "" : - string_format( _( " (%s current)" ), sp.energy_cur_string( g->u ) ); - if( !sp.can_cast( g->u ) ) { + string_format( _( " (%s current)" ), sp.energy_cur_string( get_player_character() ) ); + if( !sp.can_cast( get_player_character() ) ) { cost_string = colorize( _( "Not Enough Energy" ), c_red ); energy_cur = ""; } print_colored_text( w_menu, point( h_col1, line++ ), gray, gray, string_format( "%s: %s %s%s", cost_string, - sp.energy_cost_string( g->u ), sp.energy_string(), energy_cur ) ); - const bool c_t_encumb = casting_time_encumbered( sp, g->u ); + sp.energy_cost_string( get_player_character() ), sp.energy_string(), energy_cur ) ); + const bool c_t_encumb = casting_time_encumbered( sp, get_player_character() ); print_colored_text( w_menu, point( h_col1, line++ ), gray, gray, colorize( string_format( "%s: %s", c_t_encumb ? _( "Casting Time (impeded)" ) : _( "Casting Time" ), - moves_to_string( sp.casting_time( g->u ) ) ), + moves_to_string( sp.casting_time( get_player_character() ) ) ), c_t_encumb ? c_red : c_light_gray ) ); if( line <= win_height * 3 / 4 ) { @@ -1785,6 +1803,22 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu } damage_string = string_format( "%s %d %s", _( "Summon" ), sp.damage(), _( monster_name ) ); aoe_string = string_format( "%s: %d", _( "Spell Radius" ), sp.aoe() ); + } else if( fx == "targeted_polymorph" ) { + std::string monster_name = sp.effect_data(); + if( sp.has_flag( spell_flag::POLYMORPH_GROUP ) ) { + // TODO: Get a more user-friendly group name + if( MonsterGroupManager::isValidMonsterGroup( mongroup_id( sp.effect_data() ) ) ) { + monster_name = _( "random creature" ); + } else { + debugmsg( "Unknown monster group: %s", sp.effect_data() ); + } + } else if( monster_name.empty() ) { + monster_name = _( "random creature" ); + } else { + monster_name = mtype_id( sp.effect_data() )->nname(); + } + damage_string = string_format( _( "Targets under: %dhp become a %s" ), sp.damage(), + monster_name ); } else if( fx == "ter_transform" ) { aoe_string = string_format( "%s: %s", _( "Spell Radius" ), sp.aoe_string() ); } @@ -1977,6 +2011,8 @@ static void draw_spellbook_info( const spell_type &sp, uilist *menu ) has_damage_type = sp.min_damage > 0 && sp.max_damage > 0; } else if( fx == "spawn_item" || fx == "summon_monster" ) { damage_string = _( "Spawned" ); + } else if( fx == "targeted_polymorph" ) { + damage_string = _( "Threshold" ); } else if( fx == "recover_energy" ) { damage_string = _( "Recover" ); } else if( fx == "teleport_random" ) { @@ -2132,7 +2168,7 @@ void spell_events::notify( const cata::event &e ) int learn_at_level = it->second; if( learn_at_level == slvl ) { std::string learn_spell_id = it->first; - g->u.magic.learn_spell( learn_spell_id, g->u ); + get_player_character().magic.learn_spell( learn_spell_id, get_player_character() ); spell_type spell_learned = spell_factory.obj( spell_id( learn_spell_id ) ); add_msg( _( "Your experience and knowledge in creating and manipulating magical energies to cast %s have opened your eyes to new possibilities, you can now cast %s." ), diff --git a/src/magic.h b/src/magic.h index 511ccb77fd51d..cded00ea86f74 100644 --- a/src/magic.h +++ b/src/magic.h @@ -41,6 +41,8 @@ enum class spell_flag : int { SWAP_POS, // a projectile spell swaps the positions of the caster and target HOSTILE_SUMMON, // summon spell always spawns a hostile monster HOSTILE_50, // summoned monster spawns friendly 50% of the time + POLYMORPH_GROUP, // polymorph spell chooses a monster from a group + FRIENDLY_POLY, // polymorph spell makes the monster friendly SILENT, // spell makes no noise at target LOUD, // spell makes extra noise at target VERBAL, // spell makes noise at caster location, mouth encumbrance affects fail % @@ -56,8 +58,10 @@ enum class spell_flag : int { MUTATE_TRAIT, // overrides the mutate spell_effect to use a specific trait_id instead of a category WONDER, // instead of casting each of the extra_spells, it picks N of them and casts them (where N is std::min( damage(), number_of_spells )) PAIN_NORESIST, // pain altering spells can't be resisted (like with the deadened trait) + NO_FAIL, // this spell cannot fail when you cast it WITH_CONTAINER, // items spawned with container SPAWN_GROUP, // spawn or summon from an item or monster group, instead of individual item/monster ID + IGNITE_FLAMMABLE, // if spell effect area has any thing flamable, a fire will be produced LAST }; @@ -354,7 +358,7 @@ class spell float spell_fail( const Character &guy ) const; std::string colorized_fail_percent( const Character &guy ) const; // how long does it take to cast the spell - int casting_time( const Character &guy ) const; + int casting_time( const Character &guy, bool ignore_encumb = false ) const; // can the Character cast this spell? bool can_cast( const Character &guy ) const; @@ -516,6 +520,8 @@ void teleport_random( const spell &sp, Creature &caster, const tripoint & ); void pain_split( const spell &, Creature &, const tripoint & ); void target_attack( const spell &sp, Creature &caster, const tripoint &epicenter ); +void targeted_polymorph( const spell &sp, Creature &caster, const tripoint &target ); + void projectile_attack( const spell &sp, Creature &caster, const tripoint &target ); void cone_attack( const spell &sp, Creature &caster, diff --git a/src/magic_enchantment.cpp b/src/magic_enchantment.cpp index 64f82b989ff22..b4fb44ef4e478 100644 --- a/src/magic_enchantment.cpp +++ b/src/magic_enchantment.cpp @@ -17,23 +17,6 @@ #include "string_id.h" #include "units.h" -template struct enum_traits; - -template<> -struct enum_traits { - static constexpr enchantment::has last = enchantment::has::NUM_HAS; -}; - -template<> -struct enum_traits { - static constexpr enchantment::condition last = enchantment::condition::NUM_CONDITION; -}; - -template<> -struct enum_traits { - static constexpr enchant_vals::mod last = enchant_vals::mod::NUM_MOD; -}; - namespace io { // *INDENT-OFF* @@ -90,12 +73,10 @@ namespace io case enchant_vals::mod::BONUS_BLOCK: return "BONUS_BLOCK"; case enchant_vals::mod::BONUS_DODGE: return "BONUS_DODGE"; case enchant_vals::mod::ATTACK_NOISE: return "ATTACK_NOISE"; - case enchant_vals::mod::SPELL_NOISE: return "SPELL_NOISE"; case enchant_vals::mod::SHOUT_NOISE: return "SHOUT_NOISE"; case enchant_vals::mod::FOOTSTEP_NOISE: return "FOOTSTEP_NOISE"; case enchant_vals::mod::SIGHT_RANGE: return "SIGHT_RANGE"; case enchant_vals::mod::CARRY_WEIGHT: return "CARRY_WEIGHT"; - case enchant_vals::mod::CARRY_VOLUME: return "CARRY_VOLUME"; case enchant_vals::mod::SOCIAL_LIE: return "SOCIAL_LIE"; case enchant_vals::mod::SOCIAL_PERSUADE: return "SOCIAL_PERSUADE"; case enchant_vals::mod::SOCIAL_INTIMIDATE: return "SOCIAL_INTIMIDATE"; @@ -366,6 +347,31 @@ void enchantment::force_add( const enchantment &rhs ) } } +void enchantment::set_has( enchantment::has value ) +{ + active_conditions.first = value; +} + +void enchantment::add_value_add( enchant_vals::mod value, int add_value ) +{ + values_add[value] = add_value; +} + +void enchantment::add_value_mult( enchant_vals::mod value, float mult_value ) +{ + values_multiply[value] = mult_value; +} + +void enchantment::add_hit_me( const fake_spell &sp ) +{ + hit_me_effect.push_back( sp ); +} + +void enchantment::add_hit_you( const fake_spell &sp ) +{ + hit_you_effect.push_back( sp ); +} + int enchantment::get_value_add( const enchant_vals::mod value ) const { const auto found = values_add.find( value ); @@ -384,6 +390,29 @@ double enchantment::get_value_multiply( const enchant_vals::mod value ) const return found->second; } +double enchantment::modify_value( const enchant_vals::mod mod_val, double value ) const +{ + value += get_value_add( mod_val ); + value *= 1.0 + get_value_multiply( mod_val ); + return value; +} + +units::energy enchantment::modify_value( const enchant_vals::mod mod_val, + units::energy value ) const +{ + value += units::from_millijoule( get_value_add( mod_val ) ); + value *= 1.0 + get_value_multiply( mod_val ); + return value; +} + +units::mass enchantment::modify_value( const enchant_vals::mod mod_val, + units::mass value ) const +{ + value += units::from_gram( get_value_add( mod_val ) ); + value *= 1.0 + get_value_multiply( mod_val ); + return value; +} + int enchantment::mult_bonus( enchant_vals::mod value_type, int base_value ) const { return get_value_multiply( value_type ) * base_value; diff --git a/src/magic_enchantment.h b/src/magic_enchantment.h index 053bd333deced..a05b0aa27a7b7 100644 --- a/src/magic_enchantment.h +++ b/src/magic_enchantment.h @@ -9,10 +9,12 @@ #include #include "calendar.h" +#include "enum_traits.h" #include "json.h" #include "magic.h" #include "optional.h" #include "type_id.h" +#include "units.h" class Character; class Creature; @@ -20,6 +22,8 @@ class item; namespace enchant_vals { +// the different types of values that can be modified by enchantments +// either the item directly or the Character, whichever is more appropriate enum class mod : int { // effects for the Character STRENGTH, @@ -38,19 +42,17 @@ enum class mod : int { REGEN_STAMINA, MAX_HP, // for all limbs! use with caution REGEN_HP, - THIRST, // cost or regen over time - FATIGUE, // cost or regen over time + THIRST, // thirst rate + FATIGUE, // fatigue rate PAIN, // cost or regen over time BONUS_DODGE, BONUS_BLOCK, BONUS_DAMAGE, ATTACK_NOISE, - SPELL_NOISE, SHOUT_NOISE, FOOTSTEP_NOISE, SIGHT_RANGE, CARRY_WEIGHT, - CARRY_VOLUME, SOCIAL_LIE, SOCIAL_PERSUADE, SOCIAL_INTIMIDATE, @@ -112,79 +114,6 @@ class enchantment UNDERWATER, NUM_CONDITION }; - // the different types of values that can be modified by enchantments - // either the item directly or the Character, whichever is more appropriate - enum mod { - // effects for the Character - STRENGTH, - DEXTERITY, - PERCEPTION, - INTELLIGENCE, - SPEED, - ATTACK_COST, - ATTACK_SPEED, // affects attack speed of item even if it's not the one you're wielding - MOVE_COST, - METABOLISM, - MAX_MANA, - REGEN_MANA, - BIONIC_POWER, - MAX_STAMINA, - REGEN_STAMINA, - MAX_HP, // for all limbs! use with caution - REGEN_HP, - THIRST, // cost or regen over time - FATIGUE, // cost or regen over time - PAIN, // cost or regen over time - BONUS_DODGE, - BONUS_BLOCK, - BONUS_DAMAGE, - ATTACK_NOISE, - SPELL_NOISE, - SHOUT_NOISE, - FOOTSTEP_NOISE, - SIGHT_RANGE, - CARRY_WEIGHT, - CARRY_VOLUME, - SOCIAL_LIE, - SOCIAL_PERSUADE, - SOCIAL_INTIMIDATE, - ARMOR_BASH, - ARMOR_CUT, - ARMOR_STAB, - ARMOR_BULLET, - ARMOR_HEAT, - ARMOR_COLD, - ARMOR_ELEC, - ARMOR_ACID, - ARMOR_BIO, - // effects for the item that has the enchantment - ITEM_DAMAGE_BASH, - ITEM_DAMAGE_CUT, - ITEM_DAMAGE_STAB, - ITEM_DAMAGE_BULLET, - ITEM_DAMAGE_HEAT, - ITEM_DAMAGE_COLD, - ITEM_DAMAGE_ELEC, - ITEM_DAMAGE_ACID, - ITEM_DAMAGE_BIO, - ITEM_DAMAGE_AP, // armor piercing - ITEM_ARMOR_BASH, - ITEM_ARMOR_CUT, - ITEM_ARMOR_STAB, - ITEM_ARMOR_BULLET, - ITEM_ARMOR_HEAT, - ITEM_ARMOR_COLD, - ITEM_ARMOR_ELEC, - ITEM_ARMOR_ACID, - ITEM_ARMOR_BIO, - ITEM_WEIGHT, - ITEM_ENCUMBRANCE, - ITEM_VOLUME, - ITEM_COVERAGE, - ITEM_ATTACK_SPEED, - ITEM_WET_PROTECTION, - NUM_MOD - }; static void load_enchantment( const JsonObject &jo, const std::string &src ); void load( const JsonObject &jo, const std::string &src = "" ); @@ -196,8 +125,20 @@ class enchantment // adds two enchantments together and ignores their conditions void force_add( const enchantment &rhs ); + void set_has( has value ); + + void add_value_add( enchant_vals::mod value, int add_value ); + void add_value_mult( enchant_vals::mod value, float mult_value ); + + void add_hit_me( const fake_spell &sp ); + void add_hit_you( const fake_spell &sp ); + int get_value_add( enchant_vals::mod value ) const; double get_value_multiply( enchant_vals::mod value ) const; + // the standard way of modifying a value, adds then multiplies. + double modify_value( enchant_vals::mod mod_val, double value ) const; + units::energy modify_value( enchant_vals::mod mod_val, units::energy value ) const; + units::mass modify_value( enchant_vals::mod mod_val, units::mass value ) const; // this enchantment has a valid condition and is in the right location bool is_active( const Character &guy, const item &parent ) const; @@ -250,4 +191,21 @@ class enchantment const fake_spell &sp ) const; }; +template struct enum_traits; + +template<> +struct enum_traits { + static constexpr enchantment::has last = enchantment::has::NUM_HAS; +}; + +template<> +struct enum_traits { + static constexpr enchantment::condition last = enchantment::condition::NUM_CONDITION; +}; + +template<> +struct enum_traits { + static constexpr enchant_vals::mod last = enchant_vals::mod::NUM_MOD; +}; + #endif // CATA_SRC_MAGIC_ENCHANTMENT_H diff --git a/src/magic_spell_effect.cpp b/src/magic_spell_effect.cpp index 53ba12e59539e..6116154f6ff24 100644 --- a/src/magic_spell_effect.cpp +++ b/src/magic_spell_effect.cpp @@ -32,6 +32,7 @@ #include "magic_spell_effect_helpers.h" #include "magic_teleporter_list.h" #include "magic_ter_furn_transform.h" +#include "monstergenerator.h" #include "map.h" #include "map_iterator.h" #include "messages.h" @@ -52,6 +53,8 @@ #include "vehicle.h" #include "vpart_position.h" +static const mtype_id mon_generator( "mon_generator" ); + namespace spell_detail { struct line_iterable { @@ -125,7 +128,7 @@ static void swap_pos( Creature &caster, const tripoint &target ) critter->setpos( caster.pos() ); caster.setpos( target ); //update map in case a monster swapped positions with the player - g->update_map( g->u ); + g->update_map( get_player_character() ); } void spell_effect::pain_split( const spell &sp, Creature &caster, const tripoint & ) @@ -139,18 +142,15 @@ void spell_effect::pain_split( const spell &sp, Creature &caster, const tripoint int num_limbs = 0; // number of limbs effected (broken don't count) int total_hp = 0; // total hp among limbs - for( const int &part : p->hp_cur ) { - if( part != 0 ) { - num_limbs++; - total_hp += part; - } - } - for( int &part : p->hp_cur ) { - const int hp_each = total_hp / num_limbs; - if( part != 0 ) { - part = hp_each; + for( const std::pair &elem : p->get_body() ) { + if( elem.first == bodypart_str_id( "num_bp" ) ) { + continue; } + num_limbs++; + total_hp += elem.second.get_hp_cur(); } + const int hp_each = total_hp / num_limbs; + p->set_all_parts_hp_cur( hp_each ); } static bool in_spell_aoe( const tripoint &start, const tripoint &end, const int &radius, @@ -162,9 +162,10 @@ static bool in_spell_aoe( const tripoint &start, const tripoint &end, const int if( ignore_walls ) { return true; } + map &here = get_map(); const std::vector trajectory = line_to( start, end ); for( const tripoint &pt : trajectory ) { - if( g->m.impassable( pt ) ) { + if( here.impassable( pt ) ) { return false; } } @@ -176,7 +177,7 @@ std::set spell_effect::spell_effect_blast( const spell &, const tripoi { std::set targets; // TODO: Make this breadth-first - for( const tripoint &potential_target : g->m.points_in_radius( target, aoe_radius ) ) { + for( const tripoint &potential_target : get_map().points_in_radius( target, aoe_radius ) ) { if( in_spell_aoe( target, potential_target, aoe_radius, ignore_walls ) ) { targets.emplace( potential_target ); } @@ -201,7 +202,7 @@ std::set spell_effect::spell_effect_cone( const spell &sp, const tripo for( const tripoint &ep : end_points ) { std::vector trajectory = line_to( source, ep ); for( const tripoint &tp : trajectory ) { - if( ignore_walls || g->m.passable( tp ) ) { + if( ignore_walls || get_map().passable( tp ) ) { targets.emplace( tp ); } else { break; @@ -219,7 +220,7 @@ static bool test_always_true( const tripoint & ) } static bool test_passable( const tripoint &p ) { - return g->m.passable( p ); + return get_map().passable( p ); } std::set spell_effect::spell_effect_line( const spell &, const tripoint &source, @@ -389,7 +390,7 @@ static std::set spell_effect_area( const spell &sp, const tripoint &ta explosion_colors[pt] = sp.damage_type_color(); } - explosion_handler::draw_custom_explosion( g->u.pos(), explosion_colors ); + explosion_handler::draw_custom_explosion( get_player_character().pos(), explosion_colors ); return targets; } @@ -419,12 +420,16 @@ static void add_effect_to_target( const tripoint &target, const spell &sp ) static void damage_targets( const spell &sp, Creature &caster, const std::set &targets ) { + map &here = get_map(); for( const tripoint &target : targets ) { if( !sp.is_valid_target( caster, target ) ) { continue; } sp.make_sound( target ); sp.create_field( target ); + if( sp.has_flag( spell_flag::IGNITE_FLAMMABLE ) && here.is_flammable( target ) ) { + here.add_field( target, fd_fire, 1, 10_minutes ); + } Creature *const cr = g->critter_at( target ); if( !cr ) { continue; @@ -459,7 +464,7 @@ void spell_effect::projectile_attack( const spell &sp, Creature &caster, { std::vector trajectory = line_to( caster.pos(), target ); for( std::vector::iterator iter = trajectory.begin(); iter != trajectory.end(); iter++ ) { - if( g->m.impassable( *iter ) ) { + if( get_map().impassable( *iter ) ) { if( iter != trajectory.begin() ) { target_attack( sp, caster, *( iter - 1 ) ); } else { @@ -481,6 +486,72 @@ void spell_effect::target_attack( const spell &sp, Creature &caster, } } +static void magical_polymorph( monster &victim, Creature &caster, const spell &sp ) +{ + mtype_id new_id = mtype_id( sp.effect_data() ); + + if( sp.has_flag( spell_flag::POLYMORPH_GROUP ) ) { + const mongroup_id group_id( sp.effect_data() ); + new_id = MonsterGroupManager::GetRandomMonsterFromGroup( group_id ); + } + + // if effect_str is empty, we become a random monster of close difficulty + if( new_id.is_empty() ) { + int victim_diff = victim.type->difficulty; + const std::vector &mtypes = MonsterGenerator::generator().get_all_mtypes(); + for( int difficulty_variance = 1; difficulty_variance < 2048; difficulty_variance *= 2 ) { + unsigned int random_entry = rng( 0, mtypes.size() ); + unsigned int iter = random_entry + 1; + while( iter != random_entry && new_id.is_empty() ) { + if( iter >= mtypes.size() ) { + iter = 0; + } + if( ( mtypes[iter].id != victim.type->id ) && ( std::abs( mtypes[iter].difficulty - victim_diff ) + <= difficulty_variance ) ) { + if( !mtypes[iter].in_species( species_id( "HALLUCINATION" ) ) && + mtypes[iter].id != mon_generator ) { + new_id = mtypes[iter].id; + break; + } + } + iter++; + } + } + } + + if( !new_id.is_valid() ) { + debugmsg( "magical_polymorph called with an invalid monster id" ); + return; + } + + if( get_player_character().sees( victim ) ) { + add_msg( _( "The %s transforms into a %s." ), victim.type->nname(), + new_id->nname() ); + } + victim.poly( new_id ); + + if( sp.has_flag( spell_flag::FRIENDLY_POLY ) ) { + if( caster.as_player() ) { + victim.friendly = -1; + } else { + victim.make_ally( *caster.as_monster() ); + } + } +} + +void spell_effect::targeted_polymorph( const spell &sp, Creature &caster, const tripoint &target ) +{ + //we only target monsters for now. + if( monster *const victim = g->critter_at( target ) ) { + if( victim->get_hp() < sp.damage() ) { + magical_polymorph( *victim, caster, sp ); + return; + } + } + //victim had high hp, or isn't a monster. + caster.add_msg_if_player( m_bad, _( "Your target resists transformation." ) ); +} + void spell_effect::cone_attack( const spell &sp, Creature &caster, const tripoint &target ) { @@ -536,6 +607,7 @@ int area_expander::run( const tripoint ¢er ) // Number of nodes expanded. int expanded = 0; + map &here = get_map(); while( !frontier.empty() ) { int best_index = frontier.top(); frontier.pop(); @@ -544,7 +616,7 @@ int area_expander::run( const tripoint ¢er ) for( size_t i = 0; i < 8; i++ ) { tripoint pt = best.position + point( x_offset[ i ], y_offset[ i ] ); - if( g->m.impassable( pt ) ) { + if( here.impassable( pt ) ) { continue; } @@ -603,7 +675,7 @@ static void spell_move( const spell &sp, const Creature &caster, if( can_target_creature ) { if( Creature *victim = g->critter_at( from ) ) { - Creature::Attitude cr_att = victim->attitude_to( g->u ); + Creature::Attitude cr_att = victim->attitude_to( get_player_character() ); bool valid = cr_att != Creature::Attitude::FRIENDLY && sp.is_valid_effect_target( spell_target::hostile ); valid |= cr_att == Creature::Attitude::FRIENDLY && sp.is_valid_effect_target( spell_target::ally ); @@ -614,10 +686,11 @@ static void spell_move( const spell &sp, const Creature &caster, } } + map &here = get_map(); // Moving items if( sp.is_valid_effect_target( spell_target::item ) ) { - map_stack src_items = g->m.i_at( from ); - map_stack dst_items = g->m.i_at( to ); + map_stack src_items = here.i_at( from ); + map_stack dst_items = here.i_at( to ); for( const item &item : src_items ) { dst_items.insert( item ); } @@ -625,15 +698,15 @@ static void spell_move( const spell &sp, const Creature &caster, } // Helper function to move particular field type if corresponding target flag is enabled. - auto move_field = [&sp, from, to]( spell_target target, field_type_id fid ) { + auto move_field = [&sp, from, to, &here]( spell_target target, field_type_id fid ) { if( !sp.is_valid_effect_target( target ) ) { return; } - auto &src_field = g->m.field_at( from ); + auto &src_field = here.field_at( from ); if( field_entry *entry = src_field.find_field( fid ) ) { int intensity = entry->get_field_intensity(); - g->m.remove_field( from, fid ); - g->m.set_field_intensity( to, fid, intensity ); + here.remove_field( from, fid ); + here.set_field_intensity( to, fid, intensity ); } }; // Moving fields. @@ -691,17 +764,18 @@ void spell_effect::spawn_ethereal_item( const spell &sp, Creature &caster, const if( sp.has_flag( spell_flag::WITH_CONTAINER ) ) { granted = granted.in_its_container(); } - if( g->u.can_wear( granted ).success() ) { + avatar &player_character = get_avatar(); + if( player_character.can_wear( granted ).success() ) { granted.set_flag( "FIT" ); - g->u.wear_item( granted, false ); - } else if( !g->u.is_armed() && g->u.wield( granted, 0 ) ) { + player_character.wear_item( granted, false ); + } else if( !player_character.is_armed() && player_character.wield( granted, 0 ) ) { // nothing to do } else { - g->u.i_add( granted ); + player_character.i_add( granted ); } if( !granted.count_by_charges() ) { for( int i = 1; i < sp.damage(); i++ ) { - g->u.i_add( granted ); + player_character.i_add( granted ); } } sp.make_sound( caster.pos() ); @@ -839,11 +913,12 @@ void spell_effect::spawn_summoned_monster( const spell &sp, Creature &caster, void spell_effect::spawn_summoned_vehicle( const spell &sp, Creature &caster, const tripoint &target ) { - if( g->m.veh_at( target ) ) { + ::map &here = get_map(); + if( here.veh_at( target ) ) { caster.add_msg_if_player( m_bad, _( "There is already a vehicle there." ) ); return; } - if( vehicle *veh = g->m.add_vehicle( sp.summon_vehicle_id(), target, -90, 100, 0 ) ) { + if( vehicle *veh = here.add_vehicle( sp.summon_vehicle_id(), target, -90, 100, 0 ) ) { veh->magic = true; if( !sp.has_flag( spell_flag::PERMANENT ) ) { veh->summon_time_limit = sp.duration_turns(); @@ -1015,12 +1090,13 @@ void spell_effect::mutate( const spell &sp, Creature &caster, const tripoint &ta void spell_effect::bash( const spell &sp, Creature &caster, const tripoint &target ) { + ::map &here = get_map(); const std::set area = spell_effect_blast( sp, caster.pos(), target, sp.aoe(), false ); for( const tripoint &potential_target : area ) { if( !sp.is_valid_target( caster, potential_target ) ) { continue; } // the bash already makes noise, so no need for spell::make_sound() - g->m.bash( potential_target, sp.damage(), sp.has_flag( spell_flag::SILENT ) ); + here.bash( potential_target, sp.damage(), sp.has_flag( spell_flag::SILENT ) ); } } diff --git a/src/magic_teleporter_list.cpp b/src/magic_teleporter_list.cpp index c50bb36e846a2..3de08f1fa71db 100644 --- a/src/magic_teleporter_list.cpp +++ b/src/magic_teleporter_list.cpp @@ -9,6 +9,7 @@ #include "bodypart.h" #include "calendar.h" #include "catacharset.h" +#include "character.h" #include "color.h" #include "coordinate_conversions.h" #include "enums.h" @@ -70,7 +71,7 @@ static cata::optional find_valid_teleporters_omt( const tripoint &omt_ return cata::nullopt; } -bool teleporter_list::place_avatar_overmap( avatar &you, const tripoint &omt_pt ) const +bool teleporter_list::place_avatar_overmap( Character &you, const tripoint &omt_pt ) const { tinymap omt_dest( 2, true ); tripoint sm_dest = omt_to_sm_copy( omt_pt ); @@ -101,9 +102,9 @@ void teleporter_list::translocate( const std::set &targets ) bool valid_targets = false; for( const tripoint &pt : targets ) { - avatar *you = g->critter_at( pt ); + Character *you = g->critter_at( pt ); - if( you ) { + if( you && you->is_avatar() ) { valid_targets = true; if( !place_avatar_overmap( *you, *omt_dest ) ) { add_msg( _( "Failed to teleport. Teleporter obstructed or destroyed." ) ); @@ -169,11 +170,13 @@ class teleporter_callback : public uilist_callback mvwputch( menu->window, point( start_x, i ), c_magenta, LINE_XOXO ); } if( entnum >= 0 && static_cast( entnum ) < index_pairs.size() ) { - overmap_ui::draw_overmap_chunk( menu->window, g->u, index_pairs[entnum], point( start_x + 1, 1 ), + avatar &player_character = get_avatar(); + overmap_ui::draw_overmap_chunk( menu->window, player_character, index_pairs[entnum], + point( start_x + 1, 1 ), 29, 21 ); mvwprintz( menu->window, point( start_x + 2, 1 ), c_white, string_format( _( "Distance: %d (%d, %d)" ), - rl_dist( ms_to_omt_copy( g->m.getabs( g->u.pos() ) ), index_pairs[entnum] ), + rl_dist( ms_to_omt_copy( get_map().getabs( player_character.pos() ) ), index_pairs[entnum] ), index_pairs[entnum].x, index_pairs[entnum].y ) ); } wnoutrefresh( menu->window ); diff --git a/src/magic_teleporter_list.h b/src/magic_teleporter_list.h index 4e925c0d37477..f06d7c8a7bd2c 100644 --- a/src/magic_teleporter_list.h +++ b/src/magic_teleporter_list.h @@ -9,7 +9,7 @@ #include "optional.h" #include "point.h" -class avatar; +class Character; class JsonIn; class JsonOut; @@ -23,7 +23,7 @@ class teleporter_list cata::optional choose_teleport_location(); // returns true if a teleport is successful // does not do any loading or unloading - bool place_avatar_overmap( avatar &you, const tripoint &omt_pt ) const; + bool place_avatar_overmap( Character &you, const tripoint &omt_pt ) const; public: bool knows_translocator( const tripoint &omt_pos ) const; // adds teleporter to known_teleporters and does any other activation necessary diff --git a/src/main_menu.cpp b/src/main_menu.cpp index 89c437fe55200..413e050f29b46 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -28,6 +28,7 @@ #include "loading_ui.h" #include "mapbuffer.h" #include "mapsharing.h" +#include "messages.h" #include "optional.h" #include "options.h" #include "output.h" @@ -160,10 +161,10 @@ void main_menu::print_menu( const catacurses::window &w_open, int iSel, const po } if( mmenu_title.size() > 1 ) { - for( size_t i = 0; i < mmenu_title.size(); ++i ) { + for( const std::string &i_title : mmenu_title ) { nc_color cur_color = c_white; nc_color base_color = c_white; - print_colored_text( w_open, point( iOffsetX, iLine++ ), cur_color, base_color, mmenu_title[i] ); + print_colored_text( w_open, point( iOffsetX, iLine++ ), cur_color, base_color, i_title ); } } else { center_print( w_open, iLine++, c_light_cyan, mmenu_title[0] ); @@ -974,7 +975,7 @@ bool main_menu::new_character_tab() } // end while if( start ) { - g->u.add_msg_if_player( g->scen->description( g->u.male ) ); + add_msg( g->scen->description( g->u.male ) ); world_generator->last_world_name = world_generator->active_world->world_name; world_generator->last_character_name = g->u.name; diff --git a/src/map.cpp b/src/map.cpp index e63a9395ca55e..fe16c37d2118c 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1,6 +1,7 @@ #include "map.h" #include +#include #include #include #include @@ -113,8 +114,6 @@ static const itype_id itype_welder( "welder" ); static const mtype_id mon_zombie( "mon_zombie" ); -static const skill_id skill_traps( "traps" ); - static const efftype_id effect_boomered( "boomered" ); static const efftype_id effect_crushed( "crushed" ); @@ -243,53 +242,42 @@ void map::add_vehicle_to_cache( vehicle *veh ) return; } - auto &ch = get_cache( veh->sm_pos.z ); - ch.veh_in_active_range = true; // Get parts for( const vpart_reference &vpr : veh->get_all_parts() ) { if( vpr.part().removed ) { continue; } const tripoint p = veh->global_part_pos3( vpr.part() ); - ch.veh_cached_parts.insert( std::make_pair( p, - std::make_pair( veh, static_cast( vpr.part_index() ) ) ) ); + level_cache &ch = get_cache( p.z ); + ch.veh_in_active_range = true; + ch.veh_cached_parts[p] = std::make_pair( veh, static_cast( vpr.part_index() ) ); if( inbounds( p ) ) { ch.veh_exists_at[p.x][p.y] = true; } } } -void map::update_vehicle_cache( vehicle *veh, const int old_zlevel ) +void map::clear_vehicle_point_from_cache( vehicle *veh, const tripoint &pt ) { if( veh == nullptr ) { debugmsg( "Tried to add null vehicle to cache" ); return; } - // Existing must be cleared - auto &ch = get_cache( old_zlevel ); - auto it = ch.veh_cached_parts.begin(); - const auto end = ch.veh_cached_parts.end(); - while( it != end ) { - if( it->second.first == veh ) { - const tripoint p = it->first; - if( inbounds( p ) ) { - ch.veh_exists_at[p.x][p.y] = false; - } - ch.veh_cached_parts.erase( it++ ); - // If something was resting on vehicle, drop it - support_dirty( tripoint( p.xy(), old_zlevel + 1 ) ); - } else { - ++it; - } + level_cache &ch = get_cache( pt.z ); + if( inbounds( pt ) ) { + ch.veh_exists_at[pt.x][pt.y] = false; + } + auto it = ch.veh_cached_parts.find( pt ); + if( it != ch.veh_cached_parts.end() && it->second.first == veh ) { + ch.veh_cached_parts.erase( it ); } - add_vehicle_to_cache( veh ); } void map::clear_vehicle_cache( const int zlev ) { - auto &ch = get_cache( zlev ); + level_cache &ch = get_cache( zlev ); while( !ch.veh_cached_parts.empty() ) { const auto part = ch.veh_cached_parts.begin(); const auto &p = part->first; @@ -298,6 +286,7 @@ void map::clear_vehicle_cache( const int zlev ) } ch.veh_cached_parts.erase( part ); } + ch.veh_in_active_range = false; } void map::clear_vehicle_list( const int zlev ) @@ -310,7 +299,7 @@ void map::clear_vehicle_list( const int zlev ) void map::update_vehicle_list( const submap *const to, const int zlev ) { // Update vehicle data - auto &ch = get_cache( zlev ); + level_cache &ch = get_cache( zlev ); for( const auto &elem : to->vehicles ) { ch.vehicle_list.insert( elem.get() ); if( !elem->loot_zones.empty() ) { @@ -343,7 +332,7 @@ std::unique_ptr map::detach_vehicle( vehicle *veh ) } veh->invalidate_towing( true ); submap *const current_submap = get_submap_at_grid( veh->sm_pos ); - auto &ch = get_cache( z ); + level_cache &ch = get_cache( z ); for( size_t i = 0; i < current_submap->vehicles.size(); i++ ) { if( current_submap->vehicles[i].get() == veh ) { ch.vehicle_list.erase( veh ); @@ -454,6 +443,23 @@ bool map::vehproceed( VehicleList &vehicle_list ) if( cur_veh->v == nullptr ) { vehicle_list = get_vehicles(); } + + // confirm that veh_in_active_range is still correct for each z-level + int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; + int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + for( int zlev = minz; zlev <= maxz; ++zlev ) { + level_cache &cache = get_cache( zlev ); + + // Check if any vehicles exist in the active range for this z-level + cache.veh_in_active_range = cache.veh_in_active_range && + std::any_of( std::begin( cache.veh_exists_at ), + std::end( cache.veh_exists_at ), []( const auto & row ) { + return std::any_of( std::begin( row ), std::end( row ), []( bool veh_exists ) { + return veh_exists; + } ); + } ); + } + return true; } @@ -629,9 +635,11 @@ vehicle *map::move_vehicle( vehicle &veh, const tripoint &dp, const tileray &fac veh.on_move(); // Actually change position displace_vehicle( *new_vehicle, dp1 ); + level_vehicle( *new_vehicle ); } else if( !vertical ) { veh.stop(); } + veh.check_falling_or_floating(); // If the PC is in the currently moved vehicle, adjust the // view offset. if( g->u.controlling_vehicle && veh_pointer_or_null( veh_at( g->u.pos() ) ) == &veh ) { @@ -940,7 +948,7 @@ VehicleList map::get_vehicles( const tripoint &start, const tripoint &end ) optional_vpart_position map::veh_at( const tripoint &p ) const { - if( !const_cast( this )->get_cache( p.z ).veh_in_active_range || !inbounds( p ) ) { + if( !inbounds( p ) || !const_cast( this )->get_cache( p.z ).veh_in_active_range ) { return optional_vpart_position( cata::nullopt ); } @@ -956,7 +964,7 @@ optional_vpart_position map::veh_at( const tripoint &p ) const const vehicle *map::veh_at_internal( const tripoint &p, int &part_num ) const { // This function is called A LOT. Move as much out of here as possible. - const auto &ch = get_cache_ref( p.z ); + const level_cache &ch = get_cache( p.z ); if( !ch.veh_in_active_range || !ch.veh_exists_at[p.x][p.y] ) { part_num = -1; return nullptr; // Clear cache indicates no vehicle. This should optimize a great deal. @@ -978,7 +986,7 @@ vehicle *map::veh_at_internal( const tripoint &p, int &part_num ) return const_cast( const_cast( this )->veh_at_internal( p, part_num ) ); } -void map::board_vehicle( const tripoint &pos, player *p ) +void map::board_vehicle( const tripoint &pos, Character *p ) { if( p == nullptr ) { debugmsg( "map::board_vehicle: null player" ); @@ -988,7 +996,9 @@ void map::board_vehicle( const tripoint &pos, player *p ) const cata::optional vp = veh_at( pos ).part_with_feature( VPFLAG_BOARDABLE, true ); if( !vp ) { - if( p->grab_point.x == 0 && p->grab_point.y == 0 ) { + avatar *player_character = p->as_avatar(); + if( player_character != nullptr && + player_character->grab_point.x == 0 && player_character->grab_point.y == 0 ) { debugmsg( "map::board_vehicle: vehicle not found" ); } return; @@ -1005,12 +1015,12 @@ void map::board_vehicle( const tripoint &pos, player *p ) p->setpos( pos ); p->in_vehicle = true; - if( p == &g->u ) { + if( p->is_avatar() ) { g->update_map( g->u ); } } -void map::unboard_vehicle( const vpart_reference &vp, player *passenger, bool dead_passenger ) +void map::unboard_vehicle( const vpart_reference &vp, Character *passenger, bool dead_passenger ) { // Mark the part as un-occupied regardless of whether there's a live passenger here. vp.part().remove_flag( vehicle_part::passenger_flag ); @@ -1048,12 +1058,22 @@ void map::unboard_vehicle( const tripoint &p, bool dead_passenger ) unboard_vehicle( *vp, passenger, dead_passenger ); } -bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) +bool map::displace_vehicle( vehicle &veh, const tripoint &dp, const bool adjust_pos, + const std::set &parts_to_move ) { - const tripoint p = veh.global_pos3(); - const tripoint p2 = p + dp; - const tripoint src = p; - const tripoint dst = p2; + const tripoint src = veh.global_pos3(); + // handle vehicle ramps + int ramp_offset = 0; + if( adjust_pos ) { + if( has_flag( TFLAG_RAMP_UP, src + dp ) ) { + ramp_offset += 1; + } else if( has_flag( TFLAG_RAMP_DOWN, src + dp ) ) { + ramp_offset -= 1; + } + } + + const tripoint dst = src + ( adjust_pos ? + ( dp + tripoint( 0, 0, ramp_offset ) ) : tripoint_zero ); if( !inbounds( src ) ) { add_msg( m_debug, "map::displace_vehicle: coordinates out of bounds %d,%d,%d->%d,%d,%d", @@ -1065,6 +1085,7 @@ bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) point dst_offset; submap *src_submap = get_submap_at( src, src_offset ); submap *const dst_submap = get_submap_at( dst, dst_offset ); + std::set smzs; // first, let's find our position in current vehicles vector size_t our_i = 0; @@ -1090,7 +1111,7 @@ bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) // move the vehicle // don't let it go off grid - if( !inbounds( p2 ) ) { + if( !inbounds( dst ) ) { veh.stop(); // Silent debug dbg( D_ERROR ) << "map:displace_vehicle: Stopping vehicle, displaced dp=(" @@ -1116,6 +1137,10 @@ bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) continue; } const int prt = r.prt; + if( !parts_to_move.empty() && parts_to_move.find( prt ) == parts_to_move.end() ) { + r.moved = true; + continue; + } Creature *psg = r.psg; const tripoint part_pos = veh.global_part_pos3( prt ); if( psg == nullptr ) { @@ -1132,52 +1157,69 @@ bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) "passenger at %d,%d,%d", prt, part_pos.x, part_pos.y, part_pos.z, psg->posx(), psg->posy(), psg->posz() ); } + const vehicle_part &veh_part = veh.part( prt ); + + // ramps make everything super tricky + int psg_offset_z = -ramp_offset; + tripoint next_pos; // defaults to 0,0,0 + if( parts_to_move.empty() ) { + next_pos = veh_part.precalc[1]; + } + if( has_flag( TFLAG_RAMP_UP, src + dp + next_pos ) ) { + psg_offset_z += 1; + } else if( has_flag( TFLAG_RAMP_DOWN, src + dp + next_pos ) ) { + psg_offset_z -= 1; + } // Place passenger on the new part location - const vehicle_part &veh_part = veh.part( prt ); - tripoint psgp( dp + part_pos.xy() - veh_part.precalc[0] + veh_part.precalc[1] + tripoint( 0, 0, - psg->posz() ) ); + tripoint psgp( dst + next_pos + tripoint( 0, 0, psg_offset_z ) ); // someone is in the way so try again if( g->critter_at( psgp ) ) { complete = false; continue; } - if( psg == &g->u ) { + if( psg->is_avatar() ) { // If passenger is you, we need to update the map need_update = true; - z_change = dp.z; + z_change = psgp.z - part_pos.z; } + psg->setpos( psgp ); r.moved = true; } } veh.shed_loose_parts(); - veh.advance_precalc_mounts( dst_offset, p2.z ); - + smzs = veh.advance_precalc_mounts( dst_offset, src, dp, ramp_offset, adjust_pos, parts_to_move ); if( src_submap != dst_submap ) { - veh.set_submap_moved( point( p2.x / SEEX, p2.y / SEEY ) ); + veh.set_submap_moved( tripoint( dst.x / SEEX, dst.y / SEEY, dst.z ) ); auto src_submap_veh_it = src_submap->vehicles.begin() + our_i; dst_submap->vehicles.push_back( std::move( *src_submap_veh_it ) ); src_submap->vehicles.erase( src_submap_veh_it ); dst_submap->is_uniform = false; } - update_vehicle_cache( &veh, src.z ); if( need_update ) { g->update_map( g->u ); } + add_vehicle_to_cache( &veh ); - if( z_change != 0 ) { - g->vertical_move( z_change, true ); - // I don't know why all this is needed, but the cache does not update properly without. + if( z_change || src.z != dst.z ) { + if( z_change ) { + g->vertical_move( z_change, true ); + // vertical moves can flush the caches, so make sure we're still in the cache + add_vehicle_to_cache( &veh ); + } update_vehicle_list( dst_submap, dst.z ); - update_vehicle_cache( &veh, src.z ); - level_cache &ch2 = get_cache( src.z ); - for( const vehicle *elem : ch2.vehicle_list ) { - if( elem == &veh ) { - ch2.vehicle_list.erase( &veh ); - ch2.zone_vehicles.erase( &veh ); - break; + // delete the vehicle from the source z-level vehicle cache set if it is no longer on + // that z-level + if( src.z != dst.z ) { + level_cache &ch2 = get_cache( src.z ); + for( const vehicle *elem : ch2.vehicle_list ) { + if( elem == &veh ) { + ch2.vehicle_list.erase( &veh ); + ch2.zone_vehicles.erase( &veh ); + break; + } } } veh.check_is_heli_landed(); @@ -1188,15 +1230,24 @@ bool map::displace_vehicle( vehicle &veh, const tripoint &dp ) g->setremoteveh( &veh ); } - veh.check_falling_or_floating(); - + // //global positions of vehicle loot zones have changed. veh.zones_dirty = true; - on_vehicle_moved( veh.sm_pos.z ); + for( int vsmz : smzs ) { + on_vehicle_moved( vsmz ); + } return true; } +void map::level_vehicle( vehicle &veh ) +{ + int cnt = 0; + while( !veh.level_vehicle() && cnt < ( 2 * OVERMAP_DEPTH ) ) { + cnt++; + } +} + bool map::displace_water( const tripoint &p ) { // Check for shallow water @@ -1713,7 +1764,7 @@ bool map::passable_ter_furn( const tripoint &p ) const int map::combined_movecost( const tripoint &from, const tripoint &to, const vehicle *ignored_vehicle, - const int modifier, const bool flying ) const + const int modifier, const bool flying, const bool via_ramp ) const { const int mults[4] = { 0, 50, 71, 100 }; const int cost1 = move_cost( from, ignored_vehicle ); @@ -1726,7 +1777,7 @@ int map::combined_movecost( const tripoint &from, const tripoint &to, } // Inter-z-level movement by foot (not flying) - if( !valid_move( from, to, false ) ) { + if( !valid_move( from, to, false, via_ramp ) ) { return 0; } @@ -1735,7 +1786,7 @@ int map::combined_movecost( const tripoint &from, const tripoint &to, } bool map::valid_move( const tripoint &from, const tripoint &to, - const bool bash, const bool flying ) const + const bool bash, const bool flying, const bool via_ramp ) const { // Used to account for the fact that older versions of GCC can trip on the if statement here. assert( to.z > std::numeric_limits::min() ); @@ -1767,7 +1818,7 @@ bool map::valid_move( const tripoint &from, const tripoint &to, // actually make a valid ledge drop location with zlevels on, this forces // at least one zlevel drop and if down_ter is impassible it's probably // inside a wall, we could workaround that further but it's unnecessary. - const bool up_is_ledge = tr_at( up_p ).loadid == tr_ledge; + const bool up_is_ledge = tr_at( up_p ) == tr_ledge; if( up_ter.movecost == 0 ) { // Unpassable tile @@ -1785,19 +1836,20 @@ bool map::valid_move( const tripoint &from, const tripoint &to, return false; } - if( !up_ter.has_flag( TFLAG_NO_FLOOR ) && !up_ter.has_flag( TFLAG_GOES_DOWN ) && !up_is_ledge ) { + if( !up_ter.has_flag( TFLAG_NO_FLOOR ) && !up_ter.has_flag( TFLAG_GOES_DOWN ) && !up_is_ledge && + !via_ramp ) { // Can't move from up to down if( std::abs( from.x - to.x ) == 1 || std::abs( from.y - to.y ) == 1 ) { // Break the move into two - vertical then horizontal tripoint midpoint( down_p.xy(), up_p.z ); - return valid_move( down_p, midpoint, bash, flying ) && - valid_move( midpoint, up_p, bash, flying ); + return valid_move( down_p, midpoint, bash, flying, via_ramp ) && + valid_move( midpoint, up_p, bash, flying, via_ramp ); } return false; } if( !flying && !down_ter.has_flag( TFLAG_GOES_UP ) && !down_ter.has_flag( TFLAG_RAMP ) && - !up_is_ledge ) { + !up_is_ledge && !via_ramp ) { // Can't safely reach the lower tile return false; } @@ -1853,7 +1905,8 @@ int map::climb_difficulty( const tripoint &p ) const if( has_flag( "LADDER", p ) ) { // Really easy, but you have to stand on the tile return 1; - } else if( has_flag( TFLAG_RAMP, p ) ) { + } else if( has_flag( TFLAG_RAMP, p ) || has_flag( TFLAG_RAMP_UP, p ) || + has_flag( TFLAG_RAMP_DOWN, p ) ) { // We're on something stair-like, so halfway there already best_difficulty = 7; } @@ -2661,6 +2714,16 @@ bool map::has_nearby_chair( const tripoint &p, int radius ) return false; } +bool map::has_nearby_ter( const tripoint &p, const ter_id &type, int radius ) +{ + for( const tripoint &pt : points_in_radius( p, radius ) ) { + if( ter( pt ) == type ) { + return true; + } + } + return false; +} + bool map::mop_spills( const tripoint &p ) { bool retval = false; @@ -3347,10 +3410,12 @@ void map::bash_vehicle( const tripoint &p, bash_params ¶ms ) void map::bash_field( const tripoint &p, bash_params ¶ms ) { - if( get_field( p, fd_web ) != nullptr ) { - params.did_bash = true; - params.bashed_solid = true; // To prevent bashing furniture/vehicles - remove_field( p, fd_web ); + for( const std::pair &fd : field_at( p ) ) { + if( fd.first->bash_info.str_min > -1 ) { + params.did_bash = true; + params.bashed_solid = true; // To prevent bashing furniture/vehicles + remove_field( p, fd.first ); + } } } @@ -3642,7 +3707,7 @@ void map::shoot( const tripoint &p, projectile &proj, const bool hit_items ) for( const ammo_effect &ae : ammo_effects::get_all() ) { if( ammo_effects.count( ae.id.str() ) > 0 ) { if( x_in_y( ae.trail_chance, 100 ) ) { - g->m.add_field( p, ae.trail_field_type, rng( ae.trail_intensity_min, ae.trail_intensity_max ) ); + add_field( p, ae.trail_field_type, rng( ae.trail_intensity_min, ae.trail_intensity_max ) ); } } } @@ -3650,14 +3715,15 @@ void map::shoot( const tripoint &p, projectile &proj, const bool hit_items ) dam = std::max( 0.0f, dam ); // Check fields? - const field_entry *fieldhit = get_field( p, fd_web ); - if( fieldhit != nullptr ) { - if( inc ) { - add_field( p, fd_fire, fieldhit->get_field_intensity() - 1 ); - } else if( dam > 5 + fieldhit->get_field_intensity() * 5 && - one_in( 5 - fieldhit->get_field_intensity() ) ) { - dam -= rng( 1, 2 + fieldhit->get_field_intensity() * 2 ); - remove_field( p, fd_web ); + for( const std::pair &fd : field_at( p ) ) { + if( fd.first->bash_info.str_min > 0 ) { + if( inc ) { + add_field( p, fd_fire, fd.second.get_field_intensity() - 1 ); + } else if( dam > 5 + fd.second.get_field_intensity() * 5 && + one_in( 5 - fd.second.get_field_intensity() ) ) { + dam -= rng( 1, 2 + fd.second.get_field_intensity() * 2 ); + remove_field( p, fd.first ); + } } } @@ -4006,24 +4072,6 @@ void map::i_clear( const tripoint &p ) current_submap->get_items( l ).clear(); } -item &map::spawn_an_item( const tripoint &p, item new_item, - const int charges, const int damlevel ) -{ - if( charges && new_item.charges > 0 ) { - //let's fail silently if we specify charges for an item that doesn't support it - new_item.charges = charges; - } - new_item = new_item.in_its_container(); - if( ( new_item.made_of( phase_id::LIQUID ) && has_flag( "SWIMMABLE", p ) ) || - has_flag( "DESTROY_ITEM", p ) ) { - return null_item_reference(); - } - - new_item.set_damage( damlevel ); - - return add_item_or_charges( p, new_item ); -} - std::vector map::spawn_items( const tripoint &p, const std::vector &new_items ) { std::vector ret; @@ -4045,14 +4093,14 @@ std::vector map::spawn_items( const tripoint &p, const std::vector return ret; } -void map::spawn_artifact( const tripoint &p ) +void map::spawn_artifact( const tripoint &p, const relic_procgen_id &id ) { - add_item_or_charges( p, item( new_artifact(), 0 ) ); -} + relic_procgen_data::generation_rules rules; + rules.max_attributes = 5; + rules.power_level = 1000; + rules.max_negative_power = -2000; -void map::spawn_natural_artifact( const tripoint &p, artifact_natural_property prop ) -{ - add_item_or_charges( p, item( new_natural_artifact( prop ), 0 ) ); + add_item_or_charges( p, id->create_item( rules ) ); } void map::spawn_item( const tripoint &p, const itype_id &type_id, @@ -4076,7 +4124,19 @@ void map::spawn_item( const tripoint &p, const itype_id &type_id, new_item.item_tags.insert( "FIT" ); } - spawn_an_item( p, new_item, charges, damlevel ); + if( charges && new_item.charges > 0 ) { + //let's fail silently if we specify charges for an item that doesn't support it + new_item.charges = charges; + } + new_item = new_item.in_its_container(); + if( ( new_item.made_of( phase_id::LIQUID ) && has_flag( "SWIMMABLE", p ) ) || + has_flag( "DESTROY_ITEM", p ) ) { + return; + } + + new_item.set_damage( damlevel ); + + add_item_or_charges( p, new_item ); } units::volume map::max_volume( const tripoint &p ) @@ -4168,7 +4228,7 @@ item &map::add_item_or_charges( const tripoint &pos, item obj, bool overflow ) } else if( overflow ) { // ...otherwise try to overflow to adjacent tiles (if permitted) const int max_dist = 2; - std::vector tiles = closest_tripoints_first( pos, max_dist ); + std::vector tiles = closest_points_first( pos, max_dist ); tiles.erase( tiles.begin() ); // we already tried this position const int max_path_length = 4 * max_dist; const pathfinding_settings setting( 0, max_dist, max_path_length, 0, false, true, false, false, @@ -4335,7 +4395,7 @@ void map::update_lum( item_location &loc, bool add ) static bool process_map_items( item_stack &items, safe_reference &item_ref, const tripoint &location, const float insulation, const temperature_flag flag ) { - if( item_ref->process( nullptr, location, false, insulation, flag ) ) { + if( item_ref->process( nullptr, location, insulation, flag ) ) { // Item is to be destroyed so erase it from the map stack // unless it was already destroyed by processing. if( item_ref ) { @@ -4732,7 +4792,8 @@ std::list use_charges_from_stack( Stack stack, const itype_id &type, int & } static void use_charges_from_furn( const furn_t &f, const itype_id &type, int &quantity, - map *m, const tripoint &p, std::list &ret, const std::function &filter ) + map *m, const tripoint &p, std::list &ret, + const std::function &filter ) { if( m->has_flag( "LIQUIDCONT", p ) ) { map_stack item_list = m->i_at( p ); @@ -5008,6 +5069,11 @@ std::list > map::get_rc_items( const tripoint &p ) return rc_pairs; } +bool map::can_see_trap_at( const tripoint &p, const Character &c ) const +{ + return tr_at( p ).can_see( p, c ); +} + const trap &map::tr_at( const tripoint &p ) const { if( !inbounds( p ) ) { @@ -5086,64 +5152,6 @@ void map::trap_set( const tripoint &p, const trap_id &type ) } } -void map::disarm_trap( const tripoint &p ) -{ - const trap &tr = tr_at( p ); - if( tr.is_null() ) { - debugmsg( "Tried to disarm a trap where there was none (%d %d %d)", p.x, p.y, p.z ); - return; - } - - const int tSkillLevel = g->u.get_skill_level( skill_traps ); - const int diff = tr.get_difficulty(); - int roll = rng( tSkillLevel, 4 * tSkillLevel ); - - // Some traps are not actual traps. Skip the rolls, different message and give the option to grab it right away. - if( tr.get_avoidance() == 0 && tr.get_difficulty() == 0 ) { - add_msg( _( "The %s is taken down." ), tr.name() ); - tr.on_disarmed( *this, p ); - return; - } - - ///\EFFECT_PER increases chance of disarming trap - - ///\EFFECT_DEX increases chance of disarming trap - - ///\EFFECT_TRAPS increases chance of disarming trap - while( ( rng( 5, 20 ) < g->u.per_cur || rng( 1, 20 ) < g->u.dex_cur ) && roll < 50 ) { - roll++; - } - if( roll >= diff ) { - add_msg( _( "You disarm the trap!" ) ); - const int morale_buff = tr.get_avoidance() * 0.4 + tr.get_difficulty() + rng( 0, 4 ); - g->u.rem_morale( MORALE_FAILURE ); - g->u.add_morale( MORALE_ACCOMPLISHMENT, morale_buff, 40 ); - tr.on_disarmed( *this, p ); - if( diff > 1.25 * tSkillLevel ) { // failure might have set off trap - g->u.practice( skill_traps, 1.5 * ( diff - tSkillLevel ) ); - } - } else if( roll >= diff * .8 ) { - add_msg( _( "You fail to disarm the trap." ) ); - const int morale_debuff = -rng( 6, 18 ); - g->u.rem_morale( MORALE_ACCOMPLISHMENT ); - g->u.add_morale( MORALE_FAILURE, morale_debuff, -40 ); - if( diff > 1.25 * tSkillLevel ) { - g->u.practice( skill_traps, 1.5 * ( diff - tSkillLevel ) ); - } - } else { - add_msg( m_bad, _( "You fail to disarm the trap, and you set it off!" ) ); - const int morale_debuff = -rng( 12, 24 ); - g->u.rem_morale( MORALE_ACCOMPLISHMENT ); - g->u.add_morale( MORALE_FAILURE, morale_debuff, -40 ); - tr.trigger( p, &g->u ); - if( diff - roll <= 6 ) { - // Give xp for failing, but not if we failed terribly (in which - // case the trap may not be disarmable). - g->u.practice( skill_traps, 2 * diff ); - } - } -} - void map::remove_trap( const tripoint &p ) { if( !inbounds( p ) ) { @@ -5155,7 +5163,7 @@ void map::remove_trap( const tripoint &p ) trap_id tid = current_submap->get_trap( l ); if( tid != tr_null ) { - if( g != nullptr && this == &g->m ) { + if( g != nullptr && this == &get_map() ) { g->u.add_known_trap( p, tr_null.obj() ); } @@ -5223,7 +5231,8 @@ time_duration map::set_field_age( const tripoint &p, const field_type_id &type, * set intensity of field type at point, creating if not present, removing if intensity is 0 * returns resulting intensity, or 0 for not present */ -int map::set_field_intensity( const tripoint &p, const field_type_id &type, const int new_intensity, +int map::set_field_intensity( const tripoint &p, const field_type_id &type, + const int new_intensity, bool isoffset ) { field_entry *field_ptr = get_field( p, type ); @@ -5309,7 +5318,7 @@ bool map::add_field( const tripoint &p, const field_type_id &type, int intensity } } - if( g != nullptr && this == &g->m && p == g->u.pos() ) { + if( g != nullptr && this == &get_map() && p == g->u.pos() ) { creature_in_field( g->u ); //Hit the player with the field if it spawned on top of them. } @@ -5345,7 +5354,7 @@ void map::remove_field( const tripoint &p, const field_type_id &field_to_remove p.y / SEEX ) * MAPSIZE ) ) ); } const auto &fdata = field_to_remove.obj(); - if( fdata.is_transparent() ) { + if( !fdata.is_transparent() ) { set_transparency_cache_dirty( p.z ); } if( fdata.is_dangerous() ) { @@ -5373,7 +5382,8 @@ void map::add_splatter( const field_type_id &type, const tripoint &where, int in mod_field_intensity( where, type, intensity ); } -void map::add_splatter_trail( const field_type_id &type, const tripoint &from, const tripoint &to ) +void map::add_splatter_trail( const field_type_id &type, const tripoint &from, + const tripoint &to ) { if( !type.id() ) { return; @@ -5390,7 +5400,8 @@ void map::add_splatter_trail( const field_type_id &type, const tripoint &from, c } } -void map::add_splash( const field_type_id &type, const tripoint ¢er, int radius, int intensity ) +void map::add_splash( const field_type_id &type, const tripoint ¢er, int radius, + int intensity ) { if( !type.id() ) { return; @@ -5501,7 +5512,8 @@ const visibility_variables &map::get_visibility_variables_cache() const return visibility_variables_cache; } -visibility_type map::get_visibility( const lit_level ll, const visibility_variables &cache ) const +visibility_type map::get_visibility( const lit_level ll, + const visibility_variables &cache ) const { switch( ll ) { case lit_level::DARK: @@ -5569,7 +5581,7 @@ bool map::draw_maptile_from_memory( const catacurses::window &w, const tripoint { int sym = g->u.get_memorized_symbol( getabs( p ) ); if( sym == 0 ) { - return false; + return true; } if( move_cursor ) { const int k = p.x + getmaxx( w ) / 2 - view_center.x; @@ -5579,7 +5591,7 @@ bool map::draw_maptile_from_memory( const catacurses::window &w, const tripoint } else { wputch( w, c_brown, sym ); } - return true; + return false; } void map::draw( const catacurses::window &w, const tripoint ¢er ) @@ -5614,7 +5626,7 @@ void map::draw( const catacurses::window &w, const tripoint ¢er ) x = center.x - getmaxx( w ) / 2; if( y < 0 || y >= MAPSIZE_Y ) { for( ; x < maxxrender; x++ ) { - if( !do_map_memory || !draw_maptile_from_memory( w, p, center, false ) ) { + if( !do_map_memory || draw_maptile_from_memory( w, p, center, false ) ) { wputch( w, c_black, ' ' ); } } @@ -5622,7 +5634,7 @@ void map::draw( const catacurses::window &w, const tripoint ¢er ) } while( x < 0 ) { - if( !do_map_memory || !draw_maptile_from_memory( w, p, center, false ) ) { + if( !do_map_memory || draw_maptile_from_memory( w, p, center, false ) ) { wputch( w, c_black, ' ' ); } x++; @@ -5639,15 +5651,17 @@ void map::draw( const catacurses::window &w, const tripoint ¢er ) const visibility_type vis = get_visibility( lighting, cache ); if( !apply_vision_effects( w, vis ) ) { const maptile curr_maptile = maptile( cur_submap, l ); - const bool just_this_zlevel = + const bool draw_lower_zlevel = draw_maptile( w, g->u, p, curr_maptile, false, true, center, - lighting == lit_level::LOW, lighting == lit_level::BRIGHT, true ); - if( !just_this_zlevel ) { + lighting == lit_level::LOW, + lighting == lit_level::BRIGHT, true ); + if( draw_lower_zlevel ) { p.z--; const maptile tile_below = maptile( sm_below, l ); draw_from_above( w, g->u, p, tile_below, false, center, - lighting == lit_level::LOW, lighting == lit_level::BRIGHT, false ); + lighting == lit_level::LOW, + lighting == lit_level::BRIGHT, false ); p.z++; } } else if( do_map_memory && ( vis == visibility_type::HIDDEN || vis == visibility_type::DARK ) ) { @@ -5660,7 +5674,7 @@ void map::draw( const catacurses::window &w, const tripoint ¢er ) } while( x < maxxrender ) { - if( !do_map_memory || !draw_maptile_from_memory( w, p, center, false ) ) { + if( !do_map_memory || draw_maptile_from_memory( w, p, center, false ) ) { wputch( w, c_black, ' ' ); } x++; @@ -5674,7 +5688,8 @@ void map::drawsq( const catacurses::window &w, player &u, const tripoint &p, drawsq( w, u, p, invert, show_items, u.pos() + u.view_offset, false, false, false ); } -void map::drawsq( const catacurses::window &w, player &u, const tripoint &p, const bool invert_arg, +void map::drawsq( const catacurses::window &w, player &u, const tripoint &p, + const bool invert_arg, const bool show_items_arg, const tripoint &view_center, const bool low_light, const bool bright_light, const bool inorder ) const { @@ -5691,9 +5706,9 @@ void map::drawsq( const catacurses::window &w, player &u, const tripoint &p, con } const maptile tile = maptile_at( p ); - const bool done = draw_maptile( w, u, p, tile, invert_arg, show_items_arg, + const bool more = draw_maptile( w, u, p, tile, invert_arg, show_items_arg, view_center, low_light, bright_light, inorder ); - if( !done ) { + if( more ) { tripoint below( p.xy(), p.z - 1 ); const maptile tile_below = maptile_at( below ); draw_from_above( w, u, below, tile_below, @@ -5703,11 +5718,13 @@ void map::drawsq( const catacurses::window &w, player &u, const tripoint &p, con } // a check to see if the lower floor needs to be rendered in tiles -bool map::need_draw_lower_floor( const tripoint &p ) +bool map::dont_draw_lower_floor( const tripoint &p ) { - return !( !zlevels || p.z <= -OVERMAP_DEPTH || !ter( p ).obj().has_flag( TFLAG_NO_FLOOR ) ); + return !zlevels || p.z <= -OVERMAP_DEPTH || + !( has_flag( TFLAG_NO_FLOOR, p ) || has_flag( TFLAG_Z_TRANSPARENT, p ) ); } +// returns true if lower z-level needs to be drawn, false otherwise bool map::draw_maptile( const catacurses::window &w, const player &u, const tripoint &p, const maptile &curr_maptile, bool invert, bool show_items, @@ -5898,8 +5915,9 @@ bool map::draw_maptile( const catacurses::window &w, const player &u, const trip } } - return !zlevels || sym != ' ' || !item_sym.empty() || p.z <= -OVERMAP_DEPTH || - !curr_ter.has_flag( TFLAG_NO_FLOOR ); + return zlevels && item_sym.empty() && p.z > -OVERMAP_DEPTH && + ( curr_ter.has_flag( TFLAG_Z_TRANSPARENT ) || + ( sym == ' ' && curr_ter.has_flag( TFLAG_NO_FLOOR ) ) ); } void map::draw_from_above( const catacurses::window &w, const player &u, const tripoint &p, @@ -5992,7 +6010,8 @@ bool map::sees( const tripoint &F, const tripoint &T, const int range ) const /** * This one is internal-only, we don't want to expose the slope tweaking ickiness outside the map class. **/ -bool map::sees( const tripoint &F, const tripoint &T, const int range, int &bresenham_slope ) const +bool map::sees( const tripoint &F, const tripoint &T, const int range, + int &bresenham_slope ) const { if( ( range >= 0 && range < rl_dist( F, T ) ) || !inbounds( T ) ) { @@ -6333,10 +6352,10 @@ std::vector map::get_dir_circle( const tripoint &f, const tripoint &t // The line below can be crazy expensive - we only take the FIRST point of it const std::vector line = line_to( f, t, 0, 0 ); - const std::vector spiral = closest_tripoints_first( f, 1 ); + const std::vector spiral = closest_points_first( f, 1 ); const std::vector pos_index {1, 2, 4, 6, 8, 7, 5, 3}; - // All possible constellations (closest_tripoints_first goes clockwise) + // All possible constellations (closest_points_first goes clockwise) // 753 531 312 124 246 468 687 875 // 8 1 7 2 5 4 3 6 1 8 2 7 4 5 6 3 // 642 864 786 578 357 135 213 421 @@ -6489,6 +6508,8 @@ void map::shift( const point &sp ) // absx and absy are our position in the world, for saving/loading purposes. for( int gridz = zmin; gridz <= zmax; gridz++ ) { // Clear vehicle list and rebuild after shift + // mlangsdorf 2020 - this is kind of insane, building the cache is not free, why are + // we doing this? clear_vehicle_cache( gridz ); clear_vehicle_list( gridz ); shift_bitset_cache( get_cache( gridz ).map_memory_seen_cache, sp ); @@ -6957,7 +6978,7 @@ void map::produce_sap( const tripoint &p, const time_duration &time_since_last_a item sap( "maple_sap", calendar::turn ); - sap.set_item_temperature( temp_to_kelvin( g->m.get_temperature( p ) ) ); + sap.set_item_temperature( temp_to_kelvin( get_temperature( p ) ) ); // Is there a proper container? map_stack items = i_at( p ); @@ -7025,7 +7046,8 @@ void map::rad_scorch( const tripoint &p, const time_duration &time_since_last_ac } } -void map::decay_cosmetic_fields( const tripoint &p, const time_duration &time_since_last_actualize ) +void map::decay_cosmetic_fields( const tripoint &p, + const time_duration &time_since_last_actualize ) { for( auto &pr : field_at( p ) ) { auto &fd = pr.second; @@ -7302,7 +7324,7 @@ void map::spawn_monsters_submap( const tripoint &gp, bool ignore_sight ) for( auto &i : current_submap->spawns ) { const tripoint center = gp_ms + i.pos; - const tripoint_range points = points_in_radius( center, 3 ); + const tripoint_range points = points_in_radius( center, 3 ); for( int j = 0; j < i.count; j++ ) { monster tmp( i.type ); @@ -7324,7 +7346,7 @@ void map::spawn_monsters_submap( const tripoint &gp, bool ignore_sight ) const auto valid_location = [&]( const tripoint & p ) { // Checking for creatures via g is only meaningful if this is the main game map. // If it's some local map instance, the coordinates will most likely not even match. - return ( !g || &g->m != this || !g->critter_at( p ) ) && tmp.can_move_to( p ); + return ( !g || &get_map() != this || !g->critter_at( p ) ) && tmp.can_move_to( p ); }; const auto place_it = [&]( const tripoint & p ) { @@ -7701,40 +7723,44 @@ void map::build_floor_caches() } } -void map::do_vehicle_caching( int z ) +static void vehicle_caching_internal( level_cache &zch, const vpart_reference &vp, vehicle *v ) { - auto &ch = get_cache( z ); - auto &outside_cache = ch.outside_cache; - auto &transparency_cache = ch.transparency_cache; - auto &floor_cache = ch.floor_cache; - for( vehicle *v : ch.vehicle_list ) { - for( const vpart_reference &vp : v->get_all_parts() ) { - const size_t part = vp.part_index(); - point p2( v->global_pos3().xy() + vp.part().precalc[0] ); - const point p( p2 ); - if( !inbounds( p ) ) { - continue; - } + auto &outside_cache = zch.outside_cache; + auto &transparency_cache = zch.transparency_cache; + auto &floor_cache = zch.floor_cache; - bool vehicle_is_opaque = - vp.has_feature( VPFLAG_OPAQUE ) && !vp.part().is_broken(); + const size_t part = vp.part_index(); + const tripoint &part_pos = v->global_part_pos3( vp.part() ); - if( vehicle_is_opaque ) { - int dpart = v->part_with_feature( part, VPFLAG_OPENABLE, true ); - if( dpart < 0 || !v->part( dpart ).open ) { - transparency_cache[p2.x][p2.y] = LIGHT_TRANSPARENCY_SOLID; - } else { - vehicle_is_opaque = false; - } - } + bool vehicle_is_opaque = vp.has_feature( VPFLAG_OPAQUE ) && !vp.part().is_broken(); - if( vehicle_is_opaque || vp.is_inside() ) { - outside_cache[p2.x][p2.y] = false; - } + if( vehicle_is_opaque ) { + int dpart = v->part_with_feature( part, VPFLAG_OPENABLE, true ); + if( dpart < 0 || !v->part( dpart ).open ) { + transparency_cache[part_pos.x][part_pos.y] = LIGHT_TRANSPARENCY_SOLID; + } else { + vehicle_is_opaque = false; + } + } - if( vp.has_feature( VPFLAG_BOARDABLE ) && !vp.part().is_broken() ) { - floor_cache[p2.x][p2.y] = true; + if( vehicle_is_opaque || vp.is_inside() ) { + outside_cache[part_pos.x][part_pos.y] = false; + } + + if( vp.has_feature( VPFLAG_BOARDABLE ) && !vp.part().is_broken() ) { + floor_cache[part_pos.x][part_pos.y] = true; + } +} +void map::do_vehicle_caching( int z ) +{ + level_cache &ch = get_cache( z ); + for( vehicle *v : ch.vehicle_list ) { + for( const vpart_reference &vp : v->get_all_parts() ) { + const tripoint &part_pos = v->global_part_pos3( vp.part() ); + if( !inbounds( part_pos.xy() ) ) { + continue; } + vehicle_caching_internal( get_cache( part_pos.z ), vp, v ); } } } @@ -7915,7 +7941,8 @@ void map::draw_square_ter( ter_id( *f )(), const point &p1, const point &p2 ) }, p1, p2 ); } -void map::draw_square_ter( const weighted_int_list &f, const point &p1, const point &p2 ) +void map::draw_square_ter( const weighted_int_list &f, const point &p1, + const point &p2 ) { draw_square( [this, f]( const point & p ) { const ter_id *tid = f.pick(); @@ -7986,20 +8013,36 @@ field &map::get_field( const tripoint &p ) void map::creature_on_trap( Creature &c, const bool may_avoid ) { - const auto &tr = tr_at( c.pos() ); - if( tr.is_null() ) { - return; - } // boarded in a vehicle means the player is above the trap, like a flying monster and can // never trigger the trap. const player *const p = dynamic_cast( &c ); if( p != nullptr && p->in_vehicle ) { return; } - if( may_avoid && c.avoid_trap( c.pos(), tr ) ) { + maybe_trigger_trap( c.pos(), c, may_avoid ); +} + +void map::maybe_trigger_trap( const tripoint &pos, Creature &c, const bool may_avoid ) +{ + const auto &tr = tr_at( pos ); + if( tr.is_null() ) { + return; + } + + if( may_avoid && c.avoid_trap( pos, tr ) ) { + player *const pl = c.as_player(); + if( !tr.is_always_invisible() && pl && !pl->knows_trap( pos ) ) { + pl->add_msg_if_player( _( "You've spotted a %1$ss!" ), tr.name() ); + pl->add_known_trap( pos, tr ); + } return; } - tr.trigger( c.pos(), &c ); + + if( !tr.is_always_invisible() ) { + c.add_msg_player_or_npc( m_bad, _( "You trigger a %s!" ), _( " triggers a %s!" ), + tr.name() ); + } + tr.trigger( c.pos(), c ); } template @@ -8111,42 +8154,44 @@ void map::scent_blockers( std::array, MAPSIZE_Y> &bl } } -tripoint_range map::points_in_rectangle( const tripoint &from, const tripoint &to ) const +tripoint_range map::points_in_rectangle( const tripoint &from, const tripoint &to ) const { const tripoint min( std::max( 0, std::min( from.x, to.x ) ), std::max( 0, std::min( from.y, to.y ) ), std::max( -OVERMAP_DEPTH, std::min( from.z, to.z ) ) ); const tripoint max( std::min( SEEX * my_MAPSIZE - 1, std::max( from.x, to.x ) ), std::min( SEEX * my_MAPSIZE - 1, std::max( from.y, to.y ) ), std::min( OVERMAP_HEIGHT, std::max( from.z, to.z ) ) ); - return tripoint_range( min, max ); + return tripoint_range( min, max ); } -tripoint_range map::points_in_radius( const tripoint ¢er, size_t radius, size_t radiusz ) const +tripoint_range map::points_in_radius( const tripoint ¢er, size_t radius, + size_t radiusz ) const { const tripoint min( std::max( 0, center.x - radius ), std::max( 0, center.y - radius ), clamp( center.z - radiusz, -OVERMAP_DEPTH, OVERMAP_HEIGHT ) ); const tripoint max( std::min( SEEX * my_MAPSIZE - 1, center.x + radius ), std::min( SEEX * my_MAPSIZE - 1, center.y + radius ), clamp( center.z + radiusz, -OVERMAP_DEPTH, OVERMAP_HEIGHT ) ); - return tripoint_range( min, max ); + return tripoint_range( min, max ); } -tripoint_range map::points_on_zlevel( const int z ) const +tripoint_range map::points_on_zlevel( const int z ) const { if( z < -OVERMAP_DEPTH || z > OVERMAP_HEIGHT ) { // TODO: need a default constructor that creates an empty range. - return tripoint_range( tripoint_zero, tripoint_zero - tripoint_above ); + return tripoint_range( tripoint_zero, tripoint_zero - tripoint_above ); } - return tripoint_range( tripoint( 0, 0, z ), tripoint( SEEX * my_MAPSIZE - 1, SEEY * my_MAPSIZE - 1, - z ) ); + return tripoint_range( + tripoint( 0, 0, z ), tripoint( SEEX * my_MAPSIZE - 1, SEEY * my_MAPSIZE - 1, z ) ); } -tripoint_range map::points_on_zlevel() const +tripoint_range map::points_on_zlevel() const { return points_on_zlevel( abs_sub.z ); } -std::list map::get_active_items_in_radius( const tripoint ¢er, int radius ) const +std::list map::get_active_items_in_radius( const tripoint ¢er, + int radius ) const { return get_active_items_in_radius( center, radius, special_item_type::none ); } @@ -8191,7 +8236,8 @@ std::list map::get_active_items_in_radius( const tripoint ¢er return result; } -std::list map::find_furnitures_with_flag_in_radius( const tripoint ¢er, size_t radius, +std::list map::find_furnitures_with_flag_in_radius( const tripoint ¢er, + size_t radius, const std::string &flag, size_t radiusz ) { @@ -8354,7 +8400,8 @@ void map::update_pathfinding_cache( int zlev ) const } if( terrain.has_flag( TFLAG_GOES_DOWN ) || terrain.has_flag( TFLAG_GOES_UP ) || - terrain.has_flag( TFLAG_RAMP ) ) { + terrain.has_flag( TFLAG_RAMP ) || terrain.has_flag( TFLAG_RAMP_UP ) || + terrain.has_flag( TFLAG_RAMP_DOWN ) ) { cur_value |= PF_UPDOWN; } diff --git a/src/map.h b/src/map.h index 43b341f8b86ed..f2e033219f702 100644 --- a/src/map.h +++ b/src/map.h @@ -56,7 +56,9 @@ class mapgendata; class monster; class optional_vpart_position; class player; +class relic_procgen_data; class submap; +template class tripoint_range; class vehicle; class zone_data; @@ -93,6 +95,8 @@ struct pathfinding_settings; template struct weighted_int_list; +using relic_procgen_id = string_id; + class map_stack : public item_stack { private: @@ -212,7 +216,7 @@ class map public: // Constructors & Initialization - map( int mapsize = MAPSIZE, bool zlev = false ); + map( int mapsize = MAPSIZE, bool zlev = true ); map( bool zlev ) : map( MAPSIZE, zlev ) { } virtual ~map(); @@ -439,7 +443,7 @@ class map */ int combined_movecost( const tripoint &from, const tripoint &to, const vehicle *ignored_vehicle = nullptr, - int modifier = 0, bool flying = false ) const; + int modifier = 0, bool flying = false, bool via_ramp = false ) const; /** * Returns true if a creature could walk from `from` to `to` in one step. @@ -447,7 +451,7 @@ class map * by stairs or (in case of flying monsters) open air with no floors. */ bool valid_move( const tripoint &from, const tripoint &to, - bool bash = false, bool flying = false ) const; + bool bash = false, bool flying = false, bool via_ramp = false ) const; /** * Size of map objects at `p` for purposes of ranged combat. @@ -543,6 +547,7 @@ class map // Vehicles: Common to 2D and 3D VehicleList get_vehicles(); void add_vehicle_to_cache( vehicle * ); + void clear_vehicle_point_from_cache( vehicle *veh, const tripoint &pt ); void update_vehicle_cache( vehicle *, int old_zlevel ); void reset_vehicle_cache( int zlev ); void clear_vehicle_cache( int zlev ); @@ -573,16 +578,21 @@ class map vehicle *veh_at_internal( const tripoint &p, int &part_num ); const vehicle *veh_at_internal( const tripoint &p, int &part_num ) const; // Put player on vehicle at x,y - void board_vehicle( const tripoint &p, player *pl ); + void board_vehicle( const tripoint &p, Character *pl ); // Remove given passenger from given vehicle part. // If dead_passenger, then null passenger is acceptable. - void unboard_vehicle( const vpart_reference &, player *passenger, + void unboard_vehicle( const vpart_reference &, Character *passenger, bool dead_passenger = false ); // Remove passenger from vehicle at p. void unboard_vehicle( const tripoint &p, bool dead_passenger = false ); // Change vehicle coordinates and move vehicle's driver along. // WARNING: not checking collisions! - bool displace_vehicle( vehicle &veh, const tripoint &dp ); + // optionally: include a list of parts to displace instead of the entire vehicle + bool displace_vehicle( vehicle &veh, const tripoint &dp, bool adjust_pos = true, + const std::set &parts_to_move = {} ); + // make sure a vehicle that is split across z-levels is properly supported + // calls displace_vehicle() and shouldn't be called from displace_vehicle + void level_vehicle( vehicle &veh ); // move water under wheels. true if moved bool displace_water( const tripoint &dp ); @@ -686,6 +696,10 @@ class map * Check whether a chair or vehicle seat is nearby. */ bool has_nearby_chair( const tripoint &p, int radius = 1 ); + /** + * Checks whether a specific terrain is nearby. + */ + bool has_nearby_ter( const tripoint &p, const ter_id &type, int radius = 1 ); /** * Check if creature can see some items at p. Includes: * - check for items at this location (has_items(p)) @@ -1008,8 +1022,7 @@ class map void i_rem( const point &p, item *it ) { i_rem( tripoint( p, abs_sub.z ), it ); } - void spawn_artifact( const tripoint &p ); - void spawn_natural_artifact( const tripoint &p, artifact_natural_property prop ); + void spawn_artifact( const tripoint &p, const relic_procgen_id &id ); void spawn_item( const tripoint &p, const itype_id &type_id, unsigned quantity = 1, int charges = 0, const time_point &birthday = calendar::start_of_cataclysm, int damlevel = 0 ); @@ -1059,10 +1072,6 @@ class map void add_item( const point &p, item new_item ) { add_item( tripoint( p, abs_sub.z ), new_item ); } - item &spawn_an_item( const tripoint &p, item new_item, int charges, int damlevel ); - void spawn_an_item( const point &p, item new_item, int charges, int damlevel ) { - spawn_an_item( tripoint( p, abs_sub.z ), new_item, charges, damlevel ); - } /** * Update an item's active status, for example when adding @@ -1135,7 +1144,7 @@ class map std::vector put_items_from_loc( const items_location &loc, const tripoint &p, const time_point &turn = calendar::start_of_cataclysm ); - // Similar to spawn_an_item, but spawns a list of items, or nothing if the list is empty. + // Places a list of items, or nothing if the list is empty. std::vector spawn_items( const tripoint &p, const std::vector &new_items ); void spawn_items( const point &p, const std::vector &new_items ) { spawn_items( tripoint( p, abs_sub.z ), new_items ); @@ -1154,17 +1163,28 @@ class map void trap_set( const tripoint &p, const trap_id &type ); const trap &tr_at( const tripoint &p ) const; + /// See @ref trap::can_see, which is called for the trap here. + bool can_see_trap_at( const tripoint &p, const Character &c ) const; - void disarm_trap( const tripoint &p ); void remove_trap( const tripoint &p ); const std::vector &get_furn_field_locations() const; const std::vector &trap_locations( const trap_id &type ) const; + /** + * Handles activating a trap. It includes checks for avoiding the trap + * (which also makes it visible). + * This functions assumes the character is either on top of the trap, + * or adjacent to it. + */ + void maybe_trigger_trap( const tripoint &pos, Creature &c, bool may_avoid ); + // Spawns byproducts from items destroyed in fire. void create_burnproducts( const tripoint &p, const item &fuel, const units::mass &burned_mass ); // See fields.cpp bool process_fields(); bool process_fields_in_submap( submap *current_submap, const tripoint &submap_pos ); + bool process_fire_field_in_submap( maptile &map_tile, const tripoint &p, + field_entry &cur, bool &dirty_transparency_cache ); /** * Apply field effects to the creature when it's on a square with fields. */ @@ -1347,8 +1367,7 @@ class map void place_toilet( const point &p, int charges = 6 * 4 ); void place_vending( const point &p, const std::string &type, bool reinforced = false ); // places an NPC, if static NPCs are enabled or if force is true - character_id place_npc( const point &p, const string_id &type, - bool force = false ); + character_id place_npc( const point &p, const string_id &type ); void apply_faction_ownership( const point &p1, const point &p2, const faction_id &id ); void add_spawn( const mtype_id &type, int count, const tripoint &p, bool friendly = false, int faction_id = -1, int mission_id = -1, @@ -1652,7 +1671,7 @@ class map /** * Internal version of the drawsq. Keeps a cached maptile for less re-getting. - * Returns true if it has drawn all it should, false if `draw_from_above` should be called after. + * Returns false if it has drawn all it should, true if `draw_from_above` should be called after. */ bool draw_maptile( const catacurses::window &w, const player &u, const tripoint &p, const maptile &tile, @@ -1787,16 +1806,18 @@ class map return submaps_with_active_items; } // Clips the area to map bounds - tripoint_range points_in_rectangle( const tripoint &from, const tripoint &to ) const; - tripoint_range points_in_radius( const tripoint ¢er, size_t radius, size_t radiusz = 0 ) const; + tripoint_range points_in_rectangle( + const tripoint &from, const tripoint &to ) const; + tripoint_range points_in_radius( + const tripoint ¢er, size_t radius, size_t radiusz = 0 ) const; /** * Yields a range of all points that are contained in the map and have the z-level of * this map (@ref abs_sub). */ - tripoint_range points_on_zlevel() const; + tripoint_range points_on_zlevel() const; /// Same as above, but uses the specific z-level. If the given z-level is invalid, it /// returns an empty range. - tripoint_range points_on_zlevel( int z ) const; + tripoint_range points_on_zlevel( int z ) const; std::list get_active_items_in_radius( const tripoint ¢er, int radius ) const; std::list get_active_items_in_radius( const tripoint ¢er, int radius, @@ -1812,7 +1833,7 @@ class map level_cache &access_cache( int zlev ); const level_cache &access_cache( int zlev ) const; - bool need_draw_lower_floor( const tripoint &p ); + bool dont_draw_lower_floor( const tripoint &p ); }; map &get_map(); diff --git a/src/map_extras.cpp b/src/map_extras.cpp index 97f67ac7b05df..8295fb44505e0 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -797,7 +797,7 @@ static bool mx_marloss_pilgrimage( map &m, const tripoint &abs_sub ) const tripoint leader_pos( rng( 4, 19 ), rng( 4, 19 ), abs_sub.z ); const int max_followers = rng( 3, 12 ); const int rad = 3; - const tripoint_range spawnzone = m.points_in_radius( leader_pos, rad ); + const tripoint_range spawnzone = m.points_in_radius( leader_pos, rad ); m.place_npc( leader_pos.xy(), string_id( "marloss_voice" ) ); for( int spawned = 0 ; spawned <= max_followers ; spawned++ ) { @@ -994,6 +994,9 @@ static bool mx_drugdeal( map &m, const tripoint &abs_sub ) static bool mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) { + const bool intact = x_in_y( 40, + std::max( to_days( calendar::turn - calendar::start_of_cataclysm ), 0 ) + 50 ); + int num_crates = rng( 1, 5 ); for( int i = 0; i < num_crates; i++ ) { const auto p = random_point( m, [&m]( const tripoint & n ) { @@ -1002,37 +1005,42 @@ static bool mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) if( !p ) { break; } - m.furn_set( p->xy(), f_crate_c ); - std::string item_group; - switch( rng( 1, 10 ) ) { - case 1: - item_group = "mil_bulk"; - break; - case 2: - case 3: - case 4: - item_group = "mil_food"; - break; - case 5: - case 6: - case 7: - item_group = "grenades"; - break; - case 8: - case 9: - item_group = "mil_armor"; - break; - case 10: - item_group = "guns_rifle_milspec"; - break; - } - int items_created = 0; - for( int i = 0; i < 10 && items_created < 2; i++ ) { - items_created += m.place_items( item_group, 80, *p, *p, true, calendar::start_of_cataclysm, - 100 ).size(); - } - if( m.i_at( *p ).empty() ) { - m.destroy( *p, true ); + + if( intact ) { + m.furn_set( p->xy(), f_crate_c ); + std::string item_group; + switch( rng( 1, 10 ) ) { + case 1: + item_group = "mil_bulk"; + break; + case 2: + case 3: + case 4: + item_group = "mil_food"; + break; + case 5: + case 6: + case 7: + item_group = "grenades"; + break; + case 8: + case 9: + item_group = "mil_armor"; + break; + case 10: + item_group = "guns_rifle_milspec"; + break; + } + int items_created = 0; + for( int i = 0; i < 10 && items_created < 2; i++ ) { + items_created += m.place_items( item_group, 80, *p, *p, true, calendar::start_of_cataclysm, + 100 ).size(); + } + if( m.i_at( *p ).empty() ) { + m.destroy( *p, true ); + } + } else { + m.furn_set( p->xy(), f_crate_o ); } } @@ -1043,7 +1051,8 @@ static bool mx_portal( map &m, const tripoint &abs_sub ) { // All points except the borders are valid--we need the 1 square buffer so that we can do a 1 unit radius // around our chosen portal point without clipping against the edge of the map. - const tripoint_range points = m.points_in_rectangle( { 1, 1, abs_sub.z }, { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z } ); + const tripoint_range points = + m.points_in_rectangle( { 1, 1, abs_sub.z }, { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z } ); // Get a random point in our collection that does not have a trap and does not have the NO_FLOOR flag. const cata::optional portal_pos = random_point( points, [&]( const tripoint & p ) { @@ -1090,7 +1099,7 @@ static bool mx_portal( map &m, const tripoint &abs_sub ) return true; } -static bool mx_minefield( map &m, const tripoint &abs_sub ) +static bool mx_minefield( map &, const tripoint &abs_sub ) { const tripoint abs_omt = sm_to_omt_copy( abs_sub ); const oter_id ¢er = overmap_buffer.ter( abs_omt ); @@ -1099,7 +1108,7 @@ static bool mx_minefield( map &m, const tripoint &abs_sub ) const oter_id &west = overmap_buffer.ter( abs_omt + point_west ); const oter_id &east = overmap_buffer.ter( abs_omt + point_east ); - const bool bridge_at_center = is_ot_match( "bridge", center, ot_match_type::type ); + const bool bridgehead_at_center = is_ot_match( "bridgehead_ground", center, ot_match_type::type ); const bool bridge_at_north = is_ot_match( "bridge", north, ot_match_type::type ); const bool bridge_at_south = is_ot_match( "bridge", south, ot_match_type::type ); const bool bridge_at_west = is_ot_match( "bridge", west, ot_match_type::type ); @@ -1116,7 +1125,14 @@ static bool mx_minefield( map &m, const tripoint &abs_sub ) bool did_something = false; - if( bridge_at_north && bridge_at_center && road_at_south ) { + if( !bridgehead_at_center ) { + return false; + } + + tinymap m; + if( bridge_at_north && bridgehead_at_center && road_at_south ) { + m.load( omt_to_sm_copy( abs_omt + point_south ), false ); + //Sandbag block at the left edge line_furn( &m, f_sandbag_half, point( 3, 4 ), point( 3, 7 ) ); line_furn( &m, f_sandbag_half, point( 3, 7 ), point( 9, 7 ) ); @@ -1214,7 +1230,8 @@ static bool mx_minefield( map &m, const tripoint &abs_sub ) did_something = true; } - if( bridge_at_south && bridge_at_center && road_at_north ) { + if( bridge_at_south && bridgehead_at_center && road_at_north ) { + m.load( omt_to_sm_copy( abs_omt + point_north ), false ); //Two horizontal lines of sandbags line_furn( &m, f_sandbag_half, point( 5, 15 ), point( 10, 15 ) ); line_furn( &m, f_sandbag_half, point( 13, 15 ), point( 18, 15 ) ); @@ -1315,7 +1332,8 @@ static bool mx_minefield( map &m, const tripoint &abs_sub ) did_something = true; } - if( bridge_at_west && bridge_at_center && road_at_east ) { + if( bridge_at_west && bridgehead_at_center && road_at_east ) { + m.load( omt_to_sm_copy( abs_omt + point_east ), false ); //Draw walls of first tent square_furn( &m, f_canvas_wall, point( 0, 3 ), point( 4, 13 ) ); @@ -1461,7 +1479,8 @@ static bool mx_minefield( map &m, const tripoint &abs_sub ) did_something = true; } - if( bridge_at_east && bridge_at_center && road_at_west ) { + if( bridge_at_east && bridgehead_at_center && road_at_west ) { + m.load( omt_to_sm_copy( abs_omt + point_west ), false ); //Spawn military cargo truck blocking the entry m.add_vehicle( vproto_id( "military_cargo_truck" ), point( 15, 11 ), 270, 70, 1 ); @@ -1763,7 +1782,8 @@ static bool mx_portal_in( map &m, const tripoint &abs_sub ) artifact_natural_property prop = static_cast( rng( ARTPROP_NULL + 1, ARTPROP_MAX - 1 ) ); m.create_anomaly( portal_location, prop ); - m.spawn_natural_artifact( p + tripoint( rng( -1, 1 ), rng( -1, 1 ), abs_sub.z ), prop ); + m.spawn_artifact( p + tripoint( rng( -1, 1 ), rng( -1, 1 ), abs_sub.z ), + relic_procgen_id( "alien_reality" ) ); break; } } @@ -2243,13 +2263,13 @@ static bool mx_reed( map &m, const tripoint &abs_sub ) return false; }; + weighted_int_list vegetation; + vegetation.add( f_cattails, 15 ); + vegetation.add( f_lotus, 5 ); + vegetation.add( f_lilypad, 1 ); for( int i = 0; i < SEEX * 2; i++ ) { for( int j = 0; j < SEEY * 2; j++ ) { const tripoint loc( i, j, abs_sub.z ); - weighted_int_list vegetation; - vegetation.add( f_cattails, 15 ); - vegetation.add( f_lotus, 5 ); - vegetation.add( f_lilypad, 1 ); if( ( m.ter( loc ) == t_water_sh || m.ter( loc ) == t_water_moving_sh ) && one_in( intensity ) ) { m.furn_set( loc, vegetation.pick()->id() ); @@ -3011,7 +3031,7 @@ static bool mx_city_trap( map &/*m*/, const tripoint &abs_sub ) for( const tripoint &p : points_in_radius( trap_center, 1 ) ) { compmap.trap_set( p, tr_blade ); } - compmap.trap_set( trap_center, tr_engine ); + compmap.trap_set( trap_center, trap_str_id( "tr_engine" ) ); //... and a loudspeaker to attract zombies compmap.add_spawn( mon_turret_speaker, 1, trap_center ); } diff --git a/src/map_field.cpp b/src/map_field.cpp index acbf6a2c32f0a..a5e8bb76bd856 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -124,7 +124,7 @@ int map::burn_body_part( player &u, field_entry &cur, body_part bp, const int sc { int total_damage = 0; const int intensity = cur.get_field_intensity(); - const int damage = rng( 1, scale + intensity ); + const int damage = rng( 1, ( scale + intensity ) / 2 ); // A bit ugly, but better than being annoyed by acid when in hazmat if( u.get_armor_type( DT_ACID, convert_bp( bp ) ) < damage ) { const dealt_damage_instance ddi = u.deal_damage( nullptr, convert_bp( bp ).id(), @@ -254,7 +254,8 @@ void map::gas_spread_to( field_entry &cur, maptile &dst ) void map::spread_gas( field_entry &cur, const tripoint &p, int percent_spread, const time_duration &outdoor_age_speedup, scent_block &sblk ) { - const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( g->m.getabs( p ) ) ); + map &here = get_map(); + const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( here.getabs( p ) ) ); const bool sheltered = g->is_sheltered( p ); const int winddirection = g->weather.winddirection; const int windpower = get_local_windpower( g->weather.windspeed, cur_om_ter, p, winddirection, @@ -397,6 +398,7 @@ bool map::process_fields_in_submap( submap *const current_submap, // Just to avoid typing that long string for a temp value. field_entry *tmpfld = nullptr; + map &here = get_map(); tripoint thep; thep.z = submap.z; @@ -452,7 +454,6 @@ bool map::process_fields_in_submap( submap *const current_submap, cur.set_field_intensity( cur.get_field_intensity() + 1 ); } - int part; const ter_t &ter = map_tile.get_ter_t(); // Dissipate faster in water if( ter.has_flag( TFLAG_SWIMMABLE ) ) { @@ -486,488 +487,21 @@ bool map::process_fields_in_submap( submap *const current_submap, } // TODO: Allow spreading to the sides if age < 0 && intensity == 3 } + + if( curtype == fd_extinguisher ) { + field_entry *fire_here = maptile_at_internal( p ).find_field( fd_fire ); + if( fire_here != nullptr ) { + // extinguisher fights fire in 1:1 ratio + fire_here->set_field_intensity( fire_here->get_field_intensity() - cur.get_field_intensity() ); + cur.set_field_intensity( cur.get_field_intensity() - fire_here->get_field_intensity() ); + } + } if( curtype.obj().apply_slime_factor > 0 ) { sblk.apply_slime( p, cur.get_field_intensity() * curtype.obj().apply_slime_factor ); } if( curtype == fd_fire ) { - cur.set_field_age( std::max( -24_hours, cur.get_field_age() ) ); - // Entire objects for ter/frn for flags - const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( g->m.getabs( p ) ) ); - bool sheltered = g->is_sheltered( p ); - int winddirection = g->weather.winddirection; - int windpower = get_local_windpower( g->weather.windspeed, cur_om_ter, p, winddirection, - sheltered ); - const ter_t &ter = map_tile.get_ter_t(); - const furn_t &frn = map_tile.get_furn_t(); - - // We've got ter/furn cached, so let's use that - const bool is_sealed = ter_furn_has_flag( ter, frn, TFLAG_SEALED ) && - !ter_furn_has_flag( ter, frn, TFLAG_ALLOW_FIELD_EFFECT ); - // Smoke generation probability, consumed items count - int smoke = 0; - int consumed = 0; - // How much time to add to the fire's life due to burned items/terrain/furniture - time_duration time_added = 0_turns; - // Checks if the fire can spread - const bool can_spread = !ter_furn_has_flag( ter, frn, TFLAG_FIRE_CONTAINER ); - // If the flames are in furniture with fire_container flag like brazier or oven, - // they're fully contained, so skip consuming terrain - const bool can_burn = ( ter.is_flammable() || frn.is_flammable() ) && - !ter_furn_has_flag( ter, frn, TFLAG_FIRE_CONTAINER ); - // The huge indent below should probably be somehow moved away from here - // without forcing the function to use i_at( p ) for fires without items - if( !is_sealed && map_tile.get_item_count() > 0 ) { - map_stack items_here = i_at( p ); - std::vector new_content; - for( auto it = items_here.begin(); it != items_here.end(); ) { - if( it->will_explode_in_fire() ) { - // We need to make a copy because the iterator validity is not predictable - item copy = *it; - it = items_here.erase( it ); - if( copy.detonate( p, new_content ) ) { - // Need to restart, iterators may not be valid - it = items_here.begin(); - } - } else { - ++it; - } - } - - fire_data frd( cur.get_field_intensity(), !can_spread ); - // The highest # of items this fire can remove in one turn - int max_consume = cur.get_field_intensity() * 2; - - for( auto fuel = items_here.begin(); fuel != items_here.end() && consumed < max_consume; ) { - // `item::burn` modifies the charges in order to simulate some of them getting - // destroyed by the fire, this changes the item weight, but may not actually - // destroy it. We need to spawn products anyway. - const units::mass old_weight = fuel->weight( false ); - bool destroyed = fuel->burn( frd ); - // If the item is considered destroyed, it may have negative charge count, - // see `item::burn?. This in turn means `item::weight` returns a negative value, - // which we can not use, so only call `weight` when it's still an existing item. - const units::mass new_weight = destroyed ? 0_gram : fuel->weight( false ); - if( old_weight != new_weight ) { - create_burnproducts( p, *fuel, old_weight - new_weight ); - } - - if( destroyed ) { - // If we decided the item was destroyed by fire, remove it. - // But remember its contents, except for irremovable mods, if any - const std::list content_list = fuel->contents.all_items_top(); - for( item *it : content_list ) { - if( !it->is_irremovable() ) { - new_content.push_back( item( *it ) ); - } - } - fuel = items_here.erase( fuel ); - consumed++; - } else { - ++fuel; - } - } - - spawn_items( p, new_content ); - smoke = roll_remainder( frd.smoke_produced ); - time_added = 1_turns * roll_remainder( frd.fuel_produced ); - } - - // Get the part of the vehicle in the fire (_internal skips the boundary check) - vehicle *veh = veh_at_internal( p, part ); - if( veh != nullptr ) { - veh->damage( part, cur.get_field_intensity() * 10, DT_HEAT, true ); - // Damage the vehicle in the fire. - } - if( can_burn ) { - if( ter.has_flag( TFLAG_SWIMMABLE ) ) { - // Flames die quickly on water - cur.set_field_age( cur.get_field_age() + 4_minutes ); - } - - // Consume the terrain we're on - if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE ) ) { - // The fire feeds on the ground itself until max intensity. - time_added += 1_turns * ( 5 - cur.get_field_intensity() ); - smoke += 2; - smoke += static_cast( windpower / 5 ); - if( cur.get_field_intensity() > 1 && - one_in( 200 - cur.get_field_intensity() * 50 ) ) { - destroy( p, false ); - } - - } else if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE_HARD ) && - one_in( 3 ) ) { - // The fire feeds on the ground itself until max intensity. - time_added += 1_turns * ( 4 - cur.get_field_intensity() ); - smoke += 2; - smoke += static_cast( windpower / 5 ); - if( cur.get_field_intensity() > 1 && - one_in( 200 - cur.get_field_intensity() * 50 ) ) { - destroy( p, false ); - } - - } else if( ter.has_flag( TFLAG_FLAMMABLE_ASH ) ) { - // The fire feeds on the ground itself until max intensity. - time_added += 1_turns * ( 5 - cur.get_field_intensity() ); - smoke += 2; - smoke += static_cast( windpower / 5 ); - if( cur.get_field_intensity() > 1 && - one_in( 200 - cur.get_field_intensity() * 50 ) ) { - if( p.z > 0 ) { - // We're in the air - ter_set( p, t_open_air ); - } else { - ter_set( p, t_dirt ); - } - } - - } else if( frn.has_flag( TFLAG_FLAMMABLE_ASH ) ) { - // The fire feeds on the ground itself until max intensity. - time_added += 1_turns * ( 5 - cur.get_field_intensity() ); - smoke += 2; - smoke += static_cast( windpower / 5 ); - if( cur.get_field_intensity() > 1 && - one_in( 200 - cur.get_field_intensity() * 50 ) ) { - furn_set( p, f_ash ); - add_item_or_charges( p, item( "ash" ) ); - } - - } else if( ter.has_flag( TFLAG_NO_FLOOR ) && zlevels && p.z > -OVERMAP_DEPTH ) { - // We're hanging in the air - let's fall down - tripoint dst{ p.xy(), p.z - 1 }; - if( valid_move( p, dst, true, true ) ) { - maptile dst_tile = maptile_at_internal( dst ); - field_entry *fire_there = dst_tile.find_field( fd_fire ); - if( fire_there == nullptr ) { - dst_tile.add_field( fd_fire, 1, 0_turns ); - cur.set_field_intensity( cur.get_field_intensity() - 1 ); - } else { - // Don't fuel raging fires or they'll burn forever - // as they can produce small fires above themselves - int new_intensity = std::max( cur.get_field_intensity(), - fire_there->get_field_intensity() ); - // Allow smaller fires to combine - if( new_intensity < 3 && - cur.get_field_intensity() == fire_there->get_field_intensity() ) { - new_intensity++; - } - // A raging fire below us can support us for a while - // Otherwise decay and decay fast - if( fire_there->get_field_intensity() < 3 || one_in( 10 ) ) { - cur.set_field_intensity( cur.get_field_intensity() - 1 ); - } - fire_there->set_field_intensity( new_intensity ); - } - break; - } - } - } - // Lower age is a longer lasting fire - if( time_added != 0_turns ) { - cur.set_field_age( cur.get_field_age() - time_added ); - } else if( can_burn ) { - // Nothing to burn = fire should be dying out faster - // Drain more power from big fires, so that they stop raging over nothing - // Except for fires on stoves and fireplaces, those are made to keep the fire alive - cur.mod_field_age( 10_seconds * cur.get_field_intensity() ); - } - - // Below we will access our nearest 8 neighbors, so let's cache them now - // This should probably be done more globally, because large fires will re-do it a lot - auto neighs = get_neighbors( p ); - // Get the neighbours that are allowed due to wind direction - auto maptiles = get_wind_blockers( winddirection, p ); - maptile remove_tile = std::get<0>( maptiles ); - maptile remove_tile2 = std::get<1>( maptiles ); - maptile remove_tile3 = std::get<2>( maptiles ); - std::vector neighbour_vec; - size_t end_it = static_cast( rng( 0, neighs.size() - 1 ) ); - // Start at end_it + 1, then wrap around until all elements have been processed - for( size_t i = ( end_it + 1 ) % neighs.size(), count = 0; - count != neighs.size(); - i = ( i + 1 ) % neighs.size(), count++ ) { - const auto &neigh = neighs[i]; - if( ( neigh.pos_.x != remove_tile.pos_.x && neigh.pos_.y != remove_tile.pos_.y ) || - ( neigh.pos_.x != remove_tile2.pos_.x && neigh.pos_.y != remove_tile2.pos_.y ) || - ( neigh.pos_.x != remove_tile3.pos_.x && neigh.pos_.y != remove_tile3.pos_.y ) ) { - neighbour_vec.push_back( neigh ); - } else if( x_in_y( 1, std::max( 2, windpower ) ) ) { - neighbour_vec.push_back( neigh ); - } - } - // If the flames are in a pit, it can't spread to non-pit - const bool in_pit = ter.id.id() == t_pit; - - // Count adjacent fires, to optimize out needless smoke and hot air - int adjacent_fires = 0; - - // If the flames are big, they contribute to adjacent flames - if( can_spread ) { - if( cur.get_field_intensity() > 1 && one_in( 3 ) ) { - // Basically: Scan around for a spot, - // if there is more fire there, make it bigger and give it some fuel. - // This is how big fires spend their excess age: - // making other fires bigger. Flashpoint. - if( sheltered || windpower < 5 ) { - end_it = static_cast( rng( 0, neighs.size() - 1 ) ); - for( size_t i = ( end_it + 1 ) % neighs.size(), count = 0; - count != neighs.size() && cur.get_field_age() < 0_turns; - i = ( i + 1 ) % neighs.size(), count++ ) { - maptile &dst = neighs[i]; - auto dstfld = dst.find_field( fd_fire ); - // If the fire exists and is weaker than ours, boost it - if( dstfld != nullptr && - ( dstfld->get_field_intensity() <= cur.get_field_intensity() || - dstfld->get_field_age() > cur.get_field_age() ) && - ( in_pit == ( dst.get_ter() == t_pit ) ) ) { - if( dstfld->get_field_intensity() < 2 ) { - dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); - } - - dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); - cur.set_field_age( cur.get_field_age() + 5_minutes ); - } - if( dstfld != nullptr ) { - adjacent_fires++; - } - } - } else { - end_it = static_cast( rng( 0, neighbour_vec.size() - 1 ) ); - for( size_t i = ( end_it + 1 ) % neighbour_vec.size(), count = 0; - count != neighbour_vec.size() && cur.get_field_age() < 0_turns; - i = ( i + 1 ) % neighbour_vec.size(), count++ ) { - maptile &dst = neighbour_vec[i]; - field_entry *dstfld = dst.find_field( fd_fire ); - // If the fire exists and is weaker than ours, boost it - if( dstfld != nullptr && - ( dstfld->get_field_intensity() <= cur.get_field_intensity() || - dstfld->get_field_age() > cur.get_field_age() ) && - ( in_pit == ( dst.get_ter() == t_pit ) ) ) { - if( dstfld->get_field_intensity() < 2 ) { - dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); - } - - dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); - cur.set_field_age( cur.get_field_age() + 5_minutes ); - } - - if( dstfld != nullptr ) { - adjacent_fires++; - } - } - } - } else if( cur.get_field_age() < 0_turns && cur.get_field_intensity() < 3 ) { - // See if we can grow into a stage 2/3 fire, for this - // burning neighbors are necessary in addition to - // field age < 0, or alternatively, a LOT of fuel. - - // The maximum fire intensity is 1 for a lone fire, 2 for at least 1 neighbor, - // 3 for at least 2 neighbors. - int maximum_intensity = 1; - - // The following logic looks a bit complex due to optimization concerns, so here are the semantics: - // 1. Calculate maximum field intensity based on fuel, -50 minutes is 2(medium), -500 minutes is 3(raging) - // 2. Calculate maximum field intensity based on neighbors, 3 neighbors is 2(medium), 7 or more neighbors is 3(raging) - // 3. Pick the higher maximum between 1. and 2. - if( cur.get_field_age() < -500_minutes ) { - maximum_intensity = 3; - } else { - for( auto &neigh : neighs ) { - if( neigh.get_field().find_field( fd_fire ) != nullptr ) { - adjacent_fires++; - } - } - maximum_intensity = 1 + ( adjacent_fires >= 3 ) + ( adjacent_fires >= 7 ); - - if( maximum_intensity < 2 && cur.get_field_age() < -50_minutes ) { - maximum_intensity = 2; - } - } - - // If we consumed a lot, the flames grow higher - if( cur.get_field_intensity() < maximum_intensity && cur.get_field_age() < 0_turns ) { - // Fires under 0 age grow in size. Level 3 fires under 0 spread later on. - // Weaken the newly-grown fire - cur.set_field_intensity( cur.get_field_intensity() + 1 ); - cur.set_field_age( cur.get_field_age() + 10_minutes * cur.get_field_intensity() ); - } - } - } - // Consume adjacent fuel / terrain / webs to spread. - // Allow raging fires (and only raging fires) to spread up - // Spreading down is achieved by wrecking the walls/floor and then falling - if( zlevels && cur.get_field_intensity() == 3 && p.z < OVERMAP_HEIGHT ) { - // Let it burn through the floor - maptile dst = maptile_at_internal( {p.xy(), p.z + 1} ); - const auto &dst_ter = dst.get_ter_t(); - if( dst_ter.has_flag( TFLAG_NO_FLOOR ) || - dst_ter.has_flag( TFLAG_FLAMMABLE ) || - dst_ter.has_flag( TFLAG_FLAMMABLE_ASH ) || - dst_ter.has_flag( TFLAG_FLAMMABLE_HARD ) ) { - field_entry *nearfire = dst.find_field( fd_fire ); - if( nearfire != nullptr ) { - nearfire->mod_field_age( -2_turns ); - } else { - dst.add_field( fd_fire, 1, 0_turns ); - } - // Fueling fires above doesn't cost fuel - } - } - // Our iterator will start at end_i + 1 and increment from there and then wrap around. - // This guarantees it will check all neighbors, starting from a random one - if( sheltered || windpower < 5 ) { - const size_t end_i = static_cast( rng( 0, neighs.size() - 1 ) ); - for( size_t i = ( end_i + 1 ) % neighs.size(), count = 0; - count != neighs.size(); - i = ( i + 1 ) % neighs.size(), count++ ) { - if( one_in( cur.get_field_intensity() * 2 ) ) { - // Skip some processing to save on CPU - continue; - } - - maptile &dst = neighs[i]; - // No bounds checking here: we'll treat the invalid neighbors as valid. - // We're using the map tile wrapper, so we can treat invalid tiles as sentinels. - // This will create small oddities on map edges, but nothing more noticeable than - // "cut-off" that happens with bounds checks. - - field_entry *nearfire = dst.find_field( fd_fire ); - if( nearfire != nullptr ) { - // We handled supporting fires in the section above, no need to do it here - continue; - } - - field_entry *nearwebfld = dst.find_field( fd_web ); - int spread_chance = 25 * ( cur.get_field_intensity() - 1 ); - if( nearwebfld != nullptr ) { - spread_chance = 50 + spread_chance / 2; - } - - const ter_t &dster = dst.get_ter_t(); - const furn_t &dsfrn = dst.get_furn_t(); - // Allow weaker fires to spread occasionally - const int power = cur.get_field_intensity() + one_in( 5 ); - if( can_spread && rng( 1, 100 ) < spread_chance && - ( dster.is_flammable() || dsfrn.is_flammable() ) && - ( in_pit == ( dster.id.id() == t_pit ) ) && - ( - ( power >= 3 && cur.get_field_age() < 0_turns && one_in( 20 ) ) || - ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE ) && one_in( 2 ) ) ) || - ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_ASH ) && one_in( 2 ) ) ) || - ( power >= 3 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_HARD ) && one_in( 5 ) ) ) || - nearwebfld || ( dst.get_item_count() > 0 && - flammable_items_at( p + eight_horizontal_neighbors[i] ) && - one_in( 5 ) ) - ) ) { - // Nearby open flammable ground? Set it on fire. - dst.add_field( fd_fire, 1, 0_turns ); - tmpfld = dst.find_field( fd_fire ); - if( tmpfld != nullptr ) { - // Make the new fire quite weak, so that it doesn't start jumping around instantly - tmpfld->set_field_age( 2_minutes ); - // Consume a bit of our fuel - cur.set_field_age( cur.get_field_age() + 1_minutes ); - } - if( nearwebfld ) { - nearwebfld->set_field_intensity( 0 ); - } - } - } - } else { - const size_t end_i = static_cast( rng( 0, neighbour_vec.size() - 1 ) ); - for( size_t i = ( end_i + 1 ) % neighbour_vec.size(), count = 0; - count != neighbour_vec.size(); - i = ( i + 1 ) % neighbour_vec.size(), count++ ) { - if( one_in( cur.get_field_intensity() * 2 ) ) { - // Skip some processing to save on CPU - continue; - } - - if( neighbour_vec.empty() ) { - continue; - } - - maptile &dst = neighbour_vec[i]; - // No bounds checking here: we'll treat the invalid neighbors as valid. - // We're using the map tile wrapper, so we can treat invalid tiles as sentinels. - // This will create small oddities on map edges, but nothing more noticeable than - // "cut-off" that happens with bounds checks. - - field_entry *nearfire = dst.find_field( fd_fire ); - if( nearfire != nullptr ) { - // We handled supporting fires in the section above, no need to do it here - continue; - } - - field_entry *nearwebfld = dst.find_field( fd_web ); - int spread_chance = 25 * ( cur.get_field_intensity() - 1 ); - if( nearwebfld != nullptr ) { - spread_chance = 50 + spread_chance / 2; - } - - const ter_t &dster = dst.get_ter_t(); - const furn_t &dsfrn = dst.get_furn_t(); - // Allow weaker fires to spread occasionally - const int power = cur.get_field_intensity() + one_in( 5 ); - if( can_spread && rng( 1, 100 - windpower ) < spread_chance && - ( dster.is_flammable() || dsfrn.is_flammable() ) && - ( in_pit == ( dster.id.id() == t_pit ) ) && - ( - ( power >= 3 && cur.get_field_age() < 0_turns && one_in( 20 ) ) || - ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE ) && one_in( 2 ) ) ) || - ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_ASH ) && one_in( 2 ) ) ) || - ( power >= 3 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_HARD ) && one_in( 5 ) ) ) || - nearwebfld || ( dst.get_item_count() > 0 && - flammable_items_at( p + eight_horizontal_neighbors[i] ) && - one_in( 5 ) ) - ) ) { - // Nearby open flammable ground? Set it on fire. - dst.add_field( fd_fire, 1, 0_turns ); - tmpfld = dst.find_field( fd_fire ); - if( tmpfld != nullptr ) { - // Make the new fire quite weak, so that it doesn't start jumping around instantly - tmpfld->set_field_age( 2_minutes ); - // Consume a bit of our fuel - cur.set_field_age( cur.get_field_age() + 1_minutes ); - } - if( nearwebfld ) { - nearwebfld->set_field_intensity( 0 ); - } - } - } - } - // Create smoke once - above us if possible, at us otherwise - if( !ter_furn_has_flag( ter, frn, TFLAG_SUPPRESS_SMOKE ) && - rng( 0, 100 - windpower ) <= smoke && - rng( 3, 35 ) < cur.get_field_intensity() * 10 ) { - bool smoke_up = zlevels && p.z < OVERMAP_HEIGHT; - if( smoke_up ) { - tripoint up{p.xy(), p.z + 1}; - maptile dst = maptile_at_internal( up ); - const ter_t &dst_ter = dst.get_ter_t(); - if( dst_ter.has_flag( TFLAG_NO_FLOOR ) ) { - dst.add_field( fd_smoke, rng( 1, cur.get_field_intensity() ), 0_turns ); - } else { - // Can't create smoke above - smoke_up = false; - } - } - - if( !smoke_up ) { - maptile dst = maptile_at_internal( p ); - // Create thicker smoke - dst.add_field( fd_smoke, cur.get_field_intensity(), 0_turns ); - } - - // Smoke affects transparency - dirty_transparency_cache = true; - } - - // Hot air is a load on the CPU - // Don't produce too much of it if we have a lot fires nearby, they produce - // radiant heat which does what hot air would do anyway - if( adjacent_fires < 5 && rng( 0, 4 - adjacent_fires ) ) { - create_hot_air( p, cur.get_field_intensity() ); + if( process_fire_field_in_submap( map_tile, p, cur, dirty_transparency_cache ) ) { + break; } } @@ -983,7 +517,7 @@ bool map::process_fields_in_submap( submap *const current_submap, if( curtype == fd_fungal_haze ) { if( one_in( 10 - 2 * cur.get_field_intensity() ) ) { // Haze'd terrain - fungal_effects( *g, g->m ).spread_fungus( p ); + fungal_effects( *g, here ).spread_fungus( p ); } } @@ -1338,6 +872,497 @@ bool map::process_fields_in_submap( submap *const current_submap, return dirty_transparency_cache; } +bool map::process_fire_field_in_submap( maptile &map_tile, const tripoint &p, + field_entry &cur, bool &dirty_transparency_cache ) +{ + bool breaks_loop = false; + map &here = get_map(); + field_entry *tmpfld = nullptr; + cur.set_field_age( std::max( -24_hours, cur.get_field_age() ) ); + // Entire objects for ter/frn for flags + const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( here.getabs( p ) ) ); + bool sheltered = g->is_sheltered( p ); + int winddirection = g->weather.winddirection; + int windpower = get_local_windpower( g->weather.windspeed, cur_om_ter, p, winddirection, + sheltered ); + const ter_t &ter = map_tile.get_ter_t(); + const furn_t &frn = map_tile.get_furn_t(); + + // We've got ter/furn cached, so let's use that + const bool is_sealed = ter_furn_has_flag( ter, frn, TFLAG_SEALED ) && + !ter_furn_has_flag( ter, frn, TFLAG_ALLOW_FIELD_EFFECT ); + // Smoke generation probability, consumed items count + int smoke = 0; + int consumed = 0; + // How much time to add to the fire's life due to burned items/terrain/furniture + time_duration time_added = 0_turns; + // Checks if the fire can spread + const bool can_spread = !ter_furn_has_flag( ter, frn, TFLAG_FIRE_CONTAINER ); + // If the flames are in furniture with fire_container flag like brazier or oven, + // they're fully contained, so skip consuming terrain + const bool can_burn = ( ter.is_flammable() || frn.is_flammable() ) && + !ter_furn_has_flag( ter, frn, TFLAG_FIRE_CONTAINER ); + // The huge indent below should probably be somehow moved away from here + // without forcing the function to use i_at( p ) for fires without items + if( !is_sealed && map_tile.get_item_count() > 0 ) { + map_stack items_here = i_at( p ); + std::vector new_content; + for( auto it = items_here.begin(); it != items_here.end(); ) { + if( it->will_explode_in_fire() ) { + // We need to make a copy because the iterator validity is not predictable + item copy = *it; + it = items_here.erase( it ); + if( copy.detonate( p, new_content ) ) { + // Need to restart, iterators may not be valid + it = items_here.begin(); + } + } else { + ++it; + } + } + + fire_data frd( cur.get_field_intensity(), !can_spread ); + // The highest # of items this fire can remove in one turn + int max_consume = cur.get_field_intensity() * 2; + + for( auto fuel = items_here.begin(); fuel != items_here.end() && consumed < max_consume; ) { + // `item::burn` modifies the charges in order to simulate some of them getting + // destroyed by the fire, this changes the item weight, but may not actually + // destroy it. We need to spawn products anyway. + const units::mass old_weight = fuel->weight( false ); + bool destroyed = fuel->burn( frd ); + // If the item is considered destroyed, it may have negative charge count, + // see `item::burn?. This in turn means `item::weight` returns a negative value, + // which we can not use, so only call `weight` when it's still an existing item. + const units::mass new_weight = destroyed ? 0_gram : fuel->weight( false ); + if( old_weight != new_weight ) { + create_burnproducts( p, *fuel, old_weight - new_weight ); + } + + if( destroyed ) { + // If we decided the item was destroyed by fire, remove it. + // But remember its contents, except for irremovable mods, if any + const std::list content_list = fuel->contents.all_items_top(); + for( item *it : content_list ) { + if( !it->is_irremovable() ) { + new_content.push_back( item( *it ) ); + } + } + fuel = items_here.erase( fuel ); + consumed++; + } else { + ++fuel; + } + } + + spawn_items( p, new_content ); + smoke = roll_remainder( frd.smoke_produced ); + time_added = 1_turns * roll_remainder( frd.fuel_produced ); + } + + int part; + // Get the part of the vehicle in the fire (_internal skips the boundary check) + vehicle *veh = veh_at_internal( p, part ); + if( veh != nullptr ) { + veh->damage( part, cur.get_field_intensity() * 10, DT_HEAT, true ); + // Damage the vehicle in the fire. + } + if( can_burn ) { + if( ter.has_flag( TFLAG_SWIMMABLE ) ) { + // Flames die quickly on water + cur.set_field_age( cur.get_field_age() + 4_minutes ); + } + + // Consume the terrain we're on + if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE ) ) { + // The fire feeds on the ground itself until max intensity. + time_added += 1_turns * ( 5 - cur.get_field_intensity() ); + smoke += 2; + smoke += static_cast( windpower / 5 ); + if( cur.get_field_intensity() > 1 && + one_in( 200 - cur.get_field_intensity() * 50 ) ) { + destroy( p, false ); + } + + } else if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE_HARD ) && + one_in( 3 ) ) { + // The fire feeds on the ground itself until max intensity. + time_added += 1_turns * ( 4 - cur.get_field_intensity() ); + smoke += 2; + smoke += static_cast( windpower / 5 ); + if( cur.get_field_intensity() > 1 && + one_in( 200 - cur.get_field_intensity() * 50 ) ) { + destroy( p, false ); + } + + } else if( ter.has_flag( TFLAG_FLAMMABLE_ASH ) ) { + // The fire feeds on the ground itself until max intensity. + time_added += 1_turns * ( 5 - cur.get_field_intensity() ); + smoke += 2; + smoke += static_cast( windpower / 5 ); + if( cur.get_field_intensity() > 1 && + one_in( 200 - cur.get_field_intensity() * 50 ) ) { + if( p.z > 0 ) { + // We're in the air + ter_set( p, t_open_air ); + } else { + ter_set( p, t_dirt ); + } + } + + } else if( frn.has_flag( TFLAG_FLAMMABLE_ASH ) ) { + // The fire feeds on the ground itself until max intensity. + time_added += 1_turns * ( 5 - cur.get_field_intensity() ); + smoke += 2; + smoke += static_cast( windpower / 5 ); + if( cur.get_field_intensity() > 1 && + one_in( 200 - cur.get_field_intensity() * 50 ) ) { + furn_set( p, f_ash ); + add_item_or_charges( p, item( "ash" ) ); + } + + } else if( ter.has_flag( TFLAG_NO_FLOOR ) && zlevels && p.z > -OVERMAP_DEPTH ) { + // We're hanging in the air - let's fall down + tripoint dst{ p.xy(), p.z - 1 }; + if( valid_move( p, dst, true, true ) ) { + maptile dst_tile = maptile_at_internal( dst ); + field_entry *fire_there = dst_tile.find_field( fd_fire ); + if( fire_there == nullptr ) { + dst_tile.add_field( fd_fire, 1, 0_turns ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); + } else { + // Don't fuel raging fires or they'll burn forever + // as they can produce small fires above themselves + int new_intensity = std::max( cur.get_field_intensity(), + fire_there->get_field_intensity() ); + // Allow smaller fires to combine + if( new_intensity < 3 && + cur.get_field_intensity() == fire_there->get_field_intensity() ) { + new_intensity++; + } + // A raging fire below us can support us for a while + // Otherwise decay and decay fast + if( fire_there->get_field_intensity() < 3 || one_in( 10 ) ) { + cur.set_field_intensity( cur.get_field_intensity() - 1 ); + } + fire_there->set_field_intensity( new_intensity ); + } + dirty_transparency_cache = true; + return breaks_loop; + } + } + } + // Lower age is a longer lasting fire + if( time_added != 0_turns ) { + cur.set_field_age( cur.get_field_age() - time_added ); + } else if( can_burn ) { + // Nothing to burn = fire should be dying out faster + // Drain more power from big fires, so that they stop raging over nothing + // Except for fires on stoves and fireplaces, those are made to keep the fire alive + cur.mod_field_age( 10_seconds * cur.get_field_intensity() ); + } + + // Below we will access our nearest 8 neighbors, so let's cache them now + // This should probably be done more globally, because large fires will re-do it a lot + auto neighs = get_neighbors( p ); + // Get the neighbours that are allowed due to wind direction + auto maptiles = get_wind_blockers( winddirection, p ); + maptile remove_tile = std::get<0>( maptiles ); + maptile remove_tile2 = std::get<1>( maptiles ); + maptile remove_tile3 = std::get<2>( maptiles ); + std::vector neighbour_vec; + size_t end_it = static_cast( rng( 0, neighs.size() - 1 ) ); + // Start at end_it + 1, then wrap around until all elements have been processed + for( size_t i = ( end_it + 1 ) % neighs.size(), count = 0; + count != neighs.size(); + i = ( i + 1 ) % neighs.size(), count++ ) { + const auto &neigh = neighs[i]; + if( ( neigh.pos_.x != remove_tile.pos_.x && neigh.pos_.y != remove_tile.pos_.y ) || + ( neigh.pos_.x != remove_tile2.pos_.x && neigh.pos_.y != remove_tile2.pos_.y ) || + ( neigh.pos_.x != remove_tile3.pos_.x && neigh.pos_.y != remove_tile3.pos_.y ) ) { + neighbour_vec.push_back( neigh ); + } else if( x_in_y( 1, std::max( 2, windpower ) ) ) { + neighbour_vec.push_back( neigh ); + } + } + // If the flames are in a pit, it can't spread to non-pit + const bool in_pit = ter.id.id() == t_pit; + + // Count adjacent fires, to optimize out needless smoke and hot air + int adjacent_fires = 0; + + // If the flames are big, they contribute to adjacent flames + if( can_spread ) { + if( cur.get_field_intensity() > 1 && one_in( 3 ) ) { + // Basically: Scan around for a spot, + // if there is more fire there, make it bigger and give it some fuel. + // This is how big fires spend their excess age: + // making other fires bigger. Flashpoint. + if( sheltered || windpower < 5 ) { + end_it = static_cast( rng( 0, neighs.size() - 1 ) ); + for( size_t i = ( end_it + 1 ) % neighs.size(), count = 0; + count != neighs.size() && cur.get_field_age() < 0_turns; + i = ( i + 1 ) % neighs.size(), count++ ) { + maptile &dst = neighs[i]; + auto dstfld = dst.find_field( fd_fire ); + // If the fire exists and is weaker than ours, boost it + if( dstfld != nullptr && + ( dstfld->get_field_intensity() <= cur.get_field_intensity() || + dstfld->get_field_age() > cur.get_field_age() ) && + ( in_pit == ( dst.get_ter() == t_pit ) ) ) { + if( dstfld->get_field_intensity() < 2 ) { + dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); + } + + dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); + cur.set_field_age( cur.get_field_age() + 5_minutes ); + } + if( dstfld != nullptr ) { + adjacent_fires++; + } + } + } else { + end_it = static_cast( rng( 0, neighbour_vec.size() - 1 ) ); + for( size_t i = ( end_it + 1 ) % neighbour_vec.size(), count = 0; + count != neighbour_vec.size() && cur.get_field_age() < 0_turns; + i = ( i + 1 ) % neighbour_vec.size(), count++ ) { + maptile &dst = neighbour_vec[i]; + field_entry *dstfld = dst.find_field( fd_fire ); + // If the fire exists and is weaker than ours, boost it + if( dstfld != nullptr && + ( dstfld->get_field_intensity() <= cur.get_field_intensity() || + dstfld->get_field_age() > cur.get_field_age() ) && + ( in_pit == ( dst.get_ter() == t_pit ) ) ) { + if( dstfld->get_field_intensity() < 2 ) { + dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); + } + + dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); + cur.set_field_age( cur.get_field_age() + 5_minutes ); + } + + if( dstfld != nullptr ) { + adjacent_fires++; + } + } + } + } else if( cur.get_field_age() < 0_turns && cur.get_field_intensity() < 3 ) { + // See if we can grow into a stage 2/3 fire, for this + // burning neighbors are necessary in addition to + // field age < 0, or alternatively, a LOT of fuel. + + // The maximum fire intensity is 1 for a lone fire, 2 for at least 1 neighbor, + // 3 for at least 2 neighbors. + int maximum_intensity = 1; + + // The following logic looks a bit complex due to optimization concerns, so here are the semantics: + // 1. Calculate maximum field intensity based on fuel, -50 minutes is 2(medium), -500 minutes is 3(raging) + // 2. Calculate maximum field intensity based on neighbors, 3 neighbors is 2(medium), 7 or more neighbors is 3(raging) + // 3. Pick the higher maximum between 1. and 2. + if( cur.get_field_age() < -500_minutes ) { + maximum_intensity = 3; + } else { + for( auto &neigh : neighs ) { + if( neigh.get_field().find_field( fd_fire ) != nullptr ) { + adjacent_fires++; + } + } + maximum_intensity = 1 + ( adjacent_fires >= 3 ) + ( adjacent_fires >= 7 ); + + if( maximum_intensity < 2 && cur.get_field_age() < -50_minutes ) { + maximum_intensity = 2; + } + } + + // If we consumed a lot, the flames grow higher + if( cur.get_field_intensity() < maximum_intensity && cur.get_field_age() < 0_turns ) { + // Fires under 0 age grow in size. Level 3 fires under 0 spread later on. + // Weaken the newly-grown fire + cur.set_field_intensity( cur.get_field_intensity() + 1 ); + cur.set_field_age( cur.get_field_age() + 10_minutes * cur.get_field_intensity() ); + } + } + } + // Consume adjacent fuel / terrain / webs to spread. + // Allow raging fires (and only raging fires) to spread up + // Spreading down is achieved by wrecking the walls/floor and then falling + if( zlevels && cur.get_field_intensity() == 3 && p.z < OVERMAP_HEIGHT ) { + // Let it burn through the floor + maptile dst = maptile_at_internal( {p.xy(), p.z + 1} ); + const auto &dst_ter = dst.get_ter_t(); + if( dst_ter.has_flag( TFLAG_NO_FLOOR ) || + dst_ter.has_flag( TFLAG_FLAMMABLE ) || + dst_ter.has_flag( TFLAG_FLAMMABLE_ASH ) || + dst_ter.has_flag( TFLAG_FLAMMABLE_HARD ) ) { + field_entry *nearfire = dst.find_field( fd_fire ); + if( nearfire != nullptr ) { + nearfire->mod_field_age( -2_turns ); + } else { + dst.add_field( fd_fire, 1, 0_turns ); + } + // Fueling fires above doesn't cost fuel + } + } + // Our iterator will start at end_i + 1 and increment from there and then wrap around. + // This guarantees it will check all neighbors, starting from a random one + if( sheltered || windpower < 5 ) { + const size_t end_i = static_cast( rng( 0, neighs.size() - 1 ) ); + for( size_t i = ( end_i + 1 ) % neighs.size(), count = 0; + count != neighs.size(); + i = ( i + 1 ) % neighs.size(), count++ ) { + if( one_in( cur.get_field_intensity() * 2 ) ) { + // Skip some processing to save on CPU + continue; + } + + maptile &dst = neighs[i]; + // No bounds checking here: we'll treat the invalid neighbors as valid. + // We're using the map tile wrapper, so we can treat invalid tiles as sentinels. + // This will create small oddities on map edges, but nothing more noticeable than + // "cut-off" that happens with bounds checks. + + field_entry *nearfire = dst.find_field( fd_fire ); + if( nearfire != nullptr ) { + // We handled supporting fires in the section above, no need to do it here + continue; + } + + field_entry *nearwebfld = dst.find_field( fd_web ); + int spread_chance = 25 * ( cur.get_field_intensity() - 1 ); + if( nearwebfld != nullptr ) { + spread_chance = 50 + spread_chance / 2; + } + + const ter_t &dster = dst.get_ter_t(); + const furn_t &dsfrn = dst.get_furn_t(); + // Allow weaker fires to spread occasionally + const int power = cur.get_field_intensity() + one_in( 5 ); + if( can_spread && rng( 1, 100 ) < spread_chance && + ( dster.is_flammable() || dsfrn.is_flammable() ) && + ( in_pit == ( dster.id.id() == t_pit ) ) && + ( + ( power >= 3 && cur.get_field_age() < 0_turns && one_in( 20 ) ) || + ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE ) && one_in( 2 ) ) ) || + ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_ASH ) && one_in( 2 ) ) ) || + ( power >= 3 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_HARD ) && one_in( 5 ) ) ) || + nearwebfld || ( dst.get_item_count() > 0 && + flammable_items_at( p + eight_horizontal_neighbors[i] ) && + one_in( 5 ) ) + ) ) { + // Nearby open flammable ground? Set it on fire. + dst.add_field( fd_fire, 1, 0_turns ); + tmpfld = dst.find_field( fd_fire ); + if( tmpfld != nullptr ) { + // Make the new fire quite weak, so that it doesn't start jumping around instantly + tmpfld->set_field_age( 2_minutes ); + // Consume a bit of our fuel + cur.set_field_age( cur.get_field_age() + 1_minutes ); + } + if( nearwebfld ) { + nearwebfld->set_field_intensity( 0 ); + } + } + } + } else { + const size_t end_i = static_cast( rng( 0, neighbour_vec.size() - 1 ) ); + for( size_t i = ( end_i + 1 ) % neighbour_vec.size(), count = 0; + count != neighbour_vec.size(); + i = ( i + 1 ) % neighbour_vec.size(), count++ ) { + if( one_in( cur.get_field_intensity() * 2 ) ) { + // Skip some processing to save on CPU + continue; + } + + if( neighbour_vec.empty() ) { + continue; + } + + maptile &dst = neighbour_vec[i]; + // No bounds checking here: we'll treat the invalid neighbors as valid. + // We're using the map tile wrapper, so we can treat invalid tiles as sentinels. + // This will create small oddities on map edges, but nothing more noticeable than + // "cut-off" that happens with bounds checks. + + field_entry *nearfire = dst.find_field( fd_fire ); + if( nearfire != nullptr ) { + // We handled supporting fires in the section above, no need to do it here + continue; + } + + field_entry *nearwebfld = dst.find_field( fd_web ); + int spread_chance = 25 * ( cur.get_field_intensity() - 1 ); + if( nearwebfld != nullptr ) { + spread_chance = 50 + spread_chance / 2; + } + + const ter_t &dster = dst.get_ter_t(); + const furn_t &dsfrn = dst.get_furn_t(); + // Allow weaker fires to spread occasionally + const int power = cur.get_field_intensity() + one_in( 5 ); + if( can_spread && rng( 1, 100 - windpower ) < spread_chance && + ( dster.is_flammable() || dsfrn.is_flammable() ) && + ( in_pit == ( dster.id.id() == t_pit ) ) && + ( + ( power >= 3 && cur.get_field_age() < 0_turns && one_in( 20 ) ) || + ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE ) && one_in( 2 ) ) ) || + ( power >= 2 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_ASH ) && one_in( 2 ) ) ) || + ( power >= 3 && ( ter_furn_has_flag( dster, dsfrn, TFLAG_FLAMMABLE_HARD ) && one_in( 5 ) ) ) || + nearwebfld || ( dst.get_item_count() > 0 && + flammable_items_at( p + eight_horizontal_neighbors[i] ) && + one_in( 5 ) ) + ) ) { + // Nearby open flammable ground? Set it on fire. + dst.add_field( fd_fire, 1, 0_turns ); + tmpfld = dst.find_field( fd_fire ); + if( tmpfld != nullptr ) { + // Make the new fire quite weak, so that it doesn't start jumping around instantly + tmpfld->set_field_age( 2_minutes ); + // Consume a bit of our fuel + cur.set_field_age( cur.get_field_age() + 1_minutes ); + } + if( nearwebfld ) { + nearwebfld->set_field_intensity( 0 ); + } + } + } + } + // Create smoke once - above us if possible, at us otherwise + if( !ter_furn_has_flag( ter, frn, TFLAG_SUPPRESS_SMOKE ) && + rng( 0, 100 - windpower ) <= smoke && + rng( 3, 35 ) < cur.get_field_intensity() * 10 ) { + bool smoke_up = zlevels && p.z < OVERMAP_HEIGHT; + if( smoke_up ) { + tripoint up{p.xy(), p.z + 1}; + maptile dst = maptile_at_internal( up ); + const ter_t &dst_ter = dst.get_ter_t(); + if( dst_ter.has_flag( TFLAG_NO_FLOOR ) ) { + dst.add_field( fd_smoke, rng( 1, cur.get_field_intensity() ), 0_turns ); + } else { + // Can't create smoke above + smoke_up = false; + } + } + + if( !smoke_up ) { + maptile dst = maptile_at_internal( p ); + // Create thicker smoke + dst.add_field( fd_smoke, cur.get_field_intensity(), 0_turns ); + } + + // Smoke affects transparency + dirty_transparency_cache = true; + } + + // Hot air is a load on the CPU + // Don't produce too much of it if we have a lot fires nearby, they produce + // radiant heat which does what hot air would do anyway + if( adjacent_fires < 5 && rng( 0, 4 - adjacent_fires ) ) { + create_hot_air( p, cur.get_field_intensity() ); + } + + return breaks_loop; +} + // This entire function makes very little sense. Why are the rules the way they are? Why does walking into some things destroy them but not others? /* @@ -1371,37 +1396,18 @@ void map::player_in_field( player &u ) // Do things based on what field effect we are currently in. const field_type_id ft = cur.get_field_type(); - if( ft == fd_web ) { - // If we are in a web, can't walk in webs or are in a vehicle, get webbed maybe. - // Moving through multiple webs stacks the effect. - if( !u.has_trait( trait_WEB_WALKER ) && !u.in_vehicle ) { - // Between 5 and 15 minus your current web level. - u.add_effect( effect_webbed, 1_turns, num_bp, true, cur.get_field_intensity() ); - // It is spent. - cur.set_field_intensity( 0 ); - continue; - // If you are in a vehicle destroy the web. - // It should of been destroyed when you ran over it anyway. - } else if( u.in_vehicle ) { - cur.set_field_intensity( 0 ); - continue; - } - } if( ft == fd_acid ) { // Assume vehicles block acid damage entirely, // you're certainly not standing in it. if( !u.in_vehicle && !u.has_trait( trait_ACIDPROOF ) ) { int total_damage = 0; - const int intensity = cur.get_field_intensity(); - // 1-3 at intensity, 1-4 at 2, 1-5 at 3 total_damage += burn_body_part( u, cur, bp_foot_l, 2 ); total_damage += burn_body_part( u, cur, bp_foot_r, 2 ); - // 1 dmg at 1 intensity, 1-3 at 2, 1-5 at 3 - total_damage += burn_body_part( u, cur, bp_leg_l, intensity - 1 ); - total_damage += burn_body_part( u, cur, bp_leg_r, intensity - 1 ); const bool on_ground = u.is_on_ground(); if( on_ground ) { - // Before, it would just break the legs and leave the survivor alone + // Apply the effect to the remaining body parts + total_damage += burn_body_part( u, cur, bp_leg_l, 2 ); + total_damage += burn_body_part( u, cur, bp_leg_r, 2 ); total_damage += burn_body_part( u, cur, bp_hand_l, 2 ); total_damage += burn_body_part( u, cur, bp_hand_r, 2 ); total_damage += burn_body_part( u, cur, bp_torso, 2 ); @@ -1583,8 +1589,7 @@ void map::player_in_field( player &u ) // Small universal damage based on intensity, only if not electroproofed. if( !u.is_elec_immune() ) { int total_damage = 0; - for( size_t i = 0; i < num_hp_parts; i++ ) { - const bodypart_id bp = convert_bp( player::hp_to_bp( static_cast( i ) ) ).id(); + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { const int dmg = rng( 1, cur.get_field_intensity() ); total_damage += u.deal_damage( nullptr, bp, damage_instance( DT_ELECTRIC, dmg ) ).total_damage(); } @@ -1712,6 +1717,10 @@ void map::creature_in_field( Creature &critter ) const field_type_id cur_field_id = cur_field_entry.get_field_type(); for( const auto &fe : cur_field_entry.field_effects() ) { + // the field is decreased even if you are in a vehicle + if( cur_field_id->decrease_intensity_on_contact ) { + cur_field_entry.mod_field_intensity( -1 ); + } if( in_vehicle && fe.immune_in_vehicle ) { continue; } diff --git a/src/map_iterator.h b/src/map_iterator.h index aa3048b9aae7a..72044516f0e73 100644 --- a/src/map_iterator.h +++ b/src/map_iterator.h @@ -6,10 +6,14 @@ #include "enums.h" #include "point.h" +#include "point_traits.h" +template class tripoint_range { + static_assert( Tripoint::dimension == 3, "Requires tripoint type" ); private: + using traits = point_traits; /** * Generates points in a rectangle. */ @@ -17,47 +21,50 @@ class tripoint_range { friend class tripoint_range; private: - tripoint p; + Tripoint p; const tripoint_range ⦥ + public: - using value_type = tripoint; + using value_type = Tripoint; using difference_type = std::ptrdiff_t; - using pointer = tripoint *; - using reference = tripoint &; + using pointer = value_type *; + using reference = value_type &; using iterator_category = std::forward_iterator_tag; - point_generator( const tripoint &_p, const tripoint_range &_range ) + point_generator( const Tripoint &_p, const tripoint_range &_range ) : p( _p ), range( _range ) { } // Increment x, then if it goes outside range, "wrap around" and increment y // Same for y and z inline point_generator &operator++() { - p.x++; - if( p.x <= range.maxp.x ) { + traits::x( p )++; + if( traits::x( p ) <= traits::x( range.maxp ) ) { return *this; } - p.y++; - p.x = range.minp.x; - if( p.y <= range.maxp.y ) { + traits::y( p )++; + traits::x( p ) = traits::x( range.minp ); + if( traits::y( p ) <= traits::y( range.maxp ) ) { return *this; } - p.z++; - p.y = range.minp.y; + traits::z( p )++; + traits::y( p ) = traits::y( range.minp ); return *this; } - inline const tripoint &operator*() const { + inline const Tripoint &operator*() const { return p; } inline bool operator!=( const point_generator &other ) const { // Reverse coordinates order, because it will usually only be compared with endpoint // which will always differ in Z, except for the very last comparison - const tripoint &pt = other.p; - return p.z != pt.z || p.y != pt.y || p.x != pt.x; + // TODO: In C++17 this range should use a sentinel to + // optimise the comparison. + const Tripoint &pt = other.p; + return traits::z( p ) != traits::z( pt ) || p.xy() != pt.xy(); } inline bool operator==( const point_generator &other ) const { @@ -65,20 +72,16 @@ class tripoint_range } }; - tripoint minp; - tripoint maxp; + Tripoint minp; + Tripoint maxp; public: - using value_type = point_generator::value_type; - using difference_type = point_generator::difference_type; - using pointer = point_generator::pointer; - using reference = point_generator::reference; - using iterator_category = point_generator::iterator_category; - - tripoint_range( const tripoint &_minp, const tripoint &_maxp ) : - minp( _minp ), maxp( _maxp ) { - } + using value_type = typename point_generator::value_type; + using difference_type = typename point_generator::difference_type; + using pointer = typename point_generator::pointer; + using reference = typename point_generator::reference; + using iterator_category = typename point_generator::iterator_category; - tripoint_range( tripoint &&_minp, tripoint &&_maxp ) : + tripoint_range( const Tripoint &_minp, const Tripoint &_maxp ) : minp( _minp ), maxp( _maxp ) { } @@ -89,20 +92,20 @@ class tripoint_range point_generator end() const { // Return the point AFTER the last one // That is, point under (in z-levels) the first one, but one z-level below the last one - return point_generator( tripoint( minp.xy(), maxp.z + 1 ), *this ); + return point_generator( Tripoint( minp.xy(), traits::z( maxp ) + 1 ), *this ); } size_t size() const { - tripoint range( maxp - minp ); - return std::max( ++range.x * ++range.y * ++range.z, 0 ); + Tripoint range( maxp - minp ); + return std::max( ++traits::x( range ) * ++traits::y( range ) * ++traits::z( range ), 0 ); } bool empty() const { return size() == 0; } - bool is_point_inside( const tripoint &point ) const { - for( const tripoint ¤t : *this ) { + bool is_point_inside( const Tripoint &point ) const { + for( const Tripoint ¤t : *this ) { if( current == point ) { return true; } @@ -110,19 +113,21 @@ class tripoint_range return false; } - const tripoint &min() const { + const Tripoint &min() const { return minp; } - const tripoint &max() const { + const Tripoint &max() const { return maxp; } }; -inline tripoint_range points_in_radius( const tripoint ¢er, const int radius, - const int radiusz = 0 ) +template +inline tripoint_range points_in_radius( const Tripoint ¢er, const int radius, + const int radiusz = 0 ) { + static_assert( Tripoint::dimension == 3, "Requires tripoint type" ); const tripoint offset( radius, radius, radiusz ); - return tripoint_range( center - offset, center + offset ); + return tripoint_range( center - offset, center + offset ); } #endif // CATA_SRC_MAP_ITERATOR_H diff --git a/src/map_selector.cpp b/src/map_selector.cpp index 8c14a7c3a9c7f..c3de3b7fdd7a4 100644 --- a/src/map_selector.cpp +++ b/src/map_selector.cpp @@ -14,19 +14,20 @@ map_selector::map_selector( const tripoint &pos, int radius, bool accessible ) { - for( const tripoint &e : closest_tripoints_first( pos, radius ) ) { + for( const tripoint &e : closest_points_first( pos, radius ) ) { if( !accessible || get_map().clear_path( pos, e, radius, 1, 100 ) ) { data.emplace_back( e ); } } } -tripoint_range points_in_range( const map &m ) +tripoint_range points_in_range( const map &m ) { const int z = m.get_abs_sub().z; const bool hasz = m.has_zlevels(); - return tripoint_range( tripoint( 0, 0, hasz ? -OVERMAP_DEPTH : z ), - tripoint( SEEX * m.getmapsize() - 1, SEEY * m.getmapsize() - 1, hasz ? OVERMAP_HEIGHT : z ) ); + return tripoint_range( + tripoint( 0, 0, hasz ? -OVERMAP_DEPTH : z ), + tripoint( SEEX * m.getmapsize() - 1, SEEY * m.getmapsize() - 1, hasz ? OVERMAP_HEIGHT : z ) ); } cata::optional random_point( const map &m, @@ -35,7 +36,7 @@ cata::optional random_point( const map &m, return random_point( points_in_range( m ), predicate ); } -cata::optional random_point( const tripoint_range &range, +cata::optional random_point( const tripoint_range &range, const std::function &predicate ) { // Optimist approach: just assume there are plenty of suitable places and a randomly diff --git a/src/mapbuffer.cpp b/src/mapbuffer.cpp index 1b5767266c300..68a2ce922ede6 100644 --- a/src/mapbuffer.cpp +++ b/src/mapbuffer.cpp @@ -109,8 +109,9 @@ void mapbuffer::save( bool delete_after_save ) int num_saved_submaps = 0; int num_total_submaps = submaps.size(); - const tripoint map_origin = sm_to_omt_copy( g->m.get_abs_sub() ); - const bool map_has_zlevels = g != nullptr && g->m.has_zlevels(); + map &here = get_map(); + const tripoint map_origin = sm_to_omt_copy( here.get_abs_sub() ); + const bool map_has_zlevels = g != nullptr && here.has_zlevels(); static_popup popup; diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 7fedd71ff51c4..ed44da5fdb1c8 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -175,8 +175,11 @@ static const std::unordered_map ter_bitflags_map = { { "BLOCK_WIND", TFLAG_BLOCK_WIND }, // This tile will partially block the wind. { "FLAT", TFLAG_FLAT }, // This tile is flat. { "RAMP", TFLAG_RAMP }, // Can be used to move up a z-level + { "RAMP_DOWN", TFLAG_RAMP_DOWN }, // Anything entering this tile moves down a z-level + { "RAMP_UP", TFLAG_RAMP_UP }, // Anything entering this tile moves up a z-level { "RAIL", TFLAG_RAIL }, // Rail tile (used heavily) { "THIN_OBSTACLE", TFLAG_THIN_OBSTACLE }, // Passable by players and monsters. Vehicles destroy it. + { "Z_TRANSPARENT", TFLAG_Z_TRANSPARENT }, // Doesn't block vision passing through the z-level { "SMALL_PASSAGE", TFLAG_SMALL_PASSAGE } // A small passage, that large or huge things cannot pass through } }; diff --git a/src/mapdata.h b/src/mapdata.h index 15bfdee87a0d6..3efd0fa2090e2 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -195,6 +195,8 @@ enum ter_bitflags : int { TFLAG_GOES_UP, TFLAG_NO_FLOOR, TFLAG_SEEN_FROM_ABOVE, + TFLAG_RAMP_DOWN, + TFLAG_RAMP_UP, TFLAG_RAMP, TFLAG_HIDE_PLACE, TFLAG_BLOCK_WIND, @@ -202,6 +204,7 @@ enum ter_bitflags : int { TFLAG_RAIL, TFLAG_THIN_OBSTACLE, TFLAG_SMALL_PASSAGE, + TFLAG_Z_TRANSPARENT, NUM_TERFLAGS }; diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 234b022c7ddf5..1ce7a6db69db8 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1559,8 +1559,7 @@ class jmapgen_computer : public jmapgen_piece } void apply( mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y ) const override { const point r( x.get(), y.get() ); - dat.m.ter_set( r, t_console ); - dat.m.furn_set( r, f_null ); + dat.m.furn_set( r, furn_str_id( "f_console" ) ); computer *cpu = dat.m.add_computer( tripoint( r, dat.m.get_abs_sub().z ), name.translated(), security ); for( const auto &opt : options ) { @@ -4373,7 +4372,7 @@ void map::draw_lab( mapgendata &dat ) line( this, t_reinforced_glass, point( SEEX - 2, SEEY - 1 ), point( SEEX - 2, SEEY ) ); line( this, t_reinforced_glass, point( SEEX + 1, SEEY - 1 ), point( SEEX + 1, SEEY ) ); spawn_item( point( SEEX - 4, SEEY - 3 ), "id_science" ); - ter_set( point( SEEX - 3, SEEY - 3 ), t_console ); + furn_set( point( SEEX - 3, SEEY - 3 ), furn_str_id( "f_console" ) ); tmpcomp = add_computer( tripoint( SEEX - 3, SEEY - 3, abs_sub.z ), _( "Bionic access" ), 3 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); @@ -4682,8 +4681,10 @@ void map::draw_temple( mapgendata &dat ) square( this, t_rock_floor, point( SEEX - 1, 1 ), point( SEEX + 2, 4 ) ); square( this, t_rock_floor, point( SEEX, 5 ), point( SEEX + 1, SOUTH_EDGE ) ); line( this, t_stairs_up, point( SEEX, SOUTH_EDGE ), point( SEEX + 1, SOUTH_EDGE ) ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ) ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ) ); + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ), + relic_procgen_id( "cult" ) ); + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ), + relic_procgen_id( "cult" ) ); return; } @@ -5088,7 +5089,8 @@ void map::draw_mine( mapgendata &dat ) calendar::start_of_cataclysm ); } place_spawns( GROUP_DOG_THING, 1, point( SEEX, SEEX ), point( SEEX + 1, SEEX + 1 ), 1, true, true ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( SEEY, SEEY + 1 ), abs_sub.z ) ); + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( SEEY, SEEY + 1 ), abs_sub.z ), + relic_procgen_id( "netherum_tunnels" ) ); } break; @@ -5133,7 +5135,7 @@ void map::draw_mine( mapgendata &dat ) break; } - ter_set( point( SEEX, SEEY ), t_console ); + furn_set( point( SEEX, SEEY ), furn_str_id( "f_console" ) ); tmpcomp = add_computer( tripoint( SEEX, SEEY, abs_sub.z ), _( "NEPowerOS" ), 0 ); tmpcomp->add_option( _( "Read Logs" ), COMPACT_AMIGARA_LOG, 0 ); tmpcomp->add_option( _( "Initiate Tremors" ), COMPACT_AMIGARA_START, 4 ); @@ -5673,11 +5675,8 @@ void map::place_vending( const point &p, const std::string &type, bool reinforce } } -character_id map::place_npc( const point &p, const string_id &type, bool force ) +character_id map::place_npc( const point &p, const string_id &type ) { - if( !force && !get_option( "STATIC_NPC" ) ) { - return character_id(); //Do not generate an npc. - } shared_ptr_fast temp = make_shared_fast(); temp->normalize(); temp->load_npc_template( type ); @@ -5988,7 +5987,7 @@ std::unique_ptr map::add_vehicle_to_map( computer *map::add_computer( const tripoint &p, const std::string &name, int security ) { // TODO: Turn this off? - ter_set( p, t_console ); + furn_set( p, furn_str_id( "f_console" ) ); point l; submap *const place_on_submap = get_submap_at( p, l ); place_on_submap->set_computer( l, computer( name, security ) ); @@ -6047,7 +6046,7 @@ void map::rotate( int turns, const bool setpos_safe ) // to be between 0-11,0-11 and teleports NPCs when used inside of update_mapgen // calls const tripoint new_global_sq = sq - local_sq + new_pos; - np.setpos( g->m.getlocal( new_global_sq ) ); + np.setpos( get_map().getlocal( new_global_sq ) ); } else { // OK, this is ugly: we remove the NPC from the whole map // Then we place it back from scratch @@ -6372,7 +6371,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, calendar::start_of_cataclysm ); - m->ter_set( point( biox, bioy + 2 ), t_console ); + m->furn_set( point( biox, bioy + 2 ), furn_str_id( "f_console" ) ); computer *tmpcomp = m->add_computer( tripoint( biox, bioy + 2, z ), _( "Bionic access" ), 2 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -6391,7 +6390,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, calendar::start_of_cataclysm ); - m->ter_set( point( biox, bioy - 2 ), t_console ); + m->furn_set( point( biox, bioy - 2 ), furn_str_id( "f_console" ) ); computer *tmpcomp2 = m->add_computer( tripoint( biox, bioy - 2, z ), _( "Bionic access" ), 2 ); tmpcomp2->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp2->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -6411,7 +6410,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, calendar::start_of_cataclysm ); - m->ter_set( point( biox + 2, bioy ), t_console ); + m->furn_set( point( biox + 2, bioy ), furn_str_id( "f_console" ) ); computer *tmpcomp = m->add_computer( tripoint( biox + 2, bioy, z ), _( "Bionic access" ), 2 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -6429,7 +6428,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) mapf::furn_bind( "c", f_counter ) ); m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, 0 ); - m->ter_set( point( biox - 2, bioy ), t_console ); + m->furn_set( point( biox - 2, bioy ), furn_str_id( "f_console" ) ); computer *tmpcomp2 = m->add_computer( tripoint( biox - 2, bioy, z ), _( "Bionic access" ), 2 ); tmpcomp2->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp2->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -6577,7 +6576,7 @@ void build_mine_room( room_type type, const point &p1, const point &p2, mapgenda // Main build switch! switch( type ) { case room_mine_shaft: { - m->ter_set( p1 + point_south_east, t_console ); + m->furn_set( p1 + point_south_east, furn_str_id( "f_console" ) ); line( m, t_wall, point( p2.x - 2, p1.y + 2 ), point( p2.x - 1, p1.y + 2 ) ); m->ter_set( point( p2.x - 2, p1.y + 1 ), t_elevator ); m->ter_set( point( p2.x - 1, p1.y + 1 ), t_elevator_control_off ); diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index 9077f9ba3a7b3..db75db95b46b7 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -103,7 +103,6 @@ building_gen_pointer get_mapgen_cfunction( const std::string &ident ) { "road_tee", &mapgen_road }, { "road_four_way", &mapgen_road }, { "field", &mapgen_field }, - { "bridge", &mapgen_bridge }, { "highway", &mapgen_highway }, { "railroad_straight", &mapgen_railroad }, { "railroad_curved", &mapgen_railroad }, @@ -1356,45 +1355,6 @@ void mapgen_sewer_four_way( mapgendata &dat ) m->place_items( "sewer", 28, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, dat.when() ); } -/////////////////// -void mapgen_bridge( mapgendata &dat ) -{ - map *const m = &dat.m; - const auto is_river = [&]( const om_direction::type dir ) { - return dat.t_nesw[static_cast( om_direction::add( dir, - dat.terrain_type()->get_dir() ) )]->is_river(); - }; - - const bool river_west = is_river( om_direction::type::west ); - const bool river_east = is_river( om_direction::type::east ); - - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - if( i < 2 ) { - m->ter_set( point( i, j ), river_west ? t_water_moving_dp : grass_or_dirt() ); - } else if( i >= SEEX * 2 - 2 ) { - m->ter_set( point( i, j ), river_east ? t_water_moving_dp : grass_or_dirt() ); - } else if( i == 2 || i == SEEX * 2 - 3 ) { - m->ter_set( point( i, j ), t_guardrail_bg_dp ); - } else if( i == 3 || i == SEEX * 2 - 4 ) { - m->ter_set( point( i, j ), t_sidewalk_bg_dp ); - } else { - if( ( i == SEEX - 1 || i == SEEX ) && j % 4 != 0 ) { - m->ter_set( point( i, j ), t_pavement_y_bg_dp ); - } else { - m->ter_set( point( i, j ), t_pavement_bg_dp ); - } - } - } - } - - // spawn regular road out of fuel vehicles - VehicleSpawn::apply( vspawn_id( "default_bridge" ), *m, "bridge" ); - - m->rotate( static_cast( dat.terrain_type()->get_dir() ) ); - m->place_items( "road", 5, point_zero, point( SEEX * 2 - 1, SEEX * 2 - 1 ), false, dat.when() ); -} - void mapgen_highway( mapgendata &dat ) { map *const m = &dat.m; diff --git a/src/mapgen_functions.h b/src/mapgen_functions.h index 004d7919bdb4a..cc719b05c4f1f 100644 --- a/src/mapgen_functions.h +++ b/src/mapgen_functions.h @@ -44,7 +44,7 @@ void mapgen_hive( mapgendata &dat ); void mapgen_spider_pit( mapgendata &dat ); void mapgen_river_center( mapgendata &dat ); void mapgen_road( mapgendata &dat ); -void mapgen_bridge( mapgendata &dat ); +//void mapgen_bridge( mapgendata &dat ); void mapgen_railroad( mapgendata &dat ); void mapgen_railroad_bridge( mapgendata &dat ); void mapgen_highway( mapgendata &dat ); diff --git a/src/mapsharing.cpp b/src/mapsharing.cpp index da5d18872e296..f8715c8bfa96e 100644 --- a/src/mapsharing.cpp +++ b/src/mapsharing.cpp @@ -134,13 +134,15 @@ void ofstream_wrapper::close() return; } - if( file_stream.fail() ) { + file_stream.flush(); + bool failed = file_stream.fail(); + file_stream.close(); + if( failed ) { // Remove the incomplete or otherwise faulty file (if possible). // Failures from it are ignored as we can't really do anything about them. remove_file( temp_path ); throw std::runtime_error( "writing to file failed" ); } - file_stream.close(); if( !rename_file( temp_path, path ) ) { // Leave the temp path, so the user can move it if possible. throw std::runtime_error( "moving temporary file \"" + temp_path + "\" failed" ); diff --git a/src/martialarts.cpp b/src/martialarts.cpp index cff81925eb711..1e5222c0b15cf 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -981,7 +981,8 @@ bool character_martial_arts::can_arm_block( const Character &owner ) const skill_unarmed ); // Success conditions. - if( !owner.is_limb_broken( hp_arm_l ) || !owner.is_limb_broken( hp_arm_r ) ) { + if( !owner.is_limb_broken( bodypart_id( "arm_l" ) ) || + !owner.is_limb_broken( bodypart_id( "arm_r" ) ) ) { if( unarmed_skill >= ma.arm_block ) { return true; } else if( ma.arm_block_with_bio_armor_arms && owner.has_bionic( bio_armor_arms ) ) { diff --git a/src/mattack_actors.cpp b/src/mattack_actors.cpp index ccfade8908d19..bb6cf66b59c6c 100644 --- a/src/mattack_actors.cpp +++ b/src/mattack_actors.cpp @@ -83,8 +83,9 @@ bool leap_actor::call( monster &z ) const if( !allow_no_target && z.attack_target() == nullptr ) { return false; } + map &here = get_map(); std::multimap candidates; - for( const tripoint &candidate : g->m.points_in_radius( z.pos(), max_range ) ) { + for( const tripoint &candidate : here.points_in_radius( z.pos(), max_range ) ) { if( candidate == z.pos() ) { continue; } @@ -113,9 +114,9 @@ bool leap_actor::call( monster &z ) const } bool blocked_path = false; // check if monster has a clear path to the proposed point - std::vector line = g->m.find_clear_path( z.pos(), dest ); + std::vector line = here.find_clear_path( z.pos(), dest ); for( auto &i : line ) { - if( g->m.impassable( i ) ) { + if( here.impassable( i ) ) { blocked_path = true; break; } @@ -166,7 +167,7 @@ void mon_spellcasting_actor::load_internal( const JsonObject &obj, const std::st spell_data = intermediate.get_spell(); spell_data.set_message( monster_message ); avatar fake_player; - move_cost = spell_data.casting_time( fake_player ); + move_cost = spell_data.casting_time( fake_player, true ); } bool mon_spellcasting_actor::call( monster &mon ) const @@ -286,7 +287,7 @@ bool melee_actor::call( monster &z ) const int hitspread = target->deal_melee_attack( &z, dice( acc, 10 ) ); if( hitspread < 0 ) { - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; sfx::play_variant_sound( "mon_bite", "bite_miss", sfx::get_heard_volume( z.pos() ), sfx::get_heard_angle( z.pos() ) ); target->add_msg_player_or_npc( msg_type, miss_msg_u, miss_msg_npc, z.name() ); diff --git a/src/melee.cpp b/src/melee.cpp index 386b6c70e8871..feb848e922141 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -265,7 +265,7 @@ bool Character::handle_melee_wear( item &shield, float wear_multiplier ) if( comp.typeId() == big_comp && !is_armed() ) { wield( comp ); } else { - g->m.add_item_or_charges( pos(), comp ); + get_map().add_item_or_charges( pos(), comp ); } } } else { @@ -316,7 +316,7 @@ float Character::hit_roll() const hit *= 0.75f; } - hit *= std::max( 0.25f, 1.0f - encumb( bp_torso ) / 100.0f ); + hit *= std::max( 0.25f, 1.0f - encumb( bodypart_id( "torso" ) ) / 100.0f ); return melee::melee_hit_range( hit ); } @@ -339,7 +339,7 @@ std::string Character::get_miss_reason() // in one turn add_miss_reason( _( "Your torso encumbrance throws you off-balance." ), - roll_remainder( encumb( bp_torso ) / 10.0 ) ); + roll_remainder( encumb( bodypart_id( "torso" ) ) / 10.0 ) ); const int farsightedness = 2 * ( has_trait( trait_HYPEROPIC ) && !worn_with_flag( "FIX_FARSIGHT" ) && !has_effect( effect_contacts ) ); @@ -454,6 +454,7 @@ void Character::melee_attack( Creature &t, bool allow_special, const matec_id &f int move_cost = attack_speed( *cur_weapon ); + Character &player_character = get_player_character(); if( hit_spread < 0 ) { int stumble_pen = stumble( *this, *cur_weapon ); sfx::generate_melee_sound( pos(), t.pos(), false, false ); @@ -476,7 +477,7 @@ void Character::melee_attack( Creature &t, bool allow_special, const matec_id &f } else { add_msg( _( "You miss." ) ); } - } else if( g->u.sees( *this ) ) { + } else if( player_character.sees( *this ) ) { if( stumble_pen >= 60 ) { add_msg( _( "%s misses and stumbles with the momentum." ), name ); } else if( stumble_pen >= 10 ) { @@ -502,7 +503,7 @@ void Character::melee_attack( Creature &t, bool allow_special, const matec_id &f } else { melee::melee_stats.hit_count += 1; // Remember if we see the monster at start - it may change - const bool seen = g->u.sees( t ); + const bool seen = player_character.sees( t ); // Start of attacks. const bool critical_hit = scored_crit( t.dodge_roll(), *cur_weapon ); if( critical_hit ) { @@ -542,6 +543,16 @@ void Character::melee_attack( Creature &t, bool allow_special, const matec_id &f perform_technique( technique, t, d, move_cost ); } + //player has a very small chance, based on their intelligence, to learn a style whilst using the CQB bionic + if( has_active_bionic( bio_cqb ) && !martial_arts_data.knows_selected_style() ) { + /** @EFFECT_INT slightly increases chance to learn techniques when using CQB bionic */ + // Enhanced Memory Banks bionic doubles chance to learn martial art + const int bionic_boost = has_active_bionic( bionic_id( bio_memory ) ) ? 2 : 1; + if( one_in( ( 1400 - ( get_int() * 50 ) ) / bionic_boost ) ) { + martial_arts_data.learn_current_style_CQB( is_player() ); + } + } + // Proceed with melee attack. if( !t.is_dead_state() ) { // Handles speed penalties to monster & us, etc @@ -594,7 +605,7 @@ void Character::melee_attack( Creature &t, bool allow_special, const matec_id &f } // Treat monster as seen if we see it before or after the attack - if( seen || g->u.sees( t ) ) { + if( seen || player_character.sees( t ) ) { std::string message = melee_message( technique, *this, dealt_dam ); player_hit_message( this, message, t, dam, critical_hit ); } else { @@ -664,6 +675,7 @@ void player::reach_attack( const tripoint &p ) int move_cost = attack_speed( weapon ); int skill = std::min( 10, get_skill_level( skill_stabbing ) ); int t = 0; + map &here = get_map(); std::vector path = line_to( pos(), p, t, 0 ); path.pop_back(); // Last point is our critter for( const tripoint &path_point : path ) { @@ -677,13 +689,13 @@ void player::reach_attack( const tripoint &p ) critter = inter; break; /** @EFFECT_STABBING increases ability to reach attack through fences */ - } else if( g->m.impassable( path_point ) && + } else if( here.impassable( path_point ) && // Fences etc. Spears can stab through those !( weapon.has_flag( "SPEAR" ) && - g->m.has_flag( "THIN_OBSTACLE", path_point ) && + here.has_flag( "THIN_OBSTACLE", path_point ) && x_in_y( skill, 10 ) ) ) { /** @EFFECT_STR increases bash effects when reach attacking past something */ - g->m.bash( path_point, str_cur + weapon.damage_melee( DT_BASH ) ); + here.bash( path_point, str_cur + weapon.damage_melee( DT_BASH ) ); handle_melee_wear( weapon ); mod_moves( -move_cost ); return; @@ -830,7 +842,7 @@ float player::get_dodge() const if( has_effect( effect_grabbed ) ) { int zed_number = 0; - for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { + for( auto &dest : get_map().points_in_radius( pos(), 1, 0 ) ) { const monster *const mon = g->critter_at( dest ); if( mon && mon->has_effect( effect_grabbing ) ) { zed_number++; @@ -862,6 +874,12 @@ float player::get_dodge() const ret *= speed_stat / 100.0f; } + //Dodge decreases linearly to 0 when below 50% stamina. + const float stamina_ratio = static_cast( get_stamina() ) / get_stamina_max(); + if( stamina_ratio <= .5 ) { + ret *= 2 * stamina_ratio; + } + return std::max( 0.0f, ret ); } @@ -1164,7 +1182,7 @@ matec_id Character::pick_technique( Creature &t, const item &weap, bool downed = t.has_effect( effect_downed ); bool stunned = t.has_effect( effect_stunned ); - bool wall_adjacent = g->m.is_wall_adjacent( pos() ); + bool wall_adjacent = get_map().is_wall_adjacent( pos() ); // first add non-aoe tecs for( const matec_id &tec_id : all ) { @@ -1347,7 +1365,7 @@ bool Character::valid_aoe_technique( Creature &t, const ma_technique &technique, } if( targets.empty() && technique.aoe == "spin" ) { - for( const tripoint &tmp : g->m.points_in_radius( pos(), 1 ) ) { + for( const tripoint &tmp : get_map().points_in_radius( pos(), 1 ) ) { if( tmp == t.pos() ) { continue; } @@ -1470,6 +1488,7 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, d t.add_effect( effect_stunned, rng( 1_turns, time_duration::from_turns( technique.stun_dur ) ) ); } + map &here = get_map(); if( technique.knockback_dist ) { const tripoint prev_pos = t.pos(); // track target startpoint for knockback_follow const int kb_offset_x = rng( -technique.knockback_spread, technique.knockback_spread ); @@ -1480,10 +1499,10 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, d } // This technique makes the player follow into the tile the target was knocked from if( technique.knockback_follow ) { - const optional_vpart_position vp0 = g->m.veh_at( pos() ); + const optional_vpart_position vp0 = here.veh_at( pos() ); vehicle *const veh0 = veh_pointer_or_null( vp0 ); - bool to_swimmable = g->m.has_flag( "SWIMMABLE", prev_pos ); - bool to_deepwater = g->m.has_flag( TFLAG_DEEP_WATER, prev_pos ); + bool to_swimmable = here.has_flag( "SWIMMABLE", prev_pos ); + bool to_deepwater = here.has_flag( TFLAG_DEEP_WATER, prev_pos ); // Check if it's possible to move to the new tile bool move_issue = @@ -1491,7 +1510,7 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, d ( to_swimmable && to_deepwater ) || // Dive into deep water is_mounted() || ( veh0 != nullptr && std::abs( veh0->velocity ) > 100 ) || // Diving from moving vehicle - ( veh0 != nullptr && veh0->player_in_control( g->u ) ) || // Player is driving + ( veh0 != nullptr && veh0->player_in_control( get_avatar() ) ) || // Player is driving has_effect( effect_amigara ); if( !move_issue ) { @@ -1518,7 +1537,7 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, d } if( technique.disarms && p != nullptr && p->is_armed() ) { - g->m.add_item_or_charges( p->pos(), p->remove_weapon() ); + here.add_item_or_charges( p->pos(), p->remove_weapon() ); if( p->is_player() ) { add_msg_if_npc( _( " disarms you!" ) ); } else { @@ -1558,16 +1577,6 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, d moves = temp_moves; set_stamina( temp_stamina ); } - - //player has a very small chance, based on their intelligence, to learn a style whilst using the CQB bionic - if( has_active_bionic( bio_cqb ) && !martial_arts_data.knows_selected_style() ) { - /** @EFFECT_INT slightly increases chance to learn techniques when using CQB bionic */ - // Enhanced Memory Banks bionic doubles chance to learn martial art - const int bionic_boost = has_active_bionic( bionic_id( bio_memory ) ) ? 2 : 1; - if( one_in( ( 1400 - ( get_int() * 50 ) ) / bionic_boost ) ) { - martial_arts_data.learn_current_style_CQB( is_player() ); - } - } } static int blocking_ability( const item &shield ) @@ -1689,11 +1698,11 @@ bool Character::block_hit( Creature *source, bodypart_id &bp_hit, damage_instanc // Check if we should actually use the right side to block if( bp_hit == bodypart_id( "leg_l" ) ) { - if( hp_cur[hp_leg_r] > hp_cur[hp_leg_l] ) { + if( get_part_hp_cur( bodypart_id( "leg_r" ) ) > get_part_hp_cur( bodypart_id( "leg_l" ) ) ) { bp_hit = bodypart_id( "leg_r" ); } } else { - if( hp_cur[hp_arm_r] > hp_cur[hp_arm_l] ) { + if( get_part_hp_cur( bodypart_id( "arm_r" ) ) > get_part_hp_cur( bodypart_id( "arm_l" ) ) ) { bp_hit = bodypart_id( "arm_r" ); } } @@ -2187,6 +2196,7 @@ void player_hit_message( Character *attacker, const std::string &message, std::string sSCTmod; game_message_type gmtSCTcolor = m_good; + Character &player_character = get_player_character(); if( dam <= 0 ) { if( attacker->is_npc() ) { //~ NPC hits something but does no damage @@ -2196,9 +2206,9 @@ void player_hit_message( Character *attacker, const std::string &message, msg = string_format( _( "%s but do no damage." ), message ); } msgtype = m_neutral; - } else if( - crit ) { //Player won't see exact numbers of damage dealt by NPC unless player has DEBUG_NIGHTVISION trait - if( attacker->is_npc() && !g->u.has_trait( trait_DEBUG_NIGHTVISION ) ) { + } else if( crit ) { + //Player won't see exact numbers of damage dealt by NPC unless player has DEBUG_NIGHTVISION trait + if( attacker->is_npc() && !player_character.has_trait( trait_DEBUG_NIGHTVISION ) ) { //~ NPC hits something (critical) msg = string_format( _( "%s. Critical!" ), message ); } else { @@ -2208,7 +2218,7 @@ void player_hit_message( Character *attacker, const std::string &message, sSCTmod = _( "Critical!" ); gmtSCTcolor = m_critical; } else { - if( attacker->is_npc() && !g->u.has_trait( trait_DEBUG_NIGHTVISION ) ) { + if( attacker->is_npc() && !player_character.has_trait( trait_DEBUG_NIGHTVISION ) ) { //~ NPC hits something msg = string_format( _( "%s." ), message ); } else { @@ -2250,8 +2260,8 @@ int Character::attack_speed( const item &weap ) const const int skill_cost = static_cast( ( base_move_cost * ( 15 - melee_skill ) / 15 ) ); /** @EFFECT_DEX increases attack speed */ const int dexbonus = dex_cur / 2; - const int encumbrance_penalty = encumb( bp_torso ) + - ( encumb( bp_hand_l ) + encumb( bp_hand_r ) ) / 2; + const int encumbrance_penalty = encumb( bodypart_id( "torso" ) ) + + ( encumb( bodypart_id( "hand_l" ) ) + encumb( bodypart_id( "hand_r" ) ) ) / 2; const int ma_move_cost = mabuff_attack_cost_penalty(); const float stamina_ratio = static_cast( get_stamina() ) / static_cast ( get_stamina_max() ); @@ -2366,6 +2376,7 @@ void player::disarm( npc &target ) return; } + map &here = get_map(); // hitspread >= 0, which means we are going to disarm by grabbing target by their weapon if( !is_armed() ) { /** @EFFECT_UNARMED increases chance to disarm, bonus when nothing wielded */ @@ -2383,7 +2394,7 @@ void player::disarm( npc &target ) add_msg( _( "You grab at %s and pull with all your force, but it drops nearby!" ), it.tname() ); const tripoint tp = target.pos() + tripoint( rng( -1, 1 ), rng( -1, 1 ), 0 ); - g->m.add_item_or_charges( tp, target.i_rem( &it ) ); + here.add_item_or_charges( tp, target.i_rem( &it ) ); mod_moves( -100 ); } else { add_msg( _( "You grab at %s and pull with all your force, but in vain!" ), it.tname() ); @@ -2400,7 +2411,7 @@ void player::disarm( npc &target ) add_msg( _( "You smash %s with all your might forcing their %s to drop down nearby!" ), target.name, it.tname() ); const tripoint tp = target.pos() + tripoint( rng( -1, 1 ), rng( -1, 1 ), 0 ); - g->m.add_item_or_charges( tp, target.i_rem( &it ) ); + here.add_item_or_charges( tp, target.i_rem( &it ) ); } else { add_msg( _( "You smash %s with all your might but %s remains in their hands!" ), target.name, it.tname() ); diff --git a/src/memorial_logger.cpp b/src/memorial_logger.cpp index fd85c8ae4bb2b..6442b7ca7e568 100644 --- a/src/memorial_logger.cpp +++ b/src/memorial_logger.cpp @@ -87,6 +87,50 @@ static const trait_id trait_CANNIBAL( "CANNIBAL" ); static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" ); static const trait_id trait_SAPIOVORE( "SAPIOVORE" ); +memorial_log_entry::memorial_log_entry( const std::string &preformatted_msg ) : + preformatted_( preformatted_msg ) +{} + +memorial_log_entry::memorial_log_entry( time_point time, const oter_type_str_id &oter_id, + const std::string &oter_name, const std::string &msg ) : + time_( time ), oter_id_( oter_id ), oter_name_( oter_name ), message_( msg ) +{} + +std::string memorial_log_entry::to_string() const +{ + if( preformatted_ ) { + return *preformatted_; + } else { + return "| " + ::to_string( time_ ) + " | " + oter_name_ + " | " + message_; + } +} + +void memorial_log_entry::deserialize( JsonIn &jsin ) +{ + JsonObject jo = jsin.get_object(); + if( jo.read( "preformatted", preformatted_ ) ) { + return; + } + jo.read( "time", time_, true ); + jo.read( "oter_id", oter_id_, true ); + jo.read( "oter_name", oter_name_, true ); + jo.read( "message", message_, true ); +} + +void memorial_log_entry::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + if( preformatted_ ) { + jsout.member( "preformatted", preformatted_ ); + } else { + jsout.member( "time", time_ ); + jsout.member( "oter_id", oter_id_ ); + jsout.member( "oter_name", oter_name_ ); + jsout.member( "message", message_ ); + } + jsout.end_object(); +} + void memorial_logger::clear() { log.clear(); @@ -100,39 +144,55 @@ void memorial_logger::clear() void memorial_logger::add( const std::string &male_msg, const std::string &female_msg ) { - const std::string &msg = g->u.male ? male_msg : female_msg; + Character &player_character = get_player_character(); + const std::string &msg = player_character.male ? male_msg : female_msg; if( msg.empty() ) { return; } - const oter_id &cur_ter = overmap_buffer.ter( g->u.global_omt_location() ); - const std::string &location = cur_ter->get_name(); - - std::string log_message = "| " + to_string( calendar::turn ) + " | " + location + " | " + msg; + const oter_id &cur_ter = overmap_buffer.ter( player_character.global_omt_location() ); + const oter_type_str_id cur_oter_type = cur_ter->get_type_id(); + const std::string &oter_name = cur_ter->get_name(); - log.push_back( log_message ); + log.push_back( { calendar::turn, cur_oter_type, oter_name, msg } ); } /** - * Loads the data in a memorial file from the given ifstream. All the memorial - * entry lines begin with a pipe (|). - * @param fin The ifstream to read the memorial entries from. + * Loads the data in a memorial file from the given ifstream. + * In legacy format all the memorial entry lines begin with a pipe (|). + * (This legacy format stopped being used before 0.F release.) + * In new format the entries are stored as json. + * @param fin The stream to read the memorial entries from. */ void memorial_logger::load( std::istream &fin ) { - std::string entry; log.clear(); - while( fin.peek() == '|' ) { - getline( fin, entry ); - // strip all \r from end of string - while( *entry.rbegin() == '\r' ) { - entry.pop_back(); + if( fin.peek() == '|' ) { + // Legacy plain text format + while( fin.peek() == '|' ) { + std::string entry; + getline( fin, entry ); + // strip all \r from end of string + while( *entry.rbegin() == '\r' ) { + entry.pop_back(); + } + log.emplace_back( entry ); + } + } else { + JsonIn jsin( fin ); + if( !jsin.read( log ) ) { + debugmsg( "Error reading JSON memorial log" ); } - log.push_back( entry ); } } +void memorial_logger::save( std::ostream &os ) const +{ + JsonOut jsout( os ); + jsout.write( log ); +} + /** * Concatenates all of the memorial log entries, delimiting them with newlines, * and returns the resulting string. Used for saving and for writing out to the @@ -144,16 +204,17 @@ std::string memorial_logger::dump() const std::string output; for( auto &elem : log ) { - output += elem; + output += elem.to_string(); output += eol; } return output; } -void memorial_logger::write( std::ostream &file, const std::string &epitaph ) const +void memorial_logger::write_text_memorial( std::ostream &file, + const std::string &epitaph ) const { - avatar &u = g->u; + avatar &u = get_avatar(); static const char *eol = cata_files::eol(); //Size of indents in the memorial file @@ -203,18 +264,18 @@ void memorial_logger::write( std::ostream &file, const std::string &epitaph ) co //HP const auto limb_hp = - [&file, &indent, &u]( const std::string & desc, const hp_part bp ) { + [&file, &indent, &u]( const std::string & desc, const bodypart_id bp ) { file << indent << - string_format( desc, u.get_hp( bp ), u.get_hp_max( bp ) ) << eol; + string_format( desc, u.get_part_hp_cur( bp ), u.get_part_hp_max( bp ) ) << eol; }; file << _( "Final HP:" ) << eol; - limb_hp( _( " Head: %d/%d" ), hp_head ); - limb_hp( _( "Torso: %d/%d" ), hp_torso ); - limb_hp( _( "L Arm: %d/%d" ), hp_arm_l ); - limb_hp( _( "R Arm: %d/%d" ), hp_arm_r ); - limb_hp( _( "L Leg: %d/%d" ), hp_leg_l ); - limb_hp( _( "R Leg: %d/%d" ), hp_leg_r ); + limb_hp( _( " Head: %d/%d" ), bodypart_id( "head" ) ); + limb_hp( _( "Torso: %d/%d" ), bodypart_id( "torso" ) ); + limb_hp( _( "L Arm: %d/%d" ), bodypart_id( "arm_l" ) ); + limb_hp( _( "R Arm: %d/%d" ), bodypart_id( "arm_r" ) ); + limb_hp( _( "L Leg: %d/%d" ), bodypart_id( "leg_l" ) ); + limb_hp( _( "R Leg: %d/%d" ), bodypart_id( "leg_r" ) ); file << eol; //Stats @@ -362,12 +423,33 @@ void memorial_logger::write( std::ostream &file, const std::string &epitaph ) co file << dump(); } +void memorial_logger::write_json_memorial( std::ostream &memorial_file ) const +{ + JsonOut jsout( memorial_file, true, 2 ); + jsout.start_object(); + jsout.member( "memorial_version", 0 ); + jsout.member( "log", log ); + jsout.member( "achievements", g->achievements() ); + jsout.member( "stats", g->stats() ); + + std::map, cata_variant> scores; + for( const score *scr : g->stats().valid_scores() ) { + scores.emplace( scr->id, scr->value( g->stats() ) ); + } + jsout.member( "scores", scores ); + + jsout.end_object(); +} + void memorial_logger::notify( const cata::event &e ) { + Character &player_character = get_player_character(); + character_id avatar_id = player_character.getID(); + std::string &avatar_name = player_character.name; switch( e.type() ) { case event_type::activates_artifact: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string item_name = e.get( "item_name" ); //~ %s is artifact name add( pgettext( "memorial_male", "Activated the %s." ), @@ -378,7 +460,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::activates_mininuke: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Activated a mininuke." ), pgettext( "memorial_female", "Activated a mininuke." ) ); } @@ -386,7 +468,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::administers_mutagen: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { mutagen_technique technique = e.get( "technique" ); switch( technique ) { case mutagen_technique::consumed_mutagen: @@ -427,15 +509,26 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::becomes_wanted: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Became wanted by the police!" ), pgettext( "memorial_female", "Became wanted by the police!" ) ); } break; } + case event_type::broken_bone: { + character_id ch = e.get( "character" ); + if( ch == avatar_id ) { + body_part part = e.get( "part" ); + //~ %s is bodypart + add( pgettext( "memorial_male", "Broke his %s." ), + pgettext( "memorial_female", "Broke her %s." ), + body_part_name( convert_bp( part ).id() ) ); + } + break; + } case event_type::broken_bone_mends: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { body_part part = e.get( "part" ); //~ %s is bodypart add( pgettext( "memorial_male", "Broken %s began to mend." ), @@ -446,7 +539,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::buries_corpse: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { const mtype &corpse_type = e.get( "corpse_type" ).obj(); std::string corpse_name = e.get( "corpse_name" ); if( corpse_name.empty() ) { @@ -471,7 +564,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_gains_effect: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { const effect_type &type = e.get( "effect" ).obj(); const std::string message = type.get_apply_memorial_log(); if( !message.empty() ) { @@ -483,11 +576,11 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_kills_character: { character_id ch = e.get( "killer" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string name = e.get( "victim_name" ); - bool cannibal = g->u.has_trait( trait_CANNIBAL ); - bool psycho = g->u.has_trait( trait_PSYCHOPATH ); - if( g->u.has_trait( trait_SAPIOVORE ) ) { + bool cannibal = player_character.has_trait( trait_CANNIBAL ); + bool psycho = player_character.has_trait( trait_PSYCHOPATH ); + if( player_character.has_trait( trait_SAPIOVORE ) ) { add( pgettext( "memorial_male", "Caught and killed an ape. Prey doesn't have a name." ), pgettext( "memorial_female", @@ -522,7 +615,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_kills_monster: { character_id ch = e.get( "killer" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { mtype_id victim_type = e.get( "victim_type" ); if( victim_type->difficulty >= 30 ) { add( pgettext( "memorial_male", "Killed a %s." ), @@ -534,7 +627,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_loses_effect: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { const effect_type &type = e.get( "effect" ).obj(); const std::string message = type.get_remove_memorial_log(); if( !message.empty() ) { @@ -546,7 +639,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_triggers_trap: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { trap_str_id trap = e.get( "trap" ); if( trap == tr_bubblewrap ) { add( pgettext( "memorial_male", "Stepped on bubble wrap." ), @@ -635,7 +728,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::consumes_marloss_item: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { const itype *it = item_controller->find_template( e.get( "itype" ) ); std::string itname = it->nname( 1 ); @@ -646,7 +739,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::crosses_marloss_threshold: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Opened the Marloss Gateway." ), pgettext( "memorial_female", "Opened the Marloss Gateway." ) ); } @@ -654,7 +747,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::crosses_mutation_threshold: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string category_id = e.get( "category" ); const mutation_category_trait &category = @@ -666,7 +759,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::crosses_mycus_threshold: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Became one with the Mycus." ), pgettext( "memorial_female", "Became one with the Mycus." ) ); } @@ -674,7 +767,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dermatik_eggs_hatch: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Dermatik eggs hatched." ), pgettext( "memorial_female", "Dermatik eggs hatched." ) ); } @@ -682,7 +775,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dermatik_eggs_injected: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Injected with dermatik eggs." ), pgettext( "memorial_female", "Injected with dermatik eggs." ) ); } @@ -695,7 +788,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dies_from_asthma_attack: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Succumbed to an asthma attack." ), pgettext( "memorial_female", "Succumbed to an asthma attack." ) ); } @@ -703,7 +796,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dies_from_drug_overdose: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { efftype_id effect = e.get( "effect" ); if( effect == effect_datura ) { add( pgettext( "memorial_male", "Died of datura overdose." ), @@ -724,9 +817,33 @@ void memorial_logger::notify( const cata::event &e ) } break; } + case event_type::dies_from_bleeding: { + character_id ch = e.get( "character" ); + if( ch == avatar_id ) { + add( pgettext( "memorial_male", "Bled to death." ), + pgettext( "memorial_female", "Bled to death." ) ); + } + break; + } + case event_type::dies_from_hypovolemia: { + character_id ch = e.get( "character" ); + if( ch == avatar_id ) { + add( pgettext( "memorial_male", "Died of hypovolemic shock." ), + pgettext( "memorial_female", "Died of hypovolemic shock." ) ); + } + break; + } + case event_type::dies_from_redcells_loss: { + character_id ch = e.get( "character" ); + if( ch == avatar_id ) { + add( pgettext( "memorial_male", "Died from loss of red blood cells." ), + pgettext( "memorial_female", "Died from loss of red blood cells." ) ); + } + break; + } case event_type::dies_of_infection: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Succumbed to the infection." ), pgettext( "memorial_female", "Succumbed to the infection." ) ); } @@ -734,7 +851,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dies_of_starvation: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Died of starvation." ), pgettext( "memorial_female", "Died of starvation." ) ); } @@ -742,7 +859,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::dies_of_thirst: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Died of thirst." ), pgettext( "memorial_female", "Died of thirst." ) ); } @@ -765,7 +882,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::evolves_mutation: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { trait_id from = e.get( "from_trait" ); trait_id to = e.get( "to_trait" ); add( pgettext( "memorial_male", "'%s' mutation turned into '%s'" ), @@ -776,7 +893,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::exhumes_grave: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Exhumed a grave." ), pgettext( "memorial_female", "Exhumed a grave." ) ); } @@ -784,7 +901,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::fails_to_install_cbm: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string cbm_name = e.get( "bionic" )->name.translated(); add( pgettext( "memorial_male", "Failed install of bionic: %s." ), pgettext( "memorial_female", "Failed install of bionic: %s." ), @@ -794,7 +911,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::fails_to_remove_cbm: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string cbm_name = e.get( "bionic" )->name.translated(); add( pgettext( "memorial_male", "Failed to remove bionic: %s." ), pgettext( "memorial_female", "Failed to remove bionic: %s." ), @@ -804,7 +921,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::falls_asleep_from_exhaustion: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Succumbed to lack of sleep." ), pgettext( "memorial_female", "Succumbed to lack of sleep." ) ); } @@ -819,7 +936,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::gains_addiction: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add_type type = e.get( "add_type" ); const std::string &type_name = addiction_type_name( type ); //~ %s is addiction name @@ -831,7 +948,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::gains_mutation: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { trait_id trait = e.get( "trait" ); add( pgettext( "memorial_male", "Gained the mutation '%s'." ), pgettext( "memorial_female", "Gained the mutation '%s'." ), @@ -841,7 +958,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::gains_skill_level: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { int new_level = e.get( "new_level" ); if( new_level % 4 == 0 ) { skill_id skill = e.get( "skill" ); @@ -862,11 +979,11 @@ void memorial_logger::notify( const cata::event &e ) if( suicide ) { add( pgettext( "memorial_male", "%s committed suicide." ), pgettext( "memorial_female", "%s committed suicide." ), - g->u.name ); + avatar_name ); } else { add( pgettext( "memorial_male", "%s was killed." ), pgettext( "memorial_female", "%s was killed." ), - g->u.name ); + avatar_name ); } if( !last_words.empty() ) { add( pgettext( "memorial_male", "Last words: %s" ), @@ -879,12 +996,12 @@ void memorial_logger::notify( const cata::event &e ) add( //~ %s is player name pgettext( "memorial_male", "%s began their journey into the Cataclysm." ), pgettext( "memorial_female", "%s began their journey into the Cataclysm." ), - g->u.name ); + avatar_name ); break; } case event_type::installs_cbm: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string cbm_name = e.get( "bionic" )->name.translated(); add( pgettext( "memorial_male", "Installed bionic: %s." ), pgettext( "memorial_female", "Installed bionic: %s." ), @@ -894,7 +1011,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::installs_faulty_cbm: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string cbm_name = e.get( "bionic" )->name.translated(); add( pgettext( "memorial_male", "Installed bad bionic: %s." ), pgettext( "memorial_female", "Installed bad bionic: %s." ), @@ -904,7 +1021,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::learns_martial_art: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { matype_id mastyle = e.get( "martial_art" ); //~ %s is martial art add( pgettext( "memorial_male", "Learned %s." ), @@ -915,7 +1032,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::loses_addiction: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add_type type = e.get( "add_type" ); const std::string &type_name = addiction_type_name( type ); //~ %s is addiction name @@ -958,7 +1075,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_forgets_spell: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string spell_name = e.get( "spell" )->name.translated(); add( pgettext( "memorial_male", "Forgot the spell %s." ), pgettext( "memorial_female", "Forgot the spell %s." ), @@ -968,7 +1085,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::character_learns_spell: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string spell_name = e.get( "spell" )->name.translated(); add( pgettext( "memorial_male", "Learned the spell %s." ), pgettext( "memorial_female", "Learned the spell %s." ), @@ -978,7 +1095,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::player_levels_spell: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string spell_name = e.get( "spell" )->name.translated(); add( pgettext( "memorial_male", "Gained a spell level on %s." ), pgettext( "memorial_female", "Gained a spell level on %s." ), @@ -993,7 +1110,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::removes_cbm: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string cbm_name = e.get( "bionic" )->name.translated(); add( pgettext( "memorial_male", "Removed bionic: %s." ), pgettext( "memorial_female", "Removed bionic: %s." ), @@ -1008,7 +1125,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::telefrags_creature: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string victim_name = e.get( "victim_name" ); add( pgettext( "memorial_male", "Telefragged a %s." ), pgettext( "memorial_female", "Telefragged a %s." ), @@ -1018,7 +1135,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::teleglow_teleports: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Spontaneous teleport." ), pgettext( "memorial_female", "Spontaneous teleport." ) ); } @@ -1026,7 +1143,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::teleports_into_wall: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { std::string obstacle_name = e.get( "obstacle_name" ); add( pgettext( "memorial_male", "Teleported into a %s." ), pgettext( "memorial_female", "Teleported into a %s." ), @@ -1041,7 +1158,7 @@ void memorial_logger::notify( const cata::event &e ) } case event_type::throws_up: { character_id ch = e.get( "character" ); - if( ch == g->u.getID() ) { + if( ch == avatar_id ) { add( pgettext( "memorial_male", "Threw up." ), pgettext( "memorial_female", "Threw up." ) ); } @@ -1067,6 +1184,8 @@ void memorial_logger::notify( const cata::event &e ) case event_type::character_wakes_up: case event_type::character_wears_item: case event_type::character_wields_item: + case event_type::cuts_tree: + case event_type::reads_book: case event_type::game_load: case event_type::game_save: break; diff --git a/src/memorial_logger.h b/src/memorial_logger.h index 52fc2ee637114..c0657124f1c6e 100644 --- a/src/memorial_logger.h +++ b/src/memorial_logger.h @@ -14,6 +14,30 @@ namespace cata class event; } // namespace cata +class memorial_log_entry +{ + public: + memorial_log_entry() = default; + memorial_log_entry( const std::string &preformatted_msg ); + memorial_log_entry( time_point, const oter_type_str_id &, const std::string &oter_name, + const std::string &msg ); + + std::string to_string() const; + + void deserialize( JsonIn & ); + void serialize( JsonOut & ) const; + private: + time_point time_; + oter_type_str_id oter_id_; + std::string oter_name_; + std::string message_; + + // For legacy lines loaded from the text memorial file. For any given + // memorial_log_entry either the following value will be populated or + // the above four values (but not both). + cata::optional preformatted_; +}; + class memorial_logger : public event_subscriber { public: @@ -34,18 +58,21 @@ class memorial_logger : public event_subscriber } // Loads the memorial log from a file - void load( std::istream &fin ); + void load( std::istream & ); + void save( std::ostream & ) const; // Dumps all memorial events into a single newline-delimited string // (this is the content of the temporary file used to preserve the log // over saves, not the final memorial file). std::string dump() const; // Prints out the final memorial file - void write( std::ostream &memorial_file, const std::string &epitaph ) const; + void write_text_memorial( std::ostream &memorial_file, + const std::string &epitaph ) const; + void write_json_memorial( std::ostream &memorial_file ) const; void notify( const cata::event & ) override; private: - std::vector log; + std::vector log; }; #endif // CATA_SRC_MEMORIAL_LOGGER_H diff --git a/src/mission_companion.cpp b/src/mission_companion.cpp index abbe8b5f495b7..0074e24485605 100644 --- a/src/mission_companion.cpp +++ b/src/mission_companion.cpp @@ -706,7 +706,7 @@ npc_ptr talk_function::individual_mission( const tripoint &omt_pos, } } if( comp->in_vehicle ) { - g->m.unboard_vehicle( comp->pos() ); + get_map().unboard_vehicle( comp->pos() ); } popup( "%s %s", comp->name, desc ); comp->set_companion_mission( omt_pos, role_id, miss_id ); @@ -800,7 +800,7 @@ void talk_function::caravan_return( npc &p, const std::string &dest, const std:: int money = 0; for( const auto &elem : caravan_party ) { //Scrub temporary party members and the dead - if( elem->hp_cur[hp_torso] == 0 && elem->has_companion_mission() ) { + if( elem->get_part_hp_cur( bodypart_id( "torso" ) ) == 0 && elem->has_companion_mission() ) { overmap_buffer.remove_npc( comp->getID() ); money += ( time / 600 ) * 9; } else if( elem->has_companion_mission() ) { @@ -844,7 +844,7 @@ void talk_function::attack_random( const std::vector< monster * > &group, const auto def = random_entry( defender ); att->melee_attack( *def ); //monster mon; - if( def->hp_cur[hp_torso] <= 0 || def->is_dead() ) { + if( def->get_part_hp_cur( bodypart_id( "torso" ) ) <= 0 || def->is_dead() ) { popup( _( "%s is wasted by %s!" ), def->name, att->type->nname() ); } } @@ -865,7 +865,7 @@ void talk_function::attack_random( const std::vector &attacker, } ///\EFFECT_DODGE_NPC increases avoidance of random attacks if( rng( -1, best_score ) >= rng( 0, def->get_skill_level( skill_dodge ) ) ) { - def->hp_cur[hp_torso] = 0; + def->set_part_hp_cur( bodypart_id( "torso" ), 0 ); popup( _( "%s is wasted by %s!" ), def->name, att->name ); } else { popup( _( "%s dodges %s's attack!" ), def->name, att->name ); @@ -878,7 +878,7 @@ int talk_function::combat_score( const std::vector &group ) { int score = 0; for( const auto &elem : group ) { - if( elem->hp_cur[hp_torso] != 0 ) { + if( elem->get_part_hp_cur( bodypart_id( "torso" ) ) != 0 ) { const skill_id best = elem->best_skill(); if( best ) { score += elem->get_skill_level( best ); @@ -1584,7 +1584,8 @@ bool talk_function::force_on_force( const std::vector &defender, } std::vector remaining_def; for( const auto &elem : defender ) { - if( !elem->is_dead() && elem->hp_cur[hp_torso] >= 0 && elem->hp_cur[hp_head] >= 0 ) { + if( !elem->is_dead() && elem->get_part_hp_cur( bodypart_id( "torso" ) ) >= 0 && + elem->get_part_hp_cur( bodypart_id( "head" ) ) >= 0 ) { remaining_def.push_back( elem ); } } @@ -1643,13 +1644,13 @@ void talk_function::force_on_force( const std::vector &defender, while( true ) { std::vector remaining_att; for( const auto &elem : attacker ) { - if( elem->hp_cur[hp_torso] != 0 ) { + if( elem->get_part_hp_cur( bodypart_id( "torso" ) ) != 0 ) { remaining_att.push_back( elem ); } } std::vector remaining_def; for( const auto &elem : defender ) { - if( elem->hp_cur[hp_torso] != 0 ) { + if( elem->get_part_hp_cur( bodypart_id( "torso" ) ) != 0 ) { remaining_def.push_back( elem ); } } @@ -1659,7 +1660,7 @@ void talk_function::force_on_force( const std::vector &defender, if( attack > defense * 3 ) { attack_random( remaining_att, remaining_def ); if( defense == 0 || ( remaining_def.size() == 1 && - remaining_def[0]->hp_cur[hp_torso] == 0 ) ) { + remaining_def[0]->get_part_hp_cur( bodypart_id( "torso" ) ) == 0 ) ) { popup( _( "%s forces are destroyed!" ), defender[0]->get_faction()->name ); } else { popup( _( "%s forces retreat from combat!" ), defender[0]->get_faction()->name ); @@ -1668,7 +1669,7 @@ void talk_function::force_on_force( const std::vector &defender, } else if( attack * 3 < defense ) { attack_random( remaining_def, remaining_att ); if( attack == 0 || ( remaining_att.size() == 1 && - remaining_att[0]->hp_cur[hp_torso] == 0 ) ) { + remaining_att[0]->get_part_hp_cur( bodypart_id( "torso" ) ) == 0 ) ) { popup( _( "%s forces are destroyed!" ), attacker[0]->get_faction()->name ); } else { popup( _( "%s forces retreat from combat!" ), attacker[0]->get_faction()->name ); @@ -1729,10 +1730,11 @@ void talk_function::companion_return( npc &comp ) comp.reset_companion_mission(); comp.companion_mission_time = calendar::before_time_starts; comp.companion_mission_time_ret = calendar::before_time_starts; + map &here = get_map(); for( size_t i = 0; i < comp.companion_mission_inv.size(); i++ ) { for( const auto &it : comp.companion_mission_inv.const_stack( i ) ) { if( !it.count_by_charges() || it.charges > 0 ) { - g->m.add_item_or_charges( g->u.pos(), it ); + here.add_item_or_charges( g->u.pos(), it ); } } } diff --git a/src/mission_end.cpp b/src/mission_end.cpp index 86641904bae5e..e0956e85a5efd 100644 --- a/src/mission_end.cpp +++ b/src/mission_end.cpp @@ -2,7 +2,7 @@ #include -#include "avatar.h" +#include "character.h" #include "debug.h" #include "game.h" #include "messages.h" @@ -26,6 +26,6 @@ void mission_end::deposit_box( mission *miss ) } else if( one_in( 3 ) ) { itemName = "m4a1"; } - g->u.i_add( item( itemName, 0 ) ); + get_player_character().i_add( item( itemName, 0 ) ); add_msg( m_good, _( "%s gave you an item from the deposit box." ), p->name ); } diff --git a/src/monattack.cpp b/src/monattack.cpp index 648b4cdaa2790..a6a63997b010e 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -15,7 +15,6 @@ #include #include -#include "avatar.h" #include "ballistics.h" #include "bodypart.h" #include "calendar.h" @@ -209,7 +208,9 @@ static const bionic_id bio_uncanny_dodge( "bio_uncanny_dodge" ); // shared utility functions static bool within_visual_range( monster *z, int max_range ) { - return !( rl_dist( z->pos(), g->u.pos() ) > max_range || !z->sees( g->u ) ); + Character &player_character = get_player_character(); + return !( rl_dist( z->pos(), player_character.pos() ) > max_range || + !z->sees( player_character ) ); } static bool within_target_range( const monster *const z, const Creature *const target, int range ) @@ -229,7 +230,7 @@ static Creature *sting_get_target( monster *z, float range = 5.0f ) // Can't see/reach target, no attack if( !z->sees( *target ) || - !g->m.clear_path( z->pos(), target->pos(), range, 1, 100 ) ) { + !get_map().clear_path( z->pos(), target->pos(), range, 1, 100 ) ) { return nullptr; } @@ -296,7 +297,8 @@ static bool is_adjacent( const monster *z, const Creature *target, const bool al const bool target_above = target->posz() > z->posz(); const tripoint &up = target_above ? target->pos() : z->pos(); const tripoint &down = target_above ? z->pos() : target->pos(); - return g->m.ter( up ) == t_open_air && g->m.is_outside( down ); + map &here = get_map(); + return here.ter( up ) == t_open_air && here.is_outside( down ); } static npc make_fake_npc( monster *z, int str, int dex, int inte, int per ) @@ -327,15 +329,16 @@ bool mattack::eat_crop( monster *z ) { cata::optional target; int num_targets = 1; - for( const auto &p : g->m.points_in_radius( z->pos(), 1 ) ) { - if( g->m.has_flag( "PLANT", p ) && one_in( num_targets ) ) { + map &here = get_map(); + for( const auto &p : here.points_in_radius( z->pos(), 1 ) ) { + if( here.has_flag( "PLANT", p ) && one_in( num_targets ) ) { num_targets++; target = p; } } if( target ) { - g->m.furn_set( *target, furn_str_id( g->m.furn( *target )->plant->base ) ); - g->m.i_clear( *target ); + here.furn_set( *target, furn_str_id( here.furn( *target )->plant->base ) ); + here.i_clear( *target ); return true; } return true; @@ -343,12 +346,13 @@ bool mattack::eat_crop( monster *z ) bool mattack::eat_food( monster *z ) { - for( const auto &p : g->m.points_in_radius( z->pos(), 1 ) ) { + map &here = get_map(); + for( const auto &p : here.points_in_radius( z->pos(), 1 ) ) { //Protect crop seeds from carnivores, give omnivores eat_crop special also - if( g->m.has_flag( "PLANT", p ) ) { + if( here.has_flag( "PLANT", p ) ) { continue; } - map_stack items = g->m.i_at( p ); + map_stack items = here.i_at( p ); for( auto &item : items ) { //Fun limit prevents scavengers from eating feces if( !item.is_food() || item.get_comestible_fun() < -20 ) { @@ -358,9 +362,9 @@ bool mattack::eat_food( monster *z ) if( z->type->baby_egg != item.type->get_id() ) { int consumed = 1; if( item.count_by_charges() ) { - g->m.use_charges( p, 0, item.type->get_id(), consumed ); + here.use_charges( p, 0, item.type->get_id(), consumed ); } else { - g->m.use_amount( p, 0, item.type->get_id(), consumed ); + here.use_amount( p, 0, item.type->get_id(), consumed ); } return true; } @@ -373,9 +377,10 @@ bool mattack::antqueen( monster *z ) { std::vector egg_points; std::vector ants; + map &here = get_map(); // Count up all adjacent tiles the contain at least one egg. - for( const auto &dest : g->m.points_in_radius( z->pos(), 2 ) ) { - if( g->m.impassable( dest ) ) { + for( const auto &dest : here.points_in_radius( z->pos(), 2 ) ) { + if( here.impassable( dest ) ) { continue; } @@ -387,8 +392,8 @@ bool mattack::antqueen( monster *z ) continue; } - if( g->is_empty( dest ) && g->m.has_items( dest ) ) { - for( item &i : g->m.i_at( dest ) ) { + if( g->is_empty( dest ) && here.has_items( dest ) ) { + for( item &i : here.i_at( dest ) ) { if( i.typeId() == itype_ant_egg ) { egg_points.push_back( dest ); // Done looking at this tile @@ -398,30 +403,31 @@ bool mattack::antqueen( monster *z ) } } + Character &player_character = get_player_character(); if( !ants.empty() ) { // It takes a while z->moves -= 100; monster *ant = random_entry( ants ); - if( g->u.sees( *z ) && g->u.sees( *ant ) ) { + if( player_character.sees( *z ) && player_character.sees( *ant ) ) { add_msg( m_warning, _( "The %1$s feeds an %2$s and it grows!" ), z->name(), ant->name() ); } ant->poly( ant->type->upgrade_into ); } else if( egg_points.empty() ) { // There's no eggs nearby--lay one. - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( _( "The %s lays an egg!" ), z->name() ); } - g->m.spawn_item( z->pos(), "ant_egg", 1, 0, calendar::turn ); + here.spawn_item( z->pos(), "ant_egg", 1, 0, calendar::turn ); } else { // There are eggs nearby. Let's hatch some. // It takes a while z->moves -= 20 * egg_points.size(); - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The %s tends nearby eggs, and they hatch!" ), z->name() ); } for( const tripoint &egg_pos : egg_points ) { - map_stack items = g->m.i_at( egg_pos ); + map_stack items = here.i_at( egg_pos ); for( map_stack::iterator it = items.begin(); it != items.end(); ) { if( it->typeId() != itype_ant_egg ) { ++it; @@ -470,7 +476,7 @@ bool mattack::shriek_alert( monster *z ) return false; } - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( _( "The %s begins shrieking!" ), z->name() ); } @@ -503,7 +509,8 @@ bool mattack::shriek_stun( monster *z ) int target_angle = coord_to_angle( z->pos(), target->pos() ); int cone_angle = 20; - for( const tripoint &cone : g->m.points_in_radius( z->pos(), 4 ) ) { + map &here = get_map(); + for( const tripoint &cone : here.points_in_radius( z->pos(), 4 ) ) { int tile_angle = coord_to_angle( z->pos(), cone ); int diff = std::abs( target_angle - tile_angle ); // Skip the target, because it's outside cone or it's the source @@ -512,7 +519,7 @@ bool mattack::shriek_stun( monster *z ) } // Affect the target // Small bash to every square, silent to not flood message box - g->m.bash( cone, 4, true ); + here.bash( cone, 4, true ); // If a monster is there, chance for stun Creature *target = g->critter_at( cone ); @@ -565,7 +572,7 @@ bool mattack::rattle( monster *z ) { // TODO: Let it rattle at non-player friendlies const int min_dist = z->friendly != 0 ? 1 : 4; - Creature *target = &g->u; + Creature *target = &get_player_character(); // Can't use attack_target - the snake has no target if( rl_dist( z->pos(), target->pos() ) > min_dist || !z->sees( *target ) ) { @@ -591,9 +598,10 @@ bool mattack::acid( monster *z ) return false; } + map &here = get_map(); // Can't see/reach target, no attack if( !z->sees( *target ) || - !g->m.clear_path( z->pos(), target->pos(), 10, 1, 100 ) ) { + !here.clear_path( z->pos(), target->pos(), 10, 1, 100 ) ) { return false; } // It takes a while @@ -610,10 +618,10 @@ bool mattack::acid( monster *z ) auto dealt = projectile_attack( proj, z->pos(), target->pos(), dispersion_sources{ 5400 }, z ); const tripoint &hitp = dealt.end_point; const Creature *hit_critter = dealt.hit_critter; - if( hit_critter == nullptr && g->m.hit_with_acid( hitp ) && g->u.sees( hitp ) ) { + if( hit_critter == nullptr && here.hit_with_acid( hitp ) && get_player_character().sees( hitp ) ) { add_msg( _( "A glob of acid hits the %s!" ), - g->m.tername( hitp ) ); - if( g->m.impassable( hitp ) ) { + here.tername( hitp ) ); + if( here.impassable( hitp ) ) { // TODO: Allow it to spill on the side it hit from return true; } @@ -622,10 +630,10 @@ bool mattack::acid( monster *z ) for( int i = -3; i <= 3; i++ ) { for( int j = -3; j <= 3; j++ ) { tripoint dest = hitp + tripoint( i, j, 0 ); - if( g->m.passable( dest ) && - g->m.clear_path( dest, hitp, 6, 1, 100 ) && + if( here.passable( dest ) && + here.clear_path( dest, hitp, 6, 1, 100 ) && ( ( one_in( std::abs( j ) ) && one_in( std::abs( i ) ) ) || ( i == 0 && j == 0 ) ) ) { - g->m.add_field( dest, fd_acid, 2 ); + here.add_field( dest, fd_acid, 2 ); } } } @@ -647,11 +655,11 @@ bool mattack::acid_barf( monster *z ) z->moves -= 80; // Make sure it happens before uncanny dodge - g->m.add_field( target->pos(), fd_acid, 1 ); + get_map().add_field( target->pos(), fd_acid, 1 ); bool uncanny = target->uncanny_dodge(); // Can we dodge the attack? Uses player dodge function % chance (melee.cpp) if( uncanny || dodge_check( z, target ) ) { - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s barfs acid at you, but you dodge!" ), _( "The %s barfs acid at , but they dodge!" ), @@ -671,7 +679,7 @@ bool mattack::acid_barf( monster *z ) hit->token ); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_info; + auto msg_type = target->is_avatar() ? m_bad : m_info; target->add_msg_player_or_npc( msg_type, //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s barfs acid on your %2$s for %3$d damage!" ), @@ -738,10 +746,12 @@ bool mattack::shockstorm( monster *z ) return false; } - bool seen = g->u.sees( *z ); + Character &player_character = get_player_character(); + bool seen = player_character.sees( *z ); + map &here = get_map(); // Can't see/reach target, no attack if( !z->sees( *target ) || - !g->m.clear_path( z->pos(), target->pos(), 12, 1, 100 ) ) { + !here.clear_path( z->pos(), target->pos(), 12, 1, 100 ) ) { return false; } @@ -749,10 +759,10 @@ bool mattack::shockstorm( monster *z ) z->moves -= 50; if( seen ) { - auto msg_type = target == &g->u ? m_bad : m_neutral; + auto msg_type = target->is_avatar() ? m_bad : m_neutral; add_msg( msg_type, _( "A bolt of electricity arcs towards %s!" ), target->disp_name() ); } - if( !g->u.is_deaf() ) { + if( !player_character.is_deaf() ) { sfx::play_variant_sound( "fire_gun", "bio_lightning", sfx::get_heard_volume( z->pos() ) ); } tripoint tarp( target->posx() + rng( -1, 1 ) + rng( -1, 1 ), @@ -762,13 +772,13 @@ bool mattack::shockstorm( monster *z ) // Fill the LOS with electricity for( auto &i : bolt ) { if( !one_in( 4 ) ) { - g->m.add_field( i, fd_electricity, rng( 1, 3 ) ); + here.add_field( i, fd_electricity, rng( 1, 3 ) ); } } // 5x5 cloud of electricity at the square hit - for( const auto &dest : g->m.points_in_radius( tarp, 2 ) ) { + for( const auto &dest : here.points_in_radius( tarp, 2 ) ) { if( !one_in( 4 ) ) { - g->m.add_field( dest, fd_electricity, rng( 1, 3 ) ); + here.add_field( dest, fd_electricity, rng( 1, 3 ) ); } } @@ -806,11 +816,11 @@ bool mattack::pull_metal_weapon( monster *z ) } // Can't see/reach target, no attack - if( !z->sees( *target ) || !g->m.clear_path( z->pos(), target->pos(), + if( !z->sees( *target ) || !get_map().clear_path( z->pos(), target->pos(), max_distance, 1, 100 ) ) { return false; } - player *foe = dynamic_cast< player * >( target ); + Character *foe = dynamic_cast< Character * >( target ); if( foe != nullptr ) { // Wielded steel or iron items except for built-in things like bionic claws or monomolecular blade if( !foe->weapon.has_flag( "NO_UNWIELD" ) && @@ -827,7 +837,7 @@ bool mattack::pull_metal_weapon( monster *z ) ///\EFFECT_MELEE increases resistance to pull_metal_weapon special attack success = std::max( 100 - ( 6 * ( foe->str_cur - 6 ) ) - ( 6 * wp_skill ), 0 ); } - auto m_type = foe == &g->u ? m_bad : m_neutral; + auto m_type = foe->is_avatar() ? m_bad : m_neutral; if( rng( 1, 100 ) <= success ) { target->add_msg_player_or_npc( m_type, _( "%s is pulled away from your hands!" ), _( "%s is pulled away from 's hands!" ), foe->weapon.tname() ); @@ -857,21 +867,23 @@ bool mattack::boomer( monster *z ) return false; } - std::vector line = g->m.find_clear_path( z->pos(), target->pos() ); + map &here = get_map(); + std::vector line = here.find_clear_path( z->pos(), target->pos() ); // It takes a while z->moves -= 250; - bool u_see = g->u.sees( *z ); + Character &player_character = get_player_character(); + bool u_see = player_character.sees( *z ); if( u_see ) { add_msg( m_warning, _( "The %s spews bile!" ), z->name() ); } for( auto &i : line ) { - g->m.add_field( i, fd_bile, 1 ); + here.add_field( i, fd_bile, 1 ); // If bile hit a solid tile, return. - if( g->m.impassable( i ) ) { - g->m.add_field( i, fd_bile, 3 ); - if( g->u.sees( i ) ) { + if( here.impassable( i ) ) { + here.add_field( i, fd_bile, 3 ); + if( player_character.sees( i ) ) { add_msg( _( "Bile splatters on the %s!" ), - g->m.tername( i ) ); + here.tername( i ) ); } return true; } @@ -901,19 +913,21 @@ bool mattack::boomer_glow( monster *z ) return false; } - std::vector line = g->m.find_clear_path( z->pos(), target->pos() ); + map &here = get_map(); + std::vector line = here.find_clear_path( z->pos(), target->pos() ); // It takes a while z->moves -= 250; - bool u_see = g->u.sees( *z ); + Character &player_character = get_player_character(); + bool u_see = player_character.sees( *z ); if( u_see ) { add_msg( m_warning, _( "The %s spews bile!" ), z->name() ); } for( auto &i : line ) { - g->m.add_field( i, fd_bile, 1 ); - if( g->m.impassable( i ) ) { - g->m.add_field( i, fd_bile, 3 ); - if( g->u.sees( i ) ) { - add_msg( _( "Bile splatters on the %s!" ), g->m.tername( i ) ); + here.add_field( i, fd_bile, 1 ); + if( here.impassable( i ) ) { + here.add_field( i, fd_bile, 3 ); + if( player_character.sees( i ) ) { + add_msg( _( "Bile splatters on the %s!" ), here.tername( i ) ); } return true; } @@ -958,19 +972,21 @@ bool mattack::resurrect( monster *z ) raising_level = z->get_effect_int( effect_raising ) * 40; } - bool sees_necromancer = g->u.sees( *z ); + Character &player_character = get_player_character(); + bool sees_necromancer = player_character.sees( *z ); std::vector> corpses; // Find all corpses that we can see within 10 tiles. int range = 10; bool found_eligible_corpse = false; int lowest_raise_score = INT_MAX; - for( const tripoint &p : g->m.points_in_radius( z->pos(), range ) ) { - if( !g->is_empty( p ) || g->m.get_field_intensity( p, fd_fire ) > 1 || - !g->m.sees( z->pos(), p, -1 ) ) { + map &here = get_map(); + for( const tripoint &p : here.points_in_radius( z->pos(), range ) ) { + if( !g->is_empty( p ) || here.get_field_intensity( p, fd_fire ) > 1 || + !here.sees( z->pos(), p, -1 ) ) { continue; } - for( item &i : g->m.i_at( p ) ) { + for( item &i : here.i_at( p ) ) { const mtype *mt = i.get_mtype(); if( !( i.is_corpse() && i.can_revive() && i.active && mt->has_flag( MF_REVIVES ) && mt->in_species( species_ZOMBIE ) && !mt->has_flag( MF_NO_NECRO ) ) ) { @@ -1046,7 +1062,7 @@ bool mattack::resurrect( monster *z ) float corpse_damage = raised.second->damage_level( 4 ); // Did we successfully raise something? if( g->revive_corpse( raised.first, *raised.second ) ) { - g->m.i_rem( raised.first, raised.second ); + here.i_rem( raised.first, raised.second ); if( sees_necromancer ) { add_msg( m_info, _( "The %s gestures at a nearby corpse." ), z->name() ); } @@ -1063,7 +1079,7 @@ bool mattack::resurrect( monster *z ) } zed->make_ally( *z ); - if( g->u.sees( *zed ) ) { + if( player_character.sees( *zed ) ) { add_msg( m_warning, _( "A nearby %s rises from the dead!" ), zed->name() ); } else if( sees_necromancer ) { // We saw the necromancer but not the revival @@ -1147,7 +1163,7 @@ find_empty_neighbors( const tripoint &origin ) std::pair < std::array < tripoint, ( 2 * N + 1 )*( 2 * N + 1 ) >, size_t > result; - for( const tripoint &tmp : g->m.points_in_radius( origin, r ) ) { + for( const tripoint &tmp : get_map().points_in_radius( origin, r ) ) { if( g->is_empty( tmp ) ) { result.first[result.second++] = tmp; } @@ -1258,10 +1274,8 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! valid_attacks[valid_attack_count++] = att_shock; } - // TODO: mutate() doesn't like non-players right now - // It will mutate NPCs, but it will say it mutated the player - player *const foe = dynamic_cast( target ); - if( ( foe == &g->u ) && dist <= 2 ) { + Character *const foe = dynamic_cast( target ); + if( foe && foe->is_avatar() && dist <= 2 ) { valid_attacks[valid_attack_count++] = att_radiation; } @@ -1279,6 +1293,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! // flavor is always okay valid_attacks[valid_attack_count++] = att_flavor; + Character &player_character = get_player_character(); //////////////////////////////////////////////////////////////////////////////////////////////// // choose and do a valid attack const int attack_index = get_random_index( valid_attack_count ); @@ -1297,8 +1312,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! z->moves -= att_cost_rad; // if the player can see it - if( g->u.sees( *z ) ) { - // TODO: mutate() doesn't like non-players right now + if( player_character.sees( *z ) ) { add_msg( m_bad, _( "The %1$s fires a shimmering beam towards %2$s!" ), z->name(), target->disp_name() ); } @@ -1336,7 +1350,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! z->ammo[itype_bot_manhack]--; // if the player can see it - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "A manhack flies out of one of the holes on the %s!" ), z->name() ); } @@ -1347,23 +1361,24 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! } } break; - case att_acid_pool : + case att_acid_pool : { z->moves -= att_cost_acid; // if the player can see it - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The %s shudders, and some sort of caustic fluid leaks from a its damaged shell!" ), z->name() ); } + map &here = get_map(); // fill empty tiles with acid for( size_t i = 0; i < empty_neighbor_count; ++i ) { const tripoint &p = empty_neighbors.first[i]; - g->m.add_field( p, fd_acid, att_acid_intensity ); + here.add_field( p, fd_acid, att_acid_intensity ); } - - break; + } + break; case att_flavor : { // flavor messages static const std::array m_flavor = {{ @@ -1383,7 +1398,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! } // if the player can see it, else forget about it - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( m_flavor[i] ), z->name() ); } } @@ -1415,20 +1430,21 @@ static body_part body_part_hit_by_plant() bool mattack::growplants( monster *z ) { - for( const auto &p : g->m.points_in_radius( z->pos(), 3 ) ) { + map &here = get_map(); + for( const auto &p : here.points_in_radius( z->pos(), 3 ) ) { // Only affect natural, dirtlike terrain or trees. - if( !( g->m.has_flag_ter( "DIGGABLE", p ) || - g->m.has_flag_ter( "TREE", p ) || - g->m.ter( p ) == t_tree_young ) ) { + if( !( here.has_flag_ter( "DIGGABLE", p ) || + here.has_flag_ter( "TREE", p ) || + here.ter( p ) == t_tree_young ) ) { continue; } - if( g->m.is_bashable( p ) && one_in( 3 ) ) { + if( here.is_bashable( p ) && one_in( 3 ) ) { // Destroy everything - g->m.destroy( p ); + here.destroy( p ); // And then make the ground fertile - g->m.ter_set( p, t_dirtmound ); + here.ter_set( p, t_dirtmound ); continue; } @@ -1436,7 +1452,7 @@ bool mattack::growplants( monster *z ) if( !one_in( 4 ) ) { if( one_in( 3 ) ) { // If no tree, perhaps underbrush - g->m.ter_set( p, t_underbrush ); + here.ter_set( p, t_underbrush ); } continue; @@ -1450,7 +1466,7 @@ bool mattack::growplants( monster *z ) continue; } - g->m.ter_set( p, t_tree_young ); + here.ter_set( p, t_tree_young ); if( critter == nullptr || critter->uncanny_dodge() ) { continue; } @@ -1469,8 +1485,8 @@ bool mattack::growplants( monster *z ) if( !one_in( 5 ) ) { return true; } - for( const tripoint &p : g->m.points_in_radius( z->pos(), 5 ) ) { - const auto ter = g->m.ter( p ); + for( const tripoint &p : here.points_in_radius( z->pos(), 5 ) ) { + const auto ter = here.ter( p ); if( ter != t_tree_young && ter != t_underbrush ) { // Skip as soon as possible to avoid all the checks continue; @@ -1485,10 +1501,10 @@ bool mattack::growplants( monster *z ) if( ter == t_tree_young ) { // Young tree => tree // TODO: Make this deal damage too - young tree can be walked on, tree can't - g->m.ter_set( p, t_tree ); + here.ter_set( p, t_tree ); } else if( ter == t_underbrush ) { // Underbrush => young tree - g->m.ter_set( p, t_tree_young ); + here.ter_set( p, t_tree_young ); if( critter != nullptr && !critter->uncanny_dodge() ) { const body_part hit = body_part_hit_by_plant(); critter->add_msg_player_or_npc( m_bad, @@ -1509,7 +1525,7 @@ bool mattack::growplants( monster *z ) bool mattack::grow_vine( monster *z ) { if( z->friendly ) { - if( rl_dist( g->u.pos(), z->pos() ) <= 3 ) { + if( rl_dist( get_player_character().pos(), z->pos() ) <= 3 ) { // Friendly vines keep the area around you free, so you can move. return false; } @@ -1530,14 +1546,15 @@ bool mattack::grow_vine( monster *z ) bool mattack::vine( monster *z ) { int vine_neighbors = 0; - bool parent_out_of_range = !g->m.inbounds( z->move_target() ); + map &here = get_map(); + bool parent_out_of_range = !here.inbounds( z->move_target() ); monster *parent = g->critter_at( z->move_target() ); if( !parent_out_of_range && ( parent == nullptr || parent->type->id != mon_creeper_hub ) ) { // TODO: Should probably die instead. return true; } z->moves -= 100; - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 1 ) ) { + for( const tripoint &dest : here.points_in_radius( z->pos(), 1 ) ) { Creature *critter = g->critter_at( dest ); if( critter != nullptr && z->attitude_to( *critter ) == Creature::Attitude::HOSTILE ) { if( critter->uncanny_dodge() ) { @@ -1616,31 +1633,34 @@ bool mattack::triffid_heartbeat( monster *z ) return true; // TODO: when friendly: open a way to the stairs, don't spawn monsters } - if( g->u.posz() != z->posz() ) { + Character &player_character = get_player_character(); + if( player_character.posz() != z->posz() ) { // Maybe remove this and allow spawning monsters above? return true; } + map &here = get_map(); static pathfinding_settings root_pathfind( 10, 20, 50, 0, false, false, false, false, false ); - if( rl_dist( z->pos(), g->u.pos() ) > 5 && - !g->m.route( g->u.pos(), z->pos(), root_pathfind ).empty() ) { + if( rl_dist( z->pos(), player_character.pos() ) > 5 && + !here.route( player_character.pos(), z->pos(), root_pathfind ).empty() ) { add_msg( m_warning, _( "The root walls creak around you." ) ); - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 3 ) ) { + for( const tripoint &dest : here.points_in_radius( z->pos(), 3 ) ) { if( g->is_empty( dest ) && one_in( 4 ) ) { - g->m.ter_set( dest, t_root_wall ); - } else if( g->m.ter( dest ) == t_root_wall && one_in( 10 ) ) { - g->m.ter_set( dest, t_dirt ); + here.ter_set( dest, t_root_wall ); + } else if( here.ter( dest ) == t_root_wall && one_in( 10 ) ) { + here.ter_set( dest, t_dirt ); } } // Open blank tiles as long as there's no possible route int tries = 0; - while( g->m.route( g->u.pos(), z->pos(), root_pathfind ).empty() && + while( here.route( player_character.pos(), z->pos(), root_pathfind ).empty() && tries < 20 ) { - point p( rng( g->u.posx(), z->posx() - 3 ), rng( g->u.posy(), z->posy() - 3 ) ); + point p( rng( player_character.posx(), z->posx() - 3 ), + rng( player_character.posy(), z->posy() - 3 ) ); tripoint dest( p, z->posz() ); tries++; - g->m.ter_set( dest, t_dirt ); - if( rl_dist( dest, g->u.pos() ) > 3 && g->num_creatures() < 30 && + here.ter_set( dest, t_dirt ); + if( rl_dist( dest, player_character.pos() ) > 3 && g->num_creatures() < 30 && !g->critter_at( dest ) && one_in( 20 ) ) { // Spawn an extra monster mtype_id montype = mon_triffid; if( one_in( 4 ) ) { @@ -1672,12 +1692,13 @@ bool mattack::fungus( monster *z ) // TODO: Infect NPCs? // It takes a while z->moves -= 200; - if( g->u.has_trait( trait_THRESH_MYCUS ) ) { + Character &player_character = get_player_character(); + if( player_character.has_trait( trait_THRESH_MYCUS ) ) { z->friendly = 100; } //~ the sound of a fungus releasing spores sounds::sound( z->pos(), 10, sounds::sound_t::combat, _( "Pouf!" ), false, "misc", "puff" ); - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "Spores are released from the %s!" ), z->name() ); } @@ -1705,15 +1726,16 @@ bool mattack::fungus( monster *z ) } } - fungal_effects fe( *g, g->m ); - for( const tripoint &sporep : g->m.points_in_radius( z->pos(), radius ) ) { + map &here = get_map(); + fungal_effects fe( *g, here ); + for( const tripoint &sporep : here.points_in_radius( z->pos(), radius ) ) { if( sporep == z->pos() ) { continue; } const int dist = rl_dist( z->pos(), sporep ); if( !one_in( dist ) || - g->m.impassable( sporep ) || - ( dist > 1 && !g->m.clear_path( z->pos(), sporep, 2, 1, 10 ) ) ) { + here.impassable( sporep ) || + ( dist > 1 && !here.clear_path( z->pos(), sporep, 2, 1, 10 ) ) ) { continue; } @@ -1727,9 +1749,9 @@ bool mattack::fungus_corporate( monster *z ) { if( x_in_y( 1, 20 ) ) { sounds::sound( z->pos(), 10, sounds::sound_t::speech, _( "\"Buy SpOreos(tm) now!\"" ) ); - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "Delicious snacks are released from the %s!" ), z->name() ); - g->m.add_item( z->pos(), item( "sporeos" ) ); + get_map().add_item( z->pos(), item( "sporeos" ) ); } // only spawns SpOreos if the player is near; can't have the COMMONERS stealing our product from good customers return true; } else { @@ -1741,12 +1763,13 @@ bool mattack::fungus_haze( monster *z ) { //~ That spore sound again sounds::sound( z->pos(), 10, sounds::sound_t::combat, _( "Pouf!" ), true, "misc", "puff" ); - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_info, _( "The %s pulses, and fresh fungal material bursts forth." ), z->name() ); } z->moves -= 150; - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 3 ) ) { - g->m.add_field( dest, fd_fungal_haze, rng( 1, 2 ) ); + map &here = get_map(); + for( const tripoint &dest : here.points_in_radius( z->pos(), 3 ) ) { + here.add_field( dest, fd_fungal_haze, rng( 1, 2 ) ); } return true; @@ -1755,16 +1778,17 @@ bool mattack::fungus_haze( monster *z ) bool mattack::fungus_big_blossom( monster *z ) { bool firealarm = false; - const auto u_see = g->u.sees( *z ); + const auto u_see = get_player_character().sees( *z ); + map &here = get_map(); // Fungal fire-suppressor! >:D - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 6 ) ) { - if( g->m.get_field_intensity( dest, fd_fire ) != 0 ) { + for( const tripoint &dest : here.points_in_radius( z->pos(), 6 ) ) { + if( here.get_field_intensity( dest, fd_fire ) != 0 ) { firealarm = true; } if( firealarm ) { - g->m.remove_field( dest, fd_fire ); - g->m.remove_field( dest, fd_smoke ); - g->m.add_field( dest, fd_fungal_haze, 3 ); + here.remove_field( dest, fd_fire ); + here.remove_field( dest, fd_smoke ); + here.add_field( dest, fd_fungal_haze, 3 ); } } // Special effects handled outside the loop @@ -1790,8 +1814,8 @@ bool mattack::fungus_big_blossom( monster *z ) add_msg( m_info, _( "The %s pulses, and fresh fungal material bursts forth!" ), z->name() ); } z->moves -= 150; - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 12 ) ) { - g->m.add_field( dest, fd_fungal_haze, rng( 1, 2 ) ); + for( const tripoint &dest : here.points_in_radius( z->pos(), 12 ) ) { + here.add_field( dest, fd_fungal_haze, rng( 1, 2 ) ); } } @@ -1801,30 +1825,33 @@ bool mattack::fungus_big_blossom( monster *z ) bool mattack::fungus_inject( monster *z ) { // For faster copy+paste - Creature *target = &g->u; - if( rl_dist( z->pos(), g->u.pos() ) > 1 ) { + Creature *target = &get_player_character(); + Character &player_character = get_player_character(); + if( rl_dist( z->pos(), player_character.pos() ) > 1 ) { return false; } - if( g->u.has_trait( trait_THRESH_MARLOSS ) || g->u.has_trait( trait_THRESH_MYCUS ) ) { + if( player_character.has_trait( trait_THRESH_MARLOSS ) || + player_character.has_trait( trait_THRESH_MYCUS ) ) { z->friendly = 1; return true; } - if( ( g->u.has_trait( trait_MARLOSS ) ) && ( g->u.has_trait( trait_MARLOSS_BLUE ) ) && - !g->u.crossed_threshold() ) { + if( ( player_character.has_trait( trait_MARLOSS ) ) && + ( player_character.has_trait( trait_MARLOSS_BLUE ) ) && + !player_character.crossed_threshold() ) { add_msg( m_info, _( "The %s seems to wave you toward the tower…" ), z->name() ); z->anger = 0; return true; } if( z->friendly ) { - // TODO: attack other creatures, not just g->u, for now just skip the code below as it - // only attacks g->u but the monster is friendly. + // TODO: attack other creatures, not just player_character, for now just skip the code below as it + // only attacks player_character but the monster is friendly. return true; } add_msg( m_warning, _( "The %s jabs at you with a needlelike point!" ), z->name() ); z->moves -= 150; - if( g->u.uncanny_dodge() ) { + if( player_character.uncanny_dodge() ) { return true; } @@ -1838,7 +1865,7 @@ bool mattack::fungus_inject( monster *z ) const bodypart_id hit = target->get_random_body_part(); int dam = rng( 5, 11 ); - dam = g->u.deal_damage( z, hit, damage_instance( DT_CUT, dam ) ).total_damage(); + dam = player_character.deal_damage( z, hit, damage_instance( DT_CUT, dam ) ).total_damage(); if( dam > 0 ) { //~ 1$s is monster name, 2$s bodypart in accusative @@ -1846,7 +1873,7 @@ bool mattack::fungus_inject( monster *z ) body_part_name_accusative( hit ) ); if( one_in( 10 - dam ) ) { - g->u.add_effect( effect_fungus, 10_minutes, num_bp, true ); + player_character.add_effect( effect_fungus, 10_minutes, num_bp, true ); add_msg( m_warning, _( "You feel thousands of live spores pumping into you…" ) ); } } else { @@ -1856,14 +1883,16 @@ bool mattack::fungus_inject( monster *z ) } target->on_hit( z, hit, z->type->melee_skill ); - g->u.check_dead_state(); + player_character.check_dead_state(); return true; } bool mattack::fungus_bristle( monster *z ) { - if( g->u.has_trait( trait_THRESH_MARLOSS ) || g->u.has_trait( trait_THRESH_MYCUS ) ) { + Character &player_character = get_player_character(); + if( player_character.has_trait( trait_THRESH_MARLOSS ) || + player_character.has_trait( trait_THRESH_MYCUS ) ) { z->friendly = 1; } Creature *target = z->attack_target(); @@ -1873,7 +1902,7 @@ bool mattack::fungus_bristle( monster *z ) return false; } - auto msg_type = target == &g->u ? m_warning : m_neutral; + auto msg_type = target->is_avatar() ? m_warning : m_neutral; add_msg( msg_type, _( "The %1$s swipes at %2$s with a barbed tendril!" ), z->name(), target->disp_name() ); @@ -1921,7 +1950,7 @@ bool mattack::fungus_bristle( monster *z ) bool mattack::fungus_growth( monster *z ) { // Young fungaloid growing into an adult - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s grows into an adult!" ), z->name() ); } @@ -1935,8 +1964,9 @@ bool mattack::fungus_sprout( monster *z ) { // To avoid map shift weirdness bool push_player = false; - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 1 ) ) { - if( g->u.pos() == dest ) { + Character &player_character = get_player_character(); + for( const tripoint &dest : get_map().points_in_radius( z->pos(), 1 ) ) { + if( player_character.pos() == dest ) { push_player = true; } if( monster *const wall = g->place_critter_at( mon_fungal_wall, dest ) ) { @@ -1945,9 +1975,9 @@ bool mattack::fungus_sprout( monster *z ) } if( push_player ) { - const int angle = coord_to_angle( z->pos(), g->u.pos() ); + const int angle = coord_to_angle( z->pos(), player_character.pos() ); add_msg( m_bad, _( "You're shoved away as a fungal wall grows!" ) ); - g->fling_creature( &g->u, angle, rng( 10, 50 ) ); + g->fling_creature( &player_character, angle, rng( 10, 50 ) ); } return true; @@ -1959,39 +1989,43 @@ bool mattack::fungus_fortify( monster *z ) // TODO: handle friendly monsters return false; } - Creature *target = &g->u; + Creature *target = &get_player_character(); + Character &player_character = get_player_character(); bool mycus = false; bool peaceful = true; //No nifty support effects. Yet. This lets it rebuild hedges. - if( g->u.has_trait( trait_THRESH_MARLOSS ) || g->u.has_trait( trait_THRESH_MYCUS ) ) { + if( player_character.has_trait( trait_THRESH_MARLOSS ) || + player_character.has_trait( trait_THRESH_MYCUS ) ) { mycus = true; } - if( ( g->u.has_trait( trait_MARLOSS ) ) && ( g->u.has_trait( trait_MARLOSS_BLUE ) ) && - !g->u.crossed_threshold() && !mycus ) { + map &here = get_map(); + if( ( player_character.has_trait( trait_MARLOSS ) ) && + ( player_character.has_trait( trait_MARLOSS_BLUE ) ) && + !player_character.crossed_threshold() && !mycus ) { // You have the other two. Is it really necessary for us to fight? add_msg( m_info, _( "The %s spreads its tendrils. It seems as though it's expecting you…" ), z->name() ); - if( rl_dist( z->pos(), g->u.pos() ) < 3 ) { + if( rl_dist( z->pos(), player_character.pos() ) < 3 ) { if( query_yn( _( "The tower extends and aims several tendrils from its depths. Hold still?" ) ) ) { add_msg( m_warning, _( "The %s works several tendrils into your arms, legs, torso, and even neck…" ), z->name() ); - g->u.hurtall( 1, z ); + player_character.hurtall( 1, z ); add_msg( m_warning, _( "You see a clear golden liquid pump through the tendrils--and then lose consciousness." ) ); - g->u.unset_mutation( trait_MARLOSS ); - g->u.unset_mutation( trait_MARLOSS_BLUE ); - g->u.set_mutation( trait_THRESH_MARLOSS ); - g->m.ter_set( g->u.pos(), + player_character.unset_mutation( trait_MARLOSS ); + player_character.unset_mutation( trait_MARLOSS_BLUE ); + player_character.set_mutation( trait_THRESH_MARLOSS ); + here.ter_set( player_character.pos(), t_marloss ); // We only show you the door. You walk through it on your own. g->memorial().add( pgettext( "memorial_male", "Was shown to the Marloss Gateway." ), pgettext( "memorial_female", "Was shown to the Marloss Gateway." ) ); - g->u.add_msg_if_player( m_good, - _( "You wake up in a marloss bush. Almost *cradled* in it, actually, as though it grew there for you." ) ); - g->u.add_msg_if_player( m_good, - //~ Beginning to hear the Mycus while conscious: this is it speaking - _( "assistance, on an arduous quest. unity. together we have reached the door. now to pass through…" ) ); + add_msg( m_good, + _( "You wake up in a marloss bush. Almost *cradled* in it, actually, as though it grew there for you." ) ); + add_msg( m_good, + //~ Beginning to hear the Mycus while conscious: this is it speaking + _( "assistance, on an arduous quest. unity. together we have reached the door. now to pass through…" ) ); return true; } else { peaceful = false; // You declined the offer. Fight! @@ -2003,8 +2037,8 @@ bool mattack::fungus_fortify( monster *z ) bool fortified = false; bool push_player = false; // To avoid map shift weirdness - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 1 ) ) { - if( g->u.pos() == dest ) { + for( const tripoint &dest : here.points_in_radius( z->pos(), 1 ) ) { + if( player_character.pos() == dest ) { push_player = true; } if( monster *const wall = g->place_critter_at( mon_fungal_hedgerow, dest ) ) { @@ -2014,14 +2048,15 @@ bool mattack::fungus_fortify( monster *z ) } if( push_player ) { add_msg( m_bad, _( "You're shoved away as a fungal hedgerow grows!" ) ); - g->fling_creature( &g->u, coord_to_angle( z->pos(), g->u.pos() ), rng( 10, 50 ) ); + g->fling_creature( &player_character, coord_to_angle( z->pos(), player_character.pos() ), rng( 10, + 50 ) ); } if( fortified || mycus || peaceful ) { return true; } // TODO: De-playerize the whole block - const int dist = rl_dist( z->pos(), g->u.pos() ); + const int dist = rl_dist( z->pos(), player_character.pos() ); if( dist >= 12 ) { return false; } @@ -2036,8 +2071,8 @@ bool mattack::fungus_fortify( monster *z ) //~ %s is bodypart name in accusative. add_msg( m_bad, _( "A fungal tendril bursts forth from the earth and pierces your %s!" ), body_part_name_accusative( convert_bp( hit ).id() ) ); - g->u.deal_damage( z, convert_bp( hit ).id(), damage_instance( DT_CUT, rng( 5, 11 ) ) ); - g->u.check_dead_state(); + player_character.deal_damage( z, convert_bp( hit ).id(), damage_instance( DT_CUT, rng( 5, 11 ) ) ); + player_character.check_dead_state(); // Probably doesn't have spores available *just* yet. Let's be nice. } else if( monster *const tendril = g->place_critter_at( mon_fungal_tendril, hit_pos ) ) { add_msg( m_bad, _( "A fungal tendril bursts forth from the earth!" ) ); @@ -2050,7 +2085,7 @@ bool mattack::fungus_fortify( monster *z ) z->name() ); z->moves -= 150; - if( g->u.uncanny_dodge() ) { + if( player_character.uncanny_dodge() ) { return true; } // Can we dodge the attack? Uses player dodge function % chance (melee.cpp) @@ -2064,13 +2099,13 @@ bool mattack::fungus_fortify( monster *z ) // TODO: 21 damage with no chance to critical isn't scary const bodypart_id hit = target->get_random_body_part(); int dam = rng( 15, 21 ); - dam = g->u.deal_damage( z, hit, damage_instance( DT_STAB, dam ) ).total_damage(); + dam = player_character.deal_damage( z, hit, damage_instance( DT_STAB, dam ) ).total_damage(); if( dam > 0 ) { //~ 1$s is monster name, 2$s bodypart in accusative add_msg( m_bad, _( "The %1$s sinks its point into your %2$s!" ), z->name(), body_part_name_accusative( hit ) ); - g->u.add_effect( effect_fungus, 40_minutes, num_bp, true ); + player_character.add_effect( effect_fungus, 40_minutes, num_bp, true ); add_msg( m_warning, _( "You feel millions of live spores pumping into you…" ) ); } else { //~ 1$s is monster name, 2$s bodypart in accusative @@ -2079,7 +2114,7 @@ bool mattack::fungus_fortify( monster *z ) } target->on_hit( z, hit, z->type->melee_skill ); - g->u.check_dead_state(); + player_character.check_dead_state(); return true; } @@ -2096,7 +2131,7 @@ bool mattack::impale( monster *z ) z->moves -= 80; bool uncanny = target->uncanny_dodge(); if( uncanny || dodge_check( z, target ) ) { - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s lunges at you, but you dodge!" ), _( "The %s lunges at , but they dodge!" ), z->name() ); @@ -2111,7 +2146,7 @@ bool mattack::impale( monster *z ) rng( 5, 15 ), .5 ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_info; + auto msg_type = target->is_avatar() ? m_bad : m_info; target->add_msg_player_or_npc( msg_type, //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s impales your torso!" ), @@ -2120,15 +2155,6 @@ bool mattack::impale( monster *z ) z->name() ); target->on_hit( z, bodypart_id( "torso" ), z->type->melee_skill ); - if( one_in( 60 / ( dam + 20 ) ) ) { - if( target->is_player() || target->is_npc() ) { - target->as_character()->make_bleed( bodypart_id( "torso" ), rng( 75_turns, 125_turns ), true ); - } else { - target->add_effect( effect_bleed, rng( 75_turns, 125_turns ), bp_torso, true ); - } - - } - if( rng( 0, 200 + dam ) > 100 ) { target->add_effect( effect_downed, 3_turns ); } @@ -2167,7 +2193,7 @@ bool mattack::dermatik( monster *z ) } // Can we dodge the attack? Uses player dodge function % chance (melee.cpp) if( dodge_check( z, target ) ) { - if( target == &g->u ) { + if( target->is_avatar() ) { add_msg( _( "The %s tries to land on you, but you dodge." ), z->name() ); } z->stumble(); @@ -2190,10 +2216,11 @@ bool mattack::dermatik( monster *z ) ///\EFFECT_UNARMED increases chance of deflecting dermatik attack with TAIL_CATTLE player_swat += ( ( foe->dex_cur + foe->get_skill_level( skill_unarmed ) ) / 2 ); } + Character &player_character = get_player_character(); if( player_swat > dodge_roll ) { target->add_msg_if_player( _( "The %s lands on you, but you swat it off." ), z->name() ); if( z->get_hp() >= z->get_hp_max() / 2 ) { - z->apply_damage( &g->u, bodypart_id( "torso" ), 1 ); + z->apply_damage( &player_character, bodypart_id( "torso" ), 1 ); z->check_dead_state(); } if( player_swat > dodge_roll * 1.5 ) { @@ -2204,7 +2231,7 @@ bool mattack::dermatik( monster *z ) // Can the bug penetrate our armor? const bodypart_id targeted = target->get_random_body_part(); - if( 4 < g->u.get_armor_cut( targeted ) / 3 ) { + if( 4 < player_character.get_armor_cut( targeted ) / 3 ) { //~ 1$s monster name(dermatik), 2$s bodypart name in accusative. target->add_msg_if_player( _( "The %1$s lands on your %2$s, but can't penetrate your armor." ), z->name(), body_part_name_accusative( targeted ) ); @@ -2229,7 +2256,7 @@ bool mattack::dermatik( monster *z ) bool mattack::dermatik_growth( monster *z ) { // Dermatik larva growing into an adult - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s dermatik larva grows into an adult!" ), z->name() ); } @@ -2240,20 +2267,22 @@ bool mattack::dermatik_growth( monster *z ) bool mattack::fungal_trail( monster *z ) { - fungal_effects fe( *g, g->m ); + fungal_effects fe( *g, get_map() ); fe.spread_fungus( z->pos() ); return false; } bool mattack::plant( monster *z ) { - fungal_effects fe( *g, g->m ); + map &here = get_map(); + fungal_effects fe( *g, here ); const tripoint monster_position = z->pos(); - const bool is_fungi = g->m.has_flag_ter( "FUNGUS", monster_position ); + const bool is_fungi = here.has_flag_ter( "FUNGUS", monster_position ); // Spores taking seed and growing into a fungaloid fe.spread_fungus( monster_position ); + Character &player_character = get_player_character(); if( is_fungi && one_in( 10 + g->num_creatures() / 5 ) ) { - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The %s takes seed and becomes a young fungaloid!" ), z->name() ); } @@ -2262,7 +2291,7 @@ bool mattack::plant( monster *z ) z->moves -= 1000; // It takes a while return false; } else { - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( _( "The %s falls to the ground and bursts!" ), z->name() ); } @@ -2291,7 +2320,7 @@ static void poly_keep_speed( monster &mon, const mtype_id &id ) static bool blobify( monster &blob, monster &target ) { - if( g->u.sees( target ) ) { + if( get_player_character().sees( target ) ) { add_msg( m_warning, _( "%s is engulfed by %s!" ), target.disp_name(), blob.disp_name() ); } @@ -2333,7 +2362,7 @@ bool mattack::formblob( monster *z ) } bool didit = false; - std::vector pts = closest_tripoints_first( z->pos(), 1 ); + std::vector pts = closest_points_first( z->pos(), 1 ); // Don't check own tile pts.erase( pts.begin() ); for( const tripoint &dest : pts ) { @@ -2417,9 +2446,9 @@ bool mattack::callblobs( monster *z ) // if we want to deal with NPCS and friendly monsters as well. // The strategy is to send about 1/3 of the available blobs after the player, // and keep the rest near the brain blob for protection. - tripoint enemy = g->u.pos(); + tripoint enemy = get_player_character().pos(); std::list allies; - std::vector nearby_points = closest_tripoints_first( z->pos(), 3 ); + std::vector nearby_points = closest_points_first( z->pos(), 3 ); for( monster &candidate : g->all_monsters() ) { if( candidate.type->in_species( species_BLOB ) && candidate.type->id != mon_blob_brain ) { // Just give the allies consistent assignments. @@ -2452,7 +2481,7 @@ bool mattack::jackson( monster *z ) { // Jackson draws nearby zombies into the dance. std::list allies; - std::vector nearby_points = closest_tripoints_first( z->pos(), 3 ); + std::vector nearby_points = closest_points_first( z->pos(), 3 ); for( monster &candidate : g->all_monsters() ) { if( candidate.type->in_species( species_ZOMBIE ) && candidate.type->id != mon_zombie_jackson ) { // Just give the allies consistent assignments. @@ -2481,7 +2510,7 @@ bool mattack::jackson( monster *z ) } // Did we convert anybody? if( converted ) { - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s lets out a high-pitched cry!" ), z->name() ); } } @@ -2491,7 +2520,7 @@ bool mattack::jackson( monster *z ) bool mattack::dance( monster *z ) { - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { switch( rng( 1, 10 ) ) { case 1: add_msg( m_neutral, _( "The %s swings its arms from side to side!" ), z->name() ); @@ -2536,14 +2565,14 @@ bool mattack::dogthing( monster *z ) return false; } - if( !one_in( 3 ) || !g->u.sees( *z ) ) { + if( !one_in( 3 ) || !get_player_character().sees( *z ) ) { return false; } add_msg( _( "The %s's head explodes in a mass of roiling tentacles!" ), z->name() ); - g->m.add_splash( z->bloodType(), z->pos(), 2, 3 ); + get_map().add_splash( z->bloodType(), z->pos(), 2, 3 ); z->friendly = 0; z->poly( mon_headless_dog_thing ); @@ -2561,7 +2590,7 @@ bool mattack::tentacle( monster *z ) if( target == nullptr || rl_dist( z->pos(), target->pos() ) > 3 || !z->sees( *target ) ) { return false; } - game_message_type msg_type = target == &g->u ? m_bad : m_info; + game_message_type msg_type = target->is_avatar() ? m_bad : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s lashes its tentacle at you!" ), _( "The %s lashes its tentacle at !" ), @@ -2615,8 +2644,9 @@ bool mattack::ranged_pull( monster *z ) } player *foe = dynamic_cast< player * >( target ); - std::vector line = g->m.find_clear_path( z->pos(), target->pos() ); - bool seen = g->u.sees( *z ); + map &here = get_map(); + std::vector line = here.find_clear_path( z->pos(), target->pos() ); + bool seen = get_player_character().sees( *z ); for( auto &i : line ) { // Player can't be pulled though bars, furniture, cars or creatures @@ -2631,7 +2661,7 @@ bool mattack::ranged_pull( monster *z ) const bool uncanny = target->uncanny_dodge(); if( uncanny || dodge_check( z, target ) ) { z->moves -= 200; - auto msg_type = foe == &g->u ? m_warning : m_info; + auto msg_type = foe && foe->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s's arms fly out at you, but you dodge!" ), _( "The %s's arms fly out at , but they dodge!" ), z->name() ); @@ -2662,7 +2692,7 @@ bool mattack::ranged_pull( monster *z ) if( foe != nullptr ) { if( foe->in_vehicle ) { - g->m.unboard_vehicle( foe->pos() ); + here.unboard_vehicle( foe->pos() ); } if( target->is_player() && ( pt.x < HALF_MAPSIZE_X || pt.y < HALF_MAPSIZE_Y || @@ -2681,7 +2711,7 @@ bool mattack::ranged_pull( monster *z ) } // The monster might drag a target that's not on it's z level // So if they leave them on open air, make them fall - g->m.creature_on_trap( *target ); + here.creature_on_trap( *target ); if( seen ) { if( z->type->bodytype == "human" || z->type->bodytype == "angel" ) { add_msg( _( "The %1$s's arms fly out and pull and grab %2$s!" ), z->name(), @@ -2711,7 +2741,7 @@ bool mattack::grab( monster *z ) z->moves -= 80; const bool uncanny = target->uncanny_dodge(); - const auto msg_type = target == &g->u ? m_warning : m_info; + const auto msg_type = target->is_avatar() ? m_warning : m_info; if( uncanny || dodge_check( z, target ) ) { target->add_msg_player_or_npc( msg_type, _( "The %s gropes at you, but you dodge!" ), _( "The %s gropes at , but they dodge!" ), @@ -2805,7 +2835,7 @@ bool mattack::grab_drag( monster *z ) } if( foe != nullptr ) { if( foe->in_vehicle ) { - g->m.unboard_vehicle( foe->pos() ); + get_map().unboard_vehicle( foe->pos() ); } foe->setpos( zpt ); } else { @@ -2870,7 +2900,7 @@ bool mattack::para_sting( monster *z ) bool mattack::triffid_growth( monster *z ) { // Young triffid growing into an adult - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s young triffid grows into an adult!" ), z->name() ); } @@ -2886,33 +2916,34 @@ bool mattack::stare( monster *z ) return false; } z->moves -= 200; - if( z->sees( g->u ) ) { + Character &player_character = get_player_character(); + if( z->sees( player_character ) ) { //dimensional effects don't take against dimensionally anchored foes. - if( g->u.worn_with_flag( "DIMENSIONAL_ANCHOR" ) || - g->u.has_effect_with_flag( "DIMENSIONAL_ANCHOR" ) ) { + if( player_character.worn_with_flag( "DIMENSIONAL_ANCHOR" ) || + player_character.has_effect_with_flag( "DIMENSIONAL_ANCHOR" ) ) { add_msg( m_warning, _( "You feel a strange reverberation across your body." ) ); return true; } - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_bad, _( "The %s stares at you, and you shudder." ), z->name() ); } else { add_msg( m_bad, _( "You feel like you're being watched, it makes you sick." ) ); } - g->u.add_effect( effect_taint, rng( 2_minutes, 5_minutes ) ); + player_character.add_effect( effect_taint, rng( 2_minutes, 5_minutes ) ); //Check severity before adding more debuffs - if( g->u.get_effect_int( effect_taint ) > 2 ) { - g->u.add_effect( effect_hallu, 30_minutes ); + if( player_character.get_effect_int( effect_taint ) > 2 ) { + player_character.add_effect( effect_hallu, 30_minutes ); //Check if target is a player before spawning hallucinations - if( g->u.is_player() && one_in( 2 ) ) { - g->spawn_hallucination( g->u.pos() + tripoint( rng( -10, 10 ), rng( -10, 10 ), 0 ) ); + if( player_character.is_player() && one_in( 2 ) ) { + g->spawn_hallucination( player_character.pos() + tripoint( rng( -10, 10 ), rng( -10, 10 ), 0 ) ); } if( one_in( 12 ) ) { - g->u.add_effect( effect_blind, 5_minutes ); + player_character.add_effect( effect_blind, 5_minutes ); add_msg( m_bad, _( "Your sight darkens as the visions overtake you!" ) ); } } - if( g->u.get_effect_int( effect_taint ) >= 3 && one_in( 12 ) ) { - g->u.add_effect( effect_tindrift, 1_turns ); + if( player_character.get_effect_int( effect_taint ) >= 3 && one_in( 12 ) ) { + player_character.add_effect( effect_tindrift, 1_turns ); } } return true; @@ -2924,15 +2955,17 @@ bool mattack::fear_paralyze( monster *z ) // TODO: handle friendly monsters return false; } - if( g->u.sees( *z ) && !g->u.has_effect( effect_fearparalyze ) ) { - if( g->u.has_artifact_with( AEP_PSYSHIELD ) || ( g->u.worn_with_flag( "PSYSHIELD_PARTIAL" ) && - one_in( 4 ) ) ) { + Character &player_character = get_player_character(); + if( player_character.sees( *z ) && !player_character.has_effect( effect_fearparalyze ) ) { + if( player_character.has_artifact_with( AEP_PSYSHIELD ) || + ( player_character.worn_with_flag( "PSYSHIELD_PARTIAL" ) && + one_in( 4 ) ) ) { add_msg( _( "The %s probes your mind, but is rebuffed!" ), z->name() ); ///\EFFECT_INT decreases chance of being paralyzed by fear attack - } else if( rng( 0, 20 ) > g->u.get_int() ) { + } else if( rng( 0, 20 ) > player_character.get_int() ) { add_msg( m_bad, _( "The terrifying visage of the %s paralyzes you." ), z->name() ); - g->u.add_effect( effect_fearparalyze, 5_turns ); - g->u.moves -= 4 * g->u.get_speed(); + player_character.add_effect( effect_fearparalyze, 5_turns ); + player_character.moves -= 4 * player_character.get_speed(); } else { add_msg( _( "You manage to avoid staring at the horrendous %s." ), z->name() ); } @@ -2945,10 +2978,11 @@ bool mattack::nurse_check_up( monster *z ) bool found_target = false; player *target = nullptr; tripoint tmp_pos( z->pos() + point( 12, 12 ) ); - for( auto critter : g->m.get_creatures_in_radius( z->pos(), 6 ) ) { + map &here = get_map(); + for( auto critter : here.get_creatures_in_radius( z->pos(), 6 ) ) { player *tmp_player = dynamic_cast( critter ); if( tmp_player != nullptr && z->sees( *tmp_player ) && - g->m.clear_path( z->pos(), tmp_player->pos(), 10, 0, + here.clear_path( z->pos(), tmp_player->pos(), 10, 0, 100 ) ) { // no need to scan players we can't reach if( rl_dist( z->pos(), tmp_player->pos() ) < rl_dist( z->pos(), tmp_pos ) ) { tmp_pos = tmp_player->pos(); @@ -2974,7 +3008,7 @@ bool mattack::nurse_check_up( monster *z ) sounds::sound( z->pos(), 8, sounds::sound_t::electronic_speech, string_format( _( "a soft robotic voice say, \"Here we go. Just hold still.\"" ) ) ); - if( target == &g->u ) { + if( target->is_avatar() ) { add_msg( m_good, _( "You get a medical check-up." ) ); } target->add_effect( effect_got_checked, 10_turns ); @@ -2987,7 +3021,7 @@ bool mattack::nurse_check_up( monster *z ) bool mattack::nurse_assist( monster *z ) { - const bool u_see = g->u.sees( *z ); + const bool u_see = get_player_character().sees( *z ); if( u_see && one_in( 100 ) ) { add_msg( m_info, _( "The %s is scanning its surroundings." ), z->name() ); @@ -2995,12 +3029,13 @@ bool mattack::nurse_assist( monster *z ) bool found_target = false; player *target = nullptr; + map &here = get_map(); tripoint tmp_pos( z->pos() + point( 12, 12 ) ); - for( auto critter : g->m.get_creatures_in_radius( z->pos(), 6 ) ) { + for( auto critter : here.get_creatures_in_radius( z->pos(), 6 ) ) { player *tmp_player = dynamic_cast( critter ); // No need to scan players we can't reach if( tmp_player != nullptr && z->sees( *tmp_player ) && - g->m.clear_path( z->pos(), tmp_player->pos(), 10, 0, 100 ) ) { + here.clear_path( z->pos(), tmp_player->pos(), 10, 0, 100 ) ) { if( rl_dist( z->pos(), tmp_player->pos() ) < rl_dist( z->pos(), tmp_pos ) ) { tmp_pos = tmp_player->pos(); target = tmp_player; @@ -3029,14 +3064,15 @@ bool mattack::nurse_operate( monster *z ) if( z->has_effect( effect_dragging ) || z->has_effect( effect_operating ) ) { return false; } - const bool u_see = g->u.sees( *z ); + Character &player_character = get_player_character(); + const bool u_see = player_character.sees( *z ); if( u_see && one_in( 100 ) ) { add_msg( m_info, _( "The %s is scanning its surroundings." ), z->name() ); } - if( ( ( g->u.is_wearing( itype_badge_doctor ) || - z->attitude_to( g->u ) == Creature::Attitude::FRIENDLY ) && u_see ) && one_in( 100 ) ) { + if( ( ( player_character.is_wearing( itype_badge_doctor ) || + z->attitude_to( player_character ) == Creature::Attitude::FRIENDLY ) && u_see ) && one_in( 100 ) ) { add_msg( m_info, _( "The %s doesn't seem to register you as a doctor." ), z->name() ); } @@ -3050,12 +3086,13 @@ bool mattack::nurse_operate( monster *z ) bool found_target = false; player *target = nullptr; + map &here = get_map(); tripoint tmp_pos( z->pos() + point( 12, 12 ) ); - for( auto critter : g->m.get_creatures_in_radius( z->pos(), 6 ) ) { + for( auto critter : here.get_creatures_in_radius( z->pos(), 6 ) ) { player *tmp_player = dynamic_cast< player *>( critter ); // No need to scan players we can't reach if( tmp_player != nullptr && z->sees( *tmp_player ) && - g->m.clear_path( z->pos(), tmp_player->pos(), 10, 0, 100 ) ) { + here.clear_path( z->pos(), tmp_player->pos(), 10, 0, 100 ) ) { if( tmp_player->has_any_bionic() ) { if( rl_dist( z->pos(), tmp_player->pos() ) < rl_dist( z->pos(), tmp_pos ) ) { tmp_pos = tmp_player->pos(); @@ -3065,7 +3102,7 @@ bool mattack::nurse_operate( monster *z ) } } } - if( found_target && z->attitude_to( g->u ) == Creature::Attitude::FRIENDLY ) { + if( found_target && z->attitude_to( player_character ) == Creature::Attitude::FRIENDLY ) { // 50% chance to not turn hostile again if( one_in( 2 ) ) { return false; @@ -3080,7 +3117,7 @@ bool mattack::nurse_operate( monster *z ) z->friendly = 0; z->anger = 100; - std::list couch_pos = g->m.find_furnitures_with_flag_in_radius( z->pos(), 10, + std::list couch_pos = here.find_furnitures_with_flag_in_radius( z->pos(), 10, flag_AUTODOC_COUCH ); if( couch_pos.empty() ) { @@ -3093,7 +3130,7 @@ bool mattack::nurse_operate( monster *z ) // Check if target is already grabbed by something else if( target->has_effect( effect_grabbed ) ) { - for( auto critter : g->m.get_creatures_in_radius( target->pos(), 1 ) ) { + for( auto critter : here.get_creatures_in_radius( target->pos(), 1 ) ) { monster *mon = dynamic_cast( critter ); if( mon != nullptr && mon != z ) { if( mon->type->id != mon_nursebot_defective ) { @@ -3135,7 +3172,7 @@ bool mattack::check_money_left( monster *z ) if( !z->inv.empty() ) { for( const item &it : z->inv ) { - g->m.add_item_or_charges( z->pos(), it ); + get_map().add_item_or_charges( z->pos(), it ); } z->inv.clear(); z->remove_effect( effect_has_bag ); @@ -3175,12 +3212,13 @@ bool mattack::photograph( monster *z ) return false; } + Character &player_character = get_player_character(); // Badges should NOT be swappable between roles. // Hence separate checking. // If you are in fact listed as a police officer - if( g->u.has_trait( trait_PROF_POLICE ) ) { + if( player_character.has_trait( trait_PROF_POLICE ) ) { // And you're wearing your badge - if( g->u.is_wearing( itype_badge_deputy ) ) { + if( player_character.is_wearing( itype_badge_deputy ) ) { if( one_in( 3 ) ) { add_msg( m_info, _( "The %s flashes a LED and departs. Human officer on scene." ), z->name() ); @@ -3198,9 +3236,9 @@ bool mattack::photograph( monster *z ) } } - if( g->u.has_trait( trait_PROF_PD_DET ) ) { + if( player_character.has_trait( trait_PROF_PD_DET ) ) { // And you have your shield on - if( g->u.is_wearing( itype_badge_detective ) ) { + if( player_character.is_wearing( itype_badge_detective ) ) { if( one_in( 4 ) ) { add_msg( m_info, _( "The %s flashes a LED and departs. Human officer on scene." ), z->name() ); @@ -3216,9 +3254,9 @@ bool mattack::photograph( monster *z ) return true; } } - } else if( g->u.has_trait( trait_PROF_SWAT ) ) { + } else if( player_character.has_trait( trait_PROF_SWAT ) ) { // And you're wearing your badge - if( g->u.is_wearing( itype_badge_swat ) ) { + if( player_character.is_wearing( itype_badge_swat ) ) { if( one_in( 3 ) ) { add_msg( m_info, _( "The %s flashes a LED and departs. SWAT's working the area." ), z->name() ); @@ -3233,9 +3271,9 @@ bool mattack::photograph( monster *z ) return true; } } - } else if( g->u.has_trait( trait_PROF_CYBERCO ) ) { + } else if( player_character.has_trait( trait_PROF_CYBERCO ) ) { // And you're wearing your badge - if( g->u.is_wearing( itype_badge_cybercop ) ) { + if( player_character.is_wearing( itype_badge_cybercop ) ) { if( one_in( 3 ) ) { add_msg( m_info, _( "The %s winks a LED and departs. One machine to another?" ), z->name() ); @@ -3253,9 +3291,9 @@ bool mattack::photograph( monster *z ) } } - if( g->u.has_trait( trait_PROF_FED ) ) { + if( player_character.has_trait( trait_PROF_FED ) ) { // And you're wearing your badge - if( g->u.is_wearing( itype_badge_marshal ) ) { + if( player_character.is_wearing( itype_badge_marshal ) ) { add_msg( m_info, _( "The %s flashes a LED and departs. The Feds got this." ), z->name() ); z->no_corpse_quiet = true; z->no_extra_death_drops = true; @@ -3264,7 +3302,7 @@ bool mattack::photograph( monster *z ) } } - if( z->friendly || g->u.weapon.typeId() == itype_e_handcuffs ) { + if( z->friendly || player_character.weapon.typeId() == itype_e_handcuffs ) { // Friendly (hacked?) bot ignore the player. Arrested suspect ignored too. // TODO: might need to be revisited when it can target npcs. return false; @@ -3274,23 +3312,23 @@ bool mattack::photograph( monster *z ) // TODO: Make the player known to the faction std::string cname = _( "…database connection lost!" ); if( one_in( 6 ) ) { - cname = Name::generate( g->u.male ); + cname = Name::generate( player_character.male ); } else if( one_in( 3 ) ) { - cname = g->u.name; + cname = player_character.name; } sounds::sound( z->pos(), 15, sounds::sound_t::alert, string_format( _( "a robotic voice boom, \"Citizen %s!\"" ), cname ), false, "speech", z->type->id.str() ); - if( g->u.weapon.is_gun() ) { + if( player_character.weapon.is_gun() ) { sounds::sound( z->pos(), 15, sounds::sound_t::alert, _( "\"Drop your gun! Now!\"" ) ); - } else if( g->u.is_armed() ) { + } else if( player_character.is_armed() ) { sounds::sound( z->pos(), 15, sounds::sound_t::alert, _( "\"Drop your weapon! Now!\"" ) ); } const SpeechBubble &speech = get_speech( z->type->id.str() ); sounds::sound( z->pos(), speech.volume, sounds::sound_t::alert, speech.text.translated() ); g->timed_events.add( timed_event_type::ROBOT_ATTACK, calendar::turn + rng( 15_turns, 30_turns ), 0, - g->u.global_sm_location() ); + player_character.global_sm_location() ); return true; } @@ -3323,7 +3361,8 @@ void mattack::taze( monster *z, Creature *target ) return; } - auto m_type = target->attitude_to( g->u ) == Creature::Attitude::FRIENDLY ? m_bad : m_neutral; + auto m_type = target->attitude_to( get_player_character() ) == Creature::Attitude::FRIENDLY ? + m_bad : m_neutral; target->add_msg_player_or_npc( m_type, _( "The %s shocks you!" ), _( "The %s shocks !" ), @@ -3347,7 +3386,7 @@ void mattack::rifle( monster *z, Creature *target ) // No need to aim tmp.recoil = 0; - if( target == &g->u ) { + if( target && target->is_avatar() ) { if( !z->has_effect( effect_targeted ) ) { sounds::sound( z->pos(), 8, sounds::sound_t::alarm, _( "beep-beep." ), false, "misc", "beep" ); z->add_effect( effect_targeted, 8_turns ); @@ -3366,7 +3405,7 @@ void mattack::rifle( monster *z, Creature *target ) } return; } - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s opens up with its rifle!" ), z->name() ); } @@ -3375,7 +3414,7 @@ void mattack::rifle( monster *z, Creature *target ) z->ammo[ ammo_type ] -= tmp.fire_gun( target->pos(), burst ) * tmp.weapon.ammo_required(); - if( target == &g->u ) { + if( target && target->is_avatar() ) { z->add_effect( effect_targeted, 3_turns ); } } @@ -3390,9 +3429,10 @@ void mattack::frag( monster *z, Creature *target ) // This is for the bots, not z->ammo[ammo_type] = 200; } - if( target == &g->u ) { + Character &player_character = get_player_character(); + if( target && target->is_avatar() ) { if( !z->has_effect( effect_targeted ) ) { - if( g->u.has_trait( trait_PROF_CHURL ) ) { + if( player_character.has_trait( trait_PROF_CHURL ) ) { //~ Potential grenading detected. add_msg( m_warning, _( "Thee eye o dat divil be upon me!" ) ); } else { @@ -3400,7 +3440,7 @@ void mattack::frag( monster *z, Creature *target ) // This is for the bots, not add_msg( m_warning, _( "Those laser dots don't seem very friendly…" ) ); } // Effect removed in game.cpp, duration doesn't much matter - g->u.add_effect( effect_laserlocked, 3_turns ); + player_character.add_effect( effect_laserlocked, 3_turns ); sounds::sound( z->pos(), 10, sounds::sound_t::electronic_speech, _( "Targeting." ), false, "speech", z->type->id.str() ); z->add_effect( effect_targeted, 5_turns ); @@ -3426,7 +3466,7 @@ void mattack::frag( monster *z, Creature *target ) // This is for the bots, not } return; } - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The %s's grenade launcher fires!" ), z->name() ); } @@ -3435,7 +3475,7 @@ void mattack::frag( monster *z, Creature *target ) // This is for the bots, not z->ammo[ ammo_type ] -= tmp.fire_gun( target->pos(), burst ) * tmp.weapon.ammo_required(); - if( target == &g->u ) { + if( target && target->is_avatar() ) { z->add_effect( effect_targeted, 3_turns ); } } @@ -3486,7 +3526,7 @@ void mattack::tankgun( monster *z, Creature *target ) } return; } - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "The %s's 120mm cannon fires!" ), z->name() ); } tmp.weapon = item( "TANK" ).ammo_set( ammo_type, z->ammo[ ammo_type ] ); @@ -3509,6 +3549,7 @@ bool mattack::searchlight( monster *z ) const int zposx = z->posx(); const int zposy = z->posy(); + map &here = get_map(); //this searchlight is not initialized if( z->inv.empty() ) { @@ -3521,7 +3562,7 @@ bool mattack::searchlight( monster *z ) settings.set_var( "SL_PREFER_RIGHT", "TRUE" ); settings.set_var( "SL_PREFER_LEFT", "TRUE" ); - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 24 ) ) { + for( const tripoint &dest : here.points_in_radius( z->pos(), 24 ) ) { const monster *const mon = g->critter_at( dest ); if( mon && mon->type->id == mon_turret_searchlight ) { if( dest.x < zposx ) { @@ -3554,7 +3595,7 @@ bool mattack::searchlight( monster *z ) for( int x = zposx - 24; x < zposx + 24; x++ ) { for( int y = zposy - 24; y < zposy + 24; y++ ) { tripoint dest( x, y, z->posz() ); - if( g->m.ter( dest ) == ter_str_id( "t_plut_generator" ) ) { + if( here.ter( dest ) == ter_str_id( "t_plut_generator" ) ) { generator_ok = true; } } @@ -3569,6 +3610,7 @@ bool mattack::searchlight( monster *z ) } } + Character &player_character = get_player_character(); for( int i = 0; i < max_lamp_count; i++ ) { item &settings = z->inv[i]; @@ -3603,7 +3645,7 @@ bool mattack::searchlight( monster *z ) for( int i = 0; i < rng( 1, 2 ); i++ ) { - if( !z->sees( g->u ) ) { + if( !z->sees( player_character ) ) { shift = settings.get_var( "SL_DIR", shift ); switch( shift ) { @@ -3641,16 +3683,16 @@ bool mattack::searchlight( monster *z ) } } else { - if( x < g->u.posx() ) { + if( x < player_character.posx() ) { x++; } - if( x > g->u.posx() ) { + if( x > player_character.posx() ) { x--; } - if( y < g->u.posy() ) { + if( y < player_character.posy() ) { y++; } - if( y > g->u.posy() ) { + if( y > player_character.posy() ) { y--; } } @@ -3674,7 +3716,7 @@ bool mattack::searchlight( monster *z ) settings.set_var( "SL_SPOT_X", x - zposx ); settings.set_var( "SL_SPOT_Y", y - zposy ); - g->m.add_field( tripoint( x, y, z->posz() ), fd_spotlight, 1 ); + here.add_field( tripoint( x, y, z->posz() ), fd_spotlight, 1 ); } @@ -3687,6 +3729,7 @@ bool mattack::flamethrower( monster *z ) // TODO: handle friendly monsters return false; } + Character &player_character = get_player_character(); // TODO: that is always false! if( z->friendly != 0 ) { // Attacking monsters, not the player! @@ -3695,7 +3738,7 @@ bool mattack::flamethrower( monster *z ) // Couldn't find any targets! if( target == nullptr ) { // Because that stupid oaf was in the way! - if( boo_hoo > 0 && g->u.sees( *z ) ) { + if( boo_hoo > 0 && player_character.sees( *z ) ) { add_msg( m_warning, ngettext( "Pointed in your direction, the %s emits an IFF warning beep.", "Pointed in your direction, the %s emits %d annoyed sounding beeps.", boo_hoo ), @@ -3712,7 +3755,7 @@ bool mattack::flamethrower( monster *z ) return false; } - flame( z, &g->u ); + flame( z, &player_character ); return true; } @@ -3720,27 +3763,29 @@ bool mattack::flamethrower( monster *z ) void mattack::flame( monster *z, Creature *target ) { int dist = rl_dist( z->pos(), target->pos() ); - if( target != &g->u ) { + Character &player_character = get_player_character(); + map &here = get_map(); + if( target != &player_character ) { // friendly // It takes a while z->moves -= 500; - if( !g->m.sees( z->pos(), target->pos(), dist ) ) { + if( !here.sees( z->pos(), target->pos(), dist ) ) { // shouldn't happen debugmsg( "mattack::flame invoked on invisible target" ); } - std::vector traj = g->m.find_clear_path( z->pos(), target->pos() ); + std::vector traj = here.find_clear_path( z->pos(), target->pos() ); for( auto &i : traj ) { // break out of attack if flame hits a wall // TODO: Z - if( g->m.hit_with_fire( tripoint( i.xy(), z->posz() ) ) ) { - if( g->u.sees( i ) ) { + if( here.hit_with_fire( tripoint( i.xy(), z->posz() ) ) ) { + if( player_character.sees( i ) ) { add_msg( _( "The tongue of flame hits the %s!" ), - g->m.tername( i.xy() ) ); + here.tername( i.xy() ) ); } return; } - g->m.add_field( i, fd_fire, 1 ); + here.add_field( i, fd_fire, 1 ); } target->add_effect( effect_onfire, 8_turns, bp_torso ); @@ -3749,22 +3794,22 @@ void mattack::flame( monster *z, Creature *target ) // It takes a while z->moves -= 500; - if( !g->m.sees( z->pos(), target->pos(), dist + 1 ) ) { + if( !here.sees( z->pos(), target->pos(), dist + 1 ) ) { // shouldn't happen debugmsg( "mattack::flame invoked on invisible target" ); } - std::vector traj = g->m.find_clear_path( z->pos(), target->pos() ); + std::vector traj = here.find_clear_path( z->pos(), target->pos() ); for( auto &i : traj ) { // break out of attack if flame hits a wall - if( g->m.hit_with_fire( tripoint( i.xy(), z->posz() ) ) ) { - if( g->u.sees( i ) ) { + if( here.hit_with_fire( tripoint( i.xy(), z->posz() ) ) ) { + if( player_character.sees( i ) ) { add_msg( _( "The tongue of flame hits the %s!" ), - g->m.tername( i.xy() ) ); + here.tername( i.xy() ) ); } return; } - g->m.add_field( i, fd_fire, 1 ); + here.add_field( i, fd_fire, 1 ); } if( !target->uncanny_dodge() ) { target->add_effect( effect_onfire, 8_turns, bp_torso ); @@ -3825,6 +3870,7 @@ bool mattack::chickenbot( monster *z ) int mode = 0; int boo_hoo = 0; Creature *target; + Character &player_character = get_player_character(); if( z->friendly == 0 ) { target = z->attack_target(); if( target == nullptr ) { @@ -3833,7 +3879,7 @@ bool mattack::chickenbot( monster *z ) } else { target = z->auto_find_hostile_target( 38, boo_hoo ); if( target == nullptr ) { - if( boo_hoo > 0 && g->u.sees( *z ) ) { // because that stupid oaf was in the way! + if( boo_hoo > 0 && player_character.sees( *z ) ) { // because that stupid oaf was in the way! add_msg( m_warning, ngettext( "Pointed in your direction, the %s emits an IFF warning beep.", "Pointed in your direction, the %s emits %d annoyed sounding beeps.", boo_hoo ), @@ -3854,13 +3900,13 @@ bool mattack::chickenbot( monster *z ) } int dist = rl_dist( z->pos(), target->pos() ); - int player_dist = rl_dist( target->pos(), g->u.pos() ); + int player_dist = rl_dist( target->pos(), player_character.pos() ); if( dist == 1 && one_in( 2 ) ) { // Use tazer at point-blank range, and even then, not continuously. mode = 1; } else if( ( z->friendly == 0 || player_dist >= 6 ) && // Avoid shooting near player if we're friendly. - ( dist >= 12 || ( g->u.in_vehicle && dist >= 6 ) ) ) { + ( dist >= 12 || ( player_character.in_vehicle && dist >= 6 ) ) ) { // Only use at long range, unless player is in a vehicle, then tolerate closer targeting. mode = 3; } else if( dist >= 4 ) { @@ -3907,6 +3953,7 @@ bool mattack::multi_robot( monster *z ) int mode = 0; int boo_hoo = 0; Creature *target; + Character &player_character = get_player_character(); if( z->friendly == 0 ) { target = z->attack_target(); if( target == nullptr ) { @@ -3915,7 +3962,7 @@ bool mattack::multi_robot( monster *z ) } else { target = z->auto_find_hostile_target( 48, boo_hoo ); if( target == nullptr ) { - if( boo_hoo > 0 && g->u.sees( *z ) ) { // because that stupid oaf was in the way! + if( boo_hoo > 0 && player_character.sees( *z ) ) { // because that stupid oaf was in the way! add_msg( m_warning, ngettext( "Pointed in your direction, the %s emits an IFF warning beep.", "Pointed in your direction, the %s emits %d annoyed sounding beeps.", boo_hoo ), @@ -3940,9 +3987,8 @@ bool mattack::multi_robot( monster *z ) mode = 1; } else if( dist <= 30 ) { mode = 2; - } else if( ( target == &g->u && g->u.in_vehicle ) || - z->friendly != 0 || - cap > 4 ) { + } else if( ( target && target->is_avatar() && player_character.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 < 50 ) { @@ -3985,8 +4031,10 @@ bool mattack::ratking( monster *z ) // TODO: handle friendly monsters return false; } + Character &player_character = get_player_character(); // Disable z-level ratting or it can get silly - if( rl_dist( z->pos(), g->u.pos() ) > 50 || z->posz() != g->u.posz() ) { + if( rl_dist( z->pos(), player_character.pos() ) > 50 || + z->posz() != player_character.posz() ) { return false; } @@ -4007,8 +4055,8 @@ bool mattack::ratking( monster *z ) add_msg( m_warning, _( "\"FOUL INTERLOPER…\"" ) ); break; } - if( rl_dist( z->pos(), g->u.pos() ) <= 10 ) { - g->u.add_effect( effect_rat, 3_minutes ); + if( rl_dist( z->pos(), player_character.pos() ) <= 10 ) { + player_character.add_effect( effect_rat, 3_minutes ); } return true; @@ -4052,11 +4100,12 @@ bool mattack::upgrade( monster *z ) monster *target = random_entry( targets ); std::string old_name = target->name(); - const auto could_see = g->u.sees( *target ); + Character &player_character = get_player_character(); + const bool could_see = player_character.sees( *target ); target->hasten_upgrade(); target->try_upgrade( false ); - const auto can_see = g->u.sees( *target ); - if( g->u.sees( *z ) ) { + const bool can_see = player_character.sees( *target ); + if( player_character.sees( *z ) ) { if( could_see ) { //~ %1$s is the name of the zombie upgrading the other, %2$s is the zombie being upgraded. add_msg( m_warning, _( "A black mist floats from the %1$s around the %2$s." ), @@ -4087,7 +4136,7 @@ bool mattack::breathe( monster *z ) bool able = ( z->type->id == mon_breather_hub ); if( !able ) { - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 3 ) ) { + for( const tripoint &dest : get_map().points_in_radius( z->pos(), 3 ) ) { monster *const mon = g->critter_at( dest ); if( mon && mon->type->id == mon_breather_hub ) { able = true; @@ -4122,12 +4171,13 @@ bool mattack::stretch_bite( monster *z ) z->moves -= 150; - for( auto &pnt : g->m.find_clear_path( z->pos(), target->pos() ) ) { - if( g->m.impassable( pnt ) ) { + map &here = get_map(); + for( auto &pnt : here.find_clear_path( z->pos(), target->pos() ) ) { + if( here.impassable( pnt ) ) { z->add_effect( effect_stunned, 6_turns ); target->add_msg_player_or_npc( _( "The %1$s stretches its head at you, but bounces off the %2$s" ), _( "The %1$s stretches its head at , but bounces off the %2$s" ), - z->name(), g->m.obstacle_name( pnt ) ); + z->name(), here.obstacle_name( pnt ) ); return true; } } @@ -4136,7 +4186,7 @@ bool mattack::stretch_bite( monster *z ) if( uncanny || dodge_check( z, target ) ) { z->moves -= 150; z->add_effect( effect_stunned, 3_turns ); - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s's head extends to bite you, but you dodge and the head sails past!" ), _( "The %s's head extends to bite , but they dodge and the head sails past!" ), @@ -4154,7 +4204,7 @@ bool mattack::stretch_bite( monster *z ) dam = target->deal_damage( z, hit, damage_instance( DT_STAB, dam ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_info; + auto msg_type = target->is_avatar() ? m_bad : m_info; target->add_msg_player_or_npc( msg_type, //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s's teeth sink into your %2$s!" ), @@ -4191,7 +4241,7 @@ bool mattack::brandish( monster *z ) return false; } // Only brandish if we can see you! - if( !z->sees( g->u ) ) { + if( !z->sees( get_player_character() ) ) { return false; } add_msg( m_warning, _( "He's brandishing a knife!" ) ); @@ -4231,7 +4281,7 @@ bool mattack::flesh_golem( monster *z ) // No attacking through floor, even if we can see the target somehow return false; } - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( _( "The %1$s swings a massive claw at %2$s!" ), z->name(), target->disp_name() ); } @@ -4273,9 +4323,11 @@ bool mattack::absorb_meat( monster *z ) const int max_meat_absorbed = monster_volume / 10.0 * average_meat_chunk_volume; //For every milliliter of meat absorbed, heal this many HP const float meat_absorption_factor = 0.01; + Character &player_character = get_player_character(); + map &here = get_map(); //Search surrounding tiles for meat - for( const auto &p : g->m.points_in_radius( z->pos(), 1 ) ) { - map_stack items = g->m.i_at( p ); + for( const auto &p : here.points_in_radius( z->pos(), 1 ) ) { + map_stack items = here.i_at( p ); for( auto ¤t_item : items ) { const material_id current_item_material = current_item.get_base_material().ident(); if( current_item_material == material_id( "flesh" ) || @@ -4295,15 +4347,15 @@ bool mattack::absorb_meat( monster *z ) int meat_absorbed = std::min( max_meat_absorbed, rng( 1, total_charges ) ); const int hp_to_heal = meat_absorbed * ml_per_charge * meat_absorption_factor; z->heal( hp_to_heal, true ); - g->m.use_charges( p, 0, current_item.type->get_id(), meat_absorbed ); + here.use_charges( p, 0, current_item.type->get_id(), meat_absorbed ); } else { //Only absorb one meaty item int meat_absorbed = 1; const int hp_to_heal = meat_absorbed * ml_per_charge * meat_absorption_factor; z->heal( hp_to_heal, true ); - g->m.use_amount( p, 0, current_item.type->get_id(), meat_absorbed ); + here.use_amount( p, 0, current_item.type->get_id(), meat_absorbed ); } - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The %1$s absorbs the %2$s, growing larger." ), z->name(), current_item.tname() ); add_msg( m_debug, "The %1$s now has %2$s out of %3$s hp", z->name(), z->get_hp(), @@ -4333,7 +4385,7 @@ bool mattack::lunge( monster *z ) return false; } - bool seen = g->u.sees( *z ); + bool seen = get_player_character().sees( *z ); if( dist > 1 ) { if( one_in( 5 ) ) { // Out of range @@ -4372,7 +4424,7 @@ bool mattack::lunge( monster *z ) int dam = rng( 3, 7 ); dam = target->deal_damage( z, hit, damage_instance( DT_BASH, dam ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_warning; + auto msg_type = target->is_avatar() ? m_bad : m_warning; target->add_msg_player_or_npc( msg_type, _( "The %1$s lunges at your %2$s, battering it for %3$d damage!" ), _( "The %1$s lunges at 's %2$s, battering it for %3$d damage!" ), @@ -4405,16 +4457,17 @@ bool mattack::longswipe( monster *z ) if( rl_dist( z->pos(), target->pos() ) > 3 || !z->sees( *target ) ) { return false; } + map &here = get_map(); //Is there something impassable blocking the claw? - for( const auto &pnt : g->m.find_clear_path( z->pos(), target->pos() ) ) { - if( g->m.impassable( pnt ) ) { + for( const auto &pnt : here.find_clear_path( z->pos(), target->pos() ) ) { + if( here.impassable( pnt ) ) { //If we're here, it's an nonadjacent attack, which is only attempted 1/5 of the time. if( !one_in( 5 ) ) { return false; } target->add_msg_player_or_npc( _( "The %1$s thrusts a claw at you, but it bounces off the %2$s!" ), _( "The %1$s thrusts a claw at , but it bounces off the %2$s!" ), - z->name(), g->m.obstacle_name( pnt ) ); + z->name(), here.obstacle_name( pnt ) ); z->mod_moves( -150 ); return true; } @@ -4440,7 +4493,7 @@ bool mattack::longswipe( monster *z ) int dam = rng( 3, 7 ); dam = target->deal_damage( z, hit, damage_instance( DT_CUT, dam ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_warning; + auto msg_type = target->is_avatar() ? m_bad : m_warning; target->add_msg_player_or_npc( msg_type, //~ 1$s is bodypart name, 2$d is damage value. _( "The %1$s thrusts a claw at your %2$s, slashing it for %3$d damage!" ), @@ -4477,15 +4530,15 @@ bool mattack::longswipe( monster *z ) dam = target->deal_damage( z, bodypart_id( "head" ), damage_instance( DT_CUT, dam ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_warning; + auto msg_type = target->is_avatar() ? m_bad : m_warning; target->add_msg_player_or_npc( msg_type, _( "The %1$s slashes at your neck, cutting your throat for %2$d damage!" ), _( "The %1$s slashes at 's neck, cutting their throat for %2$d damage!" ), z->name(), dam ); if( target->is_player() || target->is_npc() ) { - target->as_character()->make_bleed( bodypart_id( "head" ), 10_minutes ); + target->as_character()->make_bleed( bodypart_id( "head" ), 15_minutes ); } else { - target->add_effect( effect_bleed, 10_minutes, bp_head ); + target->add_effect( effect_bleed, 15_minutes, bp_head ); } } else { @@ -4545,19 +4598,20 @@ bool mattack::darkman( monster *z ) // TODO: handle friendly monsters return false; } - if( rl_dist( z->pos(), g->u.pos() ) > 40 ) { + Character &player_character = get_player_character(); + if( rl_dist( z->pos(), player_character.pos() ) > 40 ) { return false; } if( monster *const shadow = g->place_critter_around( mon_shadow, z->pos(), 1 ) ) { z->moves -= 10; shadow->make_ally( *z ); - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "A shadow splits from the %s!" ), z->name() ); } } // Wont do the combat stuff unless it can see you - if( !z->sees( g->u ) ) { + if( !z->sees( player_character ) ) { return true; } // What do we say? @@ -4584,56 +4638,59 @@ bool mattack::darkman( monster *z ) add_msg( _( "\"Please dont\"" ) ); break; } - g->u.add_effect( effect_darkness, 1_turns, num_bp, true ); + player_character.add_effect( effect_darkness, 1_turns, num_bp, true ); return true; } bool mattack::slimespring( monster *z ) { - if( rl_dist( z->pos(), g->u.pos() ) > 30 ) { + Character &player_character = get_player_character(); + if( rl_dist( z->pos(), player_character.pos() ) > 30 ) { return false; } // This morale buff effect could get spammy - if( g->u.get_morale_level() <= 1 ) { + if( player_character.get_morale_level() <= 1 ) { switch( rng( 1, 3 ) ) { case 1: //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"hey, it's gonna be all right!\"" ) ); - g->u.add_morale( MORALE_SUPPORT, 10, 50 ); + player_character.add_morale( MORALE_SUPPORT, 10, 50 ); break; case 2: //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"we'll get through this!\"" ) ); - g->u.add_morale( MORALE_SUPPORT, 10, 50 ); + player_character.add_morale( MORALE_SUPPORT, 10, 50 ); break; case 3: //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"i'm here for you!\"" ) ); - g->u.add_morale( MORALE_SUPPORT, 10, 50 ); + player_character.add_morale( MORALE_SUPPORT, 10, 50 ); break; } } - if( rl_dist( z->pos(), g->u.pos() ) <= 3 && z->sees( g->u ) ) { - if( ( g->u.has_effect( effect_bleed ) ) || ( g->u.has_effect( effect_bite ) ) ) { + if( rl_dist( z->pos(), player_character.pos() ) <= 3 && z->sees( player_character ) ) { + if( ( player_character.has_effect( effect_bleed ) ) || + ( player_character.has_effect( effect_bite ) ) ) { //~ Lowercase is intended: they're small voices. add_msg( _( "\"let me help!\"" ) ); // Yes, your slimespring(s) handle/don't all Bad Damage at the same time. - if( g->u.has_effect( effect_bite ) ) { + if( player_character.has_effect( effect_bite ) ) { if( one_in( 3 ) ) { - g->u.remove_effect( effect_bite ); + player_character.remove_effect( effect_bite ); add_msg( m_good, _( "The slime cleans you out!" ) ); } else { add_msg( _( "The slime flows over you, but your gouges still ache." ) ); } } - if( g->u.has_effect( effect_bleed ) ) { + if( player_character.has_effect( effect_bleed ) ) { if( one_in( 2 ) ) { - g->u.remove_effect( effect_bleed ); + effect &e = player_character.get_effect( effect_bleed ); + e.mod_duration( -e.get_int_dur_factor() * rng( 1, 5 ) ); add_msg( m_good, _( "The slime seals up your leaks!" ) ); } else { add_msg( _( "The slime flows over you, but your fluids are still leaking." ) ); @@ -4707,11 +4764,12 @@ bool mattack::riotbot( monster *z ) player *foe = dynamic_cast( target ); + map &here = get_map(); if( calendar::once_every( 1_minutes ) ) { - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 4 ) ) { - if( g->m.passable( dest ) && - g->m.clear_path( z->pos(), dest, 3, 1, 100 ) ) { - g->m.add_field( dest, fd_relax_gas, rng( 1, 3 ) ); + for( const tripoint &dest : here.points_in_radius( z->pos(), 4 ) ) { + if( here.passable( dest ) && + here.clear_path( z->pos(), dest, 3, 1, 100 ) ) { + here.add_field( dest, fd_relax_gas, rng( 1, 3 ) ); } } } @@ -4739,7 +4797,7 @@ bool mattack::riotbot( monster *z ) const int dist = rl_dist( z->pos(), target->pos() ); //we need empty hands to arrest - if( foe == &g->u && !foe->is_armed() ) { + if( foe && foe->is_avatar() && !foe->is_armed() ) { sounds::sound( z->pos(), 15, sounds::sound_t::electronic_speech, _( "Please stay in place, citizen, do not make any movements!" ), false, "speech", @@ -4845,10 +4903,10 @@ bool mattack::riotbot( monster *z ) add_msg( m_bad, _( "The robot sprays tear gas!" ) ); z->moves -= 200; - for( const tripoint &dest : g->m.points_in_radius( z->pos(), 2 ) ) { - if( g->m.passable( dest ) && - g->m.clear_path( z->pos(), dest, 3, 1, 100 ) ) { - g->m.add_field( dest, fd_tear_gas, rng( 1, 3 ) ); + for( const tripoint &dest : here.points_in_radius( z->pos(), 2 ) ) { + if( here.passable( dest ) && + here.clear_path( z->pos(), dest, 3, 1, 100 ) ) { + here.add_field( dest, fd_tear_gas, rng( 1, 3 ) ); } } @@ -4883,10 +4941,10 @@ bool mattack::riotbot( monster *z ) std::vector traj = line_to( z->pos(), dest, 0, 0 ); for( auto &elem : traj ) { - if( !g->m.is_transparent( elem ) ) { + if( !here.is_transparent( elem ) ) { break; } - g->m.add_field( elem, fd_dazzling, 1 ); + here.add_field( elem, fd_dazzling, 1 ); } return true; @@ -4910,7 +4968,7 @@ bool mattack::evolve_kill_strike( monster *z ) z->moves -= 100; const bool uncanny = target->uncanny_dodge(); if( uncanny || dodge_check( z, target ) ) { - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s lunges at you, but you dodge!" ), _( "The %s lunges at , but they dodge!" ), z->name() ); @@ -4930,7 +4988,7 @@ bool mattack::evolve_kill_strike( monster *z ) 15 ), 1.0, 0.5 ) ); int damage_dealt = target->deal_damage( z, bodypart_id( "torso" ), damage ).total_damage(); if( damage_dealt > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_warning; + auto msg_type = target->is_avatar() ? m_bad : m_warning; target->add_msg_player_or_npc( msg_type, _( "The %1$s impales yor chest for %2$d damage!" ), _( "The %1$s impales 's chest for %2$d damage!" ), @@ -4942,15 +5000,16 @@ bool mattack::evolve_kill_strike( monster *z ) z->name() ); return true; } + Character &player_character = get_player_character(); if( target->is_dead_state() && g->is_empty( target_pos ) && target->made_of_any( Creature::cmat_flesh ) ) { const std::string old_name = z->name(); - const bool could_see_z = g->u.sees( *z ); + const bool could_see_z = player_character.sees( *z ); z->allow_upgrade(); z->try_upgrade( false ); z->setpos( target_pos ); const std::string upgrade_name = z->name(); - const bool can_see_z_upgrade = g->u.sees( *z ); + const bool can_see_z_upgrade = player_character.sees( *z ); if( could_see_z && can_see_z_upgrade ) { add_msg( m_warning, _( "The %1$s burrows within %2$s corpse and a %3$s emerges from the remains!" ), old_name, @@ -4966,7 +5025,7 @@ bool mattack::evolve_kill_strike( monster *z ) bool mattack::leech_spawner( monster *z ) { - const bool u_see = g->u.sees( *z ); + const bool u_see = get_player_character().sees( *z ); std::list allies; for( monster &candidate : g->all_monsters() ) { if( candidate.in_species( species_LEECH_PLANT ) && !candidate.has_flag( MF_IMMOBILE ) ) { @@ -4998,7 +5057,7 @@ bool mattack::leech_spawner( monster *z ) bool mattack::mon_leech_evolution( monster *z ) { - const bool u_see = g->u.sees( *z ); + const bool u_see = get_player_character().sees( *z ); const bool is_queen = z->has_flag( MF_QUEEN ); std::list queens; for( monster &candidate : g->all_monsters() ) { @@ -5026,29 +5085,31 @@ bool mattack::tindalos_teleport( monster *z ) if( target == nullptr ) { return false; } + Character &player_character = get_player_character(); if( one_in( 7 ) ) { if( monster *const afterimage = g->place_critter_around( mon_hound_tindalos_afterimage, z->pos(), 1 ) ) { z->moves -= 140; afterimage->make_ally( *z ); - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( m_warning, _( "The hound's movements chaotically rewind as a living afterimage splits from it!" ) ); } } } const int distance_to_target = rl_dist( z->pos(), target->pos() ); + map &here = get_map(); if( distance_to_target > 5 ) { const tripoint oldpos = z->pos(); - for( const tripoint &dest : g->m.points_in_radius( target->pos(), 4 ) ) { - if( g->m.is_cornerfloor( dest ) ) { + for( const tripoint &dest : here.points_in_radius( target->pos(), 4 ) ) { + if( here.is_cornerfloor( dest ) ) { if( g->is_empty( dest ) ) { z->setpos( dest ); // Not teleporting if it means losing sight of our current target if( z->sees( *target ) ) { - g->m.add_field( oldpos, fd_tindalos_rift, 2 ); - g->m.add_field( dest, fd_tindalos_rift, 2 ); - if( g->u.sees( *z ) ) { + here.add_field( oldpos, fd_tindalos_rift, 2 ); + here.add_field( dest, fd_tindalos_rift, 2 ); + if( player_character.sees( *z ) ) { add_msg( m_bad, _( "The %s dissipates and reforms close by." ), z->name() ); } return true; @@ -5088,8 +5149,8 @@ bool mattack::flesh_tendril( monster *z ) if( monster *const summoned = g->place_critter_around( spawned, z->pos(), 1 ) ) { z->moves -= 100; summoned->make_ally( *z ); - g->m.propagate_field( z->pos(), fd_gibs_flesh, 75, 1 ); - if( g->u.sees( *z ) ) { + get_map().propagate_field( z->pos(), fd_gibs_flesh, 75, 1 ); + if( get_player_character().sees( *z ) ) { add_msg( m_warning, _( "A %s struggles to pull itself free from the %s!" ), summoned->name(), z->name() ); } @@ -5177,7 +5238,7 @@ bool mattack::bio_op_takedown( monster *z ) return false; } - bool seen = g->u.sees( *z ); + bool seen = get_player_character().sees( *z ); player *foe = dynamic_cast< player * >( target ); if( seen ) { add_msg( _( "The %1$s mechanically grabs at %2$s!" ), z->name(), @@ -5271,7 +5332,7 @@ bool mattack::bio_op_impale( monster *z ) return false; } - const bool seen = g->u.sees( *z ); + const bool seen = get_player_character().sees( *z ); player *foe = dynamic_cast< player * >( target ); if( seen ) { add_msg( _( "The %1$s mechanically lunges at %2$s!" ), z->name(), @@ -5305,7 +5366,7 @@ bool mattack::bio_op_impale( monster *z ) // Handle mons earlier - less to check for target->deal_damage( z, bodypart_id( "torso" ), damage_instance( DT_STAB, dam ) ); if( do_bleed ) { - target->add_effect( effect_bleed, rng( 75_turns, 125_turns ), bp_torso, true ); + target->add_effect( effect_bleed, rng( 3_minutes, 10_minutes ), bp_torso, true ); } if( seen ) { add_msg( _( "The %1$s impales %2$s!" ), z->name(), target->disp_name() ); @@ -5352,7 +5413,7 @@ bool mattack::bio_op_disarm( monster *z ) return false; } - const bool seen = g->u.sees( *z ); + const bool seen = get_player_character().sees( *z ); player *foe = dynamic_cast< player * >( target ); // disarm doesn't work on creatures or unarmed targets @@ -5397,7 +5458,7 @@ bool mattack::bio_op_disarm( monster *z ) if( my_roll >= their_roll && !it.has_flag( "NO_UNWIELD" ) ) { target->add_msg_if_player( m_bad, _( "and throws it to the ground!" ) ); const tripoint tp = foe->pos() + tripoint( rng( -1, 1 ), rng( -1, 1 ), 0 ); - g->m.add_item_or_charges( tp, foe->i_rem( &it ) ); + get_map().add_item_or_charges( tp, foe->i_rem( &it ) ); } else { target->add_msg_if_player( m_good, _( "but you break its grip!" ) ); } @@ -5546,7 +5607,7 @@ bool mattack::kamikaze( monster *z ) */ // END HORRIBLE HACK - if( g->u.sees( z->pos() ) ) { + if( get_player_character().sees( z->pos() ) ) { add_msg( m_bad, _( "The %s lights up menacingly." ), z->name() ); } @@ -5601,7 +5662,7 @@ static int grenade_helper( monster *const z, Creature *const target, const int d z->ammo[att]--; // if the player can see it - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { if( data[att].message.empty() ) { add_msg( m_debug, "Invalid ammo message in grenadier special." ); } else { @@ -5652,7 +5713,7 @@ bool mattack::grenadier( monster *const z ) // Only can actively target the player right now. Once we have the ability to grab targets that we aren't // actively attacking change this to use that instead. - Creature *const target = static_cast( &g->u ); + Creature *const target = static_cast( &get_player_character() ); if( z->attitude_to( *target ) == Creature::Attitude::FRIENDLY ) { return false; } @@ -5685,7 +5746,7 @@ bool mattack::grenadier_elite( monster *const z ) // Only can actively target the player right now. Once we have the ability to grab targets that we aren't // actively attacking change this to use that instead. - Creature *const target = static_cast( &g->u ); + Creature *const target = static_cast( &get_player_character() ); if( z->attitude_to( *target ) == Creature::Attitude::FRIENDLY ) { return false; } @@ -5716,21 +5777,22 @@ bool mattack::stretch_attack( monster *z ) int dam = rng( 5, 10 ); z->moves -= 100; - for( auto &pnt : g->m.find_clear_path( z->pos(), target->pos() ) ) { - if( g->m.impassable( pnt ) ) { + map &here = get_map(); + for( auto &pnt : here.find_clear_path( z->pos(), target->pos() ) ) { + if( here.impassable( pnt ) ) { target->add_msg_player_or_npc( _( "The %1$s thrusts its arm at you, but bounces off the %2$s." ), _( "The %1$s thrusts its arm at , but bounces off the %2$s." ), - z->name(), g->m.obstacle_name( pnt ) ); + z->name(), here.obstacle_name( pnt ) ); return true; } } - auto msg_type = target == &g->u ? m_warning : m_info; + auto msg_type = target->is_avatar() ? m_warning : m_info; target->add_msg_player_or_npc( msg_type, _( "The %s thrusts its arm at you, stretching to reach you from afar." ), _( "The %s thrusts its arm at ." ), z->name() ); - if( dodge_check( z, target ) || g->u.uncanny_dodge() ) { + if( dodge_check( z, target ) || get_player_character().uncanny_dodge() ) { target->add_msg_player_or_npc( msg_type, _( "You evade the stretched arm and it sails past you!" ), _( " evades the stretched arm!" ) ); target->on_dodge( z, z->type->melee_skill * 2 ); @@ -5743,7 +5805,7 @@ bool mattack::stretch_attack( monster *z ) dam = target->deal_damage( z, hit, damage_instance( DT_STAB, dam ) ).total_damage(); if( dam > 0 ) { - auto msg_type = target == &g->u ? m_bad : m_info; + auto msg_type = target->is_avatar() ? m_bad : m_info; target->add_msg_player_or_npc( msg_type, //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s's arm pierces your %2$s!" ), @@ -5768,7 +5830,7 @@ bool mattack::stretch_attack( monster *z ) bool mattack::zombie_fuse( monster *z ) { monster *critter = nullptr; - for( const tripoint &p : g->m.points_in_radius( z->pos(), 1 ) ) { + for( const tripoint &p : get_map().points_in_radius( z->pos(), 1 ) ) { critter = g->critter_at( p ); if( critter != nullptr && critter->faction == z->faction && critter != z && critter->get_size() <= z->get_size() ) { @@ -5781,7 +5843,7 @@ bool mattack::zombie_fuse( monster *z ) effect_grown_of_fuse ).get_max_intensity() ) ) ) { return false; } - if( g->u.sees( *z ) ) { + if( get_player_character().sees( *z ) ) { add_msg( _( "The %1$s fuses with the %2$s." ), critter->name(), z->name() ); @@ -5798,17 +5860,18 @@ bool mattack::zombie_fuse( monster *z ) bool mattack::doot( monster *z ) { z->moves -= 300; - if( g->u.sees( *z ) ) { + Character &player_character = get_player_character(); + if( player_character.sees( *z ) ) { add_msg( _( "The %s doots its trumpet!" ), z->name() ); } int spooks = 0; - for( const tripoint &spookyscary : g->m.points_in_radius( z->pos(), 2 ) ) { + for( const tripoint &spookyscary : get_map().points_in_radius( z->pos(), 2 ) ) { if( !g->is_empty( spookyscary ) ) { continue; } const int dist = rl_dist( z->pos(), spookyscary ); if( ( one_in( dist + 3 ) || spooks == 0 ) && spooks < 5 ) { - if( g->u.sees( *z ) ) { + if( player_character.sees( *z ) ) { add_msg( _( "A spooky skeleton rises from the ground!" ) ); } g->place_critter_at( mon_zombie_skeltal_minion, spookyscary ); diff --git a/src/mondeath.cpp b/src/mondeath.cpp index a045c5b8bfbb5..a5b1e24074df3 100644 --- a/src/mondeath.cpp +++ b/src/mondeath.cpp @@ -12,9 +12,9 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" +#include "character.h" #include "colony.h" #include "creature.h" #include "enums.h" @@ -38,7 +38,6 @@ #include "monster.h" #include "morale_types.h" #include "mtype.h" -#include "player.h" #include "pldata.h" #include "point.h" #include "rng.h" @@ -94,7 +93,7 @@ void mdeath::normal( monster &z ) sfx::play_variant_sound( "mon_death", "zombie_death", sfx::get_heard_volume( z.pos() ) ); } - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { //Currently it is possible to get multiple messages that a monster died. add_msg( m_good, _( "The %s dies!" ), z.name() ); } @@ -130,6 +129,7 @@ static void scatter_chunks( const itype_id &chunk_name, int chunk_amt, monster & pile_size = std::min( chunk_amt, pile_size ); distance = std::abs( distance ); const item chunk( chunk_name, calendar::turn, pile_size ); + map &here = get_map(); for( int i = 0; i < chunk_amt; i += pile_size ) { bool drop_chunks = true; tripoint tarp( z.pos() + point( rng( -distance, distance ), rng( -distance, distance ) ) ); @@ -138,13 +138,13 @@ static void scatter_chunks( const itype_id &chunk_name, int chunk_amt, monster & for( size_t j = 0; j < traj.size(); j++ ) { tarp = traj[j]; if( one_in( 2 ) && z.bloodType().id() ) { - g->m.add_splatter( z.bloodType(), tarp ); + here.add_splatter( z.bloodType(), tarp ); } else { - g->m.add_splatter( z.gibType(), tarp, rng( 1, j + 1 ) ); + here.add_splatter( z.gibType(), tarp, rng( 1, j + 1 ) ); } - if( g->m.impassable( tarp ) ) { - g->m.bash( tarp, distance ); - if( g->m.impassable( tarp ) ) { + if( here.impassable( tarp ) ) { + here.bash( tarp, distance ); + if( here.impassable( tarp ) ) { // Target is obstacle, not destroyed by bashing, // stop trajectory in front of it, if this is the first // point (e.g. wall adjacent to monster), don't drop anything on it @@ -158,7 +158,7 @@ static void scatter_chunks( const itype_id &chunk_name, int chunk_amt, monster & } } if( drop_chunks ) { - g->m.add_item_or_charges( tarp, chunk ); + here.add_item_or_charges( tarp, chunk ); } } } @@ -181,8 +181,9 @@ void mdeath::splatter( monster &z ) const field_type_id type_blood = z.bloodType(); const field_type_id type_gib = z.gibType(); + map &here = get_map(); if( gibbable ) { - const auto area = g->m.points_in_radius( z.pos(), 1 ); + const auto area = here.points_in_radius( z.pos(), 1 ); int number_of_gibs = std::min( std::floor( corpse_damage ) - 1, 1 + max_hp / 5.0f ); if( pulverized && z.type->size >= creature_size::medium ) { @@ -191,8 +192,8 @@ void mdeath::splatter( monster &z ) } for( int i = 0; i < number_of_gibs; ++i ) { - g->m.add_splatter( type_gib, random_entry( area ), rng( 1, i + 1 ) ); - g->m.add_splatter( type_blood, random_entry( area ) ); + here.add_splatter( type_gib, random_entry( area ), rng( 1, i + 1 ) ); + here.add_splatter( type_blood, random_entry( area ) ); } } // 1% of the weight of the monster is the base, with overflow damage as a multiplier @@ -231,13 +232,13 @@ void mdeath::splatter( monster &z ) if( z.has_effect( effect_no_ammo ) ) { corpse.set_var( "no_ammo", "no_ammo" ); } - g->m.add_item_or_charges( z.pos(), corpse ); + here.add_item_or_charges( z.pos(), corpse ); } } void mdeath::acid( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { if( z.type->dies.size() == 1 ) { //If this death function is the only function. The corpse gets dissolved. add_msg( m_mixed, _( "The %s's body dissolves into acid." ), z.name() ); @@ -245,35 +246,38 @@ void mdeath::acid( monster &z ) add_msg( m_warning, _( "The %s's body leaks acid." ), z.name() ); } } - g->m.add_field( z.pos(), fd_acid, 3 ); + get_map().add_field( z.pos(), fd_acid, 3 ); } void mdeath::boomer( monster &z ) { + map &here = get_map(); std::string explode = string_format( _( "a %s explode!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); - for( const tripoint &dest : g->m.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* - g->m.bash( dest, 10 ); + for( const tripoint &dest : here.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* + here.bash( dest, 10 ); if( monster *const target = g->critter_at( dest ) ) { target->stumble(); target->moves -= 250; } } - if( rl_dist( z.pos(), g->u.pos() ) == 1 ) { - g->u.add_env_effect( effect_boomered, bp_eyes, 2, 24_turns ); + Character &player_character = get_player_character(); + if( rl_dist( z.pos(), player_character.pos() ) == 1 ) { + player_character.add_env_effect( effect_boomered, bp_eyes, 2, 24_turns ); } - g->m.propagate_field( z.pos(), fd_bile, 15, 1 ); + here.propagate_field( z.pos(), fd_bile, 15, 1 ); } void mdeath::boomer_glow( monster &z ) { std::string explode = string_format( _( "a %s explode!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); + map &here = get_map(); - for( const tripoint &dest : g->m.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* - g->m.bash( dest, 10 ); + for( const tripoint &dest : here.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* + here.bash( dest, 10 ); if( monster *const target = g->critter_at( dest ) ) { target->stumble(); target->moves -= 250; @@ -290,7 +294,7 @@ void mdeath::boomer_glow( monster &z ) } } - g->m.propagate_field( z.pos(), fd_bile, 30, 2 ); + here.propagate_field( z.pos(), fd_bile, 30, 2 ); } void mdeath::kill_vines( monster &z ) @@ -320,8 +324,9 @@ void mdeath::kill_vines( monster &z ) void mdeath::vine_cut( monster &z ) { + map &here = get_map(); std::vector vines; - for( const tripoint &tmp : g->m.points_in_radius( z.pos(), 1 ) ) { + for( const tripoint &tmp : here.points_in_radius( z.pos(), 1 ) ) { if( tmp == z.pos() ) { continue; // Skip ourselves } @@ -334,7 +339,7 @@ void mdeath::vine_cut( monster &z ) for( auto &vine : vines ) { bool found_neighbor = false; - for( const tripoint &dest : g->m.points_in_radius( vine->pos(), 1 ) ) { + for( const tripoint &dest : here.points_in_radius( vine->pos(), 1 ) ) { if( dest != z.pos() ) { // Not the dying vine if( monster *const v = g->critter_at( dest ) ) { @@ -353,7 +358,7 @@ void mdeath::vine_cut( monster &z ) void mdeath::triffid_heart( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_warning, _( "The surrounding roots begin to crack and crumble." ) ); } g->timed_events.add( timed_event_type::ROOTS_DIE, calendar::turn + 10_minutes ); @@ -364,9 +369,10 @@ void mdeath::fungus( monster &z ) //~ the sound of a fungus dying sounds::sound( z.pos(), 10, sounds::sound_t::combat, _( "Pouf!" ), false, "misc", "puff" ); - fungal_effects fe( *g, g->m ); - for( const tripoint &sporep : g->m.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* - if( g->m.impassable( sporep ) ) { + map &here = get_map(); + fungal_effects fe( *g, here ); + for( const tripoint &sporep : here.points_in_radius( z.pos(), 1 ) ) { // *NOPAD* + if( here.impassable( sporep ) ) { continue; } // z is dead, don't credit it with the kill @@ -377,14 +383,14 @@ void mdeath::fungus( monster &z ) void mdeath::disintegrate( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_good, _( "The %s disintegrates!" ), z.name() ); } } void mdeath::worm( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { if( z.type->dies.size() == 1 ) { add_msg( m_good, _( "The %s splits in two!" ), z.name() ); } else { @@ -400,7 +406,7 @@ void mdeath::worm( monster &z ) void mdeath::disappear( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_good, _( "The %s disappears." ), z.name() ); } } @@ -419,11 +425,12 @@ void mdeath::guilt( monster &z ) guilt_tresholds[50] = _( "You regret killing %s." ); guilt_tresholds[25] = _( "You feel remorse for killing %s." ); - if( g->u.has_trait( trait_PSYCHOPATH ) || g->u.has_trait_flag( "PRED3" ) || - g->u.has_trait_flag( "PRED4" ) || g->u.has_trait( trait_KILLER ) ) { + Character &player_character = get_player_character(); + if( player_character.has_trait( trait_PSYCHOPATH ) || player_character.has_trait_flag( "PRED3" ) || + player_character.has_trait_flag( "PRED4" ) || player_character.has_trait( trait_KILLER ) ) { return; } - if( rl_dist( z.pos(), g->u.pos() ) > MAX_GUILT_DISTANCE ) { + if( rl_dist( z.pos(), player_character.pos() ) > MAX_GUILT_DISTANCE ) { // Too far away, we can deal with it. return; } @@ -439,7 +446,8 @@ void mdeath::guilt( monster &z ) "about their deaths anymore." ), z.name( maxKills ) ); } return; - } else if( ( g->u.has_trait_flag( "PRED1" ) ) || ( g->u.has_trait_flag( "PRED2" ) ) ) { + } else if( ( player_character.has_trait_flag( "PRED1" ) ) || + ( player_character.has_trait_flag( "PRED2" ) ) ) { msg = ( _( "Culling the weak is distasteful, but necessary." ) ); msgtype = m_neutral; } else { @@ -459,30 +467,31 @@ void mdeath::guilt( monster &z ) time_duration decayDelay = 3_minutes * ( 1.0 - ( static_cast( kill_count ) / maxKills ) ); if( z.type->in_species( species_ZOMBIE ) ) { moraleMalus /= 10; - if( g->u.has_trait( trait_PACIFIST ) ) { + if( player_character.has_trait( trait_PACIFIST ) ) { moraleMalus *= 5; - } else if( g->u.has_trait_flag( "PRED1" ) ) { + } else if( player_character.has_trait_flag( "PRED1" ) ) { moraleMalus /= 4; - } else if( g->u.has_trait_flag( "PRED2" ) ) { + } else if( player_character.has_trait_flag( "PRED2" ) ) { moraleMalus /= 5; } } - g->u.add_morale( MORALE_KILLED_MONSTER, moraleMalus, maxMalus, duration, decayDelay ); + player_character.add_morale( MORALE_KILLED_MONSTER, moraleMalus, maxMalus, duration, decayDelay ); } void mdeath::blobsplit( monster &z ) { int speed = z.get_speed() - rng( 30, 50 ); - g->m.spawn_item( z.pos(), "slime_scrap", 1, 0, calendar::turn ); + get_map().spawn_item( z.pos(), "slime_scrap", 1, 0, calendar::turn ); + Character &player_character = get_player_character(); if( z.get_speed() <= 0 ) { - if( g->u.sees( z ) ) { + if( player_character.sees( z ) ) { // TODO: Add vermin-tagged tiny versions of the splattered blob :) add_msg( m_good, _( "The %s splatters apart." ), z.name() ); } return; } - if( g->u.sees( z ) ) { + if( player_character.sees( z ) ) { if( z.type->dies.size() == 1 ) { add_msg( m_good, _( "The %s splits in two!" ), z.name() ); } else { @@ -512,20 +521,22 @@ void mdeath::brainblob( monster &z ) void mdeath::jackson( monster &z ) { + bool music_stopped = false; for( monster &critter : g->all_monsters() ) { if( critter.type->id == mon_zombie_dancer ) { critter.poly( mon_zombie_hulk ); critter.remove_effect( effect_controlled ); } - if( g->u.sees( z ) ) { - add_msg( m_warning, _( "The music stops!" ) ); - } + music_stopped = true; + } + if( music_stopped && get_player_character().sees( z ) ) { + add_msg( m_warning, _( "The music stops!" ) ); } } void mdeath::melt( monster &z ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_good, _( "The %s melts away." ), z.name() ); } } @@ -543,12 +554,13 @@ void mdeath::amigara( monster &z ) } // We were the last! - if( g->u.has_effect( effect_amigara ) ) { - g->u.remove_effect( effect_amigara ); + Character &player_character = get_player_character(); + if( player_character.has_effect( effect_amigara ) ) { + player_character.remove_effect( effect_amigara ); add_msg( _( "Your obsession with the fault fades away…" ) ); } - g->m.spawn_artifact( z.pos() ); + get_map().spawn_artifact( z.pos(), relic_procgen_id( "netherum_tunnels" ) ); } void mdeath::thing( monster &z ) @@ -581,7 +593,8 @@ void mdeath::explode( monster &z ) void mdeath::focused_beam( monster &z ) { - map_stack items = g->m.i_at( z.pos() ); + map &here = get_map(); + map_stack items = here.i_at( z.pos() ); for( map_stack::iterator it = items.begin(); it != items.end(); ) { if( it->typeId() == itype_processor ) { it = items.erase( it ); @@ -592,7 +605,7 @@ void mdeath::focused_beam( monster &z ) if( !z.inv.empty() ) { - if( g->u.sees( z ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_warning, _( "As the final light is destroyed, it erupts in a blinding flare!" ) ); } @@ -604,10 +617,10 @@ void mdeath::focused_beam( monster &z ) std::vector traj = line_to( z.pos(), p, 0, 0 ); for( auto &elem : traj ) { - if( !g->m.is_transparent( elem ) ) { + if( !here.is_transparent( elem ) ) { break; } - g->m.add_field( elem, fd_dazzling, 2 ); + here.add_field( elem, fd_dazzling, 2 ); } } @@ -634,7 +647,8 @@ void mdeath::broken( monster &z ) const float corpse_damage = 2.5 * overflow_damage / max_hp; broken_mon.set_damage( static_cast( std::floor( corpse_damage * itype::damage_scale ) ) ); - g->m.add_item_or_charges( z.pos(), broken_mon ); + map &here = get_map(); + here.add_item_or_charges( z.pos(), broken_mon ); if( z.type->has_flag( MF_DROPS_AMMO ) ) { for( const std::pair &ammo_entry : z.ammo ) { @@ -661,14 +675,14 @@ void mdeath::broken( monster &z ) mags.insert( mags.end(), mag ); ammo_count -= mag.type->magazine->capacity; } - g->m.spawn_items( z.pos(), mags ); + here.spawn_items( z.pos(), mags ); spawned = true; break; } } } if( !spawned ) { - g->m.spawn_item( z.pos(), ammo_entry.first, ammo_entry.second, 1, + here.spawn_item( z.pos(), ammo_entry.first, ammo_entry.second, 1, calendar::turn ); } } @@ -676,17 +690,19 @@ void mdeath::broken( monster &z ) } // TODO: make mdeath::splatter work for robots - if( ( broken_mon.damage() >= broken_mon.max_damage() ) && g->u.sees( z.pos() ) ) { + Character &player_character = get_player_character(); + if( ( broken_mon.damage() >= broken_mon.max_damage() ) && player_character.sees( z.pos() ) ) { add_msg( m_good, _( "The %s is destroyed!" ), z.name() ); - } else if( g->u.sees( z.pos() ) ) { + } else if( player_character.sees( z.pos() ) ) { add_msg( m_good, _( "The %s collapses!" ), z.name() ); } } void mdeath::ratking( monster &z ) { - g->u.remove_effect( effect_rat ); - if( g->u.sees( z ) ) { + Character &player_character = get_player_character(); + player_character.remove_effect( effect_rat ); + if( player_character.sees( z ) ) { add_msg( m_warning, _( "Rats suddenly swarm into view." ) ); } @@ -697,8 +713,9 @@ void mdeath::ratking( monster &z ) void mdeath::darkman( monster &z ) { - g->u.remove_effect( effect_darkness ); - if( g->u.sees( z ) ) { + Character &player_character = get_player_character(); + player_character.remove_effect( effect_darkness ); + if( player_character.sees( z ) ) { add_msg( m_good, _( "The %s melts away." ), z.name() ); } } @@ -707,21 +724,22 @@ void mdeath::gas( monster &z ) { std::string explode = string_format( _( "a %s explode!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); - g->m.emit_field( z.pos(), emit_id( "emit_toxic_blast" ) ); + get_map().emit_field( z.pos(), emit_id( "emit_toxic_blast" ) ); } void mdeath::smokeburst( monster &z ) { std::string explode = string_format( _( "a %s explode!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); - g->m.emit_field( z.pos(), emit_id( "emit_smoke_blast" ) ); + get_map().emit_field( z.pos(), emit_id( "emit_smoke_blast" ) ); } void mdeath::fungalburst( monster &z ) { + map &here = get_map(); // If the fungus died from anti-fungal poison, don't pouf - if( g->m.get_field_intensity( z.pos(), fd_fungicidal_gas ) ) { - if( g->u.sees( z ) ) { + if( here.get_field_intensity( z.pos(), fd_fungicidal_gas ) ) { + if( get_player_character().sees( z ) ) { add_msg( m_good, _( "The %s inflates and melts away." ), z.name() ); } return; @@ -729,12 +747,12 @@ void mdeath::fungalburst( monster &z ) std::string explode = string_format( _( "a %s explodes!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); - g->m.emit_field( z.pos(), emit_id( "emit_fungal_blast" ) ); + here.emit_field( z.pos(), emit_id( "emit_fungal_blast" ) ); } void mdeath::jabberwock( monster &z ) { - player *ch = dynamic_cast( z.get_killer() ); + Character *ch = dynamic_cast( z.get_killer() ); bool vorpal = ch && ch->is_player() && ch->weapon.has_flag( "DIAMOND" ) && @@ -756,7 +774,7 @@ void mdeath::jabberwock( monster &z ) void mdeath::gameover( monster &z ) { add_msg( m_bad, _( "The %s was destroyed! GAME OVER!" ), z.name() ); - g->u.hp_cur[hp_torso] = 0; + get_player_character().set_part_hp_cur( bodypart_id( "torso" ), 0 ); } void mdeath::kill_breathers( monster &/*z*/ ) @@ -771,7 +789,7 @@ void mdeath::kill_breathers( monster &/*z*/ ) void mdeath::broken_ammo( monster &z ) { - if( g->u.sees( z.pos() ) ) { + if( get_player_character().sees( z.pos() ) ) { //~ %s is the possessive form of the monster's name add_msg( m_info, _( "The %s's interior compartment sizzles with destructive energy." ), z.name() ); @@ -791,15 +809,16 @@ void make_mon_corpse( monster &z, int damageLvl ) if( z.has_effect( effect_no_ammo ) ) { corpse.set_var( "no_ammo", "no_ammo" ); } - g->m.add_item_or_charges( z.pos(), corpse ); + get_map().add_item_or_charges( z.pos(), corpse ); } void mdeath::preg_roach( monster &z ) { + Character &player_character = get_player_character(); int num_roach = rng( 1, 3 ); while( num_roach > 0 && g->place_critter_around( mon_giant_cockroach_nymph, z.pos(), 1 ) ) { num_roach--; - if( g->u.sees( z ) ) { + if( player_character.sees( z ) ) { add_msg( m_warning, _( "A cockroach nymph crawls out of the pregnant giant cockroach corpse." ) ); } } @@ -808,7 +827,7 @@ void mdeath::preg_roach( monster &z ) void mdeath::fireball( monster &z ) { if( one_in( 10 ) ) { - g->m.propagate_field( z.pos(), fd_fire, 15, 3 ); + get_map().propagate_field( z.pos(), fd_fire, 15, 3 ); std::string explode = string_format( _( "an explosion of tank of the %s's flamethrower!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "default" ); @@ -820,8 +839,9 @@ void mdeath::fireball( monster &z ) void mdeath::conflagration( monster &z ) { - for( const auto &dest : g->m.points_in_radius( z.pos(), 1 ) ) { - g->m.propagate_field( dest, fd_fire, 18, 3 ); + map &here = get_map(); + for( const auto &dest : here.points_in_radius( z.pos(), 1 ) ) { + here.propagate_field( dest, fd_fire, 18, 3 ); } const std::string explode = string_format( _( "a %s explode!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); @@ -830,20 +850,21 @@ void mdeath::conflagration( monster &z ) void mdeath::necro_boomer( monster &z ) { + map &here = get_map(); std::string explode = string_format( _( "a %s explodes!" ), z.name() ); sounds::sound( z.pos(), 24, sounds::sound_t::combat, explode, false, "explosion", "small" ); - for( const tripoint &aoe : g->m.points_in_radius( z.pos(), 10 ) ) { - for( item &corpse : g->m.i_at( aoe ) ) { + for( const tripoint &aoe : here.points_in_radius( z.pos(), 10 ) ) { + for( item &corpse : here.i_at( aoe ) ) { if( !corpse.is_corpse() ) { continue; } if( g->revive_corpse( aoe, corpse ) ) { - g->m.i_rem( aoe, &corpse ); + here.i_rem( aoe, &corpse ); break; } } } - for( const tripoint &aoe : g->m.points_in_radius( z.pos(), 10 ) ) { + for( const tripoint &aoe : here.points_in_radius( z.pos(), 10 ) ) { monster *mon = g->critter_at( aoe ); if( mon != nullptr && one_in( 10 ) ) { mon->allow_upgrade(); diff --git a/src/mondefense.cpp b/src/mondefense.cpp index b38dad3d0be35..e8797d9f9a5b0 100644 --- a/src/mondefense.cpp +++ b/src/mondefense.cpp @@ -10,9 +10,9 @@ #include #include -#include "avatar.h" #include "ballistics.h" #include "bodypart.h" +#include "character.h" #include "creature.h" #include "damage.h" #include "dispersion.h" @@ -76,8 +76,9 @@ void mdefense::zapback( monster &m, Creature *const source, return; } - if( get_avatar().sees( source->pos() ) ) { - const auto msg_type = source == &get_avatar() ? m_bad : m_info; + + if( get_player_character().sees( source->pos() ) ) { + const auto msg_type = source->is_avatar() ? m_bad : m_info; add_msg( msg_type, _( "Striking the %1$s shocks %2$s!" ), m.name(), source->disp_name() ); } @@ -125,7 +126,7 @@ void mdefense::acidsplash( monster &m, Creature *const source, } // Don't splatter directly on the `m`, that doesn't work well - std::vector pts = closest_tripoints_first( source->pos(), 1 ); + std::vector pts = closest_points_first( source->pos(), 1 ); pts.erase( std::remove( pts.begin(), pts.end(), m.pos() ), pts.end() ); projectile prj; @@ -139,7 +140,7 @@ void mdefense::acidsplash( monster &m, Creature *const source, projectile_attack( prj, m.pos(), target, dispersion_sources{ 1200 }, &m ); } - if( get_avatar().sees( m.pos() ) ) { + if( get_player_character().sees( m.pos() ) ) { add_msg( m_warning, _( "Acid sprays out of %s as it is hit!" ), m.disp_name() ); } } diff --git a/src/monexamine.cpp b/src/monexamine.cpp index 81ebdd3976f62..698ba83495cce 100644 --- a/src/monexamine.cpp +++ b/src/monexamine.cpp @@ -70,6 +70,7 @@ bool monexamine::pet_menu( monster &z ) attach_bag, remove_bag, drop_all, + push_monster, give_items, mon_armor_add, mon_harness_remove, @@ -98,7 +99,9 @@ bool monexamine::pet_menu( monster &z ) amenu.text = string_format( _( "What to do with your %s?" ), pet_name ); amenu.addentry( swap_pos, true, 's', _( "Swap positions" ) ); + amenu.addentry( push_monster, true, 'p', _( "Push %s" ), pet_name ); amenu.addentry( rename, true, 'e', _( "Rename" ) ); + Character &player_character = get_player_character(); if( z.has_effect( effect_has_bag ) ) { amenu.addentry( give_items, true, 'g', _( "Place items into bag" ) ); amenu.addentry( remove_bag, true, 'b', _( "Remove bag from %s" ), pet_name ); @@ -123,7 +126,7 @@ bool monexamine::pet_menu( monster &z ) if( z.has_effect( effect_tied ) ) { amenu.addentry( rope, true, 't', _( "Untie" ) ); } else if( !z.has_flag( MF_RIDEABLE_MECH ) ) { - std::vector rope_inv = g->u.items_with( []( const item & itm ) { + std::vector rope_inv = player_character.items_with( []( const item & itm ) { return itm.has_flag( "TIE_UP" ); } ); if( !rope_inv.empty() ) { @@ -151,7 +154,7 @@ bool monexamine::pet_menu( monster &z ) available = false; } if( available ) { - if( g->u.has_quality( qual_SHEAR, 1 ) ) { + if( player_character.has_quality( qual_SHEAR, 1 ) ) { amenu.addentry( shear, true, 'S', _( "Shear %s." ), pet_name ); } else { amenu.addentry( shear, false, 'S', _( "You cannot shear this animal without shears." ) ); @@ -159,29 +162,32 @@ bool monexamine::pet_menu( monster &z ) } } if( z.has_flag( MF_PET_MOUNTABLE ) && !z.has_effect( effect_monster_saddled ) && - g->u.has_item_with_flag( "TACK" ) && g->u.get_skill_level( skill_survival ) >= 1 ) { + player_character.has_item_with_flag( "TACK" ) && + player_character.get_skill_level( skill_survival ) >= 1 ) { amenu.addentry( attach_saddle, true, 'h', _( "Tack up %s" ), pet_name ); } else if( z.has_flag( MF_PET_MOUNTABLE ) && z.has_effect( effect_monster_saddled ) ) { amenu.addentry( remove_saddle, true, 'h', _( "Remove tack from %s" ), pet_name ); } else if( z.has_flag( MF_PET_MOUNTABLE ) && !z.has_effect( effect_monster_saddled ) && - g->u.has_item_with_flag( "TACK" ) && g->u.get_skill_level( skill_survival ) < 1 ) { + player_character.has_item_with_flag( "TACK" ) && + player_character.get_skill_level( skill_survival ) < 1 ) { amenu.addentry( remove_saddle, false, 'h', _( "You don't know how to saddle %s" ), pet_name ); } if( z.has_flag( MF_PAY_BOT ) ) { amenu.addentry( pay, true, 'f', _( "Manage your friendship with %s" ), pet_name ); } if( !z.has_flag( MF_RIDEABLE_MECH ) ) { - if( z.has_flag( MF_PET_MOUNTABLE ) && g->u.can_mount( z ) ) { + if( z.has_flag( MF_PET_MOUNTABLE ) && player_character.can_mount( z ) ) { amenu.addentry( mount, true, 'r', _( "Mount %s" ), pet_name ); } else if( !z.has_flag( MF_PET_MOUNTABLE ) ) { amenu.addentry( mount, false, 'r', _( "%s cannot be mounted" ), pet_name ); - } else if( z.get_size() <= g->u.get_size() ) { + } else if( z.get_size() <= player_character.get_size() ) { amenu.addentry( mount, false, 'r', _( "%s is too small to carry your weight" ), pet_name ); - } else if( g->u.get_skill_level( skill_survival ) < 1 ) { + } else if( player_character.get_skill_level( skill_survival ) < 1 ) { amenu.addentry( mount, false, 'r', _( "You have no knowledge of riding at all" ) ); - } else if( g->u.get_weight() >= z.get_weight() * z.get_mountable_weight_ratio() ) { + } else if( player_character.get_weight() >= z.get_weight() * z.get_mountable_weight_ratio() ) { amenu.addentry( mount, false, 'r', _( "You are too heavy to mount %s" ), pet_name ); - } else if( !z.has_effect( effect_monster_saddled ) && g->u.get_skill_level( skill_survival ) < 4 ) { + } else if( !z.has_effect( effect_monster_saddled ) && + player_character.get_skill_level( skill_survival ) < 4 ) { amenu.addentry( mount, false, 'r', _( "You are not skilled enough to ride without a saddle" ) ); } } else { @@ -195,16 +201,16 @@ bool monexamine::pet_menu( monster &z ) } amenu.addentry( check_bat, false, 'c', _( "%s battery level is %d%%" ), z.get_name(), static_cast( charge_percent ) ); - if( g->u.weapon.is_null() && z.battery_item ) { + if( player_character.weapon.is_null() && z.battery_item ) { amenu.addentry( mount, true, 'r', _( "Climb into the mech and take control" ) ); - } else if( !g->u.weapon.is_null() ) { + } else if( !player_character.weapon.is_null() ) { amenu.addentry( mount, false, 'r', _( "You cannot pilot the mech whilst wielding something" ) ); } else if( !z.battery_item ) { amenu.addentry( mount, false, 'r', _( "This mech has a dead battery and won't turn on" ) ); } if( z.battery_item ) { amenu.addentry( remove_bat, true, 'x', _( "Remove the mech's battery pack" ) ); - } else if( g->u.has_amount( z.type->mech_battery, 1 ) ) { + } else if( player_character.has_amount( z.type->mech_battery, 1 ) ) { amenu.addentry( insert_bat, true, 'x', _( "Insert a new battery pack" ) ); } else { amenu.addentry( insert_bat, false, 'x', _( "You need a %s to power this mech" ), type.nname( 1 ) ); @@ -217,6 +223,9 @@ bool monexamine::pet_menu( monster &z ) case swap_pos: swap( z ); break; + case push_monster: + push( z ); + break; case rename: rename_pet( z ); break; @@ -283,17 +292,19 @@ bool monexamine::pet_menu( monster &z ) void monexamine::shear_animal( monster &z ) { - const int moves = to_moves( time_duration::from_minutes( 30 / g->u.max_quality( + Character &player_character = get_player_character(); + const int moves = to_moves( time_duration::from_minutes( 30 / player_character.max_quality( qual_SHEAR ) ) ); - g->u.assign_activity( activity_id( "ACT_SHEAR" ), moves, -1 ); - g->u.activity.coords.push_back( g->m.getabs( z.pos() ) ); + player_character.assign_activity( activity_id( "ACT_SHEAR" ), moves, -1 ); + player_character.activity.coords.push_back( get_map().getabs( z.pos() ) ); // pin the sheep in place if it isn't already if( !z.has_effect( effect_tied ) ) { z.add_effect( effect_tied, 1_turns, num_bp, true ); - g->u.activity.str_values.push_back( "temp_tie" ); + player_character.activity.str_values.push_back( "temp_tie" ); } - g->u.activity.targets.push_back( item_location( g->u, g->u.best_quality_item( qual_SHEAR ) ) ); + player_character.activity.targets.push_back( item_location( player_character, + player_character.best_quality_item( qual_SHEAR ) ) ); add_msg( _( "You start shearing the %s." ), z.get_name() ); } @@ -305,7 +316,7 @@ static item_location pet_armor_loc( monster &z ) z.get_volume() <= it.get_pet_armor_max_vol(); }; - return game_menus::inv::titled_filter_menu( filter, g->u, _( "Pet armor" ) ); + return game_menus::inv::titled_filter_menu( filter, get_avatar(), _( "Pet armor" ) ); } static item_location tack_loc() @@ -314,12 +325,12 @@ static item_location tack_loc() return it.has_flag( "TACK" ); }; - return game_menus::inv::titled_filter_menu( filter, g->u, _( "Tack" ) ); + return game_menus::inv::titled_filter_menu( filter, get_avatar(), _( "Tack" ) ); } void monexamine::remove_battery( monster &z ) { - g->m.add_item_or_charges( g->u.pos(), *z.battery_item ); + get_map().add_item_or_charges( get_player_character().pos(), *z.battery_item ); z.battery_item.reset(); } @@ -329,7 +340,8 @@ void monexamine::insert_battery( monster &z ) // already has a battery, shouldn't be called with one, but just incase. return; } - std::vector bat_inv = g->u.items_with( []( const item & itm ) { + Character &player_character = get_player_character(); + std::vector bat_inv = player_character.items_with( []( const item & itm ) { return itm.has_flag( "MECH_BAT" ); } ); if( bat_inv.empty() ) { @@ -351,24 +363,22 @@ void monexamine::insert_battery( monster &z ) return; } item *bat_item = bat_inv[index - 1]; - int item_pos = g->u.get_item_position( bat_item ); - if( item_pos != INT_MIN ) { - z.battery_item = cata::make_value( *bat_item ); - g->u.i_rem( item_pos ); - } + z.battery_item = cata::make_value( *bat_item ); + player_character.i_rem( bat_item ); } bool monexamine::mech_hack( monster &z ) { + Character &player_character = get_player_character(); itype_id card_type = itype_id_military; - if( g->u.has_amount( card_type, 1 ) ) { + if( player_character.has_amount( card_type, 1 ) ) { if( query_yn( _( "Swipe your ID card into the mech's security port?" ) ) ) { - g->u.mod_moves( -100 ); + player_character.mod_moves( -100 ); z.add_effect( effect_pet, 1_turns, num_bp, true ); z.friendly = -1; add_msg( m_good, _( "The %s whirs into life and opens its restraints to accept a pilot." ), z.get_name() ); - g->u.use_amount( card_type, 1 ); + player_character.use_amount( card_type, 1 ); return true; } } else { @@ -392,8 +402,9 @@ static int prompt_for_amount( const char *const msg, const int max ) bool monexamine::pay_bot( monster &z ) { + Character &player_character = get_player_character(); time_duration friend_time = z.get_effect_dur( effect_pet ); - const int charge_count = g->u.charges_of( itype_cash_card ); + const int charge_count = player_character.charges_of( itype_cash_card ); int amount = 0; uilist bot_menu; @@ -414,7 +425,7 @@ bool monexamine::pay_bot( monster &z ) "How much friendship do you get? Max: %d minutes.", charge_count / 10 ), charge_count / 10 ); if( amount > 0 ) { time_duration time_bought = time_duration::from_minutes( amount ); - g->u.use_charges( itype_cash_card, amount * 10 ); + player_character.use_charges( itype_cash_card, amount * 10 ); z.add_effect( effect_pet, time_bought ); z.add_effect( effect_paid, time_bought, num_bp, true ); z.friendly = -1; @@ -434,7 +445,7 @@ void monexamine::attach_or_remove_saddle( monster &z ) { if( z.has_effect( effect_monster_saddled ) ) { z.remove_effect( effect_monster_saddled ); - g->u.i_add( *z.tack_item ); + get_player_character().i_add( *z.tack_item ); z.tack_item.reset(); } else { item_location loc = tack_loc(); @@ -452,7 +463,7 @@ void monexamine::attach_or_remove_saddle( monster &z ) bool Character::can_mount( const monster &critter ) const { const auto &avoid = get_path_avoid(); - auto route = g->m.route( pos(), critter.pos(), get_pathfinding_settings(), avoid ); + auto route = get_map().route( pos(), critter.pos(), get_pathfinding_settings(), avoid ); if( route.empty() ) { return false; @@ -466,23 +477,24 @@ bool Character::can_mount( const monster &critter ) const void monexamine::mount_pet( monster &z ) { - g->u.mount_creature( z ); + get_player_character().mount_creature( z ); } void monexamine::swap( monster &z ) { std::string pet_name = z.get_name(); - g->u.moves -= 150; + Character &player_character = get_player_character(); + player_character.moves -= 150; ///\EFFECT_STR increases chance to successfully swap positions with your pet ///\EFFECT_DEX increases chance to successfully swap positions with your pet - if( !one_in( ( g->u.str_cur + g->u.dex_cur ) / 6 ) ) { + if( !one_in( ( player_character.str_cur + player_character.dex_cur ) / 6 ) ) { bool t = z.has_effect( effect_tied ); if( t ) { z.remove_effect( effect_tied ); } - g->swap_critters( g->u, z ); + g->swap_critters( player_character, z ); if( t ) { z.add_effect( effect_tied, 1_turns, num_bp, true ); @@ -496,17 +508,18 @@ void monexamine::swap( monster &z ) void monexamine::push( monster &z ) { std::string pet_name = z.get_name(); - g->u.moves -= 30; + Character &player_character = get_player_character(); + player_character.moves -= 30; ///\EFFECT_STR increases chance to successfully push your pet - if( !one_in( g->u.str_cur ) ) { + if( !one_in( player_character.str_cur ) ) { add_msg( _( "You pushed the %s." ), pet_name ); } else { add_msg( _( "You pushed the %s, but it resisted." ), pet_name ); return; } - point delta( z.posx() - g->u.posx(), z.posy() - g->u.posy() ); + point delta( z.posx() - player_character.posx(), z.posy() - player_character.posy() ); z.move_to( tripoint( z.posx() + delta.x, z.posy() + delta.y, z.posz() ) ); } @@ -529,7 +542,9 @@ void monexamine::attach_bag_to( monster &z ) return it.is_armor() && it.get_total_capacity() > 0_ml; }; - item_location loc = game_menus::inv::titled_filter_menu( filter, g->u, _( "Bag item" ) ); + avatar &player_character = get_avatar(); + item_location loc = game_menus::inv::titled_filter_menu( filter, player_character, + _( "Bag item" ) ); if( !loc ) { add_msg( _( "Never mind." ) ); @@ -539,11 +554,11 @@ void monexamine::attach_bag_to( monster &z ) item &it = *loc; z.storage_item = cata::make_value( it ); add_msg( _( "You mount the %1$s on your %2$s." ), it.display_name(), pet_name ); - g->u.i_rem( &it ); + player_character.i_rem( &it ); z.add_effect( effect_has_bag, 1_turns, num_bp, true ); // Update encumbrance in case we were wearing it - g->u.flag_encumbrance(); - g->u.moves -= 200; + player_character.flag_encumbrance(); + player_character.moves -= 200; } void monexamine::remove_bag_from( monster &z ) @@ -553,10 +568,11 @@ void monexamine::remove_bag_from( monster &z ) if( !z.inv.empty() ) { dump_items( z ); } - g->m.add_item_or_charges( g->u.pos(), *z.storage_item ); + Character &player_character = get_player_character(); + get_map().add_item_or_charges( player_character.pos(), *z.storage_item ); add_msg( _( "You remove the %1$s from %2$s." ), z.storage_item->display_name(), pet_name ); z.storage_item.reset(); - g->u.moves -= 200; + player_character.moves -= 200; } else { add_msg( m_bad, _( "Your %1$s doesn't have a bag!" ), pet_name ); } @@ -566,12 +582,14 @@ void monexamine::remove_bag_from( monster &z ) void monexamine::dump_items( monster &z ) { std::string pet_name = z.get_name(); + Character &player_character = get_player_character(); + map &here = get_map(); for( auto &it : z.inv ) { - g->m.add_item_or_charges( g->u.pos(), it ); + here.add_item_or_charges( player_character.pos(), it ); } z.inv.clear(); add_msg( _( "You dump the contents of the %s's bag on the ground." ), pet_name ); - g->u.moves -= 200; + player_character.moves -= 200; } bool monexamine::give_items_to( monster &z ) @@ -586,7 +604,8 @@ bool monexamine::give_items_to( monster &z ) units::mass max_weight = z.weight_capacity() - z.get_carried_weight(); units::volume max_volume = storage.get_total_capacity() - z.get_carried_volume(); - drop_locations items = game_menus::inv::multidrop( g->u ); + avatar &player_character = get_avatar(); + drop_locations items = game_menus::inv::multidrop( player_character ); drop_locations to_move; for( const drop_location &itq : items ) { const item &it = *itq.first; @@ -605,7 +624,7 @@ bool monexamine::give_items_to( monster &z ) } } z.add_effect( effect_controlled, 5_turns ); - g->u.drop( to_move, z.pos(), true ); + player_character.drop( to_move, z.pos(), true ); return false; } @@ -635,7 +654,7 @@ bool monexamine::add_armor( monster &z ) loc.remove_item(); z.add_effect( effect_monster_armor, 1_turns, num_bp, true ); // TODO: armoring a horse takes a lot longer than 2 seconds. This should be a long action. - g->u.moves -= 200; + get_player_character().moves -= 200; return true; } @@ -650,12 +669,12 @@ void monexamine::remove_armor( monster &z ) std::string pet_name = z.get_name(); if( z.armor_item ) { z.armor_item->erase_var( "pet_armor" ); - g->m.add_item_or_charges( z.pos(), *z.armor_item ); + get_map().add_item_or_charges( z.pos(), *z.armor_item ); add_msg( pgettext( "pet armor", "You remove the %1$s from %2$s." ), z.armor_item->display_name(), pet_name ); z.armor_item.reset(); // TODO: removing armor from a horse takes a lot longer than 2 seconds. This should be a long action. - g->u.moves -= 200; + get_player_character().moves -= 200; } else { add_msg( m_bad, _( "Your %1$s isn't wearing armor!" ), pet_name ); } @@ -665,34 +684,38 @@ void monexamine::remove_armor( monster &z ) void monexamine::play_with( monster &z ) { std::string pet_name = z.get_name(); - g->u.assign_activity( ACT_PLAY_WITH_PET, rng( 50, 125 ) * 100 ); - g->u.activity.str_values.push_back( pet_name ); + Character &player_character = get_player_character(); + player_character.assign_activity( ACT_PLAY_WITH_PET, rng( 50, 125 ) * 100 ); + player_character.activity.str_values.push_back( pet_name ); } void monexamine::kill_zslave( monster &z ) { - z.apply_damage( &g->u, bodypart_id( "torso" ), 100 ); // damage the monster (and its corpse) - z.die( &g->u ); // and make sure it's really dead + avatar &player_character = get_avatar(); + z.apply_damage( &player_character, bodypart_id( "torso" ), + 100 ); // damage the monster (and its corpse) + z.die( &player_character ); // and make sure it's really dead - g->u.moves -= 150; + player_character.moves -= 150; if( !one_in( 3 ) ) { - g->u.add_msg_if_player( _( "You tear out the pheromone ball from the zombie slave." ) ); + player_character.add_msg_if_player( _( "You tear out the pheromone ball from the zombie slave." ) ); item ball( "pheromone", 0 ); - iuse::pheromone( &g->u, &ball, true, g->u.pos() ); + iuse::pheromone( &player_character, &ball, true, player_character.pos() ); } } void monexamine::tie_or_untie( monster &z ) { + Character &player_character = get_player_character(); if( z.has_effect( effect_tied ) ) { z.remove_effect( effect_tied ); if( z.tied_item ) { - g->u.i_add( *z.tied_item ); + player_character.i_add( *z.tied_item ); z.tied_item.reset(); } } else { - std::vector rope_inv = g->u.items_with( []( const item & itm ) { + std::vector rope_inv = player_character.items_with( []( const item & itm ) { return itm.has_flag( "TIE_UP" ); } ); if( rope_inv.empty() ) { @@ -713,12 +736,9 @@ void monexamine::tie_or_untie( monster &z ) return; } item *rope_item = rope_inv[index - 1]; - int item_pos = g->u.get_item_position( rope_item ); - if( item_pos != INT_MIN ) { - z.tied_item = cata::make_value( *rope_item ); - g->u.i_rem( item_pos ); - z.add_effect( effect_tied, 1_turns, num_bp, true ); - } + z.tied_item = cata::make_value( *rope_item ); + player_character.i_rem( rope_item ); + z.add_effect( effect_tied, 1_turns, num_bp, true ); } } @@ -732,13 +752,14 @@ void monexamine::milk_source( monster &source_mon ) } if( milkable_ammo->second > 0 ) { const int moves = to_moves( time_duration::from_minutes( milkable_ammo->second / 2 ) ); - g->u.assign_activity( ACT_MILK, moves, -1 ); - g->u.activity.coords.push_back( g->m.getabs( source_mon.pos() ) ); + Character &player_character = get_player_character(); + player_character.assign_activity( ACT_MILK, moves, -1 ); + player_character.activity.coords.push_back( get_map().getabs( source_mon.pos() ) ); // pin the cow in place if it isn't already bool temp_tie = !source_mon.has_effect( effect_tied ); if( temp_tie ) { source_mon.add_effect( effect_tied, 1_turns, num_bp, true ); - g->u.activity.str_values.push_back( "temp_tie" ); + player_character.activity.str_values.push_back( "temp_tie" ); } add_msg( _( "You milk the %s." ), source_mon.get_name() ); } else { diff --git a/src/monmove.cpp b/src/monmove.cpp index 3bf63ea95b2ef..c7b5f7c7cffcd 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -12,7 +12,6 @@ #include #include -#include "avatar.h" #include "behavior.h" #include "bionics.h" #include "cata_utility.h" @@ -36,7 +35,6 @@ #include "npc.h" #include "pathfinding.h" #include "pimpl.h" -#include "player.h" #include "rng.h" #include "scent_map.h" #include "sounds.h" @@ -116,25 +114,26 @@ static bool z_is_valid( int z ) bool monster::will_move_to( const tripoint &p ) const { - if( g->m.impassable( p ) ) { + map &here = get_map(); + if( here.impassable( p ) ) { if( digging() ) { - if( !g->m.has_flag( "BURROWABLE", p ) ) { + if( !here.has_flag( "BURROWABLE", p ) ) { return false; } - } else if( !( can_climb() && g->m.has_flag( "CLIMBABLE", p ) ) ) { + } else if( !( can_climb() && here.has_flag( "CLIMBABLE", p ) ) ) { return false; } } - if( ( !can_submerge() && !flies() ) && g->m.has_flag( TFLAG_DEEP_WATER, p ) ) { + if( ( !can_submerge() && !flies() ) && here.has_flag( TFLAG_DEEP_WATER, p ) ) { return false; } - if( digs() && !g->m.has_flag( "DIGGABLE", p ) && !g->m.has_flag( "BURROWABLE", p ) ) { + if( digs() && !here.has_flag( "DIGGABLE", p ) && !here.has_flag( "BURROWABLE", p ) ) { return false; } - if( has_flag( MF_AQUATIC ) && !g->m.has_flag( "SWIMMABLE", p ) ) { + if( has_flag( MF_AQUATIC ) && !here.has_flag( "SWIMMABLE", p ) ) { return false; } @@ -142,7 +141,7 @@ bool monster::will_move_to( const tripoint &p ) const return false; } - if( get_size() > creature_size::medium && g->m.has_flag_ter( TFLAG_SMALL_PASSAGE, p ) ) { + if( get_size() > creature_size::medium && here.has_flag_ter( TFLAG_SMALL_PASSAGE, p ) ) { return false; // if a large critter, can't move through tight passages } @@ -169,7 +168,7 @@ bool monster::will_move_to( const tripoint &p ) const // technically this will shortcut in evaluation from fire or fall // before hitting simple or complex but this is more explicit if( avoid_fire || avoid_fall || avoid_simple || avoid_complex ) { - const ter_id target = g->m.ter( p ); + const ter_id target = here.ter( p ); // Don't enter lava if we have any concept of heat being bad if( avoid_fire && target == t_lava ) { @@ -178,7 +177,7 @@ bool monster::will_move_to( const tripoint &p ) const if( avoid_fall ) { // Don't throw ourselves off cliffs if we have a concept of falling - if( !g->m.has_floor( p ) && !flies() ) { + if( !here.has_floor( p ) && !flies() ) { return false; } @@ -190,15 +189,15 @@ bool monster::will_move_to( const tripoint &p ) const } // Some things are only avoided if we're not attacking - if( attitude( &g->u ) != MATT_ATTACK ) { + if( attitude( &get_player_character() ) != MATT_ATTACK ) { // Sharp terrain is ignored while attacking - if( avoid_simple && g->m.has_flag( "SHARP", p ) && + if( avoid_simple && here.has_flag( "SHARP", p ) && !( type->size == creature_size::tiny || flies() ) ) { return false; } } - const field &target_field = g->m.field_at( p ); + const field &target_field = here.field_at( p ); // Higher awareness is needed for identifying these as threats. if( avoid_complex ) { @@ -207,8 +206,8 @@ bool monster::will_move_to( const tripoint &p ) const return false; } // Don't step on any traps (if we can see) - const trap &target_trap = g->m.tr_at( p ); - if( has_flag( MF_SEES ) && !target_trap.is_benign() && g->m.has_floor( p ) ) { + const trap &target_trap = here.tr_at( p ); + if( has_flag( MF_SEES ) && !target_trap.is_benign() && here.has_floor( p ) ) { return false; } } @@ -227,13 +226,17 @@ bool monster::will_move_to( const tripoint &p ) const bool monster::can_reach_to( const tripoint &p ) const { + map &here = get_map(); if( p.z > pos().z && z_is_valid( pos().z ) ) { - if( !g->m.has_flag( TFLAG_GOES_UP, pos() ) && !g->m.has_flag( TFLAG_NO_FLOOR, p ) ) { + if( here.has_flag( TFLAG_RAMP_UP, tripoint( p.xy(), p.z - 1 ) ) ) { + return true; + } + if( !here.has_flag( TFLAG_GOES_UP, pos() ) && !here.has_flag( TFLAG_NO_FLOOR, p ) ) { // can't go through the roof return false; } } else if( p.z < pos().z && z_is_valid( pos().z ) ) { - if( !g->m.has_flag( TFLAG_GOES_DOWN, pos() ) ) { + if( !here.has_flag( TFLAG_GOES_DOWN, pos() ) ) { // can't go through the floor // you would fall anyway if there was no floor, so no need to check for that here return false; @@ -322,12 +325,12 @@ void monster::plan() bool group_morale = has_flag( MF_GROUP_MORALE ) && morale < type->morale; bool swarms = has_flag( MF_SWARMS ); auto mood = attitude(); - + Character &player_character = get_player_character(); // If we can see the player, move toward them or flee, simpleminded animals are too dumb to follow the player. - if( friendly == 0 && sees( g->u ) && !has_flag( MF_PET_WONT_FOLLOW ) ) { - dist = rate_target( g->u, dist, smart_planning ); - fleeing = fleeing || is_fleeing( g->u ); - target = &g->u; + if( friendly == 0 && sees( player_character ) && !has_flag( MF_PET_WONT_FOLLOW ) ) { + dist = rate_target( player_character, dist, smart_planning ); + fleeing = fleeing || is_fleeing( player_character ); + target = &player_character; if( dist <= 5 ) { anger += angers_hostile_near; morale -= fears_hostile_near; @@ -352,7 +355,7 @@ void monster::plan() for( monster &tmp : g->all_monsters() ) { if( type->baby_monster == tmp.type->id ) { // baby nearby; is the player too close? - dist = tmp.rate_target( g->u, dist, smart_planning ); + dist = tmp.rate_target( player_character, dist, smart_planning ); if( dist <= 3 ) { //proximity to baby; monster gets furious and less likely to flee anger += angers_cub_threatened; @@ -500,11 +503,12 @@ void monster::plan() } } + map &here = get_map(); // Operating monster keep you safe while they operate, how nice.... if( type->has_special_attack( "OPERATE" ) ) { if( has_effect( effect_operating ) ) { friendly = 100; - for( auto critter : g->m.get_creatures_in_radius( pos(), 6 ) ) { + for( auto critter : here.get_creatures_in_radius( pos(), 6 ) ) { monster *mon = dynamic_cast( critter ); if( mon != nullptr && mon->type->in_species( species_ZOMBIE ) ) { anger = 100; @@ -522,9 +526,9 @@ void monster::plan() bool found_path_to_couch = false; tripoint tmp( pos() + point( 12, 12 ) ); tripoint couch_loc; - for( const auto &couch_pos : g->m.find_furnitures_with_flag_in_radius( pos(), 10, + for( const auto &couch_pos : here.find_furnitures_with_flag_in_radius( pos(), 10, flag_AUTODOC_COUCH ) ) { - if( g->m.clear_path( pos(), couch_pos, 10, 0, 100 ) ) { + if( here.clear_path( pos(), couch_pos, 10, 0, 100 ) ) { if( rl_dist( pos(), couch_pos ) < rl_dist( pos(), tmp ) ) { tmp = couch_pos; found_path_to_couch = true; @@ -559,9 +563,9 @@ void monster::plan() } else if( friendly > 0 && one_in( 3 ) ) { // Grow restless with no targets friendly--; - } else if( friendly < 0 && sees( g->u ) ) { - if( rl_dist( pos(), g->u.pos() ) > 2 ) { - set_dest( g->u.pos() ); + } else if( friendly < 0 && sees( player_character ) ) { + if( rl_dist( pos(), player_character.pos() ) > 2 ) { + set_dest( player_character.pos() ); } else { unset_dest(); } @@ -594,15 +598,16 @@ static float get_stagger_adjust( const tripoint &source, const tripoint &destina */ bool monster::is_aquatic_danger( const tripoint &at_pos ) { - return g->m.has_flag_ter( TFLAG_DEEP_WATER, at_pos ) && g->m.has_flag( flag_LIQUID, at_pos ) && - can_drown() && !g->m.veh_at( at_pos ).part_with_feature( "BOARDABLE", false ); + map &here = get_map(); + return here.has_flag_ter( TFLAG_DEEP_WATER, at_pos ) && here.has_flag( flag_LIQUID, at_pos ) && + can_drown() && !here.veh_at( at_pos ).part_with_feature( "BOARDABLE", false ); } bool monster::die_if_drowning( const tripoint &at_pos, const int chance ) { if( is_aquatic_danger( at_pos ) && one_in( chance ) ) { die( nullptr ); - if( g->u.sees( at_pos ) ) { + if( get_player_character().sees( at_pos ) ) { add_msg( _( "The %s drowns!" ), name() ); } return true; @@ -629,6 +634,8 @@ void monster::move() die( nullptr ); return; } + map &here = get_map(); + Character &player_character = get_player_character(); behavior::monster_oracle_t oracle( this ); behavior::tree goals; @@ -638,12 +645,12 @@ void monster::move() //If there are. Consume them. // TODO: Stick this in a map and dispatch to it via the action string. if( action == "consume_items" ) { - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "The %s flows around the objects on the floor and they are quickly dissolved!" ), name() ); } static const auto volume_per_hp = 250_ml; - for( item &elem : g->m.i_at( pos() ) ) { + for( item &elem : here.i_at( pos() ) ) { hp += elem.volume() / volume_per_hp; // Yeah this means it can get more HP than normal. if( has_flag( MF_ABSORBS_SPLITS ) ) { while( hp / 2 > type->hp ) { @@ -654,13 +661,13 @@ void monster::move() hp -= type->hp; //this is a new copy of the monster. Ideally we should copy the stats/effects that affect the parent spawn->make_ally( *this ); - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "The %s splits in two!" ), name() ); } } } } - g->m.i_clear( pos() ); + here.i_clear( pos() ); } else if( action == "eat_crop" ) { // TODO: Create a special attacks whitelist unordered map instead of an if chain. std::map::const_iterator attack = @@ -672,7 +679,7 @@ void monster::move() } } // record position before moving to put the player there if we're dragging - tripoint drag_to = g->m.getabs( pos() ); + tripoint drag_to = here.getabs( pos() ); const bool pacified = has_effect( effect_pacified ); @@ -715,8 +722,8 @@ void monster::move() nursebot_operate( dragged_foe ); // The monster can sometimes hang in air due to last fall being blocked - if( !flies() && g->m.has_flag( TFLAG_NO_FLOOR, pos() ) ) { - g->m.creature_on_trap( *this, false ); + if( !flies() && here.has_flag( TFLAG_NO_FLOOR, pos() ) ) { + here.creature_on_trap( *this, false ); if( is_dead() ) { return; } @@ -751,8 +758,8 @@ void monster::move() } // don't move if a passenger in a moving vehicle - auto vp = g->m.veh_at( pos() ); - bool harness_part = static_cast( g->m.veh_at( pos() ).part_with_feature( "ANIMAL_CTRL", + auto vp = here.veh_at( pos() ); + bool harness_part = static_cast( here.veh_at( pos() ).part_with_feature( "ANIMAL_CTRL", true ) ); if( vp && vp->vehicle().is_moving() && vp->vehicle().get_pet( vp->part_index() ) ) { moves = 0; @@ -768,8 +775,8 @@ void monster::move() // Set attitude to attitude to our current target monster_attitude current_attitude = attitude( nullptr ); if( !wander() ) { - if( goal == g->u.pos() ) { - current_attitude = attitude( &g->u ); + if( goal == player_character.pos() ) { + current_attitude = attitude( &player_character ); } else { for( const npc &guy : g->all_npcs() ) { if( goal == guy.pos() ) { @@ -800,7 +807,7 @@ void monster::move() if( pf_settings.max_dist >= rl_dist( pos(), goal ) && ( path.empty() || rl_dist( pos(), path.front() ) >= 2 || path.back() != goal ) ) { // We need a new path - path = g->m.route( pos(), goal, pf_settings, get_path_avoid() ); + path = here.route( pos(), goal, pf_settings, get_path_avoid() ); } // Try to respect old paths, even if we can't pathfind at the moment @@ -832,7 +839,7 @@ void monster::move() } } - if( !g->m.has_zlevels() ) { + if( !here.has_zlevels() ) { // Otherwise weird things happen destination.z = posz(); } @@ -865,19 +872,28 @@ void monster::move() // This is a float and using trig_dist() because that Does the Right Thing(tm) // in both circular and roguelike distance modes. const float distance_to_target = trig_dist( pos(), destination ); - for( const tripoint &candidate : squares_closer_to( pos(), destination ) ) { - tripoint candidate_abs = g->m.getabs( candidate ); + for( tripoint &candidate : squares_closer_to( pos(), destination ) ) { + bool via_ramp = false; + if( here.has_flag( TFLAG_RAMP_UP, candidate ) ) { + via_ramp = true; + candidate.z += 1; + } else if( here.has_flag( TFLAG_RAMP_DOWN, candidate ) ) { + via_ramp = true; + candidate.z -= 1; + } + tripoint candidate_abs = get_map().getabs( candidate ); + if( candidate.z != posz() ) { bool can_z_move = true; - if( !g->m.valid_move( pos(), candidate, false, true ) ) { + if( !here.valid_move( pos(), candidate, false, true, via_ramp ) ) { // Can't phase through floor can_z_move = false; } // If we're trying to go up but can't fly, check if we can climb. If we can't, then don't // This prevents non-climb/fly enemies running up walls - if( candidate.z > posz() && !flies() ) { - if( !can_climb() || !g->m.has_floor_or_support( candidate ) ) { + if( candidate.z > posz() && !( via_ramp || flies() ) ) { + if( !can_climb() || !here.has_floor_or_support( candidate ) ) { // Can't "jump" up a whole z-level can_z_move = false; } @@ -890,7 +906,7 @@ void monster::move() posy() / ( SEEY * 2 ) == candidate.y / ( SEEY * 2 ) ) { const tripoint &upper = candidate.z > posz() ? candidate : pos(); const tripoint &lower = candidate.z > posz() ? pos() : candidate; - if( g->m.has_flag( TFLAG_GOES_DOWN, upper ) && g->m.has_flag( TFLAG_GOES_UP, lower ) ) { + if( here.has_flag( TFLAG_GOES_DOWN, upper ) && here.has_flag( TFLAG_GOES_UP, lower ) ) { can_z_move = true; } } @@ -931,7 +947,7 @@ void monster::move() if( !can_bash ) { continue; } - const int estimate = g->m.bash_rating( bash_estimate(), candidate ); + const int estimate = here.bash_rating( bash_estimate(), candidate ); if( estimate <= 0 ) { continue; } @@ -963,10 +979,10 @@ void monster::move() // Finished logic section. By this point, we should have chosen a square to // move to (moved = true). if( moved ) { // Actual effects of moving to the square we've chosen - const tripoint local_next_step = g->m.getlocal( next_step ); + const tripoint local_next_step = here.getlocal( next_step ); const bool did_something = ( !pacified && attack_at( local_next_step ) ) || - ( !pacified && can_open_doors && g->m.open_door( local_next_step, !g->m.is_outside( pos() ) ) ) || + ( !pacified && can_open_doors && here.open_door( local_next_step, !here.is_outside( pos() ) ) ) || ( !pacified && bash_at( local_next_step ) ) || ( !pacified && push_to( local_next_step, 0, 0 ) ) || move_to( local_next_step, false, false, get_stagger_adjust( pos(), destination, local_next_step ) ); @@ -979,9 +995,9 @@ void monster::move() if( !dragged_foe->has_effect( effect_grabbed ) ) { dragged_foe = nullptr; remove_effect( effect_dragging ); - } else if( g->m.getlocal( drag_to ) != pos() && - g->critter_at( g->m.getlocal( drag_to ) ) == nullptr ) { - dragged_foe->setpos( g->m.getlocal( drag_to ) ); + } else if( here.getlocal( drag_to ) != pos() && + g->critter_at( here.getlocal( drag_to ) ) == nullptr ) { + dragged_foe->setpos( here.getlocal( drag_to ) ); } } } else { @@ -1026,7 +1042,7 @@ void monster::nursebot_operate( player *dragged_foe ) return; } - if( rl_dist( pos(), goal ) == 1 && !g->m.has_flag_furn( flag_AUTODOC_COUCH, goal ) && + if( rl_dist( pos(), goal ) == 1 && !get_map().has_flag_furn( flag_AUTODOC_COUCH, goal ) && !has_effect( effect_operating ) ) { if( dragged_foe->has_effect( effect_grabbed ) && !has_effect( effect_countdown ) && ( g->critter_at( goal ) == nullptr || g->critter_at( goal ) == dragged_foe ) ) { @@ -1057,7 +1073,7 @@ void monster::nursebot_operate( player *dragged_foe ) const float adjusted_skill = static_cast( 77 ) - std::min( static_cast( 40 ), static_cast( 77 ) - static_cast( 77 ) / static_cast( 10.0 ) ); - g->u.uninstall_bionic( target_cbm, *this, *dragged_foe, adjusted_skill ); + get_player_character().uninstall_bionic( target_cbm, *this, *dragged_foe, adjusted_skill ); dragged_foe->remove_effect( effect_grabbed ); remove_effect( effect_dragging ); @@ -1106,7 +1122,7 @@ void monster::footsteps( const tripoint &p ) if( volume == 0 ) { return; } - int dist = rl_dist( p, g->u.pos() ); + int dist = rl_dist( p, get_player_character().pos() ); sounds::add_footstep( p, volume, dist, this, type->get_footsteps() ); } @@ -1129,7 +1145,8 @@ tripoint monster::scent_move() smell_threshold = 400; } - const bool fleeing = is_fleeing( g->u ); + Character &player_character = get_player_character(); + const bool fleeing = is_fleeing( player_character ); if( fleeing ) { bestsmell = g->scent.get( pos() ); } @@ -1140,7 +1157,8 @@ tripoint monster::scent_move() return next; } const bool can_bash = bash_skill() > 0; - for( const auto &dest : g->m.points_in_radius( pos(), 1, SCENT_MAP_Z_REACH ) ) { + map &here = get_map(); + for( const auto &dest : here.points_in_radius( pos(), 1, SCENT_MAP_Z_REACH ) ) { int smell = g->scent.get( dest ); const scenttype_id &type_scent = g->scent.get_type( dest ); @@ -1168,9 +1186,9 @@ tripoint monster::scent_move() if( ( !fleeing && smell < bestsmell ) || ( fleeing && smell > bestsmell ) || !right_scent ) { continue; } - if( g->m.valid_move( pos(), dest, can_bash, true ) && - ( can_move_to( dest ) || ( dest == g->u.pos() ) || - ( can_bash && g->m.bash_rating( bash_estimate(), dest ) > 0 ) ) ) { + if( here.valid_move( pos(), dest, can_bash, true ) && + ( can_move_to( dest ) || ( dest == player_character.pos() ) || + ( can_bash && here.bash_rating( bash_estimate(), dest ) > 0 ) ) ) { if( ( !fleeing && smell > bestsmell ) || ( fleeing && smell < bestsmell ) ) { smoves.clear(); smoves.push_back( dest ); @@ -1188,46 +1206,47 @@ int monster::calc_movecost( const tripoint &f, const tripoint &t ) const { int movecost = 0; - const int source_cost = g->m.move_cost( f ); - const int dest_cost = g->m.move_cost( t ); + map &here = get_map(); + const int source_cost = here.move_cost( f ); + const int dest_cost = here.move_cost( t ); // Digging and flying monsters ignore terrain cost - if( flies() || ( digging() && g->m.has_flag( "DIGGABLE", t ) ) ) { + if( flies() || ( digging() && here.has_flag( "DIGGABLE", t ) ) ) { movecost = 100; // Swimming monsters move super fast in water } else if( swims() ) { - if( g->m.has_flag( "SWIMMABLE", f ) ) { + if( here.has_flag( "SWIMMABLE", f ) ) { movecost += 25; } else { - movecost += 50 * g->m.move_cost( f ); + movecost += 50 * here.move_cost( f ); } - if( g->m.has_flag( "SWIMMABLE", t ) ) { + if( here.has_flag( "SWIMMABLE", t ) ) { movecost += 25; } else { - movecost += 50 * g->m.move_cost( t ); + movecost += 50 * here.move_cost( t ); } } else if( can_submerge() ) { // No-breathe monsters have to walk underwater slowly - if( g->m.has_flag( "SWIMMABLE", f ) ) { + if( here.has_flag( "SWIMMABLE", f ) ) { movecost += 250; } else { - movecost += 50 * g->m.move_cost( f ); + movecost += 50 * here.move_cost( f ); } - if( g->m.has_flag( "SWIMMABLE", t ) ) { + if( here.has_flag( "SWIMMABLE", t ) ) { movecost += 250; } else { - movecost += 50 * g->m.move_cost( t ); + movecost += 50 * here.move_cost( t ); } movecost /= 2; } else if( climbs() ) { - if( g->m.has_flag( "CLIMBABLE", f ) ) { + if( here.has_flag( "CLIMBABLE", f ) ) { movecost += 150; } else { - movecost += 50 * g->m.move_cost( f ); + movecost += 50 * here.move_cost( f ); } - if( g->m.has_flag( "CLIMBABLE", t ) ) { + if( here.has_flag( "CLIMBABLE", t ) ) { movecost += 150; } else { - movecost += 50 * g->m.move_cost( t ); + movecost += 50 * here.move_cost( t ); } movecost /= 2; } else { @@ -1243,8 +1262,9 @@ int monster::calc_climb_cost( const tripoint &f, const tripoint &t ) const return 100; } - if( climbs() && !g->m.has_flag( TFLAG_NO_FLOOR, t ) ) { - const int diff = g->m.climb_difficulty( f ); + map &here = get_map(); + if( climbs() && !here.has_flag( TFLAG_NO_FLOOR, t ) ) { + const int diff = here.climb_difficulty( f ); if( diff <= 10 ) { return 150; } @@ -1306,14 +1326,15 @@ bool monster::bash_at( const tripoint &p ) return false; } - bool can_bash = g->m.is_bashable( p ) && bash_skill() > 0; + map &here = get_map(); + bool can_bash = here.is_bashable( p ) && bash_skill() > 0; if( !can_bash ) { return false; } - bool flat_ground = g->m.has_flag( "ROAD", p ) || g->m.has_flag( "FLAT", p ); + bool flat_ground = here.has_flag( "ROAD", p ) || here.has_flag( "FLAT", p ); if( flat_ground ) { - bool can_bash_ter = g->m.is_bashable_ter( p ); + bool can_bash_ter = here.is_bashable_ter( p ); bool try_bash_ter = one_in( 50 ); if( !( can_bash_ter && try_bash_ter ) ) { return false; @@ -1321,7 +1342,7 @@ bool monster::bash_at( const tripoint &p ) } int bashskill = group_bash_skill( p ); - g->m.bash( p, bashskill ); + here.bash( p, bashskill ); moves -= 100; return true; } @@ -1394,8 +1415,9 @@ bool monster::attack_at( const tripoint &p ) return false; } - if( p == g->u.pos() ) { - melee_attack( g->u ); + Character &player_character = get_player_character(); + if( p == player_character.pos() ) { + melee_attack( player_character ); return true; } @@ -1439,8 +1461,9 @@ bool monster::attack_at( const tripoint &p ) static tripoint find_closest_stair( const tripoint &near_this, const ter_bitflags stair_type ) { - for( const tripoint &candidate : closest_tripoints_first( near_this, 10 ) ) { - if( g->m.has_flag( stair_type, candidate ) ) { + map &here = get_map(); + for( const tripoint &candidate : closest_points_first( near_this, 10 ) ) { + if( here.has_flag( stair_type, candidate ) ) { return candidate; } } @@ -1457,38 +1480,40 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, const bool going_up = p.z > pos().z; tripoint destination = p; + map &here = get_map(); // This is stair teleportation hackery. // TODO: Remove this in favor of stair alignment if( going_up ) { - if( g->m.has_flag( TFLAG_GOES_UP, pos() ) ) { + if( here.has_flag( TFLAG_GOES_UP, pos() ) ) { destination = find_closest_stair( p, TFLAG_GOES_DOWN ); } } else if( z_move ) { - if( g->m.has_flag( TFLAG_GOES_DOWN, pos() ) ) { + if( here.has_flag( TFLAG_GOES_DOWN, pos() ) ) { destination = find_closest_stair( p, TFLAG_GOES_UP ); } } + Character &player_character = get_player_character(); // Allows climbing monsters to move on terrain with movecost <= 0 Creature *critter = g->critter_at( destination, is_hallucination() ); - if( g->m.has_flag( "CLIMBABLE", destination ) ) { - if( g->m.impassable( destination ) && critter == nullptr ) { + if( here.has_flag( "CLIMBABLE", destination ) ) { + if( here.impassable( destination ) && critter == nullptr ) { if( flies() ) { moves -= 100; force = true; - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "The %1$s flies over the %2$s." ), name(), - g->m.has_flag_furn( "CLIMBABLE", p ) ? g->m.furnname( p ) : - g->m.tername( p ) ); + here.has_flag_furn( "CLIMBABLE", p ) ? here.furnname( p ) : + here.tername( p ) ); } } else if( climbs() ) { moves -= 150; force = true; - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "The %1$s climbs over the %2$s." ), name(), - g->m.has_flag_furn( "CLIMBABLE", p ) ? g->m.furnname( p ) : - g->m.tername( p ) ); + here.has_flag_furn( "CLIMBABLE", p ) ? here.furnname( p ) : + here.tername( p ) ); } } } @@ -1510,7 +1535,7 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, // Note: Keep this as float here or else it will cancel valid moves const float cost = stagger_adjustment * static_cast( climbs() && - g->m.has_flag( TFLAG_NO_FLOOR, p ) ? calc_climb_cost( pos(), destination ) : calc_movecost( pos(), + here.has_flag( TFLAG_NO_FLOOR, p ) ? calc_climb_cost( pos(), destination ) : calc_movecost( pos(), destination ) ); if( cost > 0.0f ) { moves -= static_cast( std::ceil( cost ) ); @@ -1520,28 +1545,28 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, } //Check for moving into/out of water - bool was_water = g->m.is_divable( pos() ); - bool will_be_water = on_ground && can_submerge() && g->m.is_divable( destination ); + bool was_water = here.is_divable( pos() ); + bool will_be_water = on_ground && can_submerge() && here.is_divable( destination ); //Birds and other flying creatures flying over the deep water terrain - if( was_water && flies() && g->u.sees( *this ) ) { + if( was_water && flies() && player_character.sees( *this ) ) { if( one_in( 4 ) ) { add_msg( m_warning, _( "A %1$s flies over the %2$s!" ), name(), - g->m.tername( pos() ) ); + here.tername( pos() ) ); } - } else if( was_water && !will_be_water && g->u.sees( *this ) ) { + } else if( was_water && !will_be_water && player_character.sees( *this ) ) { // Use more dramatic messages for swimming monsters //~ Message when a monster emerges from water //~ %1$s: monster name, %2$s: leaps/emerges, %3$s: terrain name add_msg( m_warning, pgettext( "monster movement", "A %1$s %2$s from the %3$s!" ), name(), swims() || has_flag( MF_AQUATIC ) ? _( "leaps" ) : _( "emerges" ), - g->m.tername( pos() ) ); - } else if( !was_water && will_be_water && g->u.sees( *this ) ) { + here.tername( pos() ) ); + } else if( !was_water && will_be_water && player_character.sees( *this ) ) { //~ Message when a monster enters water //~ %1$s: monster name, %2$s: dives/sinks, %3$s: terrain name add_msg( m_warning, pgettext( "monster movement", "A %1$s %2$s into the %3$s!" ), name(), swims() || has_flag( MF_AQUATIC ) ? _( "dives" ) : _( "sinks" ), - g->m.tername( destination ) ); + here.tername( destination ) ); } setpos( destination ); @@ -1555,37 +1580,37 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, if( type->size != creature_size::tiny && on_ground ) { const int sharp_damage = rng( 1, 10 ); const int rough_damage = rng( 1, 2 ); - if( g->m.has_flag( "SHARP", pos() ) && !one_in( 4 ) && + if( here.has_flag( "SHARP", pos() ) && !one_in( 4 ) && get_armor_cut( bodypart_id( "torso" ) ) < sharp_damage ) { apply_damage( nullptr, bodypart_id( "torso" ), sharp_damage ); } - if( g->m.has_flag( "ROUGH", pos() ) && one_in( 6 ) && + if( here.has_flag( "ROUGH", pos() ) && one_in( 6 ) && get_armor_cut( bodypart_id( "torso" ) ) < rough_damage ) { apply_damage( nullptr, bodypart_id( "torso" ), rough_damage ); } } - if( g->m.has_flag( "UNSTABLE", destination ) && on_ground ) { + if( here.has_flag( "UNSTABLE", destination ) && on_ground ) { add_effect( effect_bouldering, 1_turns, num_bp, true ); } else if( has_effect( effect_bouldering ) ) { remove_effect( effect_bouldering ); } - if( g->m.has_flag_ter_or_furn( TFLAG_NO_SIGHT, destination ) && on_ground ) { + if( here.has_flag_ter_or_furn( TFLAG_NO_SIGHT, destination ) && on_ground ) { add_effect( effect_no_sight, 1_turns, num_bp, true ); } else if( has_effect( effect_no_sight ) ) { remove_effect( effect_no_sight ); } - g->m.creature_on_trap( *this ); + here.creature_on_trap( *this ); if( is_dead() ) { return true; } if( !will_be_water && ( digs() || can_dig() ) ) { - underwater = g->m.has_flag( "DIGGABLE", pos() ); + underwater = here.has_flag( "DIGGABLE", pos() ); } // Diggers turn the dirt into dirtmound - if( digging() && g->m.has_flag( "DIGGABLE", pos() ) ) { + if( digging() && here.has_flag( "DIGGABLE", pos() ) ) { int factor = 0; switch( type->size ) { case creature_size::tiny: @@ -1606,26 +1631,26 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, } // TODO: make this take terrain type into account so diggers traveling under sand will create mounds of sand etc. if( one_in( factor ) ) { - g->m.ter_set( pos(), t_dirtmound ); + here.ter_set( pos(), t_dirtmound ); } } // Acid trail monsters leave... a trail of acid if( has_flag( MF_ACIDTRAIL ) ) { - g->m.add_field( pos(), fd_acid, 3 ); + here.add_field( pos(), fd_acid, 3 ); } // Not all acid trail monsters leave as much acid. Every time this monster takes a step, there is a 1/5 chance it will drop a puddle. if( has_flag( MF_SHORTACIDTRAIL ) ) { if( one_in( 5 ) ) { - g->m.add_field( pos(), fd_acid, 3 ); + here.add_field( pos(), fd_acid, 3 ); } } if( has_flag( MF_SLUDGETRAIL ) ) { - for( const tripoint &sludge_p : g->m.points_in_radius( pos(), 1 ) ) { + for( const tripoint &sludge_p : here.points_in_radius( pos(), 1 ) ) { const int fstr = 3 - ( std::abs( sludge_p.x - posx() ) + std::abs( sludge_p.y - posy() ) ); if( fstr >= 2 ) { - g->m.add_field( sludge_p, fd_sludge, fstr ); + here.add_field( sludge_p, fd_sludge, fstr ); } } } @@ -1634,7 +1659,7 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, if( one_in( 10 ) ) { // if it has more napalm, drop some and reduce ammo in tank if( ammo[itype_pressurized_tank] > 0 ) { - g->m.add_item_or_charges( pos(), item( "napalm", calendar::turn, 50 ) ); + here.add_item_or_charges( pos(), item( "napalm", calendar::turn, 50 ) ); ammo[itype_pressurized_tank] -= 50; } else { // TODO: remove MF_DRIPS_NAPALM flag since no more napalm in tank @@ -1645,7 +1670,7 @@ bool monster::move_to( const tripoint &p, bool force, bool step_on_critter, if( has_flag( MF_DRIPS_GASOLINE ) ) { if( one_in( 5 ) ) { // TODO: use same idea that limits napalm dripping - g->m.add_item_or_charges( pos(), item( "gasoline" ) ); + here.add_item_or_charges( pos(), item( "gasoline" ) ); } } return true; @@ -1687,7 +1712,8 @@ bool monster::push_to( const tripoint &p, const int boost, const size_t depth ) return false; } - const int movecost_from = 50 * g->m.move_cost( p ); + map &here = get_map(); + const int movecost_from = 50 * here.move_cost( p ); const int movecost_attacker = std::max( movecost_from, 200 - 10 * ( attack - defend ) ); const tripoint dir = p - pos(); @@ -1707,10 +1733,10 @@ bool monster::push_to( const tripoint &p, const int boost, const size_t depth ) } tripoint dest( p + d ); - const int dest_movecost_from = 50 * g->m.move_cost( dest ); + const int dest_movecost_from = 50 * here.move_cost( dest ); // Pushing into cars/windows etc. is harder - const int movecost_penalty = g->m.move_cost( dest ) - 2; + const int movecost_penalty = here.move_cost( dest ) - 2; if( movecost_penalty <= -2 ) { // Can't push into unpassable terrain continue; @@ -1768,8 +1794,9 @@ bool monster::push_to( const tripoint &p, const int boost, const size_t depth ) g->swap_critters( *critter, *this ); critter->add_effect( effect_stunned, rng( 0_turns, 2_turns ) ); + Character &player_character = get_player_character(); // Only print the message when near player or it can get spammy - if( rl_dist( g->u.pos(), pos() ) < 4 && g->u.sees( *critter ) ) { + if( rl_dist( player_character.pos(), pos() ) < 4 && player_character.sees( *critter ) ) { add_msg( m_warning, _( "The %1$s tramples %2$s" ), name(), critter->disp_name() ); } @@ -1794,18 +1821,25 @@ void monster::stumble() return; } + map &here = get_map(); std::vector valid_stumbles; valid_stumbles.reserve( 11 ); const bool avoid_water = has_flag( MF_NO_BREATHE ) && !swims() && !has_flag( MF_AQUATIC ); - for( const tripoint &dest : g->m.points_in_radius( pos(), 1 ) ) { + for( const tripoint &dest : here.points_in_radius( pos(), 1 ) ) { if( dest != pos() ) { - valid_stumbles.push_back( dest ); + if( here.has_flag( TFLAG_RAMP_DOWN, dest ) ) { + valid_stumbles.push_back( tripoint( dest.xy(), dest.z - 1 ) ); + } else if( here.has_flag( TFLAG_RAMP_UP, dest ) ) { + valid_stumbles.push_back( tripoint( dest.xy(), dest.z + 1 ) ); + } else { + valid_stumbles.push_back( dest ); + } } } - if( g->m.has_zlevels() ) { + if( here.has_zlevels() ) { tripoint below( posx(), posy(), posz() - 1 ); - if( g->m.valid_move( pos(), below, false, true ) ) { + if( here.valid_move( pos(), below, false, true ) ) { valid_stumbles.push_back( below ); } } @@ -1816,8 +1850,8 @@ void monster::stumble() //(Unless they can swim/are aquatic) //But let them wander OUT of water if they are there. !( avoid_water && - g->m.has_flag( TFLAG_SWIMMABLE, dest ) && - !g->m.has_flag( TFLAG_SWIMMABLE, pos() ) ) && + here.has_flag( TFLAG_SWIMMABLE, dest ) && + !here.has_flag( TFLAG_SWIMMABLE, pos() ) ) && ( g->critter_at( dest, is_hallucination() ) == nullptr ) ) { if( move_to( dest, true, false ) ) { break; @@ -1837,7 +1871,7 @@ void monster::knock_back_to( const tripoint &to ) return; } - bool u_see = g->u.sees( to ); + bool u_see = get_player_character().sees( to ); // First, see if we hit another monster if( monster *const z = g->critter_at( to ) ) { @@ -1883,14 +1917,15 @@ void monster::knock_back_to( const tripoint &to ) } } - if( g->m.impassable( to ) ) { + map &here = get_map(); + if( here.impassable( to ) ) { // It's some kind of wall. apply_damage( nullptr, bodypart_id( "torso" ), static_cast( type->size ) ); add_effect( effect_stunned, 2_turns ); if( u_see ) { add_msg( _( "The %1$s bounces off a %2$s." ), name(), - g->m.obstacle_name( to ) ); + here.obstacle_name( to ) ); } } else { // It's no wall @@ -1907,7 +1942,7 @@ void monster::knock_back_to( const tripoint &to ) */ bool monster::will_reach( const point &p ) { - monster_attitude att = attitude( &g->u ); + monster_attitude att = attitude( &get_player_character() ); if( att != MATT_FOLLOW && att != MATT_ATTACK && att != MATT_FRIEND ) { return false; } @@ -1920,7 +1955,7 @@ bool monster::will_reach( const point &p ) return false; } - auto path = g->m.route( pos(), tripoint( p, posz() ), get_pathfinding_settings() ); + auto path = get_map().route( pos(), tripoint( p, posz() ), get_pathfinding_settings() ); if( path.empty() ) { return false; } @@ -1944,8 +1979,9 @@ bool monster::will_reach( const point &p ) int monster::turns_to_reach( const point &p ) { + map &here = get_map(); // HACK: This function is a(n old) temporary hack that should soon be removed - auto path = g->m.route( pos(), tripoint( p, posz() ), get_pathfinding_settings() ); + auto path = here.route( pos(), tripoint( p, posz() ), get_pathfinding_settings() ); if( path.empty() ) { return 999; } @@ -1953,7 +1989,7 @@ int monster::turns_to_reach( const point &p ) double turns = 0.; for( size_t i = 0; i < path.size(); i++ ) { const tripoint &next = path[i]; - if( g->m.impassable( next ) ) { + if( here.impassable( next ) ) { // No bashing through, it looks stupid when you go back and find // the doors intact. return 999; @@ -1970,8 +2006,9 @@ int monster::turns_to_reach( const point &p ) void monster::shove_vehicle( const tripoint &remote_destination, const tripoint &nearby_destination ) { + map &here = get_map(); if( this->has_flag( MF_PUSH_VEH ) ) { - auto vp = g->m.veh_at( nearby_destination ); + auto vp = here.veh_at( nearby_destination ); if( vp ) { vehicle &veh = vp->vehicle(); const units::mass veh_mass = veh.total_mass(); @@ -2015,10 +2052,10 @@ void monster::shove_vehicle( const tripoint &remote_destination, break; } if( shove_velocity > 0 ) { - if( g->u.sees( this->pos() ) ) { + if( get_player_character().sees( this->pos() ) ) { //~ %1$s - monster name, %2$s - vehicle name - g->u.add_msg_if_player( m_bad, _( "%1$s shoves %2$s out of their way!" ), this->disp_name(), - veh.disp_name() ); + add_msg( m_bad, _( "%1$s shoves %2$s out of their way!" ), this->disp_name(), + veh.disp_name() ); } int shove_moves = shove_veh_mass_moves_factor * veh_mass / 10_kilogram; shove_moves = std::max( shove_moves, shove_moves_minimal ); @@ -2033,10 +2070,10 @@ void monster::shove_vehicle( const tripoint &remote_destination, if( shove_destination.z != 0 ) { veh.vertical_velocity = shove_destination.z < 0 ? -shove_velocity : +shove_velocity; } - g->m.move_vehicle( veh, shove_destination, veh.face ); + here.move_vehicle( veh, shove_destination, veh.face ); } veh.move = tileray( destination_delta.xy() ); - veh.smash( g->m, shove_damage_min, shove_damage_max, 0.10F ); + veh.smash( here, shove_damage_min, shove_damage_max, 0.10F ); } } } diff --git a/src/monster.cpp b/src/monster.cpp index 06d497609c220..be92a588ef758 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -6,7 +6,6 @@ #include #include -#include "avatar.h" #include "character.h" #include "compatibility.h" #include "coordinate_conversions.h" @@ -45,7 +44,6 @@ #include "output.h" #include "overmapbuffer.h" #include "pimpl.h" -#include "player.h" #include "projectile.h" #include "rng.h" #include "sounds.h" @@ -216,6 +214,8 @@ monster::monster() biosig_timer = -1; udder_timer = calendar::turn; horde_attraction = MHA_NULL; + set_anatomy( anatomy_id( "default_anatomy" ) ); + set_body(); } monster::monster( const mtype_id &id ) : monster() @@ -435,6 +435,7 @@ void monster::try_reproduce() } } + map &here = get_map(); // add a decreasing chance of additional spawns when "catching up" an existing animal int chance = -1; while( true ) { @@ -458,9 +459,9 @@ void monster::try_reproduce() if( season_match && female && one_in( chance ) ) { int spawn_cnt = rng( 1, type->baby_count ); if( type->baby_monster ) { - g->m.add_spawn( type->baby_monster, spawn_cnt, pos() ); + here.add_spawn( type->baby_monster, spawn_cnt, pos() ); } else { - g->m.add_item_or_charges( pos(), item( type->baby_egg, *baby_timer, spawn_cnt ), true ); + here.add_item_or_charges( pos(), item( type->baby_egg, *baby_timer, spawn_cnt ), true ); } } @@ -512,6 +513,7 @@ void monster::try_biosignature() if( !biosig_timer ) { biosig_timer.emplace( calendar::turn + *type->biosig_timer ); } + map &here = get_map(); int counter = 0; while( true ) { // don't catch up too much, otherwise on some scenarios, @@ -519,7 +521,7 @@ void monster::try_biosignature() if( *biosig_timer > calendar::turn || counter > 50 ) { return; } - g->m.add_item_or_charges( pos(), item( type->biosig_item, *biosig_timer, 1 ), true ); + here.add_item_or_charges( pos(), item( type->biosig_item, *biosig_timer, 1 ), true ); *biosig_timer += *type->biosig_timer; counter += 1; } @@ -601,7 +603,7 @@ void monster::get_HP_Bar( nc_color &color, std::string &text ) const std::pair monster::get_attitude() const { - const auto att = attitude_names.at( attitude( &g->u ) ); + const auto att = attitude_names.at( attitude( &get_player_character() ) ); return { _( att.first ), all_colors.get( att.second ) @@ -659,9 +661,10 @@ int monster::print_info( const catacurses::window &w, int vStart, int vLines, in mvwprintz( w, point( column, ++vStart ), att.second, att.first ); // Awareness indicator in the third line. - std::string senses_str = sees( g->u ) ? _( "Can see to your current location" ) : + bool sees_player = sees( get_player_character() ); + std::string senses_str = sees_player ? _( "Can see to your current location" ) : _( "Can't see to your current location" ); - mvwprintz( w, point( column, ++vStart ), sees( g->u ) ? c_red : c_green, senses_str ); + mvwprintz( w, point( column, ++vStart ), sees_player ? c_red : c_green, senses_str ); // Monster description on following lines. std::vector lines = foldstring( type->get_description(), max_width ); @@ -782,8 +785,7 @@ std::string monster::extended_description() const describe_flags( _( "In fight it can %s." ), { {m_flag::MF_GRABS, pgettext( "Grab as an action", "grab" )}, {m_flag::MF_VENOM, pgettext( "Poison as an action", "poison" )}, - {m_flag::MF_PARALYZE, pgettext( "Paralyze as an action", "paralyze" )}, - {m_flag::MF_BLEED, _( "cause bleed" )} + {m_flag::MF_PARALYZE, pgettext( "Paralyze as an action", "paralyze" )} } ); if( !type->has_flag( m_flag::MF_NOHEAD ) ) { @@ -980,7 +982,7 @@ Creature *monster::attack_target() return target; } -bool monster::is_fleeing( player &u ) const +bool monster::is_fleeing( Character &u ) const { if( effect_cache[FLEEING] ) { return true; @@ -995,7 +997,7 @@ bool monster::is_fleeing( player &u ) const Creature::Attitude monster::attitude_to( const Creature &other ) const { const monster *m = other.is_monster() ? static_cast< const monster *>( &other ) : nullptr; - const player *p = other.as_player(); + const Character *p = other.as_character(); if( m != nullptr ) { if( m == this ) { return Attitude::FRIENDLY; @@ -1018,7 +1020,7 @@ Creature::Attitude monster::attitude_to( const Creature &other ) const return Attitude::HOSTILE; } } else if( p != nullptr ) { - switch( attitude( const_cast( p ) ) ) { + switch( attitude( p ) ) { case MATT_FRIEND: return Attitude::FRIENDLY; case MATT_FPASSIVE: @@ -1043,16 +1045,19 @@ monster_attitude monster::attitude( const Character *u ) const if( has_effect( effect_docile ) ) { return MATT_FPASSIVE; } - if( u == &g->u ) { - return MATT_FRIEND; - } - // Zombies don't understand not attacking NPCs, but dogs and bots should. - const npc *np = dynamic_cast< const npc * >( u ); - if( np != nullptr && np->get_attitude() != NPCATT_KILL && !type->in_species( species_ZOMBIE ) ) { - return MATT_FRIEND; - } - if( np != nullptr && np->is_hallucination() ) { - return MATT_IGNORE; + if( u != nullptr ) { + if( u->is_avatar() ) { + return MATT_FRIEND; + } + if( u->is_npc() ) { + // Zombies don't understand not attacking NPCs, but dogs and bots should. + if( u->get_attitude() != NPCATT_KILL && !type->in_species( species_ZOMBIE ) ) { + return MATT_FRIEND; + } + if( u->is_hallucination() ) { + return MATT_IGNORE; + } + } } } if( effect_cache[FLEEING] ) { @@ -1157,7 +1162,7 @@ monster_attitude monster::attitude( const Character *u ) const int monster::hp_percentage() const { - return get_hp( hp_torso ) * 100 / get_hp_max(); + return get_hp( bodypart_id( "torso" ) ) * 100 / get_hp_max(); } void monster::process_triggers() @@ -1168,8 +1173,9 @@ void monster::process_triggers() process_trigger( mon_trigger::FIRE, [this]() { int ret = 0; - for( const auto &p : g->m.points_in_radius( pos(), 3 ) ) { - ret += 5 * g->m.get_field_intensity( p, fd_fire ); + map &here = get_map(); + for( const auto &p : here.points_in_radius( pos(), 3 ) ) { + ret += 5 * here.get_field_intensity( p, fd_fire ); } return ret; } ); @@ -1357,8 +1363,9 @@ void monster::melee_attack( Creature &target, float accuracy ) return; } + Character &player_character = get_player_character(); if( target.is_player() || - ( target.is_npc() && g->u.attitude_to( target ) == Attitude::FRIENDLY ) ) { + ( target.is_npc() && player_character.attitude_to( target ) == Attitude::FRIENDLY ) ) { // Make us a valid target for a few turns add_effect( effect_hit_by_player, 3_turns ); } @@ -1367,7 +1374,7 @@ void monster::melee_attack( Creature &target, float accuracy ) add_effect( effect_run, 4_turns ); } - const bool u_see_me = g->u.sees( *this ); + const bool u_see_me = player_character.sees( *this ); damage_instance damage = !is_hallucination() ? type->melee_damage : damage_instance(); if( !is_hallucination() && type->melee_dice > 0 ) { @@ -1407,7 +1414,8 @@ void monster::melee_attack( Creature &target, float accuracy ) add_msg( m_bad, _( "The %1$s hits your %2$s." ), name(), body_part_name_accusative( dealt_dam.bp_hit ) ); } else if( target.is_npc() ) { - if( has_effect( effect_ridden ) && has_flag( MF_RIDEABLE_MECH ) && pos() == g->u.pos() ) { + if( has_effect( effect_ridden ) && has_flag( MF_RIDEABLE_MECH ) && + pos() == player_character.pos() ) { //~ %1$s: name of your mount, %2$s: target NPC name, %3$d: damage value add_msg( m_good, _( "Your %1$s hits %2$s for %3$d damage!" ), name(), target.disp_name(), total_dealt ); @@ -1418,7 +1426,8 @@ void monster::melee_attack( Creature &target, float accuracy ) body_part_name_accusative( dealt_dam.bp_hit ) ); } } else { - if( has_effect( effect_ridden ) && has_flag( MF_RIDEABLE_MECH ) && pos() == g->u.pos() ) { + if( has_effect( effect_ridden ) && has_flag( MF_RIDEABLE_MECH ) && + pos() == player_character.pos() ) { //~ %1$s: name of your mount, %2$s: target creature name, %3$d: damage value add_msg( m_good, _( "Your %1$s hits %2$s for %3$d damage!" ), get_name(), target.disp_name(), total_dealt ); @@ -1501,16 +1510,6 @@ void monster::melee_attack( Creature &target, float accuracy ) target.add_msg_if_player( m_bad, _( "You feel venom enter your body!" ) ); target.add_effect( effect_paralyzepoison, 10_minutes ); } - - if( total_dealt > 6 && stab_cut > 0 && has_flag( MF_BLEED ) ) { - // Maybe should only be if DT_CUT > 6... Balance question - if( target.is_player() || target.is_npc() ) { - target.as_character()->make_bleed( dealt_dam.bp_hit, 6_minutes ); - } else { - target.add_effect( effect_bleed, 6_minutes, dealt_dam.bp_hit->token ); - } - - } } void monster::deal_projectile_attack( Creature *source, dealt_projectile_attack &attack, @@ -1646,7 +1645,8 @@ bool monster::move_effects( bool ) return true; } - bool u_see_me = g->u.sees( *this ); + map &here = get_map(); + bool u_see_me = get_player_character().sees( *this ); if( has_effect( effect_tied ) ) { // friendly pet, will stay tied down and obey. if( friendly == -1 ) { @@ -1666,7 +1666,7 @@ bool monster::move_effects( bool ) if( u_see_me ) { add_msg( _( "The %s easily slips out of its bonds." ), name() ); } - g->m.add_item_or_charges( pos(), *tied_item ); + here.add_item_or_charges( pos(), *tied_item ); tied_item.reset(); } } else { @@ -1674,7 +1674,7 @@ bool monster::move_effects( bool ) const bool broken = rng( type->melee_dice * type->melee_sides, std::min( 10000, type->melee_dice * type->melee_sides * 250 ) ) > 800; if( !broken ) { - g->m.add_item_or_charges( pos(), *tied_item ); + here.add_item_or_charges( pos(), *tied_item ); } tied_item.reset(); if( u_see_me ) { @@ -1714,8 +1714,8 @@ bool monster::move_effects( bool ) if( has_effect( effect_lightsnare ) ) { if( x_in_y( type->melee_dice * type->melee_sides, 12 ) ) { remove_effect( effect_lightsnare ); - g->m.spawn_item( pos(), "string_36" ); - g->m.spawn_item( pos(), "snare_trigger" ); + here.spawn_item( pos(), "string_36" ); + here.spawn_item( pos(), "snare_trigger" ); if( u_see_me ) { add_msg( _( "The %s escapes the light snare!" ), name() ); } @@ -1726,8 +1726,8 @@ bool monster::move_effects( bool ) if( type->melee_dice * type->melee_sides >= 7 ) { if( x_in_y( type->melee_dice * type->melee_sides, 32 ) ) { remove_effect( effect_heavysnare ); - g->m.spawn_item( pos(), "rope_6" ); - g->m.spawn_item( pos(), "snare_trigger" ); + here.spawn_item( pos(), "rope_6" ); + here.spawn_item( pos(), "snare_trigger" ); if( u_see_me ) { add_msg( _( "The %s escapes the heavy snare!" ), name() ); } @@ -1739,7 +1739,7 @@ bool monster::move_effects( bool ) if( type->melee_dice * type->melee_sides >= 18 ) { if( x_in_y( type->melee_dice * type->melee_sides, 200 ) ) { remove_effect( effect_beartrap ); - g->m.spawn_item( pos(), "beartrap" ); + here.spawn_item( pos(), "beartrap" ); if( u_see_me ) { add_msg( _( "The %s escapes the bear trap!" ), name() ); } @@ -1984,7 +1984,7 @@ int monster::impact( const int force, const tripoint &p ) const float mod = fall_damage_mod(); int total_dealt = 0; - if( g->m.has_flag( TFLAG_SHARP, p ) ) { + if( get_map().has_flag( TFLAG_SHARP, p ) ) { const int cut_damage = std::max( 0.0f, 10 * mod - get_armor_cut( bodypart_id( "torso" ) ) ); apply_damage( nullptr, bodypart_id( "torso" ), cut_damage ); total_dealt += 10 * mod; @@ -2064,6 +2064,7 @@ void monster::decrement_summon_timer() void monster::process_turn() { + map &here = get_map(); decrement_summon_timer(); if( !is_hallucination() ) { for( const std::pair &e : type->emit_fields ) { @@ -2075,11 +2076,11 @@ void monster::process_turn() if( has_effect( effect_emp ) ) { continue; // don't emit electricity while EMPed } else if( has_effect( effect_supercharged ) ) { - g->m.emit_field( pos(), emit_id( "emit_shock_cloud_big" ) ); + here.emit_field( pos(), emit_id( "emit_shock_cloud_big" ) ); continue; } } - g->m.emit_field( pos(), emid ); + here.emit_field( pos(), emid ); } } @@ -2102,7 +2103,7 @@ void monster::process_turn() } // Persist grabs as long as there's an adjacent target. if( has_effect( effect_grabbing ) ) { - for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { + for( auto &dest : here.points_in_radius( pos(), 1, 0 ) ) { const player *const p = g->critter_at( dest ); if( p && p->has_effect( effect_grabbed ) ) { add_effect( effect_grabbing, 2_turns ); @@ -2116,12 +2117,13 @@ void monster::process_turn() sounds::sound( pos(), 5, sounds::sound_t::combat, _( "hummmmm." ), false, "humming", "electric" ); } } else { - for( const tripoint &zap : g->m.points_in_radius( pos(), 1 ) ) { - const bool player_sees = g->u.sees( zap ); - const map_stack items = g->m.i_at( zap ); + Character &player_character = get_player_character(); + for( const tripoint &zap : here.points_in_radius( pos(), 1 ) ) { + const bool player_sees = player_character.sees( zap ); + const map_stack items = here.i_at( zap ); for( const auto &item : items ) { if( item.made_of( phase_id::LIQUID ) && item.flammable() ) { // start a fire! - g->m.add_field( zap, fd_fire, 2, 1_minutes ); + here.add_field( zap, fd_fire, 2, 1_minutes ); sounds::sound( pos(), 30, sounds::sound_t::combat, _( "fwoosh!" ), false, "fire", "ignition" ); break; } @@ -2129,33 +2131,33 @@ void monster::process_turn() if( zap != pos() ) { explosion_handler::emp_blast( zap ); // Fries electronics due to the intensity of the field } - const auto t = g->m.ter( zap ); + const auto t = here.ter( zap ); if( t == ter_str_id( "t_gas_pump" ) || t == ter_str_id( "t_gas_pump_a" ) ) { if( one_in( 4 ) ) { explosion_handler::explosion( pos(), 40, 0.8, true ); if( player_sees ) { - add_msg( m_warning, _( "The %s explodes in a fiery inferno!" ), g->m.tername( zap ) ); + add_msg( m_warning, _( "The %s explodes in a fiery inferno!" ), here.tername( zap ) ); } } else { if( player_sees ) { add_msg( m_warning, _( "Lightning from %1$s engulfs the %2$s!" ), name(), - g->m.tername( zap ) ); + here.tername( zap ) ); } - g->m.add_field( zap, fd_fire, 1, 2_turns ); + here.add_field( zap, fd_fire, 1, 2_turns ); } } } if( g->weather.lightning_active && !has_effect( effect_supercharged ) && - g->m.is_outside( pos() ) ) { + here.is_outside( pos() ) ) { g->weather.lightning_active = false; // only one supercharge per strike sounds::sound( pos(), 300, sounds::sound_t::combat, _( "BOOOOOOOM!!!" ), false, "environment", "thunder_near" ); sounds::sound( pos(), 20, sounds::sound_t::combat, _( "vrrrRRRUUMMMMMMMM!" ), false, "explosion", "default" ); - if( g->u.sees( pos() ) ) { + if( player_character.sees( pos() ) ) { add_msg( m_bad, _( "Lightning strikes the %s!" ), name() ); add_msg( m_bad, _( "Your vision goes white!" ) ); - g->u.add_effect( effect_blind, rng( 1_minutes, 2_minutes ) ); + player_character.add_effect( effect_blind, rng( 1_minutes, 2_minutes ) ); } add_effect( effect_supercharged, 12_hours ); } else if( has_effect( effect_supercharged ) && calendar::once_every( 5_turns ) ) { @@ -2223,15 +2225,16 @@ void monster::die( Creature *nkiller ) if( has_effect( effect_beartrap ) ) { add_item( item( "beartrap", 0 ) ); } + map &here = get_map(); if( has_effect( effect_grabbing ) ) { remove_effect( effect_grabbing ); - for( auto &player_pos : g->m.points_in_radius( pos(), 1, 0 ) ) { + for( auto &player_pos : here.points_in_radius( pos(), 1, 0 ) ) { player *p = g->critter_at( player_pos ); if( !p || !p->has_effect( effect_grabbed ) ) { continue; } bool grabbed = false; - for( auto &mon_pos : g->m.points_in_radius( player_pos, 1, 0 ) ) { + for( auto &mon_pos : here.points_in_radius( player_pos, 1, 0 ) ) { const monster *const mon = g->critter_at( mon_pos ); if( mon && mon->has_effect( effect_grabbing ) ) { grabbed = true; @@ -2247,7 +2250,7 @@ void monster::die( Creature *nkiller ) } if( !is_hallucination() ) { for( const auto &it : inv ) { - g->m.add_item_or_charges( pos(), it ); + here.add_item_or_charges( pos(), it ); } } @@ -2255,7 +2258,7 @@ void monster::die( Creature *nkiller ) if( !is_hallucination() && has_flag( MF_QUEEN ) ) { // The submap coordinates of this monster, monster groups coordinates are // submap coordinates. - const tripoint abssub = ms_to_sm_copy( g->m.getabs( pos() ) ); + const tripoint abssub = ms_to_sm_copy( here.getabs( pos() ) ); // Do it for overmap above/below too for( const tripoint &p : points_in_radius( abssub, HALF_MAPSIZE, 1 ) ) { for( auto &mgp : overmap_buffer.groups_at( p ) ) { @@ -2298,7 +2301,7 @@ void monster::die( Creature *nkiller ) continue; } - if( g->m.sees( critter.pos(), pos(), light ) ) { + if( here.sees( critter.pos(), pos(), light ) ) { critter.morale += morale_adjust; critter.anger += anger_adjust; } @@ -2366,7 +2369,7 @@ void monster::drop_items_on_death() items = remaining; } - const auto dropped = g->m.spawn_items( pos(), items ); + const auto dropped = get_map().spawn_items( pos(), items ); if( has_flag( MF_FILTHY ) ) { for( const auto &it : dropped ) { @@ -2425,6 +2428,12 @@ void monster::process_one_effect( effect &it, bool is_new ) effect_cache[FLEEING] = true; } else if( id == effect_no_sight || id == effect_blind ) { effect_cache[VISION_IMPAIRED] = true; + } else if( id == effect_bleed && x_in_y( it.get_intensity(), it.get_max_intensity() ) ) { + // monsters are simplified so they just take damage from bleeding + apply_damage( nullptr, bodypart_id( "torso" ), 1 ); + // this is for balance only + it.mod_duration( -rng( 1_turns, it.get_int_dur_factor() / 2 ) ); + bleed(); } } @@ -2443,9 +2452,10 @@ void monster::process_effects() set_speed_bonus( min_speed_bonus ); } + Character &player_character = get_player_character(); //If this monster has the ability to heal in combat, do it now. const int healed_amount = heal( type->regenerates ); - if( healed_amount > 0 && one_in( 2 ) && g->u.sees( *this ) ) { + if( healed_amount > 0 && one_in( 2 ) && player_character.sees( *this ) ) { std::string healing_format_string; if( healed_amount >= 50 ) { healing_format_string = _( "The %s is visibly regenerating!" ); @@ -2458,10 +2468,10 @@ void monster::process_effects() } if( type->regenerates_in_dark ) { - const float light = g->m.ambient_light_at( pos() ); + const float light = get_map().ambient_light_at( pos() ); // Magic number 10000 was chosen so that a floodlight prevents regeneration in a range of 20 tiles if( heal( static_cast( 50.0 * std::exp( - light * light / 10000 ) ) > 0 && one_in( 2 ) && - g->u.sees( *this ) ) ) { + player_character.sees( *this ) ) ) { add_msg( m_warning, _( "The %s uses the darkness to regenerate." ), name() ); } } @@ -2469,7 +2479,7 @@ void monster::process_effects() //Monster will regen morale and aggression if it is on max HP //It regens more morale and aggression if is currently fleeing. if( type->regen_morale && hp >= type->hp ) { - if( is_fleeing( g->u ) ) { + if( is_fleeing( player_character ) ) { morale = type->morale; anger = type->agro; } @@ -2489,7 +2499,7 @@ void monster::process_effects() // If this critter dies in sunlight, check & assess damage. if( has_flag( MF_SUNDEATH ) && g->is_in_sunlight( pos() ) ) { - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( m_good, _( "The %s burns horribly in the sunlight!" ), name() ); } apply_damage( nullptr, bodypart_id( "torso" ), 100 ); @@ -2585,7 +2595,7 @@ bool monster::make_fungus() return false; } - if( g->u.sees( pos() ) ) { + if( get_player_character().sees( pos() ) ) { add_msg( m_info, _( "The spores transform %1$s into a %2$s!" ), old_name, name() ); } @@ -2652,7 +2662,7 @@ units::volume monster::get_volume() const void monster::add_msg_if_npc( const std::string &msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( replace_with_npc_name( msg ) ); } } @@ -2660,14 +2670,14 @@ void monster::add_msg_if_npc( const std::string &msg ) const void monster::add_msg_player_or_npc( const std::string &/*player_msg*/, const std::string &npc_msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( replace_with_npc_name( npc_msg ) ); } } void monster::add_msg_if_npc( const game_message_params ¶ms, const std::string &msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( params, replace_with_npc_name( msg ) ); } } @@ -2675,7 +2685,7 @@ void monster::add_msg_if_npc( const game_message_params ¶ms, const std::stri void monster::add_msg_player_or_npc( const game_message_params ¶ms, const std::string &/*player_msg*/, const std::string &npc_msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( params, replace_with_npc_name( npc_msg ) ); } } @@ -2814,12 +2824,13 @@ void monster::on_hit( Creature *source, bodypart_id, if( anger_adjust != 0 || morale_adjust != 0 ) { int light = g->light_level( posz() ); + map &here = get_map(); for( monster &critter : g->all_monsters() ) { if( !critter.type->same_species( *type ) ) { continue; } - if( g->m.sees( critter.pos(), pos(), light ) ) { + if( here.sees( critter.pos(), pos(), light ) ) { critter.morale += morale_adjust; critter.anger += anger_adjust; } @@ -2830,7 +2841,7 @@ void monster::on_hit( Creature *source, bodypart_id, // TODO: Faction relations } -int monster::get_hp_max( hp_part ) const +int monster::get_hp_max( const bodypart_id & ) const { return type->hp; } @@ -2840,7 +2851,7 @@ int monster::get_hp_max() const return type->hp; } -int monster::get_hp( hp_part ) const +int monster::get_hp( const bodypart_id & ) const { return hp; } @@ -2916,7 +2927,7 @@ bool monster::will_join_horde( int size ) return false; } else if( mha == MHA_ALWAYS ) { return true; - } else if( g->m.has_flag( TFLAG_INDOORS, pos() ) && ( mha == MHA_OUTDOORS || + } else if( get_map().has_flag( TFLAG_INDOORS, pos() ) && ( mha == MHA_OUTDOORS || mha == MHA_OUTDOORS_AND_LARGE ) ) { return false; } else if( size < 3 && ( mha == MHA_LARGE || mha == MHA_OUTDOORS_AND_LARGE ) ) { diff --git a/src/monster.h b/src/monster.h index 2ff3ea14af18c..418bddec9373c 100644 --- a/src/monster.h +++ b/src/monster.h @@ -95,6 +95,13 @@ class monster : public Creature bool is_monster() const override { return true; } + monster *as_monster() override { + return this; + } + const monster *as_monster() const override { + return this; + } + void poly( const mtype_id &id ); bool can_upgrade(); @@ -110,9 +117,9 @@ class monster : public Creature units::mass get_weight() const override; units::mass weight_capacity() const override; units::volume get_volume() const; - int get_hp( hp_part ) const override; + int get_hp( const bodypart_id & ) const override; int get_hp() const override; - int get_hp_max( hp_part ) const override; + int get_hp_max( const bodypart_id & ) const override; int get_hp_max() const override; int hp_percentage() const override; @@ -288,7 +295,7 @@ class monster : public Creature void knock_back_to( const tripoint &to ) override; // Combat - bool is_fleeing( player &u ) const; // True if we're fleeing + bool is_fleeing( Character &u ) const; monster_attitude attitude( const Character *u = nullptr ) const; // See the enum above Attitude attitude_to( const Creature &other ) const override; void process_triggers(); // Process things that anger/scare us diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 0cee9fdacbe01..23f8aef98bab1 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -84,7 +84,6 @@ std::string enum_to_string( m_flag data ) case MF_VENOM: return "VENOM"; case MF_BADVENOM: return "BADVENOM"; case MF_PARALYZE: return "PARALYZEVENOM"; - case MF_BLEED: return "BLEED"; case MF_WEBWALK: return "WEBWALK"; case MF_DIGS: return "DIGS"; case MF_CAN_DIG: return "CAN_DIG"; diff --git a/src/mtype.h b/src/mtype.h index 1cfa99b46a2ed..d38234fa0f9ba 100644 --- a/src/mtype.h +++ b/src/mtype.h @@ -81,7 +81,6 @@ enum m_flag : int { MF_VENOM, // Attack may poison the player MF_BADVENOM, // Attack may SEVERELY poison the player MF_PARALYZE, // Attack may paralyze the player with venom - MF_BLEED, // Causes player to bleed MF_WEBWALK, // Doesn't destroy webs MF_DIGS, // Digs through the ground MF_CAN_DIG, // Can dig and walk diff --git a/src/mutation.cpp b/src/mutation.cpp index 137b6b0158bb4..0f5080298b279 100644 --- a/src/mutation.cpp +++ b/src/mutation.cpp @@ -151,7 +151,7 @@ void Character::set_mutation( const trait_id &trait ) cached_mutations.push_back( &trait.obj() ); mutation_effect( trait ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); } void Character::unset_mutation( const trait_id &trait_ ) @@ -170,7 +170,7 @@ void Character::unset_mutation( const trait_id &trait_ ) my_mutations.erase( iter ); mutation_loss_effect( trait ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); } void Character::switch_mutations( const trait_id &switched, const trait_id &target, @@ -402,7 +402,7 @@ void Character::mutation_effect( const trait_id &mut ) _( "Your %s is pushed off!" ), _( "'s %s is pushed off!" ), armor.tname() ); - g->m.add_item_or_charges( pos(), armor ); + get_map().add_item_or_charges( pos(), armor ); } return true; } ); @@ -608,7 +608,7 @@ void Character::activate_mutation( const trait_id &mut ) } if( mut == trait_WEB_WEAVER ) { - g->m.add_field( pos(), fd_web, 1 ); + get_map().add_field( pos(), fd_web, 1 ); add_msg_if_player( _( "You start spinning web with your spinnerets!" ) ); } else if( mut == trait_BURROW ) { tdata.powered = false; @@ -668,8 +668,9 @@ void Character::activate_mutation( const trait_id &mut ) } // Check for adjacent trees. bool adjacent_tree = false; - for( const tripoint &p2 : g->m.points_in_radius( pos(), 1 ) ) { - if( g->m.has_flag( "TREE", p2 ) ) { + map &here = get_map(); + for( const tripoint &p2 : here.points_in_radius( pos(), 1 ) ) { + if( here.has_flag( "TREE", p2 ) ) { adjacent_tree = true; } } @@ -718,7 +719,7 @@ void Character::activate_mutation( const trait_id &mut ) return; } else if( !mdata.ranged_mutation.is_empty() ) { add_msg_if_player( mdata.ranged_mutation_message() ); - avatar_action::fire_ranged_mutation( g->u, item( mdata.ranged_mutation ) ); + avatar_action::fire_ranged_mutation( *this, item( mdata.ranged_mutation ) ); tdata.powered = false; return; } @@ -1431,7 +1432,7 @@ static mutagen_rejection try_reject_mutagen( Character &guy, const item &it, boo if( guy.has_trait( trait_M_SPORES ) || guy.has_trait( trait_M_FERTILE ) || guy.has_trait( trait_M_BLOSSOMS ) || guy.has_trait( trait_M_BLOOM ) ) { guy.add_msg_if_player( m_good, _( "We decontaminate it with spores." ) ); - g->m.ter_set( guy.pos(), t_fungus ); + get_map().ter_set( guy.pos(), t_fungus ); if( guy.is_avatar() ) { g->memorial().add( pgettext( "memorial_male", "Destroyed a harmful invader." ), diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index fc05a757fb91a..fb035bf7172b0 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -45,6 +45,7 @@ #include "pldata.h" #include "popup.h" #include "profession.h" +#include "proficiency.h" #include "recipe.h" #include "recipe_dictionary.h" #include "rng.h" @@ -367,6 +368,7 @@ void avatar::randomize( const bool random_scenario, points_left &points, bool pl } loops++; } + set_body(); } void avatar::add_profession_items() @@ -434,6 +436,9 @@ bool avatar::create( character_type type, const std::string &tempname ) if( !load_template( tempname, points ) ) { return false; } + // TEMPORARY until 0.F + set_all_parts_hp_to_max(); + // We want to prevent recipes known by the template from being applied to the // new character. The recipe list will be rebuilt when entering the game. // Except if it is a character transfer template @@ -450,7 +455,7 @@ bool avatar::create( character_type type, const std::string &tempname ) "Saving will override the already existing character.\n\n" "Continue anyways?" ), name ); }; - + set_body(); const bool allow_reroll = type == character_type::RANDOM; tab_direction result = tab_direction::QUIT; do { @@ -526,9 +531,6 @@ bool avatar::create( character_type type, const std::string &tempname ) save_template( _( "Last Character" ), points ); recalc_hp(); - for( int i = 0; i < num_hp_parts; i++ ) { - hp_cur[i] = hp_max[i]; - } if( has_trait( trait_SMELLY ) ) { scent = 800; @@ -541,7 +543,7 @@ bool avatar::create( character_type type, const std::string &tempname ) // Grab the skills from the profession, if there are any // We want to do this before the recipes - for( auto &e : prof->skills() ) { + for( const profession::StartingSkill &e : prof->skills() ) { mod_skill_level( e.first, e.second ); } @@ -584,12 +586,16 @@ bool avatar::create( character_type type, const std::string &tempname ) addictions.push_back( iter ); } - for( auto &bio : prof->CBMs() ) { + for( const bionic_id &bio : prof->CBMs() ) { add_bionic( bio ); } // Adjust current energy level to maximum set_power_level( get_max_power_level() ); + for( const proficiency_id &pri : prof->proficiencies() ) { + add_proficiency( pri ); + } + for( const trait_id &t : get_base_traits() ) { std::vector styles; for( const matype_id &s : t->initial_ma_styles ) { @@ -850,7 +856,8 @@ tab_direction set_stats( avatar &u, points_left &points ) _( "Increasing Str further costs 2 points." ) ); } u.recalc_hp(); - mvwprintz( w_description, point_zero, COL_STAT_NEUTRAL, _( "Base HP: %d" ), u.hp_max[0] ); + mvwprintz( w_description, point_zero, COL_STAT_NEUTRAL, _( "Base HP: %d" ), + u.get_part_hp_max( bodypart_id( "head" ) ) ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w_description, point( 0, 1 ), COL_STAT_NEUTRAL, _( "Carry weight: %.1f %s" ), convert_weight( u.weight_capacity() ), weight_units() ); @@ -1369,6 +1376,7 @@ tab_direction set_profession( avatar &u, points_left &points, ctxt.register_action( "HELP_KEYBINDINGS" ); ctxt.register_action( "FILTER" ); ctxt.register_action( "QUIT" ); + ctxt.register_action( "RANDOMIZE" ); bool recalc_profs = true; int profs_length = 0; @@ -1550,6 +1558,17 @@ tab_direction set_profession( avatar &u, points_left &points, } } } + // Proficiencies + const std::string newline = "\n"; + std::vector prof_proficiencies = sorted_profs[cur_id]->proficiencies(); + buffer += colorize( _( "Profession proficiencies:" ), c_light_blue ) + newline; + if( prof_proficiencies.empty() ) { + buffer += pgettext( "Profession has no proficiencies", "None" ) + newline; + } else { + for( const proficiency_id &prof : prof_proficiencies ) { + buffer += prof->name() + newline; + } + } // Profession pet if( !sorted_profs[cur_id]->pets().empty() ) { buffer += colorize( _( "Pets:" ), c_light_blue ) + "\n"; @@ -1689,6 +1708,8 @@ tab_direction set_profession( avatar &u, points_left &points, recalc_profs = true; } else if( action == "QUIT" && query_yn( _( "Return to main menu?" ) ) ) { retval = tab_direction::QUIT; + } else if( action == "RANDOMIZE" ) { + cur_id = rng( 0, profs_length - 1 ); } } while( retval == tab_direction::NONE ); @@ -1990,6 +2011,7 @@ tab_direction set_scenario( avatar &u, points_left &points, ctxt.register_action( "HELP_KEYBINDINGS" ); ctxt.register_action( "FILTER" ); ctxt.register_action( "QUIT" ); + ctxt.register_action( "RANDOMIZE" ); bool recalc_scens = true; int scens_length = 0; @@ -2181,8 +2203,7 @@ tab_direction set_scenario( avatar &u, points_left &points, wprintz( w_flags, c_light_gray, _( "Fungal infected player" ) ); wprintz( w_flags, c_light_gray, ( "\n" ) ); } - if( get_option( "STARTING_NPC" ) == "scenario" && - sorted_scens[cur_id]->has_flag( "LONE_START" ) ) { + if( sorted_scens[cur_id]->has_flag( "LONE_START" ) ) { wprintz( w_flags, c_light_gray, _( "No starting NPC" ) ); wprintz( w_flags, c_light_gray, ( "\n" ) ); } @@ -2280,6 +2301,8 @@ tab_direction set_scenario( avatar &u, points_left &points, recalc_scens = true; } else if( action == "QUIT" && query_yn( _( "Return to main menu?" ) ) ) { retval = tab_direction::QUIT; + } else if( action == "RANDOMIZE" ) { + cur_id = rng( 0, scens_length - 1 ); } } while( retval == tab_direction::NONE ); @@ -2551,15 +2574,15 @@ tab_direction set_description( avatar &you, const bool allow_reroll, } wnoutrefresh( w_guide ); - //We draw this stuff every loop because this is user-editable + wclear( w_name ); mvwprintz( w_name, point_zero, current_selector == char_creation::NAME ? h_light_gray : c_light_gray, _( "Name:" ) ); if( no_name_entered ) { - mvwprintz( w_name, point( namebar_pos, 0 ), h_light_gray, _( "_______NO NAME ENTERED!_______" ) ); + mvwprintz( w_name, point( namebar_pos, 0 ), h_light_gray, _( "--- NO NAME ENTERED ---" ) ); + } else if( you.name.empty() ) { + mvwprintz( w_name, point( namebar_pos, 0 ), c_light_gray, _( "--- RANDOM NAME ---" ) ); } else { - mvwprintz( w_name, point( namebar_pos, 0 ), c_light_gray, "_______________________________" ); mvwprintz( w_name, point( namebar_pos, 0 ), c_white, you.name ); - wprintz( w_name, h_light_gray, "_" ); } if( !MAP_SHARING::isSharing() ) { // no random names when sharing maps @@ -2811,7 +2834,7 @@ tab_direction set_description( avatar &you, const bool allow_reroll, .only_digits( true ); const int result = popup.query_int(); if( result != 0 ) { - you.set_base_age( clamp( popup.query_int(), 16, 55 ) ); + you.set_base_age( clamp( result, 16, 55 ) ); } break; } @@ -2821,40 +2844,33 @@ tab_direction set_description( avatar &you, const bool allow_reroll, .only_digits( true ); const int result = popup.query_int(); if( result != 0 ) { - you.set_base_height( clamp( popup.query_int(), 145, 200 ) ); + you.set_base_height( clamp( result, 145, 200 ) ); } break; } case char_creation::BLOOD: { - popup.title( _( "Enter blood type (omit Rh):" ) ) - .text( io::enum_to_string( you.my_blood_type ) ) - .only_digits( false ); - std::string answer = popup.query_string(); - if( answer == "O" || answer == "o" || answer == "0" ) { - you.my_blood_type = blood_type::blood_O; - } else if( answer == "A" || answer == "a" ) { - you.my_blood_type = blood_type::blood_A; - } else if( answer == "B" || answer == "b" ) { - you.my_blood_type = blood_type::blood_B; - } else if( answer == "AB" || answer == "ab" ) { - you.my_blood_type = blood_type::blood_AB; - } else { - popup_getkey( "%s", _( "Invalid blood type." ) ); + uilist btype; + btype.text = _( "Select blood type" ); + btype.addentry( static_cast( blood_type::blood_O ), true, '1', "O" ); + btype.addentry( static_cast( blood_type::blood_A ), true, '2', "A" ); + btype.addentry( static_cast( blood_type::blood_B ), true, '3', "B" ); + btype.addentry( static_cast( blood_type::blood_AB ), true, '4', "AB" ); + btype.query(); + if( btype.ret < 0 ) { break; } - string_input_popup popup2; - popup2.title( _( "Enter Rh factor:" ) ) - .text( you.blood_rh_factor ? "+" : "-" ) - .only_digits( false ); - answer = popup2.query_string(); - if( answer == "+" || answer == "plus" || answer == "positive" ) { - you.blood_rh_factor = true; - } else if( answer == "-" || answer == "minus" || answer == "negative" ) { - you.blood_rh_factor = false; - } else { - popup_getkey( "%s", _( "Invalid blood type." ) ); + + uilist bfac; + bfac.text = _( "Select Rh factor" ); + bfac.addentry( 0, true, '-', _( "negative" ) ); + bfac.addentry( 1, true, '+', _( "positive" ) ); + bfac.query(); + if( bfac.ret < 0 ) { break; } + + you.my_blood_type = static_cast( btype.ret ); + you.blood_rh_factor = static_cast( bfac.ret ); break; } } @@ -2907,8 +2923,8 @@ void Character::add_traits() void Character::add_traits( points_left &points ) { - // TODO: get rid of using g->u here, use `this` instead - for( const trait_id &tr : g->u.prof->get_locked_traits() ) { + // TODO: get rid of using get_avatar() here, use `this` instead + for( const trait_id &tr : get_avatar().prof->get_locked_traits() ) { if( !has_trait( tr ) ) { toggle_trait( tr ); } else { diff --git a/src/npc.cpp b/src/npc.cpp index 24a314a15704a..d0c76c456fa4f 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -185,15 +185,14 @@ standard_npc::standard_npc( const std::string &name, const tripoint &pos, int_cur = std::max( s_int, 0 ); int_max = std::max( s_int, 0 ); + set_body(); recalc_hp(); - for( int i = 0; i < num_hp_parts; i++ ) { - hp_cur[i] = hp_max[i]; - } - for( auto &e : Skill::skills ) { + + for( const Skill &e : Skill::skills ) { set_skill_level( e.ident(), std::max( sk_lvl, 0 ) ); } - for( const auto &e : clothing ) { + for( const std::string &e : clothing ) { wear_item( item( e ), false ); } @@ -417,10 +416,9 @@ void npc::randomize( const npc_class_id &type ) //players will vastly outclass npcs in trade without a little help. mod_skill_level( skill_barter, rng( 2, 4 ) ); + set_body(); recalc_hp(); - for( int i = 0; i < num_hp_parts; i++ ) { - hp_cur[i] = hp_max[i]; - } + starting_weapon( myclass ); starting_clothes( *this, myclass, male ); starting_inv( *this, myclass ); @@ -754,7 +752,7 @@ void npc::place_on_map() return; } - for( const tripoint &p : closest_tripoints_first( pos(), SEEX + 1 ) ) { + for( const tripoint &p : closest_points_first( pos(), SEEX + 1 ) ) { if( g->is_empty( p ) ) { setpos( p ); return; @@ -911,7 +909,8 @@ void npc::finish_read( item &book ) const skill_id &skill = reading->skill; // NPCs don't need to identify the book or learn recipes yet. // NPCs don't read to other NPCs yet. - const bool display_messages = my_fac->id == faction_id( "your_followers" ) && g->u.sees( pos() ); + const bool display_messages = my_fac->id == faction_id( "your_followers" ) && + get_player_character().sees( pos() ); bool continuous = false; //whether to continue reading or not if( book_fun_for( book, *this ) != 0 ) { @@ -1030,7 +1029,7 @@ void npc::do_npc_read() } item &chosen = *loc.obtain( *ch ); if( can_read( chosen, fail_reasons ) ) { - if( g->u.sees( pos() ) ) { + if( get_player_character().sees( pos() ) ) { add_msg( m_info, _( "%s starts reading." ), disp_name() ); } start_read( chosen, pl ); @@ -1056,11 +1055,9 @@ bool npc::wear_if_wanted( const item &it, std::string &reason ) // Splints ignore limits, but only when being equipped on a broken part // TODO: Drop splints when healed if( it.has_flag( "SPLINT" ) ) { - for( int i = 0; i < num_hp_parts; i++ ) { - hp_part hpp = static_cast( i ); - body_part bp = player::hp_to_bp( hpp ); - if( is_limb_broken( hpp ) && !has_effect( effect_mending, bp ) && - it.covers( convert_bp( bp ).id() ) ) { + for( const bodypart_id &bp : get_all_body_parts( true ) ) { + if( is_limb_broken( bp ) && !has_effect( effect_mending, bp->token ) && + it.covers( bp ) ) { reason = _( "Thanks, I'll wear that now." ); return !!wear_item( it, false ); } @@ -1092,8 +1089,7 @@ bool npc::wear_if_wanted( const item &it, std::string &reason ) auto iter = std::find_if( worn.begin(), worn.end(), [bp]( const item & armor ) { return armor.covers( bp ); } ); - if( iter != worn.end() && !( is_limb_broken( bp_to_hp( bp->token ) ) && - iter->has_flag( "SPLINT" ) ) ) { + if( iter != worn.end() && !( is_limb_broken( bp ) && iter->has_flag( "SPLINT" ) ) ) { took_off = takeoff( *iter ); break; } @@ -1111,9 +1107,10 @@ bool npc::wear_if_wanted( const item &it, std::string &reason ) void npc::stow_item( item &it ) { + bool avatar_sees = get_player_character().sees( pos() ); if( wear_item( weapon, false ) ) { // Wearing the item was successful, remove weapon and post message. - if( g->u.sees( pos() ) ) { + if( avatar_sees ) { add_msg_if_npc( m_info, _( " wears the %s." ), weapon.tname() ); } remove_weapon(); @@ -1124,7 +1121,7 @@ void npc::stow_item( item &it ) } for( auto &e : worn ) { if( e.can_holster( it ) ) { - if( g->u.sees( pos() ) ) { + if( avatar_sees ) { //~ %1$s: weapon name, %2$s: holster name add_msg_if_npc( m_info, _( " puts away the %1$s in the %2$s." ), weapon.tname(), e.tname() ); @@ -1135,16 +1132,16 @@ void npc::stow_item( item &it ) } } if( volume_carried() + weapon.volume() <= volume_capacity() ) { - if( g->u.sees( pos() ) ) { + if( avatar_sees ) { add_msg_if_npc( m_info, _( " puts away the %s." ), weapon.tname() ); } i_add( remove_weapon() ); moves -= 15; } else { // No room for weapon, so we drop it - if( g->u.sees( pos() ) ) { + if( avatar_sees ) { add_msg_if_npc( m_info, _( " drops the %s." ), weapon.tname() ); } - g->m.add_item_or_charges( pos(), remove_weapon() ); + get_map().add_item_or_charges( pos(), remove_weapon() ); } } @@ -1188,7 +1185,7 @@ bool npc::wield( item &it ) g->events().send( getID(), weapon.typeId() ); - if( g->u.sees( pos() ) ) { + if( get_player_character().sees( pos() ) ) { add_msg_if_npc( m_info, _( " wields a %s." ), weapon.tname() ); } invalidate_range_cache(); @@ -1241,11 +1238,13 @@ void npc::form_opinion( const player &u ) op_of_u.fear -= 1; } - for( int i = 0; i < num_hp_parts; i++ ) { - if( u.hp_cur[i] <= u.hp_max[i] / 2 ) { + for( const std::pair &elem : get_body() ) { + const int hp_max = elem.second.get_hp_max(); + const int hp_cur = elem.second.get_hp_cur(); + if( hp_cur <= hp_max / 2 ) { op_of_u.fear--; } - if( hp_cur[i] <= hp_max[i] / 2 ) { + if( hp_cur <= hp_max / 2 ) { op_of_u.fear++; } } @@ -1306,8 +1305,8 @@ void npc::form_opinion( const player &u ) // VALUE op_of_u.value = 0; - for( int i = 0; i < num_hp_parts; i++ ) { - if( hp_cur[i] < hp_max[i] * 0.8f ) { + for( const std::pair &elem : get_body() ) { + if( elem.second.get_hp_cur() < elem.second.get_hp_max() * 0.8f ) { op_of_u.value++; } } @@ -1340,7 +1339,7 @@ void npc::mutiny() if( !my_fac || !is_player_ally() ) { return; } - const bool seen = g->u.sees( pos() ); + const bool seen = get_player_character().sees( pos() ); if( seen ) { add_msg( m_bad, _( "%s is tired of your incompetent leadership and abuse!" ), disp_name() ); } @@ -1371,7 +1370,7 @@ float npc::vehicle_danger( int radius ) const { const tripoint from( posx() - radius, posy() - radius, posz() ); const tripoint to( posx() + radius, posy() + radius, posz() ); - VehicleList vehicles = g->m.get_vehicles( from, to ); + VehicleList vehicles = get_map().get_vehicles( from, to ); int danger = 0; @@ -1480,6 +1479,25 @@ std::vector npc::styles_offered_to( const player &p ) const return p.martial_arts_data.get_unknown_styles( martial_arts_data ); } +std::vector npc::spells_offered_to( player &p ) +{ + std::vector teachable; + for( const spell_id &sp : magic.spells() ) { + const spell &teacher_spell = magic.get_spell( sp ); + if( p.magic.can_learn_spell( p, sp ) ) { + if( p.magic.knows_spell( sp ) ) { + const spell &student_spell = p.magic.get_spell( sp ); + if( student_spell.is_max_level() || + student_spell.get_level() >= teacher_spell.get_level() ) { + continue; + } + } + teachable.emplace_back( sp ); + } + } + return teachable; +} + void npc::decide_needs() { double needrank[num_needs]; @@ -1542,13 +1560,14 @@ void npc::decide_needs() void npc::say( const std::string &line, const sounds::sound_t spriority ) const { std::string formatted_line = line; - parse_tags( formatted_line, g->u, *this ); + Character &player_character = get_player_character(); + parse_tags( formatted_line, player_character, *this ); if( has_trait( trait_MUTE ) ) { return; } std::string sound = string_format( _( "%1$s saying \"%2$s\"" ), name, formatted_line ); - if( g->u.sees( *this ) && g->u.is_deaf() ) { + if( player_character.sees( *this ) && player_character.is_deaf() ) { add_msg( m_warning, _( "%1$s says something but you can't hear it!" ), name ); } // Hallucinations don't make noise when they speak @@ -1954,7 +1973,7 @@ bool npc::has_faction_relationship( const player &p, const npc_factions::relatio return my_fac->has_relationship( p_fac->id, flag ); } -bool npc::is_ally( const player &p ) const +bool npc::is_ally( const Character &p ) const { if( p.getID() == getID() ) { return true; @@ -1978,7 +1997,8 @@ bool npc::is_ally( const player &p ) const return true; } if( faction_api_version < 2 ) { - if( is_ally( g->u ) && guy.is_ally( g->u ) ) { + Character &player_character = get_player_character(); + if( is_ally( player_character ) && guy.is_ally( player_character ) ) { return true; } else if( get_attitude_group( get_attitude() ) == guy.get_attitude_group( guy.get_attitude() ) ) { @@ -1991,10 +2011,10 @@ bool npc::is_ally( const player &p ) const bool npc::is_player_ally() const { - return is_ally( g->u ); + return is_ally( get_player_character() ); } -bool npc::is_friendly( const player &p ) const +bool npc::is_friendly( const Character &p ) const { return is_ally( p ) || ( p.is_player() && ( is_walking_with() || is_player_ally() ) ); } @@ -2014,7 +2034,7 @@ bool npc::is_walking_with() const return attitude == NPCATT_FOLLOW || attitude == NPCATT_LEAD || attitude == NPCATT_WAIT; } -bool npc::is_obeying( const player &p ) const +bool npc::is_obeying( const Character &p ) const { return ( p.is_player() && is_walking_with() && is_player_ally() ) || ( is_ally( p ) && is_stationary( true ) ); @@ -2090,14 +2110,15 @@ Creature::Attitude npc::attitude_to( const Creature &other ) const } } + Character &player_character = get_player_character(); if( is_player_ally() ) { // Friendly NPCs share player's alliances - return g->u.attitude_to( other ); + return player_character.attitude_to( other ); } if( other.is_npc() ) { // Hostile NPCs are also hostile towards player's allies - if( is_enemy() && other.attitude_to( g->u ) == Attitude::FRIENDLY ) { + if( is_enemy() && other.attitude_to( player_character ) == Attitude::FRIENDLY ) { return Attitude::HOSTILE; } @@ -2135,7 +2156,7 @@ void npc::npc_dismount() return; } cata::optional pnt; - for( const auto &elem : g->m.points_in_radius( pos(), 1 ) ) { + for( const auto &elem : get_map().points_in_radius( pos(), 1 ) ) { if( g->is_empty( elem ) ) { pnt = elem; break; @@ -2202,11 +2223,13 @@ bool npc::is_active() const int npc::follow_distance() const { + Character &player_character = get_player_character(); + map &here = get_map(); // HACK: If the player is standing on stairs, follow closely // This makes the stair hack less painful to use if( is_walking_with() && - ( g->m.has_flag( TFLAG_GOES_DOWN, g->u.pos() ) || - g->m.has_flag( TFLAG_GOES_UP, g->u.pos() ) ) ) { + ( here.has_flag( TFLAG_GOES_DOWN, player_character.pos() ) || + here.has_flag( TFLAG_GOES_UP, player_character.pos() ) ) ) { return 1; } // Uses ally_rule follow_distance_2 to determine if should follow by 2 or 4 tiles @@ -2214,7 +2237,7 @@ int npc::follow_distance() const return 2; } // If NPC doesn't see player, change follow distance to 2 - if( !sees( g->u ) ) { + if( !sees( player_character ) ) { return 2; } return 4; @@ -2256,15 +2279,16 @@ int npc::print_info( const catacurses::window &w, int line, int vLines, int colu trim_and_print( w, point( column + bar.first.length() + 1, line ), iWidth, basic_symbol_color(), name ); + Character &player_character = get_player_character(); // Hostility indicator in the second line. - Attitude att = attitude_to( g->u ); + Attitude att = attitude_to( player_character ); const std::pair res = Creature::get_attitude_ui_data( att ); mvwprintz( w, point( column, ++line ), res.second, res.first.translated() ); // Awareness indicator on the third line. - std::string senses_str = sees( g->u ) ? _( "Aware of your presence" ) : + std::string senses_str = sees( player_character ) ? _( "Aware of your presence" ) : _( "Unaware of you" ); - mvwprintz( w, point( column, ++line ), sees( g->u ) ? c_yellow : c_green, senses_str ); + mvwprintz( w, point( column, ++line ), sees( player_character ) ? c_yellow : c_green, senses_str ); // Print what item the NPC is holding if any on the fourth line. if( is_armed() ) { @@ -2291,8 +2315,8 @@ int npc::print_info( const catacurses::window &w, int line, int vLines, int colu // 3 perception and 3 distance would see all mutations - cap 0 // 3 perception and 15 distance - cap 5, some mutations visible // 3 perception and 20 distance would be barely able to discern huge antlers on a person - cap 10 - const int per = g->u.get_per(); - const int dist = rl_dist( g->u.pos(), pos() ); + const int per = player_character.get_per(); + const int dist = rl_dist( player_character.pos(), pos() ); int visibility_cap; if( per <= 1 ) { visibility_cap = INT_MAX; @@ -2477,7 +2501,7 @@ void npc::die( Creature *nkiller ) // Need to unboard from vehicle before dying, otherwise // the vehicle code cannot find us if( in_vehicle ) { - g->m.unboard_vehicle( pos(), true ); + get_map().unboard_vehicle( pos(), true ); } if( is_mounted() ) { monster *critter = mounted_creature.get(); @@ -2500,14 +2524,15 @@ void npc::die( Creature *nkiller ) dead = true; Character::die( nkiller ); + Character &player_character = get_player_character(); if( is_hallucination() ) { - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "%s disappears." ), name.c_str() ); } return; } - if( g->u.sees( *this ) ) { + if( player_character.sees( *this ) ) { add_msg( _( "%s dies!" ), name ); } @@ -2515,15 +2540,15 @@ void npc::die( Creature *nkiller ) g->events().send( ch->getID(), getID(), get_name() ); } - if( killer == &g->u && ( !guaranteed_hostile() || hit_by_player ) ) { - bool cannibal = g->u.has_trait( trait_CANNIBAL ); - bool psycho = g->u.has_trait( trait_PSYCHOPATH ); - if( g->u.has_trait( trait_SAPIOVORE ) || psycho ) { + if( killer == &player_character && ( !guaranteed_hostile() || hit_by_player ) ) { + bool cannibal = player_character.has_trait( trait_CANNIBAL ); + bool psycho = player_character.has_trait( trait_PSYCHOPATH ); + if( player_character.has_trait( trait_SAPIOVORE ) || psycho ) { // No morale effect } else if( cannibal ) { - g->u.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours ); + player_character.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours ); } else { - g->u.add_morale( MORALE_KILLED_INNOCENT, -100, 0, 2_days, 3_hours ); + player_character.add_morale( MORALE_KILLED_INNOCENT, -100, 0, 2_days, 3_hours ); } } @@ -2626,7 +2651,7 @@ void npc::add_msg_if_npc( const std::string &msg ) const void npc::add_msg_player_or_npc( const std::string &/*player_msg*/, const std::string &npc_msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( replace_with_npc_name( npc_msg ) ); } } @@ -2640,7 +2665,7 @@ void npc::add_msg_player_or_npc( const game_message_params ¶ms, const std::string &/*player_msg*/, const std::string &npc_msg ) const { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( params, replace_with_npc_name( npc_msg ) ); } } @@ -2725,14 +2750,15 @@ void npc::on_load() // Not necessarily true, but it's not a bad idea to set this has_new_items = true; + map &here = get_map(); // for spawned npcs - if( g->m.has_flag( "UNSTABLE", pos() ) ) { + if( here.has_flag( "UNSTABLE", pos() ) ) { add_effect( effect_bouldering, 1_turns, num_bp, true ); } else if( has_effect( effect_bouldering ) ) { remove_effect( effect_bouldering ); } - if( g->m.veh_at( pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) && !in_vehicle ) { - g->m.board_vehicle( pos(), this ); + if( here.veh_at( pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) && !in_vehicle ) { + here.board_vehicle( pos(), this ); } if( has_effect( effect_riding ) && !mounted_creature ) { if( const monster *const mon = g->critter_at( pos() ) ) { @@ -2804,7 +2830,7 @@ bool npc::dispose_item( item_location &&obj, const std::string & ) if( opts.empty() ) { // Drop it - g->m.add_item_or_charges( pos(), *obj ); + get_map().add_item_or_charges( pos(), *obj ); obj.remove_item(); return true; } @@ -2905,7 +2931,7 @@ bool npc::will_accept_from_player( const item &it ) const return false; } - if( is_minion() || g->u.has_trait( trait_DEBUG_MIND_CONTROL ) || + if( is_minion() || get_player_character().has_trait( trait_DEBUG_MIND_CONTROL ) || it.has_flag( flag_NPC_SAFE ) ) { return true; } @@ -2952,16 +2978,17 @@ std::set npc::get_path_avoid() const // TODO: Cache this somewhere ret.insert( critter.pos() ); } + map &here = get_map(); if( rules.has_flag( ally_rule::avoid_doors ) ) { - for( const tripoint &p : g->m.points_in_radius( pos(), 30 ) ) { - if( g->m.open_door( p, true, true ) ) { + for( const tripoint &p : here.points_in_radius( pos(), 30 ) ) { + if( here.open_door( p, true, true ) ) { ret.insert( p ); } } } if( rules.has_flag( ally_rule::hold_the_line ) ) { - for( const tripoint &p : g->m.points_in_radius( g->u.pos(), 1 ) ) { - if( g->m.close_door( p, true, true ) || g->m.move_cost( p ) > 2 ) { + for( const tripoint &p : here.points_in_radius( get_player_character().pos(), 1 ) ) { + if( here.close_door( p, true, true ) || here.move_cost( p ) > 2 ) { ret.insert( p ); } } @@ -3176,7 +3203,7 @@ void npc::set_attitude( npc_attitude new_attitude ) name, npc_attitude_id( attitude ), npc_attitude_id( new_attitude ) ); attitude_group new_group = get_attitude_group( new_attitude ); attitude_group old_group = get_attitude_group( attitude ); - if( new_group != old_group && !is_fake() && g->u.sees( *this ) ) { + if( new_group != old_group && !is_fake() && get_player_character().sees( *this ) ) { switch( new_group ) { case attitude_group::hostile: add_msg_if_npc( m_bad, _( " gets angry!" ) ); @@ -3337,3 +3364,28 @@ int npc::get_thirst() const { return Character::get_thirst() - units::to_milliliter( stomach.get_water() ) / 5; } + +std::string npc::describe_mission() const +{ + switch( mission ) { + case NPC_MISSION_SHELTER: + return string_format( _( "I'm holing up here for safety. Long term, %s" ), + myclass.obj().get_job_description() ); + case NPC_MISSION_SHOPKEEP: + return _( "I run the shop here." ); + case NPC_MISSION_GUARD: + case NPC_MISSION_GUARD_ALLY: + case NPC_MISSION_GUARD_PATROL: + return string_format( _( "Currently, I'm guarding this location. Overall, %s" ), + myclass.obj().get_job_description() ); + case NPC_MISSION_ACTIVITY: + return string_format( _( "Right now, I'm . In general, %s" ), + myclass.obj().get_job_description() ); + case NPC_MISSION_TRAVELLING: + case NPC_MISSION_NULL: + return myclass.obj().get_job_description(); + default: + return string_format( "ERROR: Someone forgot to code an npc_mission text for " + "mission: %d.", static_cast( mission ) ); + } // switch (mission) +} diff --git a/src/npc.h b/src/npc.h index 48136e010532d..2fd39689e78ab 100644 --- a/src/npc.h +++ b/src/npc.h @@ -853,6 +853,7 @@ class npc : public player int print_info( const catacurses::window &w, int line, int vLines, int column ) const override; std::string opinion_text() const; int faction_display( const catacurses::window &fac_w, int width ) const; + std::string describe_mission() const; // Interaction with the player void form_opinion( const player &u ); @@ -882,23 +883,28 @@ class npc : public player * Martial art styles that we known, but the player p doesn't. */ std::vector styles_offered_to( const player &p ) const; + /** + * Spells that the NPC knows but that the player p doesn't. + * not const because get_spell isn't const and both this and p call it + */ + std::vector spells_offered_to( player &p ); // State checks // We want to kill/mug/etc the player bool is_enemy() const; // Traveling w/ player (whether as a friend or a slave) bool is_following() const; - bool is_obeying( const player &p ) const; + bool is_obeying( const Character &p ) const; bool is_hallucination() const override; // true if the NPC isn't actually real // Ally of or traveling with p - bool is_friendly( const player &p ) const; + bool is_friendly( const Character &p ) const; // Leading the player bool is_leader() const; // Leading, following, or waiting for the player bool is_walking_with() const; // In the same faction - bool is_ally( const player &p ) const; + bool is_ally( const Character &p ) const; // Is an ally of the player bool is_player_ally() const; // Isn't moving @@ -1185,8 +1191,8 @@ class npc : public player void heal_player( player &patient ); void heal_self(); void pretend_heal( player &patient, item used ); // healing action of hallucinations - void mug_player( player &mark ); - void look_for_player( const player &sought ); + void mug_player( Character &mark ); + void look_for_player( const Character &sought ); // Do we have an idea of where u are? bool saw_player_recently() const; /** Returns true if food was consumed, false otherwise. */ @@ -1243,7 +1249,7 @@ class npc : public player */ void setpos( const tripoint &pos ) override; void travel_overmap( const tripoint &pos ); - npc_attitude get_attitude() const; + npc_attitude get_attitude() const override; void set_attitude( npc_attitude new_attitude ); void set_mission( npc_mission new_mission ); bool has_activity() const; diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 3346bb31ff2e2..56da28364fb27 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -13,7 +13,6 @@ #include "active_item_cache.h" #include "activity_handlers.h" -#include "avatar.h" #include "basecamp.h" #include "bionics.h" #include "bodypart.h" @@ -108,6 +107,7 @@ static const efftype_id effect_catch_up( "catch_up" ); static const efftype_id effect_disinfected( "disinfected" ); static const efftype_id effect_hallu( "hallu" ); static const efftype_id effect_hit_by_player( "hit_by_player" ); +static const efftype_id effect_hypovolemia( "hypovolemia" ); static const efftype_id effect_infected( "infected" ); static const efftype_id effect_lying_down( "lying_down" ); static const efftype_id effect_no_sight( "no_sight" ); @@ -198,8 +198,6 @@ void print_action( const char *prepend, npc_action action ); bool compare_sound_alert( const dangerous_sound &sound_a, const dangerous_sound &sound_b ); -hp_part most_damaged_hp_part( const Character &c ); - bool compare_sound_alert( const dangerous_sound &sound_a, const dangerous_sound &sound_b ) { if( sound_a.type != sound_b.type ) { @@ -216,7 +214,7 @@ static bool clear_shot_reach( const tripoint &from, const tripoint &to, bool che Creature *inter = g->critter_at( p ); if( check_ally && inter != nullptr ) { return false; - } else if( g->m.impassable( p ) ) { + } else if( get_map().impassable( p ) ) { return false; } } @@ -226,6 +224,7 @@ static bool clear_shot_reach( const tripoint &from, const tripoint &to, bool che tripoint npc::good_escape_direction( bool include_pos ) { + map &here = get_map(); if( path.empty() ) { zone_type_id retreat_zone = zone_type_id( "NPC_RETREAT" ); const tripoint &abs_pos = global_square_location(); @@ -233,7 +232,7 @@ tripoint npc::good_escape_direction( bool include_pos ) cata::optional retreat_target = mgr.get_nearest( retreat_zone, abs_pos, 60, fac_id ); if( retreat_target && *retreat_target != abs_pos ) { - update_path( g->m.getlocal( *retreat_target ) ); + update_path( here.getlocal( *retreat_target ) ); if( !path.empty() ) { return path[0]; } @@ -247,7 +246,7 @@ tripoint npc::good_escape_direction( bool include_pos ) return MAX_FLOAT; } float rating = threat_val; - for( const auto &e : g->m.field_at( pt ) ) { + for( const auto &e : here.field_at( pt ) ) { if( is_dangerous_field( e.second ) ) { // TODO: Rate fire higher than smoke rating += e.second.get_field_intensity(); @@ -277,12 +276,13 @@ tripoint npc::good_escape_direction( bool include_pos ) bool npc::sees_dangerous_field( const tripoint &p ) const { - return is_dangerous_fields( g->m.field_at( p ) ); + return is_dangerous_fields( get_map().field_at( p ) ); } bool npc::could_move_onto( const tripoint &p ) const { - if( !g->m.passable( p ) ) { + map &here = get_map(); + if( !here.passable( p ) ) { return false; } @@ -290,8 +290,8 @@ bool npc::could_move_onto( const tripoint &p ) const return true; } - const auto fields_here = g->m.field_at( pos() ); - for( const auto &e : g->m.field_at( p ) ) { + const auto fields_here = here.field_at( pos() ); + for( const auto &e : here.field_at( p ) ) { if( !is_dangerous_field( e.second ) ) { continue; } @@ -309,7 +309,7 @@ std::vector npc::find_dangerous_explosives() const { std::vector result; - const auto active_items = g->m.get_active_items_in_radius( pos(), MAX_VIEW_DISTANCE, + const auto active_items = get_map().get_active_items_in_radius( pos(), MAX_VIEW_DISTANCE, special_item_type::explosive ); for( const auto &elem : active_items ) { @@ -371,8 +371,9 @@ void npc::assess_danger() invalidate_range_cache(); max_range = *confident_range_cache; } - const auto ok_by_rules = [max_range, def_radius, this]( const Creature & c, int dist, - int scaled_dist ) { + Character &player_character = get_player_character(); + const auto ok_by_rules = [max_range, def_radius, this, &player_character]( const Creature & c, + int dist, int scaled_dist ) { // If we're forbidden to attack, no need to check engagement rules if( rules.has_flag( ally_rule::forbid_engage ) ) { return false; @@ -383,7 +384,7 @@ void npc::assess_danger() case combat_engagement::CLOSE: // Either close to player or close enough that we can reach it and close to us return ( dist <= max_range && scaled_dist <= def_radius * 0.5 ) || - too_close( c.pos(), g->u.pos(), def_radius ); + too_close( c.pos(), player_character.pos(), def_radius ); case combat_engagement::WEAK: return c.get_hp() <= average_damage_dealt(); case combat_engagement::HIT: @@ -403,13 +404,14 @@ void npc::assess_danger() for( direction threat_dir : npc_threat_dir ) { cur_threat_map[ threat_dir ] = 0.25f * ai_cache.threat_map[ threat_dir ]; } + map &here = get_map(); // first, check if we're about to be consumed by fire // TODO: Use the field cache - for( const tripoint &pt : g->m.points_in_radius( pos(), 6 ) ) { - if( pt == pos() || g->m.has_flag( TFLAG_FIRE_CONTAINER, pt ) ) { + for( const tripoint &pt : here.points_in_radius( pos(), 6 ) ) { + if( pt == pos() || here.has_flag( TFLAG_FIRE_CONTAINER, pt ) ) { continue; } - if( g->m.get_field( pt, fd_fire ) != nullptr ) { + if( here.get_field( pt, fd_fire ) != nullptr ) { int dist = rl_dist( pos(), pt ); cur_threat_map[direction_from( pos(), pt )] += 2.0f * ( NPC_DANGER_MAX - dist ); if( dist < 3 && !has_effect( effect_npc_fire_bad ) ) { @@ -435,11 +437,11 @@ void npc::assess_danger() hostile_guys.emplace_back( g->shared_from( guy ) ); } } - if( sees( g->u.pos() ) ) { + if( sees( player_character.pos() ) ) { if( is_enemy() ) { - hostile_guys.emplace_back( g->shared_from( g->u ) ); - } else if( is_friendly( g->u ) ) { - ai_cache.friends.emplace_back( g->shared_from( g->u ) ); + hostile_guys.emplace_back( g->shared_from( player_character ) ); + } else if( is_friendly( player_character ) ) { + ai_cache.friends.emplace_back( g->shared_from( player_character ) ); } } @@ -511,7 +513,7 @@ void npc::assess_danger() ai_cache.danger_assessment = assessment; return; } - const auto handle_hostile = [&]( const player & foe, float foe_threat, + const auto handle_hostile = [&]( const Character & foe, float foe_threat, const std::string & bogey, const std::string & warning ) { int dist = rl_dist( pos(), foe.pos() ); if( foe_threat > ( 8.0f + personality.bravery + rng( 0, 5 ) ) ) { @@ -564,16 +566,16 @@ void npc::assess_danger() assessment = std::max( min_danger, assessment - guy_threat * 0.5f ); } - if( sees( g->u.pos() ) ) { + if( sees( player_character.pos() ) ) { // Mod for the player // cap player difficulty at 150 - float player_diff = evaluate_enemy( g->u ); + float player_diff = evaluate_enemy( player_character ); if( is_enemy() ) { - assessment += handle_hostile( g->u, player_diff, "maniac", "kill_player" ); - } else if( is_friendly( g->u ) ) { + assessment += handle_hostile( player_character, player_diff, "maniac", "kill_player" ); + } else if( is_friendly( player_character ) ) { float min_danger = assessment >= NPC_DANGER_VERY_LOW ? NPC_DANGER_VERY_LOW : -10.0f; assessment = std::max( min_danger, assessment - player_diff * 0.5f ); - ai_cache.friends.emplace_back( g->shared_from( g->u ) ); + ai_cache.friends.emplace_back( g->shared_from( player_character ) ); } } assessment *= 0.1f; @@ -614,7 +616,7 @@ float npc::character_danger( const Character &uc ) const } ret += u_weap_val; - ret += hp_percentage() * get_hp_max( hp_torso ) / 100.0 / my_weap_val; + ret += hp_percentage() * get_hp_max( bodypart_id( "torso" ) ) / 100.0 / my_weap_val; ret += my_gun ? u.get_dodge() / 2 : u.get_dodge(); @@ -626,11 +628,12 @@ float npc::character_danger( const Character &uc ) const void npc::regen_ai_cache() { + map &here = get_map(); auto i = std::begin( ai_cache.sound_alerts ); while( i != std::end( ai_cache.sound_alerts ) ) { - if( sees( g->m.getlocal( i->abs_pos ) ) ) { + if( sees( here.getlocal( i->abs_pos ) ) ) { // if they were responding to a call for guards because of thievery - npc *const sound_source = g->critter_at( g->m.getlocal( i->abs_pos ) ); + npc *const sound_source = g->critter_at( here.getlocal( i->abs_pos ) ); if( sound_source ) { if( my_fac == sound_source->my_fac && sound_source->known_stolen_item ) { sound_source->known_stolen_item = nullptr; @@ -663,6 +666,7 @@ void npc::regen_ai_cache() } // Non-allied NPCs with a completed mission should move to the player if( !is_player_ally() && !is_stationary( true ) ) { + Character &player_character = get_player_character(); for( auto &miss : chatbin.missions_assigned ) { if( miss->is_complete( getID() ) ) { // unless the player found an item and already told the NPC he wanted to keep it @@ -672,8 +676,8 @@ void npc::regen_ai_cache() has_effect( effect_npc_player_still_looking ) ) { continue; } - if( global_omt_location() != g->u.global_omt_location() ) { - goal = g->u.global_omt_location(); + if( global_omt_location() != player_character.global_omt_location() ) { + goal = player_character.global_omt_location(); } set_attitude( NPCATT_TALK ); break; @@ -709,8 +713,9 @@ void npc::move() name, target_name, ai_cache.danger, weapon.is_gun() ? confident_shoot_range( weapon, recoil_total() ) : weapon.reach_range( *this ) ); + Character &player_character = get_player_character(); //faction opinion determines if it should consider you hostile - if( !is_enemy() && guaranteed_hostile() && sees( g->u ) ) { + if( !is_enemy() && guaranteed_hostile() && sees( player_character ) ) { if( is_player_ally() ) { mutiny(); } @@ -747,12 +752,13 @@ void npc::move() if( is_enemy() && vehicle_danger( avoidance_vehicles_radius ) > 0 ) { // TODO: Think about how this actually needs to work, for now assume flee from player - ai_cache.target = g->shared_from( g->u ); + ai_cache.target = g->shared_from( player_character ); } + map &here = get_map(); if( !ai_cache.dangerous_explosives.empty() ) { action = npc_escape_explosion; - } else if( target == &g->u && attitude == NPCATT_FLEE_TEMP ) { + } else if( target == &player_character && attitude == NPCATT_FLEE_TEMP ) { action = method_of_fleeing(); } else if( has_effect( effect_npc_run_away ) ) { action = method_of_fleeing(); @@ -765,7 +771,7 @@ void npc::move() } else if( !ai_cache.sound_alerts.empty() && !is_walking_with() ) { tripoint cur_s_abs_pos = ai_cache.s_abs_pos; if( !ai_cache.guard_pos ) { - ai_cache.guard_pos = g->m.getabs( pos() ); + ai_cache.guard_pos = here.getabs( pos() ); } if( ai_cache.sound_alerts.size() > 1 ) { std::sort( ai_cache.sound_alerts.begin(), ai_cache.sound_alerts.end(), @@ -810,7 +816,7 @@ void npc::move() } if( action == npc_undecided && is_walking_with() && rules.has_flag( ally_rule::follow_close ) && - rl_dist( pos(), g->u.pos() ) > follow_distance() ) { + rl_dist( pos(), player_character.pos() ) > follow_distance() ) { action = npc_follow_player; } @@ -829,7 +835,7 @@ void npc::move() if( !activity_route.empty() && !has_destination_activity() ) { tripoint final_destination; if( destination_point ) { - final_destination = g->m.getlocal( *destination_point ); + final_destination = here.getlocal( *destination_point ); } else { final_destination = activity_route.back(); } @@ -850,7 +856,7 @@ void npc::move() // an interrupted activity can cause this situation. stops allied NPCs zooming off like random NPCs if( attitude == NPCATT_ACTIVITY && !activity ) { revert_after_activity(); - if( is_ally( g->u ) ) { + if( is_ally( player_character ) ) { attitude = NPCATT_FOLLOW; mission = NPC_MISSION_NULL; } @@ -882,7 +888,7 @@ void npc::move() } // check if in vehicle before rushing off to fetch things - if( is_walking_with() && g->u.in_vehicle ) { + if( is_walking_with() && player_character.in_vehicle ) { action = npc_follow_embarked; } else if( fetching_item ) { // Set to true if find_item() found something @@ -911,7 +917,8 @@ void npc::move() ( ( action == npc_follow_embarked && in_vehicle ) || ( action == npc_follow_player && - ( rl_dist( pos(), g->u.pos() ) <= follow_distance() || posz() != g->u.posz() ) ) + ( rl_dist( pos(), player_character.pos() ) <= follow_distance() || + posz() != player_character.posz() ) ) ) ) { action = method_of_attack(); } @@ -935,6 +942,8 @@ void npc::execute_action( npc_action action ) name, target, npc_action_name(action)); */ + Character &player_character = get_player_character(); + map &here = get_map(); switch( action ) { case npc_pause: move_pause(); @@ -949,7 +958,7 @@ void npc::execute_action( npc_action action ) case npc_investigate_sound: { tripoint cur_pos = pos(); - update_path( g->m.getlocal( ai_cache.s_abs_pos ) ); + update_path( here.getlocal( ai_cache.s_abs_pos ) ); move_to_next(); if( pos() == cur_pos ) { ai_cache.stuck += 1; @@ -958,7 +967,7 @@ void npc::execute_action( npc_action action ) break; case npc_return_to_guard_pos: { - const tripoint local_guard_pos = g->m.getlocal( *ai_cache.guard_pos ); + const tripoint local_guard_pos = here.getlocal( *ai_cache.guard_pos ); update_path( local_guard_pos ); if( pos() == local_guard_pos || path.empty() ) { move_pause(); @@ -975,7 +984,7 @@ void npc::execute_action( npc_action action ) // Find a nice spot to sleep int best_sleepy = sleep_spot( pos() ); tripoint best_spot = pos(); - for( const tripoint &p : closest_tripoints_first( pos(), 6 ) ) { + for( const tripoint &p : closest_points_first( pos(), 6 ) ) { if( !could_move_onto( p ) || !g->is_empty( p ) ) { continue; } @@ -997,7 +1006,7 @@ void npc::execute_action( npc_action action ) if( !has_effect( effect_lying_down ) ) { activate_bionic_by_id( bio_soporific ); add_effect( effect_lying_down, 30_minutes, num_bp, false, 1 ); - if( g->u.sees( *this ) && !g->u.in_sleep_state() ) { + if( player_character.sees( *this ) && !player_character.in_sleep_state() ) { add_msg( _( "%s lies down to sleep." ), name ); } } @@ -1055,7 +1064,7 @@ void npc::execute_action( npc_action action ) melee_attack( *cur, true ); } } else { - look_for_player( g->u ); + look_for_player( player_character ); } break; @@ -1087,7 +1096,7 @@ void npc::execute_action( npc_action action ) update_path( *last_player_seen_pos ); move_to_next(); } else { - look_for_player( g->u ); + look_for_player( player_character ); } break; @@ -1107,9 +1116,9 @@ void npc::execute_action( npc_action action ) break; } case npc_follow_player: - update_path( g->u.pos() ); + update_path( player_character.pos() ); if( static_cast( path.size() ) <= follow_distance() && - g->u.posz() == posz() ) { // We're close enough to u. + player_character.posz() == posz() ) { // We're close enough to u. move_pause(); } else if( !path.empty() ) { move_to_next(); @@ -1121,7 +1130,7 @@ void npc::execute_action( npc_action action ) break; case npc_follow_embarked: { - const optional_vpart_position vp = g->m.veh_at( g->u.pos() ); + const optional_vpart_position vp = here.veh_at( player_character.pos() ); if( !vp ) { debugmsg( "Following an embarked player with no vehicle at their location?" ); @@ -1134,7 +1143,7 @@ void npc::execute_action( npc_action action ) // Try to find the last destination // This is mount point, not actual position point last_dest( INT_MIN, INT_MIN ); - if( !path.empty() && veh_pointer_or_null( g->m.veh_at( path[path.size() - 1] ) ) == veh ) { + if( !path.empty() && veh_pointer_or_null( here.veh_at( path[path.size() - 1] ) ) == veh ) { last_dest = vp->mount(); } @@ -1231,7 +1240,7 @@ void npc::execute_action( npc_action action ) break; case npc_mug_player: - mug_player( g->u ); + mug_player( player_character ); break; case npc_goto_destination: @@ -1723,35 +1732,33 @@ healing_options npc::patient_assessment( const Character &c ) healing_options try_to_fix; try_to_fix.clear_all(); - for( int i = 0; i < num_hp_parts; i++ ) { - const hp_part part = static_cast( i ); - const body_part bp_wounded = hp_to_bp( part ); + for( const std::pair &elem : c.get_body() ) { - if( c.has_effect( effect_bleed, bp_wounded ) ) { + if( c.has_effect( effect_bleed, elem.first->token ) ) { try_to_fix.bleed = true; } - if( c.has_effect( effect_bite, bp_wounded ) ) { + if( c.has_effect( effect_bite, elem.first->token ) ) { try_to_fix.bite = true; } - if( c.has_effect( effect_infected, bp_wounded ) ) { + if( c.has_effect( effect_infected, elem.first->token ) ) { try_to_fix.infect = true; } int part_threshold = 75; - if( part == hp_head ) { + if( elem.first == bodypart_str_id( "head" ) ) { part_threshold += 20; - } else if( part == hp_torso ) { + } else if( elem.first == bodypart_str_id( "torso" ) ) { part_threshold += 10; } part_threshold = std::min( 80, part_threshold ); - part_threshold = part_threshold * c.hp_max[i] / 100; + part_threshold = part_threshold * elem.second.get_hp_max() / 100; - if( c.hp_cur[i] <= part_threshold ) { - if( !c.has_effect( effect_bandaged, bp_wounded ) ) { + if( elem.second.get_hp_cur() <= part_threshold ) { + if( !c.has_effect( effect_bandaged, elem.first->token ) ) { try_to_fix.bandage = true; } - if( !c.has_effect( effect_disinfected, bp_wounded ) ) { + if( !c.has_effect( effect_disinfected, elem.first->token ) ) { try_to_fix.disinfect = true; } } @@ -1761,6 +1768,7 @@ healing_options npc::patient_assessment( const Character &c ) npc_action npc::address_needs( float danger ) { + Character &player_character = get_player_character(); // rng because NPCs are not meant to be hypervigilant hawks that notice everything // and swing into action with alarming alacrity. // no sometimes they are just looking the other way, sometimes they hestitate. @@ -1779,11 +1787,11 @@ npc_action npc::address_needs( float danger ) } if( get_skill_level( skill_firstaid ) > 0 ) { if( is_player_ally() ) { - healing_options try_to_fix_other = patient_assessment( g->u ); + healing_options try_to_fix_other = patient_assessment( player_character ); if( try_to_fix_other.any_true() ) { ai_cache.can_heal = has_healing_options( try_to_fix_other ); if( ai_cache.can_heal.any_true() ) { - ai_cache.ally = g->shared_from( g->u ); + ai_cache.ally = g->shared_from( player_character ); return npc_heal_player; } } @@ -1835,8 +1843,8 @@ npc_action npc::address_needs( float danger ) } } //Does the hallucination needs to disappear ? - if( is_hallucination() && g->u.sees( *this ) ) { - if( !g->u.has_effect( effect_hallu ) ) { + if( is_hallucination() && player_character.sees( *this ) ) { + if( !player_character.has_effect( effect_hallu ) ) { die( nullptr ); } } @@ -1874,7 +1882,7 @@ npc_action npc::address_needs( float danger ) if( danger <= 0.01 ) { if( get_fatigue() >= fatigue_levels::TIRED ) { return true; - } else if( is_walking_with() && g->u.in_sleep_state() && + } else if( is_walking_with() && player_character.in_sleep_state() && get_fatigue() > ( fatigue_levels::TIRED / 2 ) ) { return true; } @@ -1891,7 +1899,7 @@ npc_action npc::address_needs( float danger ) if( rules.has_flag( ally_rule::allow_sleep ) || get_fatigue() > fatigue_levels::MASSIVE_FATIGUE ) { return npc_sleep; - } else if( g->u.in_sleep_state() ) { + } else if( player_character.in_sleep_state() ) { // TODO: "Guard me while I sleep" command return npc_sleep; } @@ -1904,12 +1912,13 @@ npc_action npc::address_needs( float danger ) npc_action npc::address_player() { - if( ( attitude == NPCATT_TALK || attitude == NPCATT_RECOVER_GOODS ) && sees( g->u ) ) { - if( g->u.in_sleep_state() ) { + Character &player_character = get_player_character(); + if( ( attitude == NPCATT_TALK || attitude == NPCATT_RECOVER_GOODS ) && sees( player_character ) ) { + if( player_character.in_sleep_state() ) { // Leave sleeping characters alone. return npc_undecided; } - if( rl_dist( pos(), g->u.pos() ) <= 6 ) { + if( rl_dist( pos(), player_character.pos() ) <= 6 ) { return npc_talk_to_player; // Close enough to talk to you } else { if( one_in( 10 ) ) { @@ -1919,7 +1928,7 @@ npc_action npc::address_player() } } - if( attitude == NPCATT_MUG && sees( g->u ) ) { + if( attitude == NPCATT_MUG && sees( player_character ) ) { if( one_in( 3 ) ) { say( _( "Don't move a muscle…" ) ); } @@ -1941,7 +1950,7 @@ npc_action npc::address_player() } if( attitude == NPCATT_LEAD ) { - if( rl_dist( pos(), g->u.pos() ) >= 12 || !sees( g->u ) ) { + if( rl_dist( pos(), player_character.pos() ) >= 12 || !sees( player_character ) ) { int intense = get_effect_int( effect_catch_up ); if( intense < 10 ) { say( "" ); @@ -2154,7 +2163,8 @@ bool npc::update_path( const tripoint &p, const bool no_bashing, bool force ) } } - auto new_path = g->m.route( pos(), p, get_pathfinding_settings( no_bashing ), get_path_avoid() ); + auto new_path = get_map().route( pos(), p, get_pathfinding_settings( no_bashing ), + get_path_avoid() ); if( new_path.empty() ) { if( !ai_cache.sound_alerts.empty() ) { ai_cache.sound_alerts.erase( ai_cache.sound_alerts.begin() ); @@ -2179,27 +2189,29 @@ bool npc::update_path( const tripoint &p, const bool no_bashing, bool force ) bool npc::can_open_door( const tripoint &p, const bool inside ) const { - return !rules.has_flag( ally_rule::avoid_doors ) && g->m.open_door( p, inside, true ); + return !rules.has_flag( ally_rule::avoid_doors ) && get_map().open_door( p, inside, true ); } bool npc::can_move_to( const tripoint &p, bool no_bashing ) const { + map &here = get_map(); // Allow moving into any bashable spots, but penalize them during pathing // Doors are not passable for hallucinations - return( rl_dist( pos(), p ) <= 1 && g->m.has_floor( p ) && !g->is_dangerous_tile( p ) && - ( g->m.passable( p ) || ( can_open_door( p, !g->m.is_outside( pos() ) ) && !is_hallucination() ) || - ( !no_bashing && g->m.bash_rating( smash_ability(), p ) > 0 ) ) + return( rl_dist( pos(), p ) <= 1 && here.has_floor( p ) && !g->is_dangerous_tile( p ) && + ( here.passable( p ) || ( can_open_door( p, !here.is_outside( pos() ) ) && !is_hallucination() ) || + ( !no_bashing && here.bash_rating( smash_ability(), p ) > 0 ) ) ); } void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomove ) { tripoint p = pt; + map &here = get_map(); if( sees_dangerous_field( p ) || ( nomove != nullptr && nomove->find( p ) != nomove->end() ) ) { // Move to a neighbor field instead, if possible. // Maybe this code already exists somewhere? - auto other_points = g->m.get_dir_circle( pos(), p ); + auto other_points = here.get_dir_circle( pos(), p ); for( const tripoint &ot : other_points ) { if( could_move_onto( ot ) && ( nomove == nullptr || nomove->find( ot ) == nomove->end() ) ) { @@ -2258,7 +2270,7 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo return; } - if( critter == &g->u ) { + if( critter->is_avatar() ) { say( "" ); } @@ -2286,7 +2298,7 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo if( !activity_route.empty() && !np->has_destination_activity() ) { tripoint final_destination; if( destination_point ) { - final_destination = g->m.getlocal( *destination_point ); + final_destination = here.getlocal( *destination_point ); } else { final_destination = activity_route.back(); } @@ -2303,8 +2315,8 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo // Boarding moving vehicles is fine, unboarding isn't bool moved = false; - if( const optional_vpart_position vp = g->m.veh_at( pos() ) ) { - const optional_vpart_position ovp = g->m.veh_at( p ); + if( const optional_vpart_position vp = here.veh_at( pos() ) ) { + const optional_vpart_position ovp = here.veh_at( p ); if( vp->vehicle().is_moving() && ( veh_pointer_or_null( ovp ) != veh_pointer_or_null( vp ) || !ovp.part_with_feature( VPFLAG_BOARDABLE, true ) ) ) { @@ -2323,10 +2335,10 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo } moves -= 100; moved = true; - } else if( g->m.passable( p ) && !g->m.has_flag( "DOOR", p ) ) { + } else if( here.passable( p ) && !here.has_flag( "DOOR", p ) ) { bool diag = trigdist && posx() != p.x && posy() != p.y; if( is_mounted() ) { - const double base_moves = run_cost( g->m.combined_movecost( pos(), p ), + const double base_moves = run_cost( here.combined_movecost( pos(), p ), diag ) * 100.0 / mounted_creature->get_speed(); const double encumb_moves = get_weight() / 4800.0_gram; moves -= static_cast( std::ceil( base_moves + encumb_moves ) ); @@ -2334,33 +2346,33 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo mounted_creature->use_mech_power( -1 ); } } else { - moves -= run_cost( g->m.combined_movecost( pos(), p ), diag ); + moves -= run_cost( here.combined_movecost( pos(), p ), diag ); } moved = true; - } else if( g->m.open_door( p, !g->m.is_outside( pos() ), true ) ) { + } else if( here.open_door( p, !here.is_outside( pos() ), true ) ) { if( !is_hallucination() ) { // hallucinations don't open doors - g->m.open_door( p, !g->m.is_outside( pos() ) ); + here.open_door( p, !here.is_outside( pos() ) ); moves -= 100; } else { // hallucinations teleport through doors moves -= 100; moved = true; } - } else if( get_dex() > 1 && g->m.has_flag_ter_or_furn( "CLIMBABLE", p ) ) { + } else if( get_dex() > 1 && here.has_flag_ter_or_furn( "CLIMBABLE", p ) ) { ///\EFFECT_DEX_NPC increases chance to climb CLIMBABLE furniture or terrain int climb = get_dex(); if( one_in( climb ) ) { add_msg_if_npc( m_neutral, _( "%1$s tries to climb the %2$s but slips." ), name, - g->m.tername( p ) ); + here.tername( p ) ); moves -= 400; } else { - add_msg_if_npc( m_neutral, _( "%1$s climbs over the %2$s." ), name, g->m.tername( p ) ); + add_msg_if_npc( m_neutral, _( "%1$s climbs over the %2$s." ), name, here.tername( p ) ); moves -= ( 500 - ( rng( 0, climb ) * 20 ) ); moved = true; } - } else if( !no_bashing && smash_ability() > 0 && g->m.is_bashable( p ) && - g->m.bash_rating( smash_ability(), p ) > 0 ) { + } else if( !no_bashing && smash_ability() > 0 && here.is_bashable( p ) && + here.bash_rating( smash_ability(), p ) > 0 ) { moves -= !is_armed() ? 80 : weapon.attack_time() * 0.8; - g->m.bash( p, smash_ability() ); + here.bash( p, smash_ability() ); } else { if( attitude == NPCATT_MUG || attitude == NPCATT_KILL || @@ -2384,37 +2396,37 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo mounted_creature->setpos( pos() ); mounted_creature->facing = facing; mounted_creature->process_triggers(); - g->m.creature_in_field( *mounted_creature ); - g->m.creature_on_trap( *mounted_creature ); + here.creature_in_field( *mounted_creature ); + here.creature_on_trap( *mounted_creature ); } } - if( g->m.has_flag( "UNSTABLE", pos() ) ) { + if( here.has_flag( "UNSTABLE", pos() ) ) { add_effect( effect_bouldering, 1_turns, num_bp, true ); } else if( has_effect( effect_bouldering ) ) { remove_effect( effect_bouldering ); } - if( g->m.has_flag_ter_or_furn( TFLAG_NO_SIGHT, pos() ) ) { + if( here.has_flag_ter_or_furn( TFLAG_NO_SIGHT, pos() ) ) { add_effect( effect_no_sight, 1_turns, num_bp, true ); } else if( has_effect( effect_no_sight ) ) { remove_effect( effect_no_sight ); } if( in_vehicle ) { - g->m.unboard_vehicle( old_pos ); + here.unboard_vehicle( old_pos ); } // Close doors behind self (if you can) if( ( rules.has_flag( ally_rule::close_doors ) && is_player_ally() ) && !is_hallucination() ) { - doors::close_door( g->m, *this, old_pos ); + doors::close_door( here, *this, old_pos ); } - if( g->m.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ) ) { - g->m.board_vehicle( p, this ); + if( here.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ) ) { + here.board_vehicle( p, this ); } - g->m.creature_on_trap( *this ); - g->m.creature_in_field( *this ); + here.creature_on_trap( *this ); + here.creature_in_field( *this ); } } @@ -2454,7 +2466,7 @@ void npc::avoid_friendly_fire() center.y = std::round( center.y / friend_count ); center.z = std::round( center.z / friend_count ); - std::vector candidates = closest_tripoints_first( pos(), 1 ); + std::vector candidates = closest_points_first( pos(), 1 ); candidates.erase( candidates.begin() ); std::sort( candidates.begin(), candidates.end(), [&tar, ¢er]( const tripoint & l, const tripoint & r ) { @@ -2497,7 +2509,8 @@ void npc::move_away_from( const tripoint &pt, bool no_bash_atk, std::setm.points_in_radius( pos(), 1 ) ) { + map &here = get_map(); + for( const tripoint &p : here.points_in_radius( pos(), 1 ) ) { if( nomove != nullptr && nomove->find( p ) != nomove->end() ) { continue; } @@ -2506,11 +2519,11 @@ void npc::move_away_from( const tripoint &pt, bool no_bash_atk, std::setu.pos() ) { + if( p == get_player_character().pos() ) { continue; } - const int cost = g->m.combined_movecost( pos(), p ); + const int cost = here.combined_movecost( pos(), p ); if( cost <= 0 ) { continue; } @@ -2550,17 +2563,18 @@ bool npc::find_job_to_perform() void npc::worker_downtime() { + map &here = get_map(); // are we already in a chair - if( g->m.has_flag_furn( "CAN_SIT", pos() ) ) { + if( here.has_flag_furn( "CAN_SIT", pos() ) ) { // just chill here move_pause(); return; } // already know of a chair, go there if( chair_pos != no_goal_point ) { - if( g->m.has_flag_furn( "CAN_SIT", g->m.getlocal( chair_pos ) ) ) { - update_path( g->m.getlocal( chair_pos ) ); - if( pos() == g->m.getlocal( chair_pos ) || path.empty() ) { + if( here.has_flag_furn( "CAN_SIT", here.getlocal( chair_pos ) ) ) { + update_path( here.getlocal( chair_pos ) ); + if( pos() == here.getlocal( chair_pos ) || path.empty() ) { move_pause(); path.clear(); } else { @@ -2574,11 +2588,11 @@ void npc::worker_downtime() } else { // find a chair if( !is_mounted() ) { - for( const tripoint &elem : g->m.points_in_radius( pos(), 30 ) ) { - if( g->m.has_flag_furn( "CAN_SIT", elem ) && !g->critter_at( elem ) && could_move_onto( elem ) && - g->m.point_within_camp( g->m.getabs( elem ) ) ) { + for( const tripoint &elem : here.points_in_radius( pos(), 30 ) ) { + if( here.has_flag_furn( "CAN_SIT", elem ) && !g->critter_at( elem ) && could_move_onto( elem ) && + here.point_within_camp( here.getabs( elem ) ) ) { // this one will do - chair_pos = g->m.getabs( elem ); + chair_pos = here.getabs( elem ); return; } } @@ -2587,8 +2601,8 @@ void npc::worker_downtime() // we got here if there are no chairs available. // wander back to near the bulletin board of the camp. if( wander_pos != no_goal_point ) { - update_path( g->m.getlocal( wander_pos ) ); - if( pos() == g->m.getlocal( wander_pos ) || path.empty() ) { + update_path( here.getlocal( wander_pos ) ); + if( pos() == here.getlocal( wander_pos ) || path.empty() ) { move_pause(); path.clear(); if( one_in( 30 ) ) { @@ -2608,16 +2622,16 @@ void npc::worker_downtime() } basecamp *temp_camp = *bcp; std::vector pts; - for( const tripoint &elem : g->m.points_in_radius( g->m.getlocal( temp_camp->get_bb_pos() ), + for( const tripoint &elem : here.points_in_radius( here.getlocal( temp_camp->get_bb_pos() ), 10 ) ) { - if( g->critter_at( elem ) || !could_move_onto( elem ) || g->m.has_flag( TFLAG_DEEP_WATER, elem ) || - !g->m.has_floor( elem ) || g->is_dangerous_tile( elem ) ) { + if( g->critter_at( elem ) || !could_move_onto( elem ) || here.has_flag( TFLAG_DEEP_WATER, elem ) || + !here.has_floor( elem ) || g->is_dangerous_tile( elem ) ) { continue; } pts.push_back( elem ); } if( !pts.empty() ) { - wander_pos = g->m.getabs( random_entry( pts ) ); + wander_pos = here.getabs( random_entry( pts ) ); return; } } @@ -2655,19 +2669,20 @@ void npc::move_pause() static cata::optional nearest_passable( const tripoint &p, const tripoint &closest_to ) { - if( g->m.passable( p ) ) { + map &here = get_map(); + if( here.passable( p ) ) { return p; } // We need to path to adjacent tile, not the exact one // Let's pick the closest one to us that is passable - std::vector candidates = closest_tripoints_first( p, 1 ); + std::vector candidates = closest_points_first( p, 1 ); std::sort( candidates.begin(), candidates.end(), [ closest_to ]( const tripoint & l, const tripoint & r ) { return rl_dist( closest_to, l ) < rl_dist( closest_to, r ); } ); - auto iter = std::find_if( candidates.begin(), candidates.end(), []( const tripoint & pt ) { - return g->m.passable( pt ); + auto iter = std::find_if( candidates.begin(), candidates.end(), [&here]( const tripoint & pt ) { + return here.passable( pt ); } ); if( iter != candidates.end() ) { return *iter; @@ -2692,13 +2707,14 @@ void npc::move_away_from( const std::vector &spheres, bool no_bashing ) maxp.y = std::max( maxp.y, elem.center.y + elem.radius ); } - const tripoint_range range( minp, maxp ); + const tripoint_range range( minp, maxp ); std::vector escape_points; + map &here = get_map(); std::copy_if( range.begin(), range.end(), std::back_inserter( escape_points ), - [&]( const tripoint & elem ) { - return g->m.passable( elem ); + [&here]( const tripoint & elem ) { + return here.passable( elem ); } ); cata::sort_by_rating( escape_points.begin(), escape_points.end(), [&]( const tripoint & elem ) { @@ -2708,7 +2724,7 @@ void npc::move_away_from( const std::vector &spheres, bool no_bashing ) } ); const int distance = rl_dist( pos(), elem ); - const int move_cost = g->m.move_cost( elem ); + const int move_cost = here.move_cost( elem ); return std::make_tuple( danger, distance, move_cost ); } ); @@ -2730,9 +2746,10 @@ void npc::move_away_from( const std::vector &spheres, bool no_bashing ) void npc::see_item_say_smth( const itype_id &object, const std::string &smth ) { - for( const tripoint &p : closest_tripoints_first( pos(), 6 ) ) { - if( g->m.sees_some_items( p, *this ) && sees( p ) ) { - for( const item &it : g->m.i_at( p ) ) { + map &here = get_map(); + for( const tripoint &p : closest_points_first( pos(), 6 ) ) { + if( here.sees_some_items( p, *this ) && sees( p ) ) { + for( const item &it : here.i_at( p ) ) { if( one_in( 100 ) && ( it.typeId() == object ) ) { say( smth ); } @@ -2790,8 +2807,10 @@ void npc::find_item() npc *npc_to_add = npc_to_get.get(); followers.push_back( npc_to_add ); } + Character &player_character = get_player_character(); for( auto &elem : followers ) { - if( !it.is_owned_by( *this, true ) && ( g->u.sees( this->pos() ) || g->u.sees( wanted_item_pos ) || + if( !it.is_owned_by( *this, true ) && ( player_character.sees( this->pos() ) || + player_character.sees( wanted_item_pos ) || elem->sees( this->pos() ) || elem->sees( wanted_item_pos ) ) ) { return; } @@ -2812,16 +2831,17 @@ void npc::find_item() } }; + map &here = get_map(); // Harvest item doesn't exist, so we'll be checking by its name std::string wanted_name; const auto consider_terrain = - [ this, whitelisting, volume_allowed, &wanted, &wanted_name ]( const tripoint & p ) { + [ this, whitelisting, volume_allowed, &wanted, &wanted_name, &here ]( const tripoint & p ) { // We only want to pick plants when there are no items to pick if( !whitelisting || wanted != nullptr || !wanted_name.empty() || volume_allowed < 250_ml ) { return; } - const auto harvest = g->m.get_harvest_names( p ); + const auto &harvest = here.get_harvest_names( p ); for( const auto &entry : harvest ) { if( item_name_whitelisted( entry ) ) { wanted_name = entry; @@ -2831,7 +2851,7 @@ void npc::find_item() } }; - for( const tripoint &p : closest_tripoints_first( pos(), range ) ) { + for( const tripoint &p : closest_points_first( pos(), range ) ) { // TODO: Make this sight check not overdraw nearby tiles // TODO: Optimize that zone check if( is_player_ally() && g->check_zone( zone_type_no_npc_pickup, p ) ) { @@ -2841,9 +2861,9 @@ void npc::find_item() const tripoint abs_p = global_square_location() - pos() + p; const int prev_num_items = ai_cache.searched_tiles.get( abs_p, -1 ); // Prefetch the number of items present so we can bail out if we already checked here. - const map_stack m_stack = g->m.i_at( p ); + const map_stack m_stack = here.i_at( p ); int num_items = m_stack.size(); - const optional_vpart_position vp = g->m.veh_at( p ); + const optional_vpart_position vp = here.veh_at( p ); if( vp ) { const cata::optional cargo = vp.part_with_feature( VPFLAG_CARGO, true ); if( cargo ) { @@ -2860,7 +2880,7 @@ void npc::find_item() } }; bool can_see = false; - if( g->m.sees_some_items( p, *this ) && sees( p ) ) { + if( here.sees_some_items( p, *this ) && sees( p ) ) { can_see = true; for( const item &it : m_stack ) { consider_item( it, p ); @@ -2937,12 +2957,13 @@ void npc::pick_up_item() return; } - const cata::optional vp = g->m.veh_at( wanted_item_pos ).part_with_feature( + map &here = get_map(); + const cata::optional vp = here.veh_at( wanted_item_pos ).part_with_feature( VPFLAG_CARGO, false ); const bool has_cargo = vp && !vp->has_feature( "LOCKED" ); - if( ( !g->m.has_items( wanted_item_pos ) && !has_cargo && - !g->m.is_harvestable( wanted_item_pos ) && sees( wanted_item_pos ) ) || + if( ( !here.has_items( wanted_item_pos ) && !has_cargo && + !here.is_harvestable( wanted_item_pos ) && sees( wanted_item_pos ) ) || ( is_player_ally() && g->check_zone( zone_type_id( "NO_NPC_PICKUP" ), wanted_item_pos ) ) ) { // Items we wanted no longer exist and we can see it // Or player who is leading us doesn't want us to pick it up @@ -2982,16 +3003,17 @@ void npc::pick_up_item() if( picked_up.empty() ) { // Last chance: plant harvest - if( g->m.is_harvestable( wanted_item_pos ) ) { - g->m.examine( *this, wanted_item_pos ); + if( here.is_harvestable( wanted_item_pos ) ) { + here.examine( *this, wanted_item_pos ); // Note: we didn't actually pick up anything, just spawned items // but we want the item picker to find new items fetching_item = false; return; } } + Character &player_character = get_player_character(); // Describe the pickup to the player - bool u_see = g->u.sees( *this ) || g->u.sees( wanted_item_pos ); + bool u_see = player_character.sees( *this ) || player_character.sees( wanted_item_pos ); if( u_see ) { if( picked_up.size() == 1 ) { add_msg( _( "%1$s picks up a %2$s." ), name, picked_up.front().tname() ); @@ -3068,7 +3090,7 @@ std::list npc_pickup_from_stack( npc &who, T &items ) std::list npc::pick_up_item_map( const tripoint &where ) { - map_stack stack = g->m.i_at( where ); + map_stack stack = get_map().i_at( where ); return npc_pickup_from_stack( *this, stack ); } @@ -3137,6 +3159,7 @@ void npc::drop_items( const units::mass &drop_weight, const units::volume &drop_ } } + map &here = get_map(); std::string item_name; // For description below int num_items_dropped = 0; // For description below // Now, drop items, starting from the top of each list @@ -3182,11 +3205,11 @@ void npc::drop_items( const units::mass &drop_weight, const units::volume &drop_ item_name += _( " and " ) + dropped.tname(); } if( !is_hallucination() ) { // hallucinations can't drop real items - g->m.add_item_or_charges( pos(), dropped ); + here.add_item_or_charges( pos(), dropped ); } } // Finally, describe the action if u can see it - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { if( num_items_dropped >= 3 ) { add_msg( ngettext( "%s drops %d item.", "%s drops %d items.", num_items_dropped ), name, num_items_dropped ); @@ -3199,20 +3222,23 @@ void npc::drop_items( const units::mass &drop_weight, const units::volume &drop_ bool npc::find_corpse_to_pulp() { - if( ( is_player_ally() && ( !rules.has_flag( ally_rule::allow_pulp ) || g->u.in_vehicle ) ) || + Character &player_character = get_player_character(); + if( ( is_player_ally() && ( !rules.has_flag( ally_rule::allow_pulp ) || + player_character.in_vehicle ) ) || is_hallucination() ) { return false; } + map &here = get_map(); // Pathing with overdraw can get expensive, limit it int path_counter = 4; - const auto check_tile = [this, &path_counter]( const tripoint & p ) -> const item * { - if( !g->m.sees_some_items( p, *this ) || !sees( p ) ) + const auto check_tile = [this, &path_counter, &here]( const tripoint & p ) -> const item * { + if( !here.sees_some_items( p, *this ) || !sees( p ) ) { return nullptr; } - const map_stack items = g->m.i_at( p ); + const map_stack items = here.i_at( p ); const item *found = nullptr; for( const item &it : items ) { @@ -3252,8 +3278,8 @@ bool npc::find_corpse_to_pulp() if( corpse == nullptr ) { // If we're following the player, don't wander off to pulp corpses - const tripoint &around = is_walking_with() ? g->u.pos() : pos(); - for( const item_location &location : g->m.get_active_items_in_radius( around, range, + const tripoint &around = is_walking_with() ? player_character.pos() : pos(); + for( const item_location &location : here.get_active_items_in_radius( around, range, special_item_type::corpse ) ) { corpse = check_tile( location.position() ); @@ -3287,7 +3313,7 @@ bool npc::do_pulp() // TODO: Don't recreate the activity every time int old_moves = moves; assign_activity( ACT_PULP, calendar::INDEFINITELY_LONG, 0 ); - activity.placement = g->m.getabs( *pulp_location ); + activity.placement = get_map().getabs( *pulp_location ); activity.do_turn( *this ); return moves != old_moves; } @@ -3430,7 +3456,7 @@ bool npc::scan_new_items() static void npc_throw( npc &np, item &it, int index, const tripoint &pos ) { - if( g->u.sees( np ) ) { + if( get_player_character().sees( np ) ) { add_msg( _( "%1$s throws a %2$s." ), np.name, it.tname() ); } @@ -3545,9 +3571,10 @@ bool npc::alt_attack() return true; } + map &here = get_map(); // We need to throw this live (grenade, etc) NOW! Pick another target? for( int dist = 2; dist <= conf; dist++ ) { - for( const tripoint &pt : g->m.points_in_radius( pos(), dist ) ) { + for( const tripoint &pt : here.points_in_radius( pos(), dist ) ) { const monster *const target_ptr = g->critter_at( pt ); int newdist = rl_dist( pos(), pt ); // TODO: Change "newdist >= 2" to "newdist >= safe_distance(used)" @@ -3571,7 +3598,7 @@ bool npc::alt_attack() */ int best_dist = 0; for( int dist = 2; dist <= conf; dist++ ) { - for( const tripoint &pt : g->m.points_in_radius( pos(), dist ) ) { + for( const tripoint &pt : here.points_in_radius( pos(), dist ) ) { int new_dist = rl_dist( pos(), pt ); if( new_dist > best_dist && wont_hit_friend( pt, *used, true ) ) { best_dist = new_dist; @@ -3613,8 +3640,9 @@ void npc::heal_player( player &patient ) return; } + Character &player_character = get_player_character(); // Close enough to heal! - bool u_see = g->u.sees( *this ) || g->u.sees( patient ); + bool u_see = player_character.sees( *this ) || player_character.sees( patient ); if( u_see ) { add_msg( _( "%1$s heals %2$s." ), disp_name(), patient.disp_name() ); } @@ -3635,7 +3663,7 @@ void npc::heal_player( player &patient ) void npc:: pretend_heal( player &patient, item used ) { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( _( "%1$s heals %2$s." ), disp_name(), patient.disp_name() ); // you can tell that it's not real by looking at your HP though } @@ -3669,7 +3697,7 @@ void npc::heal_self() return; } - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( _( "%s applies a %s" ), disp_name(), used.tname() ); } warn_about( "heal_self", 1_turns ); @@ -3689,7 +3717,7 @@ void npc::use_painkiller() debugmsg( "NPC tried to use painkillers, but has none!" ); move_pause(); } else { - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( _( "%1$s takes some %2$s." ), disp_name(), it->tname() ); } item_location loc = item_location( *this, it ); @@ -3791,8 +3819,9 @@ bool npc::consume_food_from_camp() if( !is_player_ally() ) { return false; } + Character &player_character = get_player_character(); cata::optional potential_bc; - for( const tripoint &camp_pos : g->u.camps ) { + for( const tripoint &camp_pos : player_character.camps ) { if( rl_dist( camp_pos, global_omt_location() ) < 3 ) { potential_bc = overmap_buffer.find_camp( camp_pos.xy() ); if( potential_bc ) { @@ -3809,7 +3838,7 @@ bool npc::consume_food_from_camp() set_thirst( 0 ); return true; } - faction *yours = g->u.get_faction(); + faction *yours = player_character.get_faction(); int camp_kcals = std::min( std::max( 0, 19 * get_healthy_kcal() / 20 - get_stored_kcal() - stomach.get_calories() ), yours->food_supply ); if( camp_kcals > 0 ) { @@ -3864,7 +3893,7 @@ bool npc::consume_food() return consumed; } -void npc::mug_player( player &mark ) +void npc::mug_player( Character &mark ) { if( mark.is_armed() ) { make_angry(); @@ -3876,7 +3905,8 @@ void npc::mug_player( player &mark ) return; } - const bool u_see = g->u.sees( *this ) || g->u.sees( mark ); + Character &player_character = get_player_character(); + const bool u_see = player_character.sees( *this ) || player_character.sees( mark ); if( mark.cash > 0 ) { if( !is_hallucination() ) { // hallucinations can't take items cash += mark.cash; @@ -3942,7 +3972,7 @@ void npc::mug_player( player &mark ) } } -void npc::look_for_player( const player &sought ) +void npc::look_for_player( const Character &sought ) { complain_about( "look_for_player", 5_minutes, "", false ); update_path( sought.pos() ); @@ -3985,7 +4015,8 @@ void npc::look_for_player( const player &sought ) bool npc::saw_player_recently() const { - return last_player_seen_pos && g->m.inbounds( *last_player_seen_pos ) && last_seen_player_turn > 0; + return last_player_seen_pos && get_map().inbounds( *last_player_seen_pos ) && + last_seen_player_turn > 0; } bool npc::has_omt_destination() const @@ -3998,13 +4029,15 @@ void npc::reach_omt_destination() if( !omt_path.empty() ) { omt_path.clear(); } + map &here = get_map(); if( is_travelling() ) { - guard_pos = g->m.getabs( pos() ); + guard_pos = here.getabs( pos() ); goal = no_goal_point; if( is_player_ally() ) { + Character &player_character = get_player_character(); talk_function::assign_guard( *this ); - if( rl_dist( g->u.pos(), pos() ) > SEEX * 2 || !g->u.sees( pos() ) ) { - if( g->u.has_item_with_flag( "TWO_WAY_RADIO", true ) && + if( rl_dist( player_character.pos(), pos() ) > SEEX * 2 || !player_character.sees( pos() ) ) { + if( player_character.has_item_with_flag( "TWO_WAY_RADIO", true ) && has_item_with_flag( "TWO_WAY_RADIO", true ) ) { add_msg( m_info, _( "From your two-way radio you hear %s reporting in, " "'I've arrived, boss!'" ), disp_name() ); @@ -4031,7 +4064,7 @@ void npc::reach_omt_destination() } // If we are guarding, remember our position in case we get forcibly moved goal = global_omt_location(); - if( guard_pos == g->m.getabs( pos() ) ) { + if( guard_pos == here.getabs( pos() ) ) { // This is the specific point return; } @@ -4040,10 +4073,10 @@ void npc::reach_omt_destination() // No point recalculating the path to get home move_to_next(); } else if( guard_pos != no_goal_point ) { - update_path( g->m.getlocal( guard_pos ) ); + update_path( here.getlocal( guard_pos ) ); move_to_next(); } else { - guard_pos = g->m.getabs( pos() ); + guard_pos = here.getabs( pos() ); } } @@ -4067,7 +4100,7 @@ void npc::set_omt_destination() // all of the following luxuries are at ground level. // so please wallow in hunger & fear if below ground. - if( posz() != 0 && !g->m.has_zlevels() ) { + if( posz() != 0 && !get_map().has_zlevels() ) { goal = no_goal_point; return; } @@ -4137,8 +4170,9 @@ void npc::set_omt_destination() void npc::go_to_omt_destination() { + map &here = get_map(); if( ai_cache.guard_pos ) { - if( g->m.getabs( pos() ) == *ai_cache.guard_pos ) { + if( here.getabs( pos() ) == *ai_cache.guard_pos ) { path.clear(); ai_cache.guard_pos = cata::nullopt; move_pause(); @@ -4180,18 +4214,18 @@ void npc::go_to_omt_destination() return; } } - tripoint sm_tri = g->m.getlocal( sm_to_ms_copy( omt_to_sm_copy( omt_path.back() ) ) ); + tripoint sm_tri = here.getlocal( sm_to_ms_copy( omt_to_sm_copy( omt_path.back() ) ) ); tripoint centre_sub = sm_tri + point( SEEX, SEEY ); - if( !g->m.passable( centre_sub ) ) { - auto candidates = g->m.points_in_radius( centre_sub, 2 ); + if( !here.passable( centre_sub ) ) { + auto candidates = here.points_in_radius( centre_sub, 2 ); for( const auto &elem : candidates ) { - if( g->m.passable( elem ) ) { + if( here.passable( elem ) ) { centre_sub = elem; break; } } } - path = g->m.route( pos(), centre_sub, get_pathfinding_settings(), get_path_avoid() ); + path = here.route( pos(), centre_sub, get_pathfinding_settings(), get_path_avoid() ); add_msg( m_debug, "%s going (%d,%d,%d)->(%d,%d,%d)", name, omt_pos.x, omt_pos.y, omt_pos.z, goal.x, goal.y, goal.z ); @@ -4205,7 +4239,7 @@ void npc::go_to_omt_destination() void npc::guard_current_pos() { goal = global_omt_location(); - guard_pos = g->m.getabs( pos() ); + guard_pos = get_map().getabs( pos() ); } std::string npc_action_name( npc_action action ) @@ -4404,7 +4438,7 @@ bool npc::complain_about( const std::string &issue, const time_duration &dur, // Don't wake player up with non-serious complaints // Stop complaining while asleep const bool do_complain = force || ( rules.has_flag( ally_rule::allow_complain ) && - !g->u.in_sleep_state() && !in_sleep_state() ); + !get_player_character().in_sleep_state() && !in_sleep_state() ); if( complain_since( issue, dur ) && do_complain ) { say( speech, priority ); @@ -4420,11 +4454,12 @@ bool npc::complain() static const std::string fatigue_string = "fatigue"; static const std::string bite_string = "bite"; static const std::string bleed_string = "bleed"; + static const std::string hypovolemia_string = "hypovolemia"; static const std::string radiation_string = "radiation"; static const std::string hunger_string = "hunger"; static const std::string thirst_string = "thirst"; - if( !is_player_ally() || !g->u.sees( *this ) ) { + if( !is_player_ally() || !get_player_character().sees( *this ) ) { return false; } @@ -4489,8 +4524,23 @@ bool npc::complain() //Bleeding every 5 minutes if( has_effect( effect_bleed ) ) { const bodypart_id &bp = convert_bp( bp_affected( *this, effect_bleed ) ); - std::string speech = string_format( _( "My %s is bleeding!" ), body_part_name( bp ) ); - if( complain_about( bleed_string, 5_minutes, speech ) ) { + std::string speech; + time_duration often; + if( get_effect( effect_bleed, bp->token ).get_intensity() < 10 ) { + speech = string_format( _( "My %s is bleeding!" ), body_part_name( bp ) ); + often = 5_minutes; + } else { + speech = string_format( _( "My %s is bleeding badly!" ), body_part_name( bp ) ); + often = 1_minutes; + } + if( complain_about( bleed_string, often, speech ) ) { + return true; + } + } + + if( has_effect( effect_hypovolemia ) ) { + std::string speech = _( "I've lost lot of blood." ); + if( complain_about( hypovolemia_string, 10_minutes, speech ) ) { return true; } } @@ -4526,7 +4576,7 @@ void npc::do_reload( const item &it ) moves -= reload_time; recoil = MAX_RECOIL; - if( g->u.sees( *this ) ) { + if( get_player_character().sees( *this ) ) { add_msg( _( "%1$s reloads their %2$s." ), name, it.tname() ); sfx::play_variant_sound( "reload", it.typeId().str(), sfx::get_heard_volume( pos() ), sfx::get_heard_angle( pos() ) ); @@ -4539,8 +4589,8 @@ void npc::do_reload( const item &it ) bool npc::adjust_worn() { bool any_broken = false; - for( int i = 0; i < num_hp_parts; i++ ) { - if( is_limb_broken( static_cast( i ) ) ) { + for( const bodypart_id &bp : get_all_body_parts() ) { + if( is_limb_broken( bp ) ) { any_broken = true; break; } @@ -4550,9 +4600,9 @@ bool npc::adjust_worn() return false; } const auto covers_broken = [this]( const item & it, side s ) { - const auto covered = it.get_covered_body_parts( s ); - for( size_t i = 0; i < num_hp_parts; i++ ) { - if( hp_cur[ i ] <= 0 && covered.test( convert_bp( hp_to_bp( static_cast( i ) ) ) ) ) { + const body_part_set covered = it.get_covered_body_parts( s ); + for( const std::pair &elem : get_body() ) { + if( elem.second.get_hp_cur() <= 0 && covered.test( elem.first ) ) { return true; } } diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 2723d0657e06f..52db3954f51a1 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -138,7 +138,7 @@ std::string talk_trial::name() const /** Time (in turns) and cost (in cent) for training: */ time_duration calc_skill_training_time( const npc &p, const skill_id &skill ) { - return 1_minutes + 30_seconds * g->u.get_skill_level( skill ) - + return 1_minutes + 30_seconds * get_player_character().get_skill_level( skill ) - 1_seconds * p.get_skill_level( skill ); } @@ -340,7 +340,7 @@ static void npc_temp_orders_menu( const std::vector &npc_list ) static void tell_veh_stop_following() { - for( wrapped_vehicle &veh : g->m.get_vehicles() ) { + for( wrapped_vehicle &veh : get_map().get_vehicles() ) { vehicle *v = veh.v; if( v->has_engine_type( fuel_type_animal, false ) && v->is_owned_by( g->u ) ) { v->is_following = false; @@ -351,7 +351,7 @@ static void tell_veh_stop_following() static void assign_veh_to_follow() { - for( wrapped_vehicle &veh : g->m.get_vehicles() ) { + for( wrapped_vehicle &veh : get_map().get_vehicles() ) { vehicle *v = veh.v; if( v->has_engine_type( fuel_type_animal, false ) && v->is_owned_by( g->u ) ) { v->activate_animal_follow(); @@ -361,7 +361,7 @@ static void assign_veh_to_follow() static void tell_magic_veh_to_follow() { - for( wrapped_vehicle &veh : g->m.get_vehicles() ) { + for( wrapped_vehicle &veh : get_map().get_vehicles() ) { vehicle *v = veh.v; if( v->magic ) { for( const vpart_reference &vp : v->get_all_parts() ) { @@ -377,7 +377,7 @@ static void tell_magic_veh_to_follow() static void tell_magic_veh_stop_following() { - for( wrapped_vehicle &veh : g->m.get_vehicles() ) { + for( wrapped_vehicle &veh : get_map().get_vehicles() ) { vehicle *v = veh.v; if( v->magic ) { for( const vpart_reference &vp : v->get_all_parts() ) { @@ -415,14 +415,14 @@ void game::chat() if( g->u.has_trait( trait_PROF_FOODP ) && !( g->u.is_wearing( itype_id( "foodperson_mask" ) ) || g->u.is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) { - g->u.add_msg_if_player( m_warning, _( "You can't speak without your face!" ) ); + add_msg( m_warning, _( "You can't speak without your face!" ) ); return; } std::vector animal_vehicles; std::vector following_vehicles; std::vector magic_vehicles; std::vector magic_following_vehicles; - for( auto &veh : g->m.get_vehicles() ) { + for( auto &veh : get_map().get_vehicles() ) { auto &v = veh.v; if( v->has_engine_type( fuel_type_animal, false ) && v->is_owned_by( g->u ) ) { animal_vehicles.push_back( v ); @@ -627,8 +627,9 @@ void game::chat() void npc::handle_sound( const sounds::sound_t spriority, const std::string &description, int heard_volume, const tripoint &spos ) { - const tripoint s_abs_pos = g->m.getabs( spos ); - const tripoint my_abs_pos = g->m.getabs( pos() ); + const map &here = get_map(); + const tripoint s_abs_pos = here.getabs( spos ); + const tripoint my_abs_pos = here.getabs( pos() ); add_msg( m_debug, "%s heard '%s', priority %d at volume %d from %d:%d, my pos %d:%d", disp_name(), description, static_cast( spriority ), heard_volume, @@ -976,14 +977,8 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const } std::vector trainable = p->skills_offered_to( g->u ); std::vector styles = p->styles_offered_to( g->u ); - const std::vector spells = p->magic.spells(); - std::vector teachable_spells; - for( const spell_id &sp : spells ) { - if( g->u.magic.can_learn_spell( g->u, sp ) ) { - teachable_spells.emplace_back( sp ); - } - } - if( trainable.empty() && styles.empty() && teachable_spells.empty() ) { + std::vector teachable = p->spells_offered_to( g->u ); + if( trainable.empty() && styles.empty() && teachable.empty() ) { return _( "Sorry, but it doesn't seem I have anything to teach you." ); } else { return _( "Here's what I can teach you…" ); @@ -1007,27 +1002,7 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const } return response; } else if( topic == "TALK_DESCRIBE_MISSION" ) { - switch( p->mission ) { - case NPC_MISSION_SHELTER: - return string_format( _( "I'm holing up here for safety. Long term, %s" ), - p->myclass.obj().get_job_description() ); - case NPC_MISSION_SHOPKEEP: - return _( "I run the shop here." ); - case NPC_MISSION_GUARD: - case NPC_MISSION_GUARD_ALLY: - case NPC_MISSION_GUARD_PATROL: - return string_format( _( "Currently, I'm guarding this location. Overall, %s" ), - p->myclass.obj().get_job_description() ); - case NPC_MISSION_ACTIVITY: - return string_format( _( "Right now, I'm . In general, %s" ), - p->myclass.obj().get_job_description() ); - case NPC_MISSION_TRAVELLING: - case NPC_MISSION_NULL: - return p->myclass.obj().get_job_description(); - default: - return string_format( "ERROR: Someone forgot to code an npc_mission text for " - "mission: %d.", static_cast( p->mission ) ); - } // switch (p->mission) + return p->describe_mission(); } else if( topic == "TALK_SHOUT" ) { alpha->shout(); if( alpha->is_deaf() ) { @@ -1275,13 +1250,13 @@ void dialogue::gen_responses( const talk_topic &the_topic ) if( !styleid.is_valid() ) { const spell_id &sp_id = spell_id( backlog.name ); if( p->magic.knows_spell( sp_id ) ) { - add_response( string_format( _( "Yes, let's resume training %s" ), sp_id->name ), - "TALK_TRAIN_START", sp_id ); + add_response( string_format( _( "Yes, let's resume training %s" ), + sp_id->name ), "TALK_TRAIN_START", sp_id ); } } else { const martialart &style = styleid.obj(); - add_response( string_format( _( "Yes, let's resume training %s" ), style.name ), "TALK_TRAIN_START", - style ); + add_response( string_format( _( "Yes, let's resume training %s" ), + style.name ), "TALK_TRAIN_START", style ); } } else { add_response( string_format( _( "Yes, let's resume training %s" ), skillt->name() ), @@ -1290,25 +1265,12 @@ void dialogue::gen_responses( const talk_topic &the_topic ) } std::vector styles = p->styles_offered_to( g->u ); std::vector trainable = p->skills_offered_to( g->u ); - const std::vector spells = p->magic.spells(); - std::vector teachable_spells; - for( const spell_id &sp : spells ) { - const spell &temp_spell = p->magic.get_spell( sp ); - if( g->u.magic.can_learn_spell( g->u, sp ) ) { - if( g->u.magic.knows_spell( sp ) ) { - const spell &player_spell = g->u.magic.get_spell( sp ); - if( player_spell.is_max_level() || player_spell.get_level() >= temp_spell.get_level() ) { - continue; - } - } - teachable_spells.emplace_back( sp ); - } - } - if( trainable.empty() && styles.empty() && teachable_spells.empty() ) { + std::vector teachable = p->spells_offered_to( g->u ); + if( trainable.empty() && styles.empty() && teachable.empty() ) { add_response_none( _( "Oh, okay." ) ); return; } - for( const spell_id &sp : teachable_spells ) { + for( const spell_id &sp : teachable ) { const spell &temp_spell = p->magic.get_spell( sp ); const bool knows = g->u.magic.knows_spell( sp ); const int cost = p->calc_spell_training_cost( knows, temp_spell.get_difficulty(), @@ -1318,8 +1280,8 @@ void dialogue::gen_responses( const talk_topic &the_topic ) text = string_format( _( "%s: 1 hour lesson (cost %s)" ), temp_spell.name(), format_money( cost ) ); } else { - text = string_format( _( "%s: teaching spell knowledge (cost %s)" ), temp_spell.name(), - format_money( cost ) ); + text = string_format( _( "%s: teaching spell knowledge (cost %s)" ), + temp_spell.name(), format_money( cost ) ); } add_response( text, "TALK_TRAIN_START", sp ); } @@ -1994,13 +1956,18 @@ void talk_effect_fun_t::set_remove_trait( const JsonObject &jo, const std::strin void talk_effect_fun_t::set_add_var( const JsonObject &jo, const std::string &member, bool is_npc ) { const std::string var_name = get_talk_varname( jo, member ); - const std::string &value = jo.get_string( "value" ); - function = [is_npc, var_name, value]( const dialogue & d ) { + const bool time_check = jo.has_member( "time" ) && jo.get_bool( "time" ); + const std::string &value = time_check ? "" : jo.get_string( "value" ); + function = [is_npc, var_name, value, time_check]( const dialogue & d ) { player *actor = d.alpha; if( is_npc ) { actor = dynamic_cast( d.beta ); } - actor->set_value( var_name, value ); + if( time_check ) { + actor->set_value( var_name, string_format( "%d", to_turn( calendar::turn ) ) ); + } else { + actor->set_value( var_name, value ); + } }; } @@ -2363,7 +2330,7 @@ void talk_effect_fun_t::set_add_mission( const std::string &mission_id ) function = [mission_id]( const dialogue & d ) { npc &p = *d.beta; mission *miss = mission::reserve_new( mission_type_id( mission_id ), p.getID() ); - miss->assign( g->u ); + miss->assign( get_avatar() ); p.chatbin.missions_assigned.push_back( miss ); }; } @@ -2948,26 +2915,31 @@ dynamic_line_t dynamic_line_t::from_member( const JsonObject &jo, const std::str } else if( jo.has_object( member_name ) ) { return dynamic_line_t( jo.get_object( member_name ) ); } else if( jo.has_string( member_name ) ) { - return dynamic_line_t( jo.get_string( member_name ) ); + translation line; + jo.read( member_name, line ); + return dynamic_line_t( line ); } else { return dynamic_line_t{}; } } -dynamic_line_t::dynamic_line_t( const std::string &line ) +dynamic_line_t::dynamic_line_t( const translation &line ) { function = [line]( const dialogue & ) { - return _( line ); + return line.translated(); }; } + dynamic_line_t::dynamic_line_t( const JsonObject &jo ) { if( jo.has_member( "and" ) ) { std::vector lines; for( const JsonValue entry : jo.get_array( "and" ) ) { if( entry.test_string() ) { - lines.emplace_back( entry.get_string() ); + translation line; + entry.read( line ); + lines.emplace_back( line ); } else if( entry.test_array() ) { lines.emplace_back( entry.get_array() ); } else if( entry.test_object() ) { @@ -2995,6 +2967,11 @@ dynamic_line_t::dynamic_line_t( const JsonObject &jo ) }; } else if( jo.has_string( "gendered_line" ) ) { const std::string line = jo.get_string( "gendered_line" ); + if( test_mode ) { + // HACK: check text style by reading it as a translation object + translation dummy; + jo.read( "gendered_line", dummy ); + } if( !jo.has_array( "relevant_genders" ) ) { jo.throw_error( R"(dynamic line with "gendered_line" must also have "relevant_genders")" ); @@ -3051,7 +3028,9 @@ dynamic_line_t::dynamic_line_t( const JsonArray &ja ) std::vector lines; for( const JsonValue entry : ja ) { if( entry.test_string() ) { - lines.emplace_back( entry.get_string() ); + translation line; + entry.read( line ); + lines.emplace_back( line ); } else if( entry.test_array() ) { lines.emplace_back( entry.get_array() ); } else if( entry.test_object() ) { diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 781d9aba5cc0c..3a4f3067ae35c 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -103,7 +103,7 @@ void talk_function::assign_mission( npc &p ) debugmsg( "assign_mission: mission_selected == nullptr" ); return; } - miss->assign( g->u ); + miss->assign( get_avatar() ); p.chatbin.missions_assigned.push_back( miss ); const auto it = std::find( p.chatbin.missions.begin(), p.chatbin.missions.end(), miss ); p.chatbin.missions.erase( it ); @@ -302,7 +302,8 @@ void talk_function::goto_location( npc &p ) selection_menu.text = _( "Select a destination" ); std::vector camps; tripoint destination; - for( auto elem : g->u.camps ) { + Character &player_character = get_player_character(); + for( auto elem : player_character.camps ) { if( elem == p.global_omt_location() ) { continue; } @@ -328,7 +329,7 @@ void talk_function::goto_location( npc &p ) return; } if( index == static_cast( camps.size() ) ) { - destination = g->u.global_omt_location(); + destination = player_character.global_omt_location(); } else { auto selected_camp = camps[index]; destination = selected_camp->camp_omt_pos(); @@ -449,7 +450,8 @@ void talk_function::insult_combat( npc &p ) void talk_function::bionic_install( npc &p ) { - item_location bionic = game_menus::inv::install_bionic( g->u, g->u, true ); + avatar &player_character = get_avatar(); + item_location bionic = game_menus::inv::install_bionic( player_character, player_character, true ); if( !bionic ) { return; @@ -464,15 +466,16 @@ void talk_function::bionic_install( npc &p ) } //Makes the doctor awesome at installing but not perfect - if( g->u.can_install_bionics( it, p, false, 20 ) ) { + if( player_character.can_install_bionics( it, p, false, 20 ) ) { bionic.remove_item(); - g->u.install_bionics( it, p, false, 20 ); + player_character.install_bionics( it, p, false, 20 ); } } void talk_function::bionic_remove( npc &p ) { - const bionic_collection all_bio = *g->u.my_bionics; + Character &player_character = get_player_character(); + const bionic_collection all_bio = *player_character.my_bionics; if( all_bio.empty() ) { popup( _( "You don't have any bionics installed…" ) ); return; @@ -515,9 +518,11 @@ void talk_function::bionic_remove( npc &p ) } //Makes the doctor awesome at installing but not perfect - if( g->u.can_uninstall_bionic( bionic_id( bionic_types[bionic_index].str() ), p, false ) ) { - g->u.amount_of( bionic_types[bionic_index] ); // ??? this does nothing, it just queries the count - g->u.uninstall_bionic( bionic_id( bionic_types[bionic_index].str() ), p, false ); + if( player_character.can_uninstall_bionic( bionic_id( bionic_types[bionic_index].str() ), p, + false ) ) { + player_character.amount_of( + bionic_types[bionic_index] ); // ??? this does nothing, it just queries the count + player_character.uninstall_bionic( bionic_id( bionic_types[bionic_index].str() ), p, false ); } } @@ -545,8 +550,9 @@ void talk_function::give_equipment( npc &p ) item it = *giving[chosen].loc.get_item(); giving[chosen].loc.remove_item(); popup( _( "%1$s gives you a %2$s" ), p.name, it.tname() ); - it.set_owner( g->u ); - g->u.i_add( it ); + Character &player_character = get_player_character(); + it.set_owner( player_character ); + player_character.i_add( it ); p.op_of_u.owed -= giving[chosen].price; p.add_effect( effect_asked_for_item, 3_hours ); } @@ -554,22 +560,22 @@ void talk_function::give_equipment( npc &p ) void talk_function::give_aid( npc &p ) { p.add_effect( effect_currently_busy, 30_minutes ); - for( int i = 0; i < num_hp_parts; i++ ) { - const body_part bp_healed = player::hp_to_bp( static_cast( i ) ); - g->u.heal( static_cast( i ), 5 * rng( 2, 5 ) ); - if( g->u.has_effect( effect_bite, bp_healed ) ) { - g->u.remove_effect( effect_bite, bp_healed ); + Character &player_character = get_player_character(); + for( const bodypart_id &bp : player_character.get_all_body_parts( true ) ) { + player_character.heal( bp, 5 * rng( 2, 5 ) ); + if( player_character.has_effect( effect_bite, bp->token ) ) { + player_character.remove_effect( effect_bite, bp->token ); } - if( g->u.has_effect( effect_bleed, bp_healed ) ) { - g->u.remove_effect( effect_bleed, bp_healed ); + if( player_character.has_effect( effect_bleed, bp->token ) ) { + player_character.remove_effect( effect_bleed, bp->token ); } - if( g->u.has_effect( effect_infected, bp_healed ) ) { - g->u.remove_effect( effect_infected, bp_healed ); + if( player_character.has_effect( effect_infected, bp->token ) ) { + player_character.remove_effect( effect_infected, bp->token ); } } const int moves = to_moves( 100_minutes ); - g->u.assign_activity( ACT_WAIT_NPC, moves ); - g->u.activity.str_values.push_back( p.name ); + player_character.assign_activity( ACT_WAIT_NPC, moves ); + player_character.activity.str_values.push_back( p.name ); } void talk_function::give_all_aid( npc &p ) @@ -577,18 +583,17 @@ void talk_function::give_all_aid( npc &p ) p.add_effect( effect_currently_busy, 30_minutes ); give_aid( p ); for( npc &guy : g->all_npcs() ) { - if( guy.is_walking_with() && rl_dist( guy.pos(), g->u.pos() ) < PICKUP_RANGE ) { - for( int i = 0; i < num_hp_parts; i++ ) { - const body_part bp_healed = player::hp_to_bp( static_cast( i ) ); - guy.heal( static_cast( i ), 5 * rng( 2, 5 ) ); - if( guy.has_effect( effect_bite, bp_healed ) ) { - guy.remove_effect( effect_bite, bp_healed ); + if( guy.is_walking_with() && rl_dist( guy.pos(), get_player_character().pos() ) < PICKUP_RANGE ) { + for( const bodypart_id &bp : guy.get_all_body_parts( true ) ) { + guy.heal( bp, 5 * rng( 2, 5 ) ); + if( guy.has_effect( effect_bite, bp->token ) ) { + guy.remove_effect( effect_bite, bp->token ); } - if( guy.has_effect( effect_bleed, bp_healed ) ) { - guy.remove_effect( effect_bleed, bp_healed ); + if( guy.has_effect( effect_bleed, bp->token ) ) { + guy.remove_effect( effect_bleed, bp->token ); } - if( guy.has_effect( effect_infected, bp_healed ) ) { - guy.remove_effect( effect_infected, bp_healed ); + if( guy.has_effect( effect_infected, bp->token ) ) { + guy.remove_effect( effect_infected, bp->token ); } } } @@ -608,9 +613,10 @@ static void generic_barber( const std::string &mut_type ) int index = 0; hair_menu.addentry( index, true, 'q', _( "Actually… I've changed my mind." ) ); std::vector hair_muts = get_mutations_in_type( mut_type ); + Character &player_character = get_player_character(); trait_id cur_hair; for( const trait_id &elem : hair_muts ) { - if( g->u.has_trait( elem ) ) { + if( player_character.has_trait( elem ) ) { cur_hair = elem; } index += 1; @@ -619,10 +625,10 @@ static void generic_barber( const std::string &mut_type ) hair_menu.query(); int choice = hair_menu.ret; if( choice != 0 ) { - if( g->u.has_trait( cur_hair ) ) { - g->u.remove_mutation( cur_hair, true ); + if( player_character.has_trait( cur_hair ) ) { + player_character.remove_mutation( cur_hair, true ); } - g->u.set_mutation( hair_muts[ choice - 1 ] ); + player_character.set_mutation( hair_muts[ choice - 1 ] ); add_msg( m_info, _( "You get a trendy new cut!" ) ); } } @@ -639,41 +645,44 @@ void talk_function::barber_hair( npc &/*p*/ ) void talk_function::buy_haircut( npc &p ) { - g->u.add_morale( MORALE_HAIRCUT, 5, 5, 720_minutes, 3_minutes ); + Character &player_character = get_player_character(); + player_character.add_morale( MORALE_HAIRCUT, 5, 5, 720_minutes, 3_minutes ); const int moves = to_moves( 20_minutes ); - g->u.assign_activity( ACT_WAIT_NPC, moves ); - g->u.activity.str_values.push_back( p.name ); + player_character.assign_activity( ACT_WAIT_NPC, moves ); + player_character.activity.str_values.push_back( p.name ); add_msg( m_good, _( "%s gives you a decent haircut…" ), p.name ); } void talk_function::buy_shave( npc &p ) { - g->u.add_morale( MORALE_SHAVE, 10, 10, 360_minutes, 3_minutes ); + Character &player_character = get_player_character(); + player_character.add_morale( MORALE_SHAVE, 10, 10, 360_minutes, 3_minutes ); const int moves = to_moves( 5_minutes ); - g->u.assign_activity( ACT_WAIT_NPC, moves ); - g->u.activity.str_values.push_back( p.name ); + player_character.assign_activity( ACT_WAIT_NPC, moves ); + player_character.activity.str_values.push_back( p.name ); add_msg( m_good, _( "%s gives you a decent shave…" ), p.name ); } void talk_function::morale_chat( npc &p ) { - g->u.add_morale( MORALE_CHAT, rng( 3, 10 ), 10, 200_minutes, 5_minutes / 2 ); + get_player_character().add_morale( MORALE_CHAT, rng( 3, 10 ), 10, 200_minutes, 5_minutes / 2 ); add_msg( m_good, _( "That was a pleasant conversation with %s…" ), p.disp_name() ); } void talk_function::morale_chat_activity( npc &p ) { + Character &player_character = get_player_character(); const int moves = to_moves( 10_minutes ); - g->u.assign_activity( ACT_SOCIALIZE, moves ); - g->u.activity.str_values.push_back( p.name ); + player_character.assign_activity( ACT_SOCIALIZE, moves ); + player_character.activity.str_values.push_back( p.name ); add_msg( m_good, _( "That was a pleasant conversation with %s." ), p.disp_name() ); - g->u.add_morale( MORALE_CHAT, rng( 3, 10 ), 10, 200_minutes, 5_minutes / 2 ); + player_character.add_morale( MORALE_CHAT, rng( 3, 10 ), 10, 200_minutes, 5_minutes / 2 ); } void talk_function::buy_10_logs( npc &p ) { std::vector places = overmap_buffer.find_all( - g->u.global_omt_location(), "ranch_camp_67", 1, false ); + get_player_character().global_omt_location(), "ranch_camp_67", 1, false ); if( places.empty() ) { debugmsg( "Couldn't find %s", "ranch_camp_67" ); return; @@ -699,7 +708,7 @@ void talk_function::buy_10_logs( npc &p ) void talk_function::buy_100_logs( npc &p ) { std::vector places = overmap_buffer.find_all( - g->u.global_omt_location(), "ranch_camp_67", 1, false ); + get_player_character().global_omt_location(), "ranch_camp_67", 1, false ); if( places.empty() ) { debugmsg( "Couldn't find %s", "ranch_camp_67" ); return; @@ -727,7 +736,7 @@ void talk_function::follow( npc &p ) g->add_npc_follower( p.getID() ); p.set_attitude( NPCATT_FOLLOW ); p.set_fac( faction_id( "your_followers" ) ); - g->u.cash += p.cash; + get_player_character().cash += p.cash; p.cash = 0; } @@ -767,7 +776,7 @@ void talk_function::hostile( npc &p ) return; } - if( p.sees( g->u ) ) { + if( p.sees( get_player_character() ) ) { add_msg( _( "%s turns hostile!" ), p.name ); } @@ -823,19 +832,21 @@ void talk_function::stranger_neutral( npc &p ) void talk_function::drop_stolen_item( npc &p ) { - for( auto &elem : g->u.inv_dump() ) { + Character &player_character = get_player_character(); + map &here = get_map(); + for( auto &elem : player_character.inv_dump() ) { if( elem->is_old_owner( p ) ) { - item to_drop = g->u.i_rem( elem ); + item to_drop = player_character.i_rem( elem ); to_drop.remove_old_owner(); to_drop.set_owner( p ); - g->m.add_item_or_charges( g->u.pos(), to_drop ); + here.add_item_or_charges( player_character.pos(), to_drop ); } } if( p.known_stolen_item ) { p.known_stolen_item = nullptr; } - if( g->u.is_hauling() ) { - g->u.stop_hauling(); + if( player_character.is_hauling() ) { + player_character.stop_hauling(); } p.set_attitude( NPCATT_NULL ); } @@ -865,24 +876,26 @@ void talk_function::drop_weapon( npc &p ) if( p.is_hallucination() ) { return; } - g->m.add_item_or_charges( p.pos(), p.remove_weapon() ); + get_map().add_item_or_charges( p.pos(), p.remove_weapon() ); } void talk_function::player_weapon_away( npc &/*p*/ ) { - g->u.i_add( g->u.remove_weapon() ); + Character &player_character = get_player_character(); + player_character.i_add( player_character.remove_weapon() ); } void talk_function::player_weapon_drop( npc &/*p*/ ) { - g->m.add_item_or_charges( g->u.pos(), g->u.remove_weapon() ); + Character &player_character = get_player_character(); + get_map().add_item_or_charges( player_character.pos(), player_character.remove_weapon() ); } void talk_function::lead_to_safety( npc &p ) { const auto mission = mission::reserve_new( mission_type_id( "MISSION_REACH_SAFETY" ), character_id() ); - mission->assign( g->u ); + mission->assign( get_avatar() ); p.goal = mission->get_target(); p.set_attitude( NPCATT_LEAD ); } @@ -906,21 +919,24 @@ void talk_function::start_training( npc &p ) const matype_id &style = p.chatbin.style; const spell_id &sp_id = p.chatbin.dialogue_spell; int expert_multiplier = 1; - if( skill.is_valid() && g->u.get_skill_level( skill ) < p.get_skill_level( skill ) ) { + Character &player_character = get_player_character(); + if( skill.is_valid() && player_character.get_skill_level( skill ) < p.get_skill_level( skill ) ) { cost = calc_skill_training_cost( p, skill ); time = calc_skill_training_time( p, skill ); name = skill.str(); - } else if( p.chatbin.style.is_valid() && !g->u.martial_arts_data.has_martialart( style ) ) { + } else if( p.chatbin.style.is_valid() && + !player_character.martial_arts_data.has_martialart( style ) ) { cost = calc_ma_style_training_cost( p, style ); time = calc_ma_style_training_time( p, style ); name = p.chatbin.style.str(); // already checked if can learn this spell in npctalk.cpp } else if( p.chatbin.dialogue_spell.is_valid() ) { const spell &temp_spell = p.magic.get_spell( sp_id ); - const bool knows = g->u.magic.knows_spell( sp_id ); + const bool knows = player_character.magic.knows_spell( sp_id ); cost = p.calc_spell_training_cost( knows, temp_spell.get_difficulty(), temp_spell.get_level() ); name = temp_spell.id().str(); - expert_multiplier = knows ? temp_spell.get_level() - g->u.magic.get_spell( sp_id ).get_level() : 1; + expert_multiplier = knows ? temp_spell.get_level() - player_character.magic.get_spell( + sp_id ).get_level() : 1; // quicker to learn with instruction as opposed to books. // if this is a known spell, then there is a set time to gain some exp. // if player doesn't know this spell, then the NPC will teach all of it @@ -930,7 +946,8 @@ void talk_function::start_training( npc &p ) if( knows ) { time = 1_hours; } else { - time = time_duration::from_seconds( clamp( g->u.magic.time_to_learn_spell( g->u, sp_id ) / 50, 7200, + time = time_duration::from_seconds( clamp( player_character.magic.time_to_learn_spell( + player_character, sp_id ) / 50, 7200, 21600 ) ); } } else { @@ -939,8 +956,8 @@ void talk_function::start_training( npc &p ) } mission *miss = p.chatbin.mission_selected; - if( miss != nullptr && miss->get_assigned_player_id() == g->u.getID() && - miss->is_complete( g->u.getID() ) ) { + if( miss != nullptr && miss->get_assigned_player_id() == player_character.getID() && + miss->is_complete( player_character.getID() ) ) { clear_mission( p ); } else if( !npc_trading::pay_npc( p, cost ) ) { return; @@ -948,7 +965,7 @@ void talk_function::start_training( npc &p ) player_activity act = player_activity( ACT_TRAIN, to_moves( time ), p.getID().get_value(), 0, name ); act.values.push_back( expert_multiplier ); - g->u.assign_activity( act ); + player_character.assign_activity( act ); p.add_effect( effect_asked_to_train, 6_hours ); } @@ -959,7 +976,7 @@ npc *pick_follower() std::vector locations; for( npc &guy : g->all_npcs() ) { - if( guy.is_player_ally() && g->u.sees( guy ) ) { + if( guy.is_player_ally() && get_player_character().sees( guy ) ) { followers.push_back( &guy ); locations.push_back( guy.pos() ); } diff --git a/src/npctrade.cpp b/src/npctrade.cpp index 6e5cf4312193f..95195e851b19d 100644 --- a/src/npctrade.cpp +++ b/src/npctrade.cpp @@ -163,6 +163,11 @@ std::vector npc_trading::init_buying( player &buyer, player &selle return; } + if( it.count() <= 0 ) { + debugmsg( "item %s has zero or negative charges", it.typeId().str() ); + return; + } + const int market_price = it.price( true ); int val = np.value( it, market_price ); if( ( is_npc && np.wants_to_sell( it, val, market_price ) ) || @@ -212,9 +217,13 @@ void item_pricing::set_values( int ip_count ) count = ip_count; } else { charges = i_p->count(); - price /= charges; - vol /= charges; - weight /= charges; + if( charges > 0 ) { + price /= charges; + vol /= charges; + weight /= charges; + } else { + debugmsg( "item %s has zero or negative charges", i_p->typeId().str() ); + } } } diff --git a/src/options.cpp b/src/options.cpp index f7c9cc54535f7..6419e39c0453a 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -2042,9 +2042,9 @@ void options_manager::add_options_world_default() 0.01, 10.0, 1.0, 0.01 ); - add( "NPC_DENSITY", "world_default", translate_marker( "NPC spawn rate scaling factor" ), - translate_marker( "A scaling factor that determines density of dynamic NPC spawns." ), - 0.0, 100.0, 0.1, 0.01 + add( "NPC_SPAWNTIME", "world_default", translate_marker( "Random NPC spawn time" ), + translate_marker( "Baseline average number of days between random NPC spawns. Average duration goes up with the number of NPCs already spawned. Set to 0 days to disable random NPCs." ), + 0.0, 100.0, 4.0, 0.01 ); add( "MONSTER_UPGRADE_FACTOR", "world_default", @@ -2118,26 +2118,6 @@ void options_manager::add_options_world_default() add_empty_line(); - add( "STATIC_NPC", "world_default", translate_marker( "Static NPCs" ), - translate_marker( "If true, static NPCs will spawn at pre-defined locations. Requires world reset." ), - true - ); - - add( "STARTING_NPC", "world_default", translate_marker( "Starting NPCs spawn" ), - translate_marker( "Determines whether starting NPCs should spawn, and if they do, how exactly." ), - { { "never", translate_marker( "Never" ) }, { "always", translate_marker( "Always" ) }, { "scenario", translate_marker( "Scenario-based" ) } }, - "scenario" - ); - - get_option( "STARTING_NPC" ).setPrerequisite( "STATIC_NPC" ); - - add( "RANDOM_NPC", "world_default", translate_marker( "Random NPCs" ), - translate_marker( "If true, the game will randomly spawn NPCs during gameplay." ), - false - ); - - add_empty_line(); - add( "RAD_MUTATION", "world_default", translate_marker( "Mutations by radiation" ), translate_marker( "If true, radiation causes the player to mutate." ), true @@ -2145,13 +2125,6 @@ void options_manager::add_options_world_default() add_empty_line(); - add( "ZLEVELS", "world_default", translate_marker( "Z-levels" ), - translate_marker( "If true, enables several features related to vertical movement, such as hauling items up stairs, climbing downspouts, and flying aircraft. May cause problems if toggled mid-game." ), - true - ); - - add_empty_line(); - add( "CHARACTER_POINT_POOLS", "world_default", translate_marker( "Character point pools" ), translate_marker( "Allowed point pools for character generation." ), { { "any", translate_marker( "Any" ) }, { "multi_pool", translate_marker( "Multi-pool only" ) }, { "no_freeform", translate_marker( "No freeform" ) } }, diff --git a/src/overmap.cpp b/src/overmap.cpp index de10717fa1b4f..02f7bc2afa154 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -1487,6 +1487,14 @@ void overmap::generate( const overmap *north, const overmap *east, requires_sub = generate_sub( z ); } while( requires_sub && ( --z >= -OVERMAP_DEPTH ) ); + // Always need at least one overlevel, but how many more + z = 1; + bool requires_over = false; + do { + requires_over = generate_over( z ); + } while( requires_over && ( ++z <= OVERMAP_HEIGHT ) ); + + // Place the monsters, now that the terrain is laid out place_mongroups(); place_radios(); @@ -1586,7 +1594,8 @@ bool overmap::generate_sub( const int z ) // but at this point we don't know requires_sub = true; } else if( oter_above == "mine_finale" ) { - for( auto &q : g->m.points_in_radius( p, 1, 0 ) ) { + map &here = get_map(); + for( auto &q : here.points_in_radius( p, 1, 0 ) ) { ter_set( q, oter_id( "spiral" ) ); } ter_set( p, oter_id( "spiral_hub" ) ); @@ -1761,6 +1770,77 @@ bool overmap::generate_sub( const int z ) return requires_sub; } +bool overmap::generate_over( const int z ) +{ + bool requires_over = false; + std::vector bridge_points; + + // These are so common that it's worth checking first as int. + const std::set skip_below = { + oter_id( "empty_rock" ), oter_id( "forest" ), oter_id( "field" ), + oter_id( "forest_thick" ), oter_id( "forest_water" ) + }; + + if( z == 1 ) { + for( int i = 0; i < OMAPX; i++ ) { + for( int j = 0; j < OMAPY; j++ ) { + tripoint p( i, j, z ); + const oter_id oter_below = ter( p + tripoint_below ); + const oter_id oter_ground = ter( tripoint( p.xy(), 0 ) ); + + // implicitly skip skip_below oter_ids + if( skip_below.find( oter_below ) != skip_below.end() ) { + continue; + } + + if( is_ot_match( "bridge", oter_ground, ot_match_type::type ) ) { + ter_set( p, oter_id( "bridge_road" + oter_get_rotation_string( oter_ground ) ) ); + bridge_points.emplace_back( i, j ); + } + } + } + } + + generate_bridgeheads( bridge_points ); + + return requires_over; +} + +void overmap::generate_bridgeheads( const std::vector &bridge_points ) +{ + std::vector> bridgehead_points; + for( const point &bp : bridge_points ) { + //const oter_id oter_ground = ter( tripoint( bp, 0 ) ); + const oter_id oter_ground_north = ter( tripoint( bp, 0 ) + tripoint_north ); + const oter_id oter_ground_south = ter( tripoint( bp, 0 ) + tripoint_south ); + const oter_id oter_ground_east = ter( tripoint( bp, 0 ) + tripoint_east ); + const oter_id oter_ground_west = ter( tripoint( bp, 0 ) + tripoint_west ); + const bool is_bridge_north = is_ot_match( "bridge", oter_ground_north, ot_match_type::type ); + const bool is_bridge_south = is_ot_match( "bridge", oter_ground_south, ot_match_type::type ); + const bool is_bridge_east = is_ot_match( "bridge", oter_ground_east, ot_match_type::type ); + const bool is_bridge_west = is_ot_match( "bridge", oter_ground_west, ot_match_type::type ); + + if( is_bridge_north ^ is_bridge_south || is_bridge_east ^ is_bridge_west ) { + std::string ramp_facing; + if( is_bridge_north ) { + ramp_facing = "_south"; + } else if( is_bridge_south ) { + ramp_facing = "_north"; + } else if( is_bridge_east ) { + ramp_facing = "_west"; + } else { + ramp_facing = "_east"; + } + bridgehead_points.emplace_back( bp, ramp_facing ); + } + } + for( const std::pair &bhp : bridgehead_points ) { + tripoint p( bhp.first, 0 ); + ter_set( p, oter_id( "bridgehead_ground" + bhp.second ) ); + ter_set( p + tripoint_above, oter_id( "bridgehead_ramp" + bhp.second ) ); + } +} + std::vector overmap::find_terrain( const std::string &term, int zlevel ) { std::vector found; @@ -2243,7 +2323,7 @@ void overmap::place_forest_trailheads() const auto trailhead_close_to_road = [&]( const tripoint & trailhead ) { bool close = false; - for( const tripoint &nearby_point : closest_tripoints_first( + for( const tripoint &nearby_point : closest_points_first( trailhead, settings.forest_trail.trailhead_road_distance ) ) { @@ -2929,7 +3009,7 @@ void overmap::build_city_street( const overmap_connection &connection, const poi return; } - const pf::path street_path = lay_out_street( connection, p, dir, cs + 1 ); + const pf::path street_path = lay_out_street( connection, p, dir, cs + 1 ); if( street_path.nodes.size() <= 1 ) { return; // Don't bother. @@ -3273,7 +3353,7 @@ bool overmap::build_slimepit( const tripoint &origin, int s ) const oter_id slimepit( "slimepit" ); bool requires_sub = false; - for( auto p : g->m.points_in_radius( origin, s + origin.z + 1, 0 ) ) { + for( auto p : get_map().points_in_radius( origin, s + origin.z + 1, 0 ) ) { int dist = square_dist( origin.xy(), p.xy() ); if( one_in( 2 * dist ) ) { chip_rock( p ); @@ -3319,10 +3399,11 @@ void overmap::build_mine( const tripoint &origin, int s ) ter_set( p, mine_finale_or_down ); } -pf::path overmap::lay_out_connection( const overmap_connection &connection, const point &source, - const point &dest, int z, const bool must_be_unexplored ) const +pf::path overmap::lay_out_connection( + const overmap_connection &connection, const point &source, const point &dest, int z, + const bool must_be_unexplored ) const { - const auto estimate = [&]( const pf::node & cur, const pf::node * prev ) { + const auto estimate = [&]( const pf::node &cur, const pf::node *prev ) { const auto &id( ter( tripoint( cur.pos, z ) ) ); const overmap_connection::subtype *subtype = connection.pick_subtype_for( id ); @@ -3370,8 +3451,8 @@ pf::path overmap::lay_out_connection( const overmap_connection &connection, cons return pf::find_path( source, dest, point( OMAPX, OMAPY ), estimate ); } -pf::path overmap::lay_out_street( const overmap_connection &connection, const point &source, - om_direction::type dir, size_t len ) const +pf::path overmap::lay_out_street( const overmap_connection &connection, const point &source, + om_direction::type dir, size_t len ) const { const tripoint from( source, 0 ); // See if we need to make another one "step" further. @@ -3433,8 +3514,8 @@ pf::path overmap::lay_out_street( const overmap_connection &connection, const po return pf::straight_path( source, static_cast( dir ), actual_len ); } -void overmap::build_connection( const overmap_connection &connection, const pf::path &path, int z, - const om_direction::type &initial_dir ) +void overmap::build_connection( const overmap_connection &connection, const pf::path &path, + int z, const om_direction::type &initial_dir ) { if( path.nodes.empty() ) { return; @@ -3442,8 +3523,8 @@ void overmap::build_connection( const overmap_connection &connection, const pf:: om_direction::type prev_dir = initial_dir; - const pf::node start = path.nodes.front(); - const pf::node end = path.nodes.back(); + const pf::node start = path.nodes.front(); + const pf::node end = path.nodes.back(); for( const auto &node : path.nodes ) { const tripoint pos( node.pos, z ); diff --git a/src/overmap.h b/src/overmap.h index c77e5e716d540..1277b2bb806fa 100644 --- a/src/overmap.h +++ b/src/overmap.h @@ -40,6 +40,7 @@ class overmap_connection; namespace pf { +template struct path; } // namespace pf @@ -387,6 +388,9 @@ class overmap const overmap *south, const overmap *west, overmap_special_batch &enabled_specials ); bool generate_sub( int z ); + bool generate_over( int z ); + // Check and put bridgeheads + void generate_bridgeheads( const std::vector &bridge_points ); const city &get_nearest_city( const tripoint &p ) const; @@ -429,13 +433,15 @@ class overmap void build_mine( const tripoint &origin, int s ); // Connection laying - pf::path lay_out_connection( const overmap_connection &connection, const point &source, - const point &dest, int z, bool must_be_unexplored ) const; - pf::path lay_out_street( const overmap_connection &connection, const point &source, - om_direction::type dir, size_t len ) const; - - void build_connection( const overmap_connection &connection, const pf::path &path, int z, - const om_direction::type &initial_dir = om_direction::type::invalid ); + pf::path lay_out_connection( + const overmap_connection &connection, const point &source, + const point &dest, int z, bool must_be_unexplored ) const; + pf::path lay_out_street( const overmap_connection &connection, const point &source, + om_direction::type dir, size_t len ) const; + + void build_connection( + const overmap_connection &connection, const pf::path &path, int z, + const om_direction::type &initial_dir = om_direction::type::invalid ); void build_connection( const point &source, const point &dest, int z, const overmap_connection &connection, bool must_be_unexplored, const om_direction::type &initial_dir = om_direction::type::invalid ); diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index ca4f4fce1d3de..85311fe3a4fec 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -129,12 +129,12 @@ static std::tuple get_note_display_info( const std::stri static std::array, npm_width *npm_height> get_overmap_neighbors( const tripoint ¤t ) { - const bool has_debug_vision = g->u.has_trait( trait_DEBUG_NIGHTVISION ); + const bool has_debug_vision = get_player_character().has_trait( trait_DEBUG_NIGHTVISION ); std::array, npm_width *npm_height> map_around; int index = 0; const point shift( npm_width / 2, npm_height / 2 ); - for( const tripoint &dest : tripoint_range( current - shift, current + shift ) ) { + for( const tripoint &dest : tripoint_range( current - shift, current + shift ) ) { nc_color ter_color = c_black; std::string ter_sym = " "; const bool see = has_debug_vision || overmap_buffer.seen( dest ); @@ -197,10 +197,10 @@ static void update_note_preview( const std::string ¬e, wnoutrefresh( *w_preview_map ); } -static weather_type get_weather_at_point( const tripoint &pos ) +static weather_type_id get_weather_at_point( const tripoint &pos ) { // Weather calculation is a bit expensive, so it's cached here. - static std::map weather_cache; + static std::map weather_cache; static time_point last_weather_display = calendar::before_time_starts; if( last_weather_display != calendar::turn ) { last_weather_display = calendar::turn; @@ -446,7 +446,7 @@ static point draw_notes( const tripoint &origin ) const std::string note_symbol = std::string( 1, std::get<0>( om_symbol ) ); const std::string note_text = note.substr( std::get<2>( om_symbol ), std::string::npos ); point p_omt( p ); - const point p_player = g->u.global_omt_location().xy(); + const point p_player = get_player_character().global_omt_location().xy(); const int distance_player = rl_dist( p_player, p_omt ); const point sm_pos = omt_to_sm_copy( p_omt ); const point p_om = omt_to_om_remain( p_omt ); @@ -486,17 +486,18 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr const int om_half_height = om_map_height / 2; const bool viewing_weather = ( ( data.debug_weather || data.visible_weather ) && center.z == 10 ); + avatar &player_character = get_avatar(); // Target of current mission - const tripoint target = g->u.get_active_mission_target(); + const tripoint target = player_character.get_active_mission_target(); const bool has_target = target != overmap::invalid_tripoint; // seen status & terrain of center position bool csee = false; oter_id ccur_ter = oter_str_id::NULL_ID(); // Debug vision allows seeing everything - const bool has_debug_vision = g->u.has_trait( trait_DEBUG_NIGHTVISION ); + const bool has_debug_vision = player_character.has_trait( trait_DEBUG_NIGHTVISION ); // sight_points is hoisted for speed reasons. const int sight_points = !has_debug_vision ? - g->u.overmap_sight_range( g->light_level( g->u.posz() ) ) : + player_character.overmap_sight_range( g->light_level( player_character.posz() ) ) : 100; // Whether showing hordes is currently enabled const bool showhordes = uistate.overmap_show_hordes; @@ -634,8 +635,8 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr } } } - for( auto &elem : g->u.omt_path ) { - tripoint tri_to_add = tripoint( elem.xy(), g->u.posz() ); + for( auto &elem : player_character.omt_path ) { + tripoint tri_to_add = tripoint( elem.xy(), player_character.posz() ); player_path_route.push_back( tri_to_add ); } for( const auto &np : followers ) { @@ -672,8 +673,8 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr } // Check if location is within player line-of-sight - const bool los = see && g->u.overmap_los( omp, sight_points ); - const bool los_sky = g->u.overmap_los( omp, sight_points * 2 ); + const bool los = see && player_character.overmap_los( omp, sight_points ); + const bool los_sky = player_character.overmap_los( omp, sight_points * 2 ); int mycount = std::count( path_route.begin(), path_route.end(), omp ); bool player_path_count = false; std::vector::iterator it; @@ -683,12 +684,12 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr } if( blink && omp == orig ) { // Display player pos, should always be visible - ter_color = g->u.symbol_color(); + ter_color = player_character.symbol_color(); ter_sym = "@"; } else if( viewing_weather && ( data.debug_weather || los_sky ) ) { - const weather_type type = get_weather_at_point( omp ); - ter_color = weather::map_color( type ); - ter_sym = weather::glyph( type ); + const weather_type_id type = get_weather_at_point( omp ); + ter_color = type->map_color; + ter_sym = type->glyph; } else if( data.debug_scent && get_scent_glyph( omp, ter_color, ter_sym ) ) { // get_scent_glyph has changed ter_color and ter_sym if omp has a scent } else if( blink && has_target && omp.xy() == target.xy() ) { @@ -968,11 +969,11 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr } } else if( viewing_weather ) { const bool weather_is_visible = ( data.debug_weather || - g->u.overmap_los( center, sight_points * 2 ) ); + player_character.overmap_los( center, sight_points * 2 ) ); if( weather_is_visible ) { - weather_datum weather = weather_data( get_weather_at_point( center ) ); // NOLINTNEXTLINE(cata-use-named-point-constants) - mvwprintz( wbar, point( 1, 1 ), weather.color, weather.name ); + mvwprintz( wbar, point( 1, 1 ), get_weather_at_point( center )->color, + get_weather_at_point( center )->name ); } else { // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( wbar, point( 1, 1 ), c_dark_gray, _( "# Unexplored" ) ); @@ -1006,7 +1007,7 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr } //Show mission targets on this location - for( auto &mission : g->u.get_active_missions() ) { + for( auto &mission : player_character.get_active_missions() ) { if( mission->get_target() == center ) { mvwprintz( wbar, point( 1, ++lines ), c_white, mission->name() ); } @@ -1539,8 +1540,10 @@ static tripoint display( const tripoint &orig, const draw_data_t &data = draw_da path_type ptype; ptype.only_known_by_player = true; ptype.avoid_danger = true; - bool in_vehicle = g->u.in_vehicle && g->u.controlling_vehicle; - const optional_vpart_position vp = g->m.veh_at( g->u.pos() ); + avatar &player_character = get_avatar(); + bool in_vehicle = player_character.in_vehicle && player_character.controlling_vehicle; + map &here = get_map(); + const optional_vpart_position vp = here.veh_at( player_character.pos() ); if( vp && in_vehicle ) { vehicle &veh = vp->vehicle(); if( veh.can_float() && veh.is_watercraft() && veh.is_in_water() ) { @@ -1553,37 +1556,37 @@ static tripoint display( const tripoint &orig, const draw_data_t &data = draw_da } else { const oter_id oter = overmap_buffer.ter( curs ); // going to or coming from a water tile - if( is_river_or_lake( oter ) || g->m.has_flag( "SWIMMABLE", g->u.pos() ) ) { + if( is_river_or_lake( oter ) || here.has_flag( "SWIMMABLE", player_character.pos() ) ) { ptype.amphibious = true; } } - const tripoint player_omt_pos = g->u.global_omt_location(); - if( !g->u.omt_path.empty() && g->u.omt_path.front() == curs ) { + const tripoint player_omt_pos = player_character.global_omt_location(); + if( !player_character.omt_path.empty() && player_character.omt_path.front() == curs ) { std::string confirm_msg; - if( g->u.weight_carried() > g->u.weight_capacity() ) { + if( player_character.weight_carried() > player_character.weight_capacity() ) { confirm_msg = _( "You are overburdened, are you sure you want to travel (it may be painful)?" ); } else { confirm_msg = _( "Travel to this point?" ); } if( query_yn( confirm_msg ) ) { // renew the path incase of a leftover dangling path point - g->u.omt_path = overmap_buffer.get_npc_path( player_omt_pos, curs, ptype ); - if( g->u.in_vehicle && g->u.controlling_vehicle ) { - vehicle *player_veh = veh_pointer_or_null( g->m.veh_at( g->u.pos() ) ); - player_veh->omt_path = g->u.omt_path; + player_character.omt_path = overmap_buffer.get_npc_path( player_omt_pos, curs, ptype ); + if( player_character.in_vehicle && player_character.controlling_vehicle ) { + vehicle *player_veh = veh_pointer_or_null( here.veh_at( player_character.pos() ) ); + player_veh->omt_path = player_character.omt_path; player_veh->is_autodriving = true; - g->u.assign_activity( ACT_AUTODRIVE ); + player_character.assign_activity( ACT_AUTODRIVE ); } else { - g->u.reset_move_mode(); - g->u.assign_activity( ACT_TRAVELLING ); + player_character.reset_move_mode(); + player_character.assign_activity( ACT_TRAVELLING ); } action = "QUIT"; } } if( curs == player_omt_pos ) { - g->u.omt_path.clear(); + player_character.omt_path.clear(); } else { - g->u.omt_path = overmap_buffer.get_npc_path( player_omt_pos, curs, ptype ); + player_character.omt_path = overmap_buffer.get_npc_path( player_omt_pos, curs, ptype ); } } else if( action == "TOGGLE_BLINKING" ) { uistate.overmap_blinking = !uistate.overmap_blinking; @@ -1642,21 +1645,21 @@ static tripoint display( const tripoint &orig, const draw_data_t &data = draw_da void ui::omap::display() { - overmap_ui::display( g->u.global_omt_location(), overmap_ui::draw_data_t() ); + overmap_ui::display( get_player_character().global_omt_location(), overmap_ui::draw_data_t() ); } void ui::omap::display_hordes() { overmap_ui::draw_data_t data; data.debug_mongroup = true; - overmap_ui::display( g->u.global_omt_location(), data ); + overmap_ui::display( get_player_character().global_omt_location(), data ); } void ui::omap::display_weather() { overmap_ui::draw_data_t data; data.debug_weather = true; - tripoint pos = g->u.global_omt_location(); + tripoint pos = get_player_character().global_omt_location(); pos.z = 10; overmap_ui::display( pos, data ); } @@ -1665,7 +1668,7 @@ void ui::omap::display_visible_weather() { overmap_ui::draw_data_t data; data.visible_weather = true; - tripoint pos = g->u.global_omt_location(); + tripoint pos = get_player_character().global_omt_location(); pos.z = 10; overmap_ui::display( pos, data ); } @@ -1674,14 +1677,14 @@ void ui::omap::display_scents() { overmap_ui::draw_data_t data; data.debug_scent = true; - overmap_ui::display( g->u.global_omt_location(), data ); + overmap_ui::display( get_player_character().global_omt_location(), data ); } void ui::omap::display_editor() { overmap_ui::draw_data_t data; data.debug_editor = true; - overmap_ui::display( g->u.global_omt_location(), data ); + overmap_ui::display( get_player_character().global_omt_location(), data ); } void ui::omap::display_zones( const tripoint ¢er, const tripoint &select, const int iZoneIndex ) @@ -1694,7 +1697,7 @@ void ui::omap::display_zones( const tripoint ¢er, const tripoint &select, co tripoint ui::omap::choose_point() { - return overmap_ui::display( g->u.global_omt_location() ); + return overmap_ui::display( get_player_character().global_omt_location() ); } tripoint ui::omap::choose_point( const tripoint &origin ) @@ -1704,7 +1707,7 @@ tripoint ui::omap::choose_point( const tripoint &origin ) tripoint ui::omap::choose_point( int z ) { - tripoint loc = g->u.global_omt_location(); + tripoint loc = get_player_character().global_omt_location(); loc.z = z; return overmap_ui::display( loc ); } diff --git a/src/overmapbuffer.cpp b/src/overmapbuffer.cpp index 209ecdd9b7778..9e210862e1eae 100644 --- a/src/overmapbuffer.cpp +++ b/src/overmapbuffer.cpp @@ -7,10 +7,10 @@ #include #include -#include "avatar.h" #include "basecamp.h" #include "calendar.h" #include "cata_utility.h" +#include "character.h" #include "character_id.h" #include "color.h" #include "common_types.h" @@ -482,7 +482,7 @@ void overmapbuffer::process_mongroups() { // arbitrary radius to include nearby overmaps (aside from the current one) const auto radius = MAPSIZE * 2; - const auto center = g->u.global_sm_location(); + const auto center = get_player_character().global_sm_location(); for( auto &om : get_overmaps_near( center, radius ) ) { om->process_mongroups(); } @@ -492,7 +492,7 @@ void overmapbuffer::move_hordes() { // arbitrary radius to include nearby overmaps (aside from the current one) const auto radius = MAPSIZE * 2; - const auto center = g->u.global_sm_location(); + const auto center = get_player_character().global_sm_location(); for( auto &om : get_overmaps_near( center, radius ) ) { om->move_hordes(); } @@ -564,7 +564,7 @@ void overmapbuffer::set_scent( const tripoint &loc, int strength ) void overmapbuffer::move_vehicle( vehicle *veh, const point &old_msp ) { - const point new_msp = g->m.getabs( veh->global_pos3().xy() ); + const point new_msp = get_map().getabs( veh->global_pos3().xy() ); const point old_omt = ms_to_omt_copy( old_msp ); const point new_omt = ms_to_omt_copy( new_msp ); const overmap_with_local_coords old_om_loc = get_om_global( old_omt ); @@ -592,14 +592,14 @@ void overmapbuffer::remove_camp( const basecamp &camp ) void overmapbuffer::remove_vehicle( const vehicle *veh ) { - const point omt = ms_to_omt_copy( g->m.getabs( veh->global_pos3().xy() ) ); + const point omt = ms_to_omt_copy( get_map().getabs( veh->global_pos3().xy() ) ); const overmap_with_local_coords om_loc = get_om_global( omt ); om_loc.om->vehicles.erase( veh->om_id ); } void overmapbuffer::add_vehicle( vehicle *veh ) { - const point abs_pos = g->m.getabs( veh->global_pos3().xy() ); + const point abs_pos = get_map().getabs( veh->global_pos3().xy() ); const point omt = ms_to_omt_copy( abs_pos ); const overmap_with_local_coords om_loc = get_om_global( omt ); int id = om_loc.om->vehicles.size() + 1; @@ -708,7 +708,7 @@ std::vector overmapbuffer::get_npc_path( const tripoint &src, const tr const auto get_ter_at = [&]( const point & p ) { return ter( base + p ); }; - const auto estimate = [&]( const pf::node & cur, const pf::node * ) { + const auto estimate = [&]( const pf::node &cur, const pf::node * ) { const tripoint convert_result = base + tripoint( cur.pos, 0 ); if( ptype.only_known_by_player && !seen( convert_result ) ) { return pf::rejected; @@ -759,7 +759,7 @@ std::vector overmapbuffer::get_npc_path( const tripoint &src, const tr return res; }; - pf::path route = pf::find_path( start, finish, point( 2 * O.x, 2 * O.y ), estimate ); + pf::path route = pf::find_path( start, finish, point( 2 * O.x, 2 * O.y ), estimate ); for( auto node : route.nodes ) { tripoint convert_result = base + tripoint( node.pos, 0 ); convert_result.z = base.z; @@ -796,7 +796,7 @@ bool overmapbuffer::reveal_route( const tripoint &source, const tripoint &dest, return false; } - const auto estimate = [&]( const pf::node & cur, const pf::node * ) { + const auto estimate = [&]( const pf::node &cur, const pf::node * ) { int res = 0; const oter_id oter = get_ter_at( cur.pos ); @@ -994,7 +994,7 @@ std::vector overmapbuffer::find_all( const tripoint &origin, const int min_dist = params.min_distance; const int max_dist = params.search_range ? params.search_range : OMAPX; - for( const tripoint &loc : closest_tripoints_first( origin, min_dist, max_dist ) ) { + for( const tripoint &loc : closest_points_first( origin, min_dist, max_dist ) ) { if( is_findable_location( loc, params ) ) { result.push_back( loc ); } @@ -1073,11 +1073,11 @@ shared_ptr_fast overmapbuffer::remove_npc( const character_id &id ) std::vector> overmapbuffer::get_npcs_near_player( int radius ) { - tripoint plpos = g->u.global_omt_location(); + tripoint plpos = get_player_character().global_omt_location(); // get_npcs_near needs submap coordinates omt_to_sm( plpos.x, plpos.y ); // INT_MIN is a (a bit ugly) way to inform get_npcs_near not to filter by z-level - const int zpos = g->m.has_zlevels() ? INT_MIN : plpos.z; + const int zpos = get_map().has_zlevels() ? INT_MIN : plpos.z; return get_npcs_near( tripoint( plpos.xy(), zpos ), radius ); } @@ -1179,7 +1179,7 @@ static radio_tower_reference create_radio_tower_reference( const overmap &om, ra radio_tower_reference overmapbuffer::find_radio_station( const int frequency ) { - const auto center = g->u.global_sm_location(); + const auto center = get_player_character().global_sm_location(); for( auto &om : get_overmaps_near( center, RADIO_MAX_STRENGTH ) ) { for( auto &tower : om->radios ) { const auto rref = create_radio_tower_reference( *om, tower, center ); @@ -1194,7 +1194,7 @@ radio_tower_reference overmapbuffer::find_radio_station( const int frequency ) std::vector overmapbuffer::find_all_radio_stations() { std::vector result; - const auto center = g->u.global_sm_location(); + const auto center = get_player_character().global_sm_location(); // perceived signal strength is distance (in submaps) - signal strength, so towers // further than RADIO_MAX_STRENGTH submaps away can never be received at all. const int radius = RADIO_MAX_STRENGTH; @@ -1370,9 +1370,10 @@ void overmapbuffer::spawn_monster( const tripoint &p ) assert( ms.x >= 0 && ms.x < SEEX ); assert( ms.y >= 0 && ms.y < SEEX ); ms += sm_to_ms_copy( p.xy() ); + const map &here = get_map(); // The monster position must be local to the main map when added to the game - const tripoint local = tripoint( g->m.getlocal( ms ), p.z ); - assert( g->m.inbounds( local ) ); + const tripoint local = tripoint( here.getlocal( ms ), p.z ); + assert( here.inbounds( local ) ); monster *const placed = g->place_critter_at( make_shared_fast( this_monster ), local ); if( placed ) { @@ -1385,7 +1386,7 @@ void overmapbuffer::spawn_monster( const tripoint &p ) void overmapbuffer::despawn_monster( const monster &critter ) { // Get absolute coordinates of the monster in map squares, translate to submap position - tripoint sm = ms_to_sm_copy( g->m.getabs( critter.pos() ) ); + tripoint sm = ms_to_sm_copy( get_map().getabs( critter.pos() ) ); // Get the overmap coordinates and get the overmap, sm is now local to that overmap const point omp = sm_to_om_remain( sm.x, sm.y ); overmap &om = get( omp ); diff --git a/src/panels.cpp b/src/panels.cpp index 048ae28268113..532566d129a75 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -388,8 +388,9 @@ void overmap_ui::draw_overmap_chunk( const catacurses::window &w_minimap, const mvwputch( w_minimap, point( arrowx + start_x, arrowy + start_y ), c_red, glyph ); } } - - const int sight_points = g->u.overmap_sight_range( g->light_level( g->u.posz() ) ); + avatar &player_character = get_avatar(); + const int sight_points = player_character.overmap_sight_range( g->light_level( + player_character.posz() ) ); for( int i = -3; i <= 3; i++ ) { for( int j = -3; j <= 3; j++ ) { if( i > -3 && i < 3 && j > -3 && j < 3 ) { @@ -399,7 +400,7 @@ void overmap_ui::draw_overmap_chunk( const catacurses::window &w_minimap, const int horde_size = overmap_buffer.get_horde_size( omp ); if( horde_size >= HORDE_VISIBILITY_SIZE ) { if( overmap_buffer.seen( omp ) - && g->u.overmap_los( omp, sight_points ) ) { + && player_character.overmap_los( omp, sight_points ) ) { mvwputch( w_minimap, point( i + 3, j + 3 ), c_green, horde_size > HORDE_VISIBILITY_SIZE * 2 ? 'Z' : 'z' ); } @@ -435,7 +436,7 @@ static std::string get_temp( const avatar &u ) std::string temp; if( u.has_item_with_flag( "THERMOMETER" ) || u.has_bionic( bionic_id( "bio_meteorologist" ) ) ) { - temp = print_temperature( g->weather.get_temperature( u.pos() ) ); + temp = print_temperature( get_weather().get_temperature( u.pos() ) ); } if( temp.empty() ) { return "-"; @@ -862,7 +863,7 @@ static int get_int_digits( const int &digits ) // panels code // =============================== -static void draw_limb_health( avatar &u, const catacurses::window &w, int limb_index ) +static void draw_limb_health( avatar &u, const catacurses::window &w, bodypart_id bp ) { const bool no_feeling = u.has_trait( trait_NOPAIN ); const bool is_self_aware = u.has_trait( trait_SELFAWARE ) && !no_feeling; @@ -872,16 +873,15 @@ static void draw_limb_health( avatar &u, const catacurses::window &w, int limb_i wprintz( w, color, sym ); } }; - if( u.is_limb_broken( static_cast( limb_index ) ) && ( limb_index >= hp_arm_l && - limb_index <= hp_leg_r ) ) { + + if( u.is_limb_broken( bp ) && bp->is_limb ) { //Limb is broken std::string limb = "~~%~~"; nc_color color = c_light_red; - const auto bp = avatar::hp_to_bp( static_cast( limb_index ) ); - if( u.worn_with_flag( "SPLINT", convert_bp( bp ).id() ) ) { + if( u.worn_with_flag( "SPLINT", bp ) ) { static const efftype_id effect_mending( "mending" ); - const auto &eff = u.get_effect( effect_mending, bp ); + const auto &eff = u.get_effect( effect_mending, bp->token ); const int mend_perc = eff.is_null() ? 0.0 : 100 * eff.get_duration() / eff.get_max_duration(); if( is_self_aware || u.has_effect( effect_got_checked ) ) { @@ -901,12 +901,14 @@ static void draw_limb_health( avatar &u, const catacurses::window &w, int limb_i return; } - std::pair hp = get_hp_bar( u.hp_cur[limb_index], u.hp_max[limb_index] ); + const int hp_cur = u.get_part_hp_cur( bp ); + const int hp_max = u.get_part_hp_max( bp ); + std::pair hp = get_hp_bar( hp_cur, hp_max ); if( is_self_aware || u.has_effect( effect_got_checked ) ) { - wprintz( w, hp.second, "%3d ", u.hp_cur[limb_index] ); + wprintz( w, hp.second, "%3d ", hp_cur ); } else if( no_feeling ) { - if( u.hp_cur[limb_index] < u.hp_max[limb_index] / 2 ) { + if( hp_cur < hp_max / 2 ) { hp = std::make_pair( string_format( " %s", _( "Bad" ) ), c_red ); } else { hp = std::make_pair( string_format( " %s", _( "Good" ) ), c_green ); @@ -922,27 +924,24 @@ static void draw_limb_health( avatar &u, const catacurses::window &w, int limb_i static void draw_limb2( avatar &u, const catacurses::window &w ) { - static std::array part = { { - bodypart_id( "head" ), bodypart_id( "torso" ), bodypart_id( "arm_l" ), bodypart_id( "arm_r" ), bodypart_id( "leg_l" ), bodypart_id( "leg_r" ) - } - }; - werase( w ); - // print limb health - for( int i = 0; i < num_hp_parts; i++ ) { - const std::string str = body_part_hp_bar_ui_text( part[i] ); + // print bodypart health + int i = 0; + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { + const std::string str = body_part_hp_bar_ui_text( bp ); if( i % 2 == 0 ) { wmove( w, point( 0, i / 2 ) ); } else { wmove( w, point( 11, i / 2 ) ); } - wprintz( w, u.limb_color( part[i], true, true, true ), str ); + wprintz( w, u.limb_color( bp, true, true, true ), str ); if( i % 2 == 0 ) { wmove( w, point( 5, i / 2 ) ); } else { wmove( w, point( 16, i / 2 ) ); } - draw_limb_health( u, w, i ); + draw_limb_health( u, w, bp ); + i++; } // print mood @@ -1123,7 +1122,8 @@ static void draw_limb_narrow( avatar &u, const catacurses::window &w ) { werase( w ); int ny2 = 0; - for( int i = 0; i < num_hp_parts; i++ ) { + int i = 0; + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { int ny; int nx; if( i < 3 ) { @@ -1134,16 +1134,14 @@ static void draw_limb_narrow( avatar &u, const catacurses::window &w ) nx = 26; } wmove( w, point( nx, ny ) ); - draw_limb_health( u, w, i ); + draw_limb_health( u, w, bp ); + i++; } // display limbs status - static std::array part = { { - bodypart_id( "head" ), bodypart_id( "torso" ), bodypart_id( "arm_l" ), bodypart_id( "arm_r" ), bodypart_id( "leg_l" ), bodypart_id( "leg_r" ) - } - }; ny2 = 0; - for( size_t i = 0; i < part.size(); i++ ) { + i = 0; + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { int ny; int nx; if( i < 3 ) { @@ -1154,34 +1152,29 @@ static void draw_limb_narrow( avatar &u, const catacurses::window &w ) nx = 19; } - std::string str = body_part_hp_bar_ui_text( part[i] ); + std::string str = body_part_hp_bar_ui_text( bp ); wmove( w, point( nx, ny ) ); str = left_justify( str, 5 ); - wprintz( w, u.limb_color( part[i], true, true, true ), str + ":" ); + wprintz( w, u.limb_color( bp, true, true, true ), str + ":" ); + i++; } wnoutrefresh( w ); } static void draw_limb_wide( avatar &u, const catacurses::window &w ) { - const std::vector> parts = { - {bodypart_id( "arm_l" ), 2}, - {bodypart_id( "head" ), 0}, - {bodypart_id( "arm_r" ), 3}, - {bodypart_id( "leg_l" ), 4}, - {bodypart_id( "torso" ), 1}, - {bodypart_id( "leg_r" ), 5} - }; werase( w ); - for( int i = 0; i < num_hp_parts; i++ ) { + int i = 0; + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { int offset = i * 15; int ny = offset / 45; int nx = offset % 45; std::string str = string_format( " %s: ", - left_justify( body_part_hp_bar_ui_text( parts[i].first ), 5 ) ); - nc_color part_color = u.limb_color( parts[i].first, true, true, true ); + left_justify( body_part_hp_bar_ui_text( bp ), 5 ) ); + nc_color part_color = u.limb_color( bp, true, true, true ); print_colored_text( w, point( nx, ny ), part_color, c_white, str ); - draw_limb_health( u, w, parts[i].second ); + draw_limb_health( u, w, bp ); + i++; } wnoutrefresh( w ); } @@ -1333,11 +1326,11 @@ static void draw_loc_labels( const avatar &u, const catacurses::window &w, bool } else { // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Sky :" ) ); - const weather_datum wdata = weather_data( g->weather.weather ); - wprintz( w, wdata.color, " %s", wdata.name ); + wprintz( w, get_weather().weather_id->color, " %s", get_weather().weather_id->name ); } // display lighting - const auto ll = get_light_level( g->u.fine_detail_vision_mod() ); + const std::pair ll = get_light_level( + get_avatar().fine_detail_vision_mod() ); mvwprintz( w, point( 1, 2 ), c_light_gray, "%s ", _( "Light:" ) ); wprintz( w, ll.second, ll.first ); @@ -1499,11 +1492,11 @@ static void draw_env_compact( avatar &u, const catacurses::window &w ) if( g->get_levz() < 0 ) { mvwprintz( w, point( 8, 3 ), c_light_gray, _( "Underground" ) ); } else { - const weather_datum wdata = weather_data( g->weather.weather ); - mvwprintz( w, point( 8, 3 ), wdata.color, wdata.name ); + mvwprintz( w, point( 8, 3 ), get_weather().weather_id->color, get_weather().weather_id->name ); } // display lighting - const auto ll = get_light_level( g->u.fine_detail_vision_mod() ); + const std::pair ll = get_light_level( + get_avatar().fine_detail_vision_mod() ); mvwprintz( w, point( 8, 4 ), ll.second, ll.first ); // wind const oter_id &cur_om_ter = overmap_buffer.ter( u.global_omt_location() ); @@ -1546,14 +1539,9 @@ static void draw_wind_padding( avatar &u, const catacurses::window &w ) static void draw_health_classic( avatar &u, const catacurses::window &w ) { - static std::array part = { { - bodypart_id( "head" ), bodypart_id( "torso" ), bodypart_id( "arm_l" ), bodypart_id( "arm_r" ), bodypart_id( "leg_l" ), bodypart_id( "leg_r" ) - } - }; - vehicle *veh = g->remoteveh(); if( veh == nullptr && u.in_vehicle ) { - veh = veh_pointer_or_null( g->m.veh_at( u.pos() ) ); + veh = veh_pointer_or_null( get_map().veh_at( u.pos() ) ); } werase( w ); @@ -1562,12 +1550,14 @@ static void draw_health_classic( avatar &u, const catacurses::window &w ) draw_rectangle( w, c_light_gray, point_zero, point( 6, 6 ) ); // print limb health - for( int i = 0; i < num_hp_parts; i++ ) { - const std::string str = body_part_hp_bar_ui_text( part[i] ); + int i = 0; + for( const bodypart_id &bp : u.get_all_body_parts( true ) ) { + const std::string str = body_part_hp_bar_ui_text( bp ); wmove( w, point( 8, i ) ); - wprintz( w, u.limb_color( part[i], true, true, true ), str ); + wprintz( w, u.limb_color( bp, true, true, true ), str ); wmove( w, point( 14, i ) ); - draw_limb_health( u, w, i ); + draw_limb_health( u, w, bp ); + i++; } // needs @@ -1758,7 +1748,7 @@ static void draw_veh_compact( const avatar &u, const catacurses::window &w ) // vehicle display vehicle *veh = g->remoteveh(); if( veh == nullptr && u.in_vehicle ) { - veh = veh_pointer_or_null( g->m.veh_at( u.pos() ) ); + veh = veh_pointer_or_null( get_map().veh_at( u.pos() ) ); } if( veh ) { veh->print_fuel_indicators( w, point_zero ); @@ -1790,7 +1780,7 @@ static void draw_veh_padding( const avatar &u, const catacurses::window &w ) // vehicle display vehicle *veh = g->remoteveh(); if( veh == nullptr && u.in_vehicle ) { - veh = veh_pointer_or_null( g->m.veh_at( u.pos() ) ); + veh = veh_pointer_or_null( get_map().veh_at( u.pos() ) ); } if( veh ) { veh->print_fuel_indicators( w, point_east ); @@ -1845,9 +1835,8 @@ static void draw_weather_classic( avatar &, const catacurses::window &w ) if( g->get_levz() < 0 ) { mvwprintz( w, point_zero, c_light_gray, _( "Underground" ) ); } else { - const weather_datum wdata = weather_data( g->weather.weather ); mvwprintz( w, point_zero, c_light_gray, _( "Weather :" ) ); - mvwprintz( w, point( 10, 0 ), wdata.color, wdata.name ); + mvwprintz( w, point( 10, 0 ), get_weather().weather_id->color, get_weather().weather_id->name ); } mvwprintz( w, point( 31, 0 ), c_light_gray, _( "Moon :" ) ); nc_color clr = c_white; @@ -1860,7 +1849,8 @@ static void draw_lighting_classic( const avatar &u, const catacurses::window &w { werase( w ); - const auto ll = get_light_level( g->u.fine_detail_vision_mod() ); + const std::pair ll = get_light_level( + get_avatar().fine_detail_vision_mod() ); mvwprintz( w, point_zero, c_light_gray, _( "Lighting:" ) ); mvwprintz( w, point( 10, 0 ), ll.second, ll.first ); @@ -1913,7 +1903,7 @@ static void draw_time_classic( const avatar &u, const catacurses::window &w ) } if( u.has_item_with_flag( "THERMOMETER" ) || u.has_bionic( bionic_id( "bio_meteorologist" ) ) ) { - std::string temp = print_temperature( g->weather.get_temperature( u.pos() ) ); + std::string temp = print_temperature( get_weather().get_temperature( u.pos() ) ); mvwprintz( w, point( 31, 0 ), c_light_gray, _( "Temp : " ) + temp ); } @@ -1976,7 +1966,7 @@ static void draw_mana_wide( const player &u, const catacurses::window &w ) static bool spell_panel() { - return g->u.magic.knows_spell(); + return get_avatar().magic.knows_spell(); } bool default_render() diff --git a/src/pathfinding.cpp b/src/pathfinding.cpp index 333fe4aa06328..8e0ac223a2144 100644 --- a/src/pathfinding.cpp +++ b/src/pathfinding.cpp @@ -465,6 +465,27 @@ std::vector map::route( const tripoint &f, const tripoint &t, cur, above ); } } + if( cur.z < maxz && parent_terrain.has_flag( TFLAG_RAMP_UP ) && + valid_move( cur, tripoint( cur.xy(), cur.z + 1 ), false, true, true ) ) { + auto &layer = pf.get_layer( cur.z + 1 ); + for( size_t it = 0; it < 8; it++ ) { + const tripoint above( cur.x + x_offset[it], cur.y + y_offset[it], cur.z + 1 ); + pf.add_point( layer.gscore[parent_index] + 4, + layer.score[parent_index] + 4 + 2 * rl_dist( above, t ), + cur, above ); + } + } + if( cur.z > minz && parent_terrain.has_flag( TFLAG_RAMP_DOWN ) && + valid_move( cur, tripoint( cur.xy(), cur.z - 1 ), false, true, true ) ) { + auto &layer = pf.get_layer( cur.z - 1 ); + for( size_t it = 0; it < 8; it++ ) { + const tripoint below( cur.x + x_offset[it], cur.y + y_offset[it], cur.z - 1 ); + pf.add_point( layer.gscore[parent_index] + 4, + layer.score[parent_index] + 4 + 2 * rl_dist( below, t ), + cur, below ); + } + } + } while( !done && !pf.empty() ); if( done ) { diff --git a/src/pickup.cpp b/src/pickup.cpp index bd0dbd602e57e..df5b82f176331 100644 --- a/src/pickup.cpp +++ b/src/pickup.cpp @@ -140,7 +140,7 @@ static pickup_answer handle_problematic_pickup( const item &it, bool &offered_sw return CANCEL; } - player &u = g->u; + Character &u = get_player_character(); uilist amenu; @@ -149,7 +149,7 @@ static pickup_answer handle_problematic_pickup( const item &it, bool &offered_sw offered_swap = true; // TODO: Gray out if not enough hands if( u.is_armed() ) { - amenu.addentry( WIELD, !u.weapon.has_flag( "NO_UNWIELD" ), 'w', + amenu.addentry( WIELD, u.can_unwield( u.weapon ).success(), 'w', _( "Dispose of %s and wield %s" ), u.weapon.display_name(), it.display_name() ); } else { @@ -175,7 +175,7 @@ static pickup_answer handle_problematic_pickup( const item &it, bool &offered_sw bool Pickup::query_thief() { - player &u = g->u; + Character &u = get_player_character(); const bool force_uc = get_option( "FORCE_CAPITAL_YN" ); const auto &allow_key = force_uc ? input_context::disallow_lower_case : input_context::allow_all_keys; @@ -219,7 +219,7 @@ bool Pickup::query_thief() bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offered_swap, PickupMap &mapPickup, bool autopickup ) { - player &u = g->u; + player &u = get_avatar(); int moves_taken = 100; bool picked_up = false; pickup_answer option = CANCEL; @@ -231,11 +231,8 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer item &it = *newloc.get_item(); //new item (copy) item newit = it; - item leftovers = newit; - const auto wield_check = u.can_wield( newit ); - - if( !newit.is_owned_by( g->u, true ) ) { + if( !newit.is_owned_by( u, true ) ) { // Has the player given input on if stealing is ok? if( u.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) { Pickup::query_thief(); @@ -253,25 +250,13 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer // Handle charges, quantity == 0 means move all if( quantity != 0 && newit.count_by_charges() ) { - leftovers.charges = newit.charges - quantity; - if( leftovers.charges > 0 ) { + if( newit.charges > quantity ) { newit.charges = quantity; } - } else { - leftovers.charges = 0; } bool did_prompt = false; - if( newit.count_by_charges() ) { - newit.charges -= u.i_add( newit ).charges; - // if the item stacks with another item when added, - // the charges returned may be larger than the charges of the item added. - newit.charges = std::max( 0, newit.charges ); - } - if( newit.is_ammo() && newit.charges <= 0 ) { - picked_up = true; - option = NUM_ANSWERS; //Skip the options part - } else if( newit.is_frozen_liquid() ) { + if( newit.is_frozen_liquid() ) { if( !( got_water = !( u.crush_frozen_liquid( newloc ) ) ) ) { option = STASH; } @@ -318,7 +303,8 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer case WEAR: picked_up = !!u.wear_item( newit ); break; - case WIELD: + case WIELD: { + const auto wield_check = u.can_wield( it ); if( wield_check.success() ) { //using original item, possibly modifying it picked_up = u.wield( it ); @@ -335,6 +321,7 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer add_msg( m_neutral, wield_check.c_str() ); } break; + } case SPILL: if( newit.is_container_empty() ) { debugmsg( "Tried to spill contents from an empty container" ); @@ -346,23 +333,35 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer break; } // Intentional fallthrough - case STASH: - auto &entry = mapPickup[newit.tname()]; - entry.second += newit.count(); - entry.first = u.i_add( newit ); - picked_up = true; + case STASH: { + item &added_it = u.i_add( newit, true, nullptr, /*allow_drop=*/false ); + if( added_it.is_null() ) { + // failed to add, do nothing + } else if( &added_it == &it ) { + // merged to the original stack, restore original charges + it.charges -= newit.charges; + } else { + // successfully added + auto &entry = mapPickup[newit.tname()]; + entry.second += newit.count(); + entry.first = added_it; + picked_up = true; + } break; + } } if( picked_up ) { - // If we picked up a whole stack, remove the original item - // Otherwise, replace the item with the leftovers - if( leftovers.charges > 0 ) { - *loc.get_item() = std::move( leftovers ); + item &orig_it = *loc.get_item(); + // Subtract moved charges instead of assigning leftover charges, + // since the total charges of the original item may have changed + // due to merging. + if( orig_it.charges > newit.charges ) { + orig_it.charges -= newit.charges; } else { loc.remove_item(); } - g->u.moves -= moves_taken; + u.moves -= moves_taken; } return picked_up || !did_prompt; @@ -415,7 +414,8 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) { int cargo_part = -1; - const optional_vpart_position vp = g->m.veh_at( p ); + map &local = get_map(); + const optional_vpart_position vp = local.veh_at( p ); vehicle *const veh = veh_pointer_or_null( vp ); bool from_vehicle = false; @@ -423,7 +423,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) if( veh != nullptr && get_items_from == prompt ) { const cata::optional carg = vp.part_with_feature( "CARGO", false ); const bool veh_has_items = carg && !veh->get_items( carg->part_index() ).empty(); - const bool map_has_items = g->m.has_items( p ); + const bool map_has_items = local.has_items( p ); if( veh_has_items && map_has_items ) { uilist amenu( _( "Get items from where?" ), { _( "Get items from vehicle cargo" ), _( "Get items on the ground" ) } ); if( amenu.ret == UILIST_CANCEL ) { @@ -440,20 +440,20 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) from_vehicle = cargo_part >= 0; } else { // Nothing to change, default is to pick from ground anyway. - if( g->m.has_flag( "SEALED", p ) ) { + if( local.has_flag( "SEALED", p ) ) { return; } } } if( !from_vehicle ) { - bool isEmpty = ( g->m.i_at( p ).empty() ); + bool isEmpty = ( local.i_at( p ).empty() ); // Hide the pickup window if this is a toilet and there's nothing here // but non-frozen water. - if( ( !isEmpty ) && g->m.furn( p ) == f_toilet ) { + if( ( !isEmpty ) && local.furn( p ) == f_toilet ) { isEmpty = true; - for( const item &maybe_water : g->m.i_at( p ) ) { + for( const item &maybe_water : local.i_at( p ) ) { if( maybe_water.typeId() != itype_water || maybe_water.is_frozen_liquid() ) { isEmpty = false; break; @@ -474,7 +474,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) here.push_back( it ); } } else { - map_stack mapitems = g->m.i_at( p ); + map_stack mapitems = local.i_at( p ); for( item_stack::iterator it = mapitems.begin(); it != mapitems.end(); ++it ) { here.push_back( it ); } @@ -497,7 +497,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) // Bail out if this square cannot be auto-picked-up if( g->check_zone( zone_type_id( "NO_AUTO_PICKUP" ), p ) ) { return; - } else if( g->m.has_flag( "SEALED", p ) ) { + } else if( local.has_flag( "SEALED", p ) ) { return; } } diff --git a/src/pixel_minimap.cpp b/src/pixel_minimap.cpp index a98b1d3bfe376..6fde954b06de6 100644 --- a/src/pixel_minimap.cpp +++ b/src/pixel_minimap.cpp @@ -14,7 +14,6 @@ #include #include -#include "avatar.h" #include "cata_utility.h" #include "character.h" #include "color.h" @@ -83,17 +82,16 @@ SDL_Texture_Ptr create_cache_texture( const SDL_Renderer_Ptr &renderer, int tile SDL_Color get_map_color_at( const tripoint &p ) { - const map &m = g->m; - - if( const auto vp = m.veh_at( p ) ) { + const map &here = get_map(); + if( const auto vp = here.veh_at( p ) ) { return curses_color_to_SDL( vp->vehicle().part_color( vp->part_index() ) ); } - if( const auto furn_id = m.furn( p ) ) { + if( const auto furn_id = here.furn( p ) ) { return curses_color_to_SDL( furn_id->color() ); } - return curses_color_to_SDL( m.ter( p )->color() ); + return curses_color_to_SDL( here.ter( p )->color() ); } SDL_Color get_critter_color( Creature *critter, int flicker, int mixture ) @@ -102,7 +100,7 @@ SDL_Color get_critter_color( Creature *critter, int flicker, int mixture ) if( const monster *m = dynamic_cast( critter ) ) { //faction status (attacking or tracking) determines if red highlights get applied to creature - const monster_attitude matt = m->attitude( &g->u ); + const monster_attitude matt = m->attitude( &get_player_character() ); if( MATT_ATTACK == matt || MATT_FOLLOW == matt ) { const SDL_Color red_pixel = SDL_Color{ 0xFF, 0x0, 0x0, 0xFF }; @@ -221,7 +219,7 @@ void pixel_minimap::set_settings( const pixel_minimap_settings &settings ) void pixel_minimap::prepare_cache_for_updates( const tripoint ¢er ) { - const tripoint new_center_sm = g->m.get_abs_sub() + ms_to_sm_copy( center ); + const tripoint new_center_sm = get_map().get_abs_sub() + ms_to_sm_copy( center ); const tripoint center_sm_diff = cached_center_sm - new_center_sm; //invalidate the cache if the game shifted more than one submap in the last update, or if z-level changed. @@ -295,10 +293,11 @@ void pixel_minimap::flush_cache_updates() void pixel_minimap::update_cache_at( const tripoint &sm_pos ) { - const level_cache &access_cache = g->m.access_cache( sm_pos.z ); - const bool nv_goggle = g->u.get_vision_modes()[NV_GOGGLES]; + const map &here = get_map(); + const level_cache &access_cache = here.access_cache( sm_pos.z ); + const bool nv_goggle = get_player_character().get_vision_modes()[NV_GOGGLES]; - submap_cache &cache_item = get_cache_at( g->m.get_abs_sub() + sm_pos ); + submap_cache &cache_item = get_cache_at( here.get_abs_sub() + sm_pos ); const tripoint ms_pos = sm_to_ms_copy( sm_pos ); cache_item.touched = true; @@ -445,7 +444,7 @@ void pixel_minimap::render( const tripoint ¢er ) void pixel_minimap::render_cache( const tripoint ¢er ) { - const tripoint sm_center = g->m.get_abs_sub() + ms_to_sm_copy( center ); + const tripoint sm_center = get_map().get_abs_sub() + ms_to_sm_copy( center ); const tripoint sm_offset = tripoint{ total_tiles_count.x / SEEX / 2, total_tiles_count.y / SEEY / 2, 0 @@ -494,7 +493,7 @@ void pixel_minimap::render_critters( const tripoint ¢er ) mixture = lerp_clamped( 0, 100, std::max( s, 0.0f ) ); } - const level_cache &access_cache = g->m.access_cache( center.z ); + const level_cache &access_cache = get_map().access_cache( center.z ); const int start_x = center.x - total_tiles_count.x / 2; const int start_y = center.y - total_tiles_count.y / 2; @@ -514,7 +513,7 @@ void pixel_minimap::render_critters( const tripoint ¢er ) const auto critter = g->critter_at( p, true ); - if( critter == nullptr || !g->u.sees( *critter ) ) { + if( critter == nullptr || !get_player_character().sees( *critter ) ) { continue; } diff --git a/src/player.cpp b/src/player.cpp index 855941bbad767..546bb28fd57a3 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -88,6 +88,7 @@ static const efftype_id effect_adrenaline( "adrenaline" ); static const efftype_id effect_bite( "bite" ); +static const efftype_id effect_bleed( "bleed" ); static const efftype_id effect_blind( "blind" ); static const efftype_id effect_bloodworms( "bloodworms" ); static const efftype_id effect_boomered( "boomered" ); @@ -191,6 +192,7 @@ static const trait_id trait_WEB_WEAVER( "WEB_WEAVER" ); static const std::string flag_SPLINT( "SPLINT" ); static const skill_id skill_dodge( "dodge" ); +static const skill_id skill_firstaid( "firstaid" ); static const skill_id skill_gun( "gun" ); static const skill_id skill_swimming( "swimming" ); @@ -278,7 +280,7 @@ player::player() } recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); } player::~player() = default; @@ -558,7 +560,7 @@ double player::recoil_vehicle() const // TODO: vary penalty dependent upon vehicle part on which player is boarded if( in_vehicle ) { - if( const optional_vpart_position vp = g->m.veh_at( pos() ) ) { + if( const optional_vpart_position vp = get_map().veh_at( pos() ) ) { return static_cast( std::abs( vp->vehicle().velocity ) ) * 3 / 100; } } @@ -751,6 +753,7 @@ void player::pause() moves = 0; recoil = MAX_RECOIL; + map &here = get_map(); // Train swimming if underwater if( !in_vehicle ) { if( underwater ) { @@ -761,7 +764,7 @@ void player::pause() bodypart_str_id( "foot_l" ), bodypart_str_id( "foot_r" ), bodypart_str_id( "hand_l" ), bodypart_str_id( "hand_r" ) } }, true ); - } else if( g->m.has_flag( TFLAG_DEEP_WATER, pos() ) ) { + } else if( here.has_flag( TFLAG_DEEP_WATER, pos() ) ) { practice( skill_swimming, 1 ); // Same as above, except no head/eyes/mouth drench( 100, { { @@ -770,7 +773,7 @@ void player::pause() bodypart_str_id( "hand_r" ) } }, true ); - } else if( g->m.has_flag( "SWIMMABLE", pos() ) ) { + } else if( here.has_flag( "SWIMMABLE", pos() ) ) { drench( 40, { { bodypart_str_id( "foot_l" ), bodypart_str_id( "foot_r" ), bodypart_str_id( "leg_l" ), bodypart_str_id( "leg_r" ) } }, false ); } @@ -796,7 +799,7 @@ void player::pause() } // Don't drop on the ground when the ground is on fire - if( total_left > 1_minutes && !is_dangerous_fields( g->m.field_at( pos() ) ) ) { + if( total_left > 1_minutes && !is_dangerous_fields( here.field_at( pos() ) ) ) { add_effect( effect_downed, 2_turns, num_bp, false, 0, true ); add_msg_player_or_npc( m_warning, _( "You roll on the ground, trying to smother the fire!" ), @@ -807,7 +810,39 @@ void player::pause() _( " attempts to put out the fire on them!" ) ); } } + // put pressure on bleeding wound, prioritizing most severe bleeding + if( !is_armed() && has_effect( effect_bleed ) ) { + int most = 0; + bodypart_id bp_id; + for( const body_part bp : all_body_parts ) { + if( most <= get_effect_int( effect_bleed, bp ) ) { + most = get_effect_int( effect_bleed, bp ); + bp_id = convert_bp( bp ); + } + } + effect &e = get_effect( effect_bleed, bp_id->token ); + time_duration penalty = 1_turns * ( encumb( bodypart_id( "hand_r" ) ) + encumb( + bodypart_id( "hand_l" ) ) ); + time_duration benefit = 5_turns + 10_turns * get_skill_level( skill_firstaid ); + if( is_limb_broken( bodypart_id( "arm_l" ) ) || is_limb_broken( bodypart_id( "arm_r" ) ) ) { + add_msg_player_or_npc( m_warning, + _( "Your broken limb significantly hampers your efforts to puting pressure on the bleeding wound!" ), + _( "'s broken limb significantly hampers efforts of putting pressure on the bleeding wound!" ) ); + e.mod_duration( -1_turns ); + } else if( benefit <= penalty ) { + add_msg_player_or_npc( m_warning, + _( "Your hands are too encumbred to effectivly put pressure on the bleeding wound!" ), + _( "'s hands are too encumbred to effectivly put pressure on the bleeding wound!" ) ); + e.mod_duration( -1_turns ); + } else { + e.mod_duration( - ( benefit - penalty ) ); + add_msg_player_or_npc( m_warning, + _( "You attempt to put pressure on the bleeding wound!" ), + _( " attempts to put pressure on the bleeding wound!" ) ); + practice( skill_firstaid, 1 ); + } + } // on-pause effects for martial arts martial_arts_data.ma_onpause_effects( *this ); @@ -818,7 +853,7 @@ void player::pause() } if( in_vehicle && one_in( 8 ) ) { - VehicleList vehs = g->m.get_vehicles(); + VehicleList vehs = here.get_vehicles(); vehicle *veh = nullptr; for( auto &v : vehs ) { veh = v.v; @@ -844,17 +879,16 @@ void player::search_surroundings() if( controlling_vehicle ) { return; } + map &here = get_map(); // Search for traps in a larger area than before because this is the only // way we can "find" traps that aren't marked as visible. // Detection formula takes care of likelihood of seeing within this range. - for( const tripoint &tp : g->m.points_in_radius( pos(), 5 ) ) { - const trap &tr = g->m.tr_at( tp ); + for( const tripoint &tp : here.points_in_radius( pos(), 5 ) ) { + const trap &tr = here.tr_at( tp ); if( tr.is_null() || tp == pos() ) { continue; } - if( has_active_bionic( bio_ground_sonar ) && !knows_trap( tp ) && - ( tr.loadid == tr_beartrap_buried || - tr.loadid == tr_landmine_buried || tr.loadid == tr_sinkhole ) ) { + if( has_active_bionic( bio_ground_sonar ) && !knows_trap( tp ) && tr.detected_by_ground_sonar() ) { const std::string direction = direction_name( direction_from( pos(), tp ) ); add_msg_if_player( m_warning, _( "Your ground sonar detected a %1$s to the %2$s!" ), tr.name(), direction ); @@ -863,13 +897,13 @@ void player::search_surroundings() if( !sees( tp ) ) { continue; } - if( tr.is_always_invisible() || tr.can_see( tp, *this ) ) { + if( tr.can_see( tp, *this ) ) { // Already seen, or can never be seen continue; } // Chance to detect traps we haven't yet seen. if( tr.detect_trap( tp, *this ) ) { - if( tr.get_visibility() > 0 ) { + if( !tr.is_trivial_to_spot() ) { // Only bug player about traps that aren't trivial to spot. const std::string direction = direction_name( direction_from( pos(), tp ) ); @@ -883,7 +917,8 @@ void player::search_surroundings() bool player::is_dead_state() const { - return hp_cur[hp_head] <= 0 || hp_cur[hp_torso] <= 0; + return get_part_hp_cur( bodypart_id( "head" ) ) <= 0 || + get_part_hp_cur( bodypart_id( "torso" ) ) <= 0; } void player::on_dodge( Creature *source, float difficulty ) @@ -928,7 +963,7 @@ void player::on_hit( Creature *source, bodypart_id bp_hit, return; } - bool u_see = g->u.sees( *this ); + bool u_see = get_player_character().sees( *this ); if( has_active_bionic( bionic_id( "bio_ods" ) ) && get_power_level() > 5_kJ ) { if( is_player() ) { add_msg( m_good, _( "Your offensive defense system shocks %s in mid-attack!" ), @@ -1118,8 +1153,9 @@ float player::fall_damage_mod() const /** @EFFECT_DODGE decreases damage from falling */ float dex_dodge = dex_cur / 2.0 + get_skill_level( skill_dodge ); // Penalize for wearing heavy stuff - const float average_leg_encumb = ( encumb( bp_leg_l ) + encumb( bp_leg_r ) ) / 2.0; - dex_dodge -= ( average_leg_encumb + encumb( bp_torso ) ) / 10; + const float average_leg_encumb = ( encumb( bodypart_id( "leg_l" ) ) + encumb( + bodypart_id( "leg_r" ) ) ) / 2.0; + dex_dodge -= ( average_leg_encumb + encumb( bodypart_id( "torso" ) ) ) / 10; // But prevent it from increasing damage dex_dodge = std::max( 0.0f, dex_dodge ); // 100% damage at 0, 75% at 10, 50% at 20 and so on @@ -1159,6 +1195,7 @@ int player::impact( const int force, const tripoint &p ) const bool slam = p != pos(); std::string target_name = "a swarm of bugs"; Creature *critter = g->critter_at( p ); + map &here = get_map(); if( critter != this && critter != nullptr ) { target_name = critter->disp_name(); // Slamming into creatures and NPCs @@ -1167,7 +1204,7 @@ int player::impact( const int force, const tripoint &p ) // TODO: Modify based on something? mod = 1.0f; effective_force = force; - } else if( const optional_vpart_position vp = g->m.veh_at( p ) ) { + } else if( const optional_vpart_position vp = here.veh_at( p ) ) { // Slamming into vehicles // TODO: Integrate it with vehicle collision function somehow target_name = vp->vehicle().disp_name(); @@ -1185,20 +1222,20 @@ int player::impact( const int force, const tripoint &p ) } } else { // Slamming into terrain/furniture - target_name = g->m.disp_name( p ); - int hard_ground = g->m.has_flag( TFLAG_DIGGABLE, p ) ? 0 : 3; + target_name = here.disp_name( p ); + int hard_ground = here.has_flag( TFLAG_DIGGABLE, p ) ? 0 : 3; armor_eff = 0.25f; // Not much // Get cut by stuff // This isn't impalement on metal wreckage, more like flying through a closed window - cut = g->m.has_flag( TFLAG_SHARP, p ) ? 5 : 0; + cut = here.has_flag( TFLAG_SHARP, p ) ? 5 : 0; effective_force = force + hard_ground; mod = slam ? 1.0f : fall_damage_mod(); - if( g->m.has_furn( p ) ) { + if( here.has_furn( p ) ) { // TODO: Make furniture matter - } else if( g->m.has_flag( TFLAG_SWIMMABLE, p ) ) { + } else if( here.has_flag( TFLAG_SWIMMABLE, p ) ) { const int swim_skill = get_skill_level( skill_swimming ); effective_force /= 4.0f + 0.1f * swim_skill; - if( g->m.has_flag( TFLAG_DEEP_WATER, p ) ) { + if( here.has_flag( TFLAG_DEEP_WATER, p ) ) { effective_force /= 1.5f; mod /= 1.0f + ( 0.1f * swim_skill ); } @@ -1237,8 +1274,7 @@ int player::impact( const int force, const tripoint &p ) int total_dealt = 0; if( mod * effective_force >= 5 ) { - for( int i = 0; i < num_hp_parts; i++ ) { - const bodypart_id bp = convert_bp( hp_to_bp( static_cast( i ) ) ).id(); + for( const bodypart_id &bp : get_all_body_parts( true ) ) { const int bash = effective_force * rng( 60, 100 ) / 100; damage_instance di; di.add_damage( DT_BASH, bash, 0, armor_eff, mod ); @@ -1314,20 +1350,21 @@ void player::knock_back_to( const tripoint &to ) return; } + map &here = get_map(); // If we're still in the function at this point, we're actually moving a tile! - if( g->m.has_flag( "LIQUID", to ) && g->m.has_flag( TFLAG_DEEP_WATER, to ) ) { + if( here.has_flag( "LIQUID", to ) && here.has_flag( TFLAG_DEEP_WATER, to ) ) { if( !is_npc() ) { - avatar_action::swim( g->m, g->u, to ); + avatar_action::swim( here, get_avatar(), to ); } // TODO: NPCs can't swim! - } else if( g->m.impassable( to ) ) { // Wait, it's a wall + } else if( here.impassable( to ) ) { // Wait, it's a wall // It's some kind of wall. // TODO: who knocked us back? Maybe that creature should be the source of the damage? apply_damage( nullptr, bodypart_id( "torso" ), 3 ); add_effect( effect_stunned, 2_turns ); add_msg_player_or_npc( _( "You bounce off a %s!" ), _( " bounces off a %s!" ), - g->m.obstacle_name( to ) ); + here.obstacle_name( to ) ); } else { // It's no wall setpos( to ); @@ -1336,14 +1373,16 @@ void player::knock_back_to( const tripoint &to ) int player::hp_percentage() const { + const bodypart_id head_id = bodypart_id( "head" ); + const bodypart_id torso_id = bodypart_id( "torso" ); int total_cur = 0; int total_max = 0; // Head and torso HP are weighted 3x and 2x, respectively - total_cur = hp_cur[hp_head] * 3 + hp_cur[hp_torso] * 2; - total_max = hp_max[hp_head] * 3 + hp_max[hp_torso] * 2; - for( int i = hp_arm_l; i < num_hp_parts; i++ ) { - total_cur += hp_cur[i]; - total_max += hp_max[i]; + total_cur = get_part_hp_cur( head_id ) * 3 + get_part_hp_cur( torso_id ) * 2; + total_max = get_part_hp_max( head_id ) * 3 + get_part_hp_max( torso_id ) * 2; + for( const std::pair< const bodypart_str_id, bodypart> &elem : get_body() ) { + total_cur += elem.second.get_hp_cur(); + total_max += elem.second.get_hp_max(); } return ( 100 * total_cur ) / total_max; @@ -1829,7 +1868,7 @@ void player::process_items() w.encumbrance_update_ = false; } if( update_required ) { - reset_encumbrance(); + calc_encumbrance(); } if( has_active_bionic( bionic_id( "bio_ups" ) ) ) { ch_UPS += units::to_kilojoule( get_power_level() ); @@ -2034,13 +2073,14 @@ item::reload_option player::select_ammo( const item &base, std::transform( opts.begin(), opts.end(), std::back_inserter( where ), [this]( const item::reload_option & e ) { bool is_ammo_container = e.ammo->is_ammo_container(); + Character &player_character = get_player_character(); if( is_ammo_container || e.ammo->is_container() ) { if( is_ammo_container && is_worn( *e.ammo ) ) { return e.ammo->type_name(); } - return string_format( _( "%s, %s" ), e.ammo->type_name(), e.ammo.describe( &g->u ) ); + return string_format( _( "%s, %s" ), e.ammo->type_name(), e.ammo.describe( &player_character ) ); } - return e.ammo.describe( &g->u ); + return e.ammo.describe( &player_character ); } ); // Pads elements to match longest member and return length @@ -2317,7 +2357,7 @@ ret_val player::can_wield( const item &it ) const _( "You need at least one arm to even consider wielding something." ) ); } - if( is_armed() && weapon.has_flag( "NO_UNWIELD" ) ) { + if( is_armed() && !can_unwield( weapon ).success() ) { return ret_val::make_failure( _( "The %s is preventing you from wielding the %s." ), weapname(), it.tname() ); } @@ -2348,6 +2388,12 @@ bool player::unwield() return false; } + // currently the only way to unwield NO_UNWIELD weapon is if it's a bionic that can be deactivated + if( weapon.has_flag( "NO_UNWIELD" ) ) { + cata::optional wi = active_bionic_weapon_index(); + return wi && deactivate_bionic( *wi ); + } + const std::string query = string_format( _( "Stop wielding %s?" ), weapon.tname() ); if( !dispose_item( item_location( *this, &weapon ), query ) ) { @@ -2788,7 +2834,7 @@ bool player::takeoff( item &it, std::list *res ) mod_moves( -250 ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); return true; } @@ -2798,23 +2844,32 @@ bool player::takeoff( int pos ) return takeoff( i_at( pos ) ); } -bool player::add_or_drop_with_msg( item &it, const bool unloading, const item *avoid ) +bool player::add_or_drop_with_msg( item &it, const bool /*unloading*/, const item *avoid ) { if( it.made_of( phase_id::LIQUID ) ) { liquid_handler::consume_liquid( it, 1 ); return it.charges <= 0; } - it.charges = this->i_add_to_container( it, unloading ); - if( it.is_ammo() && it.charges == 0 ) { - return true; - } else if( !this->can_pickVolume( it ) ) { + if( !this->can_pickVolume( it ) ) { put_into_vehicle_or_drop( *this, item_drop_reason::too_large, { it } ); } else if( !this->can_pickWeight( it, !get_option( "DANGEROUS_PICKUPS" ) ) ) { put_into_vehicle_or_drop( *this, item_drop_reason::too_heavy, { it } ); } else { - auto &ni = this->i_add( it, true, avoid ); - add_msg( _( "You put the %s in your inventory." ), ni.tname() ); - add_msg( m_info, "%c - %s", ni.invlet == 0 ? ' ' : ni.invlet, ni.tname() ); + const bool allow_wield = !weapon.has_item( it ); + const int prev_charges = it.charges; + auto &ni = this->i_add( it, true, avoid, /*allow_drop=*/false, /*allow_wield=*/allow_wield ); + if( ni.is_null() ) { + // failed to add + put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, { it } ); + } else if( &ni == &it ) { + // merged into the original stack, restore original charges + it.charges = prev_charges; + put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, { it } ); + } else { + // successfully added + add_msg( _( "You put the %s in your inventory." ), ni.tname() ); + add_msg( m_info, "%c - %s", ni.invlet == 0 ? ' ' : ni.invlet, ni.tname() ); + } } return true; } @@ -2907,7 +2962,7 @@ bool player::unload( item_location &loc ) if( target->is_magazine() ) { player_activity unload_mag_act( activity_id( "ACT_UNLOAD_MAG" ) ); assign_activity( unload_mag_act ); - activity.targets.emplace_back( loc ); + activity.targets.emplace_back( item_location( loc, target ) ); // Calculate the time to remove the contained ammo (consuming half as much time as required to load the magazine) int mv = 0; @@ -2938,15 +2993,6 @@ bool player::unload( item_location &loc ) } else if( target->ammo_remaining() ) { int qty = target->ammo_remaining(); - if( target->ammo_current() == itype_plut_cell ) { - if( qty / PLUTONIUM_CHARGES > 0 ) { - add_msg( _( "You recover %i unused plutonium." ), qty / PLUTONIUM_CHARGES ); - } else { - add_msg( m_info, _( "You can't remove partially depleted plutonium!" ) ); - return false; - } - } - // Construct a new ammo item and try to drop it item ammo( target->ammo_current(), calendar::turn, qty ); if( target->is_filthy() ) { @@ -3008,6 +3054,11 @@ void player::use( item_location loc ) item &used = *loc; last_item = used.typeId(); + if( ( *loc ).is_medication() && !can_use_heal_item( *loc ) ) { + add_msg_if_player( m_bad, _( "Your biology is not compatible with that healing item." ) ); + return; + } + if( used.is_tool() ) { if( !used.type->has_use() ) { add_msg_if_player( _( "You can't do anything interesting with your %s." ), used.tname() ); @@ -3413,10 +3464,11 @@ recipe_subset player::get_available_recipes( const inventory &crafting_inv, void player::try_to_sleep( const time_duration &dur ) { - const optional_vpart_position vp = g->m.veh_at( pos() ); - const trap &trap_at_pos = g->m.tr_at( pos() ); - const ter_id ter_at_pos = g->m.ter( pos() ); - const furn_id furn_at_pos = g->m.furn( pos() ); + map &here = get_map(); + const optional_vpart_position vp = here.veh_at( pos() ); + const trap &trap_at_pos = here.tr_at( pos() ); + const ter_id ter_at_pos = here.ter( pos() ); + const furn_id furn_at_pos = here.furn( pos() ); bool plantsleep = false; bool fungaloid_cosplay = false; bool websleep = false; @@ -3441,7 +3493,7 @@ void player::try_to_sleep( const time_duration &dur ) } } else if( has_trait( trait_M_SKIN3 ) ) { fungaloid_cosplay = true; - if( g->m.has_flag_ter_or_furn( "FUNGUS", pos() ) ) { + if( here.has_flag_ter_or_furn( "FUNGUS", pos() ) ) { add_msg_if_player( m_good, _( "Our fibers meld with the ground beneath us. The gills on our neck begin to seed the air with spores as our awareness fades." ) ); } @@ -3455,7 +3507,7 @@ void player::try_to_sleep( const time_duration &dur ) webforce = true; } if( websleep || webforce ) { - int web = g->m.get_field_intensity( pos(), fd_web ); + int web = here.get_field_intensity( pos(), fd_web ); if( !webforce ) { // At this point, it's kinda weird, but surprisingly comfy... if( web >= 3 ) { @@ -3465,7 +3517,7 @@ void player::try_to_sleep( const time_duration &dur ) } else if( web > 0 ) { add_msg_if_player( m_info, _( "You try to sleep, but the webs get in the way. You brush them aside." ) ); - g->m.remove_field( pos(), fd_web ); + here.remove_field( pos(), fd_web ); } } else { // Here, you're just not comfortable outside a nice thick web. @@ -3488,7 +3540,7 @@ void player::try_to_sleep( const time_duration &dur ) add_msg_if_player( m_good, _( "You lay beneath the waves' embrace, gazing up through the water's surface…" ) ); watersleep = true; - } else if( g->m.has_flag_ter( "SWIMMABLE", pos() ) ) { + } else if( here.has_flag_ter( "SWIMMABLE", pos() ) ) { add_msg_if_player( m_good, _( "You settle into the water and begin to drowse…" ) ); watersleep = true; } @@ -3564,7 +3616,7 @@ int player::sleep_spot( const tripoint &p ) const // Mousefolk can sleep just about anywhere. sleepy += 40; } - if( watersleep && g->m.has_flag_ter( "SWIMMABLE", pos() ) ) { + if( watersleep && get_map().has_flag_ter( "SWIMMABLE", pos() ) ) { sleepy += 10; //comfy water! } @@ -3645,7 +3697,7 @@ float player::fine_detail_vision_mod( const tripoint &p ) const // Same calculation as above, but with a result 3 lower. float ambient_light = std::max( 1.0f, - LIGHT_AMBIENT_LIT - g->m.ambient_light_at( p == tripoint_zero ? pos() : p ) + 1.0f ); + LIGHT_AMBIENT_LIT - get_map().ambient_light_at( p == tripoint_zero ? pos() : p ) + 1.0f ); return std::min( own_light, ambient_light ); } @@ -3709,6 +3761,9 @@ void player::practice( const skill_id &id, int amount, int cap, bool suppress_wa get_skill_level_object( id ).train( amount ); int newLevel = get_skill_level( id ); std::string skill_name = skill.name(); + if( newLevel > oldLevel ) { + g->events().send( getID(), id, newLevel ); + } if( is_player() && newLevel > oldLevel ) { add_msg( m_good, _( "Your skill in %s has increased to %d!" ), skill_name, newLevel ); } @@ -3915,7 +3970,7 @@ void player::store( item &container, item &put, bool penalties, int base_cost, { moves -= item_store_cost( put, container, penalties, base_cost ); container.put_in( i_rem( &put ), pk_type ); - reset_encumbrance(); + calc_encumbrance(); } nc_color encumb_color( int level ) @@ -3942,8 +3997,8 @@ float player::get_melee() const bool player::uncanny_dodge() { - bool is_u = this == &g->u; - bool seen = g->u.sees( *this ); + bool is_u = is_avatar();; + bool seen = get_player_character().sees( *this ); if( this->get_power_level() < 74_kJ || !this->has_active_bionic( bio_uncanny_dodge ) ) { return false; } @@ -3970,11 +4025,12 @@ bool player::uncanny_dodge() int player::climbing_cost( const tripoint &from, const tripoint &to ) const { - if( !g->m.valid_move( from, to, false, true ) ) { + map &here = get_map(); + if( !here.valid_move( from, to, false, true ) ) { return 0; } - const int diff = g->m.climb_difficulty( from ); + const int diff = here.climb_difficulty( from ); if( diff > 5 ) { return 0; @@ -3989,9 +4045,7 @@ void player::environmental_revert_effect() addictions.clear(); morale->clear(); - for( int part = 0; part < num_hp_parts; part++ ) { - hp_cur[part] = hp_max[part]; - } + set_all_parts_hp_to_max(); set_hunger( 0 ); set_thirst( 0 ); set_fatigue( 0 ); @@ -4003,7 +4057,7 @@ void player::environmental_revert_effect() set_rad( 0 ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); } //message related stuff diff --git a/src/player.h b/src/player.h index 8816647beb6bf..322d0b825f63e 100644 --- a/src/player.h +++ b/src/player.h @@ -674,8 +674,6 @@ class player : public Character // ---------------VALUES----------------- tripoint view_offset; - // Is currently in control of a vehicle - bool controlling_vehicle; // Relative direction of a grab, add to posx, posy to get the coordinates of the grabbed thing. tripoint grab_point; int volume; diff --git a/src/player_activity.cpp b/src/player_activity.cpp index d23501835c0fd..913aef93cde31 100644 --- a/src/player_activity.cpp +++ b/src/player_activity.cpp @@ -76,6 +76,13 @@ void player_activity::set_to_null() sfx::end_activity_sounds(); // kill activity sounds when activity is nullified } +void player_activity::sychronize_type_with_actor() +{ + if( actor && type != activity_id::NULL_ID() ) { + type = actor->get_type(); + } +} + bool player_activity::rooted() const { return type->rooted(); @@ -177,13 +184,17 @@ void player_activity::start_or_resume( Character &who, bool resuming ) if( actor && !resuming ) { actor->start( *this, who ); } - if( rooted() ) { + if( !type.is_null() && rooted() ) { who.rooted_message(); } + // last, as start function may have changed the type + sychronize_type_with_actor(); } void player_activity::do_turn( player &p ) { + // first to ensure sync with actor + sychronize_type_with_actor(); // Should happen before activity or it may fail du to 0 moves if( *this && type->will_refuel_fires() ) { try_fuel_fire( *this, p ); @@ -241,6 +252,7 @@ void player_activity::do_turn( player &p ) const bool travel_activity = id() == ACT_TRAVELLING; // This might finish the activity (set it to null) if( actor ) { + p.increase_activity_level( actor->get_type()->exertion_level() ); actor->do_turn( *this, p ); } else { // Use the legacy turn function @@ -254,7 +266,13 @@ void player_activity::do_turn( player &p ) // to simulate that the next step will surely use up some stamina anyway // this is to ensure that resting will occur when traveling overburdened const int adjusted_stamina = travel_activity ? p.get_stamina() - 1 : p.get_stamina(); - if( adjusted_stamina < previous_stamina && p.get_stamina() < p.get_stamina_max() / 3 ) { + activity_id act_id = actor ? actor->get_type() : type; + bool excluded = act_id == activity_id( "ACT_WORKOUT_HARD" ) || + act_id == activity_id( "ACT_WORKOUT_ACTIVE" ) || + act_id == activity_id( "ACT_WORKOUT_MODERATE" ) || + act_id == activity_id( "ACT_WORKOUT_LIGHT" ); + if( !excluded && adjusted_stamina < previous_stamina && + p.get_stamina() < p.get_stamina_max() / 3 ) { if( one_in( 50 ) ) { p.add_msg_if_player( _( "You pause for a moment to catch your breath." ) ); } @@ -280,6 +298,7 @@ void player_activity::do_turn( player &p ) set_to_null(); } } + p.reset_activity_level(); } if( !*this ) { // Make sure data of previous activity is cleared diff --git a/src/player_activity.h b/src/player_activity.h index 419d8c66e4b88..39b14c00ed80e 100644 --- a/src/player_activity.h +++ b/src/player_activity.h @@ -93,6 +93,11 @@ class player_activity /** This replaces the former usage `act.type = ACT_NULL` */ void set_to_null(); + // This makes player_activity's activity type inherit activity_actor's activity type, + // in order to synchronize both, due to possible variablility of actor's activity type + // allowed via override of activity_actor::get_type() + void sychronize_type_with_actor(); + const activity_id &id() const { return type; } diff --git a/src/player_display.cpp b/src/player_display.cpp index 0454355ddac6a..725c0bfa6f6e1 100644 --- a/src/player_display.cpp +++ b/src/player_display.cpp @@ -20,6 +20,7 @@ #include "options.h" #include "output.h" #include "profession.h" +#include "proficiency.h" #include "skill.h" #include "string_formatter.h" #include "string_id.h" @@ -38,6 +39,7 @@ static const std::string title_SPEED = translate_marker( "SPEED" ); static const std::string title_SKILLS = translate_marker( "SKILLS" ); static const std::string title_BIONICS = translate_marker( "BIONICS" ); static const std::string title_TRAITS = translate_marker( "TRAITS" ); +static const std::string title_PROFICIENCIES = translate_marker( "PROFICIENCIES" ); // use this instead of having to type out 26 spaces like before static const std::string header_spaces( 26, ' ' ); @@ -48,35 +50,37 @@ static int temperature_print_rescaling( int temp ) return ( temp / 100.0 ) * 2 - 100; } -static body_part other_part( body_part bp ) +static bodypart_id other_part( const bodypart_id &bp ) { - return static_cast( bp_aiOther[bp] ); + return bp->opposite_part; } -static bool should_combine_bps( const player &p, body_part l, body_part r, +static bool should_combine_bps( const player &p, const bodypart_id &l, const bodypart_id &r, const item *selected_clothing ) { - const auto enc_data = p.get_encumbrance(); + const encumbrance_data enc_l = p.get_part_encumbrance_data( l ); + const encumbrance_data enc_r = p.get_part_encumbrance_data( r ); + return l != r && // are different parts l == other_part( r ) && r == other_part( l ) && // are complementary parts // same encumberance & temperature - enc_data[l] == enc_data[r] && - temperature_print_rescaling( p.temp_conv[l] ) == temperature_print_rescaling( p.temp_conv[r] ) && + enc_l == enc_r && + temperature_print_rescaling( p.temp_conv[l->token] ) == temperature_print_rescaling( + p.temp_conv[r->token] ) && // selected_clothing covers both or neither parts ( !selected_clothing || - ( selected_clothing->covers( convert_bp( l ).id() ) == selected_clothing->covers( convert_bp( - r ).id() ) ) ); + ( selected_clothing->covers( l ) == selected_clothing->covers( r ) ) ); } -static std::vector> list_and_combine_bps( const player &p, +static std::vector> list_and_combine_bps( const player &p, const item *selected_clothing ) { // bool represents whether the part has been combined with its other half - std::vector> bps; - for( auto bp : all_body_parts ) { + std::vector> bps; + for( const bodypart_id &bp : p.get_all_body_parts() ) { // assuming that a body part has at most one other half if( other_part( other_part( bp ) ) != bp ) { - debugmsg( "Bodypart %d has more than one other half!", bp ); + debugmsg( "Bodypart %d has more than one other half!", bp.id().c_str() ); } if( should_combine_bps( p, bp, other_part( bp ), selected_clothing ) ) { if( bp < other_part( bp ) ) { @@ -94,7 +98,7 @@ void player::print_encumbrance( const catacurses::window &win, const int line, const item *const selected_clothing ) const { // bool represents whether the part has been combined with its other half - const std::vector> bps = list_and_combine_bps( *this, + const std::vector> bps = list_and_combine_bps( *this, selected_clothing ); // width/height excluding title & scrollbar @@ -109,7 +113,6 @@ void player::print_encumbrance( const catacurses::window &win, const int line, *** for displaying triple digit encumbrance, due to new encumbrance system. *** *** If the player wants to see the total without having to do them maths, the *** *** armor layers ui shows everything they want :-) -Davek ***/ - const auto enc_data = get_encumbrance(); for( int i = 0; i < height; ++i ) { int thisline = firstline + i; if( thisline < 0 ) { @@ -118,12 +121,11 @@ void player::print_encumbrance( const catacurses::window &win, const int line, if( static_cast( thisline ) >= bps.size() ) { break; } - const body_part bp = bps[thisline].first; + const bodypart_id bp = bps[thisline].first; const bool combine = bps[thisline].second; - const encumbrance_data &e = enc_data[bp]; - const bool highlighted = selected_clothing ? selected_clothing->covers( convert_bp( - bp ).id() ) : false; - std::string out = body_part_name_as_heading( convert_bp( bp ).id(), combine ? 2 : 1 ); + const encumbrance_data &e = get_part_encumbrance_data( bp ); + const bool highlighted = selected_clothing ? selected_clothing->covers( bp ) : false; + std::string out = body_part_name_as_heading( bp, combine ? 2 : 1 ); if( utf8_width( out ) > 7 ) { out = utf8_truncate( out, 7 ); } @@ -142,8 +144,8 @@ void player::print_encumbrance( const catacurses::window &win, const int line, // take into account the new encumbrance system for layers mvwprintz( win, point( 12, 1 + i ), encumb_color( e.encumbrance ), "%-3d", e.layer_penalty ); // print warmth, tethered to right hand side of the window - mvwprintz( win, point( width - 6, 1 + i ), bodytemp_color( bp ), "(% 3d)", - temperature_print_rescaling( temp_conv[bp] ) ); + mvwprintz( win, point( width - 6, 1 + i ), bodytemp_color( bp->token ), "(% 3d)", + temperature_print_rescaling( temp_conv[bp->token] ) ); } if( draw_scrollbar ) { @@ -196,21 +198,22 @@ static std::string dodge_skill_text( double mod ) return string_format( _( "Dodge skill: %+.1f\n" ), mod ); } -static int get_encumbrance( const player &p, body_part bp, bool combine ) +static int get_encumbrance( const player &p, const bodypart_id &bp, bool combine ) { // Body parts that can't combine with anything shouldn't print double values on combine // This shouldn't happen, but handle this, just in case - const bool combines_with_other = static_cast( bp_aiOther[bp] ) != bp; + const bool combines_with_other = bp->opposite_part != bp.id(); return p.encumb( bp ) * ( ( combine && combines_with_other ) ? 2 : 1 ); } -static std::string get_encumbrance_description( const player &p, body_part bp, bool combine ) +static std::string get_encumbrance_description( const player &p, const bodypart_id bp, + bool combine ) { std::string s; const int eff_encumbrance = get_encumbrance( p, bp, combine ); - switch( bp ) { + switch( bp->token ) { case bp_torso: { const int melee_roll_pen = std::max( -eff_encumbrance, -80 ); s += string_format( _( "Melee attack rolls: %+d%%\n" ), melee_roll_pen ); @@ -290,6 +293,7 @@ enum class player_display_tab : int { traits, bionics, effects, + proficiencies, num_tabs, }; } // namespace @@ -312,6 +316,50 @@ static player_display_tab prev_tab( const player_display_tab tab ) } } +static std::vector sorted_proficiencies( const Character &guy ) +{ + std::vector ret; + for( const proficiency_id &id : guy.proficiencies() ) { + ret.emplace_back( id->name() ); + } + std::sort( ret.begin(), ret.end(), localized_compare ); + return ret; +} + +static void draw_proficiencies_tab( const catacurses::window &win, const unsigned line, + const Character &guy, const player_display_tab curtab ) +{ + werase( win ); + const bool focused = curtab == player_display_tab::proficiencies; + const nc_color title_color = focused ? h_light_gray : c_light_gray; + center_print( win, 0, title_color, _( title_PROFICIENCIES ) ); + const std::vector &profs = sorted_proficiencies( guy ); + const int height = getmaxy( win ) - 1; + const int width = getmaxx( win ) - 1; + bool draw_scrollbar = profs.size() > static_cast( height ); + int y = 1; + int start = draw_scrollbar ? line : 0; + for( size_t i = start; i < profs.size(); ++i ) { + if( y > height ) { + break; + } + y += fold_and_print( win, point( 1, y ), width, c_white, profs[i] ); + } + + if( draw_scrollbar ) { + scrollbar() + .offset_x( width ) + .offset_y( 1 ) + .content_size( profs.size() ) + .viewport_pos( line ) + .viewport_size( height ) + .scroll_to_last( false ) + .apply( win ); + } + + wnoutrefresh( win ); +} + static void draw_stats_tab( const catacurses::window &w_stats, const player &you, const unsigned int line, const player_display_tab curtab ) { @@ -384,7 +432,8 @@ static void draw_stats_info( const catacurses::window &w_info, _( "Strength affects your melee damage, the amount of weight you can carry, your total HP, " "your resistance to many diseases, and the effectiveness of actions which require brute force." ) ); print_colored_text( w_info, point( 1, 3 ), col_temp, c_light_gray, - string_format( _( "Base HP: %d" ), you.hp_max[1] ) ); + string_format( _( "Base HP: %d" ), + you.get_part_hp_max( bodypart_id( "torso" ) ) ) ); print_colored_text( w_info, point( 1, 4 ), col_temp, c_light_gray, string_format( _( "Carry weight (%s): %.1f" ), weight_units(), convert_weight( you.weight_capacity() ) ) ); @@ -477,10 +526,10 @@ static void draw_encumbrance_tab( const catacurses::window &w_encumb, static void draw_encumbrance_info( const catacurses::window &w_info, const player &you, const unsigned int line ) { - const std::vector> bps = list_and_combine_bps( you, nullptr ); + const std::vector> bps = list_and_combine_bps( you, nullptr ); werase( w_info ); - body_part bp = num_bp; + bodypart_id bp; bool combined_here = false; if( line < bps.size() ) { bp = bps[line].first; @@ -904,6 +953,10 @@ static void draw_info_window( const catacurses::window &w_info, const player &yo case player_display_tab::effects: draw_effects_info( w_info, line, effect_name_and_text ); break; + case player_display_tab::proficiencies: + werase( w_info ); + wnoutrefresh( w_info ); + break; case player_display_tab::num_tabs: abort(); } @@ -942,13 +995,11 @@ static void draw_tip( const catacurses::window &w_tip, const player &you, } static bool handle_player_display_action( player &you, unsigned int &line, - player_display_tab &curtab, input_context &ctxt, - const ui_adaptor &ui_tip, const ui_adaptor &ui_info, - const ui_adaptor &ui_stats, const ui_adaptor &ui_encumb, - const ui_adaptor &ui_traits, const ui_adaptor &ui_bionics, - const ui_adaptor &ui_effects, const ui_adaptor &ui_skills, - const std::vector &traitslist, - const std::vector &bionicslist, + player_display_tab &curtab, input_context &ctxt, const ui_adaptor &ui_tip, + const ui_adaptor &ui_info, const ui_adaptor &ui_stats, const ui_adaptor &ui_encumb, + const ui_adaptor &ui_traits, const ui_adaptor &ui_bionics, const ui_adaptor &ui_effects, + const ui_adaptor &ui_skills, const ui_adaptor &ui_proficiencies, + const std::vector &traitslist, const std::vector &bionicslist, const std::vector> &effect_name_and_text, const std::vector &skillslist ) { @@ -972,6 +1023,9 @@ static bool handle_player_display_action( player &you, unsigned int &line, case player_display_tab::skills: ui_skills.invalidate_ui(); break; + case player_display_tab::proficiencies: + ui_proficiencies.invalidate_ui(); + break; case player_display_tab::num_tabs: abort(); } @@ -984,7 +1038,7 @@ static bool handle_player_display_action( player &you, unsigned int &line, line_end = 8; break; case player_display_tab::encumbrance: { - const std::vector> bps = list_and_combine_bps( you, nullptr ); + const std::vector> bps = list_and_combine_bps( you, nullptr ); line_end = bps.size(); break; } @@ -1001,6 +1055,9 @@ static bool handle_player_display_action( player &you, unsigned int &line, line_beg = 1; // skip first header line_end = skillslist.size(); break; + case player_display_tab::proficiencies: + line_end = sorted_proficiencies( you ).size(); + break; case player_display_tab::num_tabs: abort(); } @@ -1136,10 +1193,8 @@ void player::disp_info() effect_name_and_text.push_back( { starvation_name, starvation_text } ); } - if( ( has_trait( trait_id( "TROGLO" ) ) && g->is_in_sunlight( pos() ) && - g->weather.weather == WEATHER_SUNNY ) || - ( has_trait( trait_id( "TROGLO2" ) ) && g->is_in_sunlight( pos() ) && - g->weather.weather != WEATHER_SUNNY ) ) { + if( has_trait( trait_id( "TROGLO" ) ) && g->is_in_sunlight( pos() ) && + get_weather().weather_id->sun_intensity >= sun_intensity_type::high ) { effect_name_and_text.push_back( { _( "In Sunlight" ), _( "The sunlight irritates you.\n" "Strength - 1; Dexterity - 1; Intelligence - 1; Perception - 1" ) @@ -1368,8 +1423,8 @@ void player::disp_info() ui_effects.on_screen_resize( [&]( ui_adaptor & ui_effects ) { w_effects = catacurses::newwin( effect_win_size_y, grid_width, point( grid_width * 2 + 2, infooffsetybottom ) ); - w_effects_border = catacurses::newwin( effect_win_size_y + 1, grid_width + 1, - point( grid_width * 2 + 2, infooffsetybottom ) ); + w_effects_border = catacurses::newwin( effect_win_size_y + 1, grid_width + 2, + point( grid_width * 2 + 1, infooffsetybottom ) ); border_effects.set( point( grid_width * 2 + 1, infooffsetybottom - 1 ), point( grid_width + 2, effect_win_size_y + 2 ) ); ui_effects.position_from_window( w_effects_border ); @@ -1381,23 +1436,29 @@ void player::disp_info() draw_effects_tab( w_effects, line, curtab, effect_name_and_text, effect_win_size_y ); } ); - catacurses::window w_speed; - catacurses::window w_speed_border; - border_helper::border_info &border_speed = borders.add_border(); - ui_adaptor ui_speed; - ui_speed.on_screen_resize( [&]( ui_adaptor & ui_speed ) { - w_speed = catacurses::newwin( grid_height, grid_width, point( grid_width * 2 + 2, 1 ) ); - w_speed_border = catacurses::newwin( grid_height + 1, grid_width + 1, - point( grid_width * 2 + 2, 1 ) ); - border_speed.set( point( grid_width * 2 + 1, 0 ), - point( grid_width + 2, grid_height + 2 ) ); - ui_speed.position_from_window( w_speed_border ); + unsigned int proficiency_win_size_y = 0; + const point profstart = point( grid_width * 2 + 2, infooffsetybottom + effect_win_size_y + 1 ); + catacurses::window w_proficiencies; + catacurses::window w_proficiencies_border; + border_helper::border_info &border_proficiencies = borders.add_border(); + ui_adaptor ui_proficiencies; + ui_proficiencies.on_screen_resize( [&]( ui_adaptor & ui_proficiencies ) { + const unsigned int maxy = static_cast( TERMY ); + proficiency_win_size_y = std::min( _proficiencies.size(), + static_cast( maxy - ( infooffsetybottom + effect_win_size_y ) ) ) + 1; + w_proficiencies = catacurses::newwin( proficiency_win_size_y, grid_width, + profstart ); + w_proficiencies_border = catacurses::newwin( proficiency_win_size_y + 1, grid_width + 2, + profstart + point_west ); + border_proficiencies.set( profstart + point_north_west, point( grid_width + 2, + proficiency_win_size_y + 2 ) ); + ui_proficiencies.position_from_window( w_proficiencies_border ); } ); - ui_speed.mark_resize(); - ui_speed.on_redraw( [&]( const ui_adaptor & ) { - borders.draw_border( w_speed_border ); - wnoutrefresh( w_speed_border ); - draw_speed_tab( w_speed, *this, speed_effects ); + ui_proficiencies.mark_resize(); + ui_proficiencies.on_redraw( [&]( const ui_adaptor & ) { + borders.draw_border( w_proficiencies_border ); + wnoutrefresh( w_proficiencies_border ); + draw_proficiencies_tab( w_proficiencies, line, *this, curtab ); } ); unsigned int skill_win_size_y = 0; @@ -1447,13 +1508,32 @@ void player::disp_info() traitslist, bionicslist, effect_name_and_text, skillslist ); } ); + catacurses::window w_speed; + catacurses::window w_speed_border; + border_helper::border_info &border_speed = borders.add_border(); + ui_adaptor ui_speed; + ui_speed.on_screen_resize( [&]( ui_adaptor & ui_speed ) { + w_speed = catacurses::newwin( grid_height, grid_width, point( grid_width * 2 + 2, 1 ) ); + w_speed_border = catacurses::newwin( grid_height + 1, grid_width + 1, + point( grid_width * 2 + 2, 1 ) ); + border_speed.set( point( grid_width * 2 + 1, 0 ), + point( grid_width + 2, grid_height + 2 ) ); + ui_speed.position_from_window( w_speed_border ); + } ); + ui_speed.mark_resize(); + ui_speed.on_redraw( [&]( const ui_adaptor & ) { + borders.draw_border( w_speed_border ); + wnoutrefresh( w_speed_border ); + draw_speed_tab( w_speed, *this, speed_effects ); + } ); + bool done = false; do { ui_manager::redraw_invalidated(); - done = handle_player_display_action( *this, line, curtab, ctxt, ui_tip, ui_info, - ui_stats, ui_encumb, ui_traits, ui_bionics, ui_effects, ui_skills, - traitslist, bionicslist, effect_name_and_text, skillslist ); + done = handle_player_display_action( *this, line, curtab, ctxt, ui_tip, ui_info, ui_stats, + ui_encumb, ui_traits, ui_bionics, ui_effects, ui_skills, ui_proficiencies, traitslist, bionicslist, + effect_name_and_text, skillslist ); } while( !done ); } diff --git a/src/player_hardcoded_effects.cpp b/src/player_hardcoded_effects.cpp index e76a6d80a4729..842b55eb174cf 100644 --- a/src/player_hardcoded_effects.cpp +++ b/src/player_hardcoded_effects.cpp @@ -6,7 +6,7 @@ #include #include "activity_handlers.h" -#include "avatar.h" +#include "character.h" #include "effect.h" #include "enums.h" #include "event.h" @@ -29,6 +29,7 @@ #include "translations.h" #include "units.h" #include "weather.h" +#include "vitamin.h" #if defined(TILES) # if defined(_MSC_VER) && defined(USE_VCPKG) @@ -46,6 +47,7 @@ static const activity_id ACT_FIRSTAID( "ACT_FIRSTAID" ); static const efftype_id effect_adrenaline( "adrenaline" ); static const efftype_id effect_alarm_clock( "alarm_clock" ); static const efftype_id effect_antibiotic( "antibiotic" ); +static const efftype_id effect_anemia( "anemia" ); static const efftype_id effect_asthma( "asthma" ); static const efftype_id effect_attention( "attention" ); static const efftype_id effect_bite( "bite" ); @@ -67,6 +69,7 @@ static const efftype_id effect_grabbed( "grabbed" ); static const efftype_id effect_grabbing( "grabbing" ); static const efftype_id effect_hallu( "hallu" ); static const efftype_id effect_hot( "hot" ); +static const efftype_id effect_hypovolemia( "hypovolemia" ); static const efftype_id effect_infected( "infected" ); static const efftype_id effect_lying_down( "lying_down" ); static const efftype_id effect_mending( "mending" ); @@ -78,6 +81,7 @@ static const efftype_id effect_paincysts( "paincysts" ); static const efftype_id effect_panacea( "panacea" ); static const efftype_id effect_rat( "rat" ); static const efftype_id effect_recover( "recover" ); +static const efftype_id effect_redcells_anemia( "redcells_anemia" ); static const efftype_id effect_shakes( "shakes" ); static const efftype_id effect_sleep( "sleep" ); static const efftype_id effect_slept_through_alarm( "slept_through_alarm" ); @@ -92,8 +96,10 @@ static const efftype_id effect_toxin_buildup( "toxin_buildup" ); static const efftype_id effect_valium( "valium" ); static const efftype_id effect_visuals( "visuals" ); static const efftype_id effect_weak_antibiotic( "weak_antibiotic" ); +static const efftype_id effect_winded( "winded" ); -static const vitamin_id vitamin_iron( "iron" ); +static const vitamin_id vitamin_blood( "blood" ); +static const vitamin_id vitamin_redcells( "redcells" ); static const mongroup_id GROUP_NETHER( "GROUP_NETHER" ); @@ -114,6 +120,8 @@ static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" ); static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" ); static const trait_id trait_WATERSLEEP( "WATERSLEEP" ); +static const std::string flag_TOURNIQUET( "TOURNIQUET" ); + static void eff_fun_onfire( player &u, effect &it ) { const int intense = it.get_intensity(); @@ -182,8 +190,9 @@ static void eff_fun_fungus( player &u, effect &it ) _( " vomits thousands of live spores!" ) ); u.moves = -500; - fungal_effects fe( *g, g->m ); - for( const tripoint &sporep : g->m.points_in_radius( u.pos(), 1 ) ) { + map &here = get_map(); + fungal_effects fe( *g, here ); + for( const tripoint &sporep : here.points_in_radius( u.pos(), 1 ) ) { if( sporep == u.pos() ) { continue; } @@ -191,8 +200,8 @@ static void eff_fun_fungus( player &u, effect &it ) } // We're fucked } else if( one_in( 36000 + bonus * 120 ) ) { - if( u.is_limb_broken( hp_arm_l ) || u.is_limb_broken( hp_arm_r ) ) { - if( u.is_limb_broken( hp_arm_l ) && u.is_limb_broken( hp_arm_r ) ) { + if( u.is_limb_broken( bodypart_id( "arm_l" ) ) || u.is_limb_broken( bodypart_id( "arm_r" ) ) ) { + if( u.is_limb_broken( bodypart_id( "arm_l" ) ) && u.is_limb_broken( bodypart_id( "arm_r" ) ) ) { u.add_msg_player_or_npc( m_bad, _( "The flesh on your broken arms bulges. Fungus stalks burst through!" ), _( "'s broken arms bulge. Fungus stalks burst out of the bulges!" ) ); @@ -239,14 +248,20 @@ static void eff_fun_bleed( player &u, effect &it ) // on the wound or otherwise suppressing the flow. (Kits contain either // QuikClot or bandages per the recipe.) const int intense = it.get_intensity(); - if( one_in( 36 / intense ) && u.activity.id() != ACT_FIRSTAID ) { - u.add_msg_player_or_npc( m_bad, _( "You lose some blood." ), - _( " loses some blood." ) ); + // tourniquet reduces effective bleeding by 2/3 but doesn't modify the effect's intensity + bool tourniquet = u.worn_with_flag( flag_TOURNIQUET, convert_bp( it.get_bp() ) ); + if( !( tourniquet && one_in( 3 ) ) && u.activity.id() != ACT_FIRSTAID ) { // Prolonged hemorrhage is a significant risk for developing anemia - u.vitamin_mod( vitamin_iron, rng( -1, -4 ) ); - u.mod_pain( 1 ); - u.apply_damage( nullptr, convert_bp( it.get_bp() ).id(), 1 ); - u.bleed(); + u.vitamin_mod( vitamin_redcells, -intense ); + u.vitamin_mod( vitamin_blood, -intense ); + if( one_in( 400 / intense ) ) { + u.mod_pain( 1 ); + } + if( one_in( 120 / intense ) ) { + u.bleed(); + u.add_msg_player_or_npc( m_bad, _( "You lose some blood." ), + _( " loses some blood." ) ); + } } } static void eff_fun_hallu( player &u, effect &it ) @@ -489,6 +504,8 @@ void player::hardcoded_effects( effect &it ) int intense = it.get_intensity(); const bodypart_id &bp = convert_bp( it.get_bp() ).id(); bool sleeping = has_effect( effect_sleep ); + map &here = get_map(); + Character &player_character = get_player_character(); if( id == effect_dermatik ) { bool triggered = false; int formication_chance = 3600; @@ -537,8 +554,8 @@ void player::hardcoded_effects( effect &it ) //~ %s is bodypart in accusative. add_msg( m_warning, _( "You start scratching your %s!" ), body_part_name_accusative( bp ) ); - g->u.cancel_activity(); - } else if( g->u.sees( pos() ) ) { + player_character.cancel_activity(); + } else if( player_character.sees( pos() ) ) { //~ 1$s is NPC name, 2$s is bodypart in accusative. add_msg( _( "%1$s starts scratching their %2$s!" ), name, body_part_name_accusative( bp ) ); @@ -588,13 +605,13 @@ void player::hardcoded_effects( effect &it ) tries++; } while( g->critter_at( dest ) && tries < 10 ); if( tries < 10 ) { - if( g->m.impassable( dest ) ) { - g->m.make_rubble( dest, f_rubble_rock, true ); + if( here.impassable( dest ) ) { + here.make_rubble( dest, f_rubble_rock, true ); } MonsterGroupResult spawn_details = MonsterGroupManager::GetResultFromGroup( GROUP_NETHER ); g->place_critter_at( spawn_details.name, dest ); - if( g->u.sees( dest ) ) { + if( player_character.sees( dest ) ) { g->cancel_activity_or_ignore_query( distraction_type::hostile_spotted_far, _( "A monster appears nearby!" ) ); add_msg_if_player( m_warning, _( "A portal opens nearby, and a monster crawls through!" ) ); @@ -627,9 +644,9 @@ void player::hardcoded_effects( effect &it ) } } else if( id == effect_tindrift ) { add_msg_if_player( m_bad, _( "You are beset with a vision of a prowling beast." ) ); - for( const tripoint &dest : g->m.points_in_radius( pos(), 6 ) ) { - if( g->m.is_cornerfloor( dest ) ) { - g->m.add_field( dest, fd_tindalos_rift, 3 ); + for( const tripoint &dest : here.points_in_radius( pos(), 6 ) ) { + if( here.is_cornerfloor( dest ) ) { + here.add_field( dest, fd_tindalos_rift, 3 ); add_msg_if_player( m_info, _( "Your surroundings are permeated with a foul scent." ) ); //Remove the effect, since it's done all it needs to do to the target. remove_effect( effect_tindrift ); @@ -691,13 +708,13 @@ void player::hardcoded_effects( effect &it ) } } while( g->critter_at( dest ) ); if( tries < 10 ) { - if( g->m.impassable( dest ) ) { - g->m.make_rubble( dest, f_rubble_rock, true ); + if( here.impassable( dest ) ) { + here.make_rubble( dest, f_rubble_rock, true ); } MonsterGroupResult spawn_details = MonsterGroupManager::GetResultFromGroup( GROUP_NETHER ); g->place_critter_at( spawn_details.name, dest ); - if( g->u.sees( dest ) ) { + if( player_character.sees( dest ) ) { g->cancel_activity_or_ignore_query( distraction_type::hostile_spotted_far, _( "A monster appears nearby!" ) ); add_msg( m_warning, _( "A portal opens nearby, and a monster crawls through!" ) ); @@ -883,12 +900,236 @@ void player::hardcoded_effects( effect &it ) _( "You dissolve into beautiful paroxysms of energy. Life fades from your nebulae and you are no more." ) ); } g->events().send( getID(), id ); - hp_cur[hp_torso] = 0; + set_part_hp_cur( bodypart_id( "torso" ), 0 ); + } + } else if( id == effect_hypovolemia ) { + // hypovolemia and dehydration are closely related so it will pull water + // from your system to replenish blood quantity + if( calendar::once_every( -vitamin_rate( vitamin_blood ) ) && one_in( 5 ) && get_thirst() <= 240 ) { + mod_thirst( rng( 0, intense ) ); + } + // bleed out lambda + auto bleed_out = [&] { + if( has_effect( effect_bleed ) ) + { + add_msg_player_or_npc( m_bad, + _( "You bleed to death!" ), + _( " bleeds to death!" ) ); + g->events().send( getID() ); + } else + { + add_msg_player_or_npc( m_bad, + _( "Your heart can't keep up the pace and fails!" ), + _( " has a sudden heart attack!" ) ); + g->events().send( getID() ); + } + set_part_hp_cur( bodypart_id( "torso" ), 0 ); + }; + // this goes first because beyond minimum threshold you just die without delay, + // while stage 4 is on a timer check with an rng grace period + + if( vitamin_get( vitamin_blood ) == vitamin_blood->min() ) { + bleed_out(); + } + + // Hypovolemic shock + // stage 1 - early symptoms include headache, fatigue, weakness, thirst, and dizziness. + // stage 2 - person may begin sweating and feeling more anxious and restless. + // stage 3 - heart rate will increase to over 120 bpm; rapid breathing + // mental distress, including anxiety and agitation; skin is pale and cold + cyanosis, sweating + // stage 4 is a life threatening condition; extremely rapid heart rate, breathing very fast and difficult + // drifting in and out of consciousness, sweating heavily, feeling cool to the touch, looking extremely pale + + if( one_in( 1200 / intense ) && !in_sleep_state() ) { + std::string warning; + + if( one_in( 5 ) ) { + // no-effect message block + if( intense == 1 ) { + warning = _( "Your skin looks pale and you feel anxious and thirsty. Blood loss?" ); + } else if( intense == 2 ) { + warning = _( "Your pale skin is sweating, your heart beats fast and you feel restless. Maybe you lost too much blood?" ); + } else if( intense == 3 ) { + warning = _( "You're unsettlingly white, but your fingetips are bluish. You are agitated and your heart is racing. Your blood loss must be serious." ); + } else { //intense == 4 + warning = _( "You are pale as a ghost, dripping wet from the sweat, and sluggish despite your heart racing like a train. You are on a brink of colapse from effects of a bood loss." ); + } + add_msg_if_player( m_bad, warning ); + } else { + // effect dice, with progresion of effects, 3 possible effects per tier + int dice_roll = rng( 0, 2 ) + intense; + switch( dice_roll ) { + case 1: + warning = _( "You feel dizzy and lightheaded." ); + add_effect( effect_stunned, rng( 5_seconds * intense, 2_minutes * intense ) ); + break; + case 2: + warning = _( "You feel tired and you breathe heavily." ); + mod_fatigue( 3 * intense ); + break; + case 3: + warning = _( "You are anxcious and cannot collect your thoughts." ); + focus_pool -= rng( 1, focus_pool * intense / it.get_max_intensity() ); + break; + case 4: + warning = _( "You are sweating profusely, but you feel cold." ); + temp_conv[bp_hand_l] -= 1000 * intense; + temp_conv[bp_hand_r] -= 1000 * intense; + temp_conv[bp_foot_l] -= 1000 * intense; + temp_conv[bp_foot_r] -= 1000 * intense; + break; + case 5: + warning = _( "You huff and puff. Your breath is rapid and shallow." ); + mod_stamina( -500 * intense ); + break; + case 6: + if( one_in( 2 ) ) { + warning = _( "You drop to the ground, fighting to keep yourself conscious." ); + add_effect( effect_downed, rng( 1_minutes, 2_minutes ) ); + break; + } else { + warning = _( "Your mind slips away." ); + fall_asleep( rng( 2_minutes, 5_minutes ) ); + break; + } + } + add_msg_if_player( m_bad, warning ); + } + } + // this goes last because we don't want in_sleep_state to prevent you from dying + if( intense == 4 && one_in( 900 ) && + rng( 1, -vitamin_blood->min() * 3 / 5 ) > ( -vitamin_blood->min() + vitamin_get( + vitamin_blood ) ) ) { + bleed_out(); + } + } else if( id == effect_anemia ) { + // effects: reduces effective redcells regen and depletes redcells at high intensity + if( calendar::once_every( vitamin_rate( vitamin_redcells ) ) ) { + vitamin_mod( vitamin_redcells, -rng( 0, intense ) ); + } + } else if( id == effect_redcells_anemia ) { + // Lack of iron impairs production of hemoglobin and therefore ability to carry + // oxygen by red blood cells. Alternatively hemorrage causes physical loss of red blood cells. + // This triggers veriety of symptoms, focusing on weakness, + // fatigue, cold limbs, later in dizzyness, soreness, breathlessness, + // and severe maiaise and lethargy. + // Base anemia symptoms: fatigue, loss of stamina, loss of strength, impact on health + // are placed in effect JSON + + // you can only lose as much red blood cells before your body fails to function + if( vitamin_get( vitamin_redcells ) <= vitamin_redcells->min() + 5 ) { + add_msg_player_or_npc( m_bad, + _( "You cannot breathe and your body gives out!" ), + _( " gasps for air and dies!" ) ); + g->events().send( getID() ); + set_part_hp_cur( bodypart_id( "torso" ), 0 ); + } + if( one_in( 900 / intense ) && !in_sleep_state() ) { + // level 1 symptoms are cold limbs, pale skin, and weakness + switch( dice( 1, 9 ) ) { + case 1: + add_msg_if_player( m_bad, _( "Your hands feel unusually cold." ) ); + temp_conv[bp_hand_l] -= 2000; + temp_conv[bp_hand_r] -= 2000; + break; + case 2: + add_msg_if_player( m_bad, _( "Your feet feel unusualy cold." ) ); + temp_conv[bp_foot_l] -= 2000; + temp_conv[bp_foot_r] -= 2000; + break; + case 3: + add_msg_if_player( m_bad, _( "Your skin looks very pale." ) ); + break; + case 4: + add_msg_if_player( m_bad, _( "You feel weak. Where has your strength gone?" ) ); + break; + case 5: + add_msg_if_player( m_bad, _( "You feel feeble. A gust of wind could make you stumble." ) ); + break; + case 6: + add_msg_if_player( m_bad, _( "There is an overwhelming aura of tiredness inside of you." ) ); + mod_fatigue( intense * 3 ); + break; + case 7: // 7-9 empty for variability, as messages stack on higher intensity + break; + case 8: + break; + case 9: + break; + } + // level 2 anemia introduces dizzynes, shakes, headaches, cravings for non-comestibles, + // mouth and tongue soreness + if( intense > 1 ) { + switch( dice( 1, 9 ) ) { + case 1: + add_msg_if_player( m_bad, _( "Rest is what you want. Rest is what you need." ) ); + break; + case 2: + add_msg_if_player( m_bad, _( "You feel dizzy and can't coordinate movement of your feet." ) ); + add_effect( effect_stunned, rng( 1_minutes, 2_minutes ) ); + break; + case 3: + add_msg_if_player( m_bad, _( "Your muscles are quivering." ) ); + add_effect( effect_shakes, rng( 4_minutes, 8_minutes ) ); + break; + case 4: + add_msg_if_player( m_bad, _( "You crave for ice. Dirt under your feet looks tasty too." ) ); + break; + case 5: + add_msg_if_player( m_bad, _( "Your whole mouth is sore, and your tongue is swollen." ) ); + break; + case 6: + add_msg_if_player( m_bad, _( "You feel lightheaded. And a migrane follows." ) ); + mod_pain( intense * 9 ); + break; + case 7: // 7-9 empty for variability, as messages stack on higher intensity + break; + case 8: + break; + case 9: + break; + } + } + // level 3 anemia introduces restless legs, severe tiredness, breathlessness + if( intense > 2 ) { + switch( dice( 1, 9 ) ) { + case 1: + add_msg_if_player( m_bad, _( "Your legs are restless. Urge to move them is so strong." ) ); + break; + case 2: + add_msg_if_player( m_bad, _( "You feel like you'd sleep on a rock." ) ); + mod_fatigue( intense * 3 ); + break; + case 3: + add_msg_if_player( m_bad, _( "You gasp for air!" ) ); + set_stamina( 0 ); + add_effect( effect_winded, rng( 30_seconds, 3_minutes ) ); + break; + case 4: + add_msg_if_player( m_bad, _( "Can't breathe. Must rest." ) ); + set_stamina( 0 ); + break; + case 5: + add_msg_if_player( m_bad, _( "You can't take it any more. Rest first, everything else later." ) ); + add_effect( effect_lying_down, rng( 2_minutes, 5_minutes ) ); + break; + case 6: + add_msg_if_player( m_bad, _( "You must sit down for a moment. Just a moment." ) ); + add_effect( effect_downed, rng( 1_minutes, 2_minutes ) ); + break; + case 7: // 7-9 empty for variability, as messages stack on higher intensity + break; + case 8: + break; + case 9: + break; + } + } } } else if( id == effect_grabbed ) { set_num_blocks_bonus( get_num_blocks_bonus() - 1 ); int zed_number = 0; - for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { + for( auto &dest : here.points_in_radius( pos(), 1, 0 ) ) { const monster *const mon = g->critter_at( dest ); if( mon && mon->has_effect( effect_grabbing ) ) { zed_number += mon->get_grab_strength(); @@ -1068,18 +1309,13 @@ void player::hardcoded_effects( effect &it ) } // TODO: Move this to update_needs when NPCs can mutate - bool compatible_weather_types = g->weather.weather == WEATHER_CLEAR || - g->weather.weather == WEATHER_SUNNY - || g->weather.weather == WEATHER_DRIZZLE || g->weather.weather == WEATHER_RAINY || - g->weather.weather == WEATHER_FLURRIES - || g->weather.weather == WEATHER_CLOUDY || g->weather.weather == WEATHER_SNOW; - if( calendar::once_every( 10_minutes ) && ( has_trait( trait_CHLOROMORPH ) || has_trait( trait_M_SKIN3 ) || has_trait( trait_WATERSLEEP ) ) && - g->m.is_outside( pos() ) ) { + here.is_outside( pos() ) ) { if( has_trait( trait_CHLOROMORPH ) ) { // Hunger and thirst fall before your Chloromorphic physiology! - if( g->natural_light_level( posz() ) >= 12 && compatible_weather_types ) { + if( g->natural_light_level( posz() ) >= 12 && + get_weather().weather_id->sun_intensity >= sun_intensity_type::light ) { if( get_hunger() >= -30 ) { mod_hunger( -5 ); // photosynthesis warrants absorbing kcal directly @@ -1092,7 +1328,7 @@ void player::hardcoded_effects( effect &it ) } if( has_trait( trait_M_SKIN3 ) ) { // Spores happen! - if( g->m.has_flag_ter_or_furn( "FUNGUS", pos() ) ) { + if( here.has_flag_ter_or_furn( "FUNGUS", pos() ) ) { if( get_fatigue() >= 0 ) { mod_fatigue( -5 ); // Local guides need less sleep on fungal soil } @@ -1150,7 +1386,7 @@ void player::hardcoded_effects( effect &it ) trait_SEESLEEP ) ) { // People who can see while sleeping are acclimated to the light. if( has_trait( trait_HEAVYSLEEPER2 ) && !has_trait( trait_HIBERNATE ) ) { // So you can too sleep through noon - if( ( tirednessVal * 1.25 ) < g->m.ambient_light_at( pos() ) && ( get_fatigue() < 10 || + if( ( tirednessVal * 1.25 ) < here.ambient_light_at( pos() ) && ( get_fatigue() < 10 || one_in( get_fatigue() / 2 ) ) ) { add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal @@ -1159,14 +1395,14 @@ void player::hardcoded_effects( effect &it ) } // Ursine hibernators would likely do so indoors. Plants, though, might be in the sun. } else if( has_trait( trait_HIBERNATE ) ) { - if( ( tirednessVal * 5 ) < g->m.ambient_light_at( pos() ) && ( get_fatigue() < 10 || + if( ( tirednessVal * 5 ) < here.ambient_light_at( pos() ) && ( get_fatigue() < 10 || one_in( get_fatigue() / 2 ) ) ) { add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal it.set_duration( 0_turns ); woke_up = true; } - } else if( tirednessVal < g->m.ambient_light_at( pos() ) && ( get_fatigue() < 10 || + } else if( tirednessVal < here.ambient_light_at( pos() ) && ( get_fatigue() < 10 || one_in( get_fatigue() / 2 ) ) ) { add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal @@ -1222,12 +1458,12 @@ void player::hardcoded_effects( effect &it ) } else { int max_count = rng( 1, 3 ); int count = 0; - for( const tripoint &mp : g->m.points_in_radius( pos(), 1 ) ) { + for( const tripoint &mp : here.points_in_radius( pos(), 1 ) ) { if( mp == pos() ) { continue; } - if( g->m.has_flag( "FLAT", mp ) && - g->m.pl_sees( mp, 2 ) ) { + if( here.has_flag( "FLAT", mp ) && + here.pl_sees( mp, 2 ) ) { g->spawn_hallucination( mp ); if( ++count > max_count ) { break; @@ -1295,9 +1531,9 @@ void player::hardcoded_effects( effect &it ) } } else { if( dur == 1_turns ) { - if( g->u.has_alarm_clock() ) { - sounds::sound( g->u.pos(), 16, sounds::sound_t::alarm, _( "beep-beep-beep!" ), false, "tool", - "alarm_clock" ); + if( player_character.has_alarm_clock() ) { + sounds::sound( player_character.pos(), 16, sounds::sound_t::alarm, + _( "beep-beep-beep!" ), false, "tool", "alarm_clock" ); const std::string alarm = _( "Your alarm is going off." ); g->cancel_activity_or_ignore_query( distraction_type::noise, alarm ); add_msg( _( "Your alarm went off." ) ); @@ -1305,11 +1541,11 @@ void player::hardcoded_effects( effect &it ) } } } else if( id == effect_mending ) { - if( !is_limb_broken( bp_to_hp( bp->token ) ) ) { + if( !is_limb_broken( bp ) ) { it.set_duration( 0_turns ); } } else if( id == effect_disabled ) { - if( !is_limb_broken( bp_to_hp( bp->token ) ) ) { + if( !is_limb_broken( bp ) ) { // Just unpause, in case someone added it as a temporary effect (numbing poison etc.) it.unpause_effect(); } diff --git a/src/pldata.h b/src/pldata.h index e6012f5b35fcc..ffd2ec0294ca2 100644 --- a/src/pldata.h +++ b/src/pldata.h @@ -41,21 +41,6 @@ struct enum_traits { static constexpr add_type last = add_type::NUM_ADD_TYPES; }; -enum hp_part : int { - hp_head = 0, - hp_torso, - hp_arm_l, - hp_arm_r, - hp_leg_l, - hp_leg_r, - num_hp_parts -}; - -template<> -struct enum_traits { - static constexpr hp_part last = num_hp_parts; -}; - class addiction { public: diff --git a/src/point.cpp b/src/point.cpp index 56600f031a731..e2f9d33c5cb73 100644 --- a/src/point.cpp +++ b/src/point.cpp @@ -80,12 +80,12 @@ point clamp( const point &p, const inclusive_rectangle &r ) return point( clamp( p.x, r.p_min.x, r.p_max.x ), clamp( p.y, r.p_min.y, r.p_max.y ) ); } -std::vector closest_tripoints_first( const tripoint ¢er, int max_dist ) +std::vector closest_points_first( const tripoint ¢er, int max_dist ) { - return closest_tripoints_first( center, 0, max_dist ); + return closest_points_first( center, 0, max_dist ); } -std::vector closest_tripoints_first( const tripoint ¢er, int min_dist, int max_dist ) +std::vector closest_points_first( const tripoint ¢er, int min_dist, int max_dist ) { const std::vector points = closest_points_first( center.xy(), min_dist, max_dist ); diff --git a/src/point.h b/src/point.h index 4649d6b1fdfee..32248ad071ed1 100644 --- a/src/point.h +++ b/src/point.h @@ -33,6 +33,8 @@ class JsonOut; // NOLINTNEXTLINE(cata-xy) struct point { + static constexpr int dimension = 2; + int x = 0; int y = 0; constexpr point() = default; @@ -104,6 +106,9 @@ struct point { std::string to_string() const; + void serialize( JsonOut &jsout ) const; + void deserialize( JsonIn &jsin ); + friend inline constexpr bool operator<( const point &a, const point &b ) { return a.x < b.x || ( a.x == b.x && a.y < b.y ); } @@ -120,11 +125,29 @@ struct point { #endif }; -void serialize( const point &p, JsonOut &jsout ); -void deserialize( point &p, JsonIn &jsin ); +inline int divide_round_to_minus_infinity( int n, int d ) +{ + if( n >= 0 ) { + return n / d; + } + return ( n - d + 1 ) / d; +} + +inline point multiply_xy( const point &p, int f ) +{ + return point( p.x * f, p.y * f ); +} + +inline point divide_xy_round_to_minus_infinity( const point &p, int d ) +{ + return point( divide_round_to_minus_infinity( p.x, d ), + divide_round_to_minus_infinity( p.y, d ) ); +} // NOLINTNEXTLINE(cata-xy) struct tripoint { + static constexpr int dimension = 3; + int x = 0; int y = 0; int z = 0; @@ -228,6 +251,18 @@ struct tripoint { } }; +inline tripoint multiply_xy( const tripoint &p, int f ) +{ + return tripoint( p.x * f, p.y * f, p.z ); +} + +inline tripoint divide_xy_round_to_minus_infinity( const tripoint &p, int d ) +{ + return tripoint( divide_round_to_minus_infinity( p.x, d ), + divide_round_to_minus_infinity( p.y, d ), + p.z ); +} + struct rectangle { point p_min; point p_max; @@ -337,8 +372,8 @@ struct sphere { * Following functions return points in a spiral pattern starting at center_x/center_y until it hits the radius. Clockwise fashion. * Credit to Tom J Nowell; http://stackoverflow.com/a/1555236/1269969 */ -std::vector closest_tripoints_first( const tripoint ¢er, int max_dist ); -std::vector closest_tripoints_first( const tripoint ¢er, int min_dist, int max_dist ); +std::vector closest_points_first( const tripoint ¢er, int max_dist ); +std::vector closest_points_first( const tripoint ¢er, int min_dist, int max_dist ); std::vector closest_points_first( const point ¢er, int max_dist ); std::vector closest_points_first( const point ¢er, int min_dist, int max_dist ); diff --git a/src/point_traits.h b/src/point_traits.h new file mode 100644 index 0000000000000..215e15fd120c7 --- /dev/null +++ b/src/point_traits.h @@ -0,0 +1,56 @@ +#ifndef CATA_SRC_POINT_TRAITS_H +#define CATA_SRC_POINT_TRAITS_H + +#include + +struct point; +struct tripoint; + +template +struct point_traits { + static int &x( Point &p ) { + return p.x(); + } + static int x( const Point &p ) { + return p.x(); + } + static int &y( Point &p ) { + return p.y(); + } + static int y( const Point &p ) { + return p.y(); + } + static int &z( Point &p ) { + return p.z(); + } + static int z( const Point &p ) { + return p.z(); + } +}; + +template +struct point_traits < + Point, + std::enable_if_t < std::is_same::value || std::is_same::value > + > { + static int &x( Point &p ) { + return p.x; + } + static const int &x( const Point &p ) { + return p.x; + } + static int &y( Point &p ) { + return p.y; + } + static const int &y( const Point &p ) { + return p.y; + } + static int &z( Point &p ) { + return p.z; + } + static const int &z( const Point &p ) { + return p.z; + } +}; + +#endif // CATA_SRC_POINT_TRAITS_H diff --git a/src/profession.cpp b/src/profession.cpp index aa04dd14be116..554764565b470 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -221,6 +221,7 @@ void profession::load( const JsonObject &jo, const std::string & ) optional( jo, was_loaded, "addictions", _starting_addictions, addiction_reader {} ); // TODO: use string_id or so optional( jo, was_loaded, "CBMs", _starting_CBMs, auto_flags_reader {} ); + optional( jo, was_loaded, "proficiencies", _starting_proficiencies ); // TODO: use string_id or so optional( jo, was_loaded, "traits", _starting_traits, auto_flags_reader {} ); optional( jo, was_loaded, "forbidden_traits", _forbidden_traits, auto_flags_reader {} ); @@ -299,6 +300,12 @@ void profession::check_definition() const } } + for( const proficiency_id &pid : _starting_proficiencies ) { + if( !pid.is_valid() ) { + debugmsg( "proficiency %s for profession %s does not exist", pid.str(), id.str() ); + } + } + for( auto &t : _starting_traits ) { if( !t.is_valid() ) { debugmsg( "trait %s for profession %s does not exist", t.c_str(), id.c_str() ); @@ -462,6 +469,11 @@ std::vector profession::CBMs() const return _starting_CBMs; } +std::vector profession::proficiencies() const +{ + return _starting_proficiencies; +} + std::vector profession::get_locked_traits() const { return _starting_traits; diff --git a/src/profession.h b/src/profession.h index 94e9c7cf01a23..76c7237bf930b 100644 --- a/src/profession.h +++ b/src/profession.h @@ -64,6 +64,7 @@ class profession std::vector _starting_addictions; std::vector _starting_CBMs; + std::vector _starting_proficiencies; std::vector _starting_traits; std::set _forbidden_traits; std::vector _starting_pets; @@ -105,6 +106,7 @@ class profession vproto_id vehicle() const; std::vector pets() const; std::vector CBMs() const; + std::vector proficiencies() const; StartingSkillList skills() const; std::map spells() const; diff --git a/src/proficiency.cpp b/src/proficiency.cpp new file mode 100644 index 0000000000000..280f43af96e7e --- /dev/null +++ b/src/proficiency.cpp @@ -0,0 +1,40 @@ +#include "proficiency.h" + +#include "generic_factory.h" + +namespace +{ +generic_factory proficiency_factory( "proficiency" ); +} // namespace + +template<> +const proficiency &proficiency_id::obj() const +{ + return proficiency_factory.obj( *this ); +} + +template<> +bool proficiency_id::is_valid() const +{ + return proficiency_factory.is_valid( *this ); +} + +void proficiency::load_proficiencies( const JsonObject &jo, const std::string &src ) +{ + proficiency_factory.load( jo, src ); +} + +void proficiency::reset() +{ + proficiency_factory.reset(); +} + +void proficiency::load( const JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", _name ); +} + +std::string proficiency::name() const +{ + return _name.translated(); +} diff --git a/src/proficiency.h b/src/proficiency.h new file mode 100644 index 0000000000000..103b26825dfac --- /dev/null +++ b/src/proficiency.h @@ -0,0 +1,29 @@ +#pragma once +#ifndef CATA_SRC_PROFICIENCY_H +#define CATA_SRC_PROFICIENCY_H + +#include "json.h" +#include "translations.h" +#include "type_id.h" + +template +class generic_factory; + +class proficiency +{ + friend class generic_factory; + + proficiency_id id; + bool was_loaded = false; + + translation _name; + + public: + static void load_proficiencies( const JsonObject &jo, const std::string &src ); + static void reset(); + void load( const JsonObject &jo, const std::string &src ); + + std::string name() const; +}; + +#endif // CATA_SRC_PROFICIENCY_H diff --git a/src/projectile.cpp b/src/projectile.cpp index 80aa0174c62f8..339a7cd845004 100644 --- a/src/projectile.cpp +++ b/src/projectile.cpp @@ -7,7 +7,6 @@ #include "ammo_effect.h" #include "explosion.h" -#include "game.h" #include "item.h" #include "map.h" #include "map_iterator.h" @@ -95,14 +94,15 @@ void projectile::unset_custom_explosion() void apply_ammo_effects( const tripoint &p, const std::set &effects ) { + map &here = get_map(); for( const ammo_effect &ae : ammo_effects::get_all() ) { if( effects.count( ae.id.str() ) > 0 ) { - for( auto &pt : g->m.points_in_radius( p, ae.aoe_radius, ae.aoe_radius_z ) ) { + for( auto &pt : here.points_in_radius( p, ae.aoe_radius, ae.aoe_radius_z ) ) { if( x_in_y( ae.aoe_chance, 100 ) ) { - const bool check_sees = !ae.aoe_check_sees || g->m.sees( p, pt, ae.aoe_check_sees_radius ); - const bool check_passable = !ae.aoe_check_passable || g->m.passable( pt ); + const bool check_sees = !ae.aoe_check_sees || here.sees( p, pt, ae.aoe_check_sees_radius ); + const bool check_passable = !ae.aoe_check_passable || here.passable( pt ); if( check_sees && check_passable ) { - g->m.add_field( pt, ae.aoe_field_type, rng( ae.aoe_intensity_min, ae.aoe_intensity_max ) ); + here.add_field( pt, ae.aoe_field_type, rng( ae.aoe_intensity_min, ae.aoe_intensity_max ) ); } } } diff --git a/src/ranged.cpp b/src/ranged.cpp index 88cd6da579413..9f28a8e586fbe 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -680,7 +680,8 @@ bool player::handle_gun_damage( item &it ) void npc::pretend_fire( npc *source, int shots, item &gun ) { int curshot = 0; - if( g->u.sees( *source ) && one_in( 50 ) ) { + Character &player_character = get_player_character(); + if( player_character.sees( *source ) && one_in( 50 ) ) { add_msg( m_info, _( "%s shoots something." ), source->disp_name() ); } while( curshot != shots ) { @@ -692,7 +693,7 @@ void npc::pretend_fire( npc *source, int shots, item &gun ) item *weapon = &gun; const auto data = weapon->gun_noise( shots > 1 ); - if( g->u.sees( *source ) ) { + if( player_character.sees( *source ) ) { add_msg( m_warning, _( "You hear %s." ), data.sound ); } curshot++; @@ -730,10 +731,11 @@ int player::fire_gun( const tripoint &target, int shots, item &gun ) debugmsg( "Attempted to fire zero or negative shots using %s", gun.tname() ); } + map &here = get_map(); // usage of any attached bipod is dependent upon terrain - bool bipod = g->m.has_flag_ter_or_furn( "MOUNTABLE", pos() ); + bool bipod = here.has_flag_ter_or_furn( "MOUNTABLE", pos() ); if( !bipod ) { - if( const optional_vpart_position vp = g->m.veh_at( pos() ) ) { + if( const optional_vpart_position vp = here.veh_at( pos() ) ) { bipod = vp->vehicle().has_part( pos(), "MOUNTABLE" ); } } @@ -765,7 +767,7 @@ int player::fire_gun( const tripoint &target, int shots, item &gun ) dispersion.add_range( recoil_total() ); // If this is a vehicle mounted turret, which vehicle is it mounted on? - const vehicle *in_veh = has_effect( effect_on_roof ) ? veh_pointer_or_null( g->m.veh_at( + const vehicle *in_veh = has_effect( effect_on_roof ) ? veh_pointer_or_null( here.veh_at( pos() ) ) : nullptr; auto shot = projectile_attack( make_gun_projectile( gun ), pos(), aim, dispersion, this, in_veh ); @@ -861,8 +863,8 @@ int throw_cost( const player &c, const item &to_throw ) const int skill_cost = static_cast( ( base_move_cost * ( 20 - throw_skill ) / 20 ) ); ///\EFFECT_DEX increases throwing speed const int dexbonus = c.get_dex(); - const int encumbrance_penalty = c.encumb( bp_torso ) + - ( c.encumb( bp_hand_l ) + c.encumb( bp_hand_r ) ) / 2; + const int encumbrance_penalty = c.encumb( bodypart_id( "torso" ) ) + + ( c.encumb( bodypart_id( "hand_l" ) ) + c.encumb( bodypart_id( "hand_r" ) ) ) / 2; const float stamina_ratio = static_cast( c.get_stamina() ) / c.get_stamina_max(); const float stamina_penalty = 1.0 + std::max( ( 0.25f - stamina_ratio ) * 4.0f, 0.0f ); @@ -883,7 +885,8 @@ int Character::throw_dispersion_per_dodge( bool add_encumbrance ) const // +100 at 8, +80 at 12, +66.6 at 16, +57 at 20, +50 at 24 // Each 10 encumbrance on either hand is like -1 dex (can bring penalty to +400 per dodge) // Maybe TODO: Only use one hand - const int encumbrance = add_encumbrance ? encumb( bp_hand_l ) + encumb( bp_hand_r ) : 0; + const int encumbrance = add_encumbrance ? encumb( bodypart_id( "hand_l" ) ) + encumb( + bodypart_id( "hand_r" ) ) : 0; ///\EFFECT_DEX increases throwing accuracy against targets with good dodge stat float effective_dex = 2 + get_dex() / 4.0f - ( encumbrance ) / 40.0f; return static_cast( 100.0f / std::max( 1.0f, effective_dex ) ); @@ -925,7 +928,7 @@ int Character::throwing_dispersion( const item &to_throw, Creature *critter, } // 1 perception per 1 eye encumbrance ///\EFFECT_PER decreases throwing accuracy penalty from eye encumbrance - dispersion += std::max( 0, ( encumb( bp_eyes ) - get_per() ) * 10 ); + dispersion += std::max( 0, ( encumb( bodypart_id( "eyes" ) ) - get_per() ) * 10 ); // If throwing blind, we're assuming they mechanically can't achieve the // accuracy of a normal throw. @@ -1537,16 +1540,17 @@ int time_to_attack( const Character &p, const itype &firing ) static void cycle_action( item &weap, const tripoint &pos ) { + map &here = get_map(); // eject casings and linkages in random direction avoiding walls using player position as fallback - std::vector tiles = closest_tripoints_first( pos, 1 ); + std::vector tiles = closest_points_first( pos, 1 ); tiles.erase( tiles.begin() ); tiles.erase( std::remove_if( tiles.begin(), tiles.end(), [&]( const tripoint & e ) { - return !g->m.passable( e ); + return !here.passable( e ); } ), tiles.end() ); tripoint eject = tiles.empty() ? pos : random_entry( tiles ); // for turrets try and drop casings or linkages directly to any CARGO part on the same tile - const optional_vpart_position vp = g->m.veh_at( pos ); + const optional_vpart_position vp = here.veh_at( pos ); std::vector cargo; if( vp && weap.has_flag( "VEHICLE" ) ) { cargo = vp->vehicle().get_parts_at( pos, "CARGO", part_status_flag::any ); @@ -1558,7 +1562,7 @@ static void cycle_action( item &weap, const tripoint &pos ) weap.put_in( item( casing ).set_flag( "CASING" ), item_pocket::pocket_type::CONTAINER ); } else { if( cargo.empty() ) { - g->m.add_item_or_charges( eject, item( casing ) ); + here.add_item_or_charges( eject, item( casing ) ); } else { vp->vehicle().add_item( *cargo.front(), item( casing ) ); } @@ -1576,7 +1580,7 @@ static void cycle_action( item &weap, const tripoint &pos ) linkage.set_flag( "CASING" ); weap.put_in( linkage, item_pocket::pocket_type::CONTAINER ); } else if( cargo.empty() ) { - g->m.add_item_or_charges( eject, linkage ); + here.add_item_or_charges( eject, linkage ); } else { vp->vehicle().add_item( *cargo.front(), linkage ); } @@ -1670,7 +1674,7 @@ item::sound_data item::gun_noise( const bool burst ) const static bool is_driving( const player &p ) { - const optional_vpart_position vp = g->m.veh_at( p.pos() ); + const optional_vpart_position vp = get_map().veh_at( p.pos() ); return vp && vp->vehicle().is_moving() && vp->vehicle().player_in_control( p ); } @@ -1703,7 +1707,8 @@ dispersion_sources player::get_weapon_dispersion( const item &obj ) const dispersion_sources dispersion( weapon_dispersion ); dispersion.add_range( ranged_dex_mod() ); - dispersion.add_range( ( encumb( bp_arm_l ) + encumb( bp_arm_r ) ) / 5.0 ); + dispersion.add_range( ( encumb( bodypart_id( "arm_l" ) ) + encumb( bodypart_id( "arm_r" ) ) ) / + 5.0 ); if( is_driving( *this ) ) { // get volume of gun (or for auxiliary gunmods the parent gun) @@ -1794,7 +1799,8 @@ double player::gun_value( const item &weap, int ammo ) const int move_cost = time_to_attack( *this, *weap.type ); if( gun.clip != 0 && gun.clip < 10 ) { // TODO: RELOAD_ONE should get a penalty here - int reload_cost = gun.reload_time + encumb( bp_hand_l ) + encumb( bp_hand_r ); + int reload_cost = gun.reload_time + encumb( bodypart_id( "hand_l" ) ) + encumb( + bodypart_id( "hand_r" ) ); reload_cost /= gun.clip; move_cost += reload_cost; } @@ -1876,8 +1882,9 @@ target_handler::trajectory target_ui::run() sight_dispersion = you->effective_dispersion( relevant->sight_dispersion() ); } + map &here = get_map(); // Load settings - allow_zlevel_shift = g->m.has_zlevels() && get_option( "FOV_3D" ); + allow_zlevel_shift = here.has_zlevels() && get_option( "FOV_3D" ); snap_to_target = get_option( "SNAP_TO_TARGET" ); if( mode == TargetMode::Turrets ) { // Due to how cluttered the display would become, disable it by default @@ -1885,10 +1892,11 @@ target_handler::trajectory target_ui::run() draw_turret_lines = vturrets->size() == 1; } - on_out_of_scope cleanup( []() { - g->m.invalidate_map_cache( g->u.pos().z + g->u.view_offset.z ); + avatar &player_character = get_avatar(); + on_out_of_scope cleanup( [&here, &player_character]() { + here.invalidate_map_cache( player_character.pos().z + player_character.view_offset.z ); } ); - restore_on_out_of_scope view_offset_prev( g->u.view_offset ); + restore_on_out_of_scope view_offset_prev( player_character.view_offset ); shared_ptr_fast target_ui_cb = make_shared_fast( [&]() { @@ -2228,13 +2236,14 @@ bool target_ui::set_cursor_pos( const tripoint &new_pos ) // Make sure new position is valid or find a closest valid position std::vector new_traj; tripoint valid_pos = new_pos; + map &here = get_map(); if( new_pos != src ) { // On Z axis, make sure we do not exceed map boundaries valid_pos.z = clamp( valid_pos.z, -OVERMAP_DEPTH, OVERMAP_HEIGHT ); // Or current view range valid_pos.z = clamp( valid_pos.z - src.z, -fov_3d_z_range, fov_3d_z_range ) + src.z; - new_traj = g->m.find_clear_path( src, valid_pos ); + new_traj = here.find_clear_path( src, valid_pos ); if( range == 1 ) { // We should always be able to hit adjacent squares if( square_dist( src, valid_pos ) > 1 ) { @@ -2280,7 +2289,7 @@ bool target_ui::set_cursor_pos( const tripoint &new_pos ) traj = new_traj; } else { dst = valid_pos; - traj = g->m.find_clear_path( src, dst ); + traj = here.find_clear_path( src, dst ); } if( snap_to_target ) { @@ -2363,13 +2372,14 @@ void target_ui::update_target_list() bool target_ui::choose_initial_target( bool reentered, tripoint &new_dst ) { + map &here = get_map(); // Determine if we had a target and it is still visible if( !you->last_target.expired() ) { Creature *cr = you->last_target.lock().get(); if( pl_can_target( cr ) ) { // There it is! new_dst = cr->pos(); - you->last_target_pos = g->m.getabs( new_dst ); + you->last_target_pos = here.getabs( new_dst ); return true; } } @@ -2378,7 +2388,7 @@ bool target_ui::choose_initial_target( bool reentered, tripoint &new_dst ) // and still can aim at that tile. cata::optional local_last_tgt_pos = cata::nullopt; if( you->last_target_pos ) { - tripoint local = g->m.getlocal( *you->last_target_pos ); + tripoint local = here.getlocal( *you->last_target_pos ); if( dist_fn( local ) > range ) { // No luck you->last_target_pos = cata::nullopt; @@ -2400,10 +2410,10 @@ bool target_ui::choose_initial_target( bool reentered, tripoint &new_dst ) // Try to find at least something if( targets.empty() ) { // The closest practice target - const std::vector nearby = closest_tripoints_first( src, range ); + const std::vector nearby = closest_points_first( src, range ); const auto target_spot = std::find_if( nearby.begin(), nearby.end(), - [this]( const tripoint & pt ) { - return g->m.tr_at( pt ).id == tr_practice_target && this->you->sees( pt ); + [this, &here]( const tripoint & pt ) { + return here.tr_at( pt ).id == tr_practice_target && this->you->sees( pt ); } ); if( target_spot != nearby.end() ) { @@ -2455,7 +2465,7 @@ bool target_ui::pl_can_target( const Creature *cr ) void target_ui::set_last_target() { - you->last_target_pos = g->m.getabs( dst ); + you->last_target_pos = get_map().getabs( dst ); if( dst_critter ) { you->last_target = g->shared_from( *dst_critter ); } else { @@ -2520,7 +2530,7 @@ void target_ui::set_view_offset( const tripoint &new_offset ) if( changed_z ) { // We need to do a bunch of cache updates since we're // looking at a different z-level. - g->m.invalidate_map_cache( new_.z ); + get_map().invalidate_map_cache( new_.z ); } } @@ -2550,7 +2560,7 @@ void target_ui::recalc_aim_turning_penalty() if( lt_ptr ) { curr_recoil_pos = lt_ptr->pos(); } else if( you->last_target_pos ) { - curr_recoil_pos = g->m.getlocal( *you->last_target_pos ); + curr_recoil_pos = get_map().getlocal( *you->last_target_pos ); } else { curr_recoil_pos = src; } @@ -2731,7 +2741,7 @@ void target_ui::draw_terrain_overlay() g->draw_highlight( tile ); } else { #endif - g->m.drawsq( g->w_terrain, *you, tile, true, true, center ); + get_map().drawsq( g->w_terrain, *you, tile, true, true, center ); #ifdef TILES } #endif diff --git a/src/recipe.cpp b/src/recipe.cpp index 14a33433bcbff..dff3a2d14af99 100644 --- a/src/recipe.cpp +++ b/src/recipe.cpp @@ -20,6 +20,7 @@ #include "optional.h" #include "output.h" #include "player.h" +#include "proficiency.h" #include "skill.h" #include "string_formatter.h" #include "string_id.h" @@ -35,12 +36,31 @@ extern bool test_mode; recipe::recipe() : skill_used( skill_id::NULL_ID() ) {} -time_duration recipe::batch_duration( int batch, float multiplier, size_t assistants ) const +time_duration recipe::batch_duration( const Character &guy, int batch, float multiplier, + size_t assistants ) const { - return time_duration::from_turns( batch_time( batch, multiplier, assistants ) / 100 ); + return time_duration::from_turns( batch_time( guy, batch, multiplier, assistants ) / 100 ); } -int recipe::batch_time( int batch, float multiplier, size_t assistants ) const +time_duration recipe::time_to_craft( const Character &guy ) const +{ + return time_duration::from_seconds( time_to_craft_moves( guy ) / 100 ); +} + +int recipe::time_to_craft_moves( const Character &guy ) const +{ + int ret = time; + for( const recipe_proficiency &prof : proficiencies ) { + if( !prof.required ) { + if( !guy.has_proficiency( prof.id ) ) { + ret *= prof.time_multiplier; + } + } + } + return ret; +} + +int recipe::batch_time( const Character &guy, int batch, float multiplier, size_t assistants ) const { // 1.0f is full speed // 0.33f is 1/3 speed @@ -49,7 +69,7 @@ int recipe::batch_time( int batch, float multiplier, size_t assistants ) const multiplier = 1.0f; } - const float local_time = static_cast( time ) / multiplier; + const float local_time = static_cast( time_to_craft_moves( guy ) ) / multiplier; // if recipe does not benefit from batching and we have no assistants, don't do unnecessary additional calculations if( batch_rscale == 0.0 && assistants == 0 ) { @@ -150,6 +170,8 @@ void recipe::load( const JsonObject &jo, const std::string &src ) } } + jo.read( "proficiencies", proficiencies ); + // simplified autolearn sets requirements equal to required skills at finalization if( jo.has_bool( "autolearn" ) ) { assign( jo, "autolearn", autolearn ); @@ -334,6 +356,39 @@ void recipe::finalize() container = item::find_type( result_ )->default_container.value_or( "null" ); } + std::set required; + std::set used; + for( const recipe_proficiency &rpof : proficiencies ) { + if( !rpof.id.is_valid() ) { + debugmsg( "proficiency %s does not exist in recipe %s", rpof.id.str(), ident_.str() ); + } + + if( rpof.required && rpof.time_multiplier != 1.0f ) { + debugmsg( "proficiencies in recipes cannot be both required and provide a malus in %s", + rpof.id.str(), ident_.str() ); + } + if( required.count( rpof.id ) || used.count( rpof.id ) ) { + debugmsg( "proficiency %s listed twice recipe %s", rpof.id.str(), + ident_.str() ); + } + + if( rpof.time_multiplier < 1.0f ) { + debugmsg( "proficiency %s provides a bonus for not being known in recipe %s", rpof.id.str(), + ident_.str() ); + } + if( rpof.fail_multiplier < 1.0f ) { + debugmsg( "proficiency %s provides a bonus for not being known in recipe %s", rpof.id.str(), + ident_.str() ); + } + // Now that we've done the error checking, log that a proficiency with this id is used + if( rpof.required ) { + required.insert( rpof.id ); + } else { + used.insert( rpof.id ); + } + } + + if( autolearn && autolearn_requirements.empty() ) { autolearn_requirements = required_skills; if( skill_used ) { @@ -479,6 +534,67 @@ bool recipe::has_byproducts() const return !byproducts.empty(); } +std::string recipe::required_proficiencies_string( const Character &c ) const +{ + std::vector required_profs; + std::vector> used_profs; + + for( const recipe_proficiency &rec : proficiencies ) { + if( rec.required ) { + required_profs.push_back( rec.id ); + } else { + used_profs.push_back( { rec.id, rec.time_multiplier } ); + } + } + std::string required = enumerate_as_string( required_profs.begin(), + required_profs.end(), [&]( const proficiency_id & id ) { + const nc_color color = c.has_proficiency( id ) ? c_green : c_red; + return colorize( id->name(), color ); + } ); + + std::string used = enumerate_as_string( used_profs.begin(), + used_profs.end(), [&]( const std::pair &pair ) { + const std::string color = c.has_proficiency( pair.first ) ? "white" : "yellow"; + return string_format( "%s %gx", pair.first->name(), color, + pair.second ); + } ); + used = string_format( _( "Proficiencies Used: %s" ), used ); + + return string_format( "%s\n%s", required, used ); +} + +std::set recipe::required_proficiencies() const +{ + std::set ret; + for( const recipe_proficiency &rec : proficiencies ) { + if( rec.required ) { + ret.insert( rec.id ); + } + } + return ret; +} + +bool recipe::character_has_required_proficiencies( const Character &c ) const +{ + for( const proficiency_id &id : required_proficiencies() ) { + if( !c.has_proficiency( id ) ) { + return false; + } + } + return true; +} + +std::set recipe::assist_proficiencies() const +{ + std::set ret; + for( const recipe_proficiency &rec : proficiencies ) { + if( !rec.required ) { + ret.insert( rec.id ); + } + } + return ret; +} + // Format a std::pair for the crafting menu. // skill colored green (or yellow if beyond characters skill) // optionally with the skill level (player / difficulty) @@ -764,3 +880,16 @@ bool recipe::hot_result() const } return false; } + +void recipe_proficiency::deserialize( JsonIn &jsin ) +{ + load( jsin.get_object() ); +} + +void recipe_proficiency::load( const JsonObject &jo ) +{ + jo.read( "proficiency", id ); + jo.read( "required", required ); + jo.read( "time_multiplier", time_multiplier ); + jo.read( "fail_multiplier", fail_multiplier ); +} diff --git a/src/recipe.h b/src/recipe.h index 65e81e55cf408..752b98ee86617 100644 --- a/src/recipe.h +++ b/src/recipe.h @@ -31,6 +31,16 @@ inline constexpr recipe_filter_flags operator&( recipe_filter_flags l, recipe_fi static_cast( l ) & static_cast( r ) ); } +struct recipe_proficiency { + proficiency_id id; + bool required = false; + float time_multiplier = 1.0f; + float fail_multiplier = 2.5f; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); +}; + class recipe { friend class recipe_dictionary; @@ -38,6 +48,8 @@ class recipe private: itype_id result_ = itype_id::NULL_ID(); + int time = 0; // in movement points (100 per turn) + public: recipe(); @@ -56,7 +68,6 @@ class recipe translation description; - int time = 0; // in movement points (100 per turn) int difficulty = 0; /** Fetch combined requirement data (inline and via "using" syntax). @@ -106,6 +117,7 @@ class recipe skill_id skill_used; std::map required_skills; + std::vector proficiencies; std::map autolearn_requirements; // Skill levels required to autolearn std::map learn_by_disassembly; // Skill levels required to learn by disassembly @@ -124,6 +136,14 @@ class recipe // menu which includes the primary skill. std::string required_skills_string( const Character *, bool include_primary_skill, bool print_skill_level ) const; + // Format the proficiencies string. + std::string required_proficiencies_string( const Character &c ) const; + // Required proficiencies + std::set required_proficiencies() const; + // + bool character_has_required_proficiencies( const Character &c ) const; + // Helpful proficiencies + std::set assist_proficiencies() const; // This is used by the basecamp bulletin board. std::string required_all_skills_string() const; @@ -142,10 +162,13 @@ class recipe bool has_byproducts() const; - int batch_time( int batch, float multiplier, size_t assistants ) const; - time_duration batch_duration( int batch = 1, float multiplier = 1.0, + int batch_time( const Character &guy, int batch, float multiplier, size_t assistants ) const; + time_duration batch_duration( const Character &guy, int batch = 1, float multiplier = 1.0, size_t assistants = 0 ) const; + time_duration time_to_craft( const Character &guy ) const; + int time_to_craft_moves( const Character &guy ) const; + bool has_flag( const std::string &flag_name ) const; bool is_reversible() const { diff --git a/src/relic.cpp b/src/relic.cpp index 8ac680402e865..c71be68ade887 100644 --- a/src/relic.cpp +++ b/src/relic.cpp @@ -4,12 +4,56 @@ #include #include "creature.h" +#include "enum_traits.h" +#include "generic_factory.h" #include "json.h" #include "magic.h" #include "magic_enchantment.h" #include "translations.h" #include "type_id.h" +namespace io +{ + // *INDENT-OFF* + template<> + std::string enum_to_string( relic_procgen_data::type data ) + { + switch( data ) { + case relic_procgen_data::type::active_enchantment: return "active_enchantment"; + case relic_procgen_data::type::hit_me: return "hit_me"; + case relic_procgen_data::type::hit_you: return "hit_you"; + case relic_procgen_data::type::passive_enchantment_add: return "passive_enchantment_add"; + case relic_procgen_data::type::passive_enchantment_mult: return "passive_enchantment_mult"; + case relic_procgen_data::type::last: break; + } + debugmsg( "Invalid enchantment::has" ); + abort(); + } + // *INDENT-ON* +} // namespace io + +namespace +{ +generic_factory relic_procgen_data_factory( "relic_procgen_data" ); +} // namespace + +template<> +const relic_procgen_data &string_id::obj() const +{ + return relic_procgen_data_factory.obj( *this ); +} + +template<> +bool string_id::is_valid() const +{ + return relic_procgen_data_factory.is_valid( *this ); +} + +void relic_procgen_data::load_relic_procgen_data( const JsonObject &jo, const std::string &src ) +{ + relic_procgen_data_factory.load( jo, src ); +} + void relic::add_active_effect( const fake_spell &sp ) { active_effects.emplace_back( sp ); @@ -25,6 +69,84 @@ void relic::add_passive_effect( const enchantment &nench ) passive_effects.emplace_back( nench ); } +template +void relic_procgen_data::enchantment_value_passive::load( const JsonObject &jo ) +{ + mandatory( jo, was_loaded, "type", type ); + optional( jo, was_loaded, "power_per_increment", power_per_increment, 1 ); + optional( jo, was_loaded, "increment", increment, 1 ); + optional( jo, was_loaded, "min_value", min_value, 0 ); + optional( jo, was_loaded, "max_value", max_value, 0 ); +} + +template +void relic_procgen_data::enchantment_value_passive::deserialize( JsonIn &jsin ) +{ + JsonObject jobj = jsin.get_object(); + load( jobj ); +} + +void relic_procgen_data::enchantment_active::load( const JsonObject &jo ) +{ + mandatory( jo, was_loaded, "spell_id", activated_spell ); + optional( jo, was_loaded, "base_power", base_power, 0 ); + optional( jo, was_loaded, "power_per_increment", power_per_increment, 1 ); + optional( jo, was_loaded, "increment", increment, 1 ); + optional( jo, was_loaded, "min_level", min_level, 0 ); + optional( jo, was_loaded, "max_level", max_level, 0 ); +} + +void relic_procgen_data::enchantment_active::deserialize( JsonIn &jsin ) +{ + JsonObject jobj = jsin.get_object(); + load( jobj ); +} + +void relic_procgen_data::load( const JsonObject &jo, const std::string & ) +{ + for( const JsonObject &jo_inner : jo.get_array( "passive_add_procgen_values" ) ) { + int weight = 0; + mandatory( jo_inner, was_loaded, "weight", weight ); + relic_procgen_data::enchantment_value_passive val; + val.load( jo_inner ); + + passive_add_procgen_values.add( val, weight ); + } + + for( const JsonObject &jo_inner : jo.get_array( "passive_mult_procgen_values" ) ) { + int weight = 0; + mandatory( jo_inner, was_loaded, "weight", weight ); + relic_procgen_data::enchantment_value_passive val; + val.load( jo_inner ); + + passive_mult_procgen_values.add( val, weight ); + } + + for( const JsonObject &jo_inner : jo.get_array( "type_weights" ) ) { + int weight = 0; + mandatory( jo_inner, was_loaded, "weight", weight ); + relic_procgen_data::type val; + mandatory( jo_inner, was_loaded, "value", val ); + + type_weights.add( val, weight ); + } + + for( const JsonObject &jo_inner : jo.get_array( "items" ) ) { + int weight = 0; + mandatory( jo_inner, was_loaded, "weight", weight ); + itype_id it; + mandatory( jo_inner, was_loaded, "item", it ); + + item_weights.add( it, weight ); + } +} + +void relic_procgen_data::deserialize( JsonIn &jsin ) +{ + JsonObject jobj = jsin.get_object(); + load( jobj ); +} + void relic::load( const JsonObject &jo ) { if( jo.has_array( "active_effects" ) ) { @@ -121,3 +243,203 @@ std::vector relic::get_enchantments() const { return passive_effects; } + +int relic::power_level( const relic_procgen_id &ruleset ) const +{ + int total_power_level = 0; + for( const enchantment &ench : passive_effects ) { + total_power_level += ruleset->power_level( ench ); + } + for( const fake_spell &sp : active_effects ) { + total_power_level += ruleset->power_level( sp ); + } + return total_power_level; +} + +int relic_procgen_data::power_level( const enchantment &ench ) const +{ + int power = 0; + + for( const weighted_object> + &add_val_passive : passive_add_procgen_values ) { + int val = ench.get_value_add( add_val_passive.obj.type ); + if( val != 0 ) { + power += static_cast( add_val_passive.obj.power_per_increment ) / + static_cast( add_val_passive.obj.increment ) * val; + } + } + + for( const weighted_object> + &mult_val_passive : passive_mult_procgen_values ) { + float val = ench.get_value_multiply( mult_val_passive.obj.type ); + if( val != 0.0f ) { + power += mult_val_passive.obj.power_per_increment / mult_val_passive.obj.increment * val; + } + } + + return power; +} + +int relic_procgen_data::power_level( const fake_spell &sp ) const +{ + for( const weighted_object &vals : + active_procgen_values ) { + if( vals.obj.activated_spell == sp.id ) { + return vals.obj.calc_power( sp.level ); + } + } + return 0; +} + +item relic_procgen_data::create_item( const relic_procgen_data::generation_rules &rules ) const +{ + const itype_id *it_id = item_weights.pick(); + if( it_id == nullptr ) { + debugmsg( "ERROR: %s procgen data does not have items", id.c_str() ); + return null_item_reference(); + } + + item it( *it_id, calendar::turn ); + + it.overwrite_relic( generate( rules, *it_id ) ); + + return it; +} + +relic relic_procgen_data::generate( const relic_procgen_data::generation_rules &rules, + const itype_id &it_id ) const +{ + relic ret; + int num_attributes = 0; + int negative_attribute_power = 0; + const bool is_armor = item( it_id ).is_armor(); + + while( rules.max_attributes > num_attributes && rules.power_level > ret.power_level( id ) ) { + switch( *type_weights.pick() ) { + case relic_procgen_data::type::active_enchantment: { + const relic_procgen_data::enchantment_active *active = active_procgen_values.pick(); + if( active != nullptr ) { + fake_spell active_sp; + active_sp.id = active->activated_spell; + active_sp.level = rng( active->min_level, active->max_level ); + num_attributes++; + int power = power_level( active_sp ); + if( power < 0 ) { + if( rules.max_negative_power > negative_attribute_power ) { + break; + } + negative_attribute_power += power; + } + ret.add_active_effect( active_sp ); + } + break; + } + case relic_procgen_data::type::passive_enchantment_add: { + const relic_procgen_data::enchantment_value_passive *add = passive_add_procgen_values.pick(); + if( add != nullptr ) { + enchantment ench; + int value = rng( add->min_value, add->max_value ); + if( value == 0 ) { + break; + } + ench.add_value_add( add->type, value ); + num_attributes++; + int negative_ench_attribute = power_level( ench ); + if( negative_ench_attribute < 0 ) { + if( rules.max_negative_power > negative_attribute_power ) { + break; + } + negative_attribute_power += negative_ench_attribute; + } + if( is_armor ) { + ench.set_has( enchantment::has::WORN ); + } else { + ench.set_has( enchantment::has::WIELD ); + } + ret.add_passive_effect( ench ); + } + break; + } + case relic_procgen_data::type::passive_enchantment_mult: { + const relic_procgen_data::enchantment_value_passive *mult = + passive_mult_procgen_values.pick(); + if( mult != nullptr ) { + enchantment ench; + float value = rng( mult->min_value, mult->max_value ); + ench.add_value_mult( mult->type, value ); + num_attributes++; + int negative_ench_attribute = power_level( ench ); + if( negative_ench_attribute < 0 ) { + if( rules.max_negative_power > negative_attribute_power ) { + break; + } + negative_attribute_power += negative_ench_attribute; + } + if( is_armor ) { + ench.set_has( enchantment::has::WORN ); + } else { + ench.set_has( enchantment::has::WIELD ); + } + ret.add_passive_effect( ench ); + } + break; + } + case relic_procgen_data::type::hit_me: { + const relic_procgen_data::enchantment_active *active = passive_hit_me.pick(); + if( active != nullptr ) { + fake_spell active_sp; + active_sp.id = active->activated_spell; + active_sp.level = rng( active->min_level, active->max_level ); + num_attributes++; + enchantment ench; + ench.add_hit_me( active_sp ); + int power = power_level( ench ); + if( power < 0 ) { + if( rules.max_negative_power > negative_attribute_power ) { + break; + } + negative_attribute_power += power; + } + if( is_armor ) { + ench.set_has( enchantment::has::WORN ); + } else { + ench.set_has( enchantment::has::WIELD ); + } + ret.add_passive_effect( ench ); + } + break; + } + case relic_procgen_data::type::hit_you: { + const relic_procgen_data::enchantment_active *active = passive_hit_you.pick(); + if( active != nullptr ) { + fake_spell active_sp; + active_sp.id = active->activated_spell; + active_sp.level = rng( active->min_level, active->max_level ); + num_attributes++; + enchantment ench; + ench.add_hit_you( active_sp ); + int power = power_level( ench ); + if( power < 0 ) { + if( rules.max_negative_power > negative_attribute_power ) { + break; + } + negative_attribute_power += power; + } + if( is_armor ) { + ench.set_has( enchantment::has::WORN ); + } else { + ench.set_has( enchantment::has::WIELD ); + } + ret.add_passive_effect( ench ); + } + break; + } + case relic_procgen_data::type::last: { + debugmsg( "ERROR: invalid relic procgen type" ); + break; + } + } + } + + return ret; +} diff --git a/src/relic.h b/src/relic.h index 7d50c5391ee5c..90c3f923a43da 100644 --- a/src/relic.h +++ b/src/relic.h @@ -8,13 +8,117 @@ #include "magic.h" #include "magic_enchantment.h" #include "translations.h" +#include "weighted_list.h" class Creature; class JsonIn; class JsonObject; class JsonOut; +class relic; +class relic_procgen_data; struct tripoint; +using relic_procgen_id = string_id; + +class relic_procgen_data +{ + public: + + /* + * various procgen values for passive enchantment values + * this is a template for the ability to write a little bit + * less code and easier maintainability for additional values + */ + template + struct enchantment_value_passive { + enchant_vals::mod type; + // THIS CANNOT BE 0 + int power_per_increment = 1; + // whatever increment is used for the point values + // THIS CANNOT BE 0 + T increment = 1; + T min_value = 0; + T max_value = 0; + + int calc_power( T level ) const { + return std::round( level * static_cast( power_per_increment ) / + static_cast( increment ) ); + } + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); + }; + + struct enchantment_active { + spell_id activated_spell; + // power cost of spell at level 0 + int base_power = 0; + // power cost increment per spell level increment + int power_per_increment = 1; + // number of spell levels that give the power per increment at + int increment = 1; + // min level of the spell allowed + int min_level = 0; + // max level of the spell allowed + int max_level = 0; + + int calc_power( int level ) const { + return base_power + std::round( level * + static_cast( power_per_increment ) / static_cast( increment ) ); + } + + bool was_loaded = false; + + void load( const JsonObject &jo ); + void deserialize( JsonIn &jsin ); + }; + + struct generation_rules { + // the desired power level for the generated artifact + int power_level = 0; + // the most negative (total) attributes a generated artifact can have + int max_negative_power = 0; + // the maximum number of attributes a generated artifact can have + int max_attributes = INT_MAX; + }; + + enum type { + passive_enchantment_add, + passive_enchantment_mult, + hit_you, + hit_me, + active_enchantment, + last + }; + private: + + weighted_int_list> passive_add_procgen_values; + weighted_int_list> passive_mult_procgen_values; + weighted_int_list passive_hit_you; + weighted_int_list passive_hit_me; + weighted_int_list active_procgen_values; + weighted_int_list type_weights; + weighted_int_list item_weights; + + public: + relic_procgen_id id; + + int power_level( const enchantment &ench ) const; + // power level of the active spell + int power_level( const fake_spell &sp ) const; + + item create_item( const relic_procgen_data::generation_rules &rules ) const; + relic generate( const generation_rules &rules, const itype_id &it_id ) const; + + bool was_loaded; + + static void load_relic_procgen_data( const JsonObject &jo, const std::string &src ); + void load( const JsonObject &jo, const std::string & = "" ); + void deserialize( JsonIn &jsin ); +}; + class relic { private: @@ -43,6 +147,16 @@ class relic std::vector get_enchantments() const; int modify_value( enchant_vals::mod value_type, int value ) const; + + // what is the power level of this artifact, given a specific ruleset + int power_level( const relic_procgen_id &ruleset ) const; +}; + +template struct enum_traits; + +template<> +struct enum_traits { + static constexpr relic_procgen_data::type last = relic_procgen_data::type::last; }; #endif // CATA_SRC_RELIC_H diff --git a/src/requirements.cpp b/src/requirements.cpp index 1f4328bd7e44e..6f0c4775c48fc 100644 --- a/src/requirements.cpp +++ b/src/requirements.cpp @@ -12,8 +12,8 @@ #include #include -#include "avatar.h" #include "cata_utility.h" +#include "character.h" #include "color.h" #include "debug.h" #include "game.h" @@ -643,7 +643,7 @@ std::vector requirement_data::get_folded_tools_list( int width, nc_ bool requirement_data::can_make_with_inventory( const inventory &crafting_inv, const std::function &filter, int batch, craft_flags flags ) const { - if( g->u.has_trait( trait_DEBUG_HS ) ) { + if( get_player_character().has_trait( trait_DEBUG_HS ) ) { return true; } @@ -705,7 +705,7 @@ bool quality_requirement::has( const inventory &crafting_inv, const std::function &, int, craft_flags, const std::function & ) const { - if( g->u.has_trait( trait_DEBUG_HS ) ) { + if( get_player_character().has_trait( trait_DEBUG_HS ) ) { return true; } return crafting_inv.has_quality( type, level, count ); @@ -724,7 +724,7 @@ bool tool_comp::has( const inventory &crafting_inv, const std::function &filter, int batch, craft_flags flags, const std::function &visitor ) const { - if( g->u.has_trait( trait_DEBUG_HS ) ) { + if( get_player_character().has_trait( trait_DEBUG_HS ) ) { return true; } if( !by_charges() ) { @@ -756,7 +756,7 @@ bool item_comp::has( const inventory &crafting_inv, const std::function &filter, int batch, craft_flags, const std::function & ) const { - if( g->u.has_trait( trait_DEBUG_HS ) ) { + if( get_player_character().has_trait( trait_DEBUG_HS ) ) { return true; } const int cnt = std::abs( count ) * batch; diff --git a/src/rng.h b/src/rng.h index b4c07aa7e7b55..b98d2461d317e 100644 --- a/src/rng.h +++ b/src/rng.h @@ -160,13 +160,14 @@ inline V random_entry_removed( C &container ) return result; } class map; +template class tripoint_range; struct tripoint; /// Returns a range enclosing all valid points of the map. -tripoint_range points_in_range( const map &m ); +tripoint_range points_in_range( const map &m ); /// Returns a random point in the given range that satisfies the given predicate ( if any ). -cata::optional random_point( const tripoint_range &range, +cata::optional random_point( const tripoint_range &range, const std::function &predicate ); /// Same as other random_point with a range enclosing all valid points of the map. cata::optional random_point( const map &m, diff --git a/src/safemode_ui.cpp b/src/safemode_ui.cpp index fa3367e55eb09..bc2f4f7285b8e 100644 --- a/src/safemode_ui.cpp +++ b/src/safemode_ui.cpp @@ -8,8 +8,8 @@ #include #include -#include "avatar.h" #include "cata_utility.h" +#include "character.h" #include "color.h" #include "compatibility.h" #include "cursesdef.h" @@ -121,6 +121,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) ctxt.register_action( "SWAP_RULE_GLOBAL_CHAR" ); } + Character &player_character = get_player_character(); ui.on_redraw( [&]( const ui_adaptor & ) { draw_border( w_border, BORDER_COLOR, custom_name_in ); @@ -201,7 +202,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) auto ¤t_tab = ( tab == GLOBAL_TAB ) ? global_rules : character_rules; - if( tab == CHARACTER_TAB && g->u.name.empty() ) { + if( tab == CHARACTER_TAB && player_character.name.empty() ) { character_rules.clear(); mvwprintz( w, point( 15, 8 ), c_white, _( "Please load a character first to use this page!" ) ); } else if( empty() ) { @@ -269,7 +270,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) } } else if( action == "QUIT" ) { break; - } else if( tab == CHARACTER_TAB && g->u.name.empty() ) { + } else if( tab == CHARACTER_TAB && player_character.name.empty() ) { //Only allow loaded games to use the char sheet } else if( action == "DOWN" ) { line++; @@ -308,7 +309,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) current_tab.push_back( current_tab[line] ); line = current_tab.size() - 1; } else if( action == "SWAP_RULE_GLOBAL_CHAR" && !current_tab.empty() ) { - if( ( tab == GLOBAL_TAB && !g->u.name.empty() ) || tab == CHARACTER_TAB ) { + if( ( tab == GLOBAL_TAB && !player_character.name.empty() ) || tab == CHARACTER_TAB ) { changes_made = true; //copy over auto &temp_rules_from = ( tab == GLOBAL_TAB ) ? global_rules : character_rules; @@ -467,7 +468,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) if( query_yn( _( "Save changes?" ) ) ) { if( is_safemode_in ) { save_global(); - if( !g->u.name.empty() ) { + if( !player_character.name.empty() ) { save_character(); } } else { @@ -489,7 +490,8 @@ void safemode::test_pattern( const int tab_in, const int row_in ) return; } - if( g->u.name.empty() ) { + Character &player_character = get_player_character(); + if( player_character.name.empty() ) { popup( _( "No monsters loaded. Please start a game first." ) ); return; } diff --git a/src/savegame.cpp b/src/savegame.cpp index 28ff9e50bb914..f0c2d207e9ffe 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -53,7 +53,7 @@ extern std::map> quick_shortcuts_map; * Changes that break backwards compatibility should bump this number, so the game can * load a legacy format loader. */ -const int savegame_version = 29; +const int savegame_version = 30; /* * This is a global set by detected version header in .sav, maps.txt, or overmap. @@ -336,6 +336,7 @@ bool overmap::obsolete_terrain( const std::string &ter ) */ void overmap::convert_terrain( const std::unordered_map &needs_conversion ) { + std::vector bridge_points; for( const auto &convert : needs_conversion ) { const tripoint pos = convert.first; const std::string old = convert.second; @@ -350,14 +351,19 @@ void overmap::convert_terrain( const std::unordered_map & std::vector nearby; std::vector> convert_unrelated_adjacent_tiles; - if( old == "rural_house" || old == "rural_house_north" ) { - ter_set( pos, oter_id( "rural_house1_north" ) ); - } else if( old == "rural_house_south" ) { - ter_set( pos, oter_id( "rural_house1_south" ) ); - } else if( old == "rural_house_east" ) { - ter_set( pos, oter_id( "rural_house1_east" ) ); - } else if( old == "rural_house_west" ) { - ter_set( pos, oter_id( "rural_house1_west" ) ); + if( old == "fema" || old == "fema_entrance" || old == "fema_1_3" || + old == "fema_2_1" || old == "fema_2_2" || old == "fema_2_3" || + old == "fema_3_1" || old == "fema_3_2" || old == "fema_3_3" ) { + ter_set( pos, oter_id( old + "_north" ) ); + } else if( old.compare( 0, 6, "bridge" ) == 0 ) { + ter_set( pos, oter_id( old ) ); + const oter_id oter_ground = ter( tripoint( pos.xy(), 0 ) ); + const oter_id oter_above = ter( pos + tripoint_above ); + if( is_ot_match( "bridge", oter_ground, ot_match_type::type ) && + !is_ot_match( "bridge_road", oter_above, ot_match_type::type ) ) { + ter_set( pos + tripoint_above, oter_id( "bridge_road" + oter_get_rotation_string( oter_ground ) ) ); + bridge_points.emplace_back( pos.xy() ); + } } else if( old.compare( 0, 10, "mass_grave" ) == 0 ) { ter_set( pos, oter_id( "field" ) ); } @@ -376,6 +382,8 @@ void overmap::convert_terrain( const std::unordered_map & ter_set( pos + conv.first, oter_id( conv.second ) ); } } + + generate_bridgeheads( bridge_points ); } void overmap::load_monster_groups( JsonIn &jsin ) diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index d1b59cae7b382..199c386a60b45 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -197,14 +197,12 @@ void item_contents::deserialize( JsonIn &jsin ) void item_pocket::serialize( JsonOut &json ) const { - if( !contents.empty() ) { - json.start_object(); - json.member( "pocket_type", data->type ); - json.member( "contents", contents ); - json.member( "_sealed", _sealed ); - json.member( "favorite_settings", this->settings ); - json.end_object(); - } + json.start_object(); + json.member( "pocket_type", data->type ); + json.member( "contents", contents ); + json.member( "_sealed", _sealed ); + json.member( "favorite_settings", this->settings ); + json.end_object(); } void item_pocket::deserialize( JsonIn &jsin ) @@ -513,9 +511,10 @@ void Character::load( const JsonObject &data ) JsonObject vits = data.get_object( "vitamin_levels" ); for( const std::pair &v : vitamin::all() ) { - int lvl = vits.get_int( v.first.str(), 0 ); - lvl = std::max( std::min( lvl, v.first.obj().max() ), v.first.obj().min() ); - vitamin_levels[v.first] = lvl; + if( vits.has_member( v.first.str() ) ) { + int lvl = vits.get_int( v.first.str() ); + vitamin_levels[v.first] = clamp( lvl, v.first->min(), v.first->max() ); + } } data.read( "consumption_history", consumption_history ); data.read( "activity", activity ); @@ -544,7 +543,6 @@ void Character::load( const JsonObject &data ) // health data.read( "healthy", healthy ); data.read( "healthy_mod", healthy_mod ); - data.read( "healed_24h", healed_total ); // status temp_cur.fill( 5000 ); @@ -559,14 +557,16 @@ void Character::load( const JsonObject &data ) body_wetness.fill( 0 ); data.read( "body_wetness", body_wetness ); + // Remove check after 0.F + if( savegame_loading_version >= 30 ) { + data.read( "proficiencies", _proficiencies ); + } + //energy data.read( "stim", stim ); data.read( "stamina", stamina ); - data.read( "damage_bandaged", damage_bandaged ); - data.read( "damage_disinfected", damage_disinfected ); data.read( "magic", magic ); - JsonArray parray; data.read( "underwater", underwater ); @@ -575,6 +575,10 @@ void Character::load( const JsonObject &data ) const auto &tid = *it; if( tid.is_valid() ) { ++it; + // Remove after 0.F + } else if( tid == trait_id( "PROF_HELI_PILOT" ) ) { + it = my_traits.erase( it ); + add_proficiency( proficiency_id( "prof_helicopter_pilot" ) ); } else { debugmsg( "character %s has invalid trait %s, it will be ignored", name, tid.c_str() ); my_traits.erase( it++ ); @@ -606,6 +610,10 @@ void Character::load( const JsonObject &data ) on_mutation_gain( mid ); cached_mutations.push_back( &mid.obj() ); ++it; + // Remove after 0.F + } else if( mid == trait_id( "PROF_HELI_PILOT" ) ) { + it = my_mutations.erase( it ); + add_proficiency( proficiency_id( "prof_helicopter_pilot" ) ); } else { debugmsg( "character %s has invalid mutation %s, it will be ignored", name, mid.c_str() ); it = my_mutations.erase( it ); @@ -624,12 +632,62 @@ void Character::load( const JsonObject &data ) on_item_wear( w ); } - if( !data.read( "hp_cur", hp_cur ) ) { - debugmsg( "Error, incompatible hp_cur in save file '%s'", parray.str() ); - } - - if( !data.read( "hp_max", hp_max ) ) { - debugmsg( "Error, incompatible hp_max in save file '%s'", parray.str() ); + // TEMPORARY until 0.F + if( data.has_array( "hp_cur" ) ) { + set_anatomy( anatomy_id( "human_anatomy" ) ); + set_body(); + std::array hp_cur; + data.read( "hp_cur", hp_cur ); + std::array hp_max; + data.read( "hp_max", hp_max ); + set_part_hp_cur( bodypart_id( "head" ), hp_cur[0] ); + set_part_hp_max( bodypart_id( "head" ), hp_max[0] ); + set_part_hp_cur( bodypart_id( "torso" ), hp_cur[1] ); + set_part_hp_max( bodypart_id( "torso" ), hp_max[1] ); + set_part_hp_cur( bodypart_id( "arm_l" ), hp_cur[2] ); + set_part_hp_max( bodypart_id( "arm_l" ), hp_max[2] ); + set_part_hp_cur( bodypart_id( "arm_r" ), hp_cur[3] ); + set_part_hp_max( bodypart_id( "arm_r" ), hp_max[3] ); + set_part_hp_cur( bodypart_id( "leg_l" ), hp_cur[4] ); + set_part_hp_max( bodypart_id( "leg_l" ), hp_max[4] ); + set_part_hp_cur( bodypart_id( "leg_r" ), hp_cur[5] ); + set_part_hp_max( bodypart_id( "leg_r" ), hp_max[5] ); + } + if( data.has_array( "damage_bandaged" ) ) { + set_anatomy( anatomy_id( "human_anatomy" ) ); + set_body(); + std::array damage_bandaged; + data.read( "damage_bandaged", damage_bandaged ); + set_part_damage_bandaged( bodypart_id( "head" ), damage_bandaged[0] ); + set_part_damage_bandaged( bodypart_id( "torso" ), damage_bandaged[1] ); + set_part_damage_bandaged( bodypart_id( "arm_l" ), damage_bandaged[2] ); + set_part_damage_bandaged( bodypart_id( "arm_r" ), damage_bandaged[3] ); + set_part_damage_bandaged( bodypart_id( "leg_l" ), damage_bandaged[4] ); + set_part_damage_bandaged( bodypart_id( "leg_r" ), damage_bandaged[5] ); + } + if( data.has_array( "damage_disinfected" ) ) { + set_anatomy( anatomy_id( "human_anatomy" ) ); + set_body(); + std::array damage_disinfected; + data.read( "damage_disinfected", damage_disinfected ); + set_part_damage_disinfected( bodypart_id( "head" ), damage_disinfected[0] ); + set_part_damage_disinfected( bodypart_id( "torso" ), damage_disinfected[1] ); + set_part_damage_disinfected( bodypart_id( "arm_l" ), damage_disinfected[2] ); + set_part_damage_disinfected( bodypart_id( "arm_r" ), damage_disinfected[3] ); + set_part_damage_disinfected( bodypart_id( "leg_l" ), damage_disinfected[4] ); + set_part_damage_disinfected( bodypart_id( "leg_r" ), damage_disinfected[5] ); + } + if( data.has_array( "healed_24h" ) ) { + set_anatomy( anatomy_id( "human_anatomy" ) ); + set_body(); + std::array healed_total; + data.read( "healed_24h", healed_total ); + set_part_healed_total( bodypart_id( "head" ), healed_total[0] ); + set_part_healed_total( bodypart_id( "torso" ), healed_total[1] ); + set_part_healed_total( bodypart_id( "arm_l" ), healed_total[2] ); + set_part_healed_total( bodypart_id( "arm_r" ), healed_total[3] ); + set_part_healed_total( bodypart_id( "leg_l" ), healed_total[4] ); + set_part_healed_total( bodypart_id( "leg_r" ), healed_total[5] ); } inv.clear(); @@ -681,7 +739,7 @@ void Character::load( const JsonObject &data ) on_stat_change( "pkill", pkill ); on_stat_change( "perceived_pain", get_perceived_pain() ); recalc_sight_limits(); - reset_encumbrance(); + calc_encumbrance(); assign( data, "power_level", power_level, false, 0_kJ ); assign( data, "max_power_level", max_power_level, false, 0_kJ ); @@ -756,7 +814,6 @@ void Character::store( JsonOut &json ) const // health json.member( "healthy", healthy ); json.member( "healthy_mod", healthy_mod ); - json.member( "healed_24h", healed_total ); // status json.member( "temp_cur", temp_cur ); @@ -825,6 +882,8 @@ void Character::store( JsonOut &json ) const } json.end_object(); + json.member( "proficiencies", _proficiencies ); + // npc; unimplemented if( power_level < 1_J ) { json.member( "power_level", to_string( units::to_millijoule( power_level ) ) + " mJ" ); @@ -886,12 +945,6 @@ void player::store( JsonOut &json ) const json.member( "in_vehicle", in_vehicle ); json.member( "id", getID() ); - // potential incompatibility with future expansion - // TODO: consider ["parts"]["head"]["hp_cur"] instead of ["hp_cur"][head_enum_value] - json.member( "hp_cur", hp_cur ); - json.member( "hp_max", hp_max ); - json.member( "damage_bandaged", damage_bandaged ); - json.member( "damage_disinfected", damage_disinfected ); // "Looks like I picked the wrong week to quit smoking." - Steve McCroskey json.member( "addictions", addictions ); json.member( "followers", follower_ids ); @@ -1096,6 +1149,8 @@ void avatar::store( JsonOut &json ) const json.member( "invcache" ); inv.json_save_invcache( json ); + + json.member( "calorie_diary", calorie_diary ); } void avatar::deserialize( JsonIn &jsin ) @@ -1244,6 +1299,8 @@ void avatar::load( const JsonObject &data ) JsonIn *jip = data.get_raw( "invcache" ); inv.json_load_invcache( *jip ); } + + data.read( "calorie_diary", calorie_diary ); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2394,6 +2451,8 @@ void item::deserialize( JsonIn &jsin ) } else { item_contents read_contents; data.read( "contents", read_contents ); + contents.read_mods( read_contents ); + update_modified_pockets(); contents.combine( read_contents ); if( data.has_object( "contents" ) && data.get_object( "contents" ).has_array( "items" ) ) { @@ -2411,7 +2470,7 @@ void item::serialize( JsonOut &json ) const { io::JsonObjectOutputArchive archive( json ); const_cast( this )->io( archive ); - if( !contents.empty() ) { + if( !contents.empty_real() ) { json.member( "contents", contents ); } } @@ -2503,6 +2562,14 @@ void vehicle_part::deserialize( JsonIn &jsin ) data.read( "enabled", enabled ); data.read( "flags", flags ); data.read( "passenger_id", passenger_id ); + if( data.has_int( "z_offset" ) ) { + int z_offset = data.get_int( "z_offset" ); + if( std::abs( z_offset ) > 10 ) { + data.throw_error( "z_offset out of range", "z_offset" ); + } + precalc[0].z = z_offset; + precalc[1].z = z_offset; + } JsonArray ja = data.get_array( "carry" ); // count down from size - 1, then stop after unsigned long 0 - 1 becomes MAX_INT for( size_t index = ja.size() - 1; index < ja.size(); index-- ) { @@ -2576,6 +2643,9 @@ void vehicle_part::serialize( JsonOut &json ) const } json.member( "passenger_id", passenger_id ); json.member( "crew_id", crew_id ); + if( precalc[0].z ) { + json.member( "z_offset", precalc[0].z ); + } json.member( "items", items ); if( target.first != tripoint_min ) { json.member( "target_first_x", target.first.x ); @@ -2594,20 +2664,20 @@ void vehicle_part::serialize( JsonOut &json ) const /* * label */ -static void deserialize( label &val, JsonIn &jsin ) +void label::deserialize( JsonIn &jsin ) { JsonObject data = jsin.get_object(); - data.read( "x", val.x ); - data.read( "y", val.y ); - data.read( "text", val.text ); + data.read( "x", x ); + data.read( "y", y ); + data.read( "text", text ); } -static void serialize( const label &val, JsonOut &json ) +void label::serialize( JsonOut &json ) const { json.start_object(); - json.member( "x", val.x ); - json.member( "y", val.y ); - json.member( "text", val.text ); + json.member( "x", x ); + json.member( "y", y ); + json.member( "text", text ); json.end_object(); } @@ -3070,6 +3140,8 @@ void Creature::store( JsonOut &jsout ) const jsout.member( "grab_resist", grab_resist ); jsout.member( "throw_resist", throw_resist ); + jsout.member( "body", body ); + // fake is not stored, it's temporary anyway, only used to fire with a gun. } @@ -3138,6 +3210,8 @@ void Creature::load( const JsonObject &jsin ) jsin.read( "underwater", underwater ); + jsin.read( "body", body ); + fake = false; // see Creature::load on_stat_change( "pain", pain ); @@ -3272,19 +3346,19 @@ void map_memory::load( const JsonObject &jsin ) } } -void deserialize( point &p, JsonIn &jsin ) +void point::deserialize( JsonIn &jsin ) { jsin.start_array(); - p.x = jsin.get_int(); - p.y = jsin.get_int(); + x = jsin.get_int(); + y = jsin.get_int(); jsin.end_array(); } -void serialize( const point &p, JsonOut &jsout ) +void point::serialize( JsonOut &jsout ) const { jsout.start_array(); - jsout.write( p.x ); - jsout.write( p.y ); + jsout.write( x ); + jsout.write( y ); jsout.end_array(); } diff --git a/src/scent_map.cpp b/src/scent_map.cpp index a29c807c3a438..905b685bea3c0 100644 --- a/src/scent_map.cpp +++ b/src/scent_map.cpp @@ -134,7 +134,7 @@ bool scent_map::inbounds( const tripoint &p ) const const int levz = gm.get_levz(); const bool scent_map_z_level_inbounds = ( p.z == levz ) || ( std::abs( p.z - levz ) == SCENT_MAP_Z_REACH && - gm.m.valid_move( p, tripoint( p.xy(), levz ), false, true ) ); + get_map().valid_move( p, tripoint( p.xy(), levz ), false, true ) ); if( !scent_map_z_level_inbounds ) { return false; } diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 46f12a16f2717..646187eaa54e5 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -1250,7 +1250,7 @@ void cata_cursesport::curses_drawwindow( const catacurses::window &w ) clear_window_area( w ); tilecontext->draw_minimap( point( win->pos.x * fontwidth, win->pos.y * fontheight ), - tripoint( g->u.pos().xy(), g->ter_view_p.z ), + tripoint( get_player_character().pos().xy(), g->ter_view_p.z ), win->width * font->fontwidth, win->height * font->fontheight ); update = true; @@ -1854,7 +1854,8 @@ input_context touch_input_context; std::string get_quick_shortcut_name( const std::string &category ) { - if( category == "DEFAULTMODE" && g->check_zone( zone_type_id( "NO_AUTO_PICKUP" ), g->u.pos() ) && + if( category == "DEFAULTMODE" && + g->check_zone( zone_type_id( "NO_AUTO_PICKUP" ), get_player_character().pos() ) && get_option( "ANDROID_SHORTCUT_ZONE" ) ) { return "DEFAULTMODE____SHORTCUTS"; } @@ -2112,10 +2113,11 @@ void remove_stale_inventory_quick_shortcuts() valid = inv_chars.valid( key ); in_inventory = false; if( valid ) { - in_inventory = g->u.inv.invlet_to_position( key ) != INT_MIN; + Character &player_character = get_player_character(); + in_inventory = player_character.inv.invlet_to_position( key ) != INT_MIN; if( !in_inventory ) { // We couldn't find this item in the inventory, let's check worn items - for( const auto &item : g->u.worn ) { + for( const auto &item : player_character.worn ) { if( item.invlet == key ) { in_inventory = true; break; @@ -2124,7 +2126,7 @@ void remove_stale_inventory_quick_shortcuts() } if( !in_inventory ) { // We couldn't find it in worn items either, check weapon held - if( g->u.weapon.invlet == key ) { + if( player_character.weapon.invlet == key ) { in_inventory = true; } } @@ -2244,11 +2246,13 @@ void draw_quick_shortcuts() std::string hint_text; if( show_hint ) { if( touch_input_context.get_category() == "INVENTORY" && inv_chars.valid( key ) ) { + Character &player_character = get_player_character(); // Special case for inventory items - show the inventory item name as help text - hint_text = g->u.inv.find_item( g->u.inv.invlet_to_position( key ) ).display_name(); + hint_text = player_character.inv.find_item( player_character.inv.invlet_to_position( + key ) ).display_name(); if( hint_text == "none" ) { // We couldn't find this item in the inventory, let's check worn items - for( const auto &item : g->u.worn ) { + for( const auto &item : player_character.worn ) { if( item.invlet == key ) { hint_text = item.display_name(); break; @@ -2257,8 +2261,8 @@ void draw_quick_shortcuts() } if( hint_text == "none" ) { // We couldn't find it in worn items either, must be weapon held - if( g->u.weapon.invlet == key ) { - hint_text = g->u.weapon.display_name(); + if( player_character.weapon.invlet == key ) { + hint_text = player_character.weapon.display_name(); } } } else { @@ -2627,24 +2631,25 @@ static void CheckMessages() // Actions to remove - we only want to remove things that we're 100% sure won't be useful to players otherwise std::set actions_remove; + Character &player_character = get_player_character(); // Check if we're in a potential combat situation, if so, sort a few actions to the top. - if( !g->u.get_hostile_creatures( 60 ).empty() ) { + if( !player_character.get_hostile_creatures( 60 ).empty() ) { // Only prioritize movement options if we're not driving. - if( !g->u.controlling_vehicle ) { + if( !player_character.controlling_vehicle ) { actions.insert( ACTION_CYCLE_MOVE ); } // Only prioritize fire weapon options if we're wielding a ranged weapon. - if( g->u.weapon.is_gun() || g->u.weapon.has_flag( "REACH_ATTACK" ) ) { + if( player_character.weapon.is_gun() || player_character.weapon.has_flag( "REACH_ATTACK" ) ) { actions.insert( ACTION_FIRE ); } } // If we're already running, make it simple to toggle running to off. - if( g->u.is_running() ) { + if( player_character.is_running() ) { actions.insert( ACTION_TOGGLE_RUN ); } // If we're already crouching, make it simple to toggle crouching to off. - if( g->u.is_crouching() ) { + if( player_character.is_crouching() ) { actions.insert( ACTION_TOGGLE_CROUCH ); } @@ -2653,18 +2658,19 @@ static void CheckMessages() actions_remove.insert( ACTION_CYCLE_MOVE ); } + map &here = get_map(); // Check if we can perform one of our actions on nearby terrain. If so, // display that action at the top of the list. for( int dx = -1; dx <= 1; dx++ ) { for( int dy = -1; dy <= 1; dy++ ) { - int x = g->u.posx() + dx; - int y = g->u.posy() + dy; - int z = g->u.posz(); + int x = player_character.posx() + dx; + int y = player_character.posy() + dy; + int z = player_character.posz(); const tripoint pos( x, y, z ); // Check if we're near a vehicle, if so, vehicle controls should be top. { - const optional_vpart_position vp = g->m.veh_at( pos ); + const optional_vpart_position vp = here.veh_at( pos ); vehicle *const veh = veh_pointer_or_null( vp ); if( veh ) { const int veh_part = vp ? vp->part_index() : -1; @@ -2756,12 +2762,12 @@ static void CheckMessages() } // Check if we're significantly hungry or thirsty - if so, add eat - if( g->u.get_hunger() > 100 || g->u.get_thirst() > 40 ) { + if( player_character.get_hunger() > 100 || player_character.get_thirst() > 40 ) { actions.insert( ACTION_EAT ); } // Check if we're dead tired - if so, add sleep - if( g->u.get_fatigue() > fatigue_levels::DEAD_TIRED ) { + if( player_character.get_fatigue() > fatigue_levels::DEAD_TIRED ) { actions.insert( ACTION_SLEEP ); } @@ -2892,9 +2898,11 @@ static void CheckMessages() } #endif break; - case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_RESIZED: { + restore_on_out_of_scope prev_last_input( last_input ); needupdate = handle_resize( ev.window.data1, ev.window.data2 ); break; + } default: break; } @@ -3228,6 +3236,7 @@ static void CheckMessages() } } if( need_redraw ) { + restore_on_out_of_scope prev_last_input( last_input ); // FIXME: SDL_RENDER_TARGETS_RESET only seems to be fired after the first redraw // when restoring the window after system sleep, rather than immediately // on focus gain. This seems to mess up the first redraw and diff --git a/src/shadowcasting.h b/src/shadowcasting.h index 2ab0fa3311935..a3be0fd69f467 100644 --- a/src/shadowcasting.h +++ b/src/shadowcasting.h @@ -50,7 +50,7 @@ struct four_quadrants { friend four_quadrants operator*( const four_quadrants &l, const four_quadrants &r ) { four_quadrants result; std::transform( l.values.begin(), l.values.end(), r.values.begin(), - result.values.begin(), std::multiplies() ); + result.values.begin(), std::multiplies<>() ); return result; } diff --git a/src/simple_pathfinding.h b/src/simple_pathfinding.h index a9dabd0c6f551..1afdc3a7163f1 100644 --- a/src/simple_pathfinding.h +++ b/src/simple_pathfinding.h @@ -8,18 +8,20 @@ #include "enums.h" #include "point.h" +#include "point_traits.h" namespace pf { static const int rejected = std::numeric_limits::min(); +template struct node { - point pos; + Point pos; int dir; int priority; - node( const point &p, int dir, int priority = 0 ) : + node( const Point &p, int dir, int priority = 0 ) : pos( p ), dir( dir ), priority( priority ) {} @@ -30,8 +32,9 @@ struct node { } }; +template struct path { - std::vector nodes; + std::vector> nodes; }; /** @@ -42,21 +45,26 @@ struct path { * integer estimation (smaller - better) for the current node or a negative value * if the node is unsuitable. */ -template -path find_path( const point &source, - const point &dest, - const point &max, - BinaryPredicate estimator ) +template +path find_path( const Point &source, + const Point &dest, + const Point &max, + BinaryPredicate estimator ) { - const auto inbounds = [ max ]( const point & p ) { - return p.x >= 0 && p.x < max.x && p.y >= 0 && p.y < max.y; + static_assert( Point::dimension == 2, "This pathfinding function doesn't work for tripoints" ); + using Traits = point_traits; + using Node = node; + + const auto inbounds = [ max ]( const Point & p ) { + return Traits::x( p ) >= 0 && Traits::x( p ) < Traits::x( max ) && + Traits::y( p ) >= 0 && Traits::y( p ) < Traits::y( max ); }; - const auto map_index = [ max ]( const point & p ) { - return p.y * max.x + p.x; + const auto map_index = [ max ]( const Point & p ) { + return Traits::y( p ) * Traits::x( max ) + Traits::x( p ); }; - path res; + path res; if( source == dest ) { return res; @@ -66,18 +74,18 @@ path find_path( const point &source, return res; } - const node first_node( source, 5, 1000 ); + const Node first_node( source, 5, 1000 ); if( estimator( first_node, nullptr ) == rejected ) { return res; } - const size_t map_size = max.x * max.y; + const size_t map_size = Traits::x( max ) * Traits::y( max ); std::vector closed( map_size, false ); std::vector open( map_size, 0 ); std::vector dirs( map_size, 0 ); - std::priority_queue> nodes[2]; + std::priority_queue> nodes[2]; int i = 0; nodes[i].push( first_node ); @@ -85,7 +93,7 @@ path find_path( const point &source, // use A* to find the shortest path from (x1,y1) to (x2,y2) while( !nodes[i].empty() ) { - const node mn( nodes[i].top() ); // get the best-looking node + const Node mn( nodes[i].top() ); // get the best-looking node nodes[i].pop(); // mark it visited @@ -93,7 +101,7 @@ path find_path( const point &source, // if we've reached the end, draw the path and return if( mn.pos == dest ) { - point p = mn.pos; + Point p = mn.pos; res.nodes.reserve( nodes[i].size() ); @@ -110,7 +118,7 @@ path find_path( const point &source, } for( int dir = 0; dir < 4; dir++ ) { - const point p = mn.pos + four_adjacent_offsets[dir]; + const Point p = mn.pos + four_adjacent_offsets[dir]; const int n = map_index( p ); // don't allow: // * out of bounds @@ -119,7 +127,7 @@ path find_path( const point &source, continue; } - node cn( p, dir ); + Node cn( p, dir ); cn.priority = estimator( cn, &mn ); if( cn.priority == rejected ) { @@ -154,17 +162,16 @@ path find_path( const point &source, return res; } -inline path straight_path( const point &source, - int dir, - size_t len ) +template +inline path straight_path( const Point &source, int dir, size_t len ) { - path res; + path res; if( len == 0 ) { return res; } - point p = source; + Point p = source; res.nodes.reserve( len ); diff --git a/src/sounds.cpp b/src/sounds.cpp index 9698f5c29e81e..c12da23fb3722 100644 --- a/src/sounds.cpp +++ b/src/sounds.cpp @@ -11,9 +11,9 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" +#include "character.h" #include "coordinate_conversions.h" #include "creature.h" #include "debug.h" @@ -61,7 +61,7 @@ # define dbg(x) DebugLog((x),D_SDL) << __FILE__ << ":" << __LINE__ << ": " #endif -weather_type previous_weather; +weather_type_id previous_weather; int prev_hostiles = 0; int previous_speed = 0; int previous_gear = 0; @@ -278,7 +278,7 @@ static int get_signal_for_hordes( const centroid ¢r ) { //Volume in tiles. Signal for hordes in submaps //modify vol using weather vol.Weather can reduce monster hearing - const int vol = centr.volume - weather::sound_attn( g->weather.weather ); + const int vol = centr.volume - get_weather().weather_id->sound_attn; const int min_vol_cap = 60; //Hordes can't hear volume lower than this const int underground_div = 2; //Coefficient for volume reduction underground const int hordes_sig_div = SEEX; //Divider coefficient for hordes @@ -302,7 +302,7 @@ static int get_signal_for_hordes( const centroid ¢r ) void sounds::process_sounds() { std::vector sound_clusters = cluster_sounds( recent_sounds ); - const int weather_vol = weather::sound_attn( g->weather.weather ); + const int weather_vol = get_weather().weather_id->sound_attn; for( const auto &this_centroid : sound_clusters ) { // Since monsters don't go deaf ATM we can just use the weather modified volume // If they later get physical effects from loud noises we'll have to change this @@ -314,7 +314,7 @@ void sounds::process_sounds() int sig_power = get_signal_for_hordes( this_centroid ); if( sig_power > 0 ) { - const point abs_ms = g->m.getabs( source.xy() ); + const point abs_ms = get_map().getabs( source.xy() ); const point abs_sm = ms_to_sm_copy( abs_ms ); const tripoint target( abs_sm, source.z ); overmap_buffer.signal_hordes( target, sig_power ); @@ -384,7 +384,7 @@ void sounds::process_sound_markers( player *p ) { bool is_deaf = p->is_deaf(); const float volume_multiplier = p->hearing_ability(); - const int weather_vol = weather::sound_attn( g->weather.weather ); + const int weather_vol = get_weather().weather_id->sound_attn; for( const auto &sound_event_pair : sounds_since_last_turn ) { const tripoint &pos = sound_event_pair.first; const sound_event &sound = sound_event_pair.second; @@ -464,7 +464,7 @@ void sounds::process_sound_markers( player *p ) } // don't print our own noise or things without descriptions - if( !sound.ambient && ( pos != p->pos() ) && !g->m.pl_sees( pos, distance_to_sound ) ) { + if( !sound.ambient && ( pos != p->pos() ) && !get_map().pl_sees( pos, distance_to_sound ) ) { if( !p->activity.is_distraction_ignored( distraction_type::noise ) && !get_safemode().is_sound_safe( sound.description, distance_to_sound ) ) { const std::string query = string_format( _( "Heard %s!" ), description ); @@ -536,7 +536,7 @@ void sounds::process_sound_markers( player *p ) // Enumerate the valid points the player *cannot* see. // Unless the source is on a different z-level, then any point is fine std::vector unseen_points; - for( const tripoint &newp : g->m.points_in_radius( pos, err_offset ) ) { + for( const tripoint &newp : get_map().points_in_radius( pos, err_offset ) ) { if( diff_z || !p->sees( newp ) ) { unseen_points.emplace_back( newp ); } @@ -647,19 +647,20 @@ int sfx::set_channel_volume( channel channel, int volume ) void sfx::do_vehicle_engine_sfx() { static const channel ch = channel::interior_engine_sound; - if( !g->u.in_vehicle ) { + const Character &player_character = get_player_character(); + if( !player_character.in_vehicle ) { fade_audio_channel( ch, 300 ); add_msg( m_debug, "STOP interior_engine_sound, OUT OF CAR" ); return; } - if( g->u.in_sleep_state() && !audio_muted ) { + if( player_character.in_sleep_state() && !audio_muted ) { fade_audio_channel( channel::any, 300 ); audio_muted = true; return; - } else if( g->u.in_sleep_state() && audio_muted ) { + } else if( player_character.in_sleep_state() && audio_muted ) { return; } - optional_vpart_position vpart_opt = g->m.veh_at( g->u.pos() ); + optional_vpart_position vpart_opt = get_map().veh_at( player_character.pos() ); vehicle *veh; if( vpart_opt.has_value() ) { veh = &vpart_opt->vehicle(); @@ -694,7 +695,7 @@ void sfx::do_vehicle_engine_sfx() if( !is_channel_playing( ch ) ) { play_ambient_variant_sound( id_and_variant.first, id_and_variant.second, - sfx::get_heard_volume( g->u.pos() ), ch, 1000 ); + sfx::get_heard_volume( player_character.pos() ), ch, 1000 ); add_msg( m_debug, "START %s %s", id_and_variant.first, id_and_variant.second ); } else { add_msg( m_debug, "PLAYING" ); @@ -731,10 +732,12 @@ void sfx::do_vehicle_engine_sfx() } if( current_gear > previous_gear ) { - play_variant_sound( "vehicle", "gear_shift", get_heard_volume( g->u.pos() ), 0, 0.8, 0.8 ); + play_variant_sound( "vehicle", "gear_shift", get_heard_volume( player_character.pos() ), 0, 0.8, + 0.8 ); add_msg( m_debug, "GEAR UP" ); } else if( current_gear < previous_gear ) { - play_variant_sound( "vehicle", "gear_shift", get_heard_volume( g->u.pos() ), 0, 1.2, 1.2 ); + play_variant_sound( "vehicle", "gear_shift", get_heard_volume( player_character.pos() ), 0, 1.2, + 1.2 ); add_msg( m_debug, "GEAR DOWN" ); } if( ( safe_speed != 0 ) ) { @@ -754,7 +757,7 @@ void sfx::do_vehicle_engine_sfx() Mix_HaltChannel( static_cast( ch ) ); add_msg( m_debug, "STOP speed %d =/= %d", current_speed, previous_speed ); play_ambient_variant_sound( id_and_variant.first, id_and_variant.second, - sfx::get_heard_volume( g->u.pos() ), ch, 1000, pitch ); + sfx::get_heard_volume( player_character.pos() ), ch, 1000, pitch ); add_msg( m_debug, "PITCH %f", pitch ); } previous_speed = current_speed; @@ -765,21 +768,22 @@ void sfx::do_vehicle_exterior_engine_sfx() { static const channel ch = channel::exterior_engine_sound; static const int ch_int = static_cast( ch ); + const Character &player_character = get_player_character(); // early bail-outs for efficiency - if( g->u.in_vehicle ) { + if( player_character.in_vehicle ) { fade_audio_channel( ch, 300 ); add_msg( m_debug, "STOP exterior_engine_sound, IN CAR" ); return; } - if( g->u.in_sleep_state() && !audio_muted ) { + if( player_character.in_sleep_state() && !audio_muted ) { fade_audio_channel( channel::any, 300 ); audio_muted = true; return; - } else if( g->u.in_sleep_state() && audio_muted ) { + } else if( player_character.in_sleep_state() && audio_muted ) { return; } - VehicleList vehs = g->m.get_vehicles(); + VehicleList vehs = get_map().get_vehicles(); unsigned char noise_factor = 0; unsigned char vol = 0; vehicle *veh = nullptr; @@ -787,9 +791,10 @@ void sfx::do_vehicle_exterior_engine_sfx() for( wrapped_vehicle vehicle : vehs ) { if( vehicle.v->vehicle_noise > 0 && vehicle.v->vehicle_noise - - sound_distance( g->u.pos(), vehicle.v->global_pos3() ) > noise_factor ) { + sound_distance( player_character.pos(), vehicle.v->global_pos3() ) > noise_factor ) { - noise_factor = vehicle.v->vehicle_noise - sound_distance( g->u.pos(), vehicle.v->global_pos3() ); + noise_factor = vehicle.v->vehicle_noise - sound_distance( player_character.pos(), + vehicle.v->global_pos3() ); veh = vehicle.v; } } @@ -850,19 +855,20 @@ void sfx::do_vehicle_exterior_engine_sfx() void sfx::do_ambient() { - if( g->u.in_sleep_state() && !audio_muted ) { + const Character &player_character = get_player_character(); + if( player_character.in_sleep_state() && !audio_muted ) { fade_audio_channel( channel::any, 300 ); audio_muted = true; return; - } else if( g->u.in_sleep_state() && audio_muted ) { + } else if( player_character.in_sleep_state() && audio_muted ) { return; } audio_muted = false; - const bool is_deaf = g->u.is_deaf(); - const int heard_volume = get_heard_volume( g->u.pos() ); - const bool is_underground = g->u.pos().z < 0; - const bool is_sheltered = g->is_sheltered( g->u.pos() ); - const bool weather_changed = g->weather.weather != previous_weather; + const bool is_deaf = player_character.is_deaf(); + const int heard_volume = get_heard_volume( player_character.pos() ); + const bool is_underground = player_character.pos().z < 0; + const bool is_sheltered = g->is_sheltered( player_character.pos() ); + const bool weather_changed = get_weather().weather_id != previous_weather; // Step in at night time / we are not indoors if( is_night( calendar::turn ) && !is_sheltered && !is_channel_playing( channel::nighttime_outdoors_env ) && !is_deaf ) { @@ -893,14 +899,16 @@ void sfx::do_ambient() fade_audio_group( group::time_of_day, 1000 ); play_ambient_variant_sound( "environment", "indoors", heard_volume, channel::indoors_env, 1000 ); } + // We are indoors and it is also raining - if( g->weather.weather >= WEATHER_DRIZZLE && g->weather.weather <= WEATHER_ACID_RAIN && - !is_underground - && is_sheltered && !is_channel_playing( channel::indoors_rain_env ) ) { + if( get_weather().weather_id->rains && + get_weather().weather_id->precip != precip_class::very_light && + !is_underground && is_sheltered && !is_channel_playing( channel::indoors_rain_env ) ) { play_ambient_variant_sound( "environment", "indoors_rain", heard_volume, channel::indoors_rain_env, 1000 ); } - if( ( !is_sheltered && g->weather.weather != WEATHER_CLEAR && !is_deaf && + if( ( !is_sheltered && + get_weather().weather_id->sound_category != weather_sound_category::silent && !is_deaf && !is_channel_playing( channel::outdoors_snow_env ) && !is_channel_playing( channel::outdoors_flurry_env ) && !is_channel_playing( channel::outdoors_thunderstorm_env ) && @@ -911,51 +919,45 @@ void sfx::do_ambient() weather_changed && !is_deaf ) ) { fade_audio_group( group::weather, 1000 ); // We are outside and there is precipitation - switch( g->weather.weather ) { - case WEATHER_ACID_DRIZZLE: - case WEATHER_DRIZZLE: - case WEATHER_LIGHT_DRIZZLE: + switch( get_weather().weather_id->sound_category ) { + case weather_sound_category::drizzle: play_ambient_variant_sound( "environment", "WEATHER_DRIZZLE", heard_volume, channel::outdoors_drizzle_env, 1000 ); break; - case WEATHER_RAINY: + case weather_sound_category::rainy: play_ambient_variant_sound( "environment", "WEATHER_RAINY", heard_volume, channel::outdoors_rain_env, 1000 ); break; - case WEATHER_ACID_RAIN: - case WEATHER_THUNDER: - case WEATHER_LIGHTNING: + case weather_sound_category::thunder: play_ambient_variant_sound( "environment", "WEATHER_THUNDER", heard_volume, channel::outdoors_thunderstorm_env, 1000 ); break; - case WEATHER_FLURRIES: + case weather_sound_category::flurries: play_ambient_variant_sound( "environment", "WEATHER_FLURRIES", heard_volume, channel::outdoors_flurry_env, 1000 ); break; - case WEATHER_CLEAR: - case WEATHER_SUNNY: - case WEATHER_CLOUDY: - case WEATHER_SNOWSTORM: + case weather_sound_category::snowstorm: play_ambient_variant_sound( "environment", "WEATHER_SNOWSTORM", heard_volume, channel::outdoor_blizzard, 1000 ); break; - case WEATHER_SNOW: + case weather_sound_category::snow: play_ambient_variant_sound( "environment", "WEATHER_SNOW", heard_volume, channel::outdoors_snow_env, 1000 ); break; - case WEATHER_NULL: - case NUM_WEATHER_TYPES: - // nothing here, those are pseudo-types, they should not be active at all. + case weather_sound_category::silent: + break; + case weather_sound_category::last: + debugmsg( "Invalid weather sound category." ); break; } } // Keep track of weather to compare for next iteration - previous_weather = g->weather.weather; + previous_weather = get_weather().weather_id; } // firing is the item that is fired. It may be the wielded gun, but it can also be an attached @@ -978,8 +980,9 @@ void sfx::generate_gun_sound( const player &source_arg, const item &firing ) int angle = 0; int distance = 0; std::string selected_sound; - // this does not mean p == g->u (it could be a vehicle turret) - if( g->u.pos() == source ) { + const Character &player_character = get_player_character(); + // this does not mean p == avatar (it could be a vehicle turret) + if( player_character.pos() == source ) { selected_sound = "fire_gun"; const auto mods = firing.gunmods(); @@ -992,7 +995,7 @@ void sfx::generate_gun_sound( const player &source_arg, const item &firing ) } else { angle = get_heard_angle( source ); - distance = sound_distance( g->u.pos(), source ); + distance = sound_distance( player_character.pos(), source ); if( distance <= 17 ) { selected_sound = "fire_gun"; } else { @@ -1057,9 +1060,10 @@ sfx::sound_thread::sound_thread( const tripoint &source, const tripoint &target, { // This is function is run in the main thread. const int heard_volume = get_heard_volume( source ); - const player *p = g->critter_at( source ); - if( !p ) { - p = &g->u; + npc *np = g->critter_at( source ); + const player &p = np ? static_cast( *np ) : + dynamic_cast( get_player_character() ); + if( !p.is_npc() ) { // sound comes from the same place as the player is, calculation of angle wouldn't work ang_src = 0; vol_src = heard_volume; @@ -1070,8 +1074,8 @@ sfx::sound_thread::sound_thread( const tripoint &source, const tripoint &target, vol_targ = std::max( heard_volume - 20, 0 ); } ang_targ = get_heard_angle( target ); - weapon_skill = p->weapon.melee_skill(); - weapon_volume = p->weapon.volume() / units::legacy_volume_factor; + weapon_skill = p.weapon.melee_skill(); + weapon_volume = p.weapon.volume() / units::legacy_volume_factor; } // Operator overload required for thread API. @@ -1158,7 +1162,7 @@ void sfx::do_projectile_hit( const Creature &target ) play_variant_sound( "bullet_hit", "hit_flesh", heard_volume, angle, 0.8, 1.2 ); } -void sfx::do_player_death_hurt( const player &target, bool death ) +void sfx::do_player_death_hurt( const Character &target, bool death ) { int heard_volume = get_heard_volume( target.pos() ); const bool male = target.male; @@ -1175,19 +1179,20 @@ void sfx::do_player_death_hurt( const player &target, bool death ) void sfx::do_danger_music() { - if( g->u.in_sleep_state() && !audio_muted ) { + Character &player_character = get_player_character(); + if( player_character.in_sleep_state() && !audio_muted ) { fade_audio_channel( channel::any, 100 ); audio_muted = true; return; - } else if( ( g->u.in_sleep_state() && audio_muted ) || + } else if( ( player_character.in_sleep_state() && audio_muted ) || is_channel_playing( channel::chainsaw_theme ) ) { fade_audio_group( group::context_themes, 1000 ); return; } audio_muted = false; int hostiles = 0; - for( auto &critter : g->u.get_visible_creatures( 40 ) ) { - if( g->u.attitude_to( *critter ) == Creature::Attitude::HOSTILE ) { + for( auto &critter : player_character.get_visible_creatures( 40 ) ) { + if( player_character.attitude_to( *critter ) == Creature::Attitude::HOSTILE ) { hostiles++; } } @@ -1225,43 +1230,46 @@ void sfx::do_danger_music() void sfx::do_fatigue() { + Character &player_character = get_player_character(); /*15: Stamina 75% 16: Stamina 50% 17: Stamina 25%*/ - if( g->u.get_stamina() >= g->u.get_stamina_max() * .75 ) { + if( player_character.get_stamina() >= player_character.get_stamina_max() * .75 ) { fade_audio_group( group::fatigue, 2000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .74 - && g->u.get_stamina() >= g->u.get_stamina_max() * .5 && - g->u.male && !is_channel_playing( channel::stamina_75 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .74 && + player_character.get_stamina() >= player_character.get_stamina_max() * .5 && + player_character.male && !is_channel_playing( channel::stamina_75 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_m_low", 100, channel::stamina_75, 1000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .49 - && g->u.get_stamina() >= g->u.get_stamina_max() * .25 && - g->u.male && !is_channel_playing( channel::stamina_50 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .49 && + player_character.get_stamina() >= player_character.get_stamina_max() * .25 && + player_character.male && !is_channel_playing( channel::stamina_50 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_m_med", 100, channel::stamina_50, 1000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .24 && g->u.get_stamina() >= 0 && - g->u.male && !is_channel_playing( channel::stamina_35 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .24 && + player_character.get_stamina() >= 0 && player_character.male && + !is_channel_playing( channel::stamina_35 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_m_high", 100, channel::stamina_35, 1000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .74 - && g->u.get_stamina() >= g->u.get_stamina_max() * .5 && - !g->u.male && !is_channel_playing( channel::stamina_75 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .74 && + player_character.get_stamina() >= player_character.get_stamina_max() * .5 && + !player_character.male && !is_channel_playing( channel::stamina_75 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_f_low", 100, channel::stamina_75, 1000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .49 - && g->u.get_stamina() >= g->u.get_stamina_max() * .25 && - !g->u.male && !is_channel_playing( channel::stamina_50 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .49 && + player_character.get_stamina() >= player_character.get_stamina_max() * .25 && + !player_character.male && !is_channel_playing( channel::stamina_50 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_f_med", 100, channel::stamina_50, 1000 ); return; - } else if( g->u.get_stamina() <= g->u.get_stamina_max() * .24 && g->u.get_stamina() >= 0 && - !g->u.male && !is_channel_playing( channel::stamina_35 ) ) { + } else if( player_character.get_stamina() <= player_character.get_stamina_max() * .24 && + player_character.get_stamina() >= 0 && !player_character.male && + !is_channel_playing( channel::stamina_35 ) ) { fade_audio_group( group::fatigue, 1000 ); play_ambient_variant_sound( "plmove", "fatigue_f_high", 100, channel::stamina_35, 1000 ); return; @@ -1302,8 +1310,9 @@ void sfx::do_footstep() end_sfx_timestamp = std::chrono::high_resolution_clock::now(); sfx_time = end_sfx_timestamp - start_sfx_timestamp; if( std::chrono::duration_cast ( sfx_time ).count() > 400 ) { - int heard_volume = sfx::get_heard_volume( g->u.pos() ); - const auto terrain = g->m.ter( g->u.pos() ).id(); + const Character &player_character = get_player_character(); + int heard_volume = sfx::get_heard_volume( player_character.pos() ); + const auto terrain = get_map().ter( player_character.pos() ).id(); static const std::set grass = { ter_str_id( "t_grass" ), ter_str_id( "t_shrub" ), @@ -1394,7 +1403,7 @@ void sfx::do_footstep() static const std::set chain_fence = { ter_str_id( "t_chainfence" ), }; - if( !g->u.wearing_something_on( bodypart_id( "foot_l" ) ) ) { + if( !player_character.wearing_something_on( bodypart_id( "foot_l" ) ) ) { play_variant_sound( "plmove", "walk_barefoot", heard_volume, 0, 0.8, 1.2 ); start_sfx_timestamp = std::chrono::high_resolution_clock::now(); return; @@ -1432,7 +1441,7 @@ void sfx::do_footstep() void sfx::do_obstacle( const std::string &obst ) { - int heard_volume = sfx::get_heard_volume( g->u.pos() ); + int heard_volume = sfx::get_heard_volume( get_player_character().pos() ); if( sfx::has_variant_sound( "plmove", obst ) ) { play_variant_sound( "plmove", obst, heard_volume, 0, 0.8, 1.2 ); } else if( ter_str_id( obst ).is_valid() && @@ -1446,8 +1455,9 @@ void sfx::do_obstacle( const std::string &obst ) void sfx::play_activity_sound( const std::string &id, const std::string &variant, int volume ) { - if( act != g->u.activity.id() ) { - act = g->u.activity.id(); + Character &player_character = get_player_character(); + if( act != player_character.activity.id() ) { + act = player_character.activity.id(); play_ambient_variant_sound( id, variant, volume, channel::player_activities, 0 ); } } @@ -1498,7 +1508,7 @@ bool sfx::has_variant_sound( const std::string &, const std::string & ) } void sfx::stop_sound_effect_fade( channel, int ) { } void sfx::stop_sound_effect_timed( channel, int ) {} -void sfx::do_player_death_hurt( const player &, bool ) { } +void sfx::do_player_death_hurt( const Character &, bool ) { } void sfx::do_fatigue() { } void sfx::do_obstacle( const std::string & ) { } /*@}*/ @@ -1510,7 +1520,7 @@ void sfx::do_obstacle( const std::string & ) { } /*@{*/ int sfx::get_heard_volume( const tripoint &source ) { - int distance = sound_distance( g->u.pos(), source ); + int distance = sound_distance( get_player_character().pos(), source ); // fract = -100 / 24 const float fract = -4.166666; int heard_volume = fract * distance - 1 + 100; @@ -1523,7 +1533,7 @@ int sfx::get_heard_volume( const tripoint &source ) int sfx::get_heard_angle( const tripoint &source ) { - int angle = coord_to_angle( g->u.pos(), source ) + 90; + int angle = coord_to_angle( get_player_character().pos(), source ) + 90; //add_msg(m_warning, "angle: %i", angle); return ( angle ); } diff --git a/src/sounds.h b/src/sounds.h index 1420f41702410..e33d1ab20fd1c 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -6,6 +6,7 @@ #include #include +class Character; class Creature; class JsonObject; class item; @@ -157,7 +158,7 @@ bool has_variant_sound( const std::string &id, const std::string &variant ); void stop_sound_effect_fade( channel channel, int duration ); void stop_sound_effect_timed( channel channel, int time ); int set_channel_volume( channel channel, int volume ); -void do_player_death_hurt( const player &target, bool death ); +void do_player_death_hurt( const Character &target, bool death ); void do_fatigue(); // @param obst should be string id of obstacle terrain or vehicle part void do_obstacle( const std::string &obst = "" ); diff --git a/src/start_location.cpp b/src/start_location.cpp index 4b511fb9a594a..17060dc6a3d2d 100644 --- a/src/start_location.cpp +++ b/src/start_location.cpp @@ -117,7 +117,7 @@ static void add_boardable( const map &m, const tripoint &p, std::vector &range ) { std::vector furnitures1; std::vector furnitures2; @@ -159,9 +159,10 @@ static void board_up( map &m, const tripoint_range &range ) continue; } // If the furniture is movable and the character can move it, use it to barricade - // g->u is workable here as NPCs by definition are not starting the game. (Let's hope.) + // is workable here as NPCs by definition are not starting the game. (Let's hope.) ///\EFFECT_STR determines what furniture might be used as a starting area barricade - if( m.furn( p ).obj().is_movable() && m.furn( p ).obj().move_str_req < g->u.get_str() ) { + if( m.furn( p ).obj().is_movable() && + m.furn( p ).obj().move_str_req < get_player_character().get_str() ) { if( m.furn( p ).obj().movecost == 0 ) { // Obstacles are better, prefer them furnitures1.push_back( p ); @@ -288,13 +289,13 @@ static int rate_location( map &m, const tripoint &p, const bool must_be_inside, 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; + map &here = get_map(); // Start us off somewhere in the center of the map u.setx( HALF_MAPSIZE_X ); u.sety( HALF_MAPSIZE_Y ); u.setz( g->get_levz() ); - m.invalidate_map_cache( m.get_abs_sub().z ); - m.build_map_cache( m.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z ); + here.build_map_cache( here.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 // TODO: Allow using items here @@ -315,7 +316,7 @@ void start_location::place_player( player &u ) const int tries = 0; const auto check_spot = [&]( const tripoint & pt ) { tries++; - const int rate = rate_location( m, pt, must_be_inside, bash, tries, checked ); + const int rate = rate_location( here, pt, must_be_inside, bash, tries, checked ); if( best_rate < rate ) { best_rate = rate; u.setpos( pt ); @@ -355,7 +356,8 @@ void start_location::burn( const tripoint &omtstart, const size_t count, const i tinymap m; m.load( player_location, false ); m.build_outside_cache( m.get_abs_sub().z ); - const point u( g->u.posx() % HALF_MAPSIZE_X, g->u.posy() % HALF_MAPSIZE_Y ); + point player_pos = get_player_character().pos().xy(); + const point u( player_pos.x % HALF_MAPSIZE_X, player_pos.y % HALF_MAPSIZE_Y ); std::vector valid; for( const tripoint &p : m.points_on_zlevel() ) { if( !( m.has_flag_ter( "DOOR", p ) || @@ -387,24 +389,25 @@ void start_location::add_map_extra( const tripoint &omtstart, const std::string void start_location::handle_heli_crash( player &u ) const { - for( int i = 2; i < num_hp_parts; i++ ) { // Skip head + torso for balance reasons. - const auto part = static_cast( i ); - const auto bp_part = player::hp_to_bp( part ); + for( const bodypart_id &bp : u.get_all_body_parts() ) { + if( bp == bodypart_id( "head" ) || bp == bodypart_id( "torso" ) ) { + continue;// Skip head + torso for balance reasons. + } const int roll = static_cast( rng( 1, 8 ) ); switch( roll ) { // Damage + Bleed case 1: case 2: - u.make_bleed( convert_bp( bp_part ).id(), 6_minutes ); + u.make_bleed( bp, 6_minutes ); /* fallthrough */ case 3: case 4: // Just damage case 5: { - const auto maxHp = u.get_hp_max( part ); + const int maxHp = u.get_hp_max( bp ); // Body part health will range from 33% to 66% with occasional bleed const int dmg = static_cast( rng( maxHp / 3, maxHp * 2 / 3 ) ); - u.apply_damage( nullptr, convert_bp( bp_part ).id(), dmg ); + u.apply_damage( nullptr, bp, dmg ); break; } // No damage diff --git a/src/stomach.cpp b/src/stomach.cpp index a3c31c9ecbb64..3c5c24c9b99f7 100644 --- a/src/stomach.cpp +++ b/src/stomach.cpp @@ -18,6 +18,16 @@ static const trait_id trait_GOURMAND( "GOURMAND" ); static const trait_id trait_HIBERNATE( "HIBERNATE" ); static const trait_id trait_SLIMESPAWNER( "SLIMESPAWNER" ); +//size mutations now affect this, so we have to define them first +static const trait_id trait_SMALL( "SMALL" ); +static const trait_id trait_SMALL2( "SMALL2" ); +static const trait_id trait_SMALL_OK( "SMALL_OK" ); +static const trait_id trait_LARGE( "LARGE" ); +static const trait_id trait_LARGE_OK( "LARGE_OK" ); +static const trait_id trait_HUGE( "HUGE" ); +static const trait_id trait_HUGE_OK( "HUGE_OK" ); +//done defining, the new things start at line 184 + void nutrients::min_in_place( const nutrients &r ) { kcal = std::min( kcal, r.kcal ); @@ -170,6 +180,30 @@ units::volume stomach_contents::capacity( const Character &owner ) const if( owner.has_trait( trait_SLIMESPAWNER ) ) { max_mod *= 3; } + + //Huge, for example, makes you roughly x2 larger, so stomach size is doubled + //The scientifically correct approach would be x8 stomach size, due to square-cube law, but that would break the game + //The same 'square-cube law is ignored for balance' reasoning is applied to the other size category mutations + // -ungen + + //else if because they're mutually exclusive, that way we save a lot of uneccesary checks -ungen + if( owner.has_trait( trait_SMALL_OK ) ) { + max_mod *= 0.5; + } else if( owner.has_trait( trait_SMALL2 ) ) { + max_mod *= 0.5; + } else if( owner.has_trait( trait_SMALL ) ) { + max_mod *= 0.75; + } else if( owner.has_trait( trait_LARGE ) ) { + max_mod *= 1.5; + } else if( owner.has_trait( trait_LARGE_OK ) ) { + max_mod *= 1.5; + } else if( owner.has_trait( trait_HUGE ) ) { + max_mod *= 2; + } else if( owner.has_trait( trait_HUGE_OK ) ) { + max_mod *= 2; + } + //I thought this would be a lot harder to code, boy I was wrong -ungen + return max_volume * max_mod; } diff --git a/src/submap.cpp b/src/submap.cpp index f01fda2f6a081..bffdd1c0d00e3 100644 --- a/src/submap.cpp +++ b/src/submap.cpp @@ -160,7 +160,7 @@ void submap::update_legacy_computer() if( legacy_computer ) { for( int x = 0; x < SEEX; ++x ) { for( int y = 0; y < SEEY; ++y ) { - if( ter[x][y] == t_console ) { + if( frn[x][y] == furn_str_id( "f_console" ) ) { computers.emplace( point( x, y ), *legacy_computer ); } } @@ -171,7 +171,8 @@ void submap::update_legacy_computer() bool submap::has_computer( const point &p ) const { - return computers.find( p ) != computers.end() || ( legacy_computer && ter[p.x][p.y] == t_console ); + return computers.find( p ) != computers.end() || ( legacy_computer && frn[p.x][p.y] + == furn_str_id( "f_console" ) ); } const computer *submap::get_computer( const point &p ) const @@ -182,7 +183,7 @@ const computer *submap::get_computer( const point &p ) const if( it != computers.end() ) { return &it->second; } - if( legacy_computer && ter[p.x][p.y] == t_console ) { + if( legacy_computer && frn[p.x][p.y] == furn_str_id( "f_console" ) ) { return legacy_computer.get(); } return nullptr; @@ -192,7 +193,7 @@ computer *submap::get_computer( const point &p ) { // need to update to std::map first so modifications to the returned object // only affects the exact point p - update_legacy_computer(); + //update_legacy_computer(); const auto it = computers.find( p ); if( it != computers.end() ) { return &it->second; @@ -202,7 +203,7 @@ computer *submap::get_computer( const point &p ) void submap::set_computer( const point &p, const computer &c ) { - update_legacy_computer(); + //update_legacy_computer(); const auto it = computers.find( p ); if( it != computers.end() ) { it->second = c; diff --git a/src/suffer.cpp b/src/suffer.cpp index 762ea1d9d2779..caefaa6939202 100644 --- a/src/suffer.cpp +++ b/src/suffer.cpp @@ -13,7 +13,6 @@ #include #include "addiction.h" -#include "avatar.h" #include "bodypart.h" #include "calendar.h" #include "cata_utility.h" @@ -166,6 +165,7 @@ static const std::string flag_BLIND( "BLIND" ); static const std::string flag_PLOWABLE( "PLOWABLE" ); static const std::string flag_RAD_RESIST( "RAD_RESIST" ); static const std::string flag_SUN_GLASSES( "SUN_GLASSES" ); +static const std::string flag_TOURNIQUET( "TOURNIQUET" ); static float addiction_scaling( float at_min, float at_max, float add_lvl ) { @@ -179,20 +179,20 @@ static float addiction_scaling( float at_min, float at_max, float add_lvl ) void Character::suffer_water_damage( const mutation_branch &mdata ) { - for( const bodypart_id &bp : get_all_body_parts() ) { - const float wetness_percentage = static_cast( body_wetness[bp->token] ) / - drench_capacity[bp->token]; + for( const std::pair &elem : get_body() ) { + const float wetness_percentage = static_cast( body_wetness[elem.first->token] ) / + drench_capacity[elem.first->token]; const int dmg = mdata.weakness_to_water * wetness_percentage; if( dmg > 0 ) { - apply_damage( nullptr, bp, dmg ); + apply_damage( nullptr, elem.first, dmg ); add_msg_player_or_npc( m_bad, _( "Your %s is damaged by the water." ), _( "'s %s is damaged by the water." ), - body_part_name( bp ) ); - } else if( dmg < 0 && hp_cur[bp_to_hp( bp->token )] != hp_max[bp_to_hp( bp->token )] ) { - heal( bp->token, std::abs( dmg ) ); + body_part_name( elem.first ) ); + } else if( dmg < 0 && elem.second.is_at_max_hp() ) { + heal( elem.first, std::abs( dmg ) ); add_msg_player_or_npc( m_good, _( "Your %s is healed by the water." ), _( "'s %s is healed by the water." ), - body_part_name( bp ) ); + body_part_name( elem.first ) ); } } } @@ -262,7 +262,7 @@ void Character::suffer_while_underwater() apply_damage( nullptr, bodypart_id( "torso" ), rng( 1, 4 ) ); } } - if( has_trait( trait_FRESHWATEROSMOSIS ) && !g->m.has_flag_ter( "SALT_WATER", pos() ) && + if( has_trait( trait_FRESHWATEROSMOSIS ) && !get_map().has_flag_ter( "SALT_WATER", pos() ) && get_thirst() > -60 ) { mod_thirst( -1 ); } @@ -630,9 +630,11 @@ void Character::suffer_from_asthma( const int current_stim ) add_msg_player_or_npc( m_bad, _( "You have an asthma attack!" ), " starts wheezing and coughing." ); + map &here = get_map(); if( in_sleep_state() && !has_effect( effect_narcosis ) ) { inventory map_inv; - map_inv.form_from_map( g->u.pos(), 2, &g->u ); + Character &player_character = get_player_character(); + map_inv.form_from_map( player_character.pos(), 2, &player_character ); // check if an inhaler is somewhere near bool nearby_use = auto_use || oxygenator || map_inv.has_charges( itype_inhaler, 1 ) || map_inv.has_charges( itype_oxygen_tank, 1 ) || @@ -653,10 +655,10 @@ void Character::suffer_from_asthma( const int current_stim ) } else if( nearby_use ) { // create new variable to resolve a reference issue int amount = 1; - if( !g->m.use_charges( g->u.pos(), 2, itype_inhaler, amount ).empty() ) { + if( !here.use_charges( player_character.pos(), 2, itype_inhaler, amount ).empty() ) { add_msg_if_player( m_info, _( "You use your inhaler and go back to sleep." ) ); - } else if( !g->m.use_charges( g->u.pos(), 2, itype_oxygen_tank, amount ).empty() || - !g->m.use_charges( g->u.pos(), 2, itype_smoxygen_tank, amount ).empty() ) { + } else if( !here.use_charges( player_character.pos(), 2, itype_oxygen_tank, amount ).empty() || + !here.use_charges( player_character.pos(), 2, itype_smoxygen_tank, amount ).empty() ) { add_msg_if_player( m_info, _( "You take a deep breath from your oxygen tank " "and go back to sleep." ) ); } @@ -718,10 +720,10 @@ void Character::suffer_in_sunlight() const bool leafier = has_trait( trait_LEAVES2 ) || has_trait( trait_LEAVES3 ); const bool leafiest = has_trait( trait_LEAVES3 ); int sunlight_nutrition = 0; - if( leafy && g->m.is_outside( pos() ) && ( g->light_level( pos().z ) >= 40 ) ) { - const float weather_factor = ( g->weather.weather == WEATHER_CLEAR || - g->weather.weather == WEATHER_SUNNY ) ? 1.0 : 0.5; - const int player_local_temp = g->weather.get_temperature( pos() ); + if( leafy && get_map().is_outside( pos() ) && ( g->light_level( pos().z ) >= 40 ) ) { + const float weather_factor = ( get_weather().weather_id->sun_intensity >= + sun_intensity_type::normal ) ? 1.0 : 0.5; + const int player_local_temp = get_weather().get_temperature( pos() ); int flux = ( player_local_temp - 65 ) / 2; if( !has_hat ) { sunlight_nutrition += ( 100 + flux ) * weather_factor; @@ -764,7 +766,7 @@ void Character::suffer_in_sunlight() } if( ( has_trait( trait_TROGLO ) || has_trait( trait_TROGLO2 ) ) && - g->weather.weather == WEATHER_SUNNY ) { + get_weather().weather_id->sun_intensity >= sun_intensity_type::high ) { mod_str_bonus( -1 ); mod_dex_bonus( -1 ); add_miss_reason( _( "The sunlight distracts you." ), 1 ); @@ -882,9 +884,10 @@ void Character::suffer_from_albinism() void Character::suffer_from_other_mutations() { + map &here = get_map(); if( has_trait( trait_SHARKTEETH ) && one_turn_in( 24_hours ) ) { add_msg_if_player( m_neutral, _( "You shed a tooth!" ) ); - g->m.spawn_item( pos(), "bone", 1 ); + here.spawn_item( pos(), "bone", 1 ); } if( has_active_mutation( trait_WINGS_INSECT ) ) { @@ -896,7 +899,7 @@ void Character::suffer_from_other_mutations() bool wearing_shoes = is_wearing_shoes( side::LEFT ) || is_wearing_shoes( side::RIGHT ); int root_vitamins = 0; int root_water = 0; - if( has_trait( trait_ROOTS3 ) && g->m.has_flag( flag_PLOWABLE, pos() ) && !wearing_shoes ) { + if( has_trait( trait_ROOTS3 ) && here.has_flag( flag_PLOWABLE, pos() ) && !wearing_shoes ) { root_vitamins += 1; if( get_thirst() <= -2000 ) { root_water += 51; @@ -917,8 +920,8 @@ void Character::suffer_from_other_mutations() } if( has_trait( trait_SORES ) ) { - for( const body_part bp : all_body_parts ) { - if( bp == bp_head ) { + for( const bodypart_id bp : get_all_body_parts() ) { + if( bp == bodypart_id( "head" ) ) { continue; } int sores_pain = 5 + 0.4 * std::abs( encumb( bp ) ); @@ -930,7 +933,7 @@ void Character::suffer_from_other_mutations() //Web Weavers...weave web if( has_active_mutation( trait_WEB_WEAVER ) && !in_vehicle ) { // this adds intensity to if its not already there. - g->m.add_field( pos(), fd_web, 1 ); + here.add_field( pos(), fd_web, 1 ); } @@ -955,7 +958,7 @@ void Character::suffer_from_other_mutations() if( has_trait( trait_WEB_SPINNER ) && !in_vehicle && one_in( 3 ) ) { // this adds intensity to if its not already there. - g->m.add_field( pos(), fd_web, 1 ); + here.add_field( pos(), fd_web, 1 ); } bool should_mutate = has_trait( trait_UNSTABLE ) && !has_trait( trait_CHAOTIC_BAD ) && @@ -990,9 +993,10 @@ void Character::suffer_from_other_mutations() void Character::suffer_from_radiation() { + map &here = get_map(); // checking for radioactive items in inventory const int item_radiation = leak_level( "RADIOACTIVE" ); - const int map_radiation = g->m.get_radiation( pos() ); + const int map_radiation = here.get_radiation( pos() ); float rads = map_radiation / 100.0f + item_radiation / 10.0f; int rad_mut = 0; @@ -1025,8 +1029,8 @@ void Character::suffer_from_radiation() // If you can't, irradiate the player instead tripoint rad_point = pos() + point( rng( -3, 3 ), rng( -3, 3 ) ); // TODO: Radioactive vehicles? - if( g->m.get_radiation( rad_point ) < rad_mut ) { - g->m.adjust_radiation( rad_point, 1 ); + if( here.get_radiation( rad_point ) < rad_mut ) { + here.adjust_radiation( rad_point, 1 ); } else { rads += rad_mut; } @@ -1186,7 +1190,7 @@ void Character::suffer_from_bad_bionics() add_msg_if_player( m_bad, _( "You suffer a burning acidic discharge!" ) ); hurtall( 1, nullptr ); sfx::play_variant_sound( "bionics", "acid_discharge", 100 ); - sfx::do_player_death_hurt( g->u, false ); + sfx::do_player_death_hurt( get_player_character(), false ); } if( has_bionic( bio_drain ) && get_power_level() > 24_kJ && one_turn_in( 1_hours ) ) { add_msg_if_player( m_bad, _( "Your batteries discharge slightly." ) ); @@ -1259,9 +1263,9 @@ void Character::suffer_from_artifacts() } if( has_artifact_with( AEP_BAD_WEATHER ) && calendar::once_every( 1_minutes ) && - g->weather.weather != WEATHER_SNOWSTORM ) { - g->weather.weather_override = WEATHER_SNOWSTORM; - g->weather.set_nextweather( calendar::turn ); + get_weather().weather_id->precip < precip_class::heavy ) { + get_weather().weather_override = get_bad_weather(); + get_weather().set_nextweather( calendar::turn ); } if( has_artifact_with( AEP_MUTAGENIC ) && one_turn_in( 48_hours ) ) { @@ -1421,6 +1425,18 @@ void Character::suffer_without_sleep( const int sleep_deprivation ) } } +void Character::suffer_from_tourniquet() +{ + for( const bodypart_id &bp : get_all_body_parts( true ) ) { + if( worn_with_flag( flag_TOURNIQUET, bp ) && one_turn_in( 30_seconds ) ) { + mod_pain( 1 ); + apply_damage( nullptr, bp, 1, true ); + add_msg_player_or_npc( m_bad, _( "Your tourniquet hurts you." ), + _( " is hurting from the tourniquet." ) ); + } + } +} + void Character::suffer_from_pain() { } @@ -1429,10 +1445,10 @@ void Character::suffer() { const int current_stim = get_stim(); // TODO: Remove this section and encapsulate hp_cur - for( int i = 0; i < num_hp_parts; i++ ) { - body_part bp = hp_to_bp( static_cast( i ) ); - if( hp_cur[i] <= 0 ) { - add_effect( effect_disabled, 1_turns, bp, true ); + for( const std::pair &elem : get_body() ) { + if( elem.second.get_hp_cur() <= 0 ) { + add_effect( effect_disabled, 1_turns, elem.first->token, true ); + g->events().send( getID(), elem.first->token ); } } @@ -1482,6 +1498,7 @@ void Character::suffer() } suffer_without_sleep( sleep_deprivation ); + suffer_from_tourniquet(); suffer_from_pain(); } @@ -1560,8 +1577,8 @@ void Character::mend( int rate_multiplier ) { // Wearing splints can slowly mend a broken limb back to 1 hp. bool any_broken = false; - for( int i = 0; i < num_hp_parts; i++ ) { - if( is_limb_broken( static_cast( i ) ) ) { + for( const bodypart_id &bp : get_all_body_parts() ) { + if( is_limb_broken( bp ) ) { any_broken = true; break; } @@ -1628,33 +1645,32 @@ void Character::mend( int rate_multiplier ) return; } - for( int i = 0; i < num_hp_parts; i++ ) { - const bool broken = is_limb_broken( static_cast( i ) ); + for( const bodypart_id &bp : get_all_body_parts() ) { + const bool broken = is_limb_broken( bp ); if( !broken ) { continue; } - const bodypart_id &part = convert_bp( hp_to_bp( static_cast( i ) ) ).id(); - if( needs_splint && !worn_with_flag( "SPLINT", part ) ) { + if( needs_splint && !worn_with_flag( "SPLINT", bp ) ) { continue; } const time_duration dur_inc = 1_turns * roll_remainder( rate_multiplier * healing_factor ); - auto &eff = get_effect( effect_mending, part->token ); + auto &eff = get_effect( effect_mending, bp->token ); if( eff.is_null() ) { - add_effect( effect_mending, dur_inc, part->token, true ); + add_effect( effect_mending, dur_inc, bp->token, true ); continue; } eff.set_duration( eff.get_duration() + dur_inc ); if( eff.get_duration() >= eff.get_max_duration() ) { - hp_cur[i] = 1; - remove_effect( effect_mending, part->token ); - g->events().send( getID(), part->token ); + set_part_hp_cur( bp, 1 ); + remove_effect( effect_mending, bp->token ); + g->events().send( getID(), bp->token ); //~ %s is bodypart add_msg_if_player( m_good, _( "Your %s has started to mend!" ), - body_part_name( part ) ); + body_part_name( bp ) ); } } } diff --git a/src/teleport.cpp b/src/teleport.cpp index 33b53823bf757..c420880121dd6 100644 --- a/src/teleport.cpp +++ b/src/teleport.cpp @@ -3,9 +3,9 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" +#include "character.h" #include "creature.h" #include "debug.h" #include "enums.h" @@ -14,7 +14,6 @@ #include "game.h" #include "map.h" #include "messages.h" -#include "player.h" #include "point.h" #include "rng.h" #include "translations.h" @@ -30,11 +29,12 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, debugmsg( "ERROR: Function teleport::teleport called with invalid arguments." ); return false; } - player *const p = critter.as_player(); - const bool c_is_u = p != nullptr && p == &g->u; + Character *const p = critter.as_character(); + const bool c_is_u = p != nullptr && p->is_avatar(); int tries = 0; tripoint origin = critter.pos(); tripoint new_pos = origin; + map &here = get_map(); //The teleportee is dimensionally anchored so nothing happens if( p && ( p->worn_with_flag( "DIMENSIONAL_ANCHOR" ) || p->has_effect_with_flag( "DIMENSIONAL_ANCHOR" ) ) ) { @@ -47,9 +47,9 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, new_pos.x = origin.x + rdistance * std::cos( rangle ); new_pos.y = origin.y + rdistance * std::sin( rangle ); tries++; - } while( g->m.impassable( new_pos ) && tries < 20 ); + } while( here.impassable( new_pos ) && tries < 20 ); //handles teleporting into solids. - if( g->m.impassable( new_pos ) ) { + if( here.impassable( new_pos ) ) { if( safe ) { if( c_is_u ) { add_msg( m_bad, _( "You cannot teleport safely." ) ); @@ -58,7 +58,7 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, } critter.apply_damage( nullptr, bodypart_id( "torso" ), 9999 ); if( c_is_u ) { - g->events().send( p->getID(), g->m.obstacle_name( new_pos ) ); + g->events().send( p->getID(), here.obstacle_name( new_pos ) ); add_msg( m_bad, _( "You die after teleporting into a solid." ) ); } critter.check_dead_state(); @@ -66,7 +66,7 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, } //handles telefragging other creatures if( Creature *const poor_soul = g->critter_at( new_pos ) ) { - player *const poor_player = dynamic_cast( poor_soul ); + Character *const poor_player = dynamic_cast( poor_soul ); if( safe ) { if( c_is_u ) { add_msg( m_bad, _( "You cannot teleport safely." ) ); @@ -77,7 +77,7 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, poor_player->add_msg_if_player( m_warning, _( "You feel disjointed." ) ); return false; } else { - const bool poor_soul_is_u = ( poor_soul == &g->u ); + const bool poor_soul_is_u = poor_soul->is_avatar(); if( poor_soul_is_u ) { add_msg( m_bad, _( "…" ) ); add_msg( m_bad, _( "You explode into thousands of fragments." ) ); @@ -89,7 +89,7 @@ bool teleport::teleport( Creature &critter, int min_distance, int max_distance, poor_soul->disp_name() ); g->events().send( p->getID(), poor_soul->get_name() ); } else { - if( g->u.sees( *poor_soul ) ) { + if( get_player_character().sees( *poor_soul ) ) { add_msg( m_good, _( "%1$s teleports into %2$s, killing them!" ), critter.disp_name(), poor_soul->disp_name() ); } diff --git a/src/timed_event.cpp b/src/timed_event.cpp index 4d0ca8439bff2..1fd1e629d68e8 100644 --- a/src/timed_event.cpp +++ b/src/timed_event.cpp @@ -49,20 +49,22 @@ timed_event::timed_event( timed_event_type e_t, const time_point &w, int f_id, t void timed_event::actualize() { + avatar &player_character = get_avatar(); + map &here = get_map(); switch( type ) { case timed_event_type::HELP: debugmsg( "Currently disabled while NPC and monster factions are being rewritten." ); break; case timed_event_type::ROBOT_ATTACK: { - const auto u_pos = g->u.global_sm_location(); + const auto u_pos = player_character.global_sm_location(); if( rl_dist( u_pos, map_point ) <= 4 ) { const mtype_id &robot_type = one_in( 2 ) ? mon_copbot : mon_riotbot; - g->events().send( g->u.getID() ); + g->events().send( player_character.getID() ); point rob( u_pos.x > map_point.x ? 0 - SEEX * 2 : SEEX * 4, u_pos.y > map_point.y ? 0 - SEEY * 2 : SEEY * 4 ); - g->place_critter_at( robot_type, tripoint( rob, g->u.posz() ) ); + g->place_critter_at( robot_type, tripoint( rob, player_character.posz() ) ); } } break; @@ -76,17 +78,18 @@ void timed_event::actualize() pgettext( "memorial_female", "Drew the attention of more dark wyrms!" ) ); int num_wyrms = rng( 1, 4 ); for( int i = 0; i < num_wyrms; i++ ) { - if( monster *const mon = g->place_critter_around( mon_dark_wyrm, g->u.pos(), 2 ) ) { - g->m.ter_set( mon->pos(), t_rock_floor ); + if( monster *const mon = g->place_critter_around( mon_dark_wyrm, player_character.pos(), 2 ) ) { + here.ter_set( mon->pos(), t_rock_floor ); } } // You could drop the flag, you know. - if( g->u.has_amount( itype_petrified_eye, 1 ) ) { - sounds::sound( g->u.pos(), 60, sounds::sound_t::alert, _( "a tortured scream!" ), false, "shout", + if( player_character.has_amount( itype_petrified_eye, 1 ) ) { + sounds::sound( player_character.pos(), 60, sounds::sound_t::alert, _( "a tortured scream!" ), false, + "shout", "scream_tortured" ); - if( !g->u.is_deaf() ) { + if( !player_character.is_deaf() ) { add_msg( _( "The eye you're carrying lets out a tortured scream!" ) ); - g->u.add_morale( MORALE_SCREAM, -15, 0, 30_minutes, 30_seconds ); + player_character.add_morale( MORALE_SCREAM, -15, 0, 30_minutes, 30_seconds ); } } // They just keep coming! @@ -102,20 +105,20 @@ void timed_event::actualize() int num_horrors = rng( 3, 5 ); cata::optional fault_point; bool horizontal = false; - for( const tripoint &p : g->m.points_on_zlevel() ) { - if( g->m.ter( p ) == t_fault ) { + for( const tripoint &p : here.points_on_zlevel() ) { + if( here.ter( p ) == t_fault ) { fault_point = p; - horizontal = g->m.ter( p + tripoint_east ) == t_fault || g->m.ter( p + tripoint_west ) == t_fault; + horizontal = here.ter( p + tripoint_east ) == t_fault || here.ter( p + tripoint_west ) == t_fault; break; } } for( int i = 0; fault_point && i < num_horrors; i++ ) { for( int tries = 0; tries < 10; ++tries ) { - tripoint monp = g->u.pos(); + tripoint monp = player_character.pos(); if( horizontal ) { monp.x = rng( fault_point->x, fault_point->x + 2 * SEEX - 8 ); for( int n = -1; n <= 1; n++ ) { - if( g->m.ter( point( monp.x, fault_point->y + n ) ) == t_rock_floor ) { + if( here.ter( point( monp.x, fault_point->y + n ) ) == t_rock_floor ) { monp.y = fault_point->y + n; } } @@ -123,7 +126,7 @@ void timed_event::actualize() // Vertical fault monp.y = rng( fault_point->y, fault_point->y + 2 * SEEY - 8 ); for( int n = -1; n <= 1; n++ ) { - if( g->m.ter( point( fault_point->x + n, monp.y ) ) == t_rock_floor ) { + if( here.ter( point( fault_point->x + n, monp.y ) ) == t_rock_floor ) { monp.x = fault_point->x + n; } } @@ -138,9 +141,9 @@ void timed_event::actualize() case timed_event_type::ROOTS_DIE: g->events().send(); - for( const tripoint &p : g->m.points_on_zlevel() ) { - if( g->m.ter( p ) == t_root_wall && one_in( 3 ) ) { - g->m.ter_set( p, t_underbrush ); + for( const tripoint &p : here.points_on_zlevel() ) { + if( here.ter( p ) == t_root_wall && one_in( 3 ) ) { + here.ter_set( p, t_underbrush ); } } break; @@ -148,10 +151,10 @@ void timed_event::actualize() case timed_event_type::TEMPLE_OPEN: { g->events().send(); bool saw_grate = false; - for( const tripoint &p : g->m.points_on_zlevel() ) { - if( g->m.ter( p ) == t_grate ) { - g->m.ter_set( p, t_stairs_down ); - if( !saw_grate && g->u.sees( p ) ) { + for( const tripoint &p : here.points_on_zlevel() ) { + if( here.ter( p ) == t_grate ) { + here.ter_set( p, t_stairs_down ); + if( !saw_grate && player_character.sees( p ) ) { saw_grate = true; } } @@ -166,14 +169,14 @@ void timed_event::actualize() bool flooded = false; ter_id flood_buf[MAPSIZE_X][MAPSIZE_Y]; - for( const tripoint &p : g->m.points_on_zlevel() ) { - flood_buf[p.x][p.y] = g->m.ter( p ); + for( const tripoint &p : here.points_on_zlevel() ) { + flood_buf[p.x][p.y] = here.ter( p ); } - for( const tripoint &p : g->m.points_on_zlevel() ) { - if( g->m.ter( p ) == t_water_sh ) { + for( const tripoint &p : here.points_on_zlevel() ) { + if( here.ter( p ) == t_water_sh ) { bool deepen = false; for( const tripoint &w : points_in_radius( p, 1 ) ) { - if( g->m.ter( w ) == t_water_dp ) { + if( here.ter( w ) == t_water_dp ) { deepen = true; break; } @@ -182,10 +185,10 @@ void timed_event::actualize() flood_buf[p.x][p.y] = t_water_dp; flooded = true; } - } else if( g->m.ter( p ) == t_rock_floor ) { + } else if( here.ter( p ) == t_rock_floor ) { bool flood = false; for( const tripoint &w : points_in_radius( p, 1 ) ) { - if( g->m.ter( w ) == t_water_dp || g->m.ter( w ) == t_water_sh ) { + if( here.ter( w ) == t_water_dp || here.ter( w ) == t_water_sh ) { flood = true; break; } @@ -201,8 +204,9 @@ void timed_event::actualize() return; } // Check if we should print a message - if( flood_buf[g->u.posx()][g->u.posy()] != g->m.ter( g->u.pos() ) ) { - if( flood_buf[g->u.posx()][g->u.posy()] == t_water_sh ) { + if( flood_buf[player_character.posx()][player_character.posy()] != here.ter( + player_character.pos() ) ) { + if( flood_buf[player_character.posx()][player_character.posy()] == t_water_sh ) { add_msg( m_warning, _( "Water quickly floods up to your knees." ) ); g->memorial().add( pgettext( "memorial_male", "Water level reached knees." ), @@ -213,12 +217,12 @@ void timed_event::actualize() g->memorial().add( pgettext( "memorial_male", "Water level reached the ceiling." ), pgettext( "memorial_female", "Water level reached the ceiling." ) ); - avatar_action::swim( g->m, g->u, g->u.pos() ); + avatar_action::swim( here, player_character, player_character.pos() ); } } - // flood_buf is filled with correct tiles; now copy them back to g->m - for( const tripoint &p : g->m.points_on_zlevel() ) { - g->m.ter_set( p, flood_buf[p.x][p.y] ); + // flood_buf is filled with correct tiles; now copy them back to here + for( const tripoint &p : here.points_on_zlevel() ) { + here.ter_set( p, flood_buf[p.x][p.y] ); } g->timed_events.add( timed_event_type::TEMPLE_FLOOD, calendar::turn + rng( 2_turns, 3_turns ) ); @@ -231,7 +235,7 @@ void timed_event::actualize() } }; const mtype_id &montype = random_entry( temple_monsters ); - g->place_critter_around( montype, g->u.pos(), 2 ); + g->place_critter_around( montype, player_character.pos(), 2 ); } break; @@ -243,17 +247,19 @@ void timed_event::actualize() void timed_event::per_turn() { + Character &player_character = get_player_character(); + map &here = get_map(); switch( type ) { case timed_event_type::WANTED: { // About once every 5 minutes. Suppress in classic zombie mode. if( g->get_levz() >= 0 && one_in( 50 ) && !get_option( "DISABLE_ROBOT_RESPONSE" ) ) { - point place = g->m.random_outdoor_tile(); + point place = here.random_outdoor_tile(); if( place.x == -1 && place.y == -1 ) { // We're safely indoors! return; } - g->place_critter_at( mon_eyebot, tripoint( place, g->u.posz() ) ); - if( g->u.sees( tripoint( place, g->u.posz() ) ) ) { + g->place_critter_at( mon_eyebot, tripoint( place, player_character.posz() ) ); + if( player_character.sees( tripoint( place, player_character.posz() ) ) ) { add_msg( m_warning, _( "An eyebot swoops down nearby!" ) ); } // One eyebot per trigger is enough, really @@ -267,7 +273,7 @@ void timed_event::per_turn() when -= 1_turns; return; } - if( calendar::once_every( 3_turns ) && !g->u.is_deaf() ) { + if( calendar::once_every( 3_turns ) && !player_character.is_deaf() ) { add_msg( m_warning, _( "You hear screeches from the rock above and around you!" ) ); } break; @@ -302,7 +308,7 @@ void timed_event_manager::process() void timed_event_manager::add( const timed_event_type type, const time_point &when, const int faction_id ) { - add( type, when, faction_id, g->u.global_sm_location() ); + add( type, when, faction_id, get_player_character().global_sm_location() ); } void timed_event_manager::add( const timed_event_type type, const time_point &when, diff --git a/src/trap.cpp b/src/trap.cpp index 3fe2a01f2a700..4a58c4a9c0046 100644 --- a/src/trap.cpp +++ b/src/trap.cpp @@ -190,6 +190,18 @@ void trap::reset() trap_factory.reset(); } +bool trap::is_trivial_to_spot() const +{ + // @TODO technically the trap may not be detected even with visibility == 0, see trap::detect_trap + return visibility <= 0 && !is_always_invisible(); +} + +bool trap::detected_by_ground_sonar() const +{ + // @TODO make this a property + return loadid == tr_beartrap_buried || loadid == tr_landmine_buried || loadid == tr_sinkhole; +} + bool trap::detect_trap( const tripoint &pos, const Character &p ) const { // Some decisions are based around: @@ -200,7 +212,7 @@ bool trap::detect_trap( const tripoint &pos, const Character &p ) const // noticing a buried landmine if standing right next to it. // Effective Perception... ///\EFFECT_PER increases chance of detecting a trap - return p.per_cur - p.encumb( bp_eyes ) / 10 + + return p.per_cur - p.encumb( bodypart_id( "eyes" ) ) / 10 + // ...small bonus from stimulants... ( p.get_stim() > 10 ? rng( 1, 2 ) : 0 ) + // ...bonus from trap skill... @@ -226,11 +238,27 @@ bool trap::can_see( const tripoint &pos, const Character &p ) const // There is no trap at all, so logically one can not see it. return false; } + if( is_always_invisible() ) { + return false; + } return visibility < 0 || p.knows_trap( pos ); } +void trap::trigger( const tripoint &pos, Creature &creature ) const +{ + return trigger( pos, &creature, nullptr ); +} + +void trap::trigger( const tripoint &pos, item &item ) const +{ + return trigger( pos, nullptr, &item ); +} + void trap::trigger( const tripoint &pos, Creature *creature, item *item ) const { + if( is_null() ) { + return; + } const bool is_real_creature = creature != nullptr && !creature->is_hallucination(); if( is_real_creature || item != nullptr ) { bool triggered = act( pos, creature, item ); @@ -274,26 +302,9 @@ void trap::on_disarmed( map &m, const tripoint &p ) const // convenient int-lookup names for hard-coded functions trap_id tr_null, -tr_bubblewrap, -tr_glass, -tr_cot, -tr_funnel, -tr_metal_funnel, -tr_makeshift_funnel, -tr_leather_funnel, -tr_rollmat, -tr_fur_rollmat, -tr_beartrap, tr_beartrap_buried, -tr_nailboard, -tr_caltrops, -tr_caltrops_glass, -tr_tripwire, -tr_crossbow, tr_shotgun_2, -tr_shotgun_2_1, tr_shotgun_1, -tr_engine, tr_blade, tr_landmine, tr_landmine_buried, @@ -302,19 +313,16 @@ tr_goo, tr_dissector, tr_sinkhole, tr_pit, -tr_spike_pit, tr_lava, tr_portal, tr_ledge, -tr_boobytrap, tr_temple_flood, tr_temple_toggle, tr_glow, tr_hum, tr_shadow, tr_drain, -tr_snake, -tr_glass_pit; +tr_snake; void trap::check_consistency() { @@ -328,6 +336,16 @@ void trap::check_consistency() } } +bool trap::easy_take_down() const +{ + return avoidance == 0 && difficulty == 0; +} + +bool trap::can_not_be_disarmed() const +{ + return difficulty >= 99; +} + void trap::finalize() { for( const trap &t_const : trap_factory.get_all() ) { @@ -342,26 +360,9 @@ void trap::finalize() return trap_str_id( id ).id(); }; tr_null = trap_str_id::NULL_ID().id(); - tr_bubblewrap = trapfind( "tr_bubblewrap" ); - tr_glass = trapfind( "tr_glass" ); - tr_cot = trapfind( "tr_cot" ); - tr_funnel = trapfind( "tr_funnel" ); - tr_metal_funnel = trapfind( "tr_metal_funnel" ); - tr_makeshift_funnel = trapfind( "tr_makeshift_funnel" ); - tr_leather_funnel = trapfind( "tr_leather_funnel" ); - tr_rollmat = trapfind( "tr_rollmat" ); - tr_fur_rollmat = trapfind( "tr_fur_rollmat" ); - tr_beartrap = trapfind( "tr_beartrap" ); tr_beartrap_buried = trapfind( "tr_beartrap_buried" ); - tr_nailboard = trapfind( "tr_nailboard" ); - tr_caltrops = trapfind( "tr_caltrops" ); - tr_caltrops_glass = trapfind( "tr_caltrops_glass" ); - tr_tripwire = trapfind( "tr_tripwire" ); - tr_crossbow = trapfind( "tr_crossbow" ); tr_shotgun_2 = trapfind( "tr_shotgun_2" ); - tr_shotgun_2_1 = trapfind( "tr_shotgun_2_1" ); tr_shotgun_1 = trapfind( "tr_shotgun_1" ); - tr_engine = trapfind( "tr_engine" ); tr_blade = trapfind( "tr_blade" ); tr_landmine = trapfind( "tr_landmine" ); tr_landmine_buried = trapfind( "tr_landmine_buried" ); @@ -370,11 +371,9 @@ void trap::finalize() tr_dissector = trapfind( "tr_dissector" ); tr_sinkhole = trapfind( "tr_sinkhole" ); tr_pit = trapfind( "tr_pit" ); - tr_spike_pit = trapfind( "tr_spike_pit" ); tr_lava = trapfind( "tr_lava" ); tr_portal = trapfind( "tr_portal" ); tr_ledge = trapfind( "tr_ledge" ); - tr_boobytrap = trapfind( "tr_boobytrap" ); tr_temple_flood = trapfind( "tr_temple_flood" ); tr_temple_toggle = trapfind( "tr_temple_toggle" ); tr_glow = trapfind( "tr_glow" ); @@ -382,5 +381,10 @@ void trap::finalize() tr_shadow = trapfind( "tr_shadow" ); tr_drain = trapfind( "tr_drain" ); tr_snake = trapfind( "tr_snake" ); - tr_glass_pit = trapfind( "tr_glass_pit" ); +} + +std::string trap::debug_describe() const +{ + return string_format( _( "Visible: %d\nAvoidance: %d\nDifficulty: %d\nBenign: %s" ), visibility, + avoidance, difficulty, is_benign() ? _( "Yes" ) : _( "No" ) ); } diff --git a/src/trap.h b/src/trap.h index 3ee31bfc1318a..5a5b199de84fe 100644 --- a/src/trap.h +++ b/src/trap.h @@ -83,6 +83,26 @@ struct vehicle_handle_trap_data { using trap_function = std::function; +/** + * Some traps aren't actually traps in the usual sense of the word. We use traps to implement + * funnels (the main map keeps a list of traps and we iterate over that list during rain + * in order to fill the containers with water). + * Use @ref is_benign to check for that kind of "non-dangerous" traps. Traps that are not benign + * are considered dangerous. + * + * Some traps are always invisible. They are never revealed as such to the player. + * They can still be triggered. Use @ref is_always_invisible to check for that. + * + * Traps names can be empty. This usually applies to always invisible traps. + * + * Some traps are always revealed to the player (e.g. funnels). Other traps can be spotted when + * the player is close (also needs perception stat). + * + * Use @ref map::can_see_trap_at or @ref trap::can_see to check whether a creature knows about a + * given trap. Monsters / NPCs should base their behavior on that information and not on a simple + * check for any trap being there (e.g. don't use `map::tr_at(...).is_null()` - that would reveal + * the existence of the trap). + */ struct trap { trap_str_id id; trap_id loadid; @@ -92,11 +112,21 @@ struct trap { int sym = 0; nc_color color; private: - // 1 to ??, affects detection + /** + * How easy it is to spot the trap. Smaller values means it's easier to spot. + * 1 to ??, affects detection + */ + // @TODO it can be negative (?) + // @TODO Add checks for it having proper values + // @TODO check usage in combination with is_always_invisible int visibility = 1; // 0 to ??, affects avoidance int avoidance = 0; - // 0 to ??, difficulty of assembly & disassembly + /* + * This is used when disarming the trap. A value of 0 means disarming will always work + * (e.g. for funnels), a values of 99 means it can not be disarmed at all. Smaller values + * makes it easier to disarm the trap. + */ int difficulty = 0; // 0 to ??, trap radius int trap_radius = 0; @@ -127,12 +157,22 @@ struct trap { bool is_always_invisible() const { return always_invisible; } + + bool operator==( const trap_id &id ) const { + return loadid == id; + } + bool operator!=( const trap_id &id ) const { + return loadid != id; + } + /** - * How easy it is to spot the trap. Smaller values means it's easier to spot. + * Called when the player examines a tile. This is supposed to handled + * all kind of interaction of the player with the trap, including removal. + * It also handles visibility of the trap, and it does nothing when + * called on the null trap. */ - int get_visibility() const { - return visibility; - } + // Implemented for historical reasons in iexamine.cpp + void examine( const tripoint &examp ) const; std::string map_regen_target() const; @@ -144,14 +184,6 @@ struct trap { int get_avoidance() const { return avoidance; } - /** - * This is used when disarming the trap. A value of 0 means disarming will always work - * (e.g. for funnels), a values of 99 means it can not be disarmed at all. Smaller values - * makes it easier to disarm the trap. - */ - int get_difficulty() const { - return difficulty; - } /** * If true, this is not really a trap and there won't be any safety queries before stepping * onto it (e.g. for funnels). @@ -159,6 +191,24 @@ struct trap { bool is_benign() const { return benign; } + /** + * @return True for traps that can simply be taken down without any skill check or similar. + * This usually applies to traps like funnels, rollmat. + */ + bool easy_take_down() const; + + bool is_trivial_to_spot() const; + + /** + * Some traps are part of the terrain (e.g. pits) and can therefor not be disarmed + * via the usual mechanics. They can be "disarmed" by changing the terrain they are part of. + */ + bool can_not_be_disarmed() const; + + /** + * Whether this kind of trap will be detected by ground sonar (e.g. via the bionic). + */ + bool detected_by_ground_sonar() const; /** Player has not yet seen the trap and returns the variable chance, at this moment, of whether the trap is seen or not. */ bool detect_trap( const tripoint &pos, const Character &p ) const; @@ -167,6 +217,7 @@ struct trap { * the trap) or by the visibility of the trap (the trap is not hidden at all)? */ bool can_see( const tripoint &pos, const Character &p ) const; + private: /** * Trigger trap effects. * @param creature The creature that triggered the trap, it does not necessarily have to @@ -176,11 +227,27 @@ struct trap { * @param pos The location of the trap in the main map. * @param item The item that triggered the trap */ - void trigger( const tripoint &pos, Creature *creature = nullptr, item *item = nullptr ) const; + // Don't call from outside this class. Add a wrapper like the ones below instead. + void trigger( const tripoint &pos, Creature *creature, item *item ) const; + public: + /*@{*/ + /** + * This applies the effects of the trap to the world and + * possibly to the triggering object (creature, item). + * + * The function assumes the + * caller has already checked whether the trap should be activated + * (e.g. the creature has had a chance to avoid the trap, but it failed). + */ + void trigger( const tripoint &pos, Creature &creature ) const; + void trigger( const tripoint &pos, item &item ) const; + /*@}*/ + /** * If the given item is throw onto the trap, does it trigger the trap? */ bool triggered_by_item( const item &itm ) const; + /** * Called when a trap at the given point in the map has been disarmed. * It should spawn trap items (if any) and remove the trap from the map via @@ -202,6 +269,8 @@ struct trap { */ void load( const JsonObject &jo, const std::string &src ); + std::string debug_describe() const; + /*@{*/ /** * @name Funnels @@ -254,26 +323,9 @@ const trap_function &trap_function_from_string( const std::string &function_name extern trap_id tr_null, -tr_bubblewrap, -tr_glass, -tr_cot, -tr_funnel, -tr_metal_funnel, -tr_makeshift_funnel, -tr_leather_funnel, -tr_rollmat, -tr_fur_rollmat, -tr_beartrap, tr_beartrap_buried, -tr_nailboard, -tr_caltrops, -tr_caltrops_glass, -tr_tripwire, -tr_crossbow, tr_shotgun_2, -tr_shotgun_2_1, tr_shotgun_1, -tr_engine, tr_blade, tr_landmine, tr_landmine_buried, @@ -282,12 +334,9 @@ tr_goo, tr_dissector, tr_sinkhole, tr_pit, -tr_spike_pit, -tr_glass_pit, tr_lava, tr_portal, tr_ledge, -tr_boobytrap, tr_temple_flood, tr_temple_toggle, tr_glow, diff --git a/src/trapfunc.cpp b/src/trapfunc.cpp index 96b57b3b0af00..fb1144d3d8bf5 100644 --- a/src/trapfunc.cpp +++ b/src/trapfunc.cpp @@ -67,7 +67,7 @@ static const mtype_id mon_shadow_snake( "mon_shadow_snake" ); static float pit_effectiveness( const tripoint &p ) { units::volume corpse_volume = 0_ml; - for( item &pit_content : g->m.i_at( p ) ) { + for( item &pit_content : get_map().i_at( p ) ) { if( pit_content.is_corpse() ) { corpse_volume += pit_content.volume(); } @@ -98,7 +98,7 @@ bool trapfunc::bubble( const tripoint &p, Creature *c, item * ) } } sounds::sound( p, 18, sounds::sound_t::alarm, _( "Pop!" ), false, "trap", "bubble_wrap" ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); return true; } @@ -124,7 +124,7 @@ bool trapfunc::glass( const tripoint &p, Creature *c, item * ) } } sounds::sound( p, 10, sounds::sound_t::combat, _( "glass cracking!" ), false, "trap", "glass" ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); return true; } @@ -147,7 +147,8 @@ bool trapfunc::beartrap( const tripoint &p, Creature *c, item * ) return false; } sounds::sound( p, 8, sounds::sound_t::combat, _( "SNAP!" ), false, "trap", "bear_trap" ); - g->m.remove_trap( p ); + map &here = get_map(); + here.remove_trap( p ); if( c != nullptr ) { // What got hit? const bodypart_id hit = one_in( 2 ) ? bodypart_id( "leg_l" ) : bodypart_id( "leg_r" ); @@ -176,7 +177,7 @@ bool trapfunc::beartrap( const tripoint &p, Creature *c, item * ) } c->check_dead_state(); } else { - g->m.spawn_item( p, "beartrap" ); + here.spawn_item( p, "beartrap" ); } return true; } @@ -197,7 +198,7 @@ bool trapfunc::board( const tripoint &, Creature *c, item * ) if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_warning, _( "Your %s stepped on a spiked board!" ), c->get_name() ); - g->u.moves -= 80; + get_player_character().moves -= 80; } else { z->moves -= 80; } @@ -232,7 +233,7 @@ bool trapfunc::caltrops( const tripoint &, Creature *c, item * ) if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_warning, _( "Your %s steps on a sharp metal caltrop!" ), c->get_name() ); - g->u.moves -= 80; + get_player_character().moves -= 80; } else { z->moves -= 80; } @@ -267,12 +268,12 @@ bool trapfunc::caltrops_glass( const tripoint &p, Creature *c, item * ) c->deal_damage( nullptr, bodypart_id( "foot_r" ), damage_instance( DT_CUT, rng( 9, 30 ) ) ); } c->check_dead_state(); - if( g->u.sees( p ) ) { + if( get_player_character().sees( p ) ) { add_msg( _( "The shards shatter!" ) ); sounds::sound( p, 8, sounds::sound_t::combat, _( "glass cracking!" ), false, "trap", "glass_caltrops" ); } - g->m.remove_trap( p ); + get_map().remove_trap( p ); return true; } @@ -289,21 +290,24 @@ bool trapfunc::tripwire( const tripoint &p, Creature *c, item * ) _( " trips over a tripwire!" ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); + + Character &player_character = get_player_character(); + map &here = get_map(); if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s trips over a tripwire!" ), z->get_name() ); std::vector valid; - for( const tripoint &jk : g->m.points_in_radius( p, 1 ) ) { + for( const tripoint &jk : here.points_in_radius( p, 1 ) ) { if( g->is_empty( jk ) ) { valid.push_back( jk ); } } if( !valid.empty() ) { - g->u.setpos( random_entry( valid ) ); - z->setpos( g->u.pos() ); + player_character.setpos( random_entry( valid ) ); + z->setpos( player_character.pos() ); } - g->u.moves -= 150; - g->update_map( g->u ); + player_character.moves -= 150; + g->update_map( player_character ); } else { z->stumble(); } @@ -312,7 +316,7 @@ bool trapfunc::tripwire( const tripoint &p, Creature *c, item * ) } } else if( n != nullptr ) { std::vector valid; - for( const tripoint &jk : g->m.points_in_radius( p, 1 ) ) { + for( const tripoint &jk : here.points_in_radius( p, 1 ) ) { if( g->is_empty( jk ) ) { valid.push_back( jk ); } @@ -321,8 +325,8 @@ bool trapfunc::tripwire( const tripoint &p, Creature *c, item * ) n->setpos( random_entry( valid ) ); } n->moves -= 150; - if( c == &g->u ) { - g->update_map( g->u ); + if( c->is_avatar() ) { + g->update_map( player_character ); } if( !n->is_mounted() ) { ///\EFFECT_DEX decreases chance of taking damage from a tripwire trap @@ -387,7 +391,7 @@ bool trapfunc::crossbow( const tripoint &p, Creature *c, item * ) _( " dodges the shot!" ) ); } } else if( z != nullptr ) { - bool seen = g->u.sees( *z ); + bool seen = get_player_character().sees( *z ); int chance = 0; // adapted from shotgun code - chance of getting hit depends on size switch( z->type->size ) { @@ -419,19 +423,21 @@ bool trapfunc::crossbow( const tripoint &p, Creature *c, item * ) } c->check_dead_state(); } - g->m.remove_trap( p ); - g->m.spawn_item( p, "crossbow" ); - g->m.spawn_item( p, "string_36" ); + map &here = get_map(); + here.remove_trap( p ); + here.spawn_item( p, "crossbow" ); + here.spawn_item( p, "string_36" ); if( add_bolt ) { - g->m.spawn_item( p, "bolt_steel", 1, 1 ); + here.spawn_item( p, "bolt_steel", 1, 1 ); } return true; } bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) { + map &here = get_map(); sounds::sound( p, 60, sounds::sound_t::combat, _( "Kerblam!" ), false, "fire_gun", - g->m.tr_at( p ).loadid == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); + here.tr_at( p ) == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); int shots = 1; if( c != nullptr ) { if( c->has_effect( effect_ridden ) ) { @@ -444,7 +450,7 @@ bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) if( n != nullptr ) { ///\EFFECT_STR_MAX increases chance of two shots from shotgun trap shots = ( one_in( 8 ) || one_in( 20 - n->str_max ) ? 2 : 1 ); - if( g->m.tr_at( p ).loadid != tr_shotgun_2 ) { + if( here.tr_at( p ) != tr_shotgun_2 ) { shots = 1; } ///\EFFECT_DODGE reduces chance of being hit by shotgun trap @@ -486,7 +492,7 @@ bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) _( " dodges the shot!" ) ); } } else if( z != nullptr ) { - bool seen = g->u.sees( *z ); + bool seen = get_player_character().sees( *z ); int chance = 0; switch( z->type->size ) { case creature_size::tiny: @@ -506,7 +512,7 @@ bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) break; } shots = ( one_in( 8 ) || one_in( chance ) ? 2 : 1 ); - if( g->m.tr_at( p ).loadid != tr_shotgun_2 ) { + if( here.tr_at( p ) != tr_shotgun_2 ) { shots = 1; } if( seen ) { @@ -518,9 +524,9 @@ bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) c->check_dead_state(); } - g->m.spawn_item( p, g->m.tr_at( p ).loadid == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); - g->m.spawn_item( p, "string_36" ); - g->m.remove_trap( p ); + here.spawn_item( p, here.tr_at( p ) == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); + here.spawn_item( p, "string_36" ); + here.remove_trap( p ); return true; } @@ -545,7 +551,7 @@ bool trapfunc::blade( const tripoint &, Creature *c, item * ) bool trapfunc::snare_light( const tripoint &p, Creature *c, item * ) { sounds::sound( p, 2, sounds::sound_t::combat, _( "Snap!" ), false, "trap", "snare" ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); if( c == nullptr ) { return false; } @@ -571,7 +577,7 @@ bool trapfunc::snare_light( const tripoint &p, Creature *c, item * ) bool trapfunc::snare_heavy( const tripoint &p, Creature *c, item * ) { sounds::sound( p, 4, sounds::sound_t::combat, _( "Snap!" ), false, "trap", "snare" ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); if( c == nullptr ) { return false; } @@ -622,7 +628,7 @@ bool trapfunc::landmine( const tripoint &p, Creature *c, item * ) _( " triggers a land mine!" ) ); } explosion_handler::explosion( p, 18, 0.5, false, 8 ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); return true; } @@ -633,7 +639,7 @@ bool trapfunc::boobytrap( const tripoint &p, Creature *c, item * ) _( " triggers a booby trap!" ) ); } explosion_handler::explosion( p, 18, 0.6, false, 12 ); - g->m.remove_trap( p ); + get_map().remove_trap( p ); return true; } @@ -644,10 +650,10 @@ bool trapfunc::telepad( const tripoint &p, Creature *c, item * ) if( c == nullptr ) { return false; } - if( c == &g->u ) { + if( c->is_avatar() ) { c->add_msg_if_player( m_warning, _( "The air shimmers around you…" ) ); } else { - if( g->u.sees( p ) ) { + if( get_player_character().sees( p ) ) { add_msg( _( "The air shimmers around %s…" ), c->disp_name() ); } } @@ -657,7 +663,7 @@ bool trapfunc::telepad( const tripoint &p, Creature *c, item * ) bool trapfunc::goo( const tripoint &p, Creature *c, item * ) { - g->m.remove_trap( p ); + get_map().remove_trap( p ); if( c == nullptr ) { return false; } @@ -677,7 +683,7 @@ bool trapfunc::goo( const tripoint &p, Creature *c, item * ) return true; } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { - g->u.forced_dismount(); + get_player_character().forced_dismount(); } //All monsters except for blobs get a speed decrease if( z->type->id != mon_blob ) { @@ -703,6 +709,7 @@ bool trapfunc::dissector( const tripoint &p, Creature *c, item * ) return false; } monster *z = dynamic_cast( c ); + bool player_sees = get_player_character().sees( p ); if( z != nullptr ) { if( z->type->in_species( species_ROBOT ) ) { //The monster is a robot. So the dissector should not try to dissect the monsters flesh. @@ -726,7 +733,7 @@ bool trapfunc::dissector( const tripoint &p, Creature *c, item * ) ch->deal_damage( nullptr, bodypart_id( "leg_r" ), damage_instance( DT_CUT, 12 ) ); ch->deal_damage( nullptr, bodypart_id( "foot_l" ), damage_instance( DT_CUT, 10 ) ); ch->deal_damage( nullptr, bodypart_id( "foot_r" ), damage_instance( DT_CUT, 10 ) ); - if( g->u.sees( p ) ) { + if( player_sees ) { ch->add_msg_player_or_npc( m_bad, _( "Electrical beams emit from the floor and slice your flesh!" ), _( "Electrical beams emit from the floor and slice s flesh!" ) ); } @@ -736,7 +743,7 @@ bool trapfunc::dissector( const tripoint &p, Creature *c, item * ) //~ the sound of a dissector dissecting sounds::sound( p, 10, sounds::sound_t::combat, _( "BRZZZAP!" ), false, "trap", "dissector" ); - if( g->u.sees( p ) ) { + if( player_sees ) { add_msg( m_bad, _( "Electrical beams emit from the floor and slice the %s!" ), c->get_name() ); } c->deal_damage( nullptr, bodypart_id( "head" ), damage_instance( DT_CUT, 15 ) ); @@ -792,7 +799,7 @@ bool trapfunc::pit( const tripoint &p, Creature *c, item * ) } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s falls into a pit!" ), z->get_name() ); - g->u.forced_dismount(); + get_player_character().forced_dismount(); } z->deal_damage( nullptr, bodypart_id( "leg_l" ), damage_instance( DT_BASH, eff * rng( 10, 20 ) ) ); z->deal_damage( nullptr, bodypart_id( "leg_r" ), damage_instance( DT_BASH, eff * rng( 10, 20 ) ) ); @@ -815,6 +822,7 @@ bool trapfunc::pit_spikes( const tripoint &p, Creature *c, item * ) c->add_effect( effect_in_pit, 1_turns, num_bp, true ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); + Character &player_character = get_player_character(); if( n != nullptr ) { int dodge = n->get_dodge(); int damage = pit_effectiveness( p ) * rng( 20, 50 ); @@ -864,20 +872,21 @@ bool trapfunc::pit_spikes( const tripoint &p, Creature *c, item * ) } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s falls into a pit!" ), z->get_name() ); - g->u.forced_dismount(); + player_character.forced_dismount(); } z->deal_damage( nullptr, bodypart_id( "torso" ), damage_instance( DT_CUT, rng( 20, 50 ) ) ); } c->check_dead_state(); if( one_in( 4 ) ) { - if( g->u.sees( p ) ) { + if( player_character.sees( p ) ) { add_msg( _( "The spears break!" ) ); } - g->m.ter_set( p, t_pit ); + map &here = get_map(); + here.ter_set( p, t_pit ); // 4 spears to a pit for( int i = 0; i < 4; i++ ) { if( one_in( 3 ) ) { - g->m.spawn_item( p, "pointy_stick" ); + here.spawn_item( p, "pointy_stick" ); } } } @@ -898,6 +907,7 @@ bool trapfunc::pit_glass( const tripoint &p, Creature *c, item * ) c->add_effect( effect_in_pit, 1_turns, num_bp, true ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); + Character &player_character = get_player_character(); if( n != nullptr ) { int dodge = n->get_dodge(); int damage = pit_effectiveness( p ) * rng( 15, 35 ); @@ -951,20 +961,21 @@ bool trapfunc::pit_glass( const tripoint &p, Creature *c, item * ) } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s falls into a pit!" ), z->get_name() ); - g->u.forced_dismount(); + player_character.forced_dismount(); } z->deal_damage( nullptr, bodypart_id( "torso" ), damage_instance( DT_CUT, rng( 20, 50 ) ) ); } c->check_dead_state(); if( one_in( 5 ) ) { - if( g->u.sees( p ) ) { + if( player_character.sees( p ) ) { add_msg( _( "The shards shatter!" ) ); } - g->m.ter_set( p, t_pit ); + map &here = get_map(); + here.ter_set( p, t_pit ); // 20 shards in a pit. for( int i = 0; i < 20; i++ ) { if( one_in( 3 ) ) { - g->m.spawn_item( p, "glass_shard" ); + here.spawn_item( p, "glass_shard" ); } } } @@ -977,7 +988,7 @@ bool trapfunc::lava( const tripoint &p, Creature *c, item * ) return false; } c->add_msg_player_or_npc( m_bad, _( "The %s burns you horribly!" ), _( "The %s burns !" ), - g->m.tername( p ) ); + get_map().tername( p ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -1032,39 +1043,40 @@ static tripoint random_neighbor( tripoint center ) return center; } -static bool sinkhole_safety_roll( player *p, const itype_id &itemname, const int diff ) +static bool sinkhole_safety_roll( player &p, const itype_id &itemname, const int diff ) { ///\EFFECT_STR increases chance to attach grapnel, bullwhip, or rope when falling into a sinkhole ///\EFFECT_DEX increases chance to attach grapnel, bullwhip, or rope when falling into a sinkhole ///\EFFECT_THROW increases chance to attach grapnel, bullwhip, or rope when falling into a sinkhole - const int throwing_skill_level = p->get_skill_level( skill_throw ); - const int roll = rng( throwing_skill_level, throwing_skill_level + p->str_cur + p->dex_cur ); + const int throwing_skill_level = p.get_skill_level( skill_throw ); + const int roll = rng( throwing_skill_level, throwing_skill_level + p.str_cur + p.dex_cur ); + map &here = get_map(); if( roll < diff ) { - p->add_msg_if_player( m_bad, _( "You fail to attach it…" ) ); - p->use_amount( itemname, 1 ); - g->m.spawn_item( random_neighbor( p->pos() ), itemname ); + p.add_msg_if_player( m_bad, _( "You fail to attach it…" ) ); + p.use_amount( itemname, 1 ); + here.spawn_item( random_neighbor( p.pos() ), itemname ); return false; } std::vector safe; - for( const tripoint &tmp : g->m.points_in_radius( p->pos(), 1 ) ) { - if( g->m.passable( tmp ) && g->m.tr_at( tmp ).loadid != tr_pit ) { + for( const tripoint &tmp : here.points_in_radius( p.pos(), 1 ) ) { + if( here.passable( tmp ) && here.tr_at( tmp ) != tr_pit ) { safe.push_back( tmp ); } } if( safe.empty() ) { - p->add_msg_if_player( m_bad, _( "There's nowhere to pull yourself to, and you sink!" ) ); - p->use_amount( itemname, 1 ); - g->m.spawn_item( random_neighbor( p->pos() ), itemname ); + p.add_msg_if_player( m_bad, _( "There's nowhere to pull yourself to, and you sink!" ) ); + p.use_amount( itemname, 1 ); + here.spawn_item( random_neighbor( p.pos() ), itemname ); return false; } else { - p->add_msg_player_or_npc( m_good, _( "You pull yourself to safety!" ), - _( " steps on a sinkhole, but manages to pull themselves to safety." ) ); - p->setpos( random_entry( safe ) ); - if( p == &g->u ) { - g->update_map( *p ); + p.add_msg_player_or_npc( m_good, _( "You pull yourself to safety!" ), + _( " steps on a sinkhole, but manages to pull themselves to safety." ) ); + p.setpos( random_entry( safe ) ); + if( p.is_avatar() ) { + g->update_map( p ); } return true; @@ -1079,29 +1091,30 @@ bool trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) } monster *z = dynamic_cast( c ); player *pl = dynamic_cast( c ); + map &here = get_map(); if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s falls into a sinkhole!" ), z->get_name() ); - g->u.forced_dismount(); + get_player_character().forced_dismount(); } } else if( pl != nullptr ) { bool success = false; if( query_for_item( pl, itype_grapnel, _( "You step into a sinkhole! Throw your grappling hook out to try to catch something?" ) ) ) { - success = sinkhole_safety_roll( pl, itype_grapnel, 6 ); + success = sinkhole_safety_roll( *pl, itype_grapnel, 6 ); } else if( query_for_item( pl, itype_bullwhip, _( "You step into a sinkhole! Throw your whip out to try and snag something?" ) ) ) { - success = sinkhole_safety_roll( pl, itype_bullwhip, 8 ); + success = sinkhole_safety_roll( *pl, itype_bullwhip, 8 ); } else if( query_for_item( pl, itype_rope_30, _( "You step into a sinkhole! Throw your rope out to try to catch something?" ) ) ) { - success = sinkhole_safety_roll( pl, itype_rope_30, 12 ); + success = sinkhole_safety_roll( *pl, itype_rope_30, 12 ); } pl->add_msg_player_or_npc( m_warning, _( "The sinkhole collapses!" ), _( "A sinkhole under collapses!" ) ); if( success ) { - g->m.remove_trap( p ); - g->m.ter_set( p, t_pit ); + here.remove_trap( p ); + here.ter_set( p, t_pit ); return true; } pl->add_msg_player_or_npc( m_bad, _( "You fall into the sinkhole!" ), @@ -1109,8 +1122,8 @@ bool trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) } else { return false; } - g->m.remove_trap( p ); - g->m.ter_set( p, t_pit ); + here.remove_trap( p ); + here.ter_set( p, t_pit ); c->moves -= 100; pit( p, c, i ); return true; @@ -1125,18 +1138,19 @@ bool trapfunc::ledge( const tripoint &p, Creature *c, item * ) if( m != nullptr && m->flies() ) { return false; } - if( !g->m.has_zlevels() ) { - if( c == &g->u ) { + map &here = get_map(); + if( !here.has_zlevels() ) { + if( c->is_avatar() ) { add_msg( m_warning, _( "You fall down a level!" ) ); g->vertical_move( -1, true ); - if( g->u.has_trait( trait_WINGS_BIRD ) || ( one_in( 2 ) && - g->u.has_trait( trait_WINGS_BUTTERFLY ) ) ) { + if( c->has_trait( trait_WINGS_BIRD ) || ( one_in( 2 ) && + c->has_trait( trait_WINGS_BUTTERFLY ) ) ) { add_msg( _( "You flap your wings and flutter down gracefully." ) ); - } else if( g->u.has_active_bionic( bio_shock_absorber ) ) { + } else if( c->as_character()->has_active_bionic( bio_shock_absorber ) ) { add_msg( m_info, _( "You hit the ground hard, but your shock absorbers handle the impact admirably!" ) ); } else { - g->u.impact( 20, p ); + c->as_avatar()->impact( 20, p ); } } else { c->add_msg_if_npc( _( " falls down a level!" ) ); @@ -1156,7 +1170,7 @@ bool trapfunc::ledge( const tripoint &p, Creature *c, item * ) tripoint where = p; tripoint below = where; below.z--; - while( g->m.valid_move( where, below, false, true ) ) { + while( here.valid_move( where, below, false, true ) ) { where.z--; if( g->critter_at( where ) != nullptr ) { where.z++; @@ -1175,7 +1189,7 @@ bool trapfunc::ledge( const tripoint &p, Creature *c, item * ) } std::vector valid; - for( const tripoint &pt : g->m.points_in_radius( below, 1 ) ) { + for( const tripoint &pt : here.points_in_radius( below, 1 ) ) { if( g->is_empty( pt ) ) { valid.push_back( pt ); } @@ -1224,16 +1238,20 @@ bool trapfunc::ledge( const tripoint &p, Creature *c, item * ) bool trapfunc::temple_flood( const tripoint &p, Creature *c, item * ) { + if( c == nullptr ) { + return false; + } // Monsters and npcs are completely ignored here, should they? - if( c == &g->u ) { + if( c->is_avatar() ) { add_msg( m_warning, _( "You step on a loose tile, and water starts to flood the room!" ) ); tripoint tmp = p; int &i = tmp.x; int &j = tmp.y; + map &here = get_map(); for( i = 0; i < MAPSIZE_X; i++ ) { for( j = 0; j < MAPSIZE_Y; j++ ) { - if( g->m.tr_at( tmp ).loadid == tr_temple_flood ) { - g->m.remove_trap( tmp ); + if( here.tr_at( tmp ) == tr_temple_flood ) { + here.remove_trap( tmp ); } } } @@ -1245,32 +1263,36 @@ bool trapfunc::temple_flood( const tripoint &p, Creature *c, item * ) bool trapfunc::temple_toggle( const tripoint &p, Creature *c, item * ) { + if( c == nullptr ) { + return false; + } // Monsters and npcs are completely ignored here, should they? - if( c == &g->u ) { + if( c->is_avatar() ) { add_msg( _( "You hear the grinding of shifting rock." ) ); - const ter_id type = g->m.ter( p ); + map &here = get_map(); + const ter_id type = here.ter( p ); tripoint tmp = p; int &i = tmp.x; int &j = tmp.y; for( i = 0; i < MAPSIZE_X; i++ ) { for( j = 0; j < MAPSIZE_Y; j++ ) { if( type == t_floor_red ) { - if( g->m.ter( tmp ) == t_rock_green ) { - g->m.ter_set( tmp, t_floor_green ); - } else if( g->m.ter( tmp ) == t_floor_green ) { - g->m.ter_set( tmp, t_rock_green ); + if( here.ter( tmp ) == t_rock_green ) { + here.ter_set( tmp, t_floor_green ); + } else if( here.ter( tmp ) == t_floor_green ) { + here.ter_set( tmp, t_rock_green ); } } else if( type == t_floor_green ) { - if( g->m.ter( tmp ) == t_rock_blue ) { - g->m.ter_set( tmp, t_floor_blue ); - } else if( g->m.ter( tmp ) == t_floor_blue ) { - g->m.ter_set( tmp, t_rock_blue ); + if( here.ter( tmp ) == t_rock_blue ) { + here.ter_set( tmp, t_floor_blue ); + } else if( here.ter( tmp ) == t_floor_blue ) { + here.ter_set( tmp, t_rock_blue ); } } else if( type == t_floor_blue ) { - if( g->m.ter( tmp ) == t_rock_red ) { - g->m.ter_set( tmp, t_floor_red ); - } else if( g->m.ter( tmp ) == t_floor_red ) { - g->m.ter_set( tmp, t_rock_red ); + if( here.ter( tmp ) == t_rock_red ) { + here.ter_set( tmp, t_floor_red ); + } else if( here.ter( tmp ) == t_floor_red ) { + here.ter_set( tmp, t_rock_red ); } } } @@ -1295,7 +1317,7 @@ bool trapfunc::glow( const tripoint &p, Creature *c, item * ) if( z->has_effect( effect_ridden ) ) { if( one_in( 3 ) ) { add_msg( m_bad, _( "You're bathed in radiation!" ) ); - g->u.irradiate( rng( 10, 30 ) ); + get_player_character().irradiate( rng( 10, 30 ) ); } else if( one_in( 4 ) ) { add_msg( m_bad, _( "A blinding flash strikes you!" ) ); explosion_handler::flashbang( p ); @@ -1342,9 +1364,10 @@ bool trapfunc::hum( const tripoint &p, Creature *, item * ) bool trapfunc::shadow( const tripoint &p, Creature *c, item * ) { - if( c != &g->u ) { + if( c == nullptr || !c->is_avatar() ) { return false; } + map &here = get_map(); // Monsters and npcs are completely ignored here, should they? for( int tries = 0; tries < 10; tries++ ) { tripoint monp = p; @@ -1355,13 +1378,13 @@ bool trapfunc::shadow( const tripoint &p, Creature *c, item * ) monp.x = p.x + ( one_in( 2 ) ? -5 : +5 ); monp.y = p.y + rng( -5, +5 ); } - if( !g->m.sees( monp, p, 10 ) ) { + if( !here.sees( monp, p, 10 ) ) { continue; } if( monster *const spawned = g->place_critter_at( mon_shadow, monp ) ) { spawned->add_msg_if_npc( m_warning, _( "A shadow forms nearby." ) ); spawned->reset_special_rng( "DISAPPEAR" ); - g->m.remove_trap( p ); + here.remove_trap( p ); break; } } @@ -1373,15 +1396,16 @@ bool trapfunc::map_regen( const tripoint &p, Creature *c, item * ) if( c ) { player *n = dynamic_cast( c ); if( n ) { + map &here = get_map(); n->add_msg_if_player( m_warning, _( "Your surroundings shift!" ) ); const tripoint &omt_pos = n->global_omt_location(); - const std::string ®en_mapgen = g->m.tr_at( p ).map_regen_target(); - g->m.remove_trap( p ); + const std::string ®en_mapgen = here.tr_at( p ).map_regen_target(); + here.remove_trap( p ); if( !run_mapgen_update_func( regen_mapgen, omt_pos, nullptr, false ) ) { popup( _( "Failed to generate the new map" ) ); return false; } - g->m.set_transparency_cache_dirty( p.z ); + here.set_transparency_cache_dirty( p.z ); return true; } } @@ -1410,11 +1434,12 @@ bool trapfunc::cast_spell( const tripoint &p, Creature *critter, item * ) if( critter == nullptr ) { return false; } - const spell trap_spell = g->m.tr_at( p ).spell_data.get_spell( 0 ); + map &here = get_map(); + const spell trap_spell = here.tr_at( p ).spell_data.get_spell( 0 ); npc dummy; trap_spell.cast_all_effects( dummy, critter->pos() ); trap_spell.make_sound( p, 20 ); - g->m.remove_trap( p ); + here.remove_trap( p ); return true; } @@ -1422,8 +1447,9 @@ bool trapfunc::snake( const tripoint &p, Creature *, item * ) { //~ the sound a snake makes sounds::sound( p, 10, sounds::sound_t::movement, _( "ssssssss" ), false, "misc", "snake_hiss" ); + map &here = get_map(); if( one_in( 6 ) ) { - g->m.remove_trap( p ); + here.remove_trap( p ); } if( one_in( 3 ) ) { for( int tries = 0; tries < 10; tries++ ) { @@ -1435,13 +1461,13 @@ bool trapfunc::snake( const tripoint &p, Creature *, item * ) monp.x = p.x + ( one_in( 2 ) ? -5 : +5 ); monp.y = p.y + rng( -5, +5 ); } - if( !g->m.sees( monp, p, 10 ) ) { + if( !here.sees( monp, p, 10 ) ) { continue; } if( monster *const spawned = g->place_critter_at( mon_shadow_snake, monp ) ) { spawned->add_msg_if_npc( m_warning, _( "A shadowy snake forms nearby." ) ); spawned->reset_special_rng( "DISAPPEAR" ); - g->m.remove_trap( p ); + here.remove_trap( p ); break; } } diff --git a/src/turret.cpp b/src/turret.cpp index 8ecd3c4463af7..77c1760dc98a5 100644 --- a/src/turret.cpp +++ b/src/turret.cpp @@ -291,17 +291,21 @@ void turret_data::post_fire( player &p, int shots ) veh->drain( fuel_type_battery, mode->get_gun_ups_drain() * shots ); } -int turret_data::fire( player &p, const tripoint &target ) +int turret_data::fire( Character &c, const tripoint &target ) { if( !veh || !part ) { return 0; } int shots = 0; auto mode = base()->gun_current_mode(); + player *player_character = c.as_player(); + if( player_character == nullptr ) { + return 0; + } - prepare_fire( p ); - shots = p.fire_gun( target, mode.qty, *mode ); - post_fire( p, shots ); + prepare_fire( *player_character ); + shots = player_character->fire_gun( target, mode.qty, *mode ); + post_fire( *player_character, shots ); return shots; } @@ -392,8 +396,10 @@ bool vehicle::turrets_aim( std::vector &turrets ) t->reset_target( global_part_pos3( *t ) ); } + avatar &player_character = get_avatar(); // Get target - target_handler::trajectory trajectory = target_handler::mode_turrets( g->u, *this, turrets ); + target_handler::trajectory trajectory = target_handler::mode_turrets( player_character, *this, + turrets ); bool got_target = !trajectory.empty(); if( got_target ) { @@ -406,7 +412,8 @@ bool vehicle::turrets_aim( std::vector &turrets ) } ///\EFFECT_INT speeds up aiming of vehicle turrets - g->u.moves = std::min( 0, g->u.moves - 100 + ( 5 * g->u.int_cur ) ); + player_character.moves = std::min( 0, + player_character.moves - 100 + ( 5 * player_character.int_cur ) ); } return got_target; } @@ -563,7 +570,8 @@ int vehicle::automatic_fire_turret( vehicle_part &pt ) area += area == 1 ? 1 : 2; } - const bool u_see = g->u.sees( pos ); + Character &player_character = get_player_character(); + const bool u_see = player_character.sees( pos ); // The current target of the turret. auto &target = pt.target; if( target.first == target.second ) { @@ -612,7 +620,7 @@ int vehicle::automatic_fire_turret( vehicle_part &pt ) shots = gun.fire( cpu, targ ); - if( shots && u_see && !g->u.sees( targ ) ) { + if( shots && u_see && !player_character.sees( targ ) ) { add_msg( _( "The %1$s fires its %2$s!" ), name, pt.name() ); } diff --git a/src/type_id.h b/src/type_id.h index 16243d48fd54a..2bf368c2fc427 100644 --- a/src/type_id.h +++ b/src/type_id.h @@ -144,6 +144,9 @@ using start_location_id = string_id; class move_mode; using move_mode_id = string_id; +class proficiency; +using proficiency_id = string_id; + struct ter_t; using ter_id = int_id; using ter_str_id = string_id; @@ -179,6 +182,9 @@ using vpart_id = string_id; struct vehicle_prototype; using vproto_id = string_id; +struct weather_type; +using weather_type_id = string_id; + class zone_type; using zone_type_id = string_id; diff --git a/src/ui.cpp b/src/ui.cpp index 41eed88461d57..0f344af8d2e90 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -917,10 +917,11 @@ struct pointmenu_cb::impl_t { pointmenu_cb::impl_t::impl_t( const std::vector &pts ) : points( pts ) { last = INT_MIN; - last_view = g->u.view_offset; - terrain_draw_cb = make_shared_fast( [this]() { + avatar &player_character = get_avatar(); + last_view = player_character.view_offset; + terrain_draw_cb = make_shared_fast( [this, &player_character]() { if( last >= 0 && static_cast( last ) < points.size() ) { - g->draw_trail_to_square( g->u.view_offset, true ); + g->draw_trail_to_square( player_character.view_offset, true ); } } ); g->add_draw_callback( terrain_draw_cb ); @@ -928,7 +929,7 @@ pointmenu_cb::impl_t::impl_t( const std::vector &pts ) : points( pts ) pointmenu_cb::impl_t::~impl_t() { - g->u.view_offset = last_view; + get_avatar().view_offset = last_view; } void pointmenu_cb::impl_t::select( uilist *const menu ) @@ -937,13 +938,14 @@ void pointmenu_cb::impl_t::select( uilist *const menu ) return; } last = menu->selected; + avatar &player_character = get_avatar(); if( menu->selected < 0 || menu->selected >= static_cast( points.size() ) ) { - g->u.view_offset = tripoint_zero; + player_character.view_offset = tripoint_zero; } else { const tripoint ¢er = points[menu->selected]; - g->u.view_offset = center - g->u.pos(); + player_character.view_offset = center - player_character.pos(); // TODO: Remove this line when it's safe - g->u.view_offset.z = 0; + player_character.view_offset.z = 0; } g->invalidate_main_ui_adaptor(); } diff --git a/src/ui_manager.cpp b/src/ui_manager.cpp index 77118393d86ed..457af246a5046 100644 --- a/src/ui_manager.cpp +++ b/src/ui_manager.cpp @@ -187,15 +187,16 @@ void ui_adaptor::redraw() void ui_adaptor::redraw_invalidated() { + ui_stack_t ui_stack_copy = ui_stack; // apply deferred resizing - auto first = ui_stack.rbegin(); - for( ; first != ui_stack.rend(); ++first ) { + auto first = ui_stack_copy.rbegin(); + for( ; first != ui_stack_copy.rend(); ++first ) { if( first->get().disabling_uis_below ) { break; } } - for( auto it = first == ui_stack.rend() ? ui_stack.begin() : std::prev( first.base() ); - it != ui_stack.end(); ++it ) { + for( auto it = first == ui_stack_copy.rend() ? ui_stack_copy.begin() : std::prev( first.base() ); + it != ui_stack_copy.end(); ++it ) { ui_adaptor &ui = *it; if( ui.deferred_resize ) { if( ui.screen_resized_cb ) { @@ -208,15 +209,15 @@ void ui_adaptor::redraw_invalidated() // redraw invalidated uis // TODO refresh only when all stacked UIs are drawn - if( !ui_stack.empty() ) { - auto first = ui_stack.crbegin(); - for( ; first != ui_stack.crend(); ++first ) { + if( !ui_stack_copy.empty() ) { + auto first = ui_stack_copy.crbegin(); + for( ; first != ui_stack_copy.crend(); ++first ) { if( first->get().disabling_uis_below ) { break; } } - for( auto it = first == ui_stack.crend() ? ui_stack.cbegin() : std::prev( first.base() ); - it != ui_stack.cend(); ++it ) { + for( auto it = first == ui_stack_copy.crend() ? ui_stack_copy.cbegin() : std::prev( first.base() ); + it != ui_stack_copy.cend(); ++it ) { const ui_adaptor &ui = *it; if( ui.invalidated ) { if( ui.redraw_cb ) { diff --git a/src/ui_manager.h b/src/ui_manager.h index c2f4a2cf6c623..966d9eacf84f5 100644 --- a/src/ui_manager.h +++ b/src/ui_manager.h @@ -38,10 +38,14 @@ class ui_adaptor // Note that `topleft` and `size` are in console cells on both tiles // and curses build. void position( const point &topleft, const point &size ); - // Set redraw and resizing callbacks. These callbacks should NOT call - // `debugmsg`, construct new `ui_adaptor` instances, deconstruct old + // Set redraw and resizing callbacks. These callbacks should NOT + // construct new `ui_adaptor` instances, deconstruct old // `ui_adaptor` instances, call `redraw`, or call `screen_resized`. // + // As a special case, calling `debugmsg` inside the callbacks is (semi-) + // supported, but may cause display glitches after the debug message is + // closed. + // // The redraw callback should also not call `position_from_window`, // otherwise it may cause UI glitch if the window position changes. void on_redraw( const redraw_callback_t &fun ); diff --git a/src/units.h b/src/units.h index 9cf336d95ee6b..32dd9c55d3d8a 100644 --- a/src/units.h +++ b/src/units.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -582,6 +583,14 @@ inline std::ostream &operator<<( std::ostream &o, const quantity +inline std::string quantity_to_string( const quantity &v ) +{ + std::ostringstream os; + os << v; + return os.str(); +} + inline std::string display( const units::energy v ) { const int kj = units::to_kilojoule( v ); diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index 4b2436563f857..9980fc2b07f0c 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -118,27 +118,28 @@ player_activity veh_interact::serialize_activity() return player_activity(); } + avatar &player_character = get_avatar(); int time = 1000; switch( sel_cmd ) { case 'i': - time = vp->install_time( g->u ); + time = vp->install_time( player_character ); break; case 'r': if( pt != nullptr ) { if( pt->is_broken() ) { - time = vp->install_time( g->u ); + time = vp->install_time( player_character ); } else if( pt->base.max_damage() > 0 ) { - time = vp->repair_time( g->u ) * pt->base.damage() / pt->base.max_damage(); + time = vp->repair_time( player_character ) * pt->base.damage() / pt->base.max_damage(); } } break; case 'o': - time = vp->removal_time( g->u ); + time = vp->removal_time( player_character ); break; default: break; } - if( g->u.has_trait( trait_DEBUG_HS ) ) { + if( player_character.has_trait( trait_DEBUG_HS ) ) { time = 1; } player_activity res( ACT_VEHICLE, time, static_cast( sel_cmd ) ); @@ -147,11 +148,12 @@ player_activity veh_interact::serialize_activity() // otherwise (e.g. installing a new frame), just use part 0 const point q = veh->coord_translate( pt ? pt->mount : veh->part( 0 ).mount ); const vehicle_part *vpt = pt ? pt : &veh->part( 0 ); + map &here = get_map(); for( const tripoint &p : veh->get_points( true ) ) { - res.coord_set.insert( g->m.getabs( p ) ); + res.coord_set.insert( here.getabs( p ) ); } - res.values.push_back( g->m.getabs( veh->global_pos3() ).x + q.x ); // values[0] - res.values.push_back( g->m.getabs( veh->global_pos3() ).y + q.y ); // values[1] + res.values.push_back( here.getabs( veh->global_pos3() ).x + q.x ); // values[0] + res.values.push_back( here.getabs( veh->global_pos3() ).y + q.y ); // values[1] res.values.push_back( dd.x ); // values[2] res.values.push_back( dd.y ); // values[3] res.values.push_back( -dd.x ); // values[4] @@ -295,7 +297,8 @@ void veh_interact::allocate_windows() bool veh_interact::format_reqs( std::string &msg, const requirement_data &reqs, const std::map &skills, int moves ) const { - const inventory &inv = g->u.crafting_inventory(); + Character &player_character = get_player_character(); + const inventory &inv = player_character.crafting_inventory(); bool ok = reqs.can_make_with_inventory( inv, is_crafting_component ); msg += _( "Time required:\n" ); @@ -304,7 +307,7 @@ bool veh_interact::format_reqs( std::string &msg, const requirement_data &reqs, msg += _( "Skills required:\n" ); for( const auto &e : skills ) { - bool hasSkill = g->u.get_skill_level( e.first ) >= e.second; + bool hasSkill = player_character.get_skill_level( e.first ) >= e.second; if( !hasSkill ) { ok = false; } @@ -383,7 +386,9 @@ shared_ptr_fast veh_interact::create_or_get_ui_adaptor() void veh_interact::do_main_loop() { bool finish = false; - const bool owned_by_player = veh->handle_potential_theft( dynamic_cast( g->u ), true ); + Character &player_character = get_player_character(); + const bool owned_by_player = veh->handle_potential_theft( dynamic_cast + ( player_character ), true ); faction *owner_fac; if( veh->has_owner() ) { owner_fac = g->faction_manager_ptr->get( veh->get_owner() ); @@ -403,23 +408,23 @@ void veh_interact::do_main_loop() } else if( action == "QUIT" ) { finish = true; } else if( action == "INSTALL" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_install(); } } else if( action == "REPAIR" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_repair(); } } else if( action == "MEND" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_mend(); } } else if( action == "REFILL" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_refill(); } } else if( action == "REMOVE" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_remove(); } } else if( action == "RENAME" ) { @@ -431,18 +436,18 @@ void veh_interact::do_main_loop() } } } else if( action == "SIPHON" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { do_siphon(); // Siphoning may have started a player activity. If so, we should close the // vehicle dialog and continue with the activity. - finish = !g->u.activity.is_null(); + finish = !player_character.activity.is_null(); if( !finish ) { // it's possible we just invalidated our crafting inventory cache_tool_availability(); } } } else if( action == "UNLOAD" ) { - if( veh->handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( veh->handle_potential_theft( dynamic_cast( player_character ) ) ) { finish = do_unload(); } } else if( action == "ASSIGN_CREW" ) { @@ -483,23 +488,24 @@ void veh_interact::do_main_loop() void veh_interact::cache_tool_availability() { - crafting_inv = g->u.crafting_inventory(); + Character &player_character = get_player_character(); + crafting_inv = player_character.crafting_inventory(); - cache_tool_availability_update_lifting( g->u.pos() ); + cache_tool_availability_update_lifting( player_character.pos() ); int mech_jack = 0; - if( g->u.is_mounted() ) { - mech_jack = g->u.mounted_creature->mech_str_addition() + 10; + if( player_character.is_mounted() ) { + mech_jack = player_character.mounted_creature->mech_str_addition() + 10; } - int max_quality = std::max( { g->u.max_quality( qual_JACK ), mech_jack, - map_selector( g->u.pos(), PICKUP_RANGE ).max_quality( qual_JACK ), - vehicle_selector( g->u.pos(), 2, true, *veh ).max_quality( qual_JACK ) + int max_quality = std::max( { player_character.max_quality( qual_JACK ), mech_jack, + map_selector( player_character.pos(), PICKUP_RANGE ).max_quality( qual_JACK ), + vehicle_selector( player_character.pos(), 2, true, *veh ).max_quality( qual_JACK ) } ); max_jack = lifting_quality_to_mass( max_quality ); } void veh_interact::cache_tool_availability_update_lifting( const tripoint &world_cursor_pos ) { - max_lift = g->u.best_nearby_lifting_assist( world_cursor_pos ); + max_lift = get_player_character().best_nearby_lifting_assist( world_cursor_pos ); } /** @@ -525,29 +531,30 @@ task_reason veh_interact::cant_do( char mode ) bool has_skill = true; bool enough_light = true; const vehicle_part_range vpr = veh->get_all_parts(); + avatar &player_character = get_avatar(); switch( mode ) { case 'i': // install mode - enough_morale = g->u.has_morale_to_craft(); + enough_morale = player_character.has_morale_to_craft(); valid_target = !can_mount.empty() && 0 == veh->tags.count( "convertible" ); //tool checks processed later - enough_light = g->u.fine_detail_vision_mod() <= 4; + enough_light = player_character.fine_detail_vision_mod() <= 4; has_tools = true; break; case 'r': // repair mode - enough_morale = g->u.has_morale_to_craft(); + enough_morale = player_character.has_morale_to_craft(); valid_target = !need_repair.empty() && cpart >= 0; // checked later has_tools = true; - enough_light = g->u.fine_detail_vision_mod() <= 4; + enough_light = player_character.fine_detail_vision_mod() <= 4; break; case 'm': { // mend mode - enough_morale = g->u.has_morale_to_craft(); - const bool toggling = g->u.has_trait( trait_DEBUG_HS ); + enough_morale = player_character.has_morale_to_craft(); + const bool toggling = player_character.has_trait( trait_DEBUG_HS ); valid_target = std::any_of( vpr.begin(), vpr.end(), [toggling]( const vpart_reference & pt ) { if( toggling ) { return pt.part().is_available() && !pt.part().faults_potential().empty(); @@ -555,7 +562,7 @@ task_reason veh_interact::cant_do( char mode ) return pt.part().is_available() && !pt.part().faults().empty(); } } ); - enough_light = g->u.fine_detail_vision_mod() <= 4; + enough_light = player_character.fine_detail_vision_mod() <= 4; // checked later has_tools = true; } @@ -570,13 +577,13 @@ task_reason veh_interact::cant_do( char mode ) case 'o': // remove mode - enough_morale = g->u.has_morale_to_craft(); + enough_morale = player_character.has_morale_to_craft(); valid_target = cpart >= 0 && 0 == veh->tags.count( "convertible" ); part_free = parts_here.size() > 1 || ( cpart >= 0 && veh->can_unmount( cpart ) ); //tool and skill checks processed later has_tools = true; has_skill = true; - enough_light = g->u.fine_detail_vision_mod() <= 4; + enough_light = player_character.fine_detail_vision_mod() <= 4; break; case 's': @@ -590,7 +597,7 @@ task_reason veh_interact::cant_do( char mode ) break; } } - has_tools = g->u.has_quality( qual_HOSE ); + has_tools = player_character.has_quality( qual_HOSE ); break; case 'd': @@ -623,7 +630,7 @@ task_reason veh_interact::cant_do( char mode ) return task_reason::UNKNOWN_TASK; } - if( std::abs( veh->velocity ) > 100 || g->u.controlling_vehicle ) { + if( std::abs( veh->velocity ) > 100 || player_character.controlling_vehicle ) { return task_reason::MOVING_VEHICLE; } if( !valid_target ) { @@ -740,29 +747,30 @@ bool veh_interact::can_install_part() const auto reqs = sel_vpart_info->install_requirements(); + avatar &player_character = get_avatar(); std::string nmsg; bool ok = format_reqs( nmsg, reqs, sel_vpart_info->install_skills, - sel_vpart_info->install_time( g->u ) ); + sel_vpart_info->install_time( player_character ) ); nmsg += _( "Additional requirements:\n" ); if( dif_eng > 0 ) { - if( g->u.get_skill_level( skill_mechanics ) < dif_eng ) { + if( player_character.get_skill_level( skill_mechanics ) < dif_eng ) { ok = false; } //~ %1$s represents the internal color name which shouldn't be translated, %2$s is skill name, and %3$i is skill level nmsg += string_format( _( "> %1$s%2$s %3$i for extra engines." ), - status_color( g->u.get_skill_level( skill_mechanics ) >= dif_eng ), + status_color( player_character.get_skill_level( skill_mechanics ) >= dif_eng ), skill_mechanics.obj().name(), dif_eng ) + "\n"; } if( dif_steering > 0 ) { - if( g->u.get_skill_level( skill_mechanics ) < dif_steering ) { + if( player_character.get_skill_level( skill_mechanics ) < dif_steering ) { ok = false; } //~ %1$s represents the internal color name which shouldn't be translated, %2$s is skill name, and %3$i is skill level nmsg += string_format( _( "> %1$s%2$s %3$i for extra steering axles." ), - status_color( g->u.get_skill_level( skill_mechanics ) >= dif_steering ), + status_color( player_character.get_skill_level( skill_mechanics ) >= dif_steering ), skill_mechanics.obj().name(), dif_steering ) + "\n"; } @@ -776,7 +784,7 @@ bool veh_interact::can_install_part() lvl = jack_quality( *veh ); str = veh->lift_strength(); use_aid = ( max_jack >= lifting_quality_to_mass( lvl ) ) || can_self_jack(); - use_str = g->u.can_lift( *veh ); + use_str = player_character.can_lift( *veh ); } else { item base( sel_vpart_info->item ); qual = qual_LIFT; @@ -784,7 +792,7 @@ bool veh_interact::can_install_part() lifting_quality_to_mass( 1 ) ); str = base.lift_strength(); use_aid = max_lift >= base.weight(); - use_str = g->u.can_lift( base ); + use_str = player_character.can_lift( base ); } if( !( use_aid || use_str ) ) { @@ -794,7 +802,7 @@ bool veh_interact::can_install_part() nc_color aid_color = use_aid ? c_green : ( use_str ? c_dark_gray : c_red ); nc_color str_color = use_str ? c_green : ( use_aid ? c_dark_gray : c_red ); - const auto helpers = g->u.get_crafting_helpers(); + const auto helpers = player_character.get_crafting_helpers(); std::string str_string; if( !helpers.empty() ) { str_string = string_format( _( "strength ( assisted ) %d" ), str ); @@ -811,7 +819,7 @@ bool veh_interact::can_install_part() sel_vpart_info->format_description( nmsg, c_light_gray, getmaxx( w_msg ) - 4 ); msg = colorize( nmsg, c_light_gray ); - return ok || g->u.has_trait( trait_DEBUG_HS ); + return ok || player_character.has_trait( trait_DEBUG_HS ); } /** @@ -1173,6 +1181,7 @@ void veh_interact::do_repair() restore_on_out_of_scope prev_hilight_part( highlight_part ); + avatar &player_character = get_avatar(); while( true ) { vehicle_part &pt = veh->part( parts_here[need_repair[pos]] ); const vpart_info &vp = pt.info(); @@ -1182,7 +1191,8 @@ void veh_interact::do_repair() // this will always be set, but the gcc thinks that sometimes it won't be bool ok = true; if( pt.is_broken() ) { - ok = format_reqs( nmsg, vp.install_requirements(), vp.install_skills, vp.install_time( g->u ) ); + ok = format_reqs( nmsg, vp.install_requirements(), vp.install_skills, + vp.install_time( player_character ) ); } else { if( vp.has_flag( "NO_REPAIR" ) || vp.repair_requirements().is_empty() || pt.base.max_damage() <= 0 ) { @@ -1204,7 +1214,7 @@ void veh_interact::do_repair() } } else { ok = format_reqs( nmsg, vp.repair_requirements() * pt.base.damage_level( 4 ), vp.repair_skills, - vp.repair_time( g->u ) * pt.base.damage() / pt.base.max_damage() ); + vp.repair_time( player_character ) * pt.base.damage() / pt.base.max_damage() ); } } @@ -1226,7 +1236,7 @@ void veh_interact::do_repair() } sel_vehicle_part = &pt; sel_vpart_info = &vp; - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = player_character.get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); } @@ -1264,7 +1274,8 @@ void veh_interact::do_mend() restore_on_out_of_scope> prev_title( title ); title = _( "Choose a part here to mend:" ); - const bool toggling = g->u.has_trait( trait_DEBUG_HS ); + avatar &player_character = get_avatar(); + const bool toggling = player_character.has_trait( trait_DEBUG_HS ); auto sel = [toggling]( const vehicle_part & pt ) { if( toggling ) { return !pt.faults_potential().empty(); @@ -1274,7 +1285,7 @@ void veh_interact::do_mend() }; auto act = [&]( const vehicle_part & pt ) { - g->u.mend_item( veh->part_base( veh->index_of_part( &pt ) ) ); + player_character.mend_item( veh->part_base( veh->index_of_part( &pt ) ) ); sel_cmd = 'q'; }; @@ -1726,7 +1737,7 @@ vehicle_part *veh_interact::get_most_damaged_part() const vehicle_part *veh_interact::get_most_repariable_part() const { - auto &part = veh_utils::most_repairable_part( *veh, g->u ); + auto &part = veh_utils::most_repairable_part( *veh, get_player_character() ); return part ? &part : nullptr; } @@ -1775,12 +1786,13 @@ bool veh_interact::can_remove_part( int idx, const player &p ) quality_id qual; bool use_aid = false; bool use_str = false; + avatar &player_character = get_avatar(); if( sel_vpart_info->has_flag( "NEEDS_JACKING" ) ) { qual = qual_JACK; lvl = jack_quality( *veh ); str = veh->lift_strength(); use_aid = ( max_jack >= lifting_quality_to_mass( lvl ) ) || can_self_jack(); - use_str = g->u.can_lift( *veh ); + use_str = player_character.can_lift( *veh ); } else { item base( sel_vpart_info->item ); qual = qual_LIFT; @@ -1788,7 +1800,7 @@ bool veh_interact::can_remove_part( int idx, const player &p ) lifting_quality_to_mass( 1 ) ); str = base.lift_strength(); use_aid = max_lift >= base.weight(); - use_str = g->u.can_lift( base ); + use_str = player_character.can_lift( base ); } if( !( use_aid || use_str ) ) { @@ -1796,7 +1808,7 @@ bool veh_interact::can_remove_part( int idx, const player &p ) } nc_color aid_color = use_aid ? c_green : ( use_str ? c_dark_gray : c_red ); nc_color str_color = use_str ? c_green : ( use_aid ? c_dark_gray : c_red ); - const auto helpers = g->u.get_crafting_helpers(); + const auto helpers = player_character.get_crafting_helpers(); //~ %1$s is quality name, %2$d is quality level std::string aid_string = string_format( _( "1 tool with %1$s %2$d" ), qual.obj().name, lvl ); @@ -1821,7 +1833,7 @@ bool veh_interact::can_remove_part( int idx, const player &p ) sel_vehicle_part->info().format_description( nmsg, desc_color, getmaxx( w_msg ) - 4 ); msg = colorize( nmsg, c_light_gray ); - return ok || g->u.has_trait( trait_DEBUG_HS ); + return ok || player_character.has_trait( trait_DEBUG_HS ); } void veh_interact::do_remove() @@ -1836,9 +1848,10 @@ void veh_interact::do_remove() restore_on_out_of_scope> prev_title( title ); title = _( "Choose a part here to remove:" ); + avatar &player_character = get_avatar(); int pos = 0; for( size_t i = 0; i < parts_here.size(); i++ ) { - if( can_remove_part( parts_here[ i ], g->u ) ) { + if( can_remove_part( parts_here[ i ], player_character ) ) { pos = i; break; } @@ -1854,7 +1867,7 @@ void veh_interact::do_remove() while( true ) { int part = parts_here[ pos ]; - bool can_remove = can_remove_part( part, g->u ); + bool can_remove = can_remove_part( part, player_character ); overview_enable = [this, part]( const vehicle_part & pt ) { return &pt == &veh->part( part ); @@ -1896,7 +1909,7 @@ void veh_interact::do_remove() return; } } - const std::vector helpers = g->u.get_crafting_helpers(); + const std::vector helpers = player_character.get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task…" ), np->name ); } @@ -2058,7 +2071,7 @@ int veh_interact::part_at( const point &d ) */ bool veh_interact::can_potentially_install( const vpart_info &vpart ) { - return g->u.has_trait( trait_DEBUG_HS ) || + return get_player_character().has_trait( trait_DEBUG_HS ) || vpart.install_requirements().can_make_with_inventory( crafting_inv, is_crafting_component ); } @@ -2082,8 +2095,9 @@ void veh_interact::move_cursor( const point &d, int dstart_at ) const point q = veh->coord_translate( vd ); const tripoint vehp = veh->global_pos3() + q; const bool has_critter = g->critter_at( vehp ); - bool obstruct = g->m.impassable_ter_furn( vehp ); - const optional_vpart_position ovp = g->m.veh_at( vehp ); + map &here = get_map(); + bool obstruct = here.impassable_ter_furn( vehp ); + const optional_vpart_position ovp = here.veh_at( vehp ); if( ovp && &ovp->vehicle() != veh ) { obstruct = true; } @@ -2253,8 +2267,9 @@ void veh_interact::display_veh() const point vd = -dd; const point q = veh->coord_translate( vd ); const tripoint vehp = veh->global_pos3() + q; - bool obstruct = g->m.impassable_ter_furn( vehp ); - const optional_vpart_position ovp = g->m.veh_at( vehp ); + map &here = get_map(); + bool obstruct = here.impassable_ter_furn( vehp ); + const optional_vpart_position ovp = here.veh_at( vehp ); if( ovp && &ovp->vehicle() != veh ) { obstruct = true; } @@ -2530,7 +2545,7 @@ void veh_interact::display_name() mvwprintz( w_name, point( 1, 0 ), c_light_gray, _( "Name: " ) ); mvwprintz( w_name, point( 1 + utf8_width( _( "Name: " ) ), 0 ), - !veh->is_owned_by( g->u, true ) ? c_light_red : c_light_green, + !veh->is_owned_by( get_player_character(), true ) ? c_light_red : c_light_green, string_format( _( "%s (%s)" ), veh->name, veh->get_owner_name() ) ); wnoutrefresh( w_name ); } @@ -2899,6 +2914,7 @@ void act_vehicle_unload_fuel( vehicle *veh ) fuel = fuels.front(); } + Character &player_character = get_player_character(); int qty = veh->fuel_left( fuel ); if( fuel == itype_plut_cell ) { if( qty / PLUTONIUM_CHARGES == 0 ) { @@ -2906,11 +2922,11 @@ void act_vehicle_unload_fuel( vehicle *veh ) return; } item plutonium( fuel, calendar::turn, qty / PLUTONIUM_CHARGES ); - g->u.i_add( plutonium ); + player_character.i_add( plutonium ); veh->drain( fuel, qty - ( qty % PLUTONIUM_CHARGES ) ); } else { item solid_fuel( fuel, calendar::turn, qty ); - g->u.i_add( solid_fuel ); + player_character.i_add( solid_fuel ); veh->drain( fuel, qty ); } @@ -2926,14 +2942,15 @@ void veh_interact::complete_vehicle( player &p ) debugmsg( "Invalid activity ACT_VEHICLE values:%d", p.activity.values.size() ); return; } - optional_vpart_position vp = g->m.veh_at( g->m.getlocal( tripoint( p.activity.values[0], + map &here = get_map(); + optional_vpart_position vp = here.veh_at( here.getlocal( tripoint( p.activity.values[0], p.activity.values[1], p.posz() ) ) ); if( !vp ) { // so the vehicle could have lost some of its parts from other NPCS works during this player/NPCs activity. // check the vehicle points that were stored at beginning of activity. if( !p.activity.coord_set.empty() ) { for( const auto pt : p.activity.coord_set ) { - vp = g->m.veh_at( g->m.getlocal( pt ) ); + vp = here.veh_at( here.getlocal( pt ) ); if( vp ) { break; } @@ -3039,7 +3056,7 @@ void veh_interact::complete_vehicle( player &p ) // TODO: allow boarding for non-players as well. player *const pl = g->critter_at( vehp ); if( vpinfo.has_flag( VPFLAG_BOARDABLE ) && pl ) { - g->m.board_vehicle( vehp, pl ); + here.board_vehicle( vehp, pl ); } p.add_msg_if_player( m_good, _( "You install a %1$s into the %2$s." ), veh->part( partnum ).name(), @@ -3048,7 +3065,7 @@ void veh_interact::complete_vehicle( player &p ) for( const auto &sk : vpinfo.install_skills ) { p.practice( sk.first, veh_utils::calc_xp_gain( vpinfo, sk.first, p ) ); } - g->m.update_vehicle_cache( veh, veh->sm_pos.z ); + here.add_vehicle_to_cache( veh ); break; } @@ -3115,7 +3132,6 @@ void veh_interact::complete_vehicle( player &p ) add_msg( m_info, _( "You don't meet the requirements to remove the %s." ), vpinfo.name() ); break; } - for( const auto &e : reqs.get_components() ) { p.consume_items( e, 1, is_crafting_component ); } @@ -3181,10 +3197,17 @@ void veh_interact::complete_vehicle( player &p ) if( veh->part_count() < 2 ) { p.add_msg_if_player( _( "You completely dismantle the %s." ), veh->name ); p.activity.set_to_null(); - g->m.destroy_vehicle( veh ); + // destroy vehicle clears the cache + here.destroy_vehicle( veh ); } else { + point mount = veh->part( vehicle_part ).mount; + const tripoint &part_pos = veh->global_part_pos3( vehicle_part ); veh->remove_part( vehicle_part ); + // part_removal_cleanup calls refresh, so parts_at_relative is valid veh->part_removal_cleanup(); + if( veh->parts_at_relative( mount, true ).empty() ) { + get_map().clear_vehicle_point_from_cache( veh, part_pos ); + } } // This will be part of an NPC "job" where they need to clean up the acitivty items afterwards if( p.is_npc() ) { @@ -3192,11 +3215,10 @@ void veh_interact::complete_vehicle( player &p ) it.set_var( "activity_var", p.name ); } } - // Finally, put all the reults somewhere (we wanted to wait until this + // Finally, put all the results somewhere (we wanted to wait until this // point because we don't want to put them back into the vehicle part // that just got removed). put_into_vehicle_or_drop( p, item_drop_reason::deliberate, resulting_items ); - g->m.update_vehicle_cache( veh, veh->sm_pos.z ); break; } } diff --git a/src/veh_type.cpp b/src/veh_type.cpp index 346bd4fc25dc6..121b5c51cab1a 100644 --- a/src/veh_type.cpp +++ b/src/veh_type.cpp @@ -71,6 +71,7 @@ static const std::unordered_map vpart_bitflag_map = { "OPAQUE", VPFLAG_OPAQUE }, { "OPENABLE", VPFLAG_OPENABLE }, { "SEATBELT", VPFLAG_SEATBELT }, + { "SIMPLE_PART", VPFLAG_SIMPLE_PART }, { "WHEEL", VPFLAG_WHEEL }, { "ROTOR", VPFLAG_ROTOR }, { "ROTOR_SIMPLE", VPFLAG_ROTOR_SIMPLE }, diff --git a/src/veh_type.h b/src/veh_type.h index 36727e6fac291..57c748d6e2d34 100644 --- a/src/veh_type.h +++ b/src/veh_type.h @@ -42,6 +42,7 @@ enum vpart_bitflags : int { VPFLAG_OPAQUE, VPFLAG_OPENABLE, VPFLAG_SEATBELT, + VPFLAG_SIMPLE_PART, VPFLAG_SPACE_HEATER, VPFLAG_COOLER, VPFLAG_WHEEL, diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 4082df2262519..b129659941fc0 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -78,6 +78,7 @@ static const itype_id fuel_type_battery( "battery" ); static const itype_id fuel_type_muscle( "muscle" ); static const itype_id fuel_type_plutonium_cell( "plut_cell" ); static const itype_id fuel_type_wind( "wind" ); +static const itype_id fuel_type_mana( "mana" ); static const fault_id fault_engine_belt_drive( "fault_engine_belt_drive" ); static const fault_id fault_engine_filter_air( "fault_engine_filter_air" ); @@ -98,12 +99,11 @@ static const itype_id itype_water_clean( "water_clean" ); static const itype_id itype_water_purifier( "water_purifier" ); static const std::string flag_PERPETUAL( "PERPETUAL" ); +static const std::string flag_E_COMBUSTION( "E_COMBUSTION" ); static bool is_sm_tile_outside( const tripoint &real_global_pos ); static bool is_sm_tile_over_water( const tripoint &real_global_pos ); -static const itype_id fuel_type_mana( "mana" ); - // 1 kJ per battery charge const int bat_energy_j = 1000; @@ -128,37 +128,39 @@ class DefaultRemovePartHandler : public RemovePartHandler ~DefaultRemovePartHandler() override = default; void unboard( const tripoint &loc ) override { - g->m.unboard_vehicle( loc ); + get_map().unboard_vehicle( loc ); } void add_item_or_charges( const tripoint &loc, item it, bool /*permit_oob*/ ) override { - g->m.add_item_or_charges( loc, std::move( it ) ); + get_map().add_item_or_charges( loc, std::move( it ) ); } void set_transparency_cache_dirty( const int z ) override { - g->m.set_transparency_cache_dirty( z ); + get_map().set_transparency_cache_dirty( z ); } void removed( vehicle &veh, const int part ) override { + avatar &player_character = get_avatar(); // If the player is currently working on the removed part, stop them as it's futile now. - const player_activity &act = g->u.activity; + const player_activity &act = player_character.activity; + map &here = get_map(); if( act.id() == ACT_VEHICLE && act.moves_left > 0 && act.values.size() > 6 ) { - if( veh_pointer_or_null( g->m.veh_at( tripoint( act.values[0], act.values[1], - g->u.posz() ) ) ) == &veh ) { + if( veh_pointer_or_null( here.veh_at( tripoint( act.values[0], act.values[1], + player_character.posz() ) ) ) == &veh ) { if( act.values[6] >= part ) { - g->u.cancel_activity(); + player_character.cancel_activity(); add_msg( m_info, _( "The vehicle part you were working on has gone!" ) ); } } } // TODO: maybe do this for all the nearby NPCs as well? - if( g->u.get_grab_type() == object_type::VEHICLE && - g->u.grab_point == veh.global_part_pos3( part ) ) { + if( player_character.get_grab_type() == object_type::VEHICLE && + player_character.grab_point == veh.global_part_pos3( part ) ) { if( veh.parts_at_relative( veh.part( part ).mount, false ).empty() ) { add_msg( m_info, _( "The vehicle part you were holding has been destroyed!" ) ); - g->u.grab( object_type::NONE ); + player_character.grab( object_type::NONE ); } } - g->m.dirty_vehicle_list.insert( &veh ); + here.dirty_vehicle_list.insert( &veh ); } void spawn_animal_from_part( item &base, const tripoint &loc ) override { base.release_monster( loc, 1 ); @@ -258,7 +260,7 @@ vehicle::vehicle() : vehicle( vproto_id() ) vehicle::~vehicle() = default; -bool vehicle::player_in_control( const player &p ) const +bool vehicle::player_in_control( const Character &p ) const { // Debug switch to prevent vehicles from skidding // without having to place the player in them. @@ -266,19 +268,20 @@ bool vehicle::player_in_control( const player &p ) const return true; } - const optional_vpart_position vp = g->m.veh_at( p.pos() ); + const optional_vpart_position vp = get_map().veh_at( p.pos() ); if( vp && &vp->vehicle() == this && + p.controlling_vehicle && ( ( part_with_feature( vp->part_index(), "CONTROL_ANIMAL", true ) >= 0 && has_engine_type( fuel_type_animal, false ) && has_harnessed_animal() ) || - ( part_with_feature( vp->part_index(), VPFLAG_CONTROLS, false ) >= 0 ) ) && - p.controlling_vehicle ) { + ( part_with_feature( vp->part_index(), VPFLAG_CONTROLS, false ) >= 0 ) ) + ) { return true; } return remote_controlled( p ); } -bool vehicle::remote_controlled( const player &p ) const +bool vehicle::remote_controlled( const Character &p ) const { vehicle *veh = g->remoteveh(); if( veh != this ) { @@ -702,13 +705,14 @@ void vehicle::autopilot_patrol() * in a criss-cross fashion. * in an auto-tractor, this would eventually cover the entire rectangle. */ + map &here = get_map(); // if we are close to a waypoint, then return to come back to this function next turn. if( autodrive_local_target != tripoint_zero ) { - if( rl_dist( g->m.getabs( global_pos3() ), autodrive_local_target ) <= 3 ) { + if( rl_dist( here.getabs( global_pos3() ), autodrive_local_target ) <= 3 ) { autodrive_local_target = tripoint_zero; return; } - if( !g->m.inbounds( g->m.getlocal( autodrive_local_target ) ) ) { + if( !here.inbounds( here.getlocal( autodrive_local_target ) ) ) { autodrive_local_target = tripoint_zero; is_patrolling = false; return; @@ -718,7 +722,7 @@ void vehicle::autopilot_patrol() } zone_manager &mgr = zone_manager::get_manager(); const auto &zone_src_set = mgr.get_near( zone_type_id( "VEHICLE_PATROL" ), - g->m.getabs( global_pos3() ), 60 ); + here.getabs( global_pos3() ), 60 ); if( zone_src_set.empty() ) { is_patrolling = false; return; @@ -748,8 +752,8 @@ void vehicle::autopilot_patrol() point_along, min.z ); tripoint chosen_tri = min_tri; - if( rl_dist( max_tri, g->m.getabs( global_pos3() ) ) >= rl_dist( min_tri, - g->m.getabs( global_pos3() ) ) ) { + if( rl_dist( max_tri, here.getabs( global_pos3() ) ) >= rl_dist( min_tri, + here.getabs( global_pos3() ) ) ) { chosen_tri = max_tri; } autodrive_local_target = chosen_tri; @@ -768,10 +772,11 @@ std::set vehicle::immediate_path( int rotate ) adjusted_angle = ( ( adjusted_angle + 15 / 2 ) / 15 ) * 15; tileray collision_vector; collision_vector.init( adjusted_angle ); + map &here = get_map(); point top_left_actual = global_pos3().xy() + coord_translate( front_left ); point top_right_actual = global_pos3().xy() + coord_translate( front_right ); - std::vector front_row = line_to( g->m.getabs( top_left_actual ), - g->m.getabs( top_right_actual ) ); + std::vector front_row = line_to( here.getabs( top_left_actual ), + here.getabs( top_right_actual ) ); for( const point &elem : front_row ) { for( int i = 0; i < distance_to_check; ++i ) { collision_vector.advance( i ); @@ -828,30 +833,32 @@ void vehicle::stop_autodriving() void vehicle::drive_to_local_target( const tripoint &target, bool follow_protocol ) { - if( follow_protocol && g->u.in_vehicle ) { + Character &player_character = get_player_character(); + if( follow_protocol && player_character.in_vehicle ) { stop_autodriving(); return; } refresh(); - tripoint vehpos = g->m.getabs( global_pos3() ); + map &here = get_map(); + tripoint vehpos = here.getabs( global_pos3() ); double angle = get_angle_from_targ( target ); // now we got the angle to the target, we can work out when we are heading towards disaster. // Check the tileray in the direction we need to head towards. std::set points_to_check = immediate_path( angle ); bool stop = false; for( const point &pt_elem : points_to_check ) { - point elem = g->m.getlocal( pt_elem ); + point elem = here.getlocal( pt_elem ); if( stop ) { break; } - const optional_vpart_position ovp = g->m.veh_at( tripoint( elem, sm_pos.z ) ); - if( g->m.impassable_ter_furn( tripoint( elem, sm_pos.z ) ) || ( ovp && + const optional_vpart_position ovp = here.veh_at( tripoint( elem, sm_pos.z ) ); + if( here.impassable_ter_furn( tripoint( elem, sm_pos.z ) ) || ( ovp && &ovp->vehicle() != this ) ) { stop = true; break; } - if( elem == g->u.pos().xy() ) { - if( follow_protocol || g->u.in_vehicle ) { + if( elem == player_character.pos().xy() ) { + if( follow_protocol || player_character.in_vehicle ) { continue; } else { stop = true; @@ -899,14 +906,15 @@ void vehicle::drive_to_local_target( const tripoint &target, bool follow_protoco // we really want to avoid running the player over. // If its a helicopter, we dont need to worry about airborne obstacles so much // And fuel efficiency is terrible at low speeds. - const int safe_player_follow_speed = 400 * g->u.current_movement_mode()->move_speed_mult(); + const int safe_player_follow_speed = 400 * + player_character.current_movement_mode()->move_speed_mult(); if( follow_protocol ) { if( ( ( turn_x > 0 || turn_x < 0 ) && velocity > safe_player_follow_speed ) || - rl_dist( vehpos, g->m.getabs( g->u.pos() ) ) < 7 + ( ( mount_max.y * 3 ) + 4 ) ) { + rl_dist( vehpos, here.getabs( player_character.pos() ) ) < 7 + ( ( mount_max.y * 3 ) + 4 ) ) { accel_y = 1; } if( ( velocity < std::min( safe_velocity(), safe_player_follow_speed ) && turn_x == 0 && - rl_dist( vehpos, g->m.getabs( g->u.pos() ) ) > 8 + ( ( mount_max.y * 3 ) + 4 ) ) || + rl_dist( vehpos, here.getabs( player_character.pos() ) ) > 8 + ( ( mount_max.y * 3 ) + 4 ) ) || velocity < 100 ) { accel_y = -1; } @@ -928,7 +936,7 @@ void vehicle::drive_to_local_target( const tripoint &target, bool follow_protoco double vehicle::get_angle_from_targ( const tripoint &targ ) { - tripoint vehpos = g->m.getabs( global_pos3() ); + tripoint vehpos = get_map().getabs( global_pos3() ); rl_vec2d facevec = face_vec(); point rel_pos_target = targ.xy() - vehpos.xy(); rl_vec2d targetvec = rl_vec2d( rel_pos_target.x, rel_pos_target.y ); @@ -945,12 +953,14 @@ void vehicle::do_autodrive() if( omt_path.empty() ) { stop_autodriving(); } + Character &player_character = get_player_character(); + map &here = get_map(); tripoint vehpos = global_pos3(); - tripoint veh_omt_pos = ms_to_omt_copy( g->m.getabs( vehpos ) ); + tripoint veh_omt_pos = ms_to_omt_copy( here.getabs( vehpos ) ); // we're at or close to the waypoint, pop it out and look for the next one. - if( ( is_autodriving && !g->u.omt_path.empty() && !omt_path.empty() ) && + if( ( is_autodriving && !player_character.omt_path.empty() && !omt_path.empty() ) && veh_omt_pos == omt_path.back() ) { - g->u.omt_path.pop_back(); + player_character.omt_path.pop_back(); omt_path.pop_back(); } if( omt_path.empty() ) { @@ -983,8 +993,8 @@ void vehicle::do_autodrive() tripoint global_a = tripoint( veh_omt_pos.x * ( 2 * SEEX ), veh_omt_pos.y * ( 2 * SEEY ), veh_omt_pos.z ); tripoint autodrive_temp_target = ( global_a + tripoint( side, - sm_pos.z ) - g->m.getabs( vehpos ) ) + vehpos; - autodrive_local_target = g->m.getabs( autodrive_temp_target ); + sm_pos.z ) - here.getabs( vehpos ) ) + vehpos; + autodrive_local_target = here.getabs( autodrive_temp_target ); drive_to_local_target( autodrive_local_target, false ); } @@ -1023,11 +1033,13 @@ void vehicle::smash( map &m, float hp_percent_loss_min, float hp_percent_loss_ma int roll = dice( 1, 1000 ); int pct_af = ( percent_of_parts_to_affect * 1000.0f ); if( roll < pct_af ) { - double dist = damage_size == 0.0 ? 1.0 : - clamp( 1.0 - trig_dist( damage_origin, part.precalc[0] ) / damage_size, 0.0, 1.0 ); + double dist = damage_size == 0.0f ? 1.0f : + clamp( 1.0f - trig_dist( damage_origin, part.precalc[0].xy() ) / + damage_size, 0.0f, 1.0f ); //Everywhere else, drop by 10-120% of max HP (anything over 100 = broken) if( mod_hp( part, 0 - ( rng_float( hp_percent_loss_min * dist, - hp_percent_loss_max * dist ) * part.info().durability ), DT_BASH ) ) { + hp_percent_loss_max * dist ) * + part.info().durability ), DT_BASH ) ) { part.ammo_unset(); } } @@ -1056,7 +1068,7 @@ void vehicle::smash( map &m, float hp_percent_loss_min, float hp_percent_loss_ma // This is a heuristic: we just assume the default handler is good enough when called // on the main game map. And assume that we run from some mapgen code if called on // another instance. - if( g && &g->m == &m ) { + if( g && &get_map() == &m ) { handler_ptr = std::make_unique(); } else { handler_ptr = std::make_unique( m ); @@ -1137,6 +1149,11 @@ bool vehicle::is_engine_type( const int e, const itype_id &ft ) const parts[engines[e]].ammo_current() == ft; } +bool vehicle::is_combustion_engine_type( const int e ) const +{ + return parts[engines[e]].info().has_flag( flag_E_COMBUSTION ); +} + bool vehicle::is_perpetual_type( const int e ) const { const itype_id &ft = part_info( engines[e] ).fuel_type; @@ -1163,8 +1180,9 @@ bool vehicle::is_alternator_on( const int a ) const return std::any_of( engines.begin(), engines.end(), [this, &alt]( int idx ) { auto &eng = parts [ idx ]; //fuel_left checks that the engine can produce power to be absorbed - return eng.is_available() && eng.enabled && fuel_left( eng.fuel_current() ) && - eng.mount == alt.mount && !eng.faults().count( fault_engine_belt_drive ); + return eng.mount == alt.mount && eng.is_available() && eng.enabled && + fuel_left( eng.fuel_current() ) && + !eng.faults().count( fault_engine_belt_drive ); } ); } @@ -1224,12 +1242,13 @@ int vehicle::part_vpower_w( const int index, const bool at_full_hp ) const } } ///\EFFECT_STR increases power produced for MUSCLE_* vehicles - pwr += ( g->u.str_cur - 8 ) * part_info( index ).engine_muscle_power_factor(); + pwr += ( get_player_character().str_cur - 8 ) * part_info( index ).engine_muscle_power_factor(); /// wind-powered vehicles have differing power depending on wind direction if( vp.info().fuel_type == fuel_type_wind ) { - int windpower = g->weather.windspeed; + weather_manager &weather = get_weather(); + int windpower = weather.windspeed; rl_vec2d windvec; - double raddir = ( ( g->weather.winddirection + 180 ) % 360 ) * ( M_PI / 180 ); + double raddir = ( ( weather.winddirection + 180 ) % 360 ) * ( M_PI / 180 ); windvec = windvec.normalized(); windvec.y = -std::cos( raddir ); windvec.x = std::sin( raddir ); @@ -1679,6 +1698,7 @@ int vehicle::install_part( const point &dp, const vehicle_part &new_part ) bool vehicle::try_to_rack_nearby_vehicle( const std::vector> &list_of_racks ) { + map &here = get_map(); for( const auto &this_bike_rack : list_of_racks ) { std::vector carry_vehs; carry_vehs.assign( 4, nullptr ); @@ -1691,7 +1711,7 @@ bool vehicle::try_to_rack_nearby_vehicle( const std::vector> &l int i = 0; for( const point &offset : four_cardinal_directions ) { tripoint search_pos( rack_pos + offset ); - test_veh = veh_pointer_or_null( g->m.veh_at( search_pos ) ); + test_veh = veh_pointer_or_null( here.veh_at( search_pos ) ); if( test_veh == nullptr || test_veh == this ) { continue; } else if( test_veh != carry_vehs[ i ] ) { @@ -1848,11 +1868,12 @@ bool vehicle::merge_rackable_vehicle( vehicle *carry_veh, const std::vector // update when we next interact with them zones_dirty = true; + map &here = get_map(); //~ %1$s is the vehicle being loaded onto the bicycle rack add_msg( _( "You load the %1$s on the rack" ), carry_veh->name ); - g->m.destroy_vehicle( carry_veh ); - g->m.dirty_vehicle_list.insert( this ); - g->m.set_transparency_cache_dirty( sm_pos.z ); + here.destroy_vehicle( carry_veh ); + here.dirty_vehicle_list.insert( this ); + here.set_transparency_cache_dirty( sm_pos.z ); refresh(); } else { //~ %1$s is the vehicle being loaded onto the bicycle rack @@ -1990,12 +2011,15 @@ bool vehicle::remove_part( const int p, RemovePartHandler &handler ) void vehicle::part_removal_cleanup() { bool changed = false; + map &here = get_map(); for( std::vector::iterator it = parts.begin(); it != parts.end(); /* noop */ ) { if( it->removed ) { auto items = get_items( std::distance( parts.begin(), it ) ); while( !items.empty() ) { items.erase( items.begin() ); } + const tripoint &pt = global_part_pos3( *it ); + here.clear_vehicle_point_from_cache( this, pt ); it = parts.erase( it ); changed = true; } else { @@ -2006,10 +2030,10 @@ void vehicle::part_removal_cleanup() if( changed || parts.empty() ) { refresh(); if( parts.empty() ) { - g->m.destroy_vehicle( this ); + here.destroy_vehicle( this ); return; } else { - g->m.update_vehicle_cache( this, sm_pos.z ); + here.add_vehicle_to_cache( this ); } } shift_if_needed(); @@ -2089,7 +2113,8 @@ bool vehicle::remove_carried_vehicle( const std::vector &carried_parts ) new_dir = 180; } } - vehicle *new_vehicle = g->m.add_vehicle( vproto_id( "none" ), new_pos3, new_dir ); + map &here = get_map(); + vehicle *new_vehicle = here.add_vehicle( vproto_id( "none" ), new_pos3, new_dir ); if( new_vehicle == nullptr ) { add_msg( m_debug, "Unable to unload bike rack, host face %d, new_dir %d!", face.dir(), new_dir ); return false; @@ -2149,7 +2174,7 @@ bool vehicle::remove_carried_vehicle( const std::vector &carried_parts ) new_vehicle->toggle_tracking(); //turn on tracking for our newly created vehicle new_vehicle->remove_tracked_flag(); //remove our tracking flags now that the vehicle isn't carried } - g->m.dirty_vehicle_list.insert( this ); + here.dirty_vehicle_list.insert( this ); part_removal_cleanup(); } else { //~ %s is the vehicle being loaded onto the bicycle rack @@ -2270,6 +2295,7 @@ bool vehicle::split_vehicles( const std::vector> &new_vehs, { bool did_split = false; size_t i = 0; + map &here = get_map(); for( i = 0; i < new_vehs.size(); i ++ ) { std::vector split_parts = new_vehs[ i ]; if( split_parts.empty() ) { @@ -2302,7 +2328,7 @@ bool vehicle::split_vehicles( const std::vector> &new_vehs, } new_v_pos3 = global_part_pos3( parts[ split_part0 ] ); mnt_offset = parts[ split_part0 ].mount; - new_vehicle = g->m.add_vehicle( vproto_id( "none" ), new_v_pos3, face.dir() ); + new_vehicle = here.add_vehicle( vproto_id( "none" ), new_v_pos3, face.dir() ); if( new_vehicle == nullptr ) { // the split part was out of the map bounds. continue; @@ -2396,8 +2422,8 @@ bool vehicle::split_vehicles( const std::vector> &new_vehs, // time we interact with them new_vehicle->zones_dirty = true; - g->m.dirty_vehicle_list.insert( new_vehicle ); - g->m.set_transparency_cache_dirty( sm_pos.z ); + here.dirty_vehicle_list.insert( new_vehicle ); + here.set_transparency_cache_dirty( sm_pos.z ); if( !new_labels.empty() ) { new_vehicle->labels = new_labels; } @@ -2610,7 +2636,7 @@ bool vehicle::has_part( const tripoint &pos, const std::string &flag, bool enabl const tripoint relative_pos = pos - global_pos3(); for( const auto &e : parts ) { - if( e.precalc[0].x != relative_pos.x || e.precalc[0].y != relative_pos.y ) { + if( e.precalc[0] != relative_pos ) { continue; } if( !e.removed && ( !enabled || e.enabled ) && !e.is_broken() && e.info().has_flag( flag ) ) { @@ -2626,7 +2652,7 @@ std::vector vehicle::get_parts_at( const tripoint &pos, const st const tripoint relative_pos = pos - global_pos3(); std::vector res; for( auto &e : parts ) { - if( e.precalc[ 0 ].x != relative_pos.x || e.precalc[ 0 ].y != relative_pos.y ) { + if( e.precalc[ 0 ] != relative_pos ) { continue; } if( !e.removed && @@ -2646,7 +2672,7 @@ std::vector vehicle::get_parts_at( const tripoint &pos, const tripoint relative_pos = pos - global_pos3(); std::vector res; for( const auto &e : parts ) { - if( e.precalc[ 0 ].x != relative_pos.x || e.precalc[ 0 ].y != relative_pos.y ) { + if( e.precalc[ 0 ] != relative_pos ) { continue; } if( !e.removed && @@ -2936,7 +2962,7 @@ bool vehicle::part_flag( int part, const vpart_bitflags flag ) const int vehicle::part_at( const point &dp ) const { for( const vpart_reference &vp : get_all_parts() ) { - if( vp.part().precalc[0] == dp && !vp.part().removed ) { + if( vp.part().precalc[0].xy() == dp && !vp.part().removed ) { return static_cast( vp.part_index() ); } } @@ -2988,13 +3014,14 @@ int vehicle::part_displayed_at( const point &dp ) const return -1; } - bool in_vehicle = g->u.in_vehicle; + Character &player_character = get_player_character(); + bool in_vehicle = player_character.in_vehicle; if( in_vehicle ) { // They're in a vehicle, but are they in /this/ vehicle? std::vector psg_parts = boarded_parts(); in_vehicle = false; for( auto &psg_part : psg_parts ) { - if( get_passenger( psg_part ) == &g->u ) { + if( get_passenger( psg_part ) == &player_character ) { in_vehicle = true; break; } @@ -3030,12 +3057,12 @@ int vehicle::roof_at_part( const int part ) const point vehicle::coord_translate( const point &p ) const { - point q; + tripoint q; coord_translate( pivot_rotation[0], pivot_anchor[0], p, q ); - return q; + return q.xy(); } -void vehicle::coord_translate( int dir, const point &pivot, const point &p, point &q ) const +void vehicle::coord_translate( int dir, const point &pivot, const point &p, tripoint &q ) const { tileray tdir( dir ); tdir.advance( p.x - pivot.x ); @@ -3043,7 +3070,7 @@ void vehicle::coord_translate( int dir, const point &pivot, const point &p, poin q.y = tdir.dy() + tdir.ortho_dy( p.y - pivot.y ); } -void vehicle::coord_translate( tileray tdir, const point &pivot, const point &p, point &q ) const +void vehicle::coord_translate( tileray tdir, const point &pivot, const point &p, tripoint &q ) const { tdir.clear_advance(); tdir.advance( p.x - pivot.x ); @@ -3053,9 +3080,9 @@ void vehicle::coord_translate( tileray tdir, const point &pivot, const point &p, point vehicle::rotate_mount( int old_dir, int new_dir, const point &pivot, const point &p ) const { - point q; + tripoint q; coord_translate( new_dir - old_dir, pivot, p, q ); - return q; + return q.xy(); } tripoint vehicle::mount_to_tripoint( const point &mount ) const @@ -3065,7 +3092,7 @@ tripoint vehicle::mount_to_tripoint( const point &mount ) const tripoint vehicle::mount_to_tripoint( const point &mount, const point &offset ) const { - point mnt_translated; + tripoint mnt_translated; coord_translate( pivot_rotation[0], pivot_anchor[ 0 ], mount + offset, mnt_translated ); return global_pos3() + mnt_translated; } @@ -3076,7 +3103,7 @@ void vehicle::precalc_mounts( int idir, int dir, const point &pivot ) idir = 0; } tileray tdir( dir ); - std::unordered_map mount_to_precalc; + std::unordered_map mount_to_precalc; for( auto &p : parts ) { if( p.removed ) { continue; @@ -3152,11 +3179,10 @@ tripoint vehicle::global_part_pos3( const vehicle_part &pt ) const return global_pos3() + pt.precalc[ 0 ]; } -void vehicle::set_submap_moved( const point &p ) +void vehicle::set_submap_moved( const tripoint &p ) { - const point old_msp = g->m.getabs( global_pos3().xy() ); - sm_pos.x = p.x; - sm_pos.y = p.y; + const point old_msp = get_map().getabs( global_pos3().xy() ); + sm_pos = p; if( !tracking_on ) { return; } @@ -3211,22 +3237,25 @@ point vehicle::pivot_displacement() const // the vehicle. // rotate the old pivot point around the new pivot point with the old rotation angle - point dp; + tripoint dp; coord_translate( pivot_rotation[0], pivot_anchor[1], pivot_anchor[0], dp ); - return dp; + return dp.xy(); } int vehicle::fuel_left( const itype_id &ftype, bool recurse ) const { - int fl = std::accumulate( parts.begin(), parts.end(), 0, [&ftype]( const int &lhs, - const vehicle_part & rhs ) { - // don't count frozen liquid - if( rhs.is_tank() && !rhs.base.contents.empty() && - rhs.base.contents.legacy_front().made_of( phase_id::SOLID ) ) { - return lhs; + int fl = 0; + + for( const int i : fuel_containers ) { + const vehicle_part &part = parts[i]; + if( part.ammo_current() != ftype || + // don't count frozen liquid + ( !part.base.contents.empty() && part.is_tank() && + part.base.contents.legacy_front().made_of( phase_id::SOLID ) ) ) { + continue; } - return lhs + ( rhs.ammo_current() == ftype ? rhs.ammo_remaining() : 0 ); - } ); + fl += part.ammo_remaining(); + } if( recurse && ftype == fuel_type_battery ) { auto fuel_counting_visitor = [&]( vehicle const * veh, int amount, int ) { @@ -3241,18 +3270,20 @@ int vehicle::fuel_left( const itype_id &ftype, bool recurse ) const //muscle engines have infinite fuel if( ftype == fuel_type_muscle ) { + Character &player_character = get_player_character(); // TODO: Allow NPCs to power those - const optional_vpart_position vp = g->m.veh_at( g->u.pos() ); - bool player_controlling = player_in_control( g->u ); + const optional_vpart_position vp = get_map().veh_at( player_character.pos() ); + bool player_controlling = player_in_control( player_character ); //if the engine in the player tile is a muscle engine, and player is controlling vehicle if( vp && &vp->vehicle() == this && player_controlling ) { const int p = avail_part_with_feature( vp->part_index(), VPFLAG_ENGINE, true ); if( p >= 0 && is_part_on( p ) && part_info( p ).fuel_type == fuel_type_muscle ) { //Broken limbs prevent muscle engines from working - if( ( part_info( p ).has_flag( "MUSCLE_LEGS" ) && ( g->u.get_working_leg_count() >= 2 ) ) || + if( ( part_info( p ).has_flag( "MUSCLE_LEGS" ) && + ( player_character.get_working_leg_count() >= 2 ) ) || ( part_info( p ).has_flag( "MUSCLE_ARMS" ) && - ( g->u.get_working_arm_count() >= 2 ) ) ) { + ( player_character.get_working_arm_count() >= 2 ) ) ) { fl += 10; } } @@ -3449,10 +3480,11 @@ bool vehicle::can_use_rails() const if( !can_use ) { return false; } + map &here = get_map(); bool is_wheel_on_rail = false; for( int part_index : rail_wheelcache ) { // at least one wheel should be on track - if( g->m.has_flag_ter_or_furn( TFLAG_RAIL, global_part_pos3( part_index ) ) ) { + if( here.has_flag_ter_or_furn( TFLAG_RAIL, global_part_pos3( part_index ) ) ) { is_wheel_on_rail = true; break; } @@ -3692,14 +3724,16 @@ int vehicle::safe_velocity( const bool fueled ) const bool vehicle::do_environmental_effects() { bool needed = false; + map &here = get_map(); // check for smoking parts for( const vpart_reference &vp : get_all_parts() ) { /* Only lower blood level if: * - The part is outside. * - The weather is any effect that would cause the player to be wet. */ - if( vp.part().blood > 0 && g->m.is_outside( vp.pos() ) ) { + if( vp.part().blood > 0 && here.is_outside( vp.pos() ) ) { needed = true; - if( g->weather.weather >= WEATHER_LIGHT_DRIZZLE && g->weather.weather <= WEATHER_ACID_RAIN ) { + if( get_weather().weather_id->rains && + get_weather().weather_id->precip != precip_class::very_light ) { vp.part().blood--; } } @@ -3714,7 +3748,7 @@ void vehicle::spew_field( double joules, int part, field_type_id type, int inten } intensity = std::max( joules / 10000, static_cast( intensity ) ); const tripoint dest = exhaust_dest( part ); - g->m.mod_field_intensity( dest, type, intensity ); + get_map().mod_field_intensity( dest, type, intensity ); } /** @@ -4092,7 +4126,7 @@ bool vehicle::has_sufficient_rotorlift() const bool vehicle::is_rotorcraft() const { return ( has_part( "ROTOR" ) || has_part( "ROTOR_SIMPLE" ) ) && has_sufficient_rotorlift() && - player_in_control( g->u ); + player_in_control( get_player_character() ); } bool vehicle::is_flyable() const @@ -4416,7 +4450,7 @@ float vehicle::steering_effectiveness() const float vehicle::handling_difficulty() const { const float steer = std::max( 0.0f, steering_effectiveness() ); - const float ktraction = k_traction( g->m.vehicle_wheel_traction( *this ) ); + const float ktraction = k_traction( get_map().vehicle_wheel_traction( *this ) ); const float aligned = std::max( 0.0f, 1.0f - ( face_vec() - dir_vec() ).magnitude() ); // TestVehicle: perfect steering, moving on road at 100 mph (25 tiles per turn) = 0.0 @@ -4428,6 +4462,32 @@ float vehicle::handling_difficulty() const return velocity * diff_mod / vehicles::vmiph_per_tile; } + +int vehicle::engine_fuel_usage( int e ) const +{ + if( !is_engine_on( e ) ) { + return 0; + } + + static const itype_id null_fuel_type( "null" ); + const itype_id &cur_fuel = parts[engines[e]].fuel_current(); + if( cur_fuel == null_fuel_type ) { + return 0; + } + + if( is_perpetual_type( e ) ) { + return 0; + } + const auto &info = part_info( engines[ e ] ); + + int usage = info.energy_consumption; + if( parts[ engines[ e ] ].faults().count( fault_engine_filter_air ) ) { + usage *= 2; + } + + return usage; +} + std::map vehicle::fuel_usage() const { std::map ret; @@ -4439,7 +4499,6 @@ std::map vehicle::fuel_usage() const } const size_t e = engines[ i ]; - const auto &info = part_info( e ); static const itype_id null_fuel_type( "null" ); const itype_id &cur_fuel = parts[ e ].fuel_current(); if( cur_fuel == null_fuel_type ) { @@ -4447,12 +4506,7 @@ std::map vehicle::fuel_usage() const } if( !is_perpetual_type( i ) ) { - int usage = info.energy_consumption; - if( parts[ e ].faults().count( fault_engine_filter_air ) ) { - usage *= 2; - } - - ret[ cur_fuel ] += usage; + ret[cur_fuel] += engine_fuel_usage( i ); } } @@ -4498,7 +4552,9 @@ void vehicle::consume_fuel( int load, const int t_seconds, bool skip_electric ) fuel_remainder[ ft ] = -amnt_precise_j; } } - if( load > 0 && fuel_left( fuel_type_muscle ) > 0 && g->u.has_effect( effect_winded ) ) { + Character &player_character = get_player_character(); + if( load > 0 && fuel_left( fuel_type_muscle ) > 0 && + player_character.has_effect( effect_winded ) ) { cruise_velocity = 0; if( velocity == 0 ) { stop(); @@ -4506,7 +4562,7 @@ void vehicle::consume_fuel( int load, const int t_seconds, bool skip_electric ) } // we want this to update the activity level whenever the engine is running if( load > 0 && fuel_left( fuel_type_muscle ) > 0 ) { - g->u.increase_activity_level( ACTIVE_EXERCISE ); + player_character.increase_activity_level( ACTIVE_EXERCISE ); //do this as a function of current load // But only if the player is actually there! int eff_load = load / 10; @@ -4516,28 +4572,30 @@ void vehicle::consume_fuel( int load, const int t_seconds, bool skip_electric ) base_burn = std::max( eff_load / 3, base_burn ); //charge bionics when using muscle engine const item muscle( "muscle" ); - for( const bionic_id &bid : g->u.get_bionic_fueled_with( muscle ) ) { - if( g->u.has_active_bionic( bid ) ) { // active power gen + for( const bionic_id &bid : player_character.get_bionic_fueled_with( muscle ) ) { + if( player_character.has_active_bionic( bid ) ) { // active power gen // more pedaling = more power - g->u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->fuel_efficiency * - ( load / 1000 ) ); + player_character.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * + bid->fuel_efficiency * + ( load / 1000 ) ); mod += eff_load / 5; } else { // passive power gen - g->u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->passive_fuel_efficiency * - ( load / 1000 ) ); + player_character.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * + bid->passive_fuel_efficiency * + ( load / 1000 ) ); mod += eff_load / 10; } } // decreased stamina burn scalable with load - if( g->u.has_active_bionic( bio_jointservo ) ) { - g->u.mod_power_level( units::from_kilojoule( -std::max( eff_load / 20, 1 ) ) ); + if( player_character.has_active_bionic( bio_jointservo ) ) { + player_character.mod_power_level( units::from_kilojoule( -std::max( eff_load / 20, 1 ) ) ); mod -= std::max( eff_load / 5, 5 ); } if( one_in( 1000 / load ) && one_in( 10 ) ) { - g->u.mod_thirst( 1 ); - g->u.mod_fatigue( 1 ); + player_character.mod_thirst( 1 ); + player_character.mod_fatigue( 1 ); } - g->u.mod_stamina( -( base_burn + mod ) ); + player_character.mod_stamina( -( base_burn + mod ) ); add_msg( m_debug, "Load: %d", load ); add_msg( m_debug, "Mod: %d", mod ); add_msg( m_debug, "Burn: %d", -( base_burn + mod ) ); @@ -4564,6 +4622,43 @@ int vehicle::total_accessory_epower_w() const return epower; } +std::pair vehicle::battery_power_level() const +{ + int total_epower_capacity = 0; + int remaining_epower = 0; + + for( const int bi : batteries ) { + const vehicle_part &b = parts[bi]; + if( b.is_available() ) { + remaining_epower += b.ammo_remaining(); + total_epower_capacity += b.ammo_capacity( ammotype( "battery" ) ); + } + } + + return std::make_pair( remaining_epower, total_epower_capacity ); +} + +bool vehicle::start_engine( int e, bool turn_on ) +{ + if( parts[engines[e]].enabled == turn_on ) { + return false; + } + bool res = false; + if( turn_on ) { + toggle_specific_engine( e, true ); + // prevent starting of the faulty engines + if( ! start_engine( e ) ) { + toggle_specific_engine( e, false ); + } else { + res = true; + } + } else { + toggle_specific_engine( e, false ); + res = true; + } + return res; +} + int vehicle::total_alternator_epower_w() const { int epower = 0; @@ -4599,12 +4694,13 @@ int vehicle::total_engine_epower_w() const int vehicle::total_solar_epower_w() const { int epower_w = 0; + map &here = get_map(); for( int part : solar_panels ) { if( parts[ part ].is_unavailable() ) { continue; } - if( !is_sm_tile_outside( g->m.getabs( global_part_pos3( part ) ) ) ) { + if( !is_sm_tile_outside( here.getabs( global_part_pos3( part ) ) ) ) { continue; } @@ -4612,7 +4708,7 @@ int vehicle::total_solar_epower_w() const } // Weather doesn't change much across the area of the vehicle, so just // sample it once. - weather_type wtype = current_weather( global_pos3() ); + weather_type_id wtype = current_weather( global_pos3() ); const float tick_sunlight = incident_sunlight( wtype, calendar::turn ); double intensity = tick_sunlight / default_daylight_level(); return epower_w * intensity; @@ -4620,21 +4716,23 @@ int vehicle::total_solar_epower_w() const int vehicle::total_wind_epower_w() const { - const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( g->m.getabs( global_pos3() ) ) ); - const w_point weatherPoint = *g->weather.weather_precise; + map &here = get_map(); + const oter_id &cur_om_ter = overmap_buffer.ter( ms_to_omt_copy( here.getabs( global_pos3() ) ) ); + weather_manager &weather = get_weather(); + const w_point weatherPoint = *weather.weather_precise; int epower_w = 0; for( int part : wind_turbines ) { if( parts[ part ].is_unavailable() ) { continue; } - if( !is_sm_tile_outside( g->m.getabs( global_part_pos3( part ) ) ) ) { + if( !is_sm_tile_outside( here.getabs( global_part_pos3( part ) ) ) ) { continue; } - double windpower = get_local_windpower( g->weather.windspeed, cur_om_ter, global_part_pos3( part ), - g->weather.winddirection, false ); - if( windpower <= ( g->weather.windspeed / 10.0 ) ) { + double windpower = get_local_windpower( weather.windspeed, cur_om_ter, global_part_pos3( part ), + weather.winddirection, false ); + if( windpower <= ( weather.windspeed / 10.0 ) ) { continue; } epower_w += part_epower_w( part ) * windpower; @@ -4645,12 +4743,13 @@ int vehicle::total_wind_epower_w() const int vehicle::total_water_wheel_epower_w() const { int epower_w = 0; + map &here = get_map(); for( int part : water_wheels ) { if( parts[ part ].is_unavailable() ) { continue; } - if( !is_sm_tile_over_water( g->m.getabs( global_part_pos3( part ) ) ) ) { + if( !is_sm_tile_over_water( here.getabs( global_part_pos3( part ) ) ) ) { continue; } @@ -4708,8 +4807,10 @@ void vehicle::power_parts() int epower = engine_epower + total_accessory_epower_w() + total_alternator_epower_w(); int delta_energy_bat = power_to_energy_bat( epower, 1_turns ); - int storage_deficit_bat = std::max( 0, fuel_capacity( fuel_type_battery ) - - fuel_left( fuel_type_battery ) - delta_energy_bat ); + int battery_left, battery_capacity; + std::tie( battery_left, battery_capacity ) = battery_power_level(); + int storage_deficit_bat = std::max( 0, battery_capacity - battery_left - delta_energy_bat ); + Character &player_character = get_player_character(); // Reactors trigger only on demand. If we'd otherwise run out of power, see // if we can spin up the reactors. if( !reactors.empty() && storage_deficit_bat > 0 ) { @@ -4754,7 +4855,7 @@ void vehicle::power_parts() for( auto &elem : reactors ) { parts[ elem ].enabled = false; } - if( player_in_control( g->u ) || g->u.sees( global_pos3() ) ) { + if( player_in_control( player_character ) || player_character.sees( global_pos3() ) ) { add_msg( _( "The %s's reactor dies!" ), name ); } } @@ -4788,13 +4889,13 @@ void vehicle::power_parts() is_alarm_on = false; camera_on = false; - if( player_in_control( g->u ) || g->u.sees( global_pos3() ) ) { + if( player_in_control( player_character ) || player_character.sees( global_pos3() ) ) { add_msg( _( "The %s's battery dies!" ), name ); } if( engine_epower < 0 ) { // Not enough epower to run gas engine ignition system engine_on = false; - if( player_in_control( g->u ) || g->u.sees( global_pos3() ) ) { + if( player_in_control( player_character ) || player_character.sees( global_pos3() ) ) { add_msg( _( "The %s's engine dies!" ), name ); } } @@ -4803,9 +4904,10 @@ void vehicle::power_parts() vehicle *vehicle::find_vehicle( const tripoint &where ) { + map &here = get_map(); // Is it in the reality bubble? - tripoint veh_local = g->m.getlocal( where ); - if( const optional_vpart_position vp = g->m.veh_at( veh_local ) ) { + tripoint veh_local = here.getlocal( where ); + if( const optional_vpart_position vp = here.veh_at( veh_local ) ) { return &vp->vehicle(); } @@ -4859,7 +4961,7 @@ int vehicle::traverse_vehicle_graph( Vehicle *start_veh, int amount, Func action visited_vehs.insert( current_veh ); connected_vehs.pop(); - g->u.add_msg_if_player( m_debug, "Traversing graph with %d power", amount ); + add_msg( m_debug, "Traversing graph with %d power", amount ); for( auto &p : current_veh->loose_parts ) { if( !current_veh->part_info( p ).has_flag( "POWER_TRANSFER" ) ) { @@ -4880,12 +4982,11 @@ int vehicle::traverse_vehicle_graph( Vehicle *start_veh, int amount, Func action connected_vehs.push( std::make_pair( target_veh, target_loss ) ); float loss_amount = ( static_cast( amount ) * static_cast( target_loss ) ) / 100; - g->u.add_msg_if_player( m_debug, "Visiting remote %p with %d power (loss %f, which is %d percent)", - static_cast( target_veh ), amount, loss_amount, target_loss ); + add_msg( m_debug, "Visiting remote %p with %d power (loss %f, which is %d percent)", + static_cast( target_veh ), amount, loss_amount, target_loss ); amount = action( target_veh, amount, static_cast( loss_amount ) ); - g->u.add_msg_if_player( m_debug, "After remote %p, %d power", static_cast( target_veh ), - amount ); + add_msg( m_debug, "After remote %p, %d power", static_cast( target_veh ), amount ); if( amount < 1 ) { break; // No more charge to donate away. @@ -4925,7 +5026,7 @@ int vehicle::charge_battery( int amount, bool include_other_vehicles ) } auto charge_visitor = []( vehicle * veh, int amount, int lost ) { - g->u.add_msg_if_player( m_debug, "CH: %d", amount - lost ); + add_msg( m_debug, "CH: %d", amount - lost ); return veh->charge_battery( amount - lost, false ); }; @@ -4962,7 +5063,7 @@ int vehicle::discharge_battery( int amount, bool recurse ) } auto discharge_visitor = []( vehicle * veh, int amount, int lost ) { - g->u.add_msg_if_player( m_debug, "CH: %d", amount + lost ); + add_msg( m_debug, "CH: %d", amount + lost ); return veh->discharge_battery( amount + lost, false ); }; if( amount > 0 && recurse ) { // need more power! @@ -4989,7 +5090,10 @@ void vehicle::do_engine_damage( size_t e, int strain ) void vehicle::idle( bool on_map ) { + avg_velocity = ( velocity + avg_velocity ) / 2; + power_parts(); + Character &player_character = get_player_character(); if( engine_on && total_power_w() > 0 ) { int idle_rate = alternator_load; if( idle_rate < 10 ) { @@ -5008,7 +5112,7 @@ void vehicle::idle( bool on_map ) noise_and_smoke( idle_rate, 1_turns ); } } else { - if( engine_on && g->u.sees( global_pos3() ) && + if( engine_on && player_character.sees( global_pos3() ) && ( has_engine_type_not( fuel_type_muscle, true ) && has_engine_type_not( fuel_type_animal, true ) && has_engine_type_not( fuel_type_wind, true ) && has_engine_type_not( fuel_type_mana, true ) ) ) { add_msg( _( "The %s's engine dies!" ), name ); @@ -5016,15 +5120,17 @@ void vehicle::idle( bool on_map ) engine_on = false; } - if( !warm_enough_to_plant( g->u.pos() ) ) { + if( !warm_enough_to_plant( player_character.pos() ) ) { for( const vpart_reference &vp : get_enabled_parts( "PLANTER" ) ) { - if( g->u.sees( global_pos3() ) ) { + if( player_character.sees( global_pos3() ) ) { add_msg( _( "The %s's planter turns off due to low temperature." ), name ); } vp.part().enabled = false; } } + smart_controller_handle_turn(); + if( !on_map ) { return; } else { @@ -5068,6 +5174,7 @@ void vehicle::on_move() void vehicle::slow_leak() { + map &here = get_map(); // for each badly damaged tanks (lower than 50% health), leak a small amount for( auto &p : parts ) { auto health = p.health_percent(); @@ -5083,12 +5190,12 @@ void vehicle::slow_leak() // damaged batteries self-discharge without leaking, plutonium leaks slurry if( fuel != fuel_type_battery && fuel != fuel_type_plutonium_cell ) { item leak( fuel, calendar::turn, qty ); - g->m.add_item_or_charges( dest, leak ); + here.add_item_or_charges( dest, leak ); p.ammo_consume( qty, global_part_pos3( p ) ); } else if( fuel == fuel_type_plutonium_cell ) { if( p.ammo_remaining() >= PLUTONIUM_CHARGES / 10 ) { item leak( "plut_slurry_dense", calendar::turn, qty ); - g->m.add_item_or_charges( dest, leak ); + here.add_item_or_charges( dest, leak ); p.ammo_consume( qty * PLUTONIUM_CHARGES / 10, global_part_pos3( p ) ); } else { p.ammo_consume( p.ammo_remaining(), global_part_pos3( p ) ); @@ -5317,7 +5424,7 @@ void vehicle::gain_moves() { fuel_used_last_turn.clear(); check_falling_or_floating(); - const bool pl_control = player_in_control( g->u ); + const bool pl_control = player_in_control( get_player_character() ); if( is_moving() || is_falling ) { if( !loose_parts.empty() ) { shed_loose_parts(); @@ -5371,9 +5478,10 @@ void vehicle::gain_moves() void vehicle::dump_items_from_part( const size_t index ) { + map &here = get_map(); vehicle_part &vp = parts[ index ]; for( item &e : vp.items ) { - g->m.add_item_or_charges( global_part_pos3( vp ), e ); + here.add_item_or_charges( global_part_pos3( vp ), e ); } vp.items.clear(); } @@ -5388,10 +5496,10 @@ bool vehicle::decrement_summon_timer() const size_t p = vp.part_index(); dump_items_from_part( p ); } - if( g->u.sees( global_pos3() ) ) { + if( get_player_character().sees( global_pos3() ) ) { add_msg( m_info, _( "Your %s winks out of existence." ), name ); } - g->m.destroy_vehicle( this ); + get_map().destroy_vehicle( this ); return true; } else { *summon_time_limit -= 1_turns; @@ -5453,6 +5561,9 @@ void vehicle::refresh() steering.clear(); speciality.clear(); floating.clear(); + batteries.clear(); + fuel_containers.clear(); + alternator_load = 0; extra_drag = 0; all_wheels_on_one_axis = true; @@ -5476,6 +5587,9 @@ void vehicle::refresh() int railwheel_xmax = INT_MIN; int railwheel_ymax = INT_MIN; + has_enabled_smart_controller = false; + smart_controller_state = cata::nullopt; + bool refresh_done = false; // Main loop over all vehicle parts. @@ -5522,6 +5636,12 @@ void vehicle::refresh() if( vpi.has_flag( VPFLAG_ROTOR ) || vpi.has_flag( VPFLAG_ROTOR_SIMPLE ) ) { rotors.push_back( p ); } + if( vp.part().is_battery() ) { + batteries.push_back( p ); + } + if( vp.part().is_fuel_store( false ) ) { + fuel_containers.push_back( p ); + } if( vpi.has_flag( "WIND_TURBINE" ) ) { wind_turbines.push_back( p ); } @@ -5543,6 +5663,9 @@ void vehicle::refresh() if( vpi.has_flag( VPFLAG_WHEEL ) ) { wheelcache.push_back( p ); } + if( vpi.has_flag( "SMART_ENGINE_CONTROLLER" ) && vp.part().enabled ) { + has_enabled_smart_controller = true; + } if( vpi.has_flag( VPFLAG_WHEEL ) && vpi.has_flag( VPFLAG_RAIL ) ) { rail_wheelcache.push_back( p ); if( first_wheel_y_mount == INT_MAX ) { @@ -5748,13 +5871,14 @@ void vehicle::do_towing_move() invalidate_towing(); return; } - const tripoint tower_tow_point = g->m.getabs( global_part_pos3( tow_index ) ); - const tripoint towed_tow_point = g->m.getabs( towed_veh->global_part_pos3( other_tow_index ) ); + map &here = get_map(); + const tripoint tower_tow_point = here.getabs( global_part_pos3( tow_index ) ); + const tripoint towed_tow_point = here.getabs( towed_veh->global_part_pos3( other_tow_index ) ); // same as above, but where the pulling vehicle is pulling from double towing_veh_angle = towed_veh->get_angle_from_targ( tower_tow_point ); const bool reverse = towed_veh->tow_data.tow_direction == TOW_BACK; int accel_y = 0; - tripoint vehpos = g->m.getabs( towed_veh->global_pos3() ); + tripoint vehpos = here.getabs( towed_veh->global_pos3() ); int turn_x = get_turn_from_angle( towing_veh_angle, vehpos, tower_tow_point, reverse ); if( rl_dist( towed_tow_point, tower_tow_point ) < 6 ) { accel_y = reverse ? -1 : 1; @@ -5777,21 +5901,21 @@ void vehicle::do_towing_move() towed_veh->autodrive( point( turn_x, accel_y ) ); } else { towed_veh->skidding = true; - std::vector lineto = line_to( g->m.getlocal( towed_tow_point ), - g->m.getlocal( tower_tow_point ) ); + std::vector lineto = line_to( here.getlocal( towed_tow_point ), + here.getlocal( tower_tow_point ) ); tripoint nearby_destination; if( lineto.size() >= 2 ) { nearby_destination = lineto[1]; } else { nearby_destination = tower_tow_point; } - const int destination_delta_x = g->m.getlocal( tower_tow_point ).x - nearby_destination.x; - const int destination_delta_y = g->m.getlocal( tower_tow_point ).y - nearby_destination.y; + const int destination_delta_x = here.getlocal( tower_tow_point ).x - nearby_destination.x; + const int destination_delta_y = here.getlocal( tower_tow_point ).y - nearby_destination.y; const int destination_delta_z = towed_veh->global_pos3().z; const tripoint move_destination( clamp( destination_delta_x, -1, 1 ), clamp( destination_delta_y, -1, 1 ), clamp( destination_delta_z, -1, 1 ) ); - g->m.move_vehicle( *towed_veh, move_destination, towed_veh->face ); + here.move_vehicle( *towed_veh, move_destination, towed_veh->face ); towed_veh->move = tileray( point( destination_delta_x, destination_delta_y ) ); } @@ -5799,8 +5923,9 @@ void vehicle::do_towing_move() bool vehicle::is_external_part( const tripoint &part_pt ) const { - for( const tripoint &elem : g->m.points_in_radius( part_pt, 1 ) ) { - const optional_vpart_position vp = g->m.veh_at( elem ); + map &here = get_map(); + for( const tripoint &elem : here.points_in_radius( part_pt, 1 ) ) { + const optional_vpart_position vp = here.veh_at( elem ); if( !vp ) { return true; } @@ -5920,6 +6045,7 @@ void vehicle::invalidate_towing( bool first_vehicle ) if( other_veh && first_vehicle ) { other_veh->invalidate_towing(); } + map &here = get_map(); for( const vpart_reference &vp : get_all_parts() ) { const size_t p = vp.part_index(); if( vp.part().removed ) { @@ -5930,7 +6056,7 @@ void vehicle::invalidate_towing( bool first_vehicle ) if( first_vehicle ) { vehicle_part *part = &parts[part_with_feature( p, "TOW_CABLE", true )]; item drop = part->properties_to_item(); - g->m.add_item_or_charges( global_part_pos3( *part ), drop ); + here.add_item_or_charges( global_part_pos3( *part ), drop ); } remove_part( part_with_feature( p, "TOW_CABLE", true ) ); break; @@ -5951,7 +6077,8 @@ bool vehicle::tow_cable_too_far() const debugmsg( "towing data exists but no towing part" ); return false; } - tripoint towing_point = g->m.getabs( global_part_pos3( index ) ); + map &here = get_map(); + tripoint towing_point = here.getabs( global_part_pos3( index ) ); if( !tow_data.get_towed_by()->tow_data.get_towed() ) { debugmsg( "vehicle %s has data for a towing vehicle, but that towing vehicle does not have %s listed as towed", disp_name(), disp_name() ); @@ -5962,7 +6089,7 @@ bool vehicle::tow_cable_too_far() const debugmsg( "towing data exists but no towing part" ); return false; } - tripoint towed_point = g->m.getabs( tow_data.get_towed_by()->global_part_pos3( other_index ) ); + tripoint towed_point = here.getabs( tow_data.get_towed_by()->global_part_pos3( other_index ) ); if( towing_point == tripoint_zero || towed_point == tripoint_zero ) { debugmsg( "towing data exists but no towing part" ); return false; @@ -5982,7 +6109,8 @@ bool vehicle::no_towing_slack() const debugmsg( "towing data exists but no towing part" ); return false; } - tripoint towing_point = g->m.getabs( global_part_pos3( index ) ); + map &here = get_map(); + tripoint towing_point = here.getabs( global_part_pos3( index ) ); if( !tow_data.get_towed()->tow_data.get_towed_by() ) { debugmsg( "vehicle %s has data for a towed vehicle, but that towed vehicle does not have %s listed as tower", disp_name(), disp_name() ); @@ -5993,7 +6121,7 @@ bool vehicle::no_towing_slack() const debugmsg( "towing data exists but no towing part" ); return false; } - tripoint towed_point = g->m.getabs( tow_data.get_towed()->global_part_pos3( other_index ) ); + tripoint towed_point = here.getabs( tow_data.get_towed()->global_part_pos3( other_index ) ); if( towing_point == tripoint_zero || towed_point == tripoint_zero ) { debugmsg( "towing data exists but no towing part" ); return false; @@ -6008,7 +6136,7 @@ void vehicle::remove_remote_part( int part_num ) // If the target vehicle is still there, ask it to remove its part if( veh != nullptr ) { - const tripoint local_abs = g->m.getabs( global_part_pos3( part_num ) ); + const tripoint local_abs = get_map().getabs( global_part_pos3( part_num ) ); for( size_t j = 0; j < veh->loose_parts.size(); j++ ) { int remote_partnum = veh->loose_parts[j]; @@ -6024,6 +6152,7 @@ void vehicle::remove_remote_part( int part_num ) void vehicle::shed_loose_parts() { + map &here = get_map(); // remove_part rebuilds the loose_parts vector, when all of those parts have been removed, // it will stay empty. while( !loose_parts.empty() ) { @@ -6043,7 +6172,7 @@ void vehicle::shed_loose_parts() auto part = &parts[elem]; if( !magic ) { item drop = part->properties_to_item(); - g->m.add_item_or_charges( global_part_pos3( *part ), drop ); + here.add_item_or_charges( global_part_pos3( *part ), drop ); } remove_part( elem ); @@ -6122,9 +6251,10 @@ bool vpart_position::is_inside() const void vehicle::unboard_all() { + map &here = get_map(); std::vector bp = boarded_parts(); for( auto &i : bp ) { - g->m.unboard_vehicle( global_part_pos3( i ) ); + here.unboard_vehicle( global_part_pos3( i ) ); } } @@ -6257,7 +6387,7 @@ void vehicle::shift_parts( const point &delta ) pivot_anchor[0] -= delta; refresh(); //Need to also update the map after this - g->m.reset_vehicle_cache( sm_pos.z ); + get_map().reset_vehicle_cache( sm_pos.z ); } /** @@ -6301,20 +6431,22 @@ int vehicle::break_off( int p, int dmg ) if( rng( 0, part_info( p ).durability / 10 ) >= dmg ) { return dmg; } + map &here = get_map(); const tripoint pos = global_part_pos3( p ); const auto scatter_parts = [&]( const vehicle_part & pt ) { for( const item &piece : pt.pieces_for_broken_part() ) { // inside the loop, so each piece goes to a different place // TODO: this may spawn items behind a wall - const tripoint where = random_entry( g->m.points_in_radius( pos, SCATTER_DISTANCE ) ); + const tripoint where = random_entry( here.points_in_radius( pos, SCATTER_DISTANCE ) ); // TODO: balance audit, ensure that less pieces are generated than one would need // to build the component (smash a vehicle box that took 10 lumps of steel, // find 12 steel lumps scattered after atom-smashing it with a tree trunk) if( !magic ) { - g->m.add_item_or_charges( where, piece ); + here.add_item_or_charges( where, piece ); } } }; + Character &player_character = get_player_character(); 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, true ); @@ -6326,26 +6458,26 @@ int vehicle::break_off( int p, int dmg ) if( parts[ parts_in_square[ index ] ].is_broken() ) { // Tearing off a broken part - break it up - if( g->u.sees( pos ) ) { + if( player_character.sees( pos ) ) { add_msg( m_bad, _( "The %s's %s breaks into pieces!" ), name, parts[ parts_in_square[ index ] ].name() ); } scatter_parts( parts[parts_in_square[index]] ); } else { // Intact (but possibly damaged) part - remove it in one piece - if( g->u.sees( pos ) ) { + if( player_character.sees( pos ) ) { add_msg( m_bad, _( "The %1$s's %2$s is torn off!" ), name, parts[ parts_in_square[ index ] ].name() ); } if( !magic ) { item part_as_item = parts[parts_in_square[index]].properties_to_item(); - g->m.add_item_or_charges( pos, part_as_item ); + here.add_item_or_charges( pos, part_as_item ); } } remove_part( parts_in_square[index] ); } // After clearing the frame, remove it. - if( g->u.sees( pos ) ) { + if( player_character.sees( pos ) ) { add_msg( m_bad, _( "The %1$s's %2$s is destroyed!" ), name, parts[ p ].name() ); } scatter_parts( parts[p] ); @@ -6353,7 +6485,7 @@ int vehicle::break_off( int p, int dmg ) find_and_split_vehicles( p ); } else { //Just break it off - if( g->u.sees( pos ) ) { + if( player_character.sees( pos ) ) { add_msg( m_bad, _( "The %1$s's %2$s is destroyed!" ), name, parts[ p ].name() ); } @@ -6402,7 +6534,8 @@ int vehicle::damage_direct( int p, int dmg, damage_type type ) if( is_autodriving ) { stop_autodriving(); } - g->m.set_memory_seen_cache_dirty( global_part_pos3( p ) ); + map &here = get_map(); + here.set_memory_seen_cache_dirty( global_part_pos3( p ) ); if( parts[p].is_broken() ) { return break_off( p, dmg ); } @@ -6419,6 +6552,11 @@ int vehicle::damage_direct( int p, int dmg, damage_type type ) dmg -= std::min( dmg, part_info( p ).damage_reduction[ type ] ); int dres = dmg - parts[p].hp(); if( mod_hp( parts[ p ], 0 - dmg, type ) ) { + if( is_flyable() && has_part( "ROTOR" ) && !parts[p].has_flag( VPFLAG_SIMPLE_PART ) ) { + // If we break a part, we can no longer fly the vehicle. + set_flyable( false ); + } + insides_dirty = true; pivot_dirty = true; @@ -6426,7 +6564,7 @@ int vehicle::damage_direct( int p, int dmg, damage_type type ) leak_fuel( parts [ p ] ); for( const auto &e : parts[p].items ) { - g->m.add_item_or_charges( global_part_pos3( p ), e ); + here.add_item_or_charges( global_part_pos3( p ), e ); } parts[p].items.clear(); @@ -6440,7 +6578,7 @@ int vehicle::damage_direct( int p, int dmg, damage_type type ) if( parts[p].is_fuel_store() ) { explode_fuel( p, type ); } else if( parts[ p ].is_broken() && part_flag( p, "UNMOUNT_ON_DAMAGE" ) ) { - g->m.spawn_item( global_part_pos3( p ), part_info( p ).item, 1, 0, calendar::turn ); + here.spawn_item( global_part_pos3( p ), part_info( p ).item, 1, 0, calendar::turn ); monster *mon = get_pet( p ); if( mon != nullptr && mon->has_effect( effect_harnessed ) ) { mon->remove_effect( effect_harnessed ); @@ -6462,10 +6600,11 @@ void vehicle::leak_fuel( vehicle_part &pt ) return; } + map &here = get_map(); // leak in random directions but prefer closest tiles and avoid walls or other obstacles - std::vector tiles = closest_tripoints_first( global_part_pos3( pt ), 1 ); - tiles.erase( std::remove_if( tiles.begin(), tiles.end(), []( const tripoint & e ) { - return !g->m.passable( e ); + std::vector tiles = closest_points_first( global_part_pos3( pt ), 1 ); + tiles.erase( std::remove_if( tiles.begin(), tiles.end(), [&here]( const tripoint & e ) { + return !here.passable( e ); } ), tiles.end() ); // leak up to 1/3 of remaining fuel per iteration and continue until the part is empty @@ -6474,7 +6613,7 @@ void vehicle::leak_fuel( vehicle_part &pt ) int qty = pt.ammo_consume( rng( 0, std::max( pt.ammo_remaining() / 3, 1 ) ), global_part_pos3( pt ) ); if( qty > 0 ) { - g->m.add_item_or_charges( random_entry( tiles ), item( fuel, calendar::turn, qty ) ); + here.add_item_or_charges( random_entry( tiles ), item( fuel, calendar::turn, qty ) ); } } @@ -6618,6 +6757,7 @@ void vehicle::update_time( const time_point &update_to ) int exhaust_part; std::tie( exhaust_part, muffle ) = get_exhaust_part(); + map &here = get_map(); // Parts emitting fields for( int idx : emitters ) { const vehicle_part &pt = parts[idx]; @@ -6625,13 +6765,13 @@ void vehicle::update_time( const time_point &update_to ) continue; } for( const emit_id &e : pt.info().emissions ) { - g->m.emit_field( global_part_pos3( pt ), e ); + here.emit_field( global_part_pos3( pt ), e ); } for( const emit_id &e : pt.info().exhaust ) { if( exhaust_part == -1 ) { - g->m.emit_field( global_part_pos3( pt ), e ); + here.emit_field( global_part_pos3( pt ), e ); } else { - g->m.emit_field( exhaust_dest( exhaust_part ), e ); + here.emit_field( exhaust_dest( exhaust_part ), e ); } } discharge_battery( pt.info().epower ); @@ -6661,7 +6801,7 @@ void vehicle::update_time( const time_point &update_to ) return; } // Get one weather data set per vehicle, they don't differ much across vehicle area - auto accum_weather = sum_conditions( update_from, update_to, g->m.getabs( global_pos3() ) ); + auto accum_weather = sum_conditions( update_from, update_to, here.getabs( global_pos3() ) ); // make some reference objects to use to check for reload const item water( "water" ); const item water_clean( "water_clean" ); @@ -6670,7 +6810,7 @@ void vehicle::update_time( const time_point &update_to ) const auto &pt = parts[idx]; // we need an unbroken funnel mounted on the exterior of the vehicle - if( pt.is_unavailable() || !is_sm_tile_outside( g->m.getabs( global_part_pos3( pt ) ) ) ) { + if( pt.is_unavailable() || !is_sm_tile_outside( here.getabs( global_part_pos3( pt ) ) ) ) { continue; } @@ -6708,7 +6848,7 @@ void vehicle::update_time( const time_point &update_to ) continue; } - if( !is_sm_tile_outside( g->m.getabs( global_part_pos3( part ) ) ) ) { + if( !is_sm_tile_outside( here.getabs( global_part_pos3( part ) ) ) ) { continue; } @@ -6825,7 +6965,7 @@ bounding_box vehicle::get_bounding_box() int i_use = 0; for( const tripoint &p : get_points( true ) ) { - const point pt = parts[part_at( p.xy() )].precalc[i_use]; + const point pt = parts[part_at( p.xy() )].precalc[i_use].xy(); if( pt.x < min_x ) { min_x = pt.x; } @@ -6875,23 +7015,74 @@ void vehicle::force_erase_part( int part_num ) parts.erase( parts.begin() + part_num ); } -void vehicle::advance_precalc_mounts( const point &new_pos, int submap_z ) -{ - for( vehicle_part &pt : parts ) { - pt.precalc[0] = pt.precalc[1]; +std::set vehicle::advance_precalc_mounts( const point &new_pos, const tripoint &src, + const tripoint &dp, int ramp_offset, const bool adjust_pos, + std::set parts_to_move ) +{ + map &here = get_map(); + std::set smzs; + // when a vehicle part enters the low end of a down ramp, or the high end of an up ramp, + // it immediately translates down or up a z-level, respectively, ending up on the low + // end of an up ramp or high end of a down ramp, respectively. The two ends are set + // past each other, like so: + // (side view) z+1 Rdh RDl + // z+0 RUh Rul + // A vehicle moving left to right on z+1 drives down to z+0 by entering the ramp down low end. + // A vehicle moving right to left on z+0 drives up to z+1 by entering the ramp up high end. + // A vehicle moving left to right on z+0 should ideally collide into a wall before entering + // the ramp up high end, but even if it does, it briefly transitions to z+1 before returning + // to z0 by entering the ramp down low end. + // A vehicle moving right to left on z+1 drives down to z+0 by entering the ramp down low end, + // then immediately returns to z+1 by entering the ramp up high end. + // When a vehicle's pivot point transitions a z-level via a ramp, all other pre-calc points + // make the opposite transition, so that points that were above an ascending pivot point are + // now level with it, and parts that were level with an ascending pivot point are now below + // it. + // parts that enter the translation portion of a ramp on the same displacement as the + // pivot point stay at the same relative z to the pivot point, as the ramp_offset adjustments + // cancel out. + // if a vehicle manages move partially up or down a ramp and then veers off course, it + // can get split across the z-levels and continue moving, enough though large parts of the + // vehicle are unsupported. In that case, move the unsupported parts down until they are + // supported. + int index = -1; + for( vehicle_part &prt : parts ) { + index += 1; + here.clear_vehicle_point_from_cache( this, src + prt.precalc[0] ); + // no parts means this is a normal horizontal or vertical move + if( parts_to_move.empty() ) { + prt.precalc[0] = prt.precalc[1]; + // partial part movement means we're zero-ing out after missing a ramp + } else if( adjust_pos && parts_to_move.find( index ) == parts_to_move.end() ) { + prt.precalc[0].z -= dp.z; + } else if( !adjust_pos && parts_to_move.find( index ) != parts_to_move.end() ) { + prt.precalc[0].z += dp.z; + } + if( here.has_flag( TFLAG_RAMP_UP, src + dp + prt.precalc[0] ) ) { + prt.precalc[0].z += 1; + } else if( here.has_flag( TFLAG_RAMP_DOWN, src + dp + prt.precalc[0] ) ) { + prt.precalc[0].z -= 1; + } + prt.precalc[0].z -= ramp_offset; + prt.precalc[1].z = prt.precalc[0].z; + smzs.insert( prt.precalc[0].z ); + } + if( adjust_pos ) { + if( parts_to_move.empty() ) { + pivot_anchor[0] = pivot_anchor[1]; + pivot_rotation[0] = pivot_rotation[1]; + } + pos = new_pos; } - pivot_anchor[0] = pivot_anchor[1]; - pivot_rotation[0] = pivot_rotation[1]; - - pos = new_pos; - sm_pos.z = submap_z; // Invalidate vehicle's point cache occupied_cache_time = calendar::before_time_starts; + return smzs; } bool vehicle::refresh_zones() { if( zones_dirty ) { + map &here = get_map(); decltype( loot_zones ) new_zones; for( auto const &z : loot_zones ) { zone_data zone = z.second; @@ -6907,7 +7098,7 @@ bool vehicle::refresh_zones() continue; } tripoint zone_pos = global_part_pos3( part_idx ); - zone_pos = g->m.getabs( zone_pos ); + zone_pos = here.getabs( zone_pos ); //Set the position of the zone to that part zone.set_position( std::pair( zone_pos, zone_pos ), false ); new_zones.emplace( z.first, zone ); diff --git a/src/vehicle.h b/src/vehicle.h index 8b7f5e828454c..eeb2a82f6aad0 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -101,6 +101,16 @@ enum veh_coll_type : int { num_veh_coll_types }; +struct smart_controller_cache { + time_point created = calendar::turn; + time_point gas_engine_last_turned_on = calendar::start_of_cataclysm; + bool gas_engine_shutdown_forbidden; + int velocity; + int battery_percent; + int battery_net_charge_rate; + float load; +}; + struct veh_collision { //int veh? int part = 0; @@ -365,7 +375,7 @@ struct vehicle_part { /** mount translated to face.dir [0] and turn_dir [1] */ // NOLINTNEXTLINE(cata-use-named-point-constants) - std::array precalc = { { point( -1, -1 ), point( -1, -1 ) } }; + std::array precalc = { { tripoint( -1, -1, 0 ), tripoint( -1, -1, 0 ) } }; /** current part health with range [0,durability] */ int hp() const; @@ -537,7 +547,7 @@ class turret_data * @param target coordinates that will be fired on. * @return the number of shots actually fired (may be zero). */ - int fire( player &p, const tripoint &target ); + int fire( Character &c, const tripoint &target ); bool can_reload() const; bool can_unload() const; @@ -571,6 +581,9 @@ struct label : public point { label( const point &p, std::string text ) : point( p ), text( std::move( text ) ) {} std::string text; + + void deserialize( JsonIn &jsin ); + void serialize( JsonOut &json ) const; }; class RemovePartHandler; @@ -758,9 +771,9 @@ class vehicle bool mod_hp( vehicle_part &pt, int qty, damage_type dt = DT_NULL ); // check if given player controls this vehicle - bool player_in_control( const player &p ) const; + bool player_in_control( const Character &p ) const; // check if player controls this vehicle remotely - bool remote_controlled( const player &p ) const; + bool remote_controlled( const Character &p ) const; // init parts state for randomly generated vehicle void init_state( int init_veh_fuel, int init_veh_status ); @@ -1042,10 +1055,10 @@ class vehicle point coord_translate( const point &p ) const; // Translate mount coordinates "p" into tile coordinates "q" using given pivot direction and anchor - void coord_translate( int dir, const point &pivot, const point &p, point &q ) const; + void coord_translate( int dir, const point &pivot, const point &p, tripoint &q ) const; // Translate mount coordinates "p" into tile coordinates "q" using given tileray and anchor // should be faster than previous call for repeated translations - void coord_translate( tileray tdir, const point &pivot, const point &p, point &q ) const; + void coord_translate( tileray tdir, const point &pivot, const point &p, tripoint &q ) const; // Rotates mount coordinates "p" from old_dir to new_dir along pivot point rotate_mount( int old_dir, int new_dir, const point &pivot, const point &p ) const; @@ -1146,6 +1159,8 @@ class vehicle */ std::map fuel_usage() const; + // current fuel usage for specific engine + int engine_fuel_usage( int e ) const; /** * Get all vehicle lights (excluding any that are destroyed) * @param active if true return only lights which are enabled @@ -1175,6 +1190,9 @@ class vehicle // taken from batteries. void power_parts(); + // Current and total battery power level as a pair + std::pair battery_power_level() const; + /** * Try to charge our (and, optionally, connected vehicles') batteries by the given amount. * @return amount of charge left over. @@ -1387,6 +1405,14 @@ class vehicle // @param z = z thrust for helicopters etc void thrust( int thd, int z = 0 ); + /** + * if smart controller is enabled, turns on and off engines depending on load and battery level + * @param thrusting must be true when called from vehicle::thrust and vehicle is thrusting + * @param k_traction_cache cached value of vehicle::k_traction, if empty, will be computed + */ + void smart_controller_handle_turn( bool thrusting = false, + cata::optional k_traction_cache = cata::nullopt ); + //deceleration due to ground friction and air resistance int slowdown( int velocity ) const; @@ -1635,10 +1661,16 @@ class vehicle bool is_part_on( int p ) const; //returns whether the engine uses specified fuel type bool is_engine_type( int e, const itype_id &ft ) const; + //returns whether the engine uses one of specific "combustion" fuel types (gas, diesel and diesel substitutes) + bool is_combustion_engine_type( int e ) const; //returns whether the alternator is operational bool is_alternator_on( int a ) const; - //mark engine as on or off + //turn engine as on or off (note: doesn't perform checks if engine can start) void toggle_specific_engine( int e, bool on ); + // try to turn engine on or off + // (tries to start it and toggles it on if successful, shutdown is always a success) + // returns true if engine status was changed + bool start_engine( int e, bool turn_on ); void toggle_specific_part( int p, bool on ); //true if an engine exists with specified type //If enabled true, this engine must be enabled to return true @@ -1692,7 +1724,7 @@ class vehicle * This should be called only when the vehicle has actually been moved, not when * the map is just shifted (in the later case simply set smx/smy directly). */ - void set_submap_moved( const point &p ); + void set_submap_moved( const tripoint &p ); void use_autoclave( int p ); void use_washing_machine( int p ); void use_dishwasher( int p ); @@ -1744,7 +1776,11 @@ class vehicle void force_erase_part( int part_num ); // Updates the internal precalculated mount offsets after the vehicle has been displaced // used in map::displace_vehicle() - void advance_precalc_mounts( const point &new_pos, int submap_z ); + std::set advance_precalc_mounts( const point &new_pos, const tripoint &src, + const tripoint &dp, int ramp_offset, + bool adjust_pos, std::set parts_to_move ); + // make sure the vehicle is supported across z-levels or on the same z-level + bool level_vehicle(); std::vector omt_path; // route for overmap-scale auto-driving std::vector alternators; // List of alternator indices @@ -1764,6 +1800,8 @@ class vehicle // List of parts that will not be on a vehicle very often, or which only one will be present std::vector speciality; std::vector floating; // List of parts that provide buoyancy to boats + std::vector batteries; // List of batteries + std::vector fuel_containers; // List parts with non-null ammo_type // config values std::string name; // vehicle name @@ -1786,6 +1824,9 @@ class vehicle bool magic = false; // when does the magic vehicle disappear? cata::optional summon_time_limit = cata::nullopt; + // cached values of the factors that determined last chosen engine state + cata::optional smart_controller_state = cata::nullopt; + bool has_enabled_smart_controller = false; private: mutable units::mass mass_cache; @@ -1834,6 +1875,12 @@ class vehicle point pos; // vehicle current velocity, mph * 100 int velocity = 0; + /** + * vehicle continuous moving average velocity + * see https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + * alpha is 0.5: avg_velocity = avg_velocity + 0.5(velocity - avg_velocity) = 0.5 avg_velocity + 0.5 velocity + */ + int avg_velocity = 0; // velocity vehicle's cruise control trying to achieve int cruise_velocity = 0; // Only used for collisions, vehicle falls instantly diff --git a/src/vehicle_display.cpp b/src/vehicle_display.cpp index 3895e85d6f551..6445b7cc234e7 100644 --- a/src/vehicle_display.cpp +++ b/src/vehicle_display.cpp @@ -47,8 +47,9 @@ char vehicle::part_sym( const int p, const bool exact ) const } } -// similar to part_sym(int p) but for use when drawing SDL tiles. Called only by cata_tiles during draw_vpart -// vector returns at least 1 element, max of 2 elements. If 2 elements the second denotes if it is open or damaged +// similar to part_sym(int p) but for use when drawing SDL tiles. Called only by cata_tiles +// during draw_vpart vector returns at least 1 element, max of 2 elements. If 2 elements the +// second denotes if it is open or damaged vpart_id vehicle::part_id_string( const int p, char &part_mod ) const { part_mod = 0; @@ -57,6 +58,11 @@ vpart_id vehicle::part_id_string( const int p, char &part_mod ) const } int displayed_part = part_displayed_at( parts[p].mount ); + if( displayed_part < 0 || displayed_part >= static_cast( parts.size() ) || + parts[ displayed_part ].removed ) { + return vpart_id::NULL_ID(); + } + const vpart_id idinfo = parts[displayed_part].id; if( part_flag( displayed_part, VPFLAG_OPENABLE ) && parts[displayed_part].open ) { diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index 282963a234ddd..f1056feca21f4 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -35,6 +35,7 @@ #include "enums.h" #include "int_id.h" #include "monster.h" +#include "vpart_range.h" #define dbg(x) DebugLog((x),D_MAP) << __FILE__ << ":" << __LINE__ << ": " @@ -116,6 +117,263 @@ int vehicle::slowdown( int at_velocity ) const return std::max( 1, slowdown ); } +void vehicle:: smart_controller_handle_turn( bool thrusting, + cata::optional k_traction_cache ) +{ + + if( !engine_on || !has_enabled_smart_controller ) { + smart_controller_state = cata::nullopt; + return; + } + + if( smart_controller_state && smart_controller_state->created == calendar::turn ) { + return; + } + + // controlled engines + // note: contains indices of of elements in `engines` array, not the part ids + std::vector c_engines; + for( int i = 0; i < static_cast( engines.size() ); ++i ) { + if( ( is_engine_type( i, fuel_type_battery ) || is_combustion_engine_type( i ) ) && + ( ( parts[ engines[ i ] ].is_available() && engine_fuel_left( i ) > 0 ) || + is_part_on( engines[ i ] ) ) ) { + c_engines.push_back( i ); + } + } + + bool rotorcraft = is_flying && is_rotorcraft(); + + if( rotorcraft || c_engines.size() <= 1 || c_engines.size() > 5 ) { // bail and shut down + for( const vpart_reference &vp : get_avail_parts( "SMART_ENGINE_CONTROLLER" ) ) { + vp.part().enabled = false; + } + + if( player_in_control( g->u ) ) { + if( rotorcraft ) { + add_msg( _( "Smart controller does not support flying vehicles." ) ); + } else if( c_engines.size() <= 1 ) { + add_msg( _( "Smart controller detects only a single controllable engine." ) ); + add_msg( _( "Smart controller is designed to control more than one engine." ) ); + } else { + add_msg( _( "Smart controller does not support more than five engines." ) ); + } + add_msg( m_bad, _( "Smart controller is shutting down." ) ); + } + has_enabled_smart_controller = false; + smart_controller_state = cata::nullopt; + return; + } + + int cur_battery_level, max_battery_level; + std::tie( cur_battery_level, max_battery_level ) = battery_power_level(); + int battery_level_percent = max_battery_level == 0 ? 0 : cur_battery_level * 100 / + max_battery_level; + + // when battery > 90%, discharge is allowed + // otherwise trying to charge battery to 90% within 30 minutes + bool discharge_forbidden_soft = battery_level_percent <= 90; + bool discharge_forbidden_hard = battery_level_percent <= 25; + int target_charging_rate = ( max_battery_level == 0 || !discharge_forbidden_soft ) ? 0 : + ( 9 * max_battery_level - 10 * cur_battery_level ) / ( 6 * 3 ); + // ( max_battery_level * 0.9 - cur_battery_level ) * (1000 / (60 * 30)) // originally + // ^ 90% bat to W ^ ^ 30 minutes + + int accel_demand = cruise_on + ? // using avg_velocity reduces unnecessary oscillations when traction is low + std::max( std::abs( cruise_velocity - velocity ), std::abs( cruise_velocity - avg_velocity ) ) : + ( thrusting ? 1000 : 0 ); + if( velocity != 0 && accel_demand == 0 ) { + accel_demand = 1; // to prevent zero fuel usage + } + + int velocity_demand = std::max( std::abs( this->velocity ), std::abs( cruise_velocity ) ); + + // for stationary vehicles all velocity and acceleration calculations are skipped + bool is_stationary = avg_velocity == 0 && velocity_demand == 0 && accel_demand == 0; + + bool gas_engine_shutdown_forbidden = smart_controller_state && + ( calendar::turn - smart_controller_state->gas_engine_last_turned_on ) < + 15_seconds; + + + smart_controller_cache cur_state; + + float traction = is_stationary ? 1.0f : + ( k_traction_cache ? *k_traction_cache : k_traction( get_map().vehicle_wheel_traction( *this ) ) ); + + int prev_mask = 0; + // opt_ prefix denotes values for currently found "optimal" engine configuration + int opt_net_echarge_rate = net_battery_charge_rate_w(); + // total engine fuel energy usage (J) + int opt_fuel_usage = 0; + + int opt_accel = is_stationary ? 1 : current_acceleration() * traction; + int opt_safe_vel = is_stationary ? 1 : safe_ground_velocity( true ); + float cur_load_approx = static_cast( std::min( accel_demand, + opt_accel ) ) / std::max( opt_accel, 1 ); + float cur_load_alternator = std::min( 0.01f, static_cast( alternator_load ) / 1000 ); + + for( size_t i = 0; i < c_engines.size(); ++i ) { + if( is_engine_on( c_engines[i] ) ) { + prev_mask |= 1 << i; + bool is_electric = is_engine_type( c_engines[i], fuel_type_battery ); + int fu = engine_fuel_usage( c_engines[i] ) * ( cur_load_approx + ( is_electric ? 0 : + cur_load_alternator ) ); + opt_fuel_usage += fu; + if( is_electric ) { + opt_net_echarge_rate -= fu; + } + } + } + cur_state.created = calendar::turn; + cur_state.battery_percent = battery_level_percent; + cur_state.battery_net_charge_rate = opt_net_echarge_rate; + cur_state.velocity = avg_velocity; + cur_state.load = cur_load_approx + cur_load_alternator; + if( smart_controller_state ) { + cur_state.gas_engine_last_turned_on = smart_controller_state->gas_engine_last_turned_on; + } + cur_state.gas_engine_shutdown_forbidden = gas_engine_shutdown_forbidden; + + int opt_mask = prev_mask; // save current engine state, because it will be temporarily modified + + // if vehicle state has not change, skip actual optimization + if( smart_controller_state && + std::abs( smart_controller_state->velocity - cur_state.velocity ) < 100 && + std::abs( smart_controller_state->battery_percent - cur_state.battery_percent ) <= 2 && + std::abs( smart_controller_state->load - cur_state.load ) < 0.1 && // load diff < 10% + smart_controller_state->battery_net_charge_rate == cur_state.battery_net_charge_rate && + // reevaluate cache if when cache was created, gas engine shutdown was forbidden, but now it's not + !( smart_controller_state->gas_engine_shutdown_forbidden && !gas_engine_shutdown_forbidden ) + ) { + smart_controller_state->created = calendar::turn; + return; + } + + // trying all combinations of engine state (max 31 iterations for 5 engines) + for( int mask = 1; mask < static_cast( 1 << c_engines.size() ); ++mask ) { + if( mask == prev_mask ) { + continue; + } + + bool gas_engine_to_shut_down = false; + for( size_t i = 0; i < c_engines.size(); ++i ) { + bool old_state = ( prev_mask & ( 1 << i ) ) != 0; + bool new_state = ( mask & ( 1 << i ) ) != 0; + // switching enabled flag temporarily to perform calculations below + toggle_specific_engine( c_engines[i], new_state ); + + if( old_state && !new_state && !is_engine_type( c_engines[i], fuel_type_battery ) ) { + gas_engine_to_shut_down = true; + } + } + + if( gas_engine_to_shut_down && gas_engine_shutdown_forbidden ) { + continue; // skip checking this state + } + + int safe_vel = is_stationary ? 1 : safe_ground_velocity( true ); + int accel = is_stationary ? 1 : current_acceleration() * traction; + int fuel_usage = 0; + int net_echarge_rate = net_battery_charge_rate_w(); + float load_approx = static_cast( std::min( accel_demand, accel ) ) / std::max( accel, 1 ); + update_alternator_load(); + float load_approx_alternator = std::min( 0.01f, static_cast( alternator_load ) / 1000 ); + + for( int e : c_engines ) { + bool is_electric = is_engine_type( e, fuel_type_battery ); + int fu = engine_fuel_usage( e ) * ( load_approx + ( is_electric ? 0 : load_approx_alternator ) ); + fuel_usage += fu; + if( is_electric ) { + net_echarge_rate -= fu; + } + } + + if( std::forward_as_tuple( + !discharge_forbidden_hard || ( net_echarge_rate > 0 ), + accel >= accel_demand, + opt_accel < accel_demand ? accel : 0, // opt_accel usage here is intentional + safe_vel >= velocity_demand, + opt_safe_vel < velocity_demand ? -safe_vel : 0, //opt_safe_vel usage here is intentional + !discharge_forbidden_soft || ( net_echarge_rate > target_charging_rate ), + -fuel_usage, + net_echarge_rate + ) >= std::forward_as_tuple( + !discharge_forbidden_hard || ( opt_net_echarge_rate > 0 ), + opt_accel >= accel_demand, + opt_accel < accel_demand ? opt_accel : 0, + opt_safe_vel >= velocity_demand, + opt_safe_vel < velocity_demand ? -opt_safe_vel : 0, + !discharge_forbidden_soft || ( opt_net_echarge_rate > target_charging_rate ), + -opt_fuel_usage, + opt_net_echarge_rate + ) ) { + opt_mask = mask; + opt_fuel_usage = fuel_usage; + opt_net_echarge_rate = net_echarge_rate; + opt_accel = accel; + opt_safe_vel = safe_vel; + + cur_state.battery_net_charge_rate = net_echarge_rate; + cur_state.load = load_approx + load_approx_alternator; + // other `cur_state` fields do not change for different engine state combinations + } + } + + for( size_t i = 0; i < c_engines.size(); ++i ) { // return to prev state + toggle_specific_engine( c_engines[i], static_cast( prev_mask & ( 1 << i ) ) ); + } + + if( opt_mask != prev_mask ) { // we found new configuration + bool failed_to_start = false; + bool turned_on_gas_engine = false; + for( size_t i = 0; i < c_engines.size(); ++i ) { + // ..0.. < ..1.. was off, new state on + if( ( prev_mask & ( 1 << i ) ) < ( opt_mask & ( 1 << i ) ) ) { + if( !start_engine( c_engines[i], true ) ) { + failed_to_start = true; + } + turned_on_gas_engine |= !is_engine_type( c_engines[i], fuel_type_battery ); + } + } + if( failed_to_start ) { + this->smart_controller_state = cata::nullopt; + + for( size_t i = 0; i < c_engines.size(); ++i ) { // return to prev state + toggle_specific_engine( c_engines[i], static_cast( prev_mask & ( 1 << i ) ) ); + } + for( const vpart_reference &vp : get_avail_parts( "SMART_ENGINE_CONTROLLER" ) ) { + vp.part().enabled = false; + } + if( player_in_control( g->u ) ) { + add_msg( m_bad, _( "Smart controller failed to start an engine." ) ); + add_msg( m_bad, _( "Smart controller is shutting down." ) ); + } + has_enabled_smart_controller = false; + + } else { //successfully changed engines state + for( size_t i = 0; i < c_engines.size(); ++i ) { + // was on, needs to be off + if( ( prev_mask & ( 1 << i ) ) > ( opt_mask & ( 1 << i ) ) ) { + start_engine( c_engines[i], false ); + } + } + if( turned_on_gas_engine ) { + cur_state.gas_engine_last_turned_on = calendar::turn; + } + smart_controller_state = cur_state; + + if( player_in_control( g->u ) ) { + add_msg( m_debug, _( "Smart controller optimizes engine state." ) ); + } + } + } else { + // as the optimization was performed (even without state change), cache needs to be updated as well + smart_controller_state = cur_state; + } + update_alternator_load(); +} + void vehicle::thrust( int thd, int z ) { //if vehicle is stopped, set target direction to forward. @@ -124,7 +382,7 @@ void vehicle::thrust( int thd, int z ) turn_dir = face.dir(); stop(); } - bool pl_ctrl = player_in_control( g->u ); + bool pl_ctrl = player_in_control( get_player_character() ); // No need to change velocity if there are no wheels if( ( in_water && can_float() ) || ( is_rotorcraft() && ( z != 0 || is_flying ) ) ) { @@ -150,7 +408,12 @@ void vehicle::thrust( int thd, int z ) } // TODO: Pass this as an argument to avoid recalculating - float traction = k_traction( g->m.vehicle_wheel_traction( *this ) ); + float traction = k_traction( get_map().vehicle_wheel_traction( *this ) ); + + if( thrusting ) { + smart_controller_handle_turn( true, traction ); + } + int accel = current_acceleration() * traction; if( accel < 200 && velocity > 0 && is_towing() ) { if( pl_ctrl ) { @@ -358,8 +621,9 @@ void vehicle::stop( bool update_cache ) if( !update_cache ) { return; } + map &here = get_map(); for( const tripoint &p : get_points() ) { - g->m.set_memory_seen_cache_dirty( p ); + here.set_memory_seen_cache_dirty( p ); } } @@ -407,6 +671,7 @@ bool vehicle::collision( std::vector &colls, int lowest_velocity = coll_velocity; const int sign_before = sgn( velocity_before ); bool empty = true; + map &here = get_map(); for( int p = 0; static_cast( p ) < parts.size(); p++ ) { const vpart_info &info = part_info( p ); if( ( info.location != part_location_structure && info.rotor_diameter() == 0 ) || @@ -420,7 +685,7 @@ bool vehicle::collision( std::vector &colls, veh_collision coll = part_collision( p, dsp, just_detect, bash_floor ); if( coll.type == veh_coll_nothing && info.rotor_diameter() > 0 ) { size_t radius = static_cast( std::round( info.rotor_diameter() / 2.0f ) ); - for( const tripoint &rotor_point : g->m.points_in_radius( dsp, radius ) ) { + for( const tripoint &rotor_point : here.points_in_radius( dsp, radius ) ) { veh_collision rotor_coll = part_collision( p, rotor_point, just_detect, false ); if( rotor_coll.type != veh_coll_nothing ) { coll = rotor_coll; @@ -485,9 +750,10 @@ static void terrain_collision_data( const tripoint &p, bool bash_floor, float &mass, float &density, float &elastic ) { elastic = 0.30; + map &here = get_map(); // Just a rough rescale for now to obtain approximately equal numbers - const int bash_min = g->m.bash_resistance( p, bash_floor ); - const int bash_max = g->m.bash_strength( p, bash_floor ); + const int bash_min = here.bash_resistance( p, bash_floor ); + const int bash_max = here.bash_strength( p, bash_floor ); mass = ( bash_min + bash_max ) / 2.0; density = bash_min; } @@ -498,11 +764,12 @@ veh_collision vehicle::part_collision( int part, const tripoint &p, // Vertical collisions need to be handled differently // All collisions have to be either fully vertical or fully horizontal for now const bool vert_coll = bash_floor || p.z != sm_pos.z; - const bool pl_ctrl = player_in_control( g->u ); + Character &player_character = get_player_character(); + const bool pl_ctrl = player_in_control( player_character ); Creature *critter = g->critter_at( p, true ); player *ph = dynamic_cast( critter ); - Creature *driver = pl_ctrl ? &g->u : nullptr; + Creature *driver = pl_ctrl ? &player_character : nullptr; // If in a vehicle assume it's this one if( ph != nullptr && ph->in_vehicle ) { @@ -510,7 +777,8 @@ veh_collision vehicle::part_collision( int part, const tripoint &p, ph = nullptr; } - const optional_vpart_position ovp = g->m.veh_at( p ); + map &here = get_map(); + const optional_vpart_position ovp = here.veh_at( p ); // Disable vehicle/critter collisions when bashing floor // TODO: More elegant code const bool is_veh_collision = !bash_floor && ovp && &ovp->vehicle() != this; @@ -547,7 +815,7 @@ veh_collision vehicle::part_collision( int part, const tripoint &p, return ret; } // we just ran into a fish, so move it out of the way - if( g->m.has_flag( "SWIMMABLE", critter->pos() ) ) { + if( here.has_flag( "SWIMMABLE", critter->pos() ) ) { tripoint end_pos = critter->pos(); tripoint start_pos; const int angle = move.dir() + 45 * ( parts[part].mount.x > pivot_point().x ? -1 : 1 ); @@ -589,31 +857,31 @@ veh_collision vehicle::part_collision( int part, const tripoint &p, part_dens = 15; mass2 = units::to_kilogram( critter->get_weight() ); ret.target_name = critter->disp_name(); - } else if( ( bash_floor && g->m.is_bashable_ter_furn( p, true ) ) || - ( g->m.is_bashable_ter_furn( p, false ) && g->m.move_cost_ter_furn( p ) != 2 && + } else if( ( bash_floor && here.is_bashable_ter_furn( p, true ) ) || + ( here.is_bashable_ter_furn( p, false ) && here.move_cost_ter_furn( p ) != 2 && // Don't collide with tiny things, like flowers, unless we have a wheel in our space. ( part_with_feature( ret.part, VPFLAG_WHEEL, true ) >= 0 || - !g->m.has_flag_ter_or_furn( "TINY", p ) ) && + !here.has_flag_ter_or_furn( "TINY", p ) ) && // Protrusions don't collide with short terrain. // Tiny also doesn't, but it's already excluded unless there's a wheel present. !( part_with_feature( ret.part, "PROTRUSION", true ) >= 0 && - g->m.has_flag_ter_or_furn( "SHORT", p ) ) && + here.has_flag_ter_or_furn( "SHORT", p ) ) && // These are bashable, but don't interact with vehicles. - !g->m.has_flag_ter_or_furn( "NOCOLLIDE", p ) && + !here.has_flag_ter_or_furn( "NOCOLLIDE", p ) && // Do not collide with track tiles if we can use rails - !( g->m.has_flag_ter_or_furn( TFLAG_RAIL, p ) && this->can_use_rails() ) ) ) { + !( here.has_flag_ter_or_furn( TFLAG_RAIL, p ) && this->can_use_rails() ) ) ) { // Movecost 2 indicates flat terrain like a floor, no collision there. ret.type = veh_coll_bashable; terrain_collision_data( p, bash_floor, mass2, part_dens, e ); - ret.target_name = g->m.disp_name( p ); - } else if( g->m.impassable_ter_furn( p ) || - ( bash_floor && !g->m.has_flag( TFLAG_NO_FLOOR, p ) ) ) { + ret.target_name = here.disp_name( p ); + } else if( here.impassable_ter_furn( p ) || + ( bash_floor && !here.has_flag( TFLAG_NO_FLOOR, p ) ) ) { // not destructible ret.type = veh_coll_other; mass2 = 1000; e = 0.10; part_dens = 80; - ret.target_name = g->m.disp_name( p ); + ret.target_name = here.disp_name( p ); } if( ret.type == veh_coll_nothing || just_detect ) { @@ -713,23 +981,23 @@ veh_collision vehicle::part_collision( int part, const tripoint &p, // Something bashable -- use map::bash to determine outcome // NOTE: Floor bashing disabled for balance reasons // Floor values are still used to set damage dealt to vehicle - smashed = g->m.is_bashable_ter_furn( p, false ) && - g->m.bash_resistance( p, bash_floor ) <= obj_dmg && - g->m.bash( p, obj_dmg, false, false, false, this ).success; + smashed = here.is_bashable_ter_furn( p, false ) && + here.bash_resistance( p, bash_floor ) <= obj_dmg && + here.bash( p, obj_dmg, false, false, false, this ).success; if( smashed ) { - if( g->m.is_bashable_ter_furn( p, bash_floor ) ) { + if( here.is_bashable_ter_furn( p, bash_floor ) ) { // There's new terrain there to smash smashed = false; terrain_collision_data( p, bash_floor, mass2, part_dens, e ); - ret.target_name = g->m.disp_name( p ); - } else if( g->m.impassable_ter_furn( p ) ) { + ret.target_name = here.disp_name( p ); + } else if( here.impassable_ter_furn( p ) ) { // There's new terrain there, but we can't smash it! smashed = false; ret.type = veh_coll_other; mass2 = 1000; e = 0.10; part_dens = 80; - ret.target_name = g->m.disp_name( p ); + ret.target_name = here.disp_name( p ); } } } else if( ret.type == veh_coll_body ) { @@ -870,10 +1138,10 @@ void vehicle::handle_trap( const tripoint &p, int part ) if( pwh < 0 ) { return; } - const trap &tr = g->m.tr_at( p ); - const trap_id t = tr.loadid; + map &here = get_map(); + const trap &tr = here.tr_at( p ); - if( t == tr_null ) { + if( tr.is_null() ) { // If the trap doesn't exist, we can't interact with it, so just return return; } @@ -883,8 +1151,9 @@ void vehicle::handle_trap( const tripoint &p, int part ) return; } - const bool seen = g->u.sees( p ); - const bool known = g->u.knows_trap( p ); + Character &player_character = get_player_character(); + const bool seen = player_character.sees( p ); + const bool known = tr.can_see( p, player_character ); if( seen ) { if( known ) { //~ %1$s: name of the vehicle; %2$s: name of the related vehicle part; %3$s: trap name @@ -907,28 +1176,28 @@ void vehicle::handle_trap( const tripoint &p, int part ) } bool still_has_trap = true; if( veh_data.remove_trap || veh_data.do_explosion ) { - g->m.remove_trap( p ); + here.remove_trap( p ); still_has_trap = false; } for( const auto &it : veh_data.spawn_items ) { int cnt = roll_remainder( it.second ); if( cnt > 0 ) { - g->m.spawn_item( p, it.first, cnt ); + here.spawn_item( p, it.first, cnt ); } } if( veh_data.set_trap ) { - g->m.trap_set( p, veh_data.set_trap.id() ); + here.trap_set( p, veh_data.set_trap.id() ); still_has_trap = true; } if( still_has_trap ) { - const trap &tr = g->m.tr_at( p ); + const trap &tr = here.tr_at( p ); if( seen || known ) { // known status has been reset by map::trap_set() - g->u.add_known_trap( p, tr ); + player_character.add_known_trap( p, tr ); } if( seen && !known ) { // hard to miss! - const std::string direction = direction_name( direction_from( g->u.pos(), p ) ); + const std::string direction = direction_name( direction_from( player_character.pos(), p ) ); add_msg( _( "You've spotted a %1$s to the %2$s!" ), tr.name(), direction ); } } @@ -1005,7 +1274,7 @@ bool vehicle::check_is_heli_landed() { // @TODO - when there are chasms that extend below z-level 0 - perhaps the heli // will be able to descend into them but for now, assume z-level-0 == the ground. - if( global_pos3().z == 0 || !g->m.has_flag_ter_or_furn( TFLAG_NO_FLOOR, global_pos3() ) ) { + if( global_pos3().z == 0 || !get_map().has_flag_ter_or_furn( TFLAG_NO_FLOOR, global_pos3() ) ) { is_flying = false; return true; } @@ -1020,20 +1289,21 @@ bool vehicle::check_heli_descend( player &p ) } int count = 0; int air_count = 0; + map &here = get_map(); for( const tripoint &pt : get_points( true ) ) { tripoint below( pt.xy(), pt.z - 1 ); - if( g->m.has_zlevels() && ( pt.z < -OVERMAP_DEPTH || - !g->m.has_flag_ter_or_furn( TFLAG_NO_FLOOR, pt ) ) ) { + if( here.has_zlevels() && ( pt.z < -OVERMAP_DEPTH || + !here.has_flag_ter_or_furn( TFLAG_NO_FLOOR, pt ) ) ) { p.add_msg_if_player( _( "You are already landed!" ) ); return false; } - const optional_vpart_position ovp = g->m.veh_at( below ); - if( g->m.impassable_ter_furn( below ) || ovp || g->critter_at( below ) ) { + const optional_vpart_position ovp = here.veh_at( below ); + if( here.impassable_ter_furn( below ) || ovp || g->critter_at( below ) ) { p.add_msg_if_player( m_bad, _( "It would be unsafe to try and land when there are obstacles below you." ) ); return false; } - if( g->m.has_flag_ter_or_furn( TFLAG_NO_FLOOR, below ) ) { + if( here.has_flag_ter_or_furn( TFLAG_NO_FLOOR, below ) ) { air_count++; } count++; @@ -1056,10 +1326,11 @@ bool vehicle::check_heli_ascend( player &p ) p.add_msg_if_player( m_bad, _( "It would be unsafe to try and take off while you are moving." ) ); return false; } + map &here = get_map(); for( const tripoint &pt : get_points( true ) ) { tripoint above( pt.xy(), pt.z + 1 ); - const optional_vpart_position ovp = g->m.veh_at( above ); - if( g->m.has_flag_ter_or_furn( TFLAG_INDOORS, pt ) || g->m.impassable_ter_furn( above ) || ovp || + const optional_vpart_position ovp = here.veh_at( above ); + if( here.has_flag_ter_or_furn( TFLAG_INDOORS, pt ) || here.impassable_ter_furn( above ) || ovp || g->critter_at( above ) ) { p.add_msg_if_player( m_bad, _( "It would be unsafe to try and ascend when there are obstacles above you." ) ); @@ -1071,9 +1342,9 @@ bool vehicle::check_heli_ascend( player &p ) void vehicle::pldrive( const point &p, int z ) { - player &u = g->u; + player &player_character = get_avatar(); if( z != 0 && is_rotorcraft() ) { - u.moves = std::min( u.moves, 0 ); + player_character.moves = std::min( player_character.moves, 0 ); thrust( 0, z ); } int turn_delta = 15 * p.x; @@ -1097,15 +1368,15 @@ void vehicle::pldrive( const point &p, int z ) // 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() ); + player_character.moves = std::min( player_character.moves, player_character.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 skill = std::min( 10.0f, player_character.get_skill_level( skill_driving ) + + ( player_character.get_dex() + player_character.get_per() ) / 10.0f ); float penalty = rng_float( 0.0f, handling_diff ) - skill; int cost; if( penalty > 0.0f ) { @@ -1113,7 +1384,7 @@ void vehicle::pldrive( const point &p, int z ) 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 ); + cost = std::max( player_character.get_speed(), 100 ) * ( 1.0f - ( -penalty / 10.0f ) * 2 / 3 ); } if( penalty > skill || cost > 400 ) { @@ -1121,12 +1392,12 @@ void vehicle::pldrive( const point &p, int z ) // 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 ); + cost = std::max( cost, player_character.moves + 100 ); } else if( one_in( 10 ) ) { // Don't warn all the time or it gets spammy - if( cost >= u.get_speed() * 2 ) { + if( cost >= player_character.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 ) { + } else if( cost >= player_character.get_speed() * 1.5f ) { add_msg( m_warning, _( "It takes you a long time to steer that vehicle!" ) ); } } @@ -1134,7 +1405,7 @@ void vehicle::pldrive( const point &p, int z ) 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 ); + player_character.moves -= std::max( cost, player_character.get_speed() / 3 + 1 ); } if( p.y != 0 ) { @@ -1143,7 +1414,7 @@ void vehicle::pldrive( const point &p, int z ) cruise_thrust( -p.y * thr_amount ); } else { thrust( -p.y ); - u.moves = std::min( u.moves, 0 ); + player_character.moves = std::min( player_character.moves, 0 ); } } @@ -1153,9 +1424,10 @@ void vehicle::pldrive( const point &p, int z ) ///\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 ) { + if( handling_diff * rng( 1, 10 ) < + player_character.dex_cur + player_character.get_skill_level( skill_driving ) * 2 ) { add_msg( _( "You regain control of the %s." ), name ); - u.practice( skill_driving, velocity / 5 ); + player_character.practice( skill_driving, velocity / 5 ); velocity = static_cast( forward_velocity() ); skidding = false; move.init( turn_dir ); @@ -1274,10 +1546,11 @@ void vehicle::precalculate_vehicle_turning( int new_turn_dir, bool check_rail_di */ turning_wheels_that_are_one_axis = 0; + map &here = get_map(); for( int part_index : wheelcache ) { const auto &wheel = parts[ part_index ]; bool rails_ahead = true; - point wheel_point; + tripoint wheel_point; coord_translate( mdir.dir(), this->pivot_point(), wheel.mount, wheel_point ); @@ -1294,7 +1567,7 @@ void vehicle::precalculate_vehicle_turning( int new_turn_dir, bool check_rail_di // advance precalculated wheel position 1 time in direction of moving wheel_tripoint += dp; - if( !g->m.has_flag_ter_or_furn( ter_flag_to_check, wheel_tripoint ) ) { + if( !here.has_flag_ter_or_furn( ter_flag_to_check, wheel_tripoint ) ) { // this tile is not allowed, disallow turn rails_ahead = false; break; @@ -1302,7 +1575,7 @@ void vehicle::precalculate_vehicle_turning( int new_turn_dir, bool check_rail_di // special case for rails if( check_rail_direction ) { - ter_id terrain_at_wheel = g->m.ter( wheel_tripoint ); + ter_id terrain_at_wheel = here.ter( wheel_tripoint ); // check is it correct tile to turn into if( !is_diagonal_movement && ( terrain_at_wheel == t_railroad_track_d || terrain_at_wheel == t_railroad_track_d1 || @@ -1425,7 +1698,8 @@ bool vehicle::is_wheel_state_correct_to_turn_on_rails( int wheels_on_rail, int w vehicle *vehicle::act_on_map() { const tripoint pt = global_pos3(); - if( !g->m.inbounds( pt ) ) { + map &here = get_map(); + if( !here.inbounds( pt ) ) { dbg( D_INFO ) << "stopping out-of-map vehicle. (x,y,z)=(" << pt.x << "," << pt.y << "," << pt.z << ")"; stop( false ); @@ -1436,7 +1710,8 @@ vehicle *vehicle::act_on_map() if( decrement_summon_timer() ) { return nullptr; } - const bool pl_ctrl = player_in_control( g->u ); + Character &player_character = get_player_character(); + const bool pl_ctrl = player_in_control( player_character ); // TODO: Remove this hack, have vehicle sink a z-level if( is_floating && !can_float() ) { add_msg( m_bad, _( "Your %s sank." ), name ); @@ -1447,9 +1722,9 @@ vehicle *vehicle::act_on_map() g->setremoteveh( nullptr ); } - g->m.on_vehicle_moved( sm_pos.z ); + here.on_vehicle_moved( sm_pos.z ); // Destroy vehicle (sank to nowhere) - g->m.destroy_vehicle( this ); + here.destroy_vehicle( this ); return nullptr; } @@ -1483,7 +1758,7 @@ vehicle *vehicle::act_on_map() return this; } - const float wheel_traction_area = g->m.vehicle_wheel_traction( *this ); + const float wheel_traction_area = here.vehicle_wheel_traction( *this ); const float traction = k_traction( wheel_traction_area ); if( traction < 0.001f ) { of_turn = 0; @@ -1592,7 +1867,55 @@ vehicle *vehicle::act_on_map() } } - return g->m.move_vehicle( *this, dp, mdir ); + return here.move_vehicle( *this, dp, mdir ); +} + +bool vehicle::level_vehicle() +{ + map &here = get_map(); + if( !here.has_zlevels() || ( is_flying && is_rotorcraft() ) ) { + return true; + } + // make sure that all parts are either supported across levels or on the same level + std::map no_support; + for( vehicle_part &prt : parts ) { + if( prt.info().location != part_location_structure ) { + continue; + } + const tripoint part_pos = global_part_pos3( prt ); + if( no_support.find( part_pos.z ) == no_support.end() ) { + no_support[part_pos.z] = part_pos.z > -OVERMAP_DEPTH; + } + if( no_support[part_pos.z] ) { + no_support[part_pos.z] = here.has_flag_ter_or_furn( TFLAG_NO_FLOOR, part_pos ) && + !here.supports_above( part_pos + tripoint_below ); + } + } + std::set dropped_parts; + // if it's unsupported but on the same level, just let it fall + bool center_drop = false; + bool adjust_level = false; + if( no_support.size() > 1 ) { + for( int zlevel = -OVERMAP_DEPTH; zlevel <= OVERMAP_DEPTH; zlevel++ ) { + if( no_support.find( zlevel ) == no_support.end() || !no_support[zlevel] ) { + continue; + } + center_drop |= global_pos3().z == zlevel; + adjust_level = true; + // drop unsupported parts 1 zlevel + for( size_t prt = 0; prt < parts.size(); prt++ ) { + if( global_part_pos3( prt ).z == zlevel ) { + dropped_parts.insert( static_cast( prt ) ); + } + } + } + } + if( adjust_level ) { + here.displace_vehicle( *this, tripoint_below, center_drop, dropped_parts ); + return false; + } else { + return true; + } } void vehicle::check_falling_or_floating() @@ -1609,23 +1932,25 @@ void vehicle::check_falling_or_floating() return; } - is_falling = g->m.has_zlevels(); + map &here = get_map(); + is_falling = here.has_zlevels(); if( is_flying && is_rotorcraft() ) { is_falling = false; } else { is_flying = false; } + size_t deep_water_tiles = 0; size_t water_tiles = 0; for( const tripoint &p : pts ) { if( is_falling ) { tripoint below( p.xy(), p.z - 1 ); - is_falling &= g->m.has_flag_ter_or_furn( TFLAG_NO_FLOOR, p ) && ( p.z > -OVERMAP_DEPTH ) && - !g->m.supports_above( below ); + is_falling &= here.has_flag_ter_or_furn( TFLAG_NO_FLOOR, p ) && + ( p.z > -OVERMAP_DEPTH ) && !here.supports_above( below ); } - deep_water_tiles += g->m.has_flag( TFLAG_DEEP_WATER, p ) ? 1 : 0; - water_tiles += g->m.has_flag( TFLAG_SWIMMABLE, p ) ? 1 : 0; + deep_water_tiles += here.has_flag( TFLAG_DEEP_WATER, p ) ? 1 : 0; + water_tiles += here.has_flag( TFLAG_SWIMMABLE, p ) ? 1 : 0; } // floating if 2/3rds of the vehicle is in deep water is_floating = 3 * deep_water_tiles >= 2 * pts.size(); @@ -1779,7 +2104,7 @@ int map::shake_vehicle( vehicle &veh, const int velocity_before, const int direc _( " is hurled from the %s's seat by " "the power of the impact!" ), veh.name ); unboard_vehicle( part_pos ); - } else if( g->u.sees( part_pos ) ) { + } else if( get_player_character().sees( part_pos ) ) { add_msg( m_bad, _( "The %s is hurled from %s's by the power of the impact!" ), pet->disp_name(), veh.name ); } diff --git a/src/vehicle_part.cpp b/src/vehicle_part.cpp index a11396a94d927..ba14b1db9f965 100644 --- a/src/vehicle_part.cpp +++ b/src/vehicle_part.cpp @@ -6,7 +6,7 @@ #include #include -#include "avatar.h" +#include "character.h" #include "color.h" #include "debug.h" #include "enums.h" @@ -72,8 +72,9 @@ item vehicle_part::properties_to_item() const // Cables get special handling: their target coordinates need to remain // stored, and if a cable actually drops, it should be half-connected. if( tmp.has_flag( "CABLE_SPOOL" ) && !tmp.has_flag( "TOW_CABLE" ) ) { - const tripoint local_pos = g->m.getlocal( target.first ); - if( !g->m.veh_at( local_pos ) ) { + map &here = get_map(); + const tripoint local_pos = here.getlocal( target.first ); + if( !here.veh_at( local_pos ) ) { // That vehicle ain't there no more. tmp.item_tags.insert( "NO_DROP" ); } @@ -232,7 +233,6 @@ int vehicle_part::ammo_remaining() const if( is_tank() ) { return base.contents.empty() ? 0 : base.contents.legacy_front().charges; } - if( is_fuel_store( false ) || is_turret() ) { return base.ammo_remaining(); } @@ -370,11 +370,11 @@ bool vehicle_part::can_reload( const item &obj ) const } if( is_reactor() ) { - return false; + return true; } - return base.is_reloadable() && - ammo_remaining() < ammo_capacity( item::find_type( ammo_current() )->ammo->type ); + return is_tank() && + ammo_remaining() <= ammo_capacity( item::find_type( ammo_current() )->ammo->type ); } void vehicle_part::process_contents( const tripoint &pos, const bool e_heater ) @@ -388,13 +388,13 @@ void vehicle_part::process_contents( const tripoint &pos, const bool e_heater ) if( e_heater ) { flag = temperature_flag::HEATER; } - base.process( nullptr, pos, false, 1, flag ); + base.process( nullptr, pos, 1, flag ); } } bool vehicle_part::fill_with( item &liquid, int qty ) { - if( !is_tank() || !can_reload( liquid ) ) { + if( ( is_tank() && !liquid.made_of( phase_id::LIQUID ) ) || !can_reload( liquid ) ) { return false; } @@ -579,7 +579,7 @@ bool vehicle::can_enable( const vehicle_part &pt, bool alert ) const return false; } - if( pt.info().has_flag( "PLANTER" ) && !warm_enough_to_plant( g->u.pos() ) ) { + if( pt.info().has_flag( "PLANTER" ) && !warm_enough_to_plant( get_player_character().pos() ) ) { if( alert ) { add_msg( m_bad, _( "It is too cold to plant anything now." ) ); } diff --git a/src/vehicle_selector.cpp b/src/vehicle_selector.cpp index 5536b16b0f96e..4c6ff142c67e6 100644 --- a/src/vehicle_selector.cpp +++ b/src/vehicle_selector.cpp @@ -3,7 +3,6 @@ #include #include -#include "game.h" #include "map.h" #include "optional.h" #include "point.h" @@ -12,10 +11,11 @@ vehicle_selector::vehicle_selector( const tripoint &pos, int radius, bool accessible, bool visibility_only ) { - for( const tripoint &e : closest_tripoints_first( pos, radius ) ) { + map &here = get_map(); + for( const tripoint &e : closest_points_first( pos, radius ) ) { 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 ) ) { + ( visibility_only ? here.sees( pos, e, radius ) : here.clear_path( pos, e, radius, 1, 100 ) ) ) { + if( const optional_vpart_position vp = here.veh_at( e ) ) { data.emplace_back( vp->vehicle(), vp->part_index() ); } } @@ -25,9 +25,10 @@ vehicle_selector::vehicle_selector( const tripoint &pos, int radius, bool access vehicle_selector::vehicle_selector( const tripoint &pos, int radius, bool accessible, const vehicle &ignore ) { - for( const tripoint &e : closest_tripoints_first( pos, radius ) ) { - if( !accessible || g->m.clear_path( pos, e, radius, 1, 100 ) ) { - if( const optional_vpart_position vp = g->m.veh_at( e ) ) { + map &here = get_map(); + for( const tripoint &e : closest_points_first( pos, radius ) ) { + if( !accessible || here.clear_path( pos, e, radius, 1, 100 ) ) { + if( const optional_vpart_position vp = here.veh_at( e ) ) { if( &vp->vehicle() != &ignore ) { data.emplace_back( vp->vehicle(), vp->part_index() ); } diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index 01ac30d7147c0..f4ac178a89eda 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -284,6 +284,8 @@ void vehicle::set_electronics_menu_options( std::vector &options, keybind( "TOGGLE_SCOOP" ), "SCOOP" ); add_toggle( pgettext( "electronics menu option", "water purifier" ), keybind( "TOGGLE_WATER_PURIFIER" ), "WATER_PURIFIER" ); + add_toggle( pgettext( "electronics menu option", "smart controller" ), + keybind( "TOGGLE_SMART_ENGINE_CONTROLLER" ), "SMART_ENGINE_CONTROLLER" ); if( has_part( "DOOR_MOTOR" ) ) { options.emplace_back( _( "Toggle doors" ), keybind( "TOGGLE_DOORS" ) ); @@ -400,7 +402,7 @@ void vehicle::control_engines() if( engines_were_on && !engine_on ) { add_msg( _( "You turn off the %s's engines to change their configurations." ), name ); - } else if( !g->u.controlling_vehicle ) { + } else if( !get_player_character().controlling_vehicle ) { add_msg( _( "You change the %s's engine configuration." ), name ); return; } @@ -437,15 +439,16 @@ bool vehicle::interact_vehicle_locked() return true; } + Character &player_character = get_player_character(); add_msg( _( "You don't find any keys in the %s." ), name ); - const inventory &inv = g->u.crafting_inventory(); + const inventory &inv = player_character.crafting_inventory(); if( inv.has_quality( quality_id( "SCREW" ) ) ) { if( query_yn( _( "You don't find any keys in the %s. Attempt to hotwire vehicle?" ), name ) ) { ///\EFFECT_MECHANICS speeds up vehicle hotwiring - int skill = g->u.get_skill_level( skill_mechanics ); + int skill = player_character.get_skill_level( skill_mechanics ); const int moves = to_moves( 6000_seconds / ( ( skill > 0 ) ? skill : 1 ) ); - tripoint target = g->m.getabs( global_pos3() ) + coord_translate( parts[0].mount ); - g->u.assign_activity( hotwire_car_activity_actor( moves, target ) ); + tripoint target = get_map().getabs( global_pos3() ) + coord_translate( parts[0].mount ); + player_character.assign_activity( hotwire_car_activity_actor( moves, target ) ); } else if( has_security_working() && query_yn( _( "Trigger the %s's Alarm?" ), name ) ) { is_alarm_on = true; } else { @@ -471,10 +474,11 @@ void vehicle::smash_security_system() break; } } + Character &player_character = get_player_character(); //controls and security must both be valid if( c >= 0 && s >= 0 ) { ///\EFFECT_MECHANICS reduces chance of damaging controls when smashing security system - int skill = g->u.get_skill_level( skill_mechanics ); + int skill = player_character.get_skill_level( skill_mechanics ); int percent_controls = 70 / ( 1 + skill ); int percent_alarm = ( skill + 3 ) * 10; int rand = rng( 1, 100 ); @@ -483,7 +487,7 @@ void vehicle::smash_security_system() damage_direct( c, part_info( c ).durability / 4 ); if( parts[ c ].removed || parts[ c ].is_broken() ) { - g->u.controlling_vehicle = false; + player_character.controlling_vehicle = false; is_alarm_on = false; add_msg( _( "You destroy the controls…" ) ); } else { @@ -511,7 +515,7 @@ std::string vehicle::tracking_toggle_string() void vehicle::autopilot_patrol_check() { zone_manager &mgr = zone_manager::get_manager(); - if( mgr.has_near( zone_type_id( "VEHICLE_PATROL" ), g->m.getabs( global_pos3() ), 60 ) ) { + if( mgr.has_near( zone_type_id( "VEHICLE_PATROL" ), get_map().getabs( global_pos3() ), 60 ) ) { enable_patrol(); } else { g->zones_manager(); @@ -581,11 +585,12 @@ void vehicle::use_controls( const tripoint &pos ) bool remote = g->remoteveh() == this; bool has_electronic_controls = false; + avatar &player_character = get_avatar(); if( remote ) { options.emplace_back( _( "Stop controlling" ), keybind( "RELEASE_CONTROLS" ) ); actions.push_back( [&] { - g->u.controlling_vehicle = false; + player_character.controlling_vehicle = false; g->setremoteveh( nullptr ); add_msg( _( "You stop controlling the vehicle." ) ); refresh(); @@ -593,11 +598,11 @@ void vehicle::use_controls( const tripoint &pos ) has_electronic_controls = has_part( "CTRL_ELECTRONIC" ) || has_part( "REMOTE_CONTROLS" ); - } else if( veh_pointer_or_null( g->m.veh_at( pos ) ) == this ) { - if( g->u.controlling_vehicle ) { + } else if( veh_pointer_or_null( get_map().veh_at( pos ) ) == this ) { + if( player_character.controlling_vehicle ) { options.emplace_back( _( "Let go of controls" ), keybind( "RELEASE_CONTROLS" ) ); actions.push_back( [&] { - g->u.controlling_vehicle = false; + player_character.controlling_vehicle = false; add_msg( _( "You let go of the controls." ) ); refresh(); } ); @@ -617,7 +622,7 @@ void vehicle::use_controls( const tripoint &pos ) } if( has_part( "ENGINE" ) ) { - if( g->u.controlling_vehicle || ( remote && engine_on ) ) { + if( player_character.controlling_vehicle || ( remote && engine_on ) ) { options.emplace_back( _( "Stop driving" ), keybind( "TOGGLE_ENGINE" ) ); actions.push_back( [&] { if( engine_on && has_engine_type_not( fuel_type_muscle, true ) ) @@ -653,7 +658,7 @@ void vehicle::use_controls( const tripoint &pos ) } vehicle_noise = 0; engine_on = false; - g->u.controlling_vehicle = false; + player_character.controlling_vehicle = false; g->setremoteveh( nullptr ); sfx::do_vehicle_engine_sfx(); refresh(); @@ -759,7 +764,7 @@ void vehicle::use_controls( const tripoint &pos ) if( menu.ret >= 0 ) { // allow player to turn off engine without triggering another warning if( menu.ret != 0 && menu.ret != 1 && menu.ret != 2 && menu.ret != 3 ) { - if( !handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( !handle_potential_theft( player_character ) ) { return; } } @@ -778,7 +783,8 @@ bool vehicle::fold_up() return false; } - if( g->u.controlling_vehicle ) { + avatar &player_character = get_avatar(); + if( player_character.controlling_vehicle ) { add_msg( m_warning, _( "As the pitiless metal bars close on your nether regions, you reconsider trying to fold the %s while riding it." ), name ); @@ -792,8 +798,8 @@ bool vehicle::fold_up() add_msg( _( "You painstakingly pack the %s into a portable configuration." ), name ); - if( g->u.get_grab_type() != object_type::NONE ) { - g->u.grab( object_type::NONE ); + if( player_character.get_grab_type() != object_type::NONE ) { + player_character.grab( object_type::NONE ); add_msg( _( "You let go of %s as you fold it." ), name ); } @@ -808,11 +814,12 @@ bool vehicle::fold_up() // create a folding [non]bicycle item item bicycle( can_be_folded ? "generic_folded_vehicle" : "folding_bicycle", calendar::turn ); + map &here = get_map(); // Drop stuff in containers on ground for( const vpart_reference &vp : get_any_parts( "CARGO" ) ) { const size_t p = vp.part_index(); for( auto &elem : get_items( p ) ) { - g->m.add_item_or_charges( g->u.pos(), elem ); + here.add_item_or_charges( player_character.pos(), elem ); } while( !get_items( p ).empty() ) { get_items( p ).erase( get_items( p ).begin() ); @@ -844,12 +851,12 @@ bool vehicle::fold_up() bicycle.set_var( "description", string_format( _( "A folded %s." ), name ) ); } - g->m.add_item_or_charges( global_part_pos3( 0 ), bicycle ); - g->m.destroy_vehicle( this ); + here.add_item_or_charges( global_part_pos3( 0 ), bicycle ); + here.destroy_vehicle( this ); // TODO: take longer to fold bigger vehicles // TODO: make this interruptible - g->u.moves -= 500; + player_character.moves -= 500; return true; } @@ -859,7 +866,7 @@ double vehicle::engine_cold_factor( const int e ) const return 0.0; } - int eff_temp = g->weather.get_temperature( g->u.pos() ); + int eff_temp = g->weather.get_temperature( get_player_character().pos() ); if( !parts[ engines[ e ] ].faults().count( fault_engine_glow_plug ) ) { eff_temp = std::min( eff_temp, 20 ); } @@ -906,13 +913,14 @@ bool vehicle::start_engine( const int e ) out_of_fuel = true; } + Character &player_character = get_player_character(); if( out_of_fuel ) { if( einfo.fuel_type == fuel_type_muscle ) { // Muscle engines cannot start with broken limbs - if( einfo.has_flag( "MUSCLE_ARMS" ) && ( g->u.get_working_arm_count() < 2 ) ) { + if( einfo.has_flag( "MUSCLE_ARMS" ) && ( player_character.get_working_arm_count() < 2 ) ) { add_msg( _( "You cannot use %s with a broken arm." ), eng.name() ); return false; - } else if( einfo.has_flag( "MUSCLE_LEGS" ) && ( g->u.get_working_leg_count() < 2 ) ) { + } else if( einfo.has_flag( "MUSCLE_LEGS" ) && ( player_character.get_working_leg_count() < 2 ) ) { add_msg( _( "You cannot use %s with a broken leg." ), eng.name() ); return false; } @@ -1062,14 +1070,15 @@ void vehicle::start_engines( const bool take_control, const bool autodrive ) return; } - if( take_control && !g->u.controlling_vehicle ) { - g->u.controlling_vehicle = true; + Character &player_character = get_player_character(); + if( take_control && !player_character.controlling_vehicle ) { + player_character.controlling_vehicle = true; add_msg( _( "You take control of the %s." ), name ); } if( !autodrive ) { - g->u.assign_activity( ACT_START_ENGINES, start_time ); - g->u.activity.placement = starting_engine_position - g->u.pos(); - g->u.activity.values.push_back( take_control ); + player_character.assign_activity( ACT_START_ENGINES, start_time ); + player_character.activity.placement = starting_engine_position - player_character.pos(); + player_character.activity.values.push_back( take_control ); } } @@ -1122,9 +1131,8 @@ void vehicle::honk_horn() void vehicle::reload_seeds( const tripoint &pos ) { - player &p = g->u; - - std::vector seed_inv = p.items_with( []( const item & itm ) { + Character &player_character = get_player_character(); + std::vector seed_inv = player_character.items_with( []( const item & itm ) { return itm.is_seed(); } ); @@ -1149,13 +1157,13 @@ void vehicle::reload_seeds( const tripoint &pos ) itype_id seed_id = std::get<0>( seed_entries[seed_index] ); std::list used_seed; if( item::count_by_charges( seed_id ) ) { - used_seed = p.use_charges( seed_id, actual_amount ); + used_seed = player_character.use_charges( seed_id, actual_amount ); } else { - used_seed = p.use_amount( seed_id, actual_amount ); + used_seed = player_character.use_amount( seed_id, actual_amount ); } used_seed.front().set_age( 0_turns ); //place seeds into the planter - put_into_vehicle_or_drop( p, item_drop_reason::deliberate, used_seed, pos ); + put_into_vehicle_or_drop( player_character, item_drop_reason::deliberate, used_seed, pos ); } } } @@ -1182,8 +1190,9 @@ void vehicle::beeper_sound() void vehicle::play_music() { + Character &player_character = get_player_character(); for( const vpart_reference &vp : get_enabled_parts( "STEREO" ) ) { - iuse::play_music( g->u, vp.pos(), 15, 30 ); + iuse::play_music( player_character, vp.pos(), 15, 30 ); } } @@ -1204,29 +1213,30 @@ void vehicle::crash_terrain_around() if( total_power_w() <= 0 ) { return; } + map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "CRASH_TERRAIN_AROUND" ) ) { tripoint crush_target( 0, 0, -OVERMAP_LAYERS ); const tripoint start_pos = vp.pos(); const transform_terrain_data &ttd = vp.info().transform_terrain; for( size_t i = 0; i < eight_horizontal_neighbors.size() && - !g->m.inbounds_z( crush_target.z ); i++ ) { + !here.inbounds_z( crush_target.z ); i++ ) { tripoint cur_pos = start_pos + eight_horizontal_neighbors.at( i ); bool busy_pos = false; for( const vpart_reference &vp_tmp : get_all_parts() ) { busy_pos |= vp_tmp.pos() == cur_pos; } for( const std::string &flag : ttd.pre_flags ) { - if( g->m.has_flag( flag, cur_pos ) && !busy_pos ) { + if( here.has_flag( flag, cur_pos ) && !busy_pos ) { crush_target = cur_pos; break; } } } //target chosen - if( g->m.inbounds_z( crush_target.z ) ) { + if( here.inbounds_z( crush_target.z ) ) { velocity = 0; cruise_velocity = 0; - g->m.destroy( crush_target ); + here.destroy( crush_target ); sounds::sound( crush_target, 500, sounds::sound_t::combat, _( "Clanggggg!" ), false, "smash_success", "hit_vehicle" ); } @@ -1235,12 +1245,13 @@ void vehicle::crash_terrain_around() void vehicle::transform_terrain() { + map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "TRANSFORM_TERRAIN" ) ) { const tripoint start_pos = vp.pos(); const transform_terrain_data &ttd = vp.info().transform_terrain; bool prereq_fulfilled = false; for( const std::string &flag : ttd.pre_flags ) { - if( g->m.has_flag( flag, start_pos ) ) { + if( here.has_flag( flag, start_pos ) ) { prereq_fulfilled = true; break; } @@ -1248,15 +1259,15 @@ void vehicle::transform_terrain() if( prereq_fulfilled ) { const ter_id new_ter = ter_id( ttd.post_terrain ); if( new_ter != t_null ) { - g->m.ter_set( start_pos, new_ter ); + here.ter_set( start_pos, new_ter ); } const furn_id new_furn = furn_id( ttd.post_furniture ); if( new_furn != f_null ) { - g->m.furn_set( start_pos, new_furn ); + here.furn_set( start_pos, new_furn ); } const field_type_id new_field = field_type_id( ttd.post_field ); if( new_field.id() ) { - g->m.add_field( start_pos, new_field, ttd.post_field_intensity, ttd.post_field_age ); + here.add_field( start_pos, new_field, ttd.post_field_intensity, ttd.post_field_age ); } } else { const int speed = std::abs( velocity ); @@ -1270,17 +1281,18 @@ void vehicle::transform_terrain() void vehicle::operate_reaper() { + map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "REAPER" ) ) { const size_t reaper_id = vp.part_index(); const tripoint reaper_pos = vp.pos(); const int plant_produced = rng( 1, vp.info().bonus ); const int seed_produced = rng( 1, 3 ); const units::volume max_pickup_volume = vp.info().size / 20; - if( g->m.furn( reaper_pos ) != f_plant_harvest ) { + if( here.furn( reaper_pos ) != f_plant_harvest ) { continue; } // Can't use item_stack::only_item() since there might be fertilizer - map_stack items = g->m.i_at( reaper_pos ); + map_stack items = here.i_at( reaper_pos ); map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { return it.is_seed(); } ); @@ -1289,13 +1301,13 @@ void vehicle::operate_reaper() // Otherworldly plants, the earth-made reaper can not handle those. continue; } - g->m.furn_set( reaper_pos, f_null ); + here.furn_set( reaper_pos, f_null ); // Secure the seed type before i_clear destroys the item. const itype &seed_type = *seed->type; - g->m.i_clear( reaper_pos ); + here.i_clear( reaper_pos ); for( auto &i : iexamine::get_harvest_items( seed_type, plant_produced, seed_produced, false ) ) { - g->m.add_item_or_charges( reaper_pos, i ); + here.add_item_or_charges( reaper_pos, i ); } sounds::sound( reaper_pos, rng( 10, 25 ), sounds::sound_t::combat, _( "Swish" ), false, "vehicle", "reaper" ); @@ -1314,6 +1326,7 @@ void vehicle::operate_reaper() void vehicle::operate_planter() { + map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "PLANTER" ) ) { const size_t planter_id = vp.part_index(); const tripoint loc = vp.pos(); @@ -1321,12 +1334,12 @@ void vehicle::operate_planter() for( auto i = v.begin(); i != v.end(); i++ ) { if( i->is_seed() ) { // If it is an "advanced model" then it will avoid damaging itself or becoming damaged. It's a real feature. - if( g->m.ter( loc ) != t_dirtmound && vp.has_feature( "ADVANCED_PLANTER" ) ) { + if( here.ter( loc ) != t_dirtmound && vp.has_feature( "ADVANCED_PLANTER" ) ) { //then don't put the item there. break; - } else if( g->m.ter( loc ) == t_dirtmound ) { - g->m.set( loc, t_dirt, f_plant_seed ); - } else if( !g->m.has_flag( "PLOWABLE", loc ) ) { + } else if( here.ter( loc ) == t_dirtmound ) { + here.set( loc, t_dirt, f_plant_seed ); + } else if( !here.has_flag( "PLOWABLE", loc ) ) { //If it isn't plowable terrain, then it will most likely be damaged. damage( planter_id, rng( 1, 10 ), DT_BASH, false ); sounds::sound( loc, rng( 10, 20 ), sounds::sound_t::combat, _( "Clink" ), false, "smash_success", @@ -1334,13 +1347,13 @@ void vehicle::operate_planter() } if( !i->count_by_charges() || i->charges == 1 ) { i->set_age( 0_turns ); - g->m.add_item( loc, *i ); + here.add_item( loc, *i ); v.erase( i ); } else { item tmp = *i; tmp.charges = 1; tmp.set_age( 0_turns ); - g->m.add_item( loc, tmp ); + here.add_item( loc, tmp ); i->charges--; } break; @@ -1351,6 +1364,7 @@ void vehicle::operate_planter() void vehicle::operate_scoop() { + map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "SCOOP" ) ) { const size_t scoop = vp.part_index(); const int chance_to_damage_item = 9; @@ -1363,17 +1377,17 @@ void vehicle::operate_scoop() random_entry_ref( sound_msgs ), false, "vehicle", "scoop" ); std::vector parts_points; for( const tripoint ¤t : - g->m.points_in_radius( global_part_pos3( scoop ), 1 ) ) { + here.points_in_radius( global_part_pos3( scoop ), 1 ) ) { parts_points.push_back( current ); } for( const tripoint &position : parts_points ) { - g->m.mop_spills( position ); - if( !g->m.has_items( position ) ) { + here.mop_spills( position ); + if( !here.has_items( position ) ) { continue; } item *that_item_there = nullptr; - map_stack items = g->m.i_at( position ); - if( g->m.has_flag( "SEALED", position ) ) { + map_stack items = here.i_at( position ); + if( here.has_flag( "SEALED", position ) ) { // Ignore it. Street sweepers are not known for their ability to harvest crops. continue; } @@ -1396,7 +1410,7 @@ void vehicle::operate_scoop() } //This attempts to add the item to the scoop inventory and if successful, removes it from the map. if( add_item( scoop, *that_item_there ) ) { - g->m.i_rem( position, that_item_there ); + here.i_rem( position, that_item_there ); } else { break; } @@ -1485,8 +1499,9 @@ void vehicle::open_or_close( const int part_index, const bool opening ) //find_lines_of_parts() doesn't return the part_index we passed, so we set it on it's own parts[part_index].open = opening; insides_dirty = true; - g->m.set_transparency_cache_dirty( sm_pos.z ); - const int dist = rl_dist( g->u.pos(), mount_to_tripoint( parts[part_index].mount ) ); + get_map().set_transparency_cache_dirty( sm_pos.z ); + const int dist = rl_dist( get_player_character().pos(), + mount_to_tripoint( parts[part_index].mount ) ); if( dist < 20 ) { sfx::play_variant_sound( opening ? "vehicle_open" : "vehicle_close", parts[ part_index ].info().get_id().str(), 100 - dist * 3 ); @@ -1553,8 +1568,9 @@ void vehicle::use_autoclave( int p ) void vehicle::use_washing_machine( int p ) { + avatar &player_character = get_avatar(); // Get all the items that can be used as detergent - const inventory &inv = g->u.crafting_inventory(); + const inventory &inv = player_character.crafting_inventory(); std::vector detergents = inv.items_with( [inv]( const item & it ) { return it.has_flag( "DETERGENT" ) && inv.has_charges( it.typeId(), 5 ); } ); @@ -1629,7 +1645,7 @@ void vehicle::use_washing_machine( int p ) std::vector detergent; detergent.push_back( item_comp( det_types[chosen_detergent], 5 ) ); - g->u.consume_items( detergent, 1, is_crafting_component ); + player_character.consume_items( detergent, 1, is_crafting_component ); add_msg( m_good, _( "You pour some detergent into the washing machine, close its lid, and turn it on. The washing machine is being filled with water from vehicle tanks." ) ); @@ -1638,7 +1654,8 @@ void vehicle::use_washing_machine( int p ) void vehicle::use_dishwasher( int p ) { - bool detergent_is_enough = g->u.crafting_inventory().has_charges( itype_detergent, 5 ); + avatar &player_character = get_avatar(); + bool detergent_is_enough = player_character.crafting_inventory().has_charges( itype_detergent, 5 ); auto items = get_items( p ); static const std::string filthy( "FILTHY" ); bool filthy_items = std::all_of( items.begin(), items.end(), []( const item & i ) { @@ -1686,7 +1703,7 @@ void vehicle::use_dishwasher( int p ) std::vector detergent; detergent.push_back( item_comp( itype_detergent, 5 ) ); - g->u.consume_items( detergent, 1, is_crafting_component ); + player_character.consume_items( detergent, 1, is_crafting_component ); add_msg( m_good, _( "You pour some detergent into the dishwasher, close its lid, and turn it on. The dishwasher is being filled with water from vehicle tanks." ) ); @@ -1699,7 +1716,7 @@ void vehicle::use_monster_capture( int part, const tripoint &pos ) return; } item base = item( parts[part].get_base() ); - base.type->invoke( g->u, base, pos ); + base.type->invoke( get_avatar(), base, pos ); parts[part].set_base( base ); if( base.has_var( "contained_name" ) ) { parts[part].set_flag( vehicle_part::animal_flag ); @@ -1762,7 +1779,7 @@ void vehicle::use_harness( int part, const tripoint &pos ) add_msg( m_info, _( "You untie your %s." ), m.get_name() ); m.remove_effect( effect_tied ); if( m.tied_item ) { - g->u.i_add( *m.tied_item ); + get_player_character().i_add( *m.tied_item ); m.tied_item.reset(); } } @@ -1860,7 +1877,7 @@ void vehicle::use_bike_rack( int part ) success = try_to_rack_nearby_vehicle( racks_parts ); } if( success ) { - g->m.invalidate_map_cache( g->get_levz() ); + get_map().invalidate_map_cache( g->get_levz() ); } } @@ -1869,8 +1886,10 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) { std::vector menu_items; std::vector options_message; - const bool has_items_on_ground = g->m.sees_some_items( pos, g->u ); - const bool items_are_sealed = g->m.has_flag( "SEALED", pos ); + map &here = get_map(); + avatar &player_character = get_avatar(); + const bool has_items_on_ground = here.sees_some_items( pos, player_character ); + const bool items_are_sealed = here.has_flag( "SEALED", pos ); auto turret = turret_query( pos ); @@ -2009,7 +2028,7 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) choice = selectmenu.ret; } if( choice != EXAMINE && choice != TRACK && choice != GET_ITEMS_ON_GROUND ) { - if( !handle_potential_theft( dynamic_cast( g->u ) ) ) { + if( !handle_potential_theft( dynamic_cast( player_character ) ) ) { return; } } @@ -2018,10 +2037,18 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) if( fuel_left( itype_battery, true ) < pseudo.ammo_required() ) { return false; } + //Pseudo items don't have a magazine in it, and they don't need it anymore. + //Pseudo magazine in Pseudo item sounds good. + //Somehow the set of available ammos in pocket_data loaded from json is alphabetic, + //so the default ammo is always atomic, haven't checked the relevant codes yet. + item pseudo_magazine( pseudo.magazine_default() ); + //no initial ammo + pseudo_magazine.contents.clear_items(); + pseudo.put_in( pseudo_magazine, item_pocket::pocket_type::MAGAZINE_WELL ); int capacity = pseudo.ammo_capacity( ammotype( "battery" ) ); int qty = capacity - discharge_battery( capacity ); pseudo.ammo_set( itype_battery, qty ); - g->u.invoke_item( &pseudo ); + player_character.invoke_item( &pseudo ); charge_battery( pseudo.ammo_remaining() ); return true; }; @@ -2049,7 +2076,7 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) return; } case USE_TOWEL: { - iuse::towel_common( &g->u, nullptr, false ); + iuse::towel_common( &player_character, nullptr, false ); return; } case USE_AUTOCLAVE: { @@ -2065,13 +2092,13 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) return; } case FILL_CONTAINER: { - g->u.siphon( *this, itype_water_clean ); + player_character.siphon( *this, itype_water_clean ); return; } case DRINK: { item water( "water_clean", 0 ); - if( g->u.can_consume( water ) ) { - g->u.assign_activity( player_activity( consume_activity_actor( water ) ) ); + if( player_character.can_consume( water ) ) { + player_character.assign_activity( player_activity( consume_activity_actor( water ) ) ); drain( itype_water_clean, 1 ); } return; @@ -2079,7 +2106,7 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) case USE_WELDER: { if( veh_tool( itype_welder ) ) { // HACK: Evil hack incoming - auto &act = g->u.activity; + auto &act = player_character.activity; if( act.id() == ACT_REPAIR_ITEM ) { // Magic: first tell activity the item doesn't really exist act.index = INT_MIN; @@ -2125,11 +2152,11 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) return; } case RELOAD_TURRET: { - item::reload_option opt = g->u.select_ammo( *turret.base(), true ); + item::reload_option opt = player_character.select_ammo( *turret.base(), true ); if( opt ) { - g->u.assign_activity( ACT_RELOAD, opt.moves(), opt.qty() ); - g->u.activity.targets.emplace_back( turret.base() ); - g->u.activity.targets.push_back( std::move( opt.ammo ) ); + player_character.assign_activity( ACT_RELOAD, opt.moves(), opt.qty() ); + player_character.activity.targets.emplace_back( turret.base() ); + player_character.activity.targets.push_back( std::move( opt.ammo ) ); } return; } @@ -2170,7 +2197,7 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) return; } case WORKBENCH: { - iexamine::workbench_internal( g->u, pos, vpart_reference( *this, workbench_part ) ); + iexamine::workbench_internal( player_character, pos, vpart_reference( *this, workbench_part ) ); return; } } diff --git a/src/visitable.cpp b/src/visitable.cpp index a1808eab944d3..60c4be63ec7b8 100644 --- a/src/visitable.cpp +++ b/src/visitable.cpp @@ -14,7 +14,6 @@ #include "character.h" #include "colony.h" #include "debug.h" -#include "game.h" #include "inventory.h" #include "item.h" #include "item_contents.h" @@ -469,13 +468,13 @@ VisitResponse visitable::visit_items( const std::function &func ) { auto cur = static_cast( this ); - + map &here = get_map(); // skip inaccessible items - if( g->m.has_flag( "SEALED", *cur ) && !g->m.has_flag( "LIQUIDCONT", *cur ) ) { + if( here.has_flag( "SEALED", *cur ) && !here.has_flag( "LIQUIDCONT", *cur ) ) { return VisitResponse::NEXT; } - for( item &e : g->m.i_at( *cur ) ) { + for( item &e : here.i_at( *cur ) ) { if( visit_internal( func, &e ) == VisitResponse::ABORT ) { return VisitResponse::ABORT; } @@ -671,14 +670,15 @@ std::list visitable::remove_items_with( const return res; } - if( !g->m.inbounds( *cur ) ) { + map &here = get_map(); + if( !here.inbounds( *cur ) ) { debugmsg( "cannot remove items from map: cursor out-of-bounds" ); return res; } // fetch the appropriate item stack point offset; - submap *sub = g->m.get_submap_at( *cur, offset ); + submap *sub = here.get_submap_at( *cur, offset ); cata::colony &stack = sub->get_items( offset ); for( auto iter = stack.begin(); iter != stack.end(); ) { @@ -704,7 +704,7 @@ std::list visitable::remove_items_with( const ++iter; } } - g->m.update_submap_active_item_status( *cur ); + here.update_submap_active_item_status( *cur ); return res; } diff --git a/src/vitamin.cpp b/src/vitamin.cpp index c08e002d4a3b2..2cc90260bf8e8 100644 --- a/src/vitamin.cpp +++ b/src/vitamin.cpp @@ -70,10 +70,6 @@ void vitamin::load_vitamin( const JsonObject &jo ) } vit.type_ = jo.get_enum_value( "vit_type" ); - if( vit.rate_ < 0_turns ) { - jo.throw_error( "vitamin consumption rate cannot be negative", "rate" ); - } - for( JsonArray e : jo.get_array( "disease" ) ) { vit.disease_.emplace_back( e.get_int( 0 ), e.get_int( 1 ) ); } diff --git a/src/weather.cpp b/src/weather.cpp index ac1cea97a9864..e4415a2be3fc6 100644 --- a/src/weather.cpp +++ b/src/weather.cpp @@ -7,6 +7,7 @@ #include #include +#include "assign.h" #include "avatar.h" #include "bodypart.h" #include "calendar.h" @@ -20,6 +21,7 @@ #include "item_contents.h" #include "line.h" #include "map.h" +#include "map_iterator.h" #include "math_defines.h" #include "messages.h" #include "options.h" @@ -61,23 +63,36 @@ weather_manager &get_weather() return g->weather; } -static bool is_player_outside() +static bool is_creature_outside( const Creature &target ) { - return g->m.is_outside( point( g->u.posx(), g->u.posy() ) ) && g->get_levz() >= 0; + return get_map().is_outside( point( target.posx(), + target.posy() ) ) && g->get_levz() >= 0; } -static constexpr int THUNDER_CHANCE = 50; -static constexpr int LIGHTNING_CHANCE = 600; +weather_type_id get_bad_weather() +{ + weather_type_id bad_weather = WEATHER_NULL; + const weather_generator &weather_gen = get_weather().get_cur_weather_gen(); + for( const std::string &weather_type : weather_gen.weather_types ) { + weather_type_id current_conditions = weather_type_id( weather_type ); + if( current_conditions->precip == precip_class::heavy ) { + bad_weather = current_conditions; + } + } + return bad_weather; +} /** * Glare. * Causes glare effect to player's eyes if they are not wearing applicable eye protection. * @param intensity Level of sun brighthess */ -void weather_effect::glare( sun_intensity intensity ) +void glare( weather_type_id w ) { + Character &target_character = g->u;//todo npcs, also //General prepequisites for glare - if( !is_player_outside() || !g->is_in_sunlight( g->u.pos() ) || g->u.in_sleep_state() || + if( !is_creature_outside( target_character ) || !g->is_in_sunlight( g->u.pos() ) || + g->u.in_sleep_state() || g->u.worn_with_flag( flag_SUN_GLASSES ) || g->u.has_bionic( bio_sunglasses ) || g->u.is_blind() ) { @@ -90,60 +105,61 @@ void weather_effect::glare( sun_intensity intensity ) if( season == WINTER ) { //Winter snow glare: for both clear & sunny weather effect = &effect_snow_glare; - dur = g->u.has_effect( *effect ) ? 1_turns : 2_turns; - } else if( intensity == sun_intensity::high ) { + dur = target_character.has_effect( *effect ) ? 1_turns : 2_turns; + } else if( w->sun_intensity == sun_intensity_type::high ) { //Sun glare: only for bright sunny weather effect = &effect_glare; - dur = g->u.has_effect( *effect ) ? 1_turns : 2_turns; + dur = target_character.has_effect( *effect ) ? 1_turns : 2_turns; } //apply final glare effect if( dur > 0_turns && effect != nullptr ) { //enhance/reduce by some traits - if( g->u.has_trait( trait_CEPH_VISION ) ) { + if( target_character.has_trait( trait_CEPH_VISION ) ) { dur = dur * 2; } - g->u.add_env_effect( *effect, bp_eyes, 2, dur ); + target_character.add_env_effect( *effect, bp_eyes, 2, dur ); } } ////// food vs weather -int incident_sunlight( weather_type wtype, const time_point &t ) +int incident_sunlight( weather_type_id wtype, const time_point &t ) { - return std::max( 0.0f, sunlight( t, false ) + weather::light_modifier( wtype ) ); + return std::max( 0.0f, sunlight( t, false ) + wtype->light_modifier ); } -inline void proc_weather_sum( const weather_type wtype, weather_sum &data, +inline void proc_weather_sum( const weather_type_id wtype, weather_sum &data, const time_point &t, const time_duration &tick_size ) { - switch( wtype ) { - case WEATHER_LIGHT_DRIZZLE: - data.rain_amount += 1 * to_turns( tick_size ); - break; - case WEATHER_DRIZZLE: - data.rain_amount += 4 * to_turns( tick_size ); - break; - case WEATHER_RAINY: - case WEATHER_THUNDER: - case WEATHER_LIGHTNING: - data.rain_amount += 8 * to_turns( tick_size ); - break; - case WEATHER_ACID_DRIZZLE: - data.acid_amount += 4 * to_turns( tick_size ); - break; - case WEATHER_ACID_RAIN: - data.acid_amount += 8 * to_turns( tick_size ); - break; - default: - break; + int amount = 0; + if( wtype->rains ) { + switch( wtype->precip ) { + case precip_class::very_light: + amount = 1 * to_turns( tick_size ); + break; + case precip_class::light: + amount = 4 * to_turns( tick_size ); + break; + case precip_class::heavy: + amount = 8 * to_turns( tick_size ); + break; + default: + break; + } } + if( wtype->acidic ) { + data.acid_amount += amount; + } else { + data.rain_amount += amount; + } + // TODO: Change this sunlight "sampling" here into a proper interpolation const float tick_sunlight = incident_sunlight( wtype, t ); data.sunlight += tick_sunlight * to_turns( tick_size ); } -weather_type current_weather( const tripoint &location, const time_point &t ) +weather_type_id current_weather( const tripoint &location, const time_point &t ) { const auto wgen = g->weather.get_cur_weather_gen(); if( g->weather.weather_override != WEATHER_NULL ) { @@ -169,7 +185,7 @@ weather_sum sum_conditions( const time_point &start, const time_point &end, tick_size = 1_minutes; } - weather_type wtype = current_weather( location, t ); + weather_type_id wtype = current_weather( location, t ); proc_weather_sum( wtype, data, t, tick_size ); data.wind_amount += get_local_windpower( g->weather.windspeed, overmap_buffer.ter( ms_to_omt_copy( location ) ), @@ -331,8 +347,9 @@ double trap::funnel_turns_per_charge( double rain_depth_mm_per_hour ) const static void fill_funnels( int rain_depth_mm_per_hour, bool acid, const trap &tr ) { const double turns_per_charge = tr.funnel_turns_per_charge( rain_depth_mm_per_hour ); + map &here = get_map(); // Give each funnel on the map a chance to collect the rain. - const std::vector &funnel_locs = g->m.trap_locations( tr.loadid ); + const std::vector &funnel_locs = here.trap_locations( tr.loadid ); for( const tripoint &loc : funnel_locs ) { units::volume maxcontains = 0_ml; if( one_in( turns_per_charge ) ) { @@ -341,7 +358,7 @@ static void fill_funnels( int rain_depth_mm_per_hour, bool acid, const trap &tr // This funnel has collected some rain! Put the rain in the largest // container here which is either empty or contains some mixture of // impure water and acid. - map_stack items = g->m.i_at( loc ); + map_stack items = here.i_at( loc ); auto container = items.end(); for( auto candidate_container = items.begin(); candidate_container != items.end(); ++candidate_container ) { @@ -381,34 +398,53 @@ static void fill_water_collectors( int mmPerHour, bool acid ) * @see map::decay_fields_and_scent * @see player::drench */ -static void wet_player( int amount ) +void wet( Character &target, int amount ) { - if( !is_player_outside() || - g->u.has_trait( trait_FEATHERS ) || - g->u.weapon.has_flag( "RAIN_PROTECT" ) || - ( !one_in( 50 ) && g->u.worn_with_flag( "RAINPROOF" ) ) ) { + if( !is_creature_outside( target ) || + target.has_trait( trait_FEATHERS ) || + target.weapon.has_flag( "RAIN_PROTECT" ) || + ( !one_in( 50 ) && target.worn_with_flag( "RAINPROOF" ) ) ) { return; } // Coarse correction to get us back to previously intended soaking rate. if( !calendar::once_every( 6_seconds ) ) { return; } - const int warmth_delay = g->u.warmth( bodypart_id( "torso" ) ) * 4 / 5 + g->u.warmth( + const int warmth_delay = target.warmth( bodypart_id( "torso" ) ) * 4 / 5 + target.warmth( bodypart_id( "head" ) ) / 5; if( rng( 0, 100 - amount + warmth_delay ) > 10 ) { // Thick clothing slows down (but doesn't cap) soaking return; } - const auto &wet = g->u.body_wetness; - const auto &capacity = g->u.drench_capacity; + const auto &wet = target.body_wetness; + const auto &capacity = target.drench_capacity; body_part_set drenched_parts{ { bodypart_str_id( "torso" ), bodypart_str_id( "arm_l" ), bodypart_str_id( "arm_r" ), bodypart_str_id( "head" ) } }; if( wet[bp_torso] * 100 >= capacity[bp_torso] * 50 ) { // Once upper body is 50%+ drenched, start soaking the legs too drenched_parts.unify_set( { { bodypart_str_id( "leg_l" ), bodypart_str_id( "leg_r" ) } } ); } - g->u.drench( amount, drenched_parts, false ); + target.drench( amount, drenched_parts, false ); +} + +void weather_sound( translation sound_message, std::string sound_effect ) +{ + if( !g->u.has_effect( effect_sleep ) && !g->u.is_deaf() ) { + if( g->get_levz() >= 0 ) { + add_msg( sound_message ); + if( !sound_effect.empty() ) { + sfx::play_variant_sound( "environment", sound_effect, 80, rng( 0, 359 ) ); + } + } else if( one_in( std::max( roll_remainder( 2.0f * g->get_levz() / + g->u.mutation_value( "hearing_modifier" ) ), 1 ) ) ) { + add_msg( sound_message ); + if( !sound_effect.empty() ) { + sfx::play_variant_sound( "environment", sound_effect, + ( 80 * g->u.mutation_value( "hearing_modifier" ) ), rng( 0, 359 ) ); + } + } + } } double precip_mm_per_hour( precip_class const p ) @@ -416,146 +452,155 @@ double precip_mm_per_hour( precip_class const p ) // the precipitation were rain (rather than snow). { return - p == precip_class::VERY_LIGHT ? 0.5 : - p == precip_class::LIGHT ? 1.5 : - p == precip_class::HEAVY ? 3 : + p == precip_class::very_light ? 0.5 : + p == precip_class::light ? 1.5 : + p == precip_class::heavy ? 3 : 0; } -void do_rain( weather_type const w ) +void handle_weather_effects( weather_type_id const w ) { - if( !weather::rains( w ) || weather::precip( w ) == precip_class::NONE ) { - return; - } - fill_water_collectors( precip_mm_per_hour( weather::precip( w ) ), weather::acidic( w ) ); - int wetness = 0; - time_duration decay_time = 60_turns; - if( weather::precip( w ) == precip_class::VERY_LIGHT ) { - wetness = 5; - decay_time = 5_turns; - } else if( weather::precip( w ) == precip_class::LIGHT ) { - wetness = 30; - decay_time = 15_turns; - } else if( weather::precip( w ) == precip_class::HEAVY ) { - decay_time = 45_turns; - wetness = 60; + //Possible TODO, make npc/monsters affected + Character &target_character = get_player_character(); + if( w->rains && w->precip != precip_class::none ) { + fill_water_collectors( precip_mm_per_hour( w->precip ), + w->acidic ); + int wetness = 0; + time_duration decay_time = 60_turns; + if( w->precip == precip_class::very_light ) { + wetness = 5; + decay_time = 5_turns; + } else if( w->precip == precip_class::light ) { + wetness = 30; + decay_time = 15_turns; + } else if( w->precip == precip_class::heavy ) { + decay_time = 45_turns; + wetness = 60; + } + get_map().decay_fields_and_scent( decay_time ); + wet( target_character, wetness ); } - g->m.decay_fields_and_scent( decay_time ); - wet_player( wetness ); -} + glare( w ); + g->weather.lightning_active = false; -void weather_effect::none() -{ - glare( sun_intensity::normal ); -} -void weather_effect::flurry() {} - -void weather_effect::sunny() -{ - glare( sun_intensity::high ); -} -void weather_effect::snow() -{ - wet_player( 10 ); -} - -void weather_effect::snowstorm() -{ - wet_player( 40 ); -} -/** - * Thunder. - * Flavor messages. Very wet. - */ -void weather_effect::thunder() -{ - if( !g->u.has_effect( effect_sleep ) && !g->u.is_deaf() && one_in( THUNDER_CHANCE ) ) { - if( g->get_levz() >= 0 ) { - add_msg( _( "You hear a distant rumble of thunder." ) ); - sfx::play_variant_sound( "environment", "thunder_far", 80, rng( 0, 359 ) ); - } else if( one_in( std::max( roll_remainder( 2.0f * g->get_levz() / - g->u.mutation_value( "hearing_modifier" ) ), 1 ) ) ) { - add_msg( _( "You hear a rumble of thunder from above." ) ); - sfx::play_variant_sound( "environment", "thunder_far", - ( 80 * g->u.mutation_value( "hearing_modifier" ) ), rng( 0, 359 ) ); + for( const weather_effect ¤t_effect : w->effects ) { + if( current_effect.must_be_outside && !is_creature_outside( target_character ) ) { + continue; } - } -} - -/** - * Lightning. - * Chance of lightning illumination for the current turn when aboveground. Thunder. - * - * This used to manifest actual lightning on the map, causing fires and such, but since such effects - * only manifest properly near the player due to the "reality bubble", this was causing undesired metagame tactics - * such as players leaving their shelter for a more "expendable" area during lightning storms. - */ -void weather_effect::lightning() -{ - thunder(); - if( one_in( LIGHTNING_CHANCE ) ) { - if( g->get_levz() >= 0 ) { - add_msg( _( "A flash of lightning illuminates your surroundings!" ) ); - sfx::play_variant_sound( "environment", "thunder_near", 100, rng( 0, 359 ) ); + if( current_effect.time_between > 0_seconds && + !calendar::once_every( current_effect.time_between ) ) { + continue; + } + if( !one_in( current_effect.one_in_chance ) ) { + continue; + } + if( current_effect.lightning && g->get_levz() >= 0 ) { g->weather.lightning_active = true; } - } else { - g->weather.lightning_active = false; - } -} - -/** - * Acid drizzle. - * Causes minor pain only. - */ -void weather_effect::light_acid() -{ - if( calendar::once_every( 1_minutes ) && is_player_outside() ) { - if( g->u.weapon.has_flag( "RAIN_PROTECT" ) && !one_in( 3 ) ) { - add_msg( _( "Your %s protects you from the acidic drizzle." ), g->u.weapon.tname() ); - } else { - if( g->u.worn_with_flag( "RAINPROOF" ) && !one_in( 4 ) ) { - add_msg( _( "Your clothing protects you from the acidic drizzle." ) ); + if( current_effect.rain_proof ) { + int chance = 0; + if( w->precip <= precip_class::light ) { + chance = 2; + } else if( w->precip >= precip_class::heavy ) { + chance = 4; + } + if( target_character.weapon.has_flag( "RAIN_PROTECT" ) && one_in( chance ) ) { + add_msg( _( "Your %s protects you from the weather." ), target_character.weapon.tname() ); + continue; } else { - bool has_helmet = false; - if( g->u.is_wearing_power_armor( &has_helmet ) && ( has_helmet || !one_in( 4 ) ) ) { - add_msg( _( "Your power armor protects you from the acidic drizzle." ) ); + if( target_character.worn_with_flag( "RAINPROOF" ) && one_in( chance * 2 ) ) { + add_msg( _( "Your clothing protects you from the weather." ) ); + continue; } else { - add_msg( m_warning, _( "The acid rain stings, but is mostly harmless for now…" ) ); - if( one_in( 10 ) && ( g->u.get_pain() < 10 ) ) { - g->u.mod_pain( 1 ); + bool has_helmet = false; + if( target_character.is_wearing_power_armor( &has_helmet ) && ( has_helmet || + one_in( chance * 2 ) ) ) { + add_msg( _( "Your power armor protects you from the weather." ) ); + continue; } } } } - } -} + if( target_character.get_pain() >= current_effect.pain_max ) { + continue; + } -/** - * Acid rain. - * Causes major pain. Damages non acid-proof mobs. Very wet (acid). - */ -void weather_effect::acid() -{ - if( calendar::once_every( 2_turns ) && is_player_outside() ) { - if( g->u.weapon.has_flag( "RAIN_PROTECT" ) && one_in( 4 ) ) { - add_msg( _( "Your umbrella protects you from the acid rain." ) ); - } else { - if( g->u.worn_with_flag( "RAINPROOF" ) && one_in( 2 ) ) { - add_msg( _( "Your clothing protects you from the acid rain." ) ); + bool spawned = current_effect.spawns.empty(); + for( const spawn_type &spawn : current_effect.spawns ) { + monster target_monster; + if( spawn.target.is_empty() ) { + //grab a random nearby hostile creature to create a hallucination or copy of + Creature *copy = g->get_creature_if( [&spawn]( const Creature & critter ) -> bool { + bool not_self = get_player_character().pos() != critter.pos(); + bool in_range = std::round( rl_dist_exact( get_player_character().pos(), critter.pos() ) ) <= spawn.target_range; + bool valid_target = get_player_character().attitude_to( critter ) == Creature::Attitude::HOSTILE; + return not_self && in_range && valid_target; + } ); + if( copy == nullptr ) { + continue; + } + target_monster = *dynamic_cast( copy ); } else { - bool has_helmet = false; - if( g->u.is_wearing_power_armor( &has_helmet ) && ( has_helmet || !one_in( 2 ) ) ) { - add_msg( _( "Your power armor protects you from the acid rain." ) ); - } else { - add_msg( m_bad, _( "The acid rain burns!" ) ); - if( one_in( 2 ) && ( g->u.get_pain() < 100 ) ) { - g->u.mod_pain( rng( 1, 5 ) ); - } + target_monster = spawn.target; + } + + for( int i = 0; i < spawn.hallucination_count; i++ ) { + tripoint point; + if( g->find_nearby_spawn_point( target_character, target_monster.type->id, spawn.min_radius, + spawn.max_radius, point ) ) { + g->spawn_hallucination( point, target_monster.type->id ); + spawned = true; + } + } + for( int i = 0; i < spawn.real_count; i++ ) { + tripoint point; + if( g->find_nearby_spawn_point( target_character, target_monster.type->id, spawn.min_radius, + spawn.max_radius, point ) ) { + g->place_critter_at( target_monster.type->id, point ); + spawned = true; + } + } + } + if( !spawned ) { + continue; + } + for( const weather_field &field : current_effect.fields ) { + for( const tripoint &dest : get_map().points_in_radius( target_character.pos(), field.radius ) ) { + if( !field.outdoor_only || get_map().is_outside( dest ) ) { + get_map().add_field( dest, field.type, field.intensity, field.age ); } } } + if( current_effect.effect_id.is_valid() ) { + if( current_effect.target_part.is_valid() ) { + target_character.add_effect( current_effect.effect_id, current_effect.effect_duration, + current_effect.target_part->token ); + } else { + target_character.add_effect( current_effect.effect_id, current_effect.effect_duration ); + } + } + if( current_effect.trait_id_to_add.is_valid() ) { + target_character.set_mutation( current_effect.trait_id_to_add ); + } + if( current_effect.trait_id_to_remove.is_valid() ) { + target_character.unset_mutation( current_effect.trait_id_to_remove ); + } + + if( current_effect.target_part.is_valid() ) { + target_character.deal_damage( nullptr, current_effect.target_part, damage_instance( DT_BASH, + current_effect.damage ) ); + } else { + for( const bodypart_id &bp : target_character.get_all_body_parts() ) { + target_character.deal_damage( nullptr, bp, damage_instance( DT_BASH, current_effect.damage ) ); + } + } + target_character.mod_healthy( current_effect.healthy ); + target_character.mod_rad( current_effect.radiation ); + wet( target_character, current_effect.wet ); + target_character.mod_pain( current_effect.pain ); + weather_sound( current_effect.sound_message, current_effect.sound_effect ); + target_character.add_msg_if_player( current_effect.message ); } } @@ -622,7 +667,7 @@ std::string weather_forecast( const point &abs_sm_pos ) _( "The current time is %1$s Eastern Standard Time. At %2$s in %3$s, it was %4$s. The temperature was %5$s. " ), to_string_time_of_day( calendar::turn ), print_time_just_hour( calendar::turn ), city_name, - weather::name( g->weather.weather ), print_temperature( g->weather.temperature ) + get_weather().weather_id->name, print_temperature( get_weather().temperature ) ); //weather_report += ", the dewpoint ???, and the relative humidity ???. "; @@ -646,7 +691,7 @@ std::string weather_forecast( const point &abs_sm_pos ) const time_point last_hour = calendar::turn - ( calendar::turn - calendar::turn_zero ) % 1_hours; for( int d = 0; d < 6; d++ ) { - weather_type forecast = WEATHER_NULL; + weather_type_id forecast = WEATHER_NULL; const auto wgen = g->weather.get_cur_weather_gen(); for( time_point i = last_hour + d * 12_hours; i < last_hour + ( d + 1 ) * 12_hours; i += 1_hours ) { w_point w = wgen.get_weather( abs_ms_pos, i, g->get_seed() ); @@ -671,7 +716,7 @@ std::string weather_forecast( const point &abs_sm_pos ) } weather_report += string_format( _( "%s… %s. Highs of %s. Lows of %s. " ), - day, weather::name( forecast ), + day, forecast->name, print_temperature( high ), print_temperature( low ) ); } @@ -862,14 +907,14 @@ std::string get_wind_arrow( int dirangle ) return wind_arrow; } -int get_local_humidity( double humidity, weather_type weather, bool sheltered ) +int get_local_humidity( double humidity, weather_type_id weather, bool sheltered ) { int tmphumidity = humidity; if( sheltered ) { // Norm for a house? tmphumidity = humidity * ( 100 - humidity ) / 100 + humidity; - } else if( weather == WEATHER_RAINY || weather == WEATHER_DRIZZLE || weather == WEATHER_THUNDER || - weather == WEATHER_LIGHTNING ) { + } else if( weather->rains && + weather->precip >= precip_class::light ) { tmphumidity = 100; } @@ -905,7 +950,7 @@ double get_local_windpower( double windpower, const oter_id &omter, const tripoi bool is_wind_blocker( const tripoint &location ) { - return g->m.has_flag( "BLOCK_WIND", location ); + return get_map().has_flag( "BLOCK_WIND", location ); } // Description of Wind Speed - https://en.wikipedia.org/wiki/Beaufort_scale @@ -977,7 +1022,7 @@ weather_manager::weather_manager() weather_override = WEATHER_NULL; nextweather = calendar::before_time_starts; temperature = 0; - weather = WEATHER_CLEAR; + weather_id = WEATHER_CLEAR; } const weather_generator &weather_manager::get_cur_weather_gen() const @@ -992,16 +1037,13 @@ void weather_manager::update_weather() w_point &w = *weather_precise; winddirection = wind_direction_override ? *wind_direction_override : w.winddirection; windspeed = windspeed_override ? *windspeed_override : w.windpower; - if( weather == WEATHER_NULL || calendar::turn >= nextweather ) { + if( weather_id == WEATHER_NULL || calendar::turn >= nextweather ) { const weather_generator &weather_gen = get_cur_weather_gen(); w = weather_gen.get_weather( g->u.global_square_location(), calendar::turn, g->get_seed() ); - weather_type old_weather = weather; - weather = weather_override == WEATHER_NULL ? - weather_gen.get_weather_conditions( w ) - : weather_override; - if( weather == WEATHER_SUNNY && is_night( calendar::turn ) ) { - weather = WEATHER_CLEAR; - } + weather_type_id old_weather = weather_id; + weather_id = weather_override == WEATHER_NULL ? + weather_gen.get_weather_conditions( w ) + : weather_override; if( !g->u.has_artifact_with( AEP_BAD_WEATHER ) ) { weather_override = WEATHER_NULL; } @@ -1011,22 +1053,21 @@ void weather_manager::update_weather() // Check weather every few turns, instead of every turn. // TODO: predict when the weather changes and use that time. nextweather = calendar::turn + 5_minutes; - const weather_datum wdata = weather_data( weather ); - if( weather != old_weather && wdata.dangerous && - g->get_levz() >= 0 && g->m.is_outside( g->u.pos() ) + if( weather_id != old_weather && weather_id->dangerous && + g->get_levz() >= 0 && get_map().is_outside( g->u.pos() ) && !g->u.has_activity( ACT_WAIT_WEATHER ) ) { g->cancel_activity_or_ignore_query( distraction_type::weather_change, - string_format( _( "The weather changed to %s!" ), wdata.name ) ); + string_format( _( "The weather changed to %s!" ), weather_id->name ) ); } - if( weather != old_weather && g->u.has_activity( ACT_WAIT_WEATHER ) ) { + if( weather_id != old_weather && g->u.has_activity( ACT_WAIT_WEATHER ) ) { g->u.assign_activity( ACT_WAIT_WEATHER, 0, 0 ); } - if( wdata.sight_penalty != - weather::sight_penalty( old_weather ) ) { + if( weather_id->sight_penalty != + old_weather->sight_penalty ) { for( int i = -OVERMAP_DEPTH; i <= OVERMAP_HEIGHT; i++ ) { - g->m.set_transparency_cache_dirty( i ); + get_map().set_transparency_cache_dirty( i ); } } } @@ -1054,7 +1095,7 @@ int weather_manager::get_temperature( const tripoint &location ) } //underground temperature = average New England temperature = 43F/6C rounded to int const int temp = ( location.z < 0 ? AVERAGE_ANNUAL_TEMPERATURE : temperature ) + - ( g->new_game ? 0 : g->m.get_temperature( location ) + temp_mod ); + ( g->new_game ? 0 : get_map().get_temperature( location ) + temp_mod ); temperature_cache.emplace( std::make_pair( location, temp ) ); return temp; diff --git a/src/weather.h b/src/weather.h index b365cd4273328..dd93db6bfede6 100644 --- a/src/weather.h +++ b/src/weather.h @@ -44,50 +44,8 @@ class item; struct trap; struct rl_vec2d; -/** - * Weather type enum. - */ -enum weather_type : int { - WEATHER_NULL, //!< For data and stuff - WEATHER_CLEAR, //!< No effects - WEATHER_SUNNY, //!< Glare if no eye protection - WEATHER_CLOUDY, //!< No effects - WEATHER_LIGHT_DRIZZLE,//!< very Light rain - WEATHER_DRIZZLE, //!< Light rain - WEATHER_RAINY, //!< Lots of rain, sight penalties - WEATHER_THUNDER, //!< Warns of lightning to come - WEATHER_LIGHTNING, //!< Rare lightning strikes! - WEATHER_ACID_DRIZZLE, //!< No real effects; warning of acid rain - WEATHER_ACID_RAIN, //!< Minor acid damage - WEATHER_FLURRIES, //!< Light snow - WEATHER_SNOW, //!< snow glare effects - WEATHER_SNOWSTORM, //!< sight penalties - NUM_WEATHER_TYPES //!< Sentinel value -}; - -enum class precip_class : int { - NONE, - VERY_LIGHT, - LIGHT, - HEAVY -}; - double precip_mm_per_hour( precip_class p ); -void do_rain( weather_type w ); - -/** - * Weather animation class. - */ -struct weather_animation_t { - float factor; - nc_color color; - char glyph; -}; - -/** - * Weather animation settings for the given type. - */ -weather_animation_t get_weather_animation( weather_type type ); +void handle_weather_effects( weather_type_id w ); /** * Weather drawing tracking. @@ -96,7 +54,7 @@ weather_animation_t get_weather_animation( weather_type type ); */ struct weather_printable { //!< Weather type in use. - weather_type wtype; + weather_type_id wtype; //!< Coordinates targeted for droplets. std::vector > vdrops; //!< Color to draw glyph this animation frame. @@ -105,50 +63,6 @@ struct weather_printable { char cGlyph; }; -/** - * Environmental effects and ramifications of weather. - * Visibility range changes are done elsewhere. - */ -namespace weather_effect -{ - -enum class sun_intensity : int { - normal = 1, - high -}; - -//!< Fallback weather. -void none(); -void glare( sun_intensity ); -void thunder(); -void lightning(); -void light_acid(); -void acid(); -//!< Currently flurries have no additional effects. -void flurry(); -void snow(); -void sunny(); -void snowstorm(); -} //namespace weather_effect - -using weather_effect_fn = void ( * )(); - -struct weather_datum { - std::string name; //!< UI name of weather type. - nc_color color; //!< UI color of weather type. - nc_color map_color; //!< Map color of weather type. - char glyph; //!< Map glyph of weather type. - int ranged_penalty; //!< Penalty to ranged attacks. - float sight_penalty; //!< Penalty to per-square visibility, applied in transparency map. - int light_modifier; //!< Modification to ambient light. - int sound_attn; //!< Sound attenuation of a given weather type. - bool dangerous; //!< If true, our activity gets interrupted. - precip_class precip; //!< Amount of associated precipitation. - bool rains; //!< Whether said precipitation falls as rain. - bool acidic; //!< Whether said precipitation is acidic. - weather_effect_fn effect; //!< Function pointer for weather effects. -}; - struct weather_sum { int rain_amount = 0; int acid_amount = 0; @@ -156,24 +70,7 @@ struct weather_sum { int wind_amount = 0; }; -weather_datum weather_data( weather_type type ); -namespace weather -{ -std::string name( weather_type type ); -nc_color color( weather_type type ); -nc_color map_color( weather_type type ); -char glyph( weather_type type ); -int ranged_penalty( weather_type type ); -float sight_penalty( weather_type type ); -int light_modifier( weather_type type ); -int sound_attn( weather_type type ); -bool dangerous( weather_type type ); -precip_class precip( weather_type type ); -bool rains( weather_type type ); -bool acidic( weather_type type ); -weather_effect_fn effect( weather_type type ); -} // namespace weather - +weather_type_id get_bad_weather(); std::string get_shortdirstring( int angle ); std::string get_dirstring( int angle ); @@ -193,7 +90,7 @@ std::string print_pressure( double pressure, int decimals = 0 ); // Return windchill offset in degrees F, starting from given temperature, humidity and wind int get_local_windchill( double temperature_f, double humidity, double wind_mph ); -int get_local_humidity( double humidity, weather_type weather, bool sheltered = false ); +int get_local_humidity( double humidity, weather_type_id weather, bool sheltered = false ); double get_local_windpower( double windpower, const oter_id &omter, const tripoint &location, const int &winddirection, bool sheltered = false ); @@ -231,16 +128,20 @@ bool warm_enough_to_plant( const tripoint &pos ); bool is_wind_blocker( const tripoint &location ); -weather_type current_weather( const tripoint &location, - const time_point &t = calendar::turn ); +weather_type_id current_weather( const tripoint &location, + const time_point &t = calendar::turn ); +void glare( weather_type_id w ); /** * Amount of sunlight incident at the ground, taking weather and time of day * into account. */ -int incident_sunlight( weather_type wtype, +int incident_sunlight( weather_type_id wtype, const time_point &t = calendar::turn ); +void weather_sound( translation sound_message, std::string sound_effect ); +void wet( Character &target, int amount ); + class weather_manager { public: @@ -252,14 +153,14 @@ class weather_manager int temperature = 0; bool lightning_active = false; // Weather pattern - weather_type weather = weather_type::WEATHER_NULL; + weather_type_id weather_id = WEATHER_NULL; int winddirection = 0; int windspeed = 0; // Cached weather data pimpl weather_precise; cata::optional wind_direction_override; cata::optional windspeed_override; - weather_type weather_override; + weather_type_id weather_override; // not only sets nextweather, but updates weather as well void set_nextweather( time_point t ); // The time at which weather will shift next. diff --git a/src/weather_data.cpp b/src/weather_data.cpp deleted file mode 100644 index 04591a419d955..0000000000000 --- a/src/weather_data.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include "weather.h" // IWYU pragma: associated - -#include -#include -#include -#include - -#include "color.h" -#include "translations.h" - -/** - * @ingroup Weather - * @{ - */ - -weather_animation_t get_weather_animation( weather_type const type ) -{ - static const std::map map { - {WEATHER_ACID_DRIZZLE, weather_animation_t {0.01f, c_light_green, '.'}}, - {WEATHER_ACID_RAIN, weather_animation_t {0.02f, c_light_green, ','}}, - {WEATHER_LIGHT_DRIZZLE, weather_animation_t{0.01f, c_light_blue, ','}}, - {WEATHER_DRIZZLE, weather_animation_t {0.01f, c_light_blue, '.'}}, - {WEATHER_RAINY, weather_animation_t {0.02f, c_light_blue, ','}}, - {WEATHER_THUNDER, weather_animation_t {0.02f, c_light_blue, '.'}}, - {WEATHER_LIGHTNING, weather_animation_t {0.04f, c_light_blue, ','}}, - {WEATHER_FLURRIES, weather_animation_t {0.01f, c_white, '.'}}, - {WEATHER_SNOW, weather_animation_t {0.02f, c_white, ','}}, - {WEATHER_SNOWSTORM, weather_animation_t {0.04f, c_white, '*'}} - }; - - const auto it = map.find( type ); - if( it != std::end( map ) ) { - return it->second; - } - - return {0.0f, c_white, '?'}; -} -struct weather_result { - weather_datum datum; - bool is_valid; -}; -static weather_result weather_data_internal( weather_type const type ) -{ - /** - * Weather types data definition. - * Name, color in UI, color and glyph on map, ranged penalty, sight penalty, - * light modifier, sound attenuation, warn player? - * Note light modifier assumes baseline of default_daylight_level() at 60 - */ - // TODO: but it actually isn't 60, it's 100. Fix this comment or fix the value - static const std::array data {{ - weather_datum { - "NULL Weather - BUG (weather_data.cpp:weather_data)", c_magenta, c_magenta_red, - '0', 0, 0.0f, 0, 0, false, - precip_class::NONE, false, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Clear" ), c_cyan, c_yellow_white, ' ', 0, 1.0f, 0, 0, false, - precip_class::NONE, false, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Sunny" ), c_light_cyan, c_yellow_white, '*', 0, 1.0f, 2, 0, false, - precip_class::NONE, false, false, &weather_effect::sunny - }, - weather_datum { - translate_marker( "Cloudy" ), c_light_gray, c_dark_gray_white, '~', 0, 1.0f, -20, 0, false, - precip_class::NONE, false, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Light Drizzle" ), c_light_blue, h_light_blue, '.', 0, 1.01f, -10, 0, false, - precip_class::VERY_LIGHT, true, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Drizzle" ), c_light_blue, h_light_blue, '.', 1, 1.03f, -20, 1, false, - precip_class::LIGHT, true, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Rain" ), c_blue, h_blue, 'o', 3, 1.1f, -30, 4, false, - precip_class::HEAVY, true, false, &weather_effect::none - }, - weather_datum { - translate_marker( "Thunder Storm" ), c_dark_gray, i_blue, '%', 4, 1.2f, -40, 8, false, - precip_class::HEAVY, true, false, &weather_effect::thunder - }, - weather_datum { - translate_marker( "Lightning Storm" ), c_yellow, h_yellow, '%', 4, 1.25f, -45, 8, false, - precip_class::HEAVY, true, false, &weather_effect::lightning - }, - weather_datum { - translate_marker( "Acidic Drizzle" ), c_light_green, c_yellow_green, '.', 2, 1.03f, -20, 1, true, - precip_class::LIGHT, true, true, &weather_effect::light_acid - }, - weather_datum { - translate_marker( "Acid Rain" ), c_green, c_yellow_green, 'o', 4, 1.1f, -30, 4, true, - precip_class::HEAVY, true, true, &weather_effect::acid - }, - weather_datum { - translate_marker( "Flurries" ), c_white, c_dark_gray_cyan, '.', 2, 1.12f, -15, 2, false, - precip_class::LIGHT, false, false, &weather_effect::flurry - }, - weather_datum { - translate_marker( "Snowing" ), c_white, c_dark_gray_cyan, '*', 4, 1.13f, -20, 4, false, - precip_class::HEAVY, false, false, &weather_effect::snow - }, - weather_datum { - translate_marker( "Snowstorm" ), c_white, c_white_cyan, '%', 6, 1.2f, -30, 6, false, - precip_class::HEAVY, false, false, &weather_effect::snowstorm - } - }}; - - const size_t i = static_cast( type ); - if( i < NUM_WEATHER_TYPES ) { - return { data[i], i > 0 }; - } - - return { data[0], false }; -} - -static weather_datum weather_data_interal_localized( weather_type const type ) -{ - weather_result res = weather_data_internal( type ); - if( res.is_valid ) { - res.datum.name = _( res.datum.name ); - } - return res.datum; -} - -weather_datum weather_data( weather_type const type ) -{ - return weather_data_interal_localized( type ); -} - -namespace weather -{ -std::string name( weather_type const type ) -{ - return weather_data_interal_localized( type ).name; -} -nc_color color( weather_type const type ) -{ - return weather_data_internal( type ).datum.color; -} -nc_color map_color( weather_type const type ) -{ - return weather_data_internal( type ).datum.map_color; -} -char glyph( weather_type const type ) -{ - return weather_data_internal( type ).datum.glyph; -} -int ranged_penalty( weather_type const type ) -{ - return weather_data_internal( type ).datum.ranged_penalty; -} -float sight_penalty( weather_type const type ) -{ - return weather_data_internal( type ).datum.sight_penalty; -} -int light_modifier( weather_type const type ) -{ - return weather_data_internal( type ).datum.light_modifier; -} -int sound_attn( weather_type const type ) -{ - return weather_data_internal( type ).datum.sound_attn; -} -bool dangerous( weather_type const type ) -{ - return weather_data_internal( type ).datum.dangerous; -} -precip_class precip( weather_type const type ) -{ - return weather_data_internal( type ).datum.precip; -} -bool rains( weather_type const type ) -{ - return weather_data_internal( type ).datum.rains; -} -bool acidic( weather_type const type ) -{ - return weather_data_internal( type ).datum.acidic; -} -weather_effect_fn effect( weather_type const type ) -{ - return weather_data_internal( type ).datum.effect; -} -} // namespace weather - -///@} diff --git a/src/weather_gen.cpp b/src/weather_gen.cpp index 2dec277b23ea1..b715a1300627c 100644 --- a/src/weather_gen.cpp +++ b/src/weather_gen.cpp @@ -86,7 +86,7 @@ static double weather_temperature_from_common_data( const weather_generator &wg, const int seasonal_temp_mod[4] = { wg.spring_temp_manual_mod, wg.summer_temp_manual_mod, wg.autumn_temp_manual_mod, wg.winter_temp_manual_mod }; const double baseline( wg.base_temperature + - seasonal_temp_mod[ season ] + + seasonal_temp_mod[season] + dayv * daily_magnitude_K + seasonality * seasonality_magnitude_K ); @@ -146,7 +146,7 @@ w_point weather_generator::get_weather( const tripoint &location, const time_poi 10 * ( -seasonality + 2 ); // Wind power - W = std::max( 0, static_cast( base_wind * rng( 1, 2 ) / std::pow( ( P + W ) / 1014.78, rng( 9, + W = std::max( 0, static_cast( base_wind * rng( 1, 2 ) / std::pow( ( P + W ) / 1014.78, rng( 9, base_wind_distrib_peaks ) ) + -cyf / base_wind_season_variation * rng( 1, 2 ) ) ); // Initial static variable @@ -165,65 +165,60 @@ w_point weather_generator::get_weather( const tripoint &location, const time_poi // Acid rains const double acid_content = base_acid * A; bool acid = acid_content >= 1.0; - return w_point {T, H, P, W, wind_desc, current_winddir, acid}; + return w_point{ T, H, P, W, wind_desc, current_winddir, acid }; } -weather_type weather_generator::get_weather_conditions( const tripoint &location, +weather_type_id weather_generator::get_weather_conditions( const tripoint &location, const time_point &t, unsigned seed ) const { w_point w( get_weather( location, t, seed ) ); - weather_type wt = get_weather_conditions( w ); - // Make sure we don't say it's sunny at night! =P - if( wt == WEATHER_SUNNY && is_night( t ) ) { - return WEATHER_CLEAR; - } + weather_type_id wt = get_weather_conditions( w ); return wt; } -weather_type weather_generator::get_weather_conditions( const w_point &w ) const +weather_type_id weather_generator::get_weather_conditions( const w_point &w ) const { - weather_type r( WEATHER_CLEAR ); - if( w.pressure > 1020 && w.humidity < 70 ) { - r = WEATHER_SUNNY; - } - if( w.pressure < 1010 && w.humidity > 40 ) { - r = WEATHER_CLOUDY; - } - if( r == WEATHER_CLOUDY && ( w.humidity > 96 || w.pressure < 1003 ) ) { - r = WEATHER_LIGHT_DRIZZLE; - } - if( r >= WEATHER_LIGHT_DRIZZLE && ( w.humidity > 97 || w.pressure < 1000 ) ) { - r = WEATHER_DRIZZLE; - } - if( r >= WEATHER_CLOUDY && ( w.humidity > 98 || w.pressure < 993 ) ) { - r = WEATHER_RAINY; - } - if( r == WEATHER_RAINY && w.pressure < 996 ) { - r = WEATHER_THUNDER; - } - if( r == WEATHER_THUNDER && w.pressure < 990 ) { - r = WEATHER_LIGHTNING; - } + weather_type_id current_conditions = WEATHER_CLEAR; + for( const std::string &weather_type : weather_types ) { + weather_type_id type = weather_type_id( weather_type ); + + const weather_requirements &requires = type->requirements; + bool test_pressure = + requires.pressure_max > w.pressure && + requires.pressure_min < w.pressure; + bool test_humidity = + requires.humidity_max > w.humidity && + requires.humidity_min < w.humidity; + if( ( requires.humidity_and_pressure && !( test_pressure && test_humidity ) ) || + ( !requires.humidity_and_pressure && !( test_pressure || test_humidity ) ) ) { + continue; + } + bool test_temperature = + requires.temperature_max > w.temperature && + requires.temperature_min < w.temperature; + bool test_windspeed = + requires.windpower_max > w.windpower && + requires.windpower_min < w.windpower; + bool test_acidic = !requires.acidic || w.acidic; + if( !( test_temperature && test_windspeed && test_acidic ) ) { + continue; + } - if( w.temperature <= 32 ) { - if( r == WEATHER_DRIZZLE ) { - r = WEATHER_FLURRIES; - } else if( r > WEATHER_DRIZZLE ) { - if( r >= WEATHER_THUNDER && w.windpower > 15 ) { - r = WEATHER_SNOWSTORM; - } else { - r = WEATHER_SNOW; + if( !requires.required_weathers.empty() ) { + if( std::find( requires.required_weathers.begin(), requires.required_weathers.end(), + current_conditions ) == requires.required_weathers.end() ) { + continue; } } - } - if( r == WEATHER_DRIZZLE && w.acidic ) { - r = WEATHER_ACID_DRIZZLE; - } - if( r > WEATHER_DRIZZLE && w.acidic ) { - r = WEATHER_ACID_RAIN; + if( !( requires.time == weather_time_requirement_type::both || + ( requires.time == weather_time_requirement_type::day && is_day( calendar::turn ) ) || + ( requires.time == weather_time_requirement_type::night && !is_day( calendar::turn ) ) ) ) { + continue; + } + current_conditions = type; } - return r; + return current_conditions; } int weather_generator::get_wind_direction( const season_type season ) const @@ -298,8 +293,7 @@ void weather_generator::test_weather( unsigned seed = 1000 ) const const time_point end = begin + 2 * calendar::year_length(); for( time_point i = begin; i < end; i += 20_minutes ) { w_point w = get_weather( tripoint_zero, to_turn( i ), seed ); - weather_type c = get_weather_conditions( w ); - weather_datum wd = weather_data( c ); + weather_type_id conditions = get_weather_conditions( w ); int year = to_turns( i - calendar::turn_zero ) / to_turns ( calendar::year_length() ) + 1; @@ -312,9 +306,11 @@ void weather_generator::test_weather( unsigned seed = 1000 ) const day = day_of_season( i ); } testfile << "|;" << year << ";" << season_of_year( i ) << ";" << day << ";" << hour << ";" << minute - << ";" << w.temperature << ";" << w.humidity << ";" << w.pressure << ";" << wd.name << ";" << + << ";" << w.temperature << ";" << w.humidity << ";" << w.pressure << ";" << conditions->name << ";" + << w.windpower << ";" << w.winddirection << std::endl; } + }, "weather test file" ); } @@ -336,5 +332,9 @@ weather_generator weather_generator::load( const JsonObject &jo ) ret.summer_humidity_manual_mod = jo.get_int( "summer_humidity_manual_mod", 0 ); ret.autumn_humidity_manual_mod = jo.get_int( "autumn_humidity_manual_mod", 0 ); ret.winter_humidity_manual_mod = jo.get_int( "winter_humidity_manual_mod", 0 ); + ret.weather_types = jo.get_string_array( "weather_types" ); + if( ret.weather_types.size() < 2 ) { + jo.throw_error( "Need at least 2 weather types per region for null and default." ); + } return ret; } diff --git a/src/weather_gen.h b/src/weather_gen.h index 9b269ec82cced..92f6b4c031711 100644 --- a/src/weather_gen.h +++ b/src/weather_gen.h @@ -3,14 +3,15 @@ #define CATA_SRC_WEATHER_GEN_H #include +#include #include "calendar.h" +#include "color.h" +#include "weather_type.h" struct tripoint; class JsonObject; -enum weather_type : int; - struct w_point { double temperature = 0; double humidity = 0; @@ -46,7 +47,7 @@ class weather_generator //How much the wind folows seasonal variation ( lower means more change ) int base_wind_season_variation = 0; static int current_winddir; - + std::vector weather_types; weather_generator(); /** @@ -55,8 +56,9 @@ class weather_generator * relative position (relative to the map you called getabs on). */ w_point get_weather( const tripoint &, const time_point &, unsigned ) const; - weather_type get_weather_conditions( const tripoint &, const time_point &, unsigned seed ) const; - weather_type get_weather_conditions( const w_point & ) const; + weather_type_id get_weather_conditions( const tripoint &, const time_point &, + unsigned seed ) const; + weather_type_id get_weather_conditions( const w_point & ) const; int get_wind_direction( season_type ) const; int convert_winddir( int ) const; int get_water_temperature() const; diff --git a/src/weather_type.cpp b/src/weather_type.cpp new file mode 100644 index 0000000000000..9bee3b8096247 --- /dev/null +++ b/src/weather_type.cpp @@ -0,0 +1,305 @@ +#include "weather_type.h" +#include "weather.h" +#include "game_constants.h" + +namespace +{ +generic_factory weather_type_factory( "weather_type" ); +} // namespace + + +namespace io +{ +template<> +std::string enum_to_string( precip_class data ) +{ + switch( data ) { + case precip_class::none: + return "none"; + case precip_class::very_light: + return "very_light"; + case precip_class::light: + return "light"; + case precip_class::heavy: + return "heavy"; + case precip_class::last: + break; + } + debugmsg( "Invalid precip_class" ); + abort(); +} + +template<> +std::string enum_to_string( sun_intensity_type data ) +{ + switch( data ) { + case sun_intensity_type::none: + return "none"; + case sun_intensity_type::light: + return "light"; + case sun_intensity_type::normal: + return "normal"; + case sun_intensity_type::high: + return "high"; + case sun_intensity_type::last: + break; + } + debugmsg( "Invalid sun_intensity_type" ); + abort(); +} + +template<> +std::string enum_to_string( weather_time_requirement_type data ) +{ + switch( data ) { + case weather_time_requirement_type::day: + return "day"; + case weather_time_requirement_type::night: + return "night"; + case weather_time_requirement_type::both: + return "both"; + case weather_time_requirement_type::last: + break; + } + debugmsg( "Invalid time_requirement_type" ); + abort(); +} + +template<> +std::string enum_to_string( weather_sound_category data ) +{ + switch( data ) { + case weather_sound_category::drizzle: + return "drizzle"; + case weather_sound_category::flurries: + return "flurries"; + case weather_sound_category::rainy: + return "rainy"; + case weather_sound_category::snow: + return "snow"; + case weather_sound_category::snowstorm: + return "snowstorm"; + case weather_sound_category::thunder: + return "thunder"; + case weather_sound_category::silent: + return "silent"; + case weather_sound_category::last: + break; + } + debugmsg( "Invalid time_requirement_type" ); + abort(); +} + +} // namespace io + +template<> +const weather_type &weather_type_id::obj() const +{ + return weather_type_factory.obj( *this ); +} + +/** @relates string_id */ +template<> +bool string_id::is_valid() const +{ + return weather_type_factory.is_valid( *this ); +} + +void weather_type::finalize() +{ + +} + +void weather_type::check() const +{ + for( const weather_type_id &required : requirements.required_weathers ) { + if( !required.is_valid() ) { + debugmsg( "Required weather type %s does not exist.", required.c_str() ); + abort(); + } + } + for( const weather_effect &effect : effects ) { + if( !effect.effect_id.is_empty() && !effect.effect_id.is_valid() ) { + debugmsg( "Effect type %s does not exist.", effect.effect_id.c_str() ); + abort(); + } + if( !effect.trait_id_to_add.is_empty() && !effect.trait_id_to_add.is_valid() ) { + debugmsg( "Trait %s does not exist.", effect.trait_id_to_add.c_str() ); + abort(); + } + if( !effect.trait_id_to_remove.is_empty() && !effect.trait_id_to_remove.is_valid() ) { + debugmsg( "Trait %s does not exist.", effect.trait_id_to_remove.c_str() ); + abort(); + } + if( !effect.target_part.is_empty() && !effect.target_part.is_valid() ) { + debugmsg( "Target part %s does not exist.", effect.target_part.c_str() ); + abort(); + } + for( const spawn_type &spawn : effect.spawns ) { + if( !spawn.target.is_empty() && !spawn.target.is_valid() ) { + debugmsg( "Spawn target %s does not exist.", spawn.target.c_str() ); + abort(); + } + } + for( const weather_field &field : effect.fields ) { + if( !field.type.is_valid() ) { + debugmsg( "field type %s does not exist.", field.type.c_str() ); + abort(); + } + } + } +} + +void weather_type::load( const JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", name ); + mandatory( jo, was_loaded, "id", id ); + + assign( jo, "color", color ); + assign( jo, "map_color", map_color ); + + std::string glyph; + mandatory( jo, was_loaded, "glyph", glyph ); + if( glyph.size() != 1 ) { + jo.throw_error( "glyph must be only one character" ); + } else { + glyph = glyph[0]; + } + mandatory( jo, was_loaded, "ranged_penalty", ranged_penalty ); + mandatory( jo, was_loaded, "sight_penalty", sight_penalty ); + mandatory( jo, was_loaded, "light_modifier", light_modifier ); + + mandatory( jo, was_loaded, "sound_attn", sound_attn ); + mandatory( jo, was_loaded, "dangerous", dangerous ); + mandatory( jo, was_loaded, "precip", precip ); + mandatory( jo, was_loaded, "rains", rains ); + optional( jo, was_loaded, "acidic", acidic, false ); + optional( jo, was_loaded, "tiles_animation", tiles_animation, "" ); + optional( jo, was_loaded, "sound_category", sound_category, weather_sound_category::silent ); + mandatory( jo, was_loaded, "sun_intensity", sun_intensity ); + + for( const JsonObject weather_effect_jo : jo.get_array( "effects" ) ) { + + weather_effect effect; + + optional( weather_effect_jo, was_loaded, "message", effect.message ); + optional( weather_effect_jo, was_loaded, "sound_message", effect.sound_message ); + optional( weather_effect_jo, was_loaded, "sound_effect", effect.sound_effect, "" ); + mandatory( weather_effect_jo, was_loaded, "must_be_outside", effect.must_be_outside ); + optional( weather_effect_jo, was_loaded, "one_in_chance", effect.one_in_chance, -1 ); + optional( weather_effect_jo, was_loaded, "time_between", effect.time_between ); + optional( weather_effect_jo, was_loaded, "lightning", effect.lightning, false ); + optional( weather_effect_jo, was_loaded, "rain_proof", effect.rain_proof, false ); + optional( weather_effect_jo, was_loaded, "pain_max", effect.pain_max, INT_MAX ); + optional( weather_effect_jo, was_loaded, "pain", effect.pain, 0 ); + optional( weather_effect_jo, was_loaded, "wet", effect.wet, 0 ); + optional( weather_effect_jo, was_loaded, "radiation", effect.radiation, 0 ); + optional( weather_effect_jo, was_loaded, "healthy", effect.healthy, 0 ); + optional( weather_effect_jo, was_loaded, "effect_id", effect.effect_id ); + optional( weather_effect_jo, was_loaded, "effect_duration", effect.effect_duration ); + optional( weather_effect_jo, was_loaded, "trait_id_to_add", effect.trait_id_to_add ); + optional( weather_effect_jo, was_loaded, "trait_id_to_remove", effect.trait_id_to_remove ); + optional( weather_effect_jo, was_loaded, "target_part", effect.target_part ); + optional( weather_effect_jo, was_loaded, "damage", effect.damage, 0 ); + for( const JsonObject field_jo : weather_effect_jo.get_array( "fields" ) ) { + weather_field new_field; + mandatory( field_jo, was_loaded, "type", new_field.type ); + mandatory( field_jo, was_loaded, "intensity", new_field.intensity ); + mandatory( field_jo, was_loaded, "age", new_field.age ); + optional( field_jo, was_loaded, "outdoor_only", new_field.outdoor_only, true ); + optional( field_jo, was_loaded, "radius", new_field.radius, 10000000 ); + + effect.fields.emplace_back( new_field ); + } + for( const JsonObject spawn_jo : weather_effect_jo.get_array( "spawns" ) ) { + spawn_type spawn; + mandatory( spawn_jo, was_loaded, "max_radius", spawn.max_radius ); + mandatory( spawn_jo, was_loaded, "min_radius", spawn.min_radius ); + optional( spawn_jo, was_loaded, "hallucination_count", spawn.hallucination_count, 0 ); + optional( spawn_jo, was_loaded, "real_count", spawn.real_count, 0 ); + optional( spawn_jo, was_loaded, "target", spawn.target ); + optional( spawn_jo, was_loaded, "target_range", spawn.target_range, 30 ); + + effect.spawns.emplace_back( spawn ); + } + effects.emplace_back( effect ); + } + weather_animation = { 0.0f, c_white, '?' }; + if( jo.has_member( "weather_animation" ) ) { + JsonObject weather_animation_jo = jo.get_object( "weather_animation" ); + weather_animation_t animation; + mandatory( weather_animation_jo, was_loaded, "factor", animation.factor ); + if( !assign( weather_animation_jo, "color", animation.color ) ) { + weather_animation_jo.throw_error( "missing mandatory member \"color\"" ); + } + mandatory( weather_animation_jo, was_loaded, "glyph", glyph ); + if( glyph.size() != 1 ) { + weather_animation_jo.throw_error( "glyph must be only one character" ); + } else { + animation.glyph = glyph[0]; + } + weather_animation = animation; + } + + requirements = {}; + if( jo.has_member( "requirements" ) ) { + JsonObject weather_requires = jo.get_object( "requirements" ); + weather_requirements new_requires; + + optional( weather_requires, was_loaded, "pressure_min", new_requires.pressure_min, INT_MIN ); + optional( weather_requires, was_loaded, "pressure_max", new_requires.pressure_max, INT_MAX ); + optional( weather_requires, was_loaded, "humidity_min", new_requires.humidity_min, INT_MIN ); + optional( weather_requires, was_loaded, "humidity_max", new_requires.humidity_max, INT_MAX ); + optional( weather_requires, was_loaded, "temperature_min", new_requires.temperature_min, INT_MIN ); + optional( weather_requires, was_loaded, "temperature_max", new_requires.temperature_max, INT_MAX ); + optional( weather_requires, was_loaded, "windpower_min", new_requires.windpower_min, INT_MIN ); + optional( weather_requires, was_loaded, "windpower_max", new_requires.windpower_max, INT_MAX ); + optional( weather_requires, was_loaded, "humidity_and_pressure", new_requires.humidity_and_pressure, + true ); + optional( weather_requires, was_loaded, "acidic", new_requires.acidic, false ); + optional( weather_requires, was_loaded, "time", new_requires.time, + weather_time_requirement_type::both ); + for( const std::string &required_weather : + weather_requires.get_string_array( "required_weathers" ) ) { + new_requires.required_weathers.push_back( weather_type_id( required_weather ) ); + } + requirements = new_requires; + } +} + +void weather_types::reset() +{ + weather_type_factory.reset(); +} + +void weather_types::finalize_all() +{ + weather_type_factory.finalize(); + for( const weather_type &wt : weather_type_factory.get_all() ) { + const_cast( wt ).finalize(); + } +} + +const std::vector &weather_types::get_all() +{ + return weather_type_factory.get_all(); +} + +void weather_types::check_consistency() +{ + if( !WEATHER_CLEAR.is_valid() ) { + debugmsg( "Weather type clear is required." ); + abort(); + } + if( !WEATHER_NULL.is_valid() ) { + debugmsg( "Weather type null is required." ); + abort(); + } + weather_type_factory.check(); +} + +void weather_types::load( const JsonObject &jo, const std::string &src ) +{ + weather_type_factory.load( jo, src ); +} + diff --git a/src/weather_type.h b/src/weather_type.h new file mode 100644 index 0000000000000..bc81fedc2668b --- /dev/null +++ b/src/weather_type.h @@ -0,0 +1,175 @@ +#pragma once +#ifndef CATA_SRC_WEATHER_TYPE_H +#define CATA_SRC_WEATHER_TYPE_H + +#include + +#include "bodypart.h" +#include "field.h" +#include "generic_factory.h" +#include "translations.h" +#include "type_id.h" + +const weather_type_id WEATHER_NULL( "null" ); +const weather_type_id WEATHER_CLEAR( "clear" ); + +enum class precip_class : int { + none, + very_light, + light, + heavy, + last +}; +template<> +struct enum_traits { + static constexpr precip_class last = precip_class::last; +}; + +enum class sun_intensity_type : int { + none, + light, + normal, + high, + last +}; +template<> +struct enum_traits { + static constexpr sun_intensity_type last = sun_intensity_type::last; +}; + +enum class weather_time_requirement_type : int { + day, + night, + both, + last +}; +template<> +struct enum_traits { + static constexpr weather_time_requirement_type last = weather_time_requirement_type::last; +}; + + +enum weather_sound_category : int { + silent, + drizzle, + rainy, + thunder, + flurries, + snowstorm, + snow, + last +}; + +template<> +struct enum_traits { + static constexpr weather_sound_category last = weather_sound_category::last; +}; + +/** + * Weather animation class. + */ +struct weather_animation_t { + float factor; + nc_color color; + char glyph; +}; + +struct weather_requirements { + int windpower_min = INT_MIN; + int windpower_max = INT_MAX; + int temperature_min = INT_MIN; + int temperature_max = INT_MAX; + int pressure_min = INT_MIN; + int pressure_max = INT_MAX; + int humidity_min = INT_MIN; + int humidity_max = INT_MAX; + bool humidity_and_pressure = true; + bool acidic = false; + weather_time_requirement_type time; + std::vector required_weathers; +}; + +struct weather_field { + field_type_str_id type; + int intensity; + time_duration age; + int radius; + bool outdoor_only; +}; + +struct spawn_type { + mtype_id target; + int target_range; + int hallucination_count; + int real_count; + int min_radius; + int max_radius; +}; + +struct weather_effect { + int one_in_chance; + time_duration time_between; + translation message; + bool must_be_outside; + translation sound_message; + std::string sound_effect; + bool lightning; + bool rain_proof; + int pain; + int pain_max; + int wet; + int radiation; + int healthy; + efftype_id effect_id; + time_duration effect_duration; + trait_id trait_id_to_add; + trait_id trait_id_to_remove; + bodypart_str_id target_part; + int damage; + std::vector spawns; + std::vector fields; +}; + +struct weather_type { + public: + friend class generic_factory; + bool was_loaded = false; + weather_type_id id; + std::string name; //!< UI name of weather type. + nc_color color; //!< UI color of weather type. + nc_color map_color; //!< Map color of weather type. + char glyph; //!< Map glyph of weather type. + int ranged_penalty; //!< Penalty to ranged attacks. + float sight_penalty; //!< Penalty to per-square visibility, applied in transparency map. + int light_modifier; //!< Modification to ambient light. + int sound_attn; //!< Sound attenuation of a given weather type. + bool dangerous; //!< If true, our activity gets interrupted. + precip_class precip; //!< Amount of associated precipitation. + bool rains; //!< Whether said precipitation falls as rain. + bool acidic; //!< Whether said precipitation is acidic. + std::vector effects; //!< vector for weather effects. + std::string tiles_animation; //!< string for tiles animation + weather_animation_t weather_animation; //!< Information for weather animations + weather_sound_category sound_category; //!< if playing sound effects what to use + sun_intensity_type sun_intensity; //!< strength of the sun + weather_requirements requirements; //!< when this weather should happen + + void load( const JsonObject &jo, const std::string &src ); + void finalize(); + void check() const; + weather_type() = default; +}; +namespace weather_types +{ +/** Get all currently loaded weather types */ +const std::vector &get_all(); +/** Finalize all loaded weather types */ +void finalize_all(); +/** Clear all loaded weather types (invalidating any pointers) */ +void reset(); +/** Load weather type from JSON definition */ +void load( const JsonObject &jo, const std::string &src ); +/** Checks all loaded from JSON are valid */ +void check_consistency(); +} // namespace weather_types +#endif // CATA_SRC_WEATHER_TYPE_H diff --git a/src/wincurse.cpp b/src/wincurse.cpp index 784eb1348d3bf..ec4dad4ced5f8 100644 --- a/src/wincurse.cpp +++ b/src/wincurse.cpp @@ -558,6 +558,7 @@ static void CheckMessages() DispatchMessage( &msg ); } if( needs_resize ) { + restore_on_out_of_scope prev_lastchar( lastchar ); handle_resize( 0, 0 ); refresh_display(); } diff --git a/src/wish.cpp b/src/wish.cpp index 1c8691355e6ad..28284f0a2b7d3 100644 --- a/src/wish.cpp +++ b/src/wish.cpp @@ -409,7 +409,7 @@ void debug_menu::wishmonster( const cata::optional &p ) const mtype_id &mon_type = mtypes[ wmenu.ret ]->id; if( cata::optional spawn = p ? p : g->look_around() ) { int num_spawned = 0; - for( const tripoint &destination : closest_tripoints_first( *spawn, cb.group ) ) { + for( const tripoint &destination : closest_points_first( *spawn, cb.group ) ) { monster *const mon = g->place_critter_at( mon_type, destination ); if( !mon ) { continue; @@ -594,16 +594,24 @@ void debug_menu::wishitem( player *p, const tripoint &pos ) if( granted.count_by_charges() ) { if( amount > 0 ) { granted.charges = amount; - p->i_add( granted ); + if( p->can_stash( granted ) ) { + p->i_add( granted ); + } else { + get_map().add_item_or_charges( p->pos(), granted ); + } } } else { for( int i = 0; i < amount; i++ ) { - p->i_add( granted ); + if( p->can_stash( granted ) ) { + p->i_add( granted ); + } else { + get_map().add_item_or_charges( p->pos(), granted ); + } } } p->invalidate_crafting_inventory(); } else if( pos.x >= 0 && pos.y >= 0 ) { - g->m.add_item_or_charges( pos, granted ); + get_map().add_item_or_charges( pos, granted ); wmenu.ret = -1; } if( amount > 0 ) { diff --git a/src/worldfactory.cpp b/src/worldfactory.cpp index 75a77fa683965..a9b5d99c3cb9c 100644 --- a/src/worldfactory.cpp +++ b/src/worldfactory.cpp @@ -30,6 +30,7 @@ #include "point.h" #include "string_formatter.h" #include "string_id.h" +#include "string_input_popup.h" #include "translations.h" #include "ui_manager.h" @@ -843,6 +844,12 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, ctxt.register_action( "REMOVE_MOD" ); ctxt.register_action( "SAVE_DEFAULT_MODS" ); ctxt.register_action( "VIEW_MOD_DESCRIPTION" ); + ctxt.register_action( "FILTER" ); + + point filter_pos; + int filter_view_len = 0; + std::string current_filter = "init me!"; + std::unique_ptr fpopup; catacurses::window w_header1; catacurses::window w_header2; @@ -875,6 +882,14 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, header_windows.push_back( w_header1 ); header_windows.push_back( w_header2 ); + // Specify where the popup's string would be printed + filter_pos = point( 2, TERMY - 8 ); + filter_view_len = iMinScreenWidth / 2 - 11; + if( fpopup ) { + point inner_pos = filter_pos + point( 2, 0 ); + fpopup->window( win, inner_pos, inner_pos.x + filter_view_len ); + } + ui.position_from_window( win ); }; init_windows( ui ); @@ -884,18 +899,49 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, headers.push_back( _( "Mod List" ) ); headers.push_back( _( "Mod Load Order" ) ); - int tab_output = 0; size_t active_header = 0; - size_t useable_mod_count = mman->get_usable_mods().size(); int startsel[2] = {0, 0}; size_t cursel[2] = {0, 0}; size_t iCurrentTab = 0; std::vector current_tab_mods; - bool recalc_tabs = true; + struct mod_tab { + std::string id; + std::vector mods; + std::vector mods_unfiltered; + }; + std::vector all_tabs; + + for( const std::pair &tab : get_mod_list_tabs() ) { + all_tabs.push_back( { + tab.first, + std::vector(), + std::vector() + } ); + } + + const std::map &cat_tab_map = get_mod_list_cat_tab(); + for( const mod_id &mod : mman->get_usable_mods() ) { + int cat_idx = mod->category.first; + const std::string &cat_id = get_mod_list_categories()[cat_idx].first; + + std::string dest_tab = "tab_default"; + const auto iter = cat_tab_map.find( cat_id ); + if( iter != cat_tab_map.end() ) { + dest_tab = iter->second; + } + + for( mod_tab &tab : all_tabs ) { + if( tab.id == dest_tab ) { + tab.mods_unfiltered.push_back( mod ); + break; + } + } + } // Helper function for determining the currently selected mod const auto get_selected_mod = [&]() -> const MOD_INFORMATION* { + const std::vector ¤t_tab_mods = all_tabs[iCurrentTab].mods; if( current_tab_mods.empty() ) { return nullptr; @@ -909,6 +955,42 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, return nullptr; }; + // Helper function for applying filter to mod tabs + const auto apply_filter = [&]( const std::string & filter_str ) { + if( filter_str == current_filter ) { + return; + } + const MOD_INFORMATION *selected_mod = nullptr; + if( active_header == 0 ) { + selected_mod = get_selected_mod(); + } + for( mod_tab &tab : all_tabs ) { + if( filter_str.empty() ) { + tab.mods = tab.mods_unfiltered; + } else { + tab.mods.clear(); + for( const mod_id &mod : tab.mods_unfiltered ) { + std::string name = ( *mod ).name(); + if( lcmatch( name, filter_str ) ) { + tab.mods.push_back( mod ); + } + } + } + } + startsel[0] = 0; + cursel[0] = 0; + // Try to restore cursor position + const std::vector &curr_tab = all_tabs[iCurrentTab].mods; + for( size_t i = 0; i < curr_tab.size(); i++ ) { + if( &*curr_tab[i] == selected_mod ) { + cursel[0] = i; + break; + } + } + current_filter = filter_str; + }; + apply_filter( "" ); + ui.on_redraw( [&]( const ui_adaptor & ) { draw_worldgen_tabs( win, 0 ); draw_modselection_borders( win, ctxt ); @@ -948,7 +1030,7 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, } } - //redraw tabs + // Draw tab names wmove( win, point( 2, 4 ) ); for( size_t i = 0; i < get_mod_list_tabs().size(); i++ ) { wprintz( win, c_white, "[" ); @@ -958,41 +1040,67 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, wputch( win, BORDER_COLOR, LINE_OXOX ); } + // Draw filter + if( fpopup ) { + mvwprintz( win, filter_pos, c_cyan, "< " ); + mvwprintz( win, filter_pos + point( filter_view_len + 2, 0 ), c_cyan, " >" ); + // This call makes popup draw its string at position specified on popup initialization + fpopup->query_string( /*loop=*/false, /*draw_only=*/true ); + } else { + mvwprintz( win, filter_pos, c_light_gray, "< " ); + const char *help = current_filter.empty() ? _( "[%s] Filter" ) : _( "[%s] Filter: " ); + wprintz( win, c_light_gray, help, ctxt.get_desc( "FILTER" ) ); + wprintz( win, c_white, current_filter ); + wprintz( win, c_light_gray, " >" ); + } + wnoutrefresh( w_description ); wnoutrefresh( win ); - // Redraw list - draw_mod_list( w_list, startsel[0], cursel[0], current_tab_mods, active_header == 0, - _( "--NO AVAILABLE MODS--" ), catacurses::window() ); + // Draw selected tab + const mod_tab ¤t_tab = all_tabs[iCurrentTab]; + const char *msg = current_tab.mods_unfiltered.empty() ? + _( "--NO AVAILABLE MODS--" ) : _( "--NO RESULTS FOUND--" ); + draw_mod_list( w_list, startsel[0], cursel[0], current_tab.mods, active_header == 0, + msg, catacurses::window() ); - // Redraw active + // Draw active mods draw_mod_list( w_active, startsel[1], cursel[1], active_mod_order, active_header == 1, _( "--NO ACTIVE MODS--" ), w_shift ); } ); - while( tab_output == 0 ) { - if( recalc_tabs ) { - current_tab_mods.clear(); + const auto set_filter = [&]() { + fpopup = std::make_unique(); + fpopup->max_length( 256 ); + // current_filter is modified by apply_filter(), we have to copy the value + // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) + const std::string old_filter = current_filter; + fpopup->text( current_filter ); - for( const auto &item : mman->get_usable_mods() ) { - const auto &iter = get_mod_list_cat_tab().find( - get_mod_list_categories()[item->category.first].first ); + ime_sentry sentry; - std::string sCatTab = "tab_default"; - if( iter != get_mod_list_cat_tab().end() ) { - sCatTab = _( iter->second ); - } + // On next redraw, call resize callback which will configure how popup is rendered + ui.mark_resize(); - if( sCatTab == get_mod_list_tabs()[iCurrentTab].first ) { - current_tab_mods.push_back( item ); - } + for( ;; ) { + ui_manager::redraw(); + fpopup->query_string( /*loop=*/false ); - useable_mod_count = current_tab_mods.size(); + if( fpopup->canceled() ) { + apply_filter( old_filter ); + break; + } else if( fpopup->confirmed() ) { + break; + } else { + apply_filter( fpopup->text() ); } + }; - recalc_tabs = false; - } + fpopup.reset(); + }; + int tab_output = 0; + while( tab_output == 0 ) { ui_manager::redraw(); const int next_header = ( active_header == 1 ) ? 0 : 1; @@ -1003,8 +1111,9 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, size_t next_selection = selection + 1; size_t prev_selection = selection - 1; if( active_header == 0 ) { - next_selection = ( next_selection >= useable_mod_count ) ? 0 : next_selection; - prev_selection = ( prev_selection > useable_mod_count ) ? useable_mod_count - 1 : prev_selection; + size_t num_mods = all_tabs[iCurrentTab].mods.size(); + next_selection = ( next_selection >= num_mods ) ? 0 : next_selection; + prev_selection = ( prev_selection > num_mods ) ? num_mods - 1 : prev_selection; } else { next_selection = ( next_selection >= active_mod_order.size() ) ? 0 : next_selection; prev_selection = ( prev_selection > active_mod_order.size() ) ? active_mod_order.size() - 1 : @@ -1022,6 +1131,7 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, } else if( action == "LEFT" ) { active_header = prev_header; } else if( action == "CONFIRM" ) { + const std::vector ¤t_tab_mods = all_tabs[iCurrentTab].mods; if( active_header == 0 && !current_tab_mods.empty() ) { // try-add mman_ui->try_add( current_tab_mods[cursel[0]], active_mod_order ); @@ -1050,8 +1160,6 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, startsel[0] = 0; cursel[0] = 0; - - recalc_tabs = true; } } else if( action == "PREV_CATEGORY_TAB" ) { @@ -1062,8 +1170,6 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, startsel[0] = 0; cursel[0] = 0; - - recalc_tabs = true; } } else if( action == "NEXT_TAB" ) { tab_output = 1; @@ -1080,6 +1186,8 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, } } else if( action == "QUIT" && ( !on_quit || on_quit() ) ) { tab_output = -999; + } else if( action == "FILTER" ) { + set_filter(); } // RESOLVE INPUTS if( last_selection != selection ) { diff --git a/tests/active_item_cache_test.cpp b/tests/active_item_cache_test.cpp index 7b518b842b571..dcea4669b4912 100644 --- a/tests/active_item_cache_test.cpp +++ b/tests/active_item_cache_test.cpp @@ -3,7 +3,6 @@ #include "calendar.h" #include "catch/catch.hpp" -#include "game.h" #include "game_constants.h" #include "item.h" #include "map.h" @@ -13,14 +12,15 @@ TEST_CASE( "place_active_item_at_various_coordinates", "[item]" ) { clear_map(); + map &here = get_map(); for( int z = -OVERMAP_DEPTH; z < OVERMAP_HEIGHT; ++z ) { for( int x = 0; x < MAPSIZE_X; ++x ) { for( int y = 0; y < MAPSIZE_Y; ++y ) { - g->m.i_clear( { x, y, z } ); + here.i_clear( { x, y, z } ); } } } - REQUIRE( g->m.get_submaps_with_active_items().empty() ); + REQUIRE( here.get_submaps_with_active_items().empty() ); // An arbitrary active item. item active( "firecracker_act", 0, item::default_charges_tag() ); active.activate(); @@ -29,20 +29,20 @@ TEST_CASE( "place_active_item_at_various_coordinates", "[item]" ) int z = 0; for( int x = 0; x < MAPSIZE_X; ++x ) { for( int y = 0; y < MAPSIZE_Y; ++y ) { - REQUIRE( g->m.i_at( { x, y, z } ).empty() ); + REQUIRE( here.i_at( { x, y, z } ).empty() ); CAPTURE( x, y, z ); - tripoint abs_loc = g->m.get_abs_sub() + tripoint( x / SEEX, y / SEEY, z ); + tripoint abs_loc = here.get_abs_sub() + tripoint( x / SEEX, y / SEEY, z ); CAPTURE( abs_loc.x, abs_loc.y, abs_loc.z ); - REQUIRE( g->m.get_submaps_with_active_items().empty() ); - REQUIRE( g->m.get_submaps_with_active_items().find( abs_loc ) == - g->m.get_submaps_with_active_items().end() ); - item &item_ref = g->m.add_item( { x, y, z }, active ); + REQUIRE( here.get_submaps_with_active_items().empty() ); + REQUIRE( here.get_submaps_with_active_items().find( abs_loc ) == + here.get_submaps_with_active_items().end() ); + item &item_ref = here.add_item( { x, y, z }, active ); REQUIRE( item_ref.active ); - REQUIRE_FALSE( g->m.get_submaps_with_active_items().empty() ); - REQUIRE( g->m.get_submaps_with_active_items().find( abs_loc ) != - g->m.get_submaps_with_active_items().end() ); - REQUIRE_FALSE( g->m.i_at( { x, y, z } ).empty() ); - g->m.i_clear( { x, y, z } ); + REQUIRE_FALSE( here.get_submaps_with_active_items().empty() ); + REQUIRE( here.get_submaps_with_active_items().find( abs_loc ) != + here.get_submaps_with_active_items().end() ); + REQUIRE_FALSE( here.i_at( { x, y, z } ).empty() ); + here.i_clear( { x, y, z } ); } } } diff --git a/tests/active_item_test.cpp b/tests/active_item_test.cpp new file mode 100644 index 0000000000000..18fa63411c168 --- /dev/null +++ b/tests/active_item_test.cpp @@ -0,0 +1,43 @@ +#include "avatar.h" +#include "catch/catch.hpp" +#include "item.h" +#include "map.h" +#include "map_helpers.h" +#include "player_helpers.h" +#include "point.h" + +TEST_CASE( "active_items_processed_regularly", "[item]" ) +{ + clear_avatar(); + clear_map(); + avatar &player_character = get_avatar(); + map &here = get_map(); + // An arbitrary active item that ticks every turn. + item active_item( "firecracker_act", 0, 5 ); + active_item.activate(); + const int active_item_ticks = active_item.charges; + item storage( "backpack", 0 ); + cata::optional::iterator> wear_success = player_character.wear_item( storage ); + REQUIRE( wear_success ); + + item *inventory_item = player_character.try_add( active_item ); + REQUIRE( inventory_item != nullptr ); + REQUIRE( inventory_item->charges == active_item_ticks ); + + bool wield_success = player_character.wield( active_item ); + REQUIRE( wield_success ); + REQUIRE( player_character.weapon.charges == active_item_ticks ); + + here.add_item( player_character.pos(), active_item ); + REQUIRE( here.i_at( player_character.pos() ).only_item().charges == active_item_ticks ); + // TODO: spawn a vehicle and stash a firecracker in there too. + + // Call item processing entry points. + here.process_items(); + player_character.process_items(); + + const int expected_ticks = active_item_ticks - 1; + CHECK( inventory_item->charges == expected_ticks ); + CHECK( player_character.weapon.charges == expected_ticks ); + CHECK( here.i_at( player_character.pos() ).only_item().charges == expected_ticks ); +} diff --git a/tests/ammo_test.cpp b/tests/ammo_test.cpp new file mode 100644 index 0000000000000..f0848cf3dc13a --- /dev/null +++ b/tests/ammo_test.cpp @@ -0,0 +1,188 @@ +#include "item.h" +#include "itype.h" + +#include "catch/catch.hpp" + +// Functions: +// - item::ammo_types +// +// TODO: +// - ammo_type +// - common_ammo_default +// - ammo_sort_name + +// item::ammo_types returns the ammo types an item may *contain*, which is distinct from the ammo +// types an item may *use*. +// +// Only magazines have ammo_types(). +// +// Tools, tool mods, and (all other item types?) have empty ammo_types() + + +// Return true if the given item has non-empty ammo_types +static bool has_ammo_types( const item &it ) +{ + return !it.ammo_types().empty(); +} + +TEST_CASE( "ammo types", "[ammo][ammo_types]" ) +{ + // Only a few kinds of item have ammo_types: + // - Items with type=MAGAZINE (including batteries as well as gun magazines) + // - Tools/weapons with magazine_integral (pocket_data has a MAGAZINE rather than MAGAZINE_WELL) + + SECTION( "items with MAGAZINE pockets have ammo_types" ) { + // Batteries are magazines + REQUIRE( item( "light_battery_cell" ).is_magazine() ); + REQUIRE( item( "battery_car" ).is_magazine() ); + + // Tool batteries + CHECK( has_ammo_types( item( "light_battery_cell" ) ) ); + CHECK( has_ammo_types( item( "medium_battery_cell" ) ) ); + CHECK( has_ammo_types( item( "heavy_battery_cell" ) ) ); + CHECK( has_ammo_types( item( "light_disposable_cell" ) ) ); + CHECK( has_ammo_types( item( "medium_disposable_cell" ) ) ); + CHECK( has_ammo_types( item( "heavy_disposable_cell" ) ) ); + // Vehicle batteries + CHECK( has_ammo_types( item( "battery_car" ) ) ); + CHECK( has_ammo_types( item( "battery_motorbike" ) ) ); + CHECK( has_ammo_types( item( "large_storage_battery" ) ) ); + + SECTION( "battery magazines include 'battery' ammo type" ) { + CHECK( item( "light_battery_cell" ).ammo_types().count( ammotype( "battery" ) ) == 1 ); + CHECK( item( "battery_car" ).ammo_types().count( ammotype( "battery" ) ) == 1 ); + } + + // Gun magazines + REQUIRE( item( "belt40mm" ).is_magazine() ); + REQUIRE( item( "akmag10" ).is_magazine() ); + + CHECK( has_ammo_types( item( "belt40mm" ) ) ); + CHECK( has_ammo_types( item( "belt308" ) ) ); + CHECK( has_ammo_types( item( "akmag10" ) ) ); + CHECK( has_ammo_types( item( "akdrum75" ) ) ); + CHECK( has_ammo_types( item( "glockmag" ) ) ); + + SECTION( "gun magazines include ammo type for that magazine" ) { + CHECK( item( "glockmag" ).ammo_types().count( ammotype( "9mm" ) ) == 1 ); + CHECK( item( "akmag10" ).ammo_types().count( ammotype( "762" ) ) == 1 ); + } + } + + SECTION( "GUN items with integral MAGAZINE pockets have ammo_types" ) { + REQUIRE( item( "nailgun" ).magazine_integral() ); + REQUIRE( item( "colt_army" ).magazine_integral() ); + + CHECK( has_ammo_types( item( "nailgun" ) ) ); + CHECK( has_ammo_types( item( "colt_army" ) ) ); + CHECK( has_ammo_types( item( "hand_crossbow" ) ) ); + CHECK( has_ammo_types( item( "compositebow" ) ) ); + CHECK( has_ammo_types( item( "sling" ) ) ); + CHECK( has_ammo_types( item( "slingshot" ) ) ); + } + + SECTION( "TOOL items with integral MAGAZINE pockets have ammo_types" ) { + REQUIRE( item( "sewing_kit" ).magazine_integral() ); + + CHECK( has_ammo_types( item( "needle_bone" ) ) ); + CHECK( has_ammo_types( item( "needle_wood" ) ) ); + CHECK( has_ammo_types( item( "sewing_kit" ) ) ); + CHECK( has_ammo_types( item( "tailors_kit" ) ) ); + } + + SECTION( "TOOL items with NO pockets have ammo_types" ) { + // NOTE: Fish trap is a TOOL with "ammo", but no "pocket_data", so an implicit MAGAZINE + // pocket is added by Item_factory::check_and_create_magazine_pockets on JSON load. + // This item would be considered needing data migration to an explicit MAGAZINE pocket. + REQUIRE( item( "fish_trap" ).magazine_integral() ); + + CHECK( has_ammo_types( item( "fish_trap" ) ) ); + } + + // These items have NO ammo_types: + + SECTION( "GUN items with MAGAZINE_WELL pockets do NOT have ammo_types" ) { + REQUIRE_FALSE( item( "m1911" ).magazine_integral() ); + + CHECK_FALSE( has_ammo_types( item( "m1911" ) ) ); + CHECK_FALSE( has_ammo_types( item( "usp_9mm" ) ) ); + CHECK_FALSE( has_ammo_types( item( "tommygun" ) ) ); + CHECK_FALSE( has_ammo_types( item( "ak74" ) ) ); + CHECK_FALSE( has_ammo_types( item( "ak47" ) ) ); + } + + SECTION( "TOOL items with MAGAZINE_WELL pockets do NOT have ammo_types" ) { + REQUIRE( item( "flashlight" ).is_tool() ); + + CHECK_FALSE( has_ammo_types( item( "flashlight" ) ) ); + CHECK_FALSE( has_ammo_types( item( "hotplate" ) ) ); + CHECK_FALSE( has_ammo_types( item( "vac_sealer" ) ) ); + CHECK_FALSE( has_ammo_types( item( "forge" ) ) ); + CHECK_FALSE( has_ammo_types( item( "cordless_drill" ) ) ); + } + + SECTION( "AMMO items themselves do NOT have ammo_types" ) { + REQUIRE( item( "38_special" ).is_ammo() ); + REQUIRE( item( "sinew" ).is_ammo() ); + + // Ammo for guns + CHECK_FALSE( has_ammo_types( item( "38_special" ) ) ); + CHECK_FALSE( has_ammo_types( item( "reloaded_308" ) ) ); + CHECK_FALSE( has_ammo_types( item( "bp_9mm" ) ) ); + CHECK_FALSE( has_ammo_types( item( "44magnum" ) ) ); + // Not for guns but classified as ammo + CHECK_FALSE( has_ammo_types( item( "sinew" ) ) ); + CHECK_FALSE( has_ammo_types( item( "nail" ) ) ); + CHECK_FALSE( has_ammo_types( item( "rock" ) ) ); + CHECK_FALSE( has_ammo_types( item( "solder_wire" ) ) ); + } + + SECTION( "TOOLMOD items do NOT have ammo_types" ) { + item med_mod( "magazine_battery_medium_mod" ); + REQUIRE( med_mod.is_toolmod() ); + + CHECK_FALSE( has_ammo_types( med_mod ) ); + } +} + +// The same items with no ammo_types, also have no ammo_default. +TEST_CASE( "ammo default", "[ammo][ammo_default]" ) +{ + // TOOLMOD type, and TOOL/GUN type items with MAGAZINE_WELL pockets have no ammo_default + SECTION( "items without ammo_default" ) { + item flashlight( "flashlight" ); + item med_mod( "magazine_battery_medium_mod" ); + item tommygun( "tommygun" ); + + CHECK( flashlight.ammo_default().is_null() ); + CHECK( med_mod.ammo_default().is_null() ); + CHECK( tommygun.ammo_default().is_null() ); + } + + // MAGAZINE type, and TOOL/GUN items with integral MAGAZINE pockets do have ammo_default + SECTION( "items with ammo_default" ) { + // MAGAZINE type items + item battery( "light_battery_cell" ); + item glockmag( "glockmag" ); + CHECK( battery.ammo_default() == itype_id( "battery" ) ); + CHECK( glockmag.ammo_default() == itype_id( "9mm" ) ); + + // TOOL type items with integral magazines + item sewing_kit( "sewing_kit" ); + item needle( "needle_bone" ); + item fishtrap( "fish_trap" ); + CHECK( sewing_kit.ammo_default() == itype_id( "thread" ) ); + CHECK( needle.ammo_default() == itype_id( "thread" ) ); + CHECK( fishtrap.ammo_default() == itype_id( "fish_bait" ) ); + + // GUN type items with integral magazine + item slingshot( "slingshot" ); + item colt( "colt_army" ); + item lemat( "lemat_revolver" ); + CHECK( slingshot.ammo_default() == itype_id( "pebble" ) ); + // Revolver ammo is "44paper" but default ammunition type is "44army" + CHECK( colt.ammo_default() == itype_id( "44army" ) ); + CHECK( lemat.ammo_default() == itype_id( "44army" ) ); + } +} + diff --git a/tests/archery_damage_test.cpp b/tests/archery_damage_test.cpp index 5be08c27c436d..fd607750040d2 100644 --- a/tests/archery_damage_test.cpp +++ b/tests/archery_damage_test.cpp @@ -17,7 +17,6 @@ #include "catch/catch.hpp" #include "damage.h" -#include "game.h" #include "game_constants.h" #include "int_id.h" #include "item.h" @@ -34,19 +33,20 @@ static void test_projectile_hitting_wall( const std::string &target_type, bool s dealt_projectile_attack &attack, const std::string &weapon_type ) { static const tripoint target_point{ 5, 5, 0 }; + map &here = get_map(); for( int i = 0; i < 10; ++i ) { projectile projectile_copy = attack.proj; - g->m.set( target_point, ter_id( target_type ), furn_id( "f_null" ) ); + here.set( target_point, ter_id( target_type ), furn_id( "f_null" ) ); CAPTURE( projectile_copy.impact.total_damage() ); - g->m.shoot( target_point, projectile_copy, false ); + here.shoot( target_point, projectile_copy, false ); CAPTURE( target_type ); CAPTURE( weapon_type ); CAPTURE( ter_id( target_type ).obj().name() ); - CAPTURE( g->m.ter( target_point ).obj().name() ); + CAPTURE( here.ter( target_point ).obj().name() ); if( smashable ) { - CHECK( g->m.ter( target_point ) != ter_id( target_type ) ); + CHECK( here.ter( target_point ) != ter_id( target_type ) ); } else { - CHECK( g->m.ter( target_point ) == ter_id( target_type ) ); + CHECK( here.ter( target_point ) == ter_id( target_type ) ); } } } diff --git a/tests/battery_mod_test.cpp b/tests/battery_mod_test.cpp new file mode 100644 index 0000000000000..4fe26e66fea28 --- /dev/null +++ b/tests/battery_mod_test.cpp @@ -0,0 +1,315 @@ +#include "item.h" +#include "itype.h" + +#include "catch/catch.hpp" + +// Includes functions: +// item::magazine_compatible +// item::magazine_default +// item::magazine_integral +// item::is_reloadable +// item::is_reloadable_with +// item::toolmods +// +// item::ammo_type +// item::ammo_types +// item::ammo_default +// item::ammo_remaining +// item::ammo_capacity +// +// Attributes: +// item.type->mod->acceptable_ammo +// item.type->mod->magazine_adaptor +// item.type->tool->ammo_id +// +// Related JSON fields: +// "ammo_type" +// "acceptable_ammo" +// "ammo_restriction" +// "magazine_adaptor" +// +TEST_CASE( "battery tool mod test", "[battery][mod]" ) +{ + item med_mod( "magazine_battery_medium_mod" ); + + SECTION( "battery mod properties" ) { + // Is a toolmod, and nothing else + CHECK( med_mod.is_toolmod() ); + CHECK_FALSE( med_mod.is_gun() ); + CHECK_FALSE( med_mod.is_tool() ); + CHECK_FALSE( med_mod.is_magazine() ); + + // Mod can be installed on items using battery ammotype + CHECK( med_mod.type->mod->acceptable_ammo.count( ammotype( "battery" ) ) == 1 ); + // The battery mod does not use ammo_modifier (since it gives explicit battery ids) + CHECK( med_mod.type->mod->ammo_modifier.empty() ); + + // And has some magazine adaptors + CHECK_FALSE( med_mod.type->mod->magazine_adaptor.empty() ); + // Mod itself has no ammo types + CHECK( med_mod.ammo_types().empty() ); + + // No tool mods + CHECK( med_mod.toolmods().empty() ); + + // Mods are not directly compatible with magazines, nor reloadable + CHECK( med_mod.magazine_compatible().empty() ); + CHECK_FALSE( med_mod.is_reloadable() ); + CHECK_FALSE( med_mod.is_reloadable_with( itype_id( "battery" ) ) ); + + // Mod magazine is not integral + CHECK_FALSE( med_mod.magazine_integral() ); + } + + GIVEN( "tool compatible with light batteries" ) { + item flashlight( "flashlight" ); + REQUIRE( flashlight.is_reloadable() ); + REQUIRE( flashlight.is_reloadable_with( itype_id( "light_battery_cell" ) ) ); + + // Flashlight must be free of battery or existing mods + REQUIRE_FALSE( flashlight.magazine_current() ); + REQUIRE( flashlight.toolmods().empty() ); + // Needs a MOD pocket to allow modding + REQUIRE( flashlight.contents.has_pocket_type( item_pocket::pocket_type::MOD ) ); + + WHEN( "medium battery mod is installed" ) { + med_mod.item_tags.insert( "IRREMOVABLE" ); + flashlight.put_in( med_mod, item_pocket::pocket_type::MOD ); + + THEN( "tool modification is successful" ) { + CHECK_FALSE( flashlight.toolmods().empty() ); + CHECK_FALSE( flashlight.magazine_compatible().empty() ); + + CHECK( flashlight.tname() == "flashlight (off)+1" ); + } + + + THEN( "medium batteries can be installed" ) { + CHECK( flashlight.is_reloadable() ); + CHECK( flashlight.is_reloadable_with( itype_id( "medium_battery_cell" ) ) ); + const std::set mag_compats = flashlight.magazine_compatible(); + CHECK( mag_compats.count( itype_id( "medium_battery_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "medium_plus_battery_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "medium_atomic_battery_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "medium_disposable_cell" ) ) == 1 ); + CHECK( flashlight.contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE_WELL ) == 1 ); + } + + THEN( "medium battery is now the default" ) { + // FIXME: Required to fix #40948 + itype_id mag_default = flashlight.magazine_default( false ); + CHECK_FALSE( mag_default.is_null() ); + CHECK( mag_default.str() == "medium_atomic_battery_cell" ); + } + + THEN( "light batteries no longer fit" ) { + CHECK_FALSE( flashlight.is_reloadable_with( itype_id( "light_battery_cell" ) ) ); + CHECK_FALSE( flashlight.magazine_compatible().count( itype_id( "light_battery_cell" ) ) ); + } + + AND_WHEN( "a medium battery is installed" ) { + item med_battery( "medium_battery_cell" ); + + THEN( "battery installation succeeds" ) { + ret_val result = flashlight.put_in( med_battery, item_pocket::pocket_type::MAGAZINE_WELL ); + // FIXME: Required to fix #40948 + CHECK( result.success() ); + } + + THEN( "the flashlight has a battery" ) { + flashlight.put_in( med_battery, item_pocket::pocket_type::MAGAZINE_WELL ); + // FIXME: Required to fix #40948 + CHECK( flashlight.magazine_current() ); + } + + AND_WHEN( "the battery is charged" ) { + const int bat_charges = med_battery.ammo_capacity( ammotype( "battery" ) ); + med_battery.ammo_set( med_battery.ammo_default(), bat_charges ); + REQUIRE( med_battery.ammo_remaining() == bat_charges ); + flashlight.put_in( med_battery, item_pocket::pocket_type::MAGAZINE_WELL ); + + THEN( "the flashlight has charges" ) { + // FIXME: Required to fix #40948 + CHECK( flashlight.ammo_remaining() == bat_charges ); + } + } + } + } + } +} + +// This test exercises several item functions related to battery-powered tools. +// +// Tool battery compartments and battery charge use terms derived from firearms, thus: +// +// - Batteries are "magazines" +// - Have "ammo types" compatible with them +// - Can be reloaded with "ammo" (battery charges) +// - Charge left in the battery is "ammo remaining" +// +// - Tools have a "magazine well" (battery compartment) +// - Can be reloaded with a compatible "magazine" (battery) +// - Charge left in the tool's battery is "ammo remaining" +// +TEST_CASE( "battery and tool properties", "[battery][tool][properties]" ) +{ + const item bat_cell( "light_battery_cell" ); + const item flashlight( "flashlight" ); + + // In JSON, "battery" is both an "ammunition_type" (ammo_types.json) and an "AMMO" (ammo.json) + const ammotype bat_ammotype( "battery" ); + const itype_id bat_ammo( "battery" ); + + SECTION( "battery cell" ) { + SECTION( "is a magazine" ) { + CHECK( bat_cell.is_magazine() ); + } + + SECTION( "is not a tool" ) { + CHECK_FALSE( bat_cell.is_tool() ); + } + + SECTION( "is not ammo" ) { + CHECK_FALSE( bat_cell.is_ammo() ); + // Non-ammo itself does not have an ammo type + CHECK( bat_cell.ammo_type() == ammotype::NULL_ID() ); + } + + SECTION( "has compatible ammo types" ) { + const std::set bat_ammos = bat_cell.ammo_types(); + CHECK_FALSE( bat_ammos.empty() ); + CHECK( bat_ammos.count( bat_ammotype ) ); + } + + SECTION( "has capacity to hold battery ammo type" ) { + CHECK( bat_cell.ammo_capacity( bat_ammotype ) > 0 ); + } + + SECTION( "has battery ammo as default" ) { + CHECK( bat_cell.ammo_default() == bat_ammo ); + } + + SECTION( "is reloadable with battery ammo" ) { + CHECK( bat_cell.is_reloadable() ); + CHECK( bat_cell.is_reloadable_with( bat_ammo ) ); + } + + SECTION( "is not counted by charges" ) { + CHECK_FALSE( bat_cell.count_by_charges() ); + } + } + + SECTION( "flashlight" ) { + SECTION( "is a tool" ) { + CHECK( flashlight.is_tool() ); + } + + SECTION( "is not a magazine" ) { + CHECK_FALSE( flashlight.is_magazine() ); + CHECK_FALSE( flashlight.magazine_integral() ); + } + + SECTION( "is not ammo" ) { + CHECK_FALSE( flashlight.is_ammo() ); + // Non-ammo itself does not have an ammo type + CHECK( flashlight.ammo_type() == ammotype::NULL_ID() ); + } + + SECTION( "is reloadable with a magazine" ) { + CHECK( flashlight.is_reloadable() ); + CHECK( flashlight.is_reloadable_with( itype_id( "light_battery_cell" ) ) ); + CHECK( flashlight.is_reloadable_with( itype_id( "light_disposable_cell" ) ) ); + } + + SECTION( "has compatible magazines" ) { + const std::set mag_compats = flashlight.magazine_compatible(); + CHECK_FALSE( mag_compats.empty() ); + CHECK( mag_compats.count( itype_id( "light_battery_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "light_disposable_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "light_plus_battery_cell" ) ) == 1 ); + CHECK( mag_compats.count( itype_id( "light_atomic_battery_cell" ) ) == 1 ); + } + + SECTION( "has a default magazine" ) { + itype_id mag_default = flashlight.magazine_default( false ); + CHECK_FALSE( mag_default.is_null() ); + // FIXME: Required to fix #40800 + CHECK( mag_default.str() == "light_atomic_battery_cell" ); + } + + SECTION( "can use battery ammo" ) { + // Since flashlights get their "ammo" from a "magazine", their ammo_types is empty + CHECK( flashlight.ammo_types().empty() ); + CHECK( flashlight.ammo_default().is_null() ); + + // The ammo a flashlight can *use* is given by type->tool->ammo_id + CHECK_FALSE( flashlight.type->tool->ammo_id.empty() ); + CHECK( flashlight.type->tool->ammo_id.count( ammotype( "battery" ) ) == 1 ); + } + + SECTION( "requires some ammo (charge) to use" ) { + CHECK( flashlight.ammo_required() > 0 ); + } + + SECTION( "is not counted by charges" ) { + CHECK_FALSE( flashlight.count_by_charges() ); + } + } +} + +TEST_CASE( "installing battery in tool", "[battery][tool][install]" ) +{ + item bat_cell( "light_battery_cell" ); + item flashlight( "flashlight" ); + + const int bat_charges = bat_cell.ammo_capacity( ammotype( "battery" ) ); + REQUIRE( bat_charges > 0 ); + + SECTION( "flashlight with no battery installed" ) { + REQUIRE( !flashlight.magazine_current() ); + + CHECK( flashlight.ammo_remaining() == 0 ); + CHECK( flashlight.ammo_capacity( ammotype( "battery" ) ) == 0 ); + CHECK( flashlight.remaining_ammo_capacity() == 0 ); + } + + SECTION( "dead battery installed in flashlight" ) { + // Ensure battery is dead + bat_cell.ammo_set( bat_cell.ammo_default(), 0 ); + REQUIRE( bat_cell.ammo_remaining() == 0 ); + + // Put battery in flashlight + REQUIRE( flashlight.contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE_WELL ) ); + ret_val result = flashlight.put_in( bat_cell, item_pocket::pocket_type::MAGAZINE_WELL ); + CHECK( result.success() ); + CHECK( flashlight.magazine_current() ); + + // No remaining ammo + CHECK( flashlight.ammo_remaining() == 0 ); + } + + SECTION( "charged battery installed in flashlight" ) { + // Charge the battery + bat_cell.ammo_set( bat_cell.ammo_default(), bat_charges ); + REQUIRE( bat_cell.ammo_remaining() == bat_charges ); + + // Put battery in flashlight + REQUIRE( flashlight.contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE_WELL ) ); + ret_val result = flashlight.put_in( bat_cell, item_pocket::pocket_type::MAGAZINE_WELL ); + CHECK( result.success() ); + CHECK( flashlight.magazine_current() ); + + // Flashlight has a full charge + CHECK( flashlight.ammo_remaining() == bat_charges ); + } + + SECTION( "wrong size battery for flashlight" ) { + item med_bat_cell( "medium_battery_cell" ); + + // Should fail to install the magazine + REQUIRE( flashlight.contents.has_pocket_type( item_pocket::pocket_type::MAGAZINE_WELL ) ); + ret_val result = flashlight.put_in( med_bat_cell, item_pocket::pocket_type::MAGAZINE_WELL ); + CHECK_FALSE( result.success() ); + CHECK_FALSE( flashlight.magazine_current() ); + } +} diff --git a/tests/behavior_test.cpp b/tests/behavior_test.cpp index 129d7cfdb9bb3..6f5a061af114f 100644 --- a/tests/behavior_test.cpp +++ b/tests/behavior_test.cpp @@ -6,7 +6,6 @@ #include "behavior_strategy.h" #include "catch/catch.hpp" #include "character_oracle.h" -#include "game.h" #include "item.h" #include "item_location.h" #include "map.h" @@ -149,7 +148,7 @@ TEST_CASE( "check_npc_behavior_tree", "[npc][behavior]" ) behavior::character_oracle_t oracle( &test_npc ); CHECK( npc_needs.tick( &oracle ) == "idle" ); SECTION( "Freezing" ) { - g->weather.temperature = 0; + get_weather().temperature = 0; test_npc.update_bodytemp(); CHECK( npc_needs.tick( &oracle ) == "idle" ); test_npc.worn.push_back( item( "backpack" ) ); @@ -187,6 +186,7 @@ TEST_CASE( "check_monster_behavior_tree", "[monster][behavior]" ) { const tripoint monster_location( 5, 5, 0 ); clear_map(); + map &here = get_map(); monster &test_monster = spawn_test_monster( "mon_locust", monster_location ); behavior::monster_oracle_t oracle( &test_monster ); @@ -197,14 +197,14 @@ TEST_CASE( "check_monster_behavior_tree", "[monster][behavior]" ) test_monster.reset_special( special_name ); } CHECK( monster_goals.tick( &oracle ) == "idle" ); - for( const tripoint &near_monster : g->m.points_in_radius( monster_location, 1 ) ) { - g->m.ter_set( near_monster, ter_id( "t_grass" ) ); - g->m.furn_set( near_monster, furn_id( "f_null" ) ); + for( const tripoint &near_monster : here.points_in_radius( monster_location, 1 ) ) { + here.ter_set( near_monster, ter_id( "t_grass" ) ); + here.furn_set( near_monster, furn_id( "f_null" ) ); } SECTION( "Special Attack" ) { test_monster.set_special( "EAT_CROP", 0 ); CHECK( monster_goals.tick( &oracle ) == "idle" ); - g->m.furn_set( monster_location, furn_id( "f_plant_seedling" ) ); + here.furn_set( monster_location, furn_id( "f_plant_seedling" ) ); CHECK( monster_goals.tick( &oracle ) == "EAT_CROP" ); test_monster.set_special( "EAT_CROP", 1 ); CHECK( monster_goals.tick( &oracle ) == "idle" ); diff --git a/tests/cata_generators.cpp b/tests/cata_generators.cpp new file mode 100644 index 0000000000000..ede6a7838c2b6 --- /dev/null +++ b/tests/cata_generators.cpp @@ -0,0 +1,67 @@ +#include "cata_generators.h" + +#include "point.h" +#include "rng.h" + +class RandomPointGenerator final : + public Catch::Generators::IGenerator +{ + public: + RandomPointGenerator( int low, int high ) : + engine( rng_get_engine() ), + dist( low, high ) { + this->next(); + } + + const point &get() const override { + return current_point; + } + + bool next() override { + current_point = point( dist( engine ), dist( engine ) ); + return true; + } + protected: + cata_default_random_engine &engine; + std::uniform_int_distribution<> dist; + point current_point; +}; + +class RandomTripointGenerator final : + public Catch::Generators::IGenerator +{ + public: + RandomTripointGenerator( int low, int high, int zlow, int zhigh ) : + engine( rng_get_engine() ), + xy_dist( low, high ), + z_dist( zlow, zhigh ) { + this->next(); + } + + const tripoint &get() const override { + return current_point; + } + + bool next() override { + current_point = tripoint( xy_dist( engine ), xy_dist( engine ), z_dist( engine ) ); + return true; + } + protected: + cata_default_random_engine &engine; + std::uniform_int_distribution<> xy_dist; + std::uniform_int_distribution<> z_dist; + tripoint current_point; +}; + +Catch::Generators::GeneratorWrapper random_points( int low, int high ) +{ + return Catch::Generators::GeneratorWrapper( + std::make_unique( low, high ) ); +} + +Catch::Generators::GeneratorWrapper random_tripoints( + int low, int high, int zlow, int zhigh ) +{ + return Catch::Generators::GeneratorWrapper( + std::make_unique( low, high, zlow, zhigh ) ); +} diff --git a/tests/cata_generators.h b/tests/cata_generators.h new file mode 100644 index 0000000000000..85dbc1c6a0e9f --- /dev/null +++ b/tests/cata_generators.h @@ -0,0 +1,18 @@ +#pragma once +#ifndef CATA_TESTS_CATA_GENERATORS_H +#define CATA_TESTS_CATA_GENERATORS_H + +// Some Catch2 Generators for generating our data types + +#include "catch/catch.hpp" +#include "game_constants.h" + +struct point; +struct tripoint; + +Catch::Generators::GeneratorWrapper random_points( int low = -1000, int high = 1000 ); + +Catch::Generators::GeneratorWrapper random_tripoints( + int low = -1000, int high = 1000, int zlow = -OVERMAP_DEPTH, int zhigh = OVERMAP_HEIGHT ); + +#endif // CATA_TESTS_CATA_GENERATORS_H diff --git a/tests/catch/catch.hpp b/tests/catch/catch.hpp index e62d863ce0e01..7dba7419f51d6 100644 --- a/tests/catch/catch.hpp +++ b/tests/catch/catch.hpp @@ -1,6 +1,6 @@ /* - * Catch v2.12.0 - * Generated: 2020-04-21 16:27:54.138031 + * Catch v2.13.0 + * Generated: 2020-07-12 20:07:49.015950 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. @@ -15,7 +15,7 @@ #define CATCH_VERSION_MAJOR 2 -#define CATCH_VERSION_MINOR 12 +#define CATCH_VERSION_MINOR 13 #define CATCH_VERSION_PATCH 0 #ifdef __clang__ @@ -164,7 +164,7 @@ namespace Catch { // // Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. # if !defined(__ibmxl__) -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg) */ +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ # endif # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ @@ -776,7 +776,7 @@ constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) n #define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) #define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) #define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) -#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) #define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) #define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) #define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) @@ -945,13 +945,13 @@ namespace Catch { #if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is - // replaced with std::invoke_result here. Also *_t format is preferred over - // typename *::type format. - template - using FunctionReturnType = std::remove_reference_t>>; + // replaced with std::invoke_result here. + template + using FunctionReturnType = std::remove_reference_t>>; #else - template - using FunctionReturnType = typename std::remove_reference::type>::type>::type; + // Keep ::type here because we still support C++11 + template + using FunctionReturnType = typename std::remove_reference::type>::type>::type; #endif } // namespace Catch @@ -1989,20 +1989,27 @@ namespace Catch { #endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER namespace Catch { - struct not_this_one {}; // Tag type for detecting which begin/ end are being selected - - // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace + // Import begin/ end from std here using std::begin; using std::end; - not_this_one begin( ... ); - not_this_one end( ... ); + namespace detail { + template + struct void_type { + using type = void; + }; + + template + struct is_range_impl : std::false_type { + }; + + template + struct is_range_impl()))>::type> : std::true_type { + }; + } // namespace detail template - struct is_range { - static const bool value = - !std::is_same())), not_this_one>::value && - !std::is_same())), not_this_one>::value; + struct is_range : detail::is_range_impl { }; #if defined(_MANAGED) // Managed types are never ranges @@ -2378,6 +2385,10 @@ namespace Catch { auto operator & (RhsT const& rhs) -> BinaryExpr const { return { static_cast(m_lhs & rhs), m_lhs, "&", rhs }; } + template + auto operator ^ (RhsT const& rhs) -> BinaryExpr const { + return { static_cast(m_lhs ^ rhs), m_lhs, "^", rhs }; + } template auto operator && ( RhsT const& ) -> BinaryExpr const { @@ -2458,7 +2469,7 @@ namespace Catch { virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; + virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) virtual void benchmarkPreparing( std::string const& name ) = 0; @@ -3711,8 +3722,6 @@ namespace Matchers { struct UnorderedEqualsMatcher : MatcherBase> { UnorderedEqualsMatcher(std::vector const& target) : m_target(target) {} bool match(std::vector const& vec) const override { - // Note: This is a reimplementation of std::is_permutation, - // because I don't want to include inside the common path if (m_target.size() != vec.size()) { return false; } @@ -3731,7 +3740,7 @@ namespace Matchers { // The following functions create the actual matcher objects. // This allows the types to be inferred - template + template, typename AllocMatch = AllocComp> Vector::ContainsMatcher Contains( std::vector const& comparator ) { return Vector::ContainsMatcher( comparator ); } @@ -3741,17 +3750,17 @@ namespace Matchers { return Vector::ContainsElementMatcher( comparator ); } - template + template, typename AllocMatch = AllocComp> Vector::EqualsMatcher Equals( std::vector const& comparator ) { return Vector::EqualsMatcher( comparator ); } - template + template, typename AllocMatch = AllocComp> Vector::ApproxMatcher Approx( std::vector const& comparator ) { return Vector::ApproxMatcher( comparator ); } - template + template, typename AllocMatch = AllocComp> Vector::UnorderedEqualsMatcher UnorderedEquals(std::vector const& target) { return Vector::UnorderedEqualsMatcher( target ); } @@ -4072,16 +4081,16 @@ namespace Generators { return makeGenerators( value( T( std::forward( val ) ) ), std::forward( moreGenerators )... ); } - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; template // Note: The type after -> is weird, because VS2015 cannot parse // the expression used in the typedef inside, when it is in // return type. Yeah. - auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval().get()) { + auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval().get()) { using UnderlyingType = typename decltype(generatorExpression())::type; - IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo ); + IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); if (!tracker.hasGenerator()) { tracker.setGenerator(pf::make_unique>(generatorExpression())); } @@ -4094,11 +4103,17 @@ namespace Generators { } // namespace Catch #define GENERATE( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) #define GENERATE_COPY( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) #define GENERATE_REF( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) // end catch_generators.hpp // start catch_generators_generic.hpp @@ -4508,6 +4523,7 @@ namespace Catch { virtual int abortAfter() const = 0; virtual bool showInvisibles() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; + virtual double minDuration() const = 0; virtual TestSpec const& testSpec() const = 0; virtual bool hasTestFilters() const = 0; virtual std::vector const& getTestsOrTags() const = 0; @@ -5280,6 +5296,7 @@ namespace Catch { Verbosity verbosity = Verbosity::Normal; WarnAbout::What warnings = WarnAbout::Nothing; ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; + double minDuration = -1; RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; UseColour::YesOrNo useColour = UseColour::Auto; WaitForKeypress::When waitForKeypress = WaitForKeypress::Never; @@ -5330,6 +5347,7 @@ namespace Catch { bool warnAboutMissingAssertions() const override; bool warnAboutNoTests() const override; ShowDurations::OrNot showDurations() const override; + double minDuration() const override; RunTests::InWhatOrder runOrder() const override; unsigned int rngSeed() const override; UseColour::YesOrNo useColour() const override; @@ -5707,6 +5725,9 @@ namespace Catch { // Returns double formatted as %.3f (format expected on output) std::string getFormattedDuration( double duration ); + //! Should the reporter show + bool shouldShowDuration( IConfig const& config, double duration ); + std::string serializeFilters( std::vector const& container ); template @@ -6100,8 +6121,6 @@ namespace Catch { static std::string getDescription(); - ReporterPreferences getPreferences() const override; - void noMatchingTestCases(std::string const& spec) override; void assertionStarting(AssertionInfo const&) override; @@ -6549,20 +6568,18 @@ namespace Catch { return {}; } }; - template - using ResultOf_t = typename std::result_of::type; // invoke and not return void :( template - CompleteType_t> complete_invoke(Fun&& fun, Args&&... args) { - return CompleteInvoker>::invoke(std::forward(fun), std::forward(args)...); + CompleteType_t> complete_invoke(Fun&& fun, Args&&... args) { + return CompleteInvoker>::invoke(std::forward(fun), std::forward(args)...); } const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; } // namespace Detail template - Detail::CompleteType_t> user_code(Fun&& fun) { + Detail::CompleteType_t> user_code(Fun&& fun) { CATCH_TRY{ return Detail::complete_invoke(std::forward(fun)); } CATCH_CATCH_ALL{ @@ -6807,8 +6824,8 @@ namespace Catch { Result result; int iterations; }; - template - using TimingOf = Timing, Detail::CompleteType_t>>; + template + using TimingOf = Timing, Detail::CompleteType_t>>; } // namespace Benchmark } // namespace Catch @@ -6819,7 +6836,7 @@ namespace Catch { namespace Benchmark { namespace Detail { template - TimingOf measure(Fun&& fun, Args&&... args) { + TimingOf measure(Fun&& fun, Args&&... args) { auto start = Clock::now(); auto&& r = Detail::complete_invoke(fun, std::forward(args)...); auto end = Clock::now(); @@ -6838,11 +6855,11 @@ namespace Catch { namespace Benchmark { namespace Detail { template - TimingOf measure_one(Fun&& fun, int iters, std::false_type) { + TimingOf measure_one(Fun&& fun, int iters, std::false_type) { return Detail::measure(fun, iters); } template - TimingOf measure_one(Fun&& fun, int iters, std::true_type) { + TimingOf measure_one(Fun&& fun, int iters, std::true_type) { Detail::ChronometerModel meter; auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters)); @@ -6859,7 +6876,7 @@ namespace Catch { }; template - TimingOf)> run_for_at_least(ClockDuration how_long, int seed, Fun&& fun) { + TimingOf> run_for_at_least(ClockDuration how_long, int seed, Fun&& fun) { auto iters = seed; while (iters < (1 << 30)) { auto&& Timing = measure_one(fun, iters, is_callable()); @@ -7457,23 +7474,37 @@ namespace TestCaseTracking { SourceLineInfo location; NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); + friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { + return lhs.name == rhs.name + && lhs.location == rhs.location; + } }; - struct ITracker; + class ITracker; using ITrackerPtr = std::shared_ptr; - struct ITracker { - virtual ~ITracker(); + class ITracker { + NameAndLocation m_nameAndLocation; + + public: + ITracker(NameAndLocation const& nameAndLoc) : + m_nameAndLocation(nameAndLoc) + {} // static queries - virtual NameAndLocation const& nameAndLocation() const = 0; + NameAndLocation const& nameAndLocation() const { + return m_nameAndLocation; + } + + virtual ~ITracker(); // dynamic queries virtual bool isComplete() const = 0; // Successfully completed or failed virtual bool isSuccessfullyCompleted() const = 0; virtual bool isOpen() const = 0; // Started but not complete virtual bool hasChildren() const = 0; + virtual bool hasStarted() const = 0; virtual ITracker& parent() = 0; @@ -7528,7 +7559,6 @@ namespace TestCaseTracking { }; using Children = std::vector; - NameAndLocation m_nameAndLocation; TrackerContext& m_ctx; ITracker* m_parent; Children m_children; @@ -7537,11 +7567,13 @@ namespace TestCaseTracking { public: TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); - NameAndLocation const& nameAndLocation() const override; bool isComplete() const override; bool isSuccessfullyCompleted() const override; bool isOpen() const override; bool hasChildren() const override; + bool hasStarted() const override { + return m_runState != NotStarted; + } void addChild( ITrackerPtr const& child ) override; @@ -7904,7 +7936,11 @@ namespace Catch { #ifdef CATCH_PLATFORM_MAC - #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #endif #elif defined(CATCH_PLATFORM_IPHONE) @@ -8089,7 +8125,7 @@ namespace Catch { void sectionEnded( SectionEndInfo const& endInfo ) override; void sectionEndedEarly( SectionEndInfo const& endInfo ) override; - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) void benchmarkPreparing( std::string const& name ) override; @@ -9065,7 +9101,7 @@ namespace detail { } inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { std::string srcLC = source; - std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast( std::tolower(c) ); } ); + std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast( std::tolower(c) ); } ); if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") target = true; else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") @@ -9834,6 +9870,9 @@ namespace Catch { | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) ["-d"]["--durations"] ( "show test durations" ) + | Opt( config.minDuration, "seconds" ) + ["-D"]["--min-duration"] + ( "show test durations for tests taking at least the given number of seconds" ) | Opt( loadTestNamesFromFile, "filename" ) ["-f"]["--input-file"] ( "load test names to run from a file" ) @@ -9981,6 +10020,7 @@ namespace Catch { bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); } bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); } ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; } + double Config::minDuration() const { return m_data.minDuration; } RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; } unsigned int Config::rngSeed() const { return m_data.rngSeed; } UseColour::YesOrNo Config::useColour() const { return m_data.useColour; } @@ -10877,8 +10917,8 @@ namespace Generators { GeneratorUntypedBase::~GeneratorUntypedBase() {} - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { - return getResultCapture().acquireGeneratorTracker( lineInfo ); + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); } } // namespace Generators @@ -11765,10 +11805,10 @@ namespace Catch { Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { auto trimmed = [&] (size_t start, size_t end) { - while (names[start] == ',' || isspace(names[start])) { + while (names[start] == ',' || isspace(static_cast(names[start]))) { ++start; } - while (names[end] == ',' || isspace(names[end])) { + while (names[end] == ',' || isspace(static_cast(names[end]))) { --end; } return names.substr(start, end - start + 1); @@ -12298,11 +12338,13 @@ namespace Catch { namespace Catch { class StartupExceptionRegistry { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) public: void add(std::exception_ptr const& exception) noexcept; std::vector const& getExceptions() const noexcept; private: std::vector m_exceptions; +#endif }; } // end namespace Catch @@ -12385,7 +12427,11 @@ namespace Catch { m_tagAliasRegistry.add( alias, tag, lineInfo ); } void registerStartupException() noexcept override { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) m_exceptionRegistry.add(std::current_exception()); +#else + CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); +#endif } IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { return m_enumValuesRegistry; @@ -12489,17 +12535,32 @@ namespace Catch { std::shared_ptr tracker; ITracker& currentTracker = ctx.currentTracker(); - if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + // Under specific circumstances, the generator we want + // to acquire is also the current tracker. If this is + // the case, we have to avoid looking through current + // tracker's children, and instead return the current + // tracker. + // A case where this check is important is e.g. + // for (int i = 0; i < 5; ++i) { + // int n = GENERATE(1, 2); + // } + // + // without it, the code above creates 5 nested generators. + if (currentTracker.nameAndLocation() == nameAndLocation) { + auto thisTracker = currentTracker.parent().findChild(nameAndLocation); + assert(thisTracker); + assert(thisTracker->isGeneratorTracker()); + tracker = std::static_pointer_cast(thisTracker); + } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isGeneratorTracker() ); tracker = std::static_pointer_cast( childTracker ); - } - else { + } else { tracker = std::make_shared( nameAndLocation, ctx, ¤tTracker ); currentTracker.addChild( tracker ); } - if( !ctx.completedCycle() && !tracker->isComplete() ) { + if( !tracker->isComplete() ) { tracker->open(); } @@ -12513,8 +12574,28 @@ namespace Catch { } void close() override { TrackerBase::close(); - // Generator interface only finds out if it has another item on atual move - if (m_runState == CompletedSuccessfully && m_generator->next()) { + // If a generator has a child (it is followed by a section) + // and none of its children have started, then we must wait + // until later to start consuming its values. + // This catches cases where `GENERATE` is placed between two + // `SECTION`s. + // **The check for m_children.empty cannot be removed**. + // doing so would break `GENERATE` _not_ followed by `SECTION`s. + const bool should_wait_for_child = + !m_children.empty() && + std::find_if( m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) == m_children.end(); + + // This check is a bit tricky, because m_generator->next() + // has a side-effect, where it consumes generator's current + // value, but we do not want to invoke the side-effect if + // this generator is still waiting for any child to start. + if ( should_wait_for_child || + ( m_runState == CompletedSuccessfully && + m_generator->next() ) ) { m_children.clear(); m_runState = Executing; } @@ -12650,10 +12731,10 @@ namespace Catch { return true; } - auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { using namespace Generators; - GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( "generator", lineInfo ) ); - assert( tracker.isOpen() ); + GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext, + TestCaseTracking::NameAndLocation( static_cast(generatorName), lineInfo ) ); m_lastAssertionInfo.lineInfo = lineInfo; return tracker; } @@ -12696,17 +12777,17 @@ namespace Catch { #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) void RunContext::benchmarkPreparing(std::string const& name) { - m_reporter->benchmarkPreparing(name); - } + m_reporter->benchmarkPreparing(name); + } void RunContext::benchmarkStarting( BenchmarkInfo const& info ) { m_reporter->benchmarkStarting( info ); } void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) { m_reporter->benchmarkEnded( stats ); } - void RunContext::benchmarkFailed(std::string const & error) { - m_reporter->benchmarkFailed(error); - } + void RunContext::benchmarkFailed(std::string const & error) { + m_reporter->benchmarkFailed(error); + } #endif // CATCH_CONFIG_ENABLE_BENCHMARKING void RunContext::pushScopedMessage(MessageInfo const & message) { @@ -13427,6 +13508,7 @@ namespace Catch { // end catch_singletons.cpp // start catch_startup_exception_registry.cpp +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) namespace Catch { void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { CATCH_TRY { @@ -13442,6 +13524,7 @@ void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexce } } // end namespace Catch +#endif // end catch_startup_exception_registry.cpp // start catch_stream.cpp @@ -13626,7 +13709,7 @@ namespace Catch { namespace { char toLowerCh(char c) { - return static_cast( std::tolower( c ) ); + return static_cast( std::tolower( static_cast(c) ) ); } } @@ -14209,15 +14292,12 @@ namespace TestCaseTracking { m_currentTracker = tracker; } - TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : m_nameAndLocation( nameAndLocation ), + TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ): + ITracker(nameAndLocation), m_ctx( ctx ), m_parent( parent ) {} - NameAndLocation const& TrackerBase::nameAndLocation() const { - return m_nameAndLocation; - } bool TrackerBase::isComplete() const { return m_runState == CompletedSuccessfully || m_runState == Failed; } @@ -14333,7 +14413,8 @@ namespace TestCaseTracking { bool SectionTracker::isComplete() const { bool complete = true; - if ((m_filters.empty() || m_filters[0] == "") + if (m_filters.empty() + || m_filters[0] == "" || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { complete = TrackerBase::isComplete(); } @@ -15116,7 +15197,9 @@ namespace Catch { namespace Catch { bool uncaught_exceptions() { -#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return false; +#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) return std::uncaught_exceptions() > 0; #else return std::uncaught_exception(); @@ -15156,7 +15239,7 @@ namespace Catch { } Version const& libraryVersion() { - static Version version( 2, 12, 0, "", 0 ); + static Version version( 2, 13, 0, "", 0 ); return version; } @@ -15558,6 +15641,17 @@ namespace Catch { return std::string(buffer); } + bool shouldShowDuration( IConfig const& config, double duration ) { + if ( config.showDurations() == ShowDurations::Always ) { + return true; + } + if ( config.showDurations() == ShowDurations::Never ) { + return false; + } + const double min = config.minDuration(); + return min >= 0 && duration >= min; + } + std::string serializeFilters( std::vector const& container ) { ReusableStringStream oss; bool first = true; @@ -15824,10 +15918,6 @@ class AssertionPrinter { return "Reports test results on a single line, suitable for IDEs"; } - ReporterPreferences CompactReporter::getPreferences() const { - return m_reporterPrefs; - } - void CompactReporter::noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << '\'' << std::endl; } @@ -15854,8 +15944,9 @@ class AssertionPrinter { } void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + double dur = _sectionStats.durationInSeconds; + if ( shouldShowDuration( *m_config, dur ) ) { + stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl; } } @@ -16275,8 +16366,9 @@ void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + double dur = _sectionStats.durationInSeconds; + if (shouldShowDuration(*m_config, dur)) { + stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl; } if (m_headerPrinted) { m_headerPrinted = false; @@ -16735,6 +16827,11 @@ namespace Catch { xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) ); + // This is not ideal, but it should be enough to mimic gtest's + // junit output. + // Ideally the JUnit reporter would also handle `skipTest` + // events and write those out appropriately. + xml.writeAttribute( "status", "run" ); writeAssertions( sectionNode ); @@ -17169,6 +17266,10 @@ namespace Catch { .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testGroupStats.totals.testCases.passed ) + .writeAttribute( "failures", testGroupStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk ); m_xml.endElement(); } @@ -17178,6 +17279,10 @@ namespace Catch { .writeAttribute( "successes", testRunStats.totals.assertions.passed ) .writeAttribute( "failures", testRunStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testRunStats.totals.testCases.passed ) + .writeAttribute( "failures", testRunStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk ); m_xml.endElement(); } diff --git a/tests/char_biometrics_test.cpp b/tests/char_biometrics_test.cpp index 536f9271d166a..b2a376704b75a 100644 --- a/tests/char_biometrics_test.cpp +++ b/tests/char_biometrics_test.cpp @@ -415,10 +415,10 @@ TEST_CASE( "activity level reset, increase and decrease", "[biometrics][activity // Activity level is a floating-point number, but only set to discrete values: // // NO_EXERCISE = 1.2f; - // LIGHT_EXERCISE = 1.375f; - // MODERATE_EXERCISE = 1.55f; - // ACTIVE_EXERCISE = 1.725f; - // EXTRA_EXERCISE = 1.9f; + // LIGHT_EXERCISE = 2.0f; + // MODERATE_EXERCISE = 4.5f; + // ACTIVE_EXERCISE = 8.0f; + // EXTRA_EXERCISE = 10.0f; // Functions tested: // activity_level_str (return string constant for each range) @@ -496,6 +496,7 @@ TEST_CASE( "activity level reset, increase and decrease", "[biometrics][activity TEST_CASE( "mutations may affect character metabolic rate", "[biometrics][metabolism]" ) { avatar dummy; + dummy.set_body(); // Metabolic base rate uses PLAYER_HUNGER_RATE from game_balance.json, described as "base hunger // rate per 5 minutes". With no metabolism-affecting mutations, metabolism should be this value. @@ -532,6 +533,7 @@ TEST_CASE( "mutations may affect character metabolic rate", "[biometrics][metabo TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics][bmr]" ) { avatar dummy; + dummy.set_body(); // Basal metabolic rate depends on size (height), bodyweight (BMI), and activity level // scaled by metabolic base rate. Assume default metabolic rate. @@ -552,8 +554,8 @@ TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics SECTION( "normal metabolism" ) { CHECK( 2087 == bmr_at_act_level( dummy, NO_EXERCISE ) ); - CHECK( 2696 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); - CHECK( 3304 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); + CHECK( 7825 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); + CHECK( 17388 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); } SECTION( "very fast metabolism" ) { @@ -561,8 +563,8 @@ TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics REQUIRE( dummy.metabolic_rate_base() == 2.0f ); CHECK( 4174 == bmr_at_act_level( dummy, NO_EXERCISE ) ); - CHECK( 5391 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); - CHECK( 6608 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); + CHECK( 15649 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); + CHECK( 34775 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); } SECTION( "very slow (cold-blooded) metabolism" ) { @@ -570,8 +572,8 @@ TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics REQUIRE( dummy.metabolic_rate_base() == 0.5f ); CHECK( 1044 == bmr_at_act_level( dummy, NO_EXERCISE ) ); - CHECK( 1348 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); - CHECK( 1652 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); + CHECK( 3913 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); + CHECK( 8694 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); } } @@ -580,8 +582,8 @@ TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics REQUIRE( dummy.get_size() == creature_size::small ); CHECK( 1262 == bmr_at_act_level( dummy, NO_EXERCISE ) ); - CHECK( 1630 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); - CHECK( 1998 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); + CHECK( 4731 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); + CHECK( 10513 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); } SECTION( "large body size" ) { @@ -589,8 +591,8 @@ TEST_CASE( "basal metabolic rate with various size and metabolism", "[biometrics REQUIRE( dummy.get_size() == creature_size::large ); CHECK( 3062 == bmr_at_act_level( dummy, NO_EXERCISE ) ); - CHECK( 3955 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); - CHECK( 4848 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); + CHECK( 11481 == bmr_at_act_level( dummy, MODERATE_EXERCISE ) ); + CHECK( 25513 == bmr_at_act_level( dummy, EXTRA_EXERCISE ) ); } } diff --git a/tests/char_edible_rating_test.cpp b/tests/char_edible_rating_test.cpp index 241b349c0e2cc..d5eb07d8a013d 100644 --- a/tests/char_edible_rating_test.cpp +++ b/tests/char_edible_rating_test.cpp @@ -71,6 +71,7 @@ TEST_CASE( "cannot eat dirty food", "[can_eat][edible_rating][dirty]" ) TEST_CASE( "who can eat while underwater", "[can_eat][edible_rating][underwater]" ) { avatar dummy; + dummy.set_body(); item sushi( "sushi_fishroll" ); item water( "water_clean" ); @@ -194,7 +195,7 @@ TEST_CASE( "when frozen food can be eaten", "[can_eat][edible_rating][frozen]" ) TEST_CASE( "who can eat inedible animal food", "[can_eat][edible_rating][inedible][animal]" ) { avatar dummy; - + dummy.set_body(); // Note: There are similar conditions for INEDIBLE food with FELINE or LUPINE flags, but // "birdfood" and "cattlefodder" are the only INEDIBLE items that exist in the game. @@ -246,6 +247,7 @@ TEST_CASE( "who can eat inedible animal food", "[can_eat][edible_rating][inedibl TEST_CASE( "what herbivores can eat", "[can_eat][edible_rating][herbivore]" ) { avatar dummy; + dummy.set_body(); GIVEN( "character is an herbivore" ) { dummy.toggle_trait( trait_id( "HERBIVORE" ) ); @@ -272,6 +274,7 @@ TEST_CASE( "what herbivores can eat", "[can_eat][edible_rating][herbivore]" ) TEST_CASE( "what carnivores can eat", "[can_eat][edible_rating][carnivore]" ) { avatar dummy; + dummy.set_body(); GIVEN( "character is a carnivore" ) { dummy.toggle_trait( trait_id( "CARNIVORE" ) ); @@ -320,6 +323,7 @@ TEST_CASE( "what carnivores can eat", "[can_eat][edible_rating][carnivore]" ) TEST_CASE( "what you can eat with a mycus dependency", "[can_eat][edible_rating][mycus]" ) { avatar dummy; + dummy.set_body(); GIVEN( "character is mycus-dependent" ) { dummy.toggle_trait( trait_id( "M_DEPENDENT" ) ); @@ -344,6 +348,7 @@ TEST_CASE( "what you can eat with a mycus dependency", "[can_eat][edible_rating] TEST_CASE( "what you can drink with a proboscis", "[can_eat][edible_rating][proboscis]" ) { avatar dummy; + dummy.set_body(); GIVEN( "character has a proboscis" ) { dummy.toggle_trait( trait_id( "PROBOSCIS" ) ); @@ -413,6 +418,7 @@ TEST_CASE( "can eat with nausea", "[will_eat][edible_rating][nausea]" ) TEST_CASE( "can eat with allergies", "[will_eat][edible_rating][allergy]" ) { avatar dummy; + dummy.set_body(); item fruit( "apple" ); REQUIRE( fruit.has_flag( "ALLERGEN_FRUIT" ) ); @@ -430,6 +436,7 @@ TEST_CASE( "can eat with allergies", "[will_eat][edible_rating][allergy]" ) TEST_CASE( "who will eat rotten food", "[will_eat][edible_rating][rotten]" ) { avatar dummy; + dummy.set_body(); GIVEN( "food just barely rotten" ) { item toastem_rotten = item( "toastem" ); @@ -480,6 +487,7 @@ TEST_CASE( "who will eat rotten food", "[will_eat][edible_rating][rotten]" ) TEST_CASE( "who will eat cooked human flesh", "[will_eat][edible_rating][cannibal]" ) { avatar dummy; + dummy.set_body(); GIVEN( "some cooked human flesh" ) { item flesh( "human_cooked" ); diff --git a/tests/char_stamina_test.cpp b/tests/char_stamina_test.cpp index 031d154c1629d..1e3c588b2d647 100644 --- a/tests/char_stamina_test.cpp +++ b/tests/char_stamina_test.cpp @@ -428,6 +428,7 @@ TEST_CASE( "stamina regen with mouth encumbrance", "[stamina][update][regen][enc player &dummy = g->u; clear_character( dummy ); catch_breath( dummy ); + dummy.set_body(); int turn_moves = to_moves( 1_turns ); @@ -436,7 +437,7 @@ TEST_CASE( "stamina regen with mouth encumbrance", "[stamina][update][regen][enc GIVEN( "character has mouth encumbrance" ) { dummy.wear_item( item( "scarf_fur" ) ); - REQUIRE( dummy.encumb( bp_mouth ) == 10 ); + REQUIRE( dummy.encumb( bodypart_id( "mouth" ) ) == 10 ); THEN( "stamina regen is reduced" ) { CHECK( actual_regen_rate( dummy, turn_moves ) == ( normal_regen_rate - 2 ) * turn_moves ); @@ -444,7 +445,7 @@ TEST_CASE( "stamina regen with mouth encumbrance", "[stamina][update][regen][enc WHEN( "they have even more mouth encumbrance" ) { // Layering two scarves triples the encumbrance dummy.wear_item( item( "scarf_fur" ) ); - REQUIRE( dummy.encumb( bp_mouth ) == 30 ); + REQUIRE( dummy.encumb( bodypart_id( "mouth" ) ) == 30 ); THEN( "stamina regen is reduced further" ) { CHECK( actual_regen_rate( dummy, turn_moves ) == ( normal_regen_rate - 6 ) * turn_moves ); diff --git a/tests/colony_test.cpp b/tests/colony_test.cpp index e982134564347..4ac23050709d9 100644 --- a/tests/colony_test.cpp +++ b/tests/colony_test.cpp @@ -772,7 +772,7 @@ TEST_CASE( "colony sort", "[colony]" ) // Less-than sort test CHECK( sorted ); - test_colony.sort( std::greater() ); + test_colony.sort( std::greater<>() ); prev = 65536; diff --git a/tests/comestible_test.cpp b/tests/comestible_test.cpp index c092c10744cee..06467d4e61fbf 100644 --- a/tests/comestible_test.cpp +++ b/tests/comestible_test.cpp @@ -152,9 +152,11 @@ TEST_CASE( "recipe_permutations", "[recipe]" ) CHECK( mystats.calories.avg() <= upper_bound ); if( mystats.calories.min() < 0 || lower_bound > mystats.calories.avg() || mystats.calories.avg() > upper_bound ) { - printf( "\n\nRecipeID: %s, Lower Bound: %f, Average: %f, Upper Bound: %f\n\n", - recipe_pair.first.c_str(), lower_bound, mystats.calories.avg(), - upper_bound ); + printf( "\n\nRecipeID: %s, default is %d Calories,\nCurrent recipe range: %d-%d, Average %.0f" + "\nAverage recipe Calories must fall within this range, derived from default Calories: %.0f-%.0f\n\n", + recipe_pair.first.c_str(), default_calories, + mystats.calories.min(), mystats.calories.max(), mystats.calories.avg(), + lower_bound, upper_bound ); } } } diff --git a/tests/coordinate_test.cpp b/tests/coordinate_test.cpp new file mode 100644 index 0000000000000..f410010cfb00f --- /dev/null +++ b/tests/coordinate_test.cpp @@ -0,0 +1,349 @@ +#include "catch/catch.hpp" + +#include "coordinates.h" +#include "coordinate_conversions.h" +#include "cata_generators.h" +#include "stringmaker.h" + +constexpr int num_trials = 5; + +static_assert( point::dimension == 2, "" ); +static_assert( tripoint::dimension == 3, "" ); +static_assert( point_abs_omt::dimension == 2, "" ); +static_assert( tripoint_abs_omt::dimension == 3, "" ); + +TEST_CASE( "coordinate_strings", "[point][coords]" ) +{ + CHECK( point_abs_omt( point( 3, 4 ) ).to_string() == "(3,4)" ); + + SECTION( "coord_point_matches_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + point_abs_ms cp( p ); + CHECK( p.to_string() == cp.to_string() ); + } +} + +TEST_CASE( "coordinate_operations", "[point][coords]" ) +{ + SECTION( "construct_from_raw_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + point_abs_ms cp( p ); + CHECK( cp.x() == p.x ); + CHECK( cp.y() == p.y ); + } + + SECTION( "construct_from_raw_tripoint" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + tripoint_abs_ms cp( p ); + CHECK( cp.x() == p.x ); + CHECK( cp.y() == p.y ); + CHECK( cp.z() == p.z ); + } + + SECTION( "construct_from_values" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + { + point_abs_ms cp( p.x, p.y ); + CHECK( cp.x() == p.x ); + CHECK( cp.y() == p.y ); + } + { + tripoint_abs_ms cp( p.x, p.y, p.z ); + CHECK( cp.x() == p.x ); + CHECK( cp.y() == p.y ); + CHECK( cp.z() == p.z ); + } + } + + SECTION( "addition" ) { + tripoint t0 = GENERATE( take( num_trials, random_tripoints() ) ); + point p0 = t0.xy(); + point p1 = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p0, p1 ); + tripoint_abs_ms abst0( t0 ); + point_abs_ms abs0( p0 ); + point_rel_ms rel0( p0 ); + point_rel_ms rel1( p1 ); + SECTION( "rel + rel -> rel" ) { + point_rel_ms sum = rel0 + rel1; + CHECK( sum.raw() == p0 + p1 ); + } + SECTION( "abs + rel -> abs" ) { + point_abs_ms sum = abs0 + rel1; + CHECK( sum.raw() == p0 + p1 ); + tripoint_abs_ms sum_t = abst0 + rel1; + CHECK( sum_t.raw() == t0 + p1 ); + } + SECTION( "abs + raw -> abs" ) { + point_abs_ms sum = abs0 + p1; + CHECK( sum.raw() == p0 + p1 ); + } + SECTION( "rel + abs -> abs" ) { + point_abs_ms sum = rel1 + abs0; + CHECK( sum.raw() == p0 + p1 ); + } + SECTION( "rel += rel" ) { + rel0 += rel1; + CHECK( rel0.raw() == p0 + p1 ); + } + SECTION( "abs += rel" ) { + abs0 += rel1; + CHECK( abs0.raw() == p0 + p1 ); + } + SECTION( "abs += raw" ) { + abs0 += p1; + CHECK( abs0.raw() == p0 + p1 ); + } + } + + SECTION( "subtraction" ) { + tripoint t0 = GENERATE( take( num_trials, random_tripoints() ) ); + point p0 = t0.xy(); + point p1 = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p0, p1 ); + tripoint_abs_ms abst0( t0 ); + point_abs_ms abs0( p0 ); + point_abs_ms abs1( p1 ); + point_rel_ms rel0( p0 ); + point_rel_ms rel1( p1 ); + SECTION( "rel - rel -> rel" ) { + point_rel_ms diff = rel0 - rel1; + CHECK( diff.raw() == p0 - p1 ); + } + SECTION( "abs - rel -> abs" ) { + point_abs_ms diff = abs0 - rel1; + CHECK( diff.raw() == p0 - p1 ); + } + SECTION( "abs - raw -> abs" ) { + point_abs_ms diff = abs0 - p1; + CHECK( diff.raw() == p0 - p1 ); + } + SECTION( "abs - abs -> rel" ) { + point_rel_ms diff0 = abs0 - abs1; + CHECK( diff0.raw() == p0 - p1 ); + tripoint_rel_ms diff1 = abst0 - abs1; + CHECK( diff1.raw() == t0 - p1 ); + } + SECTION( "rel -= rel" ) { + rel0 -= rel1; + CHECK( rel0.raw() == p0 - p1 ); + } + SECTION( "abs -= rel" ) { + abs0 -= rel1; + CHECK( abs0.raw() == p0 - p1 ); + } + SECTION( "abs -= raw" ) { + abs0 -= p1; + CHECK( abs0.raw() == p0 - p1 ); + } + } +} + +TEST_CASE( "coordinate_comparison", "[point][coords]" ) +{ + SECTION( "compare_points" ) { + point p0 = GENERATE( take( num_trials, random_points() ) ); + point p1 = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p0, p1 ); + point_rel_ms cp0( p0 ); + point_rel_ms cp1( p1 ); + CAPTURE( cp0, cp1 ); + + CHECK( ( p0 < p1 ) == ( cp0 < cp1 ) ); + CHECK( ( p0 == p1 ) == ( cp0 == cp1 ) ); + CHECK( cp0 == cp0 ); + CHECK( !( cp0 != cp0 ) ); + } + + SECTION( "compare_tripoints" ) { + tripoint p0 = GENERATE( take( num_trials, random_tripoints() ) ); + tripoint p1 = GENERATE( take( num_trials, random_tripoints() ) ); + CAPTURE( p0, p1 ); + tripoint_rel_ms cp0( p0 ); + tripoint_rel_ms cp1( p1 ); + CAPTURE( cp0, cp1 ); + + CHECK( ( p0 < p1 ) == ( cp0 < cp1 ) ); + CHECK( ( p0 == p1 ) == ( cp0 == cp1 ) ); + CHECK( cp0 == cp0 ); + CHECK( !( cp0 != cp0 ) ); + } +} + +TEST_CASE( "coordinate_hash", "[point][coords]" ) +{ + SECTION( "point_hash" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + point_abs_ms cp( p ); + CHECK( std::hash()( cp ) == std::hash()( p ) ); + } + + SECTION( "tripoint_hash" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + tripoint_abs_ms cp( p ); + CHECK( std::hash()( cp ) == std::hash()( p ) ); + } +} + +TEST_CASE( "coordinate_conversion_consistency", "[point][coords]" ) +{ + // Verifies that the new coord_point-based conversions yield the same + // results as the legacy conversion functions. + SECTION( "omt_to_om_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_om new_conversion = project_to( point_abs_omt( p ) ); + point old_conversion = omt_to_om_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "omt_to_om_tripoint" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + CAPTURE( p ); + tripoint_abs_om new_conversion = project_to( tripoint_abs_omt( p ) ); + tripoint old_conversion = omt_to_om_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "omt_to_om_remain_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_om new_conversion; + point_om_omt remainder; + std::tie( new_conversion, remainder ) = project_remain( point_abs_omt( p ) ); + point old_conversion = omt_to_om_remain( p ); + CHECK( old_conversion == new_conversion.raw() ); + CHECK( p == remainder.raw() ); + } + + SECTION( "sm_to_omt_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_omt new_conversion = project_to( point_abs_sm( p ) ); + point old_conversion = sm_to_omt_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "sm_to_omt_remain_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_omt new_conversion; + point_omt_sm remainder; + std::tie( new_conversion, remainder ) = project_remain( point_abs_sm( p ) ); + point old_conversion = sm_to_omt_remain( p ); + CHECK( old_conversion == new_conversion.raw() ); + CHECK( p == remainder.raw() ); + } + + SECTION( "sm_to_om_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_om new_conversion = project_to( point_abs_sm( p ) ); + point old_conversion = sm_to_om_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "sm_to_om_remain_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_om new_conversion; + point_om_sm remainder; + std::tie( new_conversion, remainder ) = project_remain( point_abs_sm( p ) ); + point old_conversion = sm_to_om_remain( p ); + CHECK( old_conversion == new_conversion.raw() ); + CHECK( p == remainder.raw() ); + } + + SECTION( "omt_to_sm_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_sm new_conversion = project_to( point_abs_omt( p ) ); + point old_conversion = omt_to_sm_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "om_to_sm_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_sm new_conversion = project_to( point_abs_om( p ) ); + point old_conversion = om_to_sm_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "ms_to_sm_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_sm new_conversion = project_to( point_abs_ms( p ) ); + point old_conversion = ms_to_sm_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "sm_to_ms_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_ms new_conversion = project_to( point_abs_sm( p ) ); + point old_conversion = sm_to_ms_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "ms_to_omt_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_omt new_conversion = project_to( point_abs_ms( p ) ); + point old_conversion = ms_to_omt_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } + + SECTION( "ms_to_omt_remain_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_omt new_conversion; + point_omt_ms remainder; + std::tie( new_conversion, remainder ) = project_remain( point_abs_ms( p ) ); + point old_conversion = ms_to_omt_remain( p ); + CHECK( old_conversion == new_conversion.raw() ); + CHECK( p == remainder.raw() ); + } + + SECTION( "omt_to_seg_tripoint" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + CAPTURE( p ); + tripoint_abs_seg new_conversion = project_to( tripoint_abs_omt( p ) ); + tripoint old_conversion = omt_to_seg_copy( p ); + CHECK( old_conversion == new_conversion.raw() ); + } +} + +TEST_CASE( "combine_is_opposite_of_remain", "[point][coords]" ) +{ + SECTION( "point_point" ) { + point p = GENERATE( take( num_trials, random_points() ) ); + CAPTURE( p ); + point_abs_sm orig( p ); + point_abs_om quotient; + point_om_sm remainder; + std::tie( quotient, remainder ) = project_remain( orig ); + point_abs_sm recombined = project_combine( quotient, remainder ); + CHECK( recombined == orig ); + } + SECTION( "tripoint_point" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + CAPTURE( p ); + tripoint_abs_sm orig( p ); + tripoint_abs_om quotient; + point_om_sm remainder; + std::tie( quotient, remainder ) = project_remain( orig ); + tripoint_abs_sm recombined = project_combine( quotient, remainder ); + CHECK( recombined == orig ); + } + SECTION( "point_tripoint" ) { + tripoint p = GENERATE( take( num_trials, random_tripoints() ) ); + CAPTURE( p ); + tripoint_abs_sm orig( p ); + point_abs_om quotient; + tripoint_om_sm remainder; + std::tie( quotient, remainder ) = project_remain( orig ); + tripoint_abs_sm recombined = project_combine( quotient, remainder ); + CHECK( recombined == orig ); + } +} diff --git a/tests/crafting_test.cpp b/tests/crafting_test.cpp index 6ade7cef7c72c..0cd15f9a4bc53 100644 --- a/tests/crafting_test.cpp +++ b/tests/crafting_test.cpp @@ -327,9 +327,10 @@ static void set_time( const time_point &time ) calendar::turn = time; g->reset_light_level(); int z = g->u.posz(); - g->m.update_visibility_cache( z ); - g->m.invalidate_map_cache( z ); - g->m.build_map_cache( z ); + map &here = get_map(); + here.update_visibility_cache( z ); + here.invalidate_map_cache( z ); + here.build_map_cache( z ); } // This tries to actually run the whole craft activity, which is more thorough, @@ -549,7 +550,7 @@ TEST_CASE( "total crafting time with or without interruption", "[crafting][time] { GIVEN( "a recipe and all the required tools and materials to craft it" ) { recipe_id test_recipe( "crude_picklock" ); - int expected_time_taken = test_recipe->batch_time( 1, 1, 0 ); + int expected_time_taken = test_recipe->batch_time( get_player_character(), 1, 1, 0 ); int expected_turns_taken = divide_round_up( expected_time_taken, 100 ); std::vector tools; diff --git a/tests/creature_effect_test.cpp b/tests/creature_effect_test.cpp index 02b2e893f5fc4..ad82e8e5e0d0f 100644 --- a/tests/creature_effect_test.cpp +++ b/tests/creature_effect_test.cpp @@ -33,6 +33,7 @@ TEST_CASE( "character add_effect", "[creature][character][effect][add]" ) { avatar dummy; + dummy.set_body(); const efftype_id effect_bleed( "bleed" ); const efftype_id effect_grabbed( "grabbed" ); const body_part left_arm = bodypart_id( "arm_l" )->token; @@ -416,6 +417,7 @@ TEST_CASE( "monster is_immune_effect", "[creature][monster][effect][immune]" ) TEST_CASE( "character is_immune_effect", "[creature][character][effect][immune]" ) { avatar dummy; + dummy.set_body(); dummy.clear_mutations(); // TODO: Character may be immune to: diff --git a/tests/creature_in_field_test.cpp b/tests/creature_in_field_test.cpp index 5d0106c496c18..4f9dc6fa1c76d 100644 --- a/tests/creature_in_field_test.cpp +++ b/tests/creature_in_field_test.cpp @@ -1,7 +1,6 @@ #include #include "catch/catch.hpp" -#include "game.h" #include "map.h" #include "map_helpers.h" #include "monster.h" @@ -12,22 +11,23 @@ TEST_CASE( "creature_in_field", "[monster],[field]" ) { static const tripoint target_location{ 5, 5, 0 }; clear_map(); + map &here = get_map(); GIVEN( "An acid field" ) { - g->m.add_field( target_location, field_type_id( "fd_acid" ) ); + here.add_field( target_location, field_type_id( "fd_acid" ) ); WHEN( "a monster stands on it" ) { monster &test_monster = spawn_test_monster( "mon_zombie", target_location ); REQUIRE( test_monster.get_hp() == test_monster.get_hp_max() ); THEN( "the monster takes damage" ) { - g->m.creature_in_field( test_monster ); + here.creature_in_field( test_monster ); CHECK( test_monster.get_hp() < test_monster.get_hp_max() ); } } WHEN( "A monster in a vehicle stands in it" ) { - g->m.add_vehicle( vproto_id( "handjack" ), target_location, 0 ); + here.add_vehicle( vproto_id( "handjack" ), target_location, 0 ); monster &test_monster = spawn_test_monster( "mon_zombie", target_location ); REQUIRE( test_monster.get_hp() == test_monster.get_hp_max() ); THEN( "the monster doesn't take damage" ) { - g->m.creature_in_field( test_monster ); + here.creature_in_field( test_monster ); CHECK( test_monster.get_hp() == test_monster.get_hp_max() ); } diff --git a/tests/effective_dps_test.cpp b/tests/effective_dps_test.cpp index 762dc1cd3ede2..daca6debc51fc 100644 --- a/tests/effective_dps_test.cpp +++ b/tests/effective_dps_test.cpp @@ -4,7 +4,6 @@ #include "avatar.h" #include "calendar.h" #include "creature.h" -#include "game.h" #include "item.h" #include "melee.h" #include "player.h" @@ -96,7 +95,7 @@ static void check_accuracy_dps( avatar &attacker, monster &defender, item &wpn1, } TEST_CASE( "effective damage per second", "[effective][dps]" ) { - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); item clumsy_sword( "test_clumsy_sword" ); @@ -159,7 +158,7 @@ TEST_CASE( "effective damage per second", "[effective][dps]" ) TEST_CASE( "effective vs actual damage per second", "[actual][dps][!mayfail]" ) { - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); monster soldier( mtype_id( "mon_zombie_soldier" ) ); @@ -191,7 +190,7 @@ TEST_CASE( "effective vs actual damage per second", "[actual][dps][!mayfail]" ) TEST_CASE( "accuracy increases success", "[accuracy][dps]" ) { - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); monster soldier( mtype_id( "mon_zombie_soldier" ) ); @@ -229,7 +228,9 @@ static void make_experienced_tester( avatar &test_guy ) test_guy.reset_bonuses(); test_guy.set_speed_base( 100 ); test_guy.set_speed_bonus( 0 ); - test_guy.hp_cur.fill( test_guy.get_hp_max() ); + test_guy.set_body(); + test_guy.set_all_parts_hp_to_max(); + test_guy.set_skill_level( skill_id( "bashing" ), 4 ); test_guy.set_skill_level( skill_id( "cutting" ), 4 ); test_guy.set_skill_level( skill_id( "stabbing" ), 4 ); @@ -248,8 +249,8 @@ static void make_experienced_tester( avatar &test_guy ) static void calc_expected_dps( avatar &test_guy, const std::string &weapon_id, double target ) { item weapon( weapon_id ); - CHECK( test_guy.melee_value( weapon ) == Approx( target ).margin( 0.75 ) ); - if( test_guy.melee_value( weapon ) != Approx( target ).margin( 0.75 ) ) { + CHECK( test_guy.melee_value( weapon ) == Approx( target ).margin( 0.5 ) ); + if( test_guy.melee_value( weapon ) != Approx( target ).margin( 0.5 ) ) { std::cout << weapon_id << " out of range, expected: " << target; std::cout << " got " << test_guy.melee_value( weapon ) << std::endl; } @@ -261,21 +262,21 @@ static void calc_expected_dps( avatar &test_guy, const std::string &weapon_id, d */ TEST_CASE( "expected weapon dps", "[expected][dps]" ) { - avatar &test_guy = g->u; + avatar &test_guy = get_avatar(); make_experienced_tester( test_guy ); SECTION( "staves" ) { // typical value around 18 calc_expected_dps( test_guy, "i_staff", 18.0 ); calc_expected_dps( test_guy, "q_staff", 17.0 ); - calc_expected_dps( test_guy, "l-stick_on", 18.0 ); - calc_expected_dps( test_guy, "l-stick", 18.0 ); + calc_expected_dps( test_guy, "l-stick_on", 17.5 ); + calc_expected_dps( test_guy, "l-stick", 17.5 ); calc_expected_dps( test_guy, "shock_staff", 17.0 ); - calc_expected_dps( test_guy, "hockey_stick", 13.0 ); + calc_expected_dps( test_guy, "hockey_stick", 13.75 ); calc_expected_dps( test_guy, "pool_cue", 10.0 ); - calc_expected_dps( test_guy, "broom", 4.0 ); + calc_expected_dps( test_guy, "broom", 3.25 ); } SECTION( "spear" ) { // typical value around 24 - calc_expected_dps( test_guy, "spear_steel", 24.0 ); + calc_expected_dps( test_guy, "spear_steel", 24.5 ); calc_expected_dps( test_guy, "pike", 23.0 ); calc_expected_dps( test_guy, "qiang", 23.0 ); calc_expected_dps( test_guy, "spear_dory", 23 ); @@ -295,9 +296,9 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "halberd", 36.0 ); calc_expected_dps( test_guy, "halberd_fake", 15.0 ); calc_expected_dps( test_guy, "ji", 35.0 ); - calc_expected_dps( test_guy, "glaive", 35.0 ); + calc_expected_dps( test_guy, "glaive", 34.5 ); calc_expected_dps( test_guy, "naginata", 35.0 ); - calc_expected_dps( test_guy, "naginata_inferior", 21.0 ); + calc_expected_dps( test_guy, "naginata_inferior", 21.5 ); calc_expected_dps( test_guy, "naginata_fake", 10.0 ); calc_expected_dps( test_guy, "lucern_hammer", 36.0 ); calc_expected_dps( test_guy, "lucern_hammerfake", 14.0 ); @@ -307,10 +308,10 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) SECTION( "two-handed axe" ) { // typical value around 29 calc_expected_dps( test_guy, "battleaxe", 29.0 ); calc_expected_dps( test_guy, "battleaxe_fake", 11.0 ); - calc_expected_dps( test_guy, "battleaxe_inferior", 20.0 ); + calc_expected_dps( test_guy, "battleaxe_inferior", 19.25 ); calc_expected_dps( test_guy, "fire_ax", 25.0 ); calc_expected_dps( test_guy, "lobotomizer", 24.0 ); - calc_expected_dps( test_guy, "ax", 21.0 ); + calc_expected_dps( test_guy, "ax", 20.25 ); calc_expected_dps( test_guy, "copper_ax", 12.0 ); calc_expected_dps( test_guy, "e_combatsaw_on", 28.0 ); calc_expected_dps( test_guy, "combatsaw_on", 28.0 ); @@ -323,12 +324,12 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "combatsaw_off", 3.0 ); calc_expected_dps( test_guy, "chainsaw_off", 2.0 ); calc_expected_dps( test_guy, "cs_lajatang_off", 2.5 ); - calc_expected_dps( test_guy, "circsaw_off", 2.0 ); + calc_expected_dps( test_guy, "circsaw_off", 1.25 ); } SECTION( "two-handed club/hammer" ) { // expected value ideally around 28 calc_expected_dps( test_guy, "warhammer", 28.0 ); calc_expected_dps( test_guy, "hammer_sledge", 20.0 ); - calc_expected_dps( test_guy, "halligan", 17.0 ); + calc_expected_dps( test_guy, "halligan", 15.25 ); calc_expected_dps( test_guy, "stick_long", 6.0 ); } SECTION( "two-handed flails" ) { // expected value ideally around 28 @@ -337,7 +338,7 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "homewrecker", 13.0 ); } SECTION( "fist weapons" ) { // expected value around 10 but wide variation - calc_expected_dps( test_guy, "bio_claws_weapon", 18.0 ); // basically a knife + calc_expected_dps( test_guy, "bio_claws_weapon", 17.25 ); // basically a knife calc_expected_dps( test_guy, "bagh_nakha", 14.5 ); calc_expected_dps( test_guy, "punch_dagger", 11.0 ); calc_expected_dps( test_guy, "knuckle_katar", 10.5 ); @@ -381,7 +382,7 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "golf_club", 14.0 ); calc_expected_dps( test_guy, "mace_fake", 13.0 ); calc_expected_dps( test_guy, "claw_bar", 11.0 ); - calc_expected_dps( test_guy, "shovel", 11.0 ); + calc_expected_dps( test_guy, "shovel", 10.25 ); calc_expected_dps( test_guy, "e_tool", 11.0 ); calc_expected_dps( test_guy, "sword_nail", 11.0 ); calc_expected_dps( test_guy, "sword_wood", 10.5 ); @@ -399,15 +400,15 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "rock", 6.0 ); } SECTION( "two-handed sword" ) { // expected value around 27, 25 for long swords - calc_expected_dps( test_guy, "nodachi", 27.0 ); + calc_expected_dps( test_guy, "nodachi", 26.5 ); calc_expected_dps( test_guy, "zweihander", 27.0 ); calc_expected_dps( test_guy, "estoc", 27.0 ); - calc_expected_dps( test_guy, "longsword", 25.0 ); + calc_expected_dps( test_guy, "longsword", 24.25 ); calc_expected_dps( test_guy, "katana", 25.0 ); calc_expected_dps( test_guy, "longsword_inferior", 18.5 ); calc_expected_dps( test_guy, "zweihander_inferior", 16.5 ); - calc_expected_dps( test_guy, "katana_inferior", 16.0 ); - calc_expected_dps( test_guy, "nodachi_inferior", 17.0 ); + calc_expected_dps( test_guy, "katana_inferior", 14.0 ); + calc_expected_dps( test_guy, "nodachi_inferior", 16.25 ); calc_expected_dps( test_guy, "estoc_inferior", 16.0 ); calc_expected_dps( test_guy, "estoc_fake", 11.0 ); calc_expected_dps( test_guy, "zweihander_fake", 10.0 ); @@ -426,16 +427,16 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "broadsword_fake", 10.0 ); calc_expected_dps( test_guy, "rapier_fake", 8.0 ); calc_expected_dps( test_guy, "arming_sword_fake", 13.0 ); - calc_expected_dps( test_guy, "jian_fake", 8.0 ); + calc_expected_dps( test_guy, "jian_fake", 8.25 ); calc_expected_dps( test_guy, "glass_macuahuitl", 11.0 ); - calc_expected_dps( test_guy, "blade_scythe", 6.0 ); + calc_expected_dps( test_guy, "blade_scythe", 5.25 ); } SECTION( "shortsword" ) { // expected value 22 calc_expected_dps( test_guy, "scimitar", 22.0 ); calc_expected_dps( test_guy, "butterfly_swords", 22.0 ); calc_expected_dps( test_guy, "cutlass", 22.0 ); - calc_expected_dps( test_guy, "sword_bayonet", 22.0 ); - calc_expected_dps( test_guy, "kukri", 22.0 ); + calc_expected_dps( test_guy, "sword_bayonet", 22.75 ); + calc_expected_dps( test_guy, "kukri", 22.75 ); calc_expected_dps( test_guy, "wakizashi", 22.0 ); calc_expected_dps( test_guy, "sword_xiphos", 22.0 ); calc_expected_dps( test_guy, "khopesh", 21.0 ); @@ -450,7 +451,7 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "wakizashi_inferior", 13.0 ); calc_expected_dps( test_guy, "makeshift_machete", 11.0 ); calc_expected_dps( test_guy, "cavalry_sabre_fake", 8.0 ); - calc_expected_dps( test_guy, "cutlass_fake", 7.0 ); + calc_expected_dps( test_guy, "cutlass_fake", 7.75 ); calc_expected_dps( test_guy, "scimitar_fake", 7.0 ); calc_expected_dps( test_guy, "wakizashi_fake", 7.0 ); calc_expected_dps( test_guy, "blade", 7.0 ); @@ -475,7 +476,7 @@ TEST_CASE( "expected weapon dps", "[expected][dps]" ) calc_expected_dps( test_guy, "copper_knife", 8.0 ); calc_expected_dps( test_guy, "knife_butcher", 7.5 ); calc_expected_dps( test_guy, "throwing_knife", 7.0 ); - calc_expected_dps( test_guy, "tanto_fake", 7.0 ); + calc_expected_dps( test_guy, "tanto_fake", 7.75 ); calc_expected_dps( test_guy, "pockknife", 4.5 ); calc_expected_dps( test_guy, "spike", 4.0 ); calc_expected_dps( test_guy, "kris_fake", 2.5 ); diff --git a/tests/encumbrance_test.cpp b/tests/encumbrance_test.cpp index b0a64e37cae1e..4d84777ad1664 100644 --- a/tests/encumbrance_test.cpp +++ b/tests/encumbrance_test.cpp @@ -5,26 +5,25 @@ #include #include -#include "avatar.h" #include "catch/catch.hpp" -#include "npc.h" -#include "player.h" #include "bodypart.h" #include "character.h" +#include "debug.h" #include "item.h" #include "material.h" +#include "npc.h" #include "type_id.h" -#include "debug.h" static void test_encumbrance_on( - player &p, + Character &p, const std::vector &clothing, const std::string &body_part, int expected_encumbrance, - const std::function &tweak_player = {} + const std::function &tweak_player = {} ) { CAPTURE( body_part ); + p.set_body(); p.clear_mutations(); p.worn.clear(); if( tweak_player ) { @@ -33,8 +32,8 @@ static void test_encumbrance_on( for( const item &i : clothing ) { p.worn.push_back( i ); } - p.reset_encumbrance(); - encumbrance_data enc = p.get_encumbrance()[ get_body_part_token( body_part ) ]; + p.calc_encumbrance(); + encumbrance_data enc = p.get_part_encumbrance_data( bodypart_id( body_part ) ); CHECK( enc.encumbrance == expected_encumbrance ); } @@ -42,7 +41,7 @@ static void test_encumbrance_items( const std::vector &clothing, const std::string &body_part, const int expected_encumbrance, - const std::function &tweak_player = {} + const std::function &tweak_player = {} ) { // Test NPC first because NPC code can accidentally end up using properties @@ -52,7 +51,8 @@ static void test_encumbrance_items( test_encumbrance_on( example_npc, clothing, body_part, expected_encumbrance, tweak_player ); } SECTION( "testing on player" ) { - test_encumbrance_on( get_avatar(), clothing, body_part, expected_encumbrance, tweak_player ); + test_encumbrance_on( get_player_character(), clothing, body_part, expected_encumbrance, + tweak_player ); } } @@ -74,7 +74,7 @@ struct add_trait { add_trait( const std::string &t ) : trait( t ) {} add_trait( const trait_id &t ) : trait( t ) {} - void operator()( player &p ) { + void operator()( Character &p ) { p.toggle_trait( trait ); } @@ -87,47 +87,47 @@ static constexpr int jacket_jean_e = 9; TEST_CASE( "regular_clothing_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "postman_shirt" }, "TORSO", postman_shirt_e ); - test_encumbrance( { "longshirt" }, "TORSO", longshirt_e ); - test_encumbrance( { "jacket_jean" }, "TORSO", jacket_jean_e ); + test_encumbrance( { "postman_shirt" }, "torso", postman_shirt_e ); + test_encumbrance( { "longshirt" }, "torso", longshirt_e ); + test_encumbrance( { "jacket_jean" }, "torso", jacket_jean_e ); } TEST_CASE( "separate_layer_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "longshirt", "jacket_jean" }, "TORSO", longshirt_e + jacket_jean_e ); + test_encumbrance( { "longshirt", "jacket_jean" }, "torso", longshirt_e + jacket_jean_e ); } TEST_CASE( "out_of_order_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "jacket_jean", "longshirt" }, "TORSO", longshirt_e * 2 + jacket_jean_e ); + test_encumbrance( { "jacket_jean", "longshirt" }, "torso", longshirt_e * 2 + jacket_jean_e ); } TEST_CASE( "same_layer_encumbrance", "[encumbrance]" ) { // When stacking within a layer, encumbrance for additional items is // counted twice - test_encumbrance( { "longshirt", "longshirt" }, "TORSO", longshirt_e * 2 + longshirt_e ); + test_encumbrance( { "longshirt", "longshirt" }, "torso", longshirt_e * 2 + longshirt_e ); // ... with a minimum of 2 - test_encumbrance( { "postman_shirt", "postman_shirt" }, "TORSO", postman_shirt_e * 2 + 2 ); + test_encumbrance( { "postman_shirt", "postman_shirt" }, "torso", postman_shirt_e * 2 + 2 ); // ... and a maximum of 10 - test_encumbrance( { "jacket_jean", "jacket_jean" }, "TORSO", jacket_jean_e * 2 + 10 ); + test_encumbrance( { "jacket_jean", "jacket_jean" }, "torso", jacket_jean_e * 2 + 10 ); } TEST_CASE( "tiny_clothing", "[encumbrance]" ) { item i( "longshirt" ); i.set_flag( "UNDERSIZE" ); - test_encumbrance_items( { i }, "TORSO", longshirt_e * 3 ); + test_encumbrance_items( { i }, "torso", longshirt_e * 3 ); } TEST_CASE( "tiny_character", "[encumbrance]" ) { item i( "longshirt" ); SECTION( "regular shirt" ) { - test_encumbrance_items( { i }, "TORSO", longshirt_e * 2, add_trait( "SMALL2" ) ); + test_encumbrance_items( { i }, "torso", longshirt_e * 2, add_trait( "SMALL2" ) ); } SECTION( "undersize shrt" ) { i.set_flag( "UNDERSIZE" ); - test_encumbrance_items( { i }, "TORSO", longshirt_e, add_trait( "SMALL2" ) ); + test_encumbrance_items( { i }, "torso", longshirt_e, add_trait( "SMALL2" ) ); } } diff --git a/tests/explosion_balance_test.cpp b/tests/explosion_balance_test.cpp index a43089e836e59..c1869945fdccc 100644 --- a/tests/explosion_balance_test.cpp +++ b/tests/explosion_balance_test.cpp @@ -48,7 +48,7 @@ static void check_lethality( const std::string &explosive_id, const int range, f // Spawn some monsters in a circle. tripoint origin( 30, 30, 0 ); int num_subjects_this_time = 0; - for( const tripoint &monster_position : closest_tripoints_first( origin, range ) ) { + for( const tripoint &monster_position : closest_points_first( origin, range ) ) { if( rl_dist( monster_position, origin ) != range ) { continue; } @@ -59,7 +59,7 @@ static void check_lethality( const std::string &explosive_id, const int range, f // Set off an explosion item grenade( explosive_id ); grenade.charges = 0; - grenade.type->invoke( g->u, grenade, origin ); + grenade.type->invoke( get_avatar(), grenade, origin ); // see how many monsters survive std::vector survivors = g->get_creatures_if( []( const Creature & critter ) { return critter.is_monster(); @@ -111,10 +111,10 @@ static void check_vehicle_damage( const std::string &explosive_id, const std::st clear_map_and_put_player_underground(); tripoint origin( 30, 30, 0 ); - vehicle *target_vehicle = g->m.add_vehicle( vproto_id( vehicle_id ), origin, 0, -1, 0 ); + vehicle *target_vehicle = get_map().add_vehicle( vproto_id( vehicle_id ), origin, 0, -1, 0 ); std::vector before_hp = get_part_hp( target_vehicle ); - while( g->m.veh_at( origin ) ) { + while( get_map().veh_at( origin ) ) { origin.x++; } origin.x += range; @@ -122,7 +122,7 @@ static void check_vehicle_damage( const std::string &explosive_id, const std::st // Set off an explosion item grenade( explosive_id ); grenade.charges = 0; - grenade.type->invoke( g->u, grenade, origin ); + grenade.type->invoke( get_avatar(), grenade, origin ); std::vector after_hp = get_part_hp( target_vehicle ); diff --git a/tests/flat_set_test.cpp b/tests/flat_set_test.cpp index f5262888daaeb..b2aea60f0ec5f 100644 --- a/tests/flat_set_test.cpp +++ b/tests/flat_set_test.cpp @@ -74,7 +74,7 @@ TEST_CASE( "flat_set_ranged_operations", "[flat_set]" ) TEST_CASE( "reversed_flat_set_insertion", "[flat_set]" ) { - cata::flat_set> s; + cata::flat_set> s; s.insert( 2 ); s.insert( 1 ); s.insert( 4 ); diff --git a/tests/food_fun_for_test.cpp b/tests/food_fun_for_test.cpp index 6bcd7ac95679a..e862d037325b1 100644 --- a/tests/food_fun_for_test.cpp +++ b/tests/food_fun_for_test.cpp @@ -74,6 +74,7 @@ TEST_CASE( "fun for food eaten while sick", "[fun_for][food][sick]" ) TEST_CASE( "fun for rotten food", "[fun_for][food][rotten]" ) { avatar dummy; + dummy.set_body(); std::pair actual_fun; GIVEN( "some rotten food" ) { @@ -240,6 +241,7 @@ TEST_CASE( "fun for melted food", "[fun_for][food][melted]" ) TEST_CASE( "fun for cat food", "[fun_for][food][cat][feline]" ) { avatar dummy; + dummy.set_body(); std::pair actual_fun; GIVEN( "cat food" ) { @@ -270,6 +272,7 @@ TEST_CASE( "fun for cat food", "[fun_for][food][cat][feline]" ) TEST_CASE( "fun for dog food", "[fun_for][food][dog][lupine]" ) { avatar dummy; + dummy.set_body(); std::pair actual_fun; GIVEN( "dog food" ) { @@ -301,6 +304,7 @@ TEST_CASE( "fun for dog food", "[fun_for][food][dog][lupine]" ) TEST_CASE( "fun for gourmand", "[fun_for][food][gourmand]" ) { avatar dummy; + dummy.set_body(); std::pair actual_fun; GIVEN( "food that tastes good" ) { @@ -404,6 +408,7 @@ TEST_CASE( "fun for food eaten too often", "[fun_for][food][monotony]" ) TEST_CASE( "fun for bionic bio taste blocker", "[fun_for][food][bionic]" ) { avatar dummy; + dummy.set_body(); std::pair actual_fun; GIVEN( "food that tastes bad" ) { diff --git a/tests/ground_destroy_test.cpp b/tests/ground_destroy_test.cpp index 85cbda89f8c5b..48ecba6ca4af9 100644 --- a/tests/ground_destroy_test.cpp +++ b/tests/ground_destroy_test.cpp @@ -4,7 +4,6 @@ #include "avatar.h" #include "catch/catch.hpp" -#include "game.h" #include "int_id.h" #include "item.h" #include "itype.h" @@ -19,21 +18,19 @@ // Destroying pavement with a pickaxe should not leave t_flat_roof. // See issue #24707: // https://github.com/CleverRaven/Cataclysm-DDA/issues/24707 -// Behavior may depend on ZLEVELS being set. TEST_CASE( "pavement_destroy", "[.]" ) { const ter_id flat_roof_id = ter_id( "t_flat_roof" ); REQUIRE( flat_roof_id != t_null ); - const bool zlevels_set = get_option( "ZLEVELS" ); - INFO( "ZLEVELS is " << zlevels_set ); clear_map_and_put_player_underground(); + map &here = get_map(); // Populate the map with pavement. - g->m.ter_set( tripoint_zero, ter_id( "t_pavement" ) ); + here.ter_set( tripoint_zero, ter_id( "t_pavement" ) ); // Destroy it - g->m.destroy( tripoint_zero, true ); - ter_id after_destroy = g->m.ter( tripoint_zero ); + here.destroy( tripoint_zero, true ); + ter_id after_destroy = here.ter( tripoint_zero ); if( after_destroy == flat_roof_id ) { FAIL( flat_roof_id.obj().name() << " found after destroying pavement" ); } else { @@ -44,25 +41,22 @@ TEST_CASE( "pavement_destroy", "[.]" ) // Ground-destroying explosions on dirt or grass shouldn't leave t_flat_roof. // See issue #23250: // https://github.com/CleverRaven/Cataclysm-DDA/issues/23250 -// Behavior may depend on ZLEVELS being set. TEST_CASE( "explosion_on_ground", "[.]" ) { ter_id flat_roof_id = ter_id( "t_flat_roof" ); REQUIRE( flat_roof_id != t_null ); - const bool zlevels_set = get_option( "ZLEVELS" ); - INFO( "ZLEVELS is " << zlevels_set ); - clear_map_and_put_player_underground(); std::vector test_terrain_id = { ter_id( "t_dirt" ), ter_id( "t_grass" ) }; + map &here = get_map(); int idx = 0; const int area_dim = 16; // Populate map with various test terrain. for( int x = 0; x < area_dim; x++ ) { for( int y = 0; y < area_dim; y++ ) { - g->m.ter_set( tripoint( x, y, 0 ), test_terrain_id[idx] ); + here.ter_set( tripoint( x, y, 0 ), test_terrain_id[idx] ); idx = ( idx + 1 ) % test_terrain_id.size(); } } @@ -73,13 +67,13 @@ TEST_CASE( "explosion_on_ground", "[.]" ) const tripoint area_center( area_dim / 2, area_dim / 2, 0 ); item rdx_keg( rdx_keg_typeid ); rdx_keg.charges = 0; - rdx_keg.type->invoke( g->u, rdx_keg, area_center ); + rdx_keg.type->invoke( get_avatar(), rdx_keg, area_center ); // Check area to see if any t_flat_roof is present. for( int x = 0; x < area_dim; x++ ) { for( int y = 0; y < area_dim; y++ ) { tripoint pt( x, y, 0 ); - ter_id t_id = g->m.ter( pt ); + ter_id t_id = here.ter( pt ); if( t_id == flat_roof_id ) { FAIL( "After explosion, " << t_id.obj().name() << " found at " << x << "," << y ); } @@ -90,7 +84,6 @@ TEST_CASE( "explosion_on_ground", "[.]" ) // Ground-destroying explosions on t_floor with a t_rock_floor basement // below should create some t_open_air, not just t_flat_roof (which is // the defined roof of a t_rock-floor). -// Behavior depends on ZLEVELS being set. TEST_CASE( "explosion_on_floor_with_rock_floor_basement", "[.]" ) { ter_id flat_roof_id = ter_id( "t_flat_roof" ); @@ -103,16 +96,14 @@ TEST_CASE( "explosion_on_floor_with_rock_floor_basement", "[.]" ) REQUIRE( rock_floor_id != t_null ); REQUIRE( open_air_id != t_null ); - const bool zlevels_set = get_option( "ZLEVELS" ); - INFO( "ZLEVELS is " << zlevels_set ); - clear_map_and_put_player_underground(); + map &here = get_map(); const int area_dim = 24; for( int x = 0; x < area_dim; x++ ) { for( int y = 0; y < area_dim; y++ ) { - g->m.ter_set( tripoint( x, y, 0 ), floor_id ); - g->m.ter_set( tripoint( x, y, -1 ), rock_floor_id ); + here.ter_set( tripoint( x, y, 0 ), floor_id ); + here.ter_set( tripoint( x, y, -1 ), rock_floor_id ); } } // Detonate an RDX keg item in the middle of the populated map space @@ -122,14 +113,14 @@ TEST_CASE( "explosion_on_floor_with_rock_floor_basement", "[.]" ) const tripoint area_center( area_dim / 2, area_dim / 2, 0 ); item rdx_keg( rdx_keg_typeid ); rdx_keg.charges = 0; - rdx_keg.type->invoke( g->u, rdx_keg, area_center ); + rdx_keg.type->invoke( get_avatar(), rdx_keg, area_center ); // Check z0 for open air bool found_open_air = false; for( int x = 0; x < area_dim; x++ ) { for( int y = 0; y < area_dim; y++ ) { tripoint pt( x, y, 0 ); - ter_id t_id = g->m.ter( pt ); + ter_id t_id = here.ter( pt ); INFO( "t " << t_id.obj().name() << " at " << x << "," << y ); if( t_id == open_air_id ) { found_open_air = true; @@ -148,7 +139,6 @@ TEST_CASE( "explosion_on_floor_with_rock_floor_basement", "[.]" ) // Destroying interior floors shouldn't cause the roofs above to collapse. // Destroying supporting walls should cause the roofs above to collapse. -// Behavior may depend on ZLEVELS being set. TEST_CASE( "collapse_checks", "[.]" ) { constexpr int wall_size = 5; @@ -163,14 +153,13 @@ TEST_CASE( "collapse_checks", "[.]" ) REQUIRE( wall_id != t_null ); REQUIRE( open_air_id != t_null ); - const bool zlevels_set = get_option( "ZLEVELS" ); - INFO( "ZLEVELS is " << zlevels_set ); clear_map_and_put_player_underground(); + map &here = get_map(); // build a structure const tripoint &midair = tripoint( tripoint_zero.xy(), tripoint_zero.z + 1 ); - for( const tripoint &pt : g->m.points_in_radius( midair, wall_size, 1 ) ) { - g->m.ter_set( pt, floor_id ); + for( const tripoint &pt : here.points_in_radius( midair, wall_size, 1 ) ) { + here.ter_set( pt, floor_id ); } std::set corners; for( int delta_z = 0; delta_z < 3; delta_z++ ) { @@ -178,31 +167,31 @@ TEST_CASE( "collapse_checks", "[.]" ) for( int delta_y = 0; delta_y <= 1; delta_y++ ) { const tripoint pt( delta_x * wall_size, delta_y * wall_size, delta_z ); corners.insert( pt ); - g->m.ter_set( pt, wall_id ); + here.ter_set( pt, wall_id ); } } } // make sure it's a valid structure - for( const tripoint &pt : g->m.points_in_radius( midair, wall_size, 1 ) ) { + for( const tripoint &pt : here.points_in_radius( midair, wall_size, 1 ) ) { if( corners.find( pt ) != corners.end() ) { - REQUIRE( g->m.ter( pt ) == wall_id ); + REQUIRE( here.ter( pt ) == wall_id ); } else { - REQUIRE( g->m.ter( pt ) == floor_id ); + REQUIRE( here.ter( pt ) == floor_id ); } } // destroy the floor on the first floor; floor above should not collapse - for( const tripoint &pt : g->m.points_in_radius( tripoint_zero, wall_size ) ) { + for( const tripoint &pt : here.points_in_radius( tripoint_zero, wall_size ) ) { if( corners.find( pt ) == corners.end() ) { - g->m.destroy( pt, true ); + here.destroy( pt, true ); } } - for( const tripoint &pt : g->m.points_in_radius( midair, wall_size ) ) { + for( const tripoint &pt : here.points_in_radius( midair, wall_size ) ) { if( corners.find( pt ) != corners.end() ) { - CHECK( g->m.ter( pt ) == wall_id ); + CHECK( here.ter( pt ) == wall_id ); } else { - CHECK( g->m.ter( pt ) == floor_id ); + CHECK( here.ter( pt ) == floor_id ); } } @@ -210,17 +199,17 @@ TEST_CASE( "collapse_checks", "[.]" ) for( int delta_x = 0; delta_x <= 1; delta_x++ ) { for( int delta_y = 0; delta_y <= 1; delta_y++ ) { const tripoint pt( delta_x * wall_size, delta_y * wall_size, 0 ); - g->m.destroy( pt, true ); + here.destroy( pt, true ); } } int open_air_count = 0; int tile_count = 0; int no_wall_count = 0; - for( const tripoint &pt : g->m.points_in_radius( midair, wall_size, 1 ) ) { + for( const tripoint &pt : here.points_in_radius( midair, wall_size, 1 ) ) { if( pt.z == 0 ) { continue; } - const ter_id t_id = g->m.ter( pt ); + const ter_id t_id = here.ter( pt ); tile_count += 1; if( t_id == t_open_air ) { open_air_count += 1; diff --git a/tests/item_contents_test.cpp b/tests/item_contents_test.cpp index 6c74b339cfb14..ce13bfd485f82 100644 --- a/tests/item_contents_test.cpp +++ b/tests/item_contents_test.cpp @@ -17,10 +17,27 @@ TEST_CASE( "item_contents" ) item wrench( "wrench" ); item crowbar( "crowbar" ); - tool_belt.put_in( hammer, item_pocket::pocket_type::CONTAINER ); - tool_belt.put_in( tongs, item_pocket::pocket_type::CONTAINER ); - tool_belt.put_in( wrench, item_pocket::pocket_type::CONTAINER ); - tool_belt.put_in( crowbar, item_pocket::pocket_type::CONTAINER ); + ret_val i1 = tool_belt.put_in( hammer, item_pocket::pocket_type::CONTAINER ); + ret_val i2 = tool_belt.put_in( tongs, item_pocket::pocket_type::CONTAINER ); + ret_val i3 = tool_belt.put_in( wrench, item_pocket::pocket_type::CONTAINER ); + ret_val i4 = tool_belt.put_in( crowbar, item_pocket::pocket_type::CONTAINER ); + + { + CAPTURE( i1.str() ); + CHECK( i1.success() ); + } + { + CAPTURE( i2.str() ); + CHECK( i2.success() ); + } + { + CAPTURE( i3.str() ); + CHECK( i3.success() ); + } + { + CAPTURE( i4.str() ); + CHECK( i4.success() ); + } // check the items actually got added to the tool belt REQUIRE( tool_belt.contents.num_item_stacks() == 4 ); diff --git a/tests/item_location_test.cpp b/tests/item_location_test.cpp index 03a94bbab44c9..ea95b1e1990ce 100644 --- a/tests/item_location_test.cpp +++ b/tests/item_location_test.cpp @@ -2,8 +2,8 @@ #include #include -#include "avatar.h" #include "catch/catch.hpp" +#include "character.h" #include "item.h" #include "map_helpers.h" #include "rng.h" @@ -68,7 +68,7 @@ TEST_CASE( "item_location_doesnt_return_stale_map_item", "[item][item_location]" TEST_CASE( "item_in_container", "[item][item_location]" ) { - avatar &dummy = get_avatar(); + Character &dummy = get_player_character(); clear_avatar(); item &backpack = dummy.i_add( item( "backpack" ) ); item jeans( "jeans" ); @@ -77,7 +77,7 @@ TEST_CASE( "item_in_container", "[item][item_location]" ) backpack.put_in( jeans, item_pocket::pocket_type::CONTAINER ); - item_location backpack_loc( dummy, & **dummy.wear( backpack ) ); + item_location backpack_loc( dummy, & **dummy.wear_item( backpack ) ); REQUIRE( dummy.has_item( *backpack_loc ) ); diff --git a/tests/iteminfo_test.cpp b/tests/iteminfo_test.cpp index c2a7cd106adfa..cd4fe8bc327fa 100644 --- a/tests/iteminfo_test.cpp +++ b/tests/iteminfo_test.cpp @@ -64,7 +64,7 @@ static std::string item_info_str( const item &it, const std::vectoru, true ) ); + //CAPTURE( i.get_sizing( get_avatar(), true ) ); std::vector info_v; const iteminfo_query query_v( part_flags ); @@ -187,7 +187,7 @@ TEST_CASE( "item owner", "[iteminfo][owner]" ) SECTION( "item owned by player" ) { item my_rock( "test_rock" ); - my_rock.set_owner( g->u ); + my_rock.set_owner( get_player_character() ); REQUIRE_FALSE( my_rock.get_owner().is_null() ); CHECK( item_info_str( my_rock, { iteminfo_parts::BASE_OWNER } ) == "Owner: Your Followers\n" ); } @@ -440,9 +440,10 @@ TEST_CASE( "item rigidity", "[iteminfo][rigidity]" ) TEST_CASE( "weapon attack ratings and moves", "[iteminfo][weapon]" ) { clear_avatar(); + Character &player_character = get_player_character(); // new DPS calculations depend on the avatar's stats, so make sure they're consistent - REQUIRE( g->u.get_str() == 8 ); - REQUIRE( g->u.get_dex() == 8 ); + REQUIRE( player_character.get_str() == 8 ); + REQUIRE( player_character.get_dex() == 8 ); item rag( "test_rag" ); item rock( "test_rock" ); @@ -645,7 +646,7 @@ TEST_CASE( "armor coverage, warmth, and encumbrance", "[iteminfo][armor][coverag "--\n" "Coverage: 90% Warmth: 5\n" ); - REQUIRE( longshirt.get_encumber( g->u ) == 3 ); + REQUIRE( longshirt.get_encumber( get_player_character() ) == 3 ); CHECK( item_info_str( longshirt, { iteminfo_parts::ARMOR_ENCUMBRANCE } ) == "--\n" "Encumbrance:" @@ -860,8 +861,9 @@ TEST_CASE( "book info", "[iteminfo][book]" ) } WHEN( "book has been identified" ) { - g->u.do_read( cmdline ); - g->u.do_read( dragon ); + avatar &player_character = get_avatar(); + player_character.do_read( cmdline ); + player_character.do_read( dragon ); THEN( "some basic book info is shown" ) { CHECK( item_info_str( cmdline, summary ) == @@ -1358,9 +1360,10 @@ TEST_CASE( "food freshness and lifetime", "[iteminfo][food]" ) { clear_avatar(); + Character &player_character = get_player_character(); // Ensure test character has no skill estimating spoilage - g->u.empty_skills(); - REQUIRE_FALSE( g->u.can_estimate_rot() ); + player_character.empty_skills(); + REQUIRE_FALSE( player_character.can_estimate_rot() ); item nuts( "test_pine_nuts" ); REQUIRE( nuts.goes_bad() ); @@ -1446,12 +1449,13 @@ TEST_CASE( "basic food info", "[iteminfo][food]" ) TEST_CASE( "food character is allergic to", "[iteminfo][food][allergy]" ) { clear_avatar(); + Character &player_character = get_player_character(); std::vector allergen = { iteminfo_parts::FOOD_ALLERGEN }; GIVEN( "character allergic to fruit" ) { - g->u.toggle_trait( trait_id( "ANTIFRUIT" ) ); - REQUIRE( g->u.has_trait( trait_id( "ANTIFRUIT" ) ) ); + player_character.toggle_trait( trait_id( "ANTIFRUIT" ) ); + REQUIRE( player_character.has_trait( trait_id( "ANTIFRUIT" ) ) ); THEN( "fruit indicates an allergic reaction" ) { item apple( "test_apple" ); @@ -1494,11 +1498,12 @@ TEST_CASE( "food with hidden poison or hallucinogen", "[iteminfo][food][poison][ std::vector poison = { iteminfo_parts::FOOD_POISON }; std::vector hallu = { iteminfo_parts::FOOD_HALLUCINOGENIC }; + Character &player_character = get_player_character(); // Seeing hidden poison or hallucinogen depends on character survival skill // At low level, no info is shown GIVEN( "survival 2" ) { - g->u.set_skill_level( skill_id( "survival" ), 2 ); - REQUIRE( g->u.get_skill_level( skill_id( "survival" ) ) == 2 ); + player_character.set_skill_level( skill_id( "survival" ), 2 ); + REQUIRE( player_character.get_skill_level( skill_id( "survival" ) ) == 2 ); THEN( "cannot see hidden poison or hallucinogen" ) { CHECK( item_info_str( almond, poison ).empty() ); @@ -1508,8 +1513,8 @@ TEST_CASE( "food with hidden poison or hallucinogen", "[iteminfo][food][poison][ // Hidden poison is visible at survival level 3 GIVEN( "survival 3" ) { - g->u.set_skill_level( skill_id( "survival" ), 3 ); - REQUIRE( g->u.get_skill_level( skill_id( "survival" ) ) == 3 ); + player_character.set_skill_level( skill_id( "survival" ), 3 ); + REQUIRE( player_character.get_skill_level( skill_id( "survival" ) ) == 3 ); THEN( "can see hidden poison" ) { CHECK( item_info_str( almond, poison ) == @@ -1525,8 +1530,8 @@ TEST_CASE( "food with hidden poison or hallucinogen", "[iteminfo][food][poison][ // Hidden hallucinogen is not visible until survival level 5 GIVEN( "survival 4" ) { - g->u.set_skill_level( skill_id( "survival" ), 4 ); - REQUIRE( g->u.get_skill_level( skill_id( "survival" ) ) == 4 ); + player_character.set_skill_level( skill_id( "survival" ), 4 ); + REQUIRE( player_character.get_skill_level( skill_id( "survival" ) ) == 4 ); THEN( "still cannot see hidden hallucinogen" ) { CHECK( item_info_str( nutmeg, hallu ).empty() ); @@ -1534,8 +1539,8 @@ TEST_CASE( "food with hidden poison or hallucinogen", "[iteminfo][food][poison][ } GIVEN( "survival 5" ) { - g->u.set_skill_level( skill_id( "survival" ), 5 ); - REQUIRE( g->u.get_skill_level( skill_id( "survival" ) ) == 5 ); + player_character.set_skill_level( skill_id( "survival" ), 5 ); + REQUIRE( player_character.get_skill_level( skill_id( "survival" ) ) == 5 ); THEN( "can see hidden hallucinogen" ) { CHECK( item_info_str( nutmeg, hallu ) == @@ -1556,6 +1561,7 @@ TEST_CASE( "food that is made of human flesh", "[iteminfo][food][cannibal]" ) // TODO: Test food that is_tainted(): "This food is *tainted* and will poison you" clear_avatar(); + Character &player_character = get_player_character(); std::vector cannibal = { iteminfo_parts::FOOD_CANNIBALISM }; @@ -1563,7 +1569,7 @@ TEST_CASE( "food that is made of human flesh", "[iteminfo][food][cannibal]" ) REQUIRE( thumb.has_flag( "CANNIBALISM" ) ); GIVEN( "character is not a cannibal" ) { - REQUIRE_FALSE( g->u.has_trait( trait_id( "CANNIBAL" ) ) ); + REQUIRE_FALSE( player_character.has_trait( trait_id( "CANNIBAL" ) ) ); THEN( "human flesh is indicated as bad" ) { // red highlight CHECK( item_info_str( thumb, cannibal ) == @@ -1573,8 +1579,8 @@ TEST_CASE( "food that is made of human flesh", "[iteminfo][food][cannibal]" ) } GIVEN( "character is a cannibal" ) { - g->u.toggle_trait( trait_id( "CANNIBAL" ) ); - REQUIRE( g->u.has_trait( trait_id( "CANNIBAL" ) ) ); + player_character.toggle_trait( trait_id( "CANNIBAL" ) ); + REQUIRE( player_character.has_trait( trait_id( "CANNIBAL" ) ) ); THEN( "human flesh is indicated as good" ) { // green highlight @@ -1721,6 +1727,23 @@ TEST_CASE( "tool info", "[iteminfo][tool]" ) "Charges: 20\n" ); } + SECTION( "candle with feedback on burnout" ) { + std::vector burnout = { iteminfo_parts::TOOL_BURNOUT }; + + item candle( "candle" ); + REQUIRE( candle.ammo_remaining() > 0 ); + + candle.charges = candle.type->maximum_charges(); + CHECK( item_info_str( candle, burnout ) == + "--\n" + "Fuel: It's new, and ready to burn.\n" ); + + candle.charges = ( candle.type->maximum_charges() / 2 ) - 1; + CHECK( item_info_str( candle, burnout ) == + "--\n" + "Fuel: More than half has burned away.\n" ); + } + SECTION( "UPS charged tool" ) { std::vector recharge_ups = { iteminfo_parts::DESCRIPTION_RECHARGE_UPSMODDED }; @@ -1931,19 +1954,21 @@ TEST_CASE( "item description flags", "[iteminfo][flags]" ) TEST_CASE( "show available recipes with item as an ingredient", "[iteminfo][recipes]" ) { clear_avatar(); + avatar &player_character = get_avatar(); const recipe *purtab = &recipe_id( "pur_tablets" ).obj(); - recipe_subset &known_recipes = const_cast( g->u.get_learned_recipes() ); + recipe_subset &known_recipes = const_cast + ( player_character.get_learned_recipes() ); known_recipes.clear(); // FIXME: Factor out of final_info std::vector crafting = { iteminfo_parts::DESCRIPTION_APPLICABLE_RECIPES }; GIVEN( "character has a potassium iodide tablet and no skill" ) { - g->u.worn.push_back( item( "backpack" ) ); - item &iodine = g->u.i_add( item( "iodine" ) ); - g->u.empty_skills(); - REQUIRE( !g->u.knows_recipe( purtab ) ); + player_character.worn.push_back( item( "backpack" ) ); + item &iodine = player_character.i_add( item( "iodine" ) ); + player_character.empty_skills(); + REQUIRE( !player_character.knows_recipe( purtab ) ); THEN( "nothing is craftable from it" ) { CHECK( item_info_str( iodine, crafting ) == @@ -1951,8 +1976,8 @@ TEST_CASE( "show available recipes with item as an ingredient", "[iteminfo][reci } WHEN( "they acquire the needed skills" ) { - g->u.set_skill_level( purtab->skill_used, purtab->difficulty ); - REQUIRE( g->u.get_skill_level( purtab->skill_used ) == purtab->difficulty ); + player_character.set_skill_level( purtab->skill_used, purtab->difficulty ); + REQUIRE( player_character.get_skill_level( purtab->skill_used ) == purtab->difficulty ); THEN( "still nothing is craftable from it" ) { CHECK( item_info_str( iodine, crafting ) == @@ -1960,8 +1985,8 @@ TEST_CASE( "show available recipes with item as an ingredient", "[iteminfo][reci } WHEN( "they have no book, but have the recipe memorized" ) { - g->u.learn_recipe( purtab ); - REQUIRE( g->u.knows_recipe( purtab ) ); + player_character.learn_recipe( purtab ); + REQUIRE( player_character.knows_recipe( purtab ) ); THEN( "they can use potassium iodide tablets to craft it" ) { CHECK( item_info_str( iodine, crafting ) == @@ -1972,11 +1997,11 @@ TEST_CASE( "show available recipes with item as an ingredient", "[iteminfo][reci } WHEN( "they have the recipe in a book, but not memorized" ) { - item &textbook = g->u.i_add( item( "textbook_chemistry" ) ); - g->u.do_read( textbook ); - REQUIRE( g->u.has_identified( itype_id( "textbook_chemistry" ) ) ); + item &textbook = player_character.i_add( item( "textbook_chemistry" ) ); + player_character.do_read( textbook ); + REQUIRE( player_character.has_identified( itype_id( "textbook_chemistry" ) ) ); // update the crafting inventory cache - g->u.moves++; + player_character.moves++; THEN( "they can use potassium iodide tablets to craft it" ) { CHECK( item_info_str( iodine, crafting ) == @@ -2100,11 +2125,57 @@ TEST_CASE( "pocket info for a multi-pocket item", "[iteminfo][pocket][multiple]" "--\n" "4 Pockets with capacity:\n" "Volume: 1.50 L Weight: 1.00 kg\n" - "Maximum item length: 155 mm\n" + "Maximum item length: 60 cm\n" "Minimum item volume: 0.050 L\n" "Base moves to remove item: 50\n" ); } +TEST_CASE( "ammo restriction info", "[iteminfo][ammo_restriction]" ) +{ + SECTION( "container pocket with ammo restriction" ) { + // For non-MAGAZINE pockets with ammo_restriction, pocket info shows what it can hold + std::vector pockets = { iteminfo_parts::DESCRIPTION_POCKETS }; + + // Quiver is a CONTAINER with ammo_restriction "arrow" or "bolt" + item quiver( "test_quiver" ); + // Not a magazine, but it should have ammo_types + REQUIRE_FALSE( quiver.is_magazine() ); + REQUIRE_FALSE( quiver.ammo_types().empty() ); + + CHECK( item_info_str( quiver, pockets ) == + "--\n" + "Total capacity:\n" + "Holds: 20 rounds of arrows\n" + "Holds: 20 rounds of bolts\n" + "Base moves to remove item: 20\n" ); + } + + SECTION( "magazine pocket with ammo restriction" ) { + // For MAGAZINE pockets, ammo_restriction is shown in magazine info + std::vector mag_cap = { iteminfo_parts::MAGAZINE_CAPACITY }; + + // Matches are TOOL with MAGAZINE pocket, and ammo_restriction "match" + item matches( "test_matches" ); + REQUIRE( matches.is_magazine() ); + REQUIRE_FALSE( matches.ammo_types().empty() ); + // But they have the NO_RELOAD flag, so their capacity should not be displayed + REQUIRE( matches.has_flag( "NO_RELOAD" ) ); + CHECK( item_info_str( matches, mag_cap ).empty() ); + + // Compound bow is a GUN with integral MAGAZINE pocket, ammo_restriction "arrow" + item compbow( "test_compbow" ); + REQUIRE( compbow.is_magazine() ); + REQUIRE_FALSE( compbow.ammo_types().empty() ); + // It can be reloaded, so its magazine capacity should be displayed + REQUIRE_FALSE( compbow.has_flag( "NO_RELOAD" ) ); + CHECK( item_info_str( compbow, mag_cap ) == + "--\n" + "Capacity: 1 round of arrows\n" ); + + } +} + + // Functions: // vol_to_info from item.cpp TEST_CASE( "vol_to_info", "[iteminfo][volume]" ) @@ -2158,14 +2229,15 @@ TEST_CASE( "weight_to_info", "[iteminfo][weight]" ) TEST_CASE( "final info", "[iteminfo][final]" ) { clear_avatar(); + Character &player_character = get_player_character(); SECTION( "material allergy" ) { item socks( "test_socks" ); REQUIRE( socks.made_of( material_id( "wool" ) ) ); WHEN( "avatar has a wool allergy" ) { - g->u.toggle_trait( trait_id( "WOOLALLERGY" ) ); - REQUIRE( g->u.has_trait( trait_id( "WOOLALLERGY" ) ) ); + player_character.toggle_trait( trait_id( "WOOLALLERGY" ) ); + REQUIRE( player_character.has_trait( trait_id( "WOOLALLERGY" ) ) ); CHECK( item_info_str( socks, { iteminfo_parts::DESCRIPTION_ALLERGEN } ) == "--\n" @@ -2259,4 +2331,3 @@ TEST_CASE( "item debug info", "[iteminfo][debug][!mayfail][.]" ) "Freeze point: 32\n" ); } } - diff --git a/tests/itemname_test.cpp b/tests/itemname_test.cpp index f588e7740c049..f5c79dbe8540d 100644 --- a/tests/itemname_test.cpp +++ b/tests/itemname_test.cpp @@ -3,6 +3,7 @@ #include "avatar.h" #include "catch/catch.hpp" +#include "player_helpers.h" #include "flat_set.h" #include "game.h" #include "item.h" @@ -117,3 +118,34 @@ TEST_CASE( "item sizing display", "[item][iteminfo][display_name][sizing]" ) } } +TEST_CASE( "display name includes item contents", "[item][display_name][contents]" ) +{ + clear_avatar(); + + item arrow( "test_arrow_wood", 0, item::default_charges_tag{} ); + // Arrows are ammo with a default count of 10 + REQUIRE( arrow.is_ammo() ); + REQUIRE( arrow.count() == 10 ); + + item quiver( "test_quiver" ); + // Quivers are not magazines, nor do they have magazines + REQUIRE_FALSE( quiver.is_magazine() ); + REQUIRE_FALSE( quiver.magazine_current() ); + // But they do have ammo types and can contain ammo + REQUIRE_FALSE( quiver.ammo_types().empty() ); + REQUIRE( quiver.can_contain( arrow ) ); + + // Check empty quiver display + CHECK( quiver.display_name() == + "||\u00A0" + "test quiver (0)" ); + + // Insert one arrow + quiver.put_in( arrow, item_pocket::pocket_type::CONTAINER ); + // Expect 1 arrow remaining and displayed + CHECK( quiver.ammo_remaining() == 10 ); + CHECK( quiver.display_name() == + "||\u00A0" + "test quiver with test wooden broadhead arrow (10)" ); +} + diff --git a/tests/iuse_actor_test.cpp b/tests/iuse_actor_test.cpp index 91cadb681680c..ca9c7e54ee01f 100644 --- a/tests/iuse_actor_test.cpp +++ b/tests/iuse_actor_test.cpp @@ -16,15 +16,14 @@ static player &get_sanitized_player( ) { - player &dummy = g->u; - + avatar &player_character = get_avatar(); // Remove first worn item until there are none left. std::list temp; - while( dummy.takeoff( dummy.i_at( -2 ), &temp ) ) {} - dummy.inv.clear(); - dummy.remove_weapon(); + while( player_character.takeoff( player_character.i_at( -2 ), &temp ) ) {} + player_character.inv.clear(); + player_character.remove_weapon(); - return dummy; + return player_character; } static monster *find_adjacent_monster( const tripoint &pos ) @@ -45,23 +44,23 @@ static monster *find_adjacent_monster( const tripoint &pos ) TEST_CASE( "manhack", "[iuse_actor][manhack]" ) { - player &dummy = get_sanitized_player(); + player &player_character = get_sanitized_player(); g->clear_zombies(); - item &test_item = dummy.i_add( item( "bot_manhack", 0, item::default_charges_tag{} ) ); + item &test_item = player_character.i_add( item( "bot_manhack", 0, item::default_charges_tag{} ) ); - REQUIRE( dummy.has_item( test_item ) ); + REQUIRE( player_character.has_item( test_item ) ); - monster *new_manhack = find_adjacent_monster( dummy.pos() ); + monster *new_manhack = find_adjacent_monster( player_character.pos() ); REQUIRE( new_manhack == nullptr ); - dummy.invoke_item( &test_item ); + player_character.invoke_item( &test_item ); - REQUIRE( !dummy.has_item_with( []( const item & it ) { + REQUIRE( !player_character.has_item_with( []( const item & it ) { return it.typeId() == itype_id( "bot_manhack" ); } ) ); - new_manhack = find_adjacent_monster( dummy.pos() ); + new_manhack = find_adjacent_monster( player_character.pos() ); REQUIRE( new_manhack != nullptr ); REQUIRE( new_manhack->type->id == mtype_id( "mon_manhack" ) ); g->clear_zombies(); diff --git a/tests/iuse_test.cpp b/tests/iuse_test.cpp index f9f70635edde7..19134bd4f9f7a 100644 --- a/tests/iuse_test.cpp +++ b/tests/iuse_test.cpp @@ -319,6 +319,7 @@ TEST_CASE( "caffeine and atomic caffeine", "[iuse][caff][atomic_caff]" ) TEST_CASE( "towel", "[iuse][towel]" ) { avatar dummy; + dummy.set_body(); item towel( "towel", 0, item::default_charges_tag{} ); GIVEN( "avatar is wet" ) { diff --git a/tests/list_test.cpp b/tests/list_test.cpp index e6f28f4e5683e..1aa6122d580e3 100644 --- a/tests/list_test.cpp +++ b/tests/list_test.cpp @@ -583,7 +583,7 @@ TEST_CASE( "list sort and reverse", "[list]" ) } SECTION( "greater than (predicate)" ) { - test_list.sort( std::greater() ); + test_list.sort( std::greater<>() ); bool passed = true; int previous = 65535; diff --git a/tests/magic_spell_test.cpp b/tests/magic_spell_test.cpp index b7af678a8a473..a00c622408c52 100644 --- a/tests/magic_spell_test.cpp +++ b/tests/magic_spell_test.cpp @@ -465,7 +465,7 @@ TEST_CASE( "spell effect - target_attack", "[magic][spell][effect][target_attack int after_hp = 0; // Avatar/spellcaster - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); dummy.setpos( dummy_loc ); REQUIRE( dummy.pos() == dummy_loc ); @@ -514,7 +514,7 @@ TEST_CASE( "spell effect - summon", "[magic][spell][effect][summon]" ) const tripoint dummy_loc = { 60, 60, 0 }; const tripoint mummy_loc = { 61, 60, 0 }; - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); dummy.setpos( dummy_loc ); REQUIRE( dummy.pos() == dummy_loc ); @@ -553,7 +553,7 @@ TEST_CASE( "spell effect - recover_energy", "[magic][spell][effect][recover_ener // For that, "target_attack" with a negative damage is used. // Yer a wizard, ya dummy - player &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); clear_map(); diff --git a/tests/map_extra_test.cpp b/tests/map_extra_test.cpp index 01f690463e9a8..283d94e9a8d25 100644 --- a/tests/map_extra_test.cpp +++ b/tests/map_extra_test.cpp @@ -11,9 +11,9 @@ TEST_CASE( "mx_minefield real spawn", "[map_extra][overmap]" ) // many overmaps when searching. const tripoint origin = tripoint( 90, 90, 0 ); - // Find all of the bridges within a 180 OMT radius of this location. + // Find all of the bridgeheads within a 180 OMT radius of this location. omt_find_params find_params; - find_params.types = {{"bridge", ot_match_type::type}}; + find_params.types = {{"bridgehead_ground", ot_match_type::type}}; find_params.search_range = 180; const std::vector bridges = overmap_buffer.find_all( origin, find_params ); @@ -46,15 +46,16 @@ TEST_CASE( "mx_minefield theoretical spawn", "[map_extra][overmap]" ) overmap &om = overmap_buffer.get( point_zero ); const oter_id road( "road_ns" ); + const oter_id bridgehead( "bridgehead_ground_north" ); const oter_id bridge( "bridge_north" ); // The mx_minefield map extra expects to have a particular configuration with - // three OMTs--a road, then a bridge, then a bridge once again. + // three OMTs--a bridgehead, then a road, then a road once again. // It does this for four rotations, with the road on the north, south, east, // and west of the target point. const auto setup_terrain_and_generate = [&]( const tripoint & center, om_direction::type bridge_direction ) { - om.ter_set( center, bridge ); + om.ter_set( center, bridgehead ); om.ter_set( center + om_direction::displace( bridge_direction, 1 ), bridge ); om.ter_set( center + om_direction::displace( om_direction::opposite( bridge_direction ), 1 ), road ); diff --git a/tests/map_helpers.cpp b/tests/map_helpers.cpp index 70c5741ab0952..2e5eae6a79cf6 100644 --- a/tests/map_helpers.cpp +++ b/tests/map_helpers.cpp @@ -6,7 +6,7 @@ #include #include -#include "avatar.h" +#include "character.h" #include "field.h" #include "game.h" #include "game_constants.h" @@ -22,25 +22,27 @@ class vehicle; // Remove all vehicles from the map void clear_vehicles() { - for( wrapped_vehicle &veh : g->m.get_vehicles() ) { - g->m.destroy_vehicle( veh.v ); + map &here = get_map(); + for( wrapped_vehicle &veh : here.get_vehicles() ) { + here.destroy_vehicle( veh.v ); } } void wipe_map_terrain() { - const int mapsize = g->m.getmapsize() * SEEX; + map &here = get_map(); + const int mapsize = here.getmapsize() * SEEX; for( int z = 0; z <= OVERMAP_HEIGHT; ++z ) { ter_id terrain = z == 0 ? t_grass : t_open_air; for( int x = 0; x < mapsize; ++x ) { for( int y = 0; y < mapsize; ++y ) { - g->m.set( { x, y, z}, terrain, f_null ); + here.set( { x, y, z}, terrain, f_null ); } } } clear_vehicles(); - g->m.invalidate_map_cache( 0 ); - g->m.build_map_cache( 0, true ); + here.invalidate_map_cache( 0 ); + here.build_map_cache( 0, true ); } void clear_creatures() @@ -61,16 +63,17 @@ void clear_npcs() void clear_fields( const int zlevel ) { - const int mapsize = g->m.getmapsize() * SEEX; + map &here = get_map(); + const int mapsize = here.getmapsize() * SEEX; for( int x = 0; x < mapsize; ++x ) { for( int y = 0; y < mapsize; ++y ) { const tripoint p( x, y, zlevel ); std::vector fields; - for( auto &pr : g->m.field_at( p ) ) { + for( auto &pr : here.field_at( p ) ) { fields.push_back( pr.second.get_field_type() ); } for( field_type_id f : fields ) { - g->m.remove_field( p, f ); + here.remove_field( p, f ); } } } @@ -78,10 +81,11 @@ void clear_fields( const int zlevel ) void clear_items( const int zlevel ) { - const int mapsize = g->m.getmapsize() * SEEX; + map &here = get_map(); + const int mapsize = here.getmapsize() * SEEX; for( int x = 0; x < mapsize; ++x ) { for( int y = 0; y < mapsize; ++y ) { - g->m.i_clear( { x, y, zlevel } ); + here.i_clear( { x, y, zlevel } ); } } } @@ -96,7 +100,7 @@ void clear_map() wipe_map_terrain(); clear_npcs(); clear_creatures(); - g->m.clear_traps(); + get_map().clear_traps(); for( int z = -2; z <= 0; ++z ) { clear_items( z ); } @@ -106,7 +110,7 @@ void clear_map_and_put_player_underground() { clear_map(); // Make sure the player doesn't block the path of the monster being tested. - g->u.setpos( { 0, 0, -2 } ); + get_player_character().setpos( { 0, 0, -2 } ); } monster &spawn_test_monster( const std::string &monster_type, const tripoint &start ) @@ -120,14 +124,15 @@ monster &spawn_test_monster( const std::string &monster_type, const tripoint &st // terrain, and no furniture, traps, or items. void build_test_map( const ter_id &terrain ) { - for( const tripoint &p : g->m.points_in_rectangle( tripoint_zero, + map &here = get_map(); + for( const tripoint &p : here.points_in_rectangle( tripoint_zero, tripoint( MAPSIZE * SEEX, MAPSIZE * SEEY, 0 ) ) ) { - g->m.furn_set( p, furn_id( "f_null" ) ); - g->m.ter_set( p, terrain ); - g->m.trap_set( p, trap_id( "tr_null" ) ); - g->m.i_clear( p ); + here.furn_set( p, furn_id( "f_null" ) ); + here.ter_set( p, terrain ); + here.trap_set( p, trap_id( "tr_null" ) ); + here.i_clear( p ); } - g->m.invalidate_map_cache( 0 ); - g->m.build_map_cache( 0, true ); + here.invalidate_map_cache( 0 ); + here.build_map_cache( 0, true ); } diff --git a/tests/map_iterator_test.cpp b/tests/map_iterator_test.cpp index 61772ac263bbf..f8654c9cadc46 100644 --- a/tests/map_iterator_test.cpp +++ b/tests/map_iterator_test.cpp @@ -2,6 +2,7 @@ #include #include "catch/catch.hpp" +#include "coordinates.h" #include "map_iterator.h" #include "point.h" @@ -14,7 +15,8 @@ std::array range_1_2d_centered = { TEST_CASE( "Radius one 2D square centered at origin." ) { - for( const tripoint &candidate : tripoint_range( tripoint_north_west, tripoint_south_east ) ) { + for( const tripoint &candidate : + tripoint_range( tripoint_north_west, tripoint_south_east ) ) { REQUIRE( std::find( range_1_2d_centered.begin(), range_1_2d_centered.end(), candidate ) != range_1_2d_centered.end() ); } @@ -29,12 +31,21 @@ std::array range_1_2d_offset = { TEST_CASE( "Radius one 2D square centered at -4/-4/0." ) { - for( const tripoint &candidate : tripoint_range( {-5, -5, 0}, {-3, -3, 0} ) ) { + for( const tripoint &candidate : tripoint_range( {-5, -5, 0}, {-3, -3, 0} ) ) { REQUIRE( std::find( range_1_2d_offset.begin(), range_1_2d_offset.end(), candidate ) != range_1_2d_offset.end() ); } } +TEST_CASE( "Radius one 2D square centered at -4/-4/0 in abs_omt coords." ) +{ + for( const tripoint_abs_omt &candidate : + tripoint_range( {-5, -5, 0}, {-3, -3, 0} ) ) { + REQUIRE( std::find( range_1_2d_offset.begin(), range_1_2d_offset.end(), candidate.raw() ) != + range_1_2d_offset.end() ); + } +} + std::array range_3_3d_offset = { { { 5, 5, -2}, { 6, 5, -2}, { 7, 5, -2}, { 8, 5, -2}, { 9, 5, -2}, {10, 5, -2}, {11, 5, -2}, { 5, 6, -2}, { 6, 6, -2}, { 7, 6, -2}, { 8, 6, -2}, { 9, 6, -2}, {10, 6, -2}, {11, 6, -2}, @@ -96,7 +107,7 @@ std::array range_3_3d_offset = { TEST_CASE( "Radius three 3D square centered at 8/8/1." ) { - for( const tripoint &candidate : tripoint_range( {5, 5, -2}, {11, 11, 4} ) ) { + for( const tripoint &candidate : tripoint_range( {5, 5, -2}, {11, 11, 4} ) ) { REQUIRE( std::find( range_3_3d_offset.begin(), range_3_3d_offset.end(), candidate ) != range_3_3d_offset.end() ); } diff --git a/tests/map_test.cpp b/tests/map_test.cpp index a4e04e191d7e6..6bf8ca312b7e9 100644 --- a/tests/map_test.cpp +++ b/tests/map_test.cpp @@ -14,17 +14,19 @@ TEST_CASE( "destroy_grabbed_furniture" ) { clear_map(); + avatar &player_character = get_avatar(); GIVEN( "Furniture grabbed by the player" ) { const tripoint test_origin( 60, 60, 0 ); - g->u.setpos( test_origin ); + map &here = get_map(); + player_character.setpos( test_origin ); const tripoint grab_point = test_origin + tripoint_east; - g->m.furn_set( grab_point, furn_id( "f_chair" ) ); - g->u.grab( object_type::FURNITURE, grab_point ); + here.furn_set( grab_point, furn_id( "f_chair" ) ); + player_character.grab( object_type::FURNITURE, grab_point ); WHEN( "The furniture grabbed by the player is destroyed" ) { - g->m.destroy( grab_point ); + here.destroy( grab_point ); THEN( "The player's grab is released" ) { - CHECK( g->u.get_grab_type() == object_type::NONE ); - CHECK( g->u.grab_point == tripoint_zero ); + CHECK( player_character.get_grab_type() == object_type::NONE ); + CHECK( player_character.grab_point == tripoint_zero ); } } } @@ -86,5 +88,5 @@ TEST_CASE( "place_player_can_safely_move_multiple_submaps" ) // map::shift if the resulting shift exceeded a single submap, leading to a // broken active item cache. g->place_player( tripoint_zero ); - CHECK( g->m.check_submap_active_item_consistency().empty() ); + CHECK( get_map().check_submap_active_item_consistency().empty() ); } diff --git a/tests/melee_dodge_hit_test.cpp b/tests/melee_dodge_hit_test.cpp index c47127dd67845..4f16a8ae3ad60 100644 --- a/tests/melee_dodge_hit_test.cpp +++ b/tests/melee_dodge_hit_test.cpp @@ -68,7 +68,7 @@ TEST_CASE( "Character::get_hit_base", "[character][melee][hit][dex]" ) { clear_map(); - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); SECTION( "character get_hit_base increases by 1/4 for each point of DEX" ) { @@ -96,7 +96,7 @@ TEST_CASE( "Character::get_dodge_base", "[character][melee][dodge][dex][skill]" { clear_map(); - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); // Character::get_dodge_base is simply DEXTERITY / 2 + DODGE_SKILL @@ -188,7 +188,7 @@ TEST_CASE( "player::get_dodge", "[player][melee][dodge]" ) { clear_map(); - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); const float base_dodge = dummy.get_dodge_base(); @@ -222,7 +222,7 @@ TEST_CASE( "player::get_dodge with effects", "[player][melee][dodge][effect]" ) { clear_map(); - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); // Compare all effects against base dodge ability @@ -281,7 +281,7 @@ TEST_CASE( "player::get_dodge while grabbed", "[player][melee][dodge][grab]" ) { clear_map(); - avatar &dummy = g->u; + avatar &dummy = get_avatar(); clear_character( dummy ); // Base dodge rate when not grabbed @@ -352,3 +352,52 @@ TEST_CASE( "player::get_dodge while grabbed", "[player][melee][dodge][grab]" ) } } +TEST_CASE( "player::get_dodge stamina effects", "[player][melee][dodge][stamina]" ) +{ + avatar &dummy = get_avatar(); + clear_character( dummy ); + + SECTION( "8/8/8/8, no skills, unencumbered" ) { + const int stamina_max = dummy.get_stamina_max(); + + SECTION( "100% stamina" ) { + CHECK( dummy.get_dodge() == 4.0f ); + } + + SECTION( "75% stamina" ) { + dummy.set_stamina( .75 * stamina_max ); + CHECK( dummy.get_dodge() == 4.0f ); + } + + SECTION( "50% stamina" ) { + dummy.set_stamina( .5 * stamina_max ); + CHECK( dummy.get_dodge() == 4.0f ); + } + + SECTION( "40% stamina" ) { + dummy.set_stamina( .4 * stamina_max ); + CHECK( dummy.get_dodge() == 3.2f ); + } + + SECTION( "30% stamina" ) { + dummy.set_stamina( .3 * stamina_max ); + CHECK( dummy.get_dodge() == 2.4f ); + } + + SECTION( "20% stamina" ) { + dummy.set_stamina( .2 * stamina_max ); + CHECK( dummy.get_dodge() == 1.6f ); + } + + SECTION( "10% stamina" ) { + dummy.set_stamina( .1 * stamina_max ); + CHECK( dummy.get_dodge() == 0.8f ); + } + + SECTION( "0% stamina" ) { + dummy.set_stamina( 0 ); + CHECK( dummy.get_dodge() == 0.0f ); + } + } +} + diff --git a/tests/memorial_test.cpp b/tests/memorial_test.cpp index 5f9852e35dd23..17d291fb4f330 100644 --- a/tests/memorial_test.cpp +++ b/tests/memorial_test.cpp @@ -50,7 +50,7 @@ void check_memorial( memorial_logger &m, event_bus &b, const std::string &ref, A } } -TEST_CASE( "memorials" ) +TEST_CASE( "memorials", "[memorial]" ) { memorial_logger &m = g->memorial(); m.clear(); @@ -58,8 +58,10 @@ TEST_CASE( "memorials" ) event_bus &b = g->events(); - character_id ch = g->u.getID(); - std::string u_name = g->u.name; + avatar &player_character = get_avatar(); + player_character.male = false; + character_id ch = player_character.getID(); + std::string u_name = player_character.name; character_id ch2 = character_id( ch.get_value() + 1 ); mutagen_technique mutagen = mutagen_technique::injected_purifier; mtype_id mon( "mon_zombie_kevlar_2" ); @@ -87,6 +89,13 @@ TEST_CASE( "memorials" ) check_memorial( m, b, "Became wanted by the police!", ch ); + // To insure we don't trigger losing the Structural Integrity conduct during the test, + // Break the subject's leg first. + b.send( ch, bp_leg_l ); + + check_memorial( + m, b, "Broke her right arm.", ch, bp_arm_r ); + check_memorial( m, b, "Broken right arm began to mend.", ch, bp_arm_r ); @@ -139,6 +148,15 @@ TEST_CASE( "memorials" ) check_memorial( m, b, "Died of a drug overdose.", ch, eff ); + check_memorial( + m, b, "Bled to death.", ch ); + + check_memorial( + m, b, "Died of hypovolemic shock.", ch ); + + check_memorial( + m, b, "Died from loss of red blood cells.", ch ); + check_memorial( m, b, "Succumbed to the infection.", ch ); @@ -189,8 +207,11 @@ TEST_CASE( "memorials" ) std::chrono::seconds( 100 ) ); check_memorial( - m, b, u_name + " began their journey into the Cataclysm.", ch, u_name, g->u.male, - g->u.prof->ident(), g->u.custom_profession, "VERSION_STRING" ); + m, b, u_name + " began their journey into the Cataclysm.", ch, u_name, player_character.male, + player_character.prof->ident(), player_character.custom_profession, "VERSION_STRING" ); + + // Invokes achievement, so send another to clear the log for the test + b.send( ch, cbm ); check_memorial( m, b, "Installed bionic: Alarm System.", ch, cbm ); @@ -263,3 +284,49 @@ TEST_CASE( "memorials" ) check_memorial( m, b, "Used the debug menu (WISH).", debug_menu::debug_menu_index::WISH ); } + +TEST_CASE( "convert_legacy_memorial_log", "[memorial]" ) +{ + // Verify that the old format can be transformed into the new format + const std::string input = + "| Year 1, Spring, day 0 0800.00 | prison | Hubert 'Daffy' Mullin began their journey into the Cataclysm.\n" + "| Year 1, Spring, day 0 0800.05 | prison | Gained the mutation 'Debug Invincibility'.\n"; + const std::string json_value = + R"([{"preformatted":"| Year 1, Spring, day 0 0800.00 | prison | Hubert 'Daffy' Mullin began their journey into the Cataclysm."},{"preformatted":"| Year 1, Spring, day 0 0800.05 | prison | Gained the mutation 'Debug Invincibility'."}])"; + + memorial_logger logger; + { + std::istringstream is( input ); + logger.load( is ); + std::ostringstream os; + logger.save( os ); + CHECK( os.str() == json_value ); + } + + // Then verify that the new format is unchanged + { + std::istringstream is( json_value ); + logger.load( is ); + std::ostringstream os; + logger.save( os ); + CHECK( os.str() == json_value ); + } + + // Finally, verify that dump matches legacy input + CHECK( logger.dump() == input ); +} + +TEST_CASE( "memorial_log_dumping", "[memorial]" ) +{ + // An example log file with one legacy and one "modern" entry + const std::string json_value = + R"([{"preformatted":"| Year 1, Spring, day 0 0800.00 | refugee center | Apolonia Trout began their journey into the Cataclysm."},{"time":15614,"oter_id":"cabin_isherwood","oter_name":"forest","message":"Used the debug menu (ENABLE_ACHIEVEMENTS)."}])"; + const std::string expected_output = + "| Year 1, Spring, day 0 0800.00 | refugee center | Apolonia Trout began their journey into the Cataclysm.\n" + "| Year 1, Spring, day 1 4:20:14 AM | forest | Used the debug menu (ENABLE_ACHIEVEMENTS).\n"; + + memorial_logger logger; + std::istringstream is( json_value ); + logger.load( is ); + CHECK( logger.dump() == expected_output ); +} diff --git a/tests/modify_morale_test.cpp b/tests/modify_morale_test.cpp index c1188a84048d3..ccf8c29a35b2f 100644 --- a/tests/modify_morale_test.cpp +++ b/tests/modify_morale_test.cpp @@ -6,7 +6,6 @@ #include "avatar.h" #include "catch/catch.hpp" -#include "game.h" #include "item.h" #include "map.h" #include "map_helpers.h" @@ -79,7 +78,9 @@ TEST_CASE( "food enjoyability", "[food][modify_morale][fun]" ) TEST_CASE( "dining with table and chair", "[food][modify_morale][table][chair]" ) { clear_map(); + map &here = get_map(); avatar dummy; + dummy.set_body(); const tripoint avatar_pos( 60, 60, 0 ); dummy.setpos( avatar_pos ); dummy.worn.push_back( item( "backpack" ) ); @@ -109,8 +110,8 @@ TEST_CASE( "dining with table and chair", "[food][modify_morale][table][chair]" }; GIVEN( "no table or chair are nearby" ) { - REQUIRE_FALSE( g->m.has_nearby_table( dummy.pos(), 1 ) ); - REQUIRE_FALSE( g->m.has_nearby_chair( dummy.pos(), 1 ) ); + REQUIRE_FALSE( here.has_nearby_table( dummy.pos(), 1 ) ); + REQUIRE_FALSE( here.has_nearby_chair( dummy.pos(), 1 ) ); AND_GIVEN( "character has normal table manners" ) { REQUIRE_FALSE( dummy.has_trait( trait_TABLEMANNERS ) ); @@ -145,10 +146,10 @@ TEST_CASE( "dining with table and chair", "[food][modify_morale][table][chair]" } GIVEN( "a table and chair are nearby" ) { - g->m.furn_set( avatar_pos + tripoint_north, furn_id( "f_table" ) ); - g->m.furn_set( avatar_pos + tripoint_east, furn_id( "f_chair" ) ); - REQUIRE( g->m.has_nearby_table( dummy.pos(), 1 ) ); - REQUIRE( g->m.has_nearby_chair( dummy.pos(), 1 ) ); + here.furn_set( avatar_pos + tripoint_north, furn_id( "f_table" ) ); + here.furn_set( avatar_pos + tripoint_east, furn_id( "f_chair" ) ); + REQUIRE( here.has_nearby_table( dummy.pos(), 1 ) ); + REQUIRE( here.has_nearby_chair( dummy.pos(), 1 ) ); AND_GIVEN( "character has normal table manners" ) { REQUIRE_FALSE( dummy.has_trait( trait_TABLEMANNERS ) ); @@ -269,6 +270,7 @@ TEST_CASE( "drugs", "[food][modify_morale][drug]" ) TEST_CASE( "cannibalism", "[food][modify_morale][cannibal]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); item &human = dummy.i_add( item( "bone_human" ) ); @@ -344,6 +346,7 @@ TEST_CASE( "cannibalism", "[food][modify_morale][cannibal]" ) TEST_CASE( "sweet junk food", "[food][modify_morale][junk][sweet]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); GIVEN( "some sweet junk food" ) { @@ -397,6 +400,7 @@ TEST_CASE( "sweet junk food", "[food][modify_morale][junk][sweet]" ) TEST_CASE( "junk food that is not ingested", "[modify_morale][junk][no_ingest]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); item &caff_gum = dummy.i_add( item( "caff_gum" ) ); @@ -462,6 +466,7 @@ TEST_CASE( "junk food that is not ingested", "[modify_morale][junk][no_ingest]" TEST_CASE( "food allergies and intolerances", "[food][modify_morale][allergy]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); int penalty = -75; @@ -548,6 +553,7 @@ TEST_CASE( "food allergies and intolerances", "[food][modify_morale][allergy]" ) TEST_CASE( "saprophage character", "[food][modify_morale][saprophage]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); GIVEN( "character is a saprophage, preferring rotted food" ) { @@ -584,6 +590,7 @@ TEST_CASE( "saprophage character", "[food][modify_morale][saprophage]" ) TEST_CASE( "ursine honey", "[food][modify_morale][ursine][honey]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); item &honeycomb = dummy.i_add( item( "honeycomb" ) ); diff --git a/tests/monster_test.cpp b/tests/monster_test.cpp index 346f473536c57..1343278ff84b7 100644 --- a/tests/monster_test.cpp +++ b/tests/monster_test.cpp @@ -8,20 +8,19 @@ #include #include -#include "avatar.h" #include "catch/catch.hpp" +#include "character.h" #include "game.h" +#include "game_constants.h" +#include "item.h" +#include "line.h" #include "map.h" #include "map_helpers.h" #include "monster.h" #include "options_helpers.h" #include "options.h" -#include "player.h" -#include "test_statistics.h" -#include "game_constants.h" -#include "item.h" -#include "line.h" #include "point.h" +#include "test_statistics.h" using move_statistics = statistics; @@ -86,10 +85,11 @@ static int can_catch_player( const std::string &monster_type, const tripoint &di { clear_map(); REQUIRE( g->num_creatures() == 1 ); // the player - player &test_player = g->u; + Character &test_player = get_player_character(); // Strip off any potentially encumbering clothing. - std::list temp; - while( test_player.takeoff( test_player.i_at( -2 ), &temp ) ) {} + test_player.remove_worn_items_with( []( item & ) { + return true; + } ); const tripoint center{ 65, 65, 0 }; test_player.setpos( center ); @@ -121,14 +121,14 @@ static int can_catch_player( const std::string &monster_type, const tripoint &di // Verify that only the player and one monster are present. REQUIRE( g->num_creatures() == 2 ); } - const int move_cost = g->m.combined_movecost( + const int move_cost = get_map().combined_movecost( test_player.pos(), test_player.pos() + direction_of_flight, nullptr, 0 ); tracker.push_back( {'p', move_cost, rl_dist( test_monster.pos(), test_player.pos() ), test_player.pos() } ); test_player.mod_moves( -move_cost ); } - g->m.clear_traps(); + get_map().clear_traps(); test_monster.set_dest( test_player.pos() ); test_monster.mod_moves( monster_speed ); while( test_monster.moves >= 0 ) { diff --git a/tests/monster_vision_test.cpp b/tests/monster_vision_test.cpp index cef8bd52fa32d..b35d863942ea2 100644 --- a/tests/monster_vision_test.cpp +++ b/tests/monster_vision_test.cpp @@ -23,8 +23,7 @@ static const time_point midday = calendar::turn_zero + 12_hours; TEST_CASE( "monsters shouldn't see through floors", "[vision]" ) { - override_option opt( "ZLEVELS", "true" ); - override_option opt2( "FOV_3D", "true" ); + override_option opt( "FOV_3D", "true" ); bool old_fov_3d = fov_3d; fov_3d = true; calendar::turn = midday; diff --git a/tests/mutation_test.cpp b/tests/mutation_test.cpp index 654dae132bfd1..5cd4cec7efebe 100644 --- a/tests/mutation_test.cpp +++ b/tests/mutation_test.cpp @@ -18,6 +18,7 @@ std::string get_mutations_as_string( const player &p ); static void give_all_mutations( player &p, const mutation_category_trait &category, const bool include_postthresh ) { + p.set_body(); const std::vector category_mutations = mutations_category[category.id]; // Add the threshold mutation first diff --git a/tests/new_character_test.cpp b/tests/new_character_test.cpp index 38c9a90c1a600..9223612a2d63a 100644 --- a/tests/new_character_test.cpp +++ b/tests/new_character_test.cpp @@ -67,10 +67,9 @@ static avatar get_sanitized_player() { // You'd think that this hp stuff would be in the c'tor... avatar ret = avatar(); + ret.set_body(); ret.recalc_hp(); - for( int i = 0; i < num_hp_parts; i++ ) { - ret.hp_cur[i] = ret.hp_max[i]; - } + // Set these insanely high so can_eat doesn't return TOO_FULL ret.set_hunger( 10000 ); ret.set_thirst( 10000 ); @@ -148,7 +147,7 @@ TEST_CASE( "starting_items", "[slow]" ) g->u.worn.clear(); g->u.remove_weapon(); g->u.inv.clear(); - g->u.reset_encumbrance(); + g->u.calc_encumbrance(); g->u.male = i == 0; g->u.add_profession_items(); diff --git a/tests/npc_talk_test.cpp b/tests/npc_talk_test.cpp index f32cf30306219..2d519730557b2 100644 --- a/tests/npc_talk_test.cpp +++ b/tests/npc_talk_test.cpp @@ -42,7 +42,7 @@ static const trait_id trait_PROF_SWAT( "PROF_SWAT" ); static npc &create_test_talker() { const string_id test_talker( "test_talker" ); - const character_id model_id = g->m.place_npc( point( 25, 25 ), test_talker, true ); + const character_id model_id = get_map().place_npc( point( 25, 25 ), test_talker ); g->load_npcs(); npc *model_npc = g->find_npc( model_id ); @@ -85,7 +85,7 @@ static std::string gen_dynamic_line( dialogue &d ) static void change_om_type( const std::string &new_type ) { - const tripoint omt_pos = ms_to_omt_copy( g->m.getabs( g->u.pos() ) ); + const tripoint omt_pos = ms_to_omt_copy( get_map().getabs( get_player_character().pos() ) ); overmap_buffer.ter_set( omt_pos, oter_id( new_type ) ); } @@ -93,16 +93,17 @@ static npc &prep_test( dialogue &d ) { clear_avatar(); clear_vehicles(); - REQUIRE_FALSE( g->u.in_vehicle ); + player &player_character = get_avatar(); + REQUIRE_FALSE( player_character.in_vehicle ); const tripoint test_origin( 15, 15, 0 ); - g->u.setpos( test_origin ); + player_character.setpos( test_origin ); g->faction_manager_ptr->create_if_needed(); npc &talker_npc = create_test_talker(); - d.alpha = &g->u; + d.alpha = &player_character; d.beta = &talker_npc; return talker_npc; @@ -133,10 +134,11 @@ TEST_CASE( "npc_talk_stats", "[npc_talk]" ) dialogue d; prep_test( d ); - g->u.str_cur = 8; - g->u.dex_cur = 8; - g->u.int_cur = 8; - g->u.per_cur = 8; + player &player_character = get_avatar(); + player_character.str_cur = 8; + player_character.dex_cur = 8; + player_character.int_cur = 8; + player_character.per_cur = 8; d.add_topic( "TALK_TEST_SIMPLE_STATS" ); gen_response_lines( d, 5 ); @@ -145,10 +147,10 @@ TEST_CASE( "npc_talk_stats", "[npc_talk]" ) CHECK( d.responses[2].text == "This is a dexterity test response." ); CHECK( d.responses[3].text == "This is an intelligence test response." ); CHECK( d.responses[4].text == "This is a perception test response." ); - g->u.str_cur = 6; - g->u.dex_cur = 6; - g->u.int_cur = 6; - g->u.per_cur = 6; + player_character.str_cur = 6; + player_character.dex_cur = 6; + player_character.int_cur = 6; + player_character.per_cur = 6; gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); @@ -168,14 +170,15 @@ TEST_CASE( "npc_talk_skills", "[npc_talk]" ) const skill_id skill( "driving" ); - g->u.set_skill_level( skill, 8 ); + player &player_character = get_avatar(); + player_character.set_skill_level( skill, 8 ); d.add_topic( "TALK_TEST_SIMPLE_SKILLS" ); gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a driving test response." ); - g->u.set_skill_level( skill, 6 ); + player_character.set_skill_level( skill, 6 ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); @@ -190,20 +193,21 @@ TEST_CASE( "npc_talk_wearing_and_trait", "[npc_talk]" ) dialogue d; npc &talker_npc = prep_test( d ); - for( const trait_id &tr : g->u.get_mutations() ) { - g->u.unset_mutation( tr ); + player &player_character = get_avatar(); + for( const trait_id &tr : player_character.get_mutations() ) { + player_character.unset_mutation( tr ); } d.add_topic( "TALK_TEST_WEARING_AND_TRAIT" ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.toggle_trait( trait_id( "ELFA_EARS" ) ); + player_character.toggle_trait( trait_id( "ELFA_EARS" ) ); gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a trait test response." ); CHECK( d.responses[2].text == "This is a short trait test response." ); - g->u.wear_item( item( "badge_marshal" ) ); + player_character.wear_item( item( "badge_marshal" ) ); gen_response_lines( d, 4 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a trait test response." ); @@ -217,16 +221,16 @@ TEST_CASE( "npc_talk_wearing_and_trait", "[npc_talk]" ) CHECK( d.responses[3].text == "This is a wearing test response." ); CHECK( d.responses[4].text == "This is a npc trait test response." ); CHECK( d.responses[5].text == "This is a npc short trait test response." ); - g->u.toggle_trait( trait_id( "ELFA_EARS" ) ); + player_character.toggle_trait( trait_id( "ELFA_EARS" ) ); talker_npc.toggle_trait( trait_id( "ELFA_EARS" ) ); - g->u.toggle_trait( trait_id( "PSYCHOPATH" ) ); + player_character.toggle_trait( trait_id( "PSYCHOPATH" ) ); talker_npc.toggle_trait( trait_id( "SAPIOVORE" ) ); gen_response_lines( d, 4 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a wearing test response." ); CHECK( d.responses[2].text == "This is a trait flags test response." ); CHECK( d.responses[3].text == "This is a npc trait flags test response." ); - g->u.toggle_trait( trait_id( "PSYCHOPATH" ) ); + player_character.toggle_trait( trait_id( "PSYCHOPATH" ) ); talker_npc.toggle_trait( trait_id( "SAPIOVORE" ) ); } @@ -234,6 +238,7 @@ TEST_CASE( "npc_talk_effect", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); d.add_topic( "TALK_TEST_EFFECT" ); gen_response_lines( d, 1 ); @@ -242,7 +247,7 @@ TEST_CASE( "npc_talk_effect", "[npc_talk]" ) gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an npc effect test response." ); - g->u.add_effect( effect_gave_quest_item, 9999_turns ); + player_character.add_effect( effect_gave_quest_item, 9999_turns ); d.gen_responses( d.topic_stack.back() ); gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); @@ -254,13 +259,14 @@ TEST_CASE( "npc_talk_service", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); d.add_topic( "TALK_TEST_SERVICE" ); - g->u.cash = 0; + player_character.cash = 0; talker_npc.add_effect( effect_currently_busy, 9999_turns ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.cash = 800; + player_character.cash = 800; gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a cash test response." ); @@ -460,25 +466,26 @@ TEST_CASE( "npc_talk_switch", "[npc_talk]" ) { dialogue d; prep_test( d ); + player &player_character = get_avatar(); d.add_topic( "TALK_TEST_SWITCH" ); - g->u.cash = 1000; + player_character.cash = 1000; gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an switch 1 test response." ); CHECK( d.responses[2].text == "This is another basic test response." ); - g->u.cash = 100; + player_character.cash = 100; gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an switch 2 test response." ); CHECK( d.responses[2].text == "This is another basic test response." ); - g->u.cash = 10; + player_character.cash = 10; gen_response_lines( d, 4 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an switch default 1 test response." ); CHECK( d.responses[2].text == "This is an switch default 2 test response." ); CHECK( d.responses[3].text == "This is another basic test response." ); - g->u.cash = 0; + player_character.cash = 0; gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an switch default 2 test response." ); @@ -489,13 +496,14 @@ TEST_CASE( "npc_talk_or", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); d.add_topic( "TALK_TEST_OR" ); - g->u.cash = 0; + player_character.cash = 0; talker_npc.add_effect( effect_currently_busy, 9999_turns ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.toggle_trait( trait_id( "ELFA_EARS" ) ); + player_character.toggle_trait( trait_id( "ELFA_EARS" ) ); gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is an or trait test response." ); @@ -505,12 +513,13 @@ TEST_CASE( "npc_talk_and", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); - g->u.toggle_trait( trait_id( "ELFA_EARS" ) ); + player_character.toggle_trait( trait_id( "ELFA_EARS" ) ); d.add_topic( "TALK_TEST_AND" ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.cash = 800; + player_character.cash = 800; talker_npc.remove_effect( effect_currently_busy ); gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); @@ -521,14 +530,15 @@ TEST_CASE( "npc_talk_nested", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); d.add_topic( "TALK_TEST_NESTED" ); talker_npc.add_effect( effect_currently_busy, 9999_turns ); - g->u.cash = 0; + player_character.cash = 0; gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.cash = 800; - g->u.int_cur = 11; + player_character.cash = 800; + player_character.int_cur = 11; gen_response_lines( d, 2 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a complex nested test response." ); @@ -537,8 +547,9 @@ TEST_CASE( "npc_talk_nested", "[npc_talk]" ) TEST_CASE( "npc_talk_conditionals", "[npc_talk]" ) { dialogue d; + player &player_character = get_avatar(); prep_test( d ); - g->u.cash = 800; + player_character.cash = 800; d.add_topic( "TALK_TEST_TRUE_FALSE_CONDITIONAL" ); gen_response_lines( d, 3 ); @@ -550,7 +561,7 @@ TEST_CASE( "npc_talk_conditionals", "[npc_talk]" ) CHECK( trial_success == true ); talk_effect_t &trial_effect = trial_success ? chosen.success : chosen.failure; CHECK( trial_effect.next_topic.id == "TALK_TEST_TRUE_CONDITION_NEXT" ); - g->u.cash = 0; + player_character.cash = 0; gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); CHECK( d.responses[1].text == "This is a true/false false response." ); @@ -566,8 +577,9 @@ TEST_CASE( "npc_talk_items", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); - g->u.remove_items_with( []( const item & it ) { + player_character.remove_items_with( []( const item & it ) { return it.get_category().get_id() == item_category_id( "books" ) || it.get_category().get_id() == item_category_id( "food" ) || it.typeId() == itype_id( "bottle_glass" ); @@ -590,17 +602,17 @@ TEST_CASE( "npc_talk_items", "[npc_talk]" ) const auto has_beer_bottle = [&]( player & p, int count ) { return has_item( p, "bottle_glass", 1 ) && has_item( p, "beer", count ); }; - g->u.cash = 1000; - g->u.int_cur = 8; - g->u.worn.push_back( item( "backpack" ) ); + player_character.cash = 1000; + player_character.int_cur = 8; + player_character.worn.push_back( item( "backpack" ) ); d.add_topic( "TALK_TEST_EFFECTS" ); gen_response_lines( d, 19 ); // add and remove effect - REQUIRE_FALSE( g->u.has_effect( effect_infection ) ); + REQUIRE_FALSE( player_character.has_effect( effect_infection ) ); talk_effect_t &effects = d.responses[1].success; effects.apply( d ); - CHECK( g->u.has_effect( effect_infection ) ); - CHECK( g->u.get_effect_dur( effect_infection ) == time_duration::from_turns( 10 ) ); + CHECK( player_character.has_effect( effect_infection ) ); + CHECK( player_character.get_effect_dur( effect_infection ) == time_duration::from_turns( 10 ) ); REQUIRE_FALSE( talker_npc.has_effect( effect_infection ) ); effects = d.responses[2].success; effects.apply( d ); @@ -608,54 +620,54 @@ TEST_CASE( "npc_talk_items", "[npc_talk]" ) CHECK( talker_npc.get_effect( effect_infection ).is_permanent() ); effects = d.responses[3].success; effects.apply( d ); - CHECK_FALSE( g->u.has_effect( effect_infection ) ); + CHECK_FALSE( player_character.has_effect( effect_infection ) ); effects = d.responses[4].success; effects.apply( d ); CHECK_FALSE( talker_npc.has_effect( effect_infection ) ); // add and remove trait - REQUIRE_FALSE( g->u.has_trait( trait_PROF_FED ) ); + REQUIRE_FALSE( player_character.has_trait( trait_PROF_FED ) ); effects = d.responses[5].success; effects.apply( d ); - CHECK( g->u.has_trait( trait_PROF_FED ) ); + CHECK( player_character.has_trait( trait_PROF_FED ) ); REQUIRE_FALSE( talker_npc.has_trait( trait_PROF_FED ) ); effects = d.responses[6].success; effects.apply( d ); CHECK( talker_npc.has_trait( trait_PROF_FED ) ); effects = d.responses[7].success; effects.apply( d ); - CHECK_FALSE( g->u.has_trait( trait_PROF_FED ) ); + CHECK_FALSE( player_character.has_trait( trait_PROF_FED ) ); effects = d.responses[8].success; effects.apply( d ); CHECK_FALSE( talker_npc.has_trait( trait_PROF_FED ) ); // buying and spending talker_npc.op_of_u.owed = 1000; - REQUIRE_FALSE( has_beer_bottle( g->u, 2 ) ); + REQUIRE_FALSE( has_beer_bottle( player_character, 2 ) ); REQUIRE( talker_npc.op_of_u.owed == 1000 ); effects = d.responses[9].success; effects.apply( d ); CHECK( talker_npc.op_of_u.owed == 500 ); - CHECK( has_beer_bottle( g->u, 2 ) ); - REQUIRE_FALSE( has_item( g->u, "bottle_plastic", 1 ) ); + CHECK( has_beer_bottle( player_character, 2 ) ); + REQUIRE_FALSE( has_item( player_character, "bottle_plastic", 1 ) ); effects = d.responses[10].success; effects.apply( d ); - CHECK( has_item( g->u, "bottle_plastic", 1 ) ); + CHECK( has_item( player_character, "bottle_plastic", 1 ) ); CHECK( talker_npc.op_of_u.owed == 500 ); effects = d.responses[11].success; effects.apply( d ); CHECK( talker_npc.op_of_u.owed == 0 ); talker_npc.op_of_u.owed = 1000; // effect chains - REQUIRE_FALSE( g->u.has_effect( effect_infected ) ); + REQUIRE_FALSE( player_character.has_effect( effect_infected ) ); REQUIRE_FALSE( talker_npc.has_effect( effect_infected ) ); - REQUIRE_FALSE( g->u.has_trait( trait_PROF_SWAT ) ); + REQUIRE_FALSE( player_character.has_trait( trait_PROF_SWAT ) ); REQUIRE_FALSE( talker_npc.has_trait( trait_PROF_SWAT ) ); effects = d.responses[12].success; effects.apply( d ); - CHECK( g->u.has_effect( effect_infected ) ); - CHECK( g->u.get_effect_dur( effect_infected ) == time_duration::from_turns( 10 ) ); + CHECK( player_character.has_effect( effect_infected ) ); + CHECK( player_character.get_effect_dur( effect_infected ) == time_duration::from_turns( 10 ) ); CHECK( talker_npc.has_effect( effect_infected ) ); CHECK( talker_npc.get_effect( effect_infected ).is_permanent() ); - CHECK( g->u.has_trait( trait_PROF_SWAT ) ); + CHECK( player_character.has_trait( trait_PROF_SWAT ) ); CHECK( talker_npc.has_trait( trait_PROF_SWAT ) ); CHECK( talker_npc.op_of_u.owed == 0 ); CHECK( talker_npc.get_attitude() == NPCATT_KILL ); @@ -707,17 +719,17 @@ TEST_CASE( "npc_talk_items", "[npc_talk]" ) // test sell and consume d.add_topic( "TALK_TEST_EFFECTS" ); gen_response_lines( d, 19 ); - REQUIRE( has_item( g->u, "bottle_plastic", 1 ) ); - REQUIRE( has_beer_bottle( g->u, 2 ) ); - const std::vector glass_bottles = g->u.items_with( []( const item & it ) { + REQUIRE( has_item( player_character, "bottle_plastic", 1 ) ); + REQUIRE( has_beer_bottle( player_character, 2 ) ); + const std::vector glass_bottles = player_character.items_with( []( const item & it ) { return it.typeId() == itype_id( "bottle_glass" ); } ); REQUIRE( !glass_bottles.empty() ); - REQUIRE( g->u.wield( *glass_bottles.front() ) ); + REQUIRE( player_character.wield( *glass_bottles.front() ) ); effects = d.responses[14].success; effects.apply( d ); - CHECK_FALSE( has_item( g->u, "bottle_plastic", 1 ) ); - CHECK_FALSE( has_item( g->u, "beer", 1 ) ); + CHECK_FALSE( has_item( player_character, "bottle_plastic", 1 ) ); + CHECK_FALSE( has_item( player_character, "beer", 1 ) ); CHECK( has_item( talker_npc, "bottle_plastic", 1 ) ); CHECK( has_item( talker_npc, "beer", 2 ) ); effects = d.responses[15].success; @@ -726,11 +738,11 @@ TEST_CASE( "npc_talk_items", "[npc_talk]" ) CHECK( has_item( talker_npc, "beer", 1 ) ); effects = d.responses[16].success; effects.apply( d ); - CHECK( has_item( g->u, "beer", 1 ) ); + CHECK( has_item( player_character, "beer", 1 ) ); effects = d.responses[17].success; effects.apply( d ); - CHECK( has_item( g->u, "beer", 0 ) ); - CHECK_FALSE( has_item( g->u, "beer", 1 ) ); + CHECK( has_item( player_character, "beer", 0 ) ); + CHECK_FALSE( has_item( player_character, "beer", 1 ) ); } TEST_CASE( "npc_talk_combat_commands", "[npc_talk]" ) @@ -844,17 +856,43 @@ TEST_CASE( "npc_talk_adjust_vars", "[npc_talk]" ) CHECK( d.responses[10].text == "This is a npc_compare_var test response for < 0." ); } +TEST_CASE( "npc_talk_vars_time", "[npc_talk]" ) +{ + dialogue d; + prep_test( d ); + + time_point start_turn = calendar::turn; + calendar::turn = calendar::turn + time_duration( 1_hours ); + d.add_topic( "TALK_TEST_VARS_TIME" ); + gen_response_lines( d, 3 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + CHECK( d.responses[1].text == "This is a u_add_var time test response." ); + CHECK( d.responses[2].text == "This is a npc_add_var time test response." ); + talk_effect_t &effects = d.responses[1].success; + effects.apply( d ); + gen_response_lines( d, 1 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + time_point then = calendar::turn; + calendar::turn = calendar::turn + time_duration( 4_days ); + REQUIRE( then < calendar::turn ); + gen_response_lines( d, 2 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + CHECK( d.responses[1].text == "This is a u_compare_var time test response for > 3_days." ); + calendar::turn = start_turn; +} + TEST_CASE( "npc_talk_bionics", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); - g->u.clear_bionics(); + player_character.clear_bionics(); talker_npc.clear_bionics(); d.add_topic( "TALK_TEST_BIONICS" ); gen_response_lines( d, 1 ); CHECK( d.responses[0].text == "This is a basic test response." ); - g->u.add_bionic( bionic_id( "bio_ads" ) ); + player_character.add_bionic( bionic_id( "bio_ads" ) ); talker_npc.add_bionic( bionic_id( "bio_power_storage" ) ); gen_response_lines( d, 3 ); CHECK( d.responses[0].text == "This is a basic test response." ); @@ -866,9 +904,10 @@ TEST_CASE( "npc_talk_effects", "[npc_talk]" ) { dialogue d; npc &talker_npc = prep_test( d ); + player &player_character = get_avatar(); // speaker effects just use are owed because I don't want to do anything complicated - g->u.cash = 1000; + player_character.cash = 1000; talker_npc.op_of_u.owed = 2000; CHECK( talker_npc.op_of_u.owed == 2000 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_SIMPLE" ); diff --git a/tests/npc_test.cpp b/tests/npc_test.cpp index 8f2253af2dfb2..900b448326870 100644 --- a/tests/npc_test.cpp +++ b/tests/npc_test.cpp @@ -5,7 +5,6 @@ #include #include -#include "avatar.h" #include "calendar.h" #include "catch/catch.hpp" #include "common_types.h" @@ -313,40 +312,42 @@ TEST_CASE( "npc-movement" ) clear_map(); + Character &player_character = get_player_character(); + map &here = get_map(); for( int y = 0; y < height; ++y ) { for( int x = 0; x < width; ++x ) { const char type = setup[y][x]; - const tripoint p = g->u.pos() + point( x, y ); + const tripoint p = player_character.pos() + point( x, y ); // create walls if( type == '#' ) { - g->m.ter_set( p, t_reinforced_glass ); + here.ter_set( p, t_reinforced_glass ); } else { - g->m.ter_set( p, t_floor ); + here.ter_set( p, t_floor ); } // spawn acid // a copy is needed because we will remove elements from it - const field fs = g->m.field_at( p ); + const field fs = here.field_at( p ); for( const auto &f : fs ) { - g->m.remove_field( p, f.first ); + here.remove_field( p, f.first ); } if( type == 'A' || type == 'R' || type == 'W' || type == 'M' || type == 'B' || type == 'C' ) { - g->m.add_field( p, fd_acid, 3 ); + here.add_field( p, fd_acid, 3 ); } // spawn rubbles if( type == 'R' ) { - g->m.furn_set( p, f_rubble ); + here.furn_set( p, f_rubble ); } else { - g->m.furn_set( p, f_null ); + here.furn_set( p, f_null ); } // create vehicles if( type == 'V' || type == 'W' || type == 'M' ) { - vehicle *veh = g->m.add_vehicle( vproto_id( "none" ), p, 270, 0, 0 ); + vehicle *veh = here.add_vehicle( vproto_id( "none" ), p, 270, 0, 0 ); REQUIRE( veh != nullptr ); veh->install_part( point_zero, vpart_frame_vertical ); veh->install_part( point_zero, vpart_seat ); - g->m.add_vehicle_to_cache( veh ); + here.add_vehicle_to_cache( veh ); } // spawn npcs if( type == 'A' || type == 'R' || type == 'W' || type == 'M' @@ -374,28 +375,28 @@ TEST_CASE( "npc-movement" ) for( int y = 0; y < height; ++y ) { for( int x = 0; x < width; ++x ) { const char type = setup[y][x]; - const tripoint p = g->u.pos() + point( x, y ); + const tripoint p = player_character.pos() + point( x, y ); if( type == '#' ) { - REQUIRE( !g->m.passable( p ) ); + REQUIRE( !here.passable( p ) ); } else { - REQUIRE( g->m.passable( p ) ); + REQUIRE( here.passable( p ) ); } if( type == 'R' ) { - REQUIRE( g->m.has_flag( "UNSTABLE", p ) ); + REQUIRE( here.has_flag( "UNSTABLE", p ) ); } else { - REQUIRE( !g->m.has_flag( "UNSTABLE", p ) ); + REQUIRE( !here.has_flag( "UNSTABLE", p ) ); } if( type == 'V' || type == 'W' || type == 'M' ) { - REQUIRE( g->m.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ).has_value() ); + REQUIRE( here.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ).has_value() ); } else { - REQUIRE( !g->m.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ).has_value() ); + REQUIRE( !here.veh_at( p ).part_with_feature( VPFLAG_BOARDABLE, true ).has_value() ); } npc *guy = g->critter_at( p ); if( type == 'A' || type == 'R' || type == 'W' || type == 'M' || type == 'B' || type == 'C' ) { REQUIRE( guy != nullptr ); - REQUIRE( guy->is_dangerous_fields( g->m.field_at( p ) ) ); + REQUIRE( guy->is_dangerous_fields( here.field_at( p ) ) ); } else { REQUIRE( guy == nullptr ); } @@ -403,16 +404,16 @@ TEST_CASE( "npc-movement" ) } SECTION( "NPCs escape dangerous terrain by pushing other NPCs" ) { - check_npc_movement( g->u.pos() ); + check_npc_movement( player_character.pos() ); } SECTION( "Player in vehicle & NPCs escaping dangerous terrain" ) { - const tripoint origin = g->u.pos(); + const tripoint origin = player_character.pos(); for( int y = 0; y < height; ++y ) { for( int x = 0; x < width; ++x ) { if( setup[y][x] == 'V' ) { - g->place_player( g->u.pos() + point( x, y ) ); + g->place_player( player_character.pos() + point( x, y ) ); break; } } @@ -434,8 +435,9 @@ TEST_CASE( "npc_can_target_player" ) clear_npcs(); clear_creatures(); - npc &hostile = spawn_npc( g->u.pos().xy() + point_south, "thug" ); - REQUIRE( rl_dist( g->u.pos(), hostile.pos() ) <= 1 ); + Character &player_character = get_player_character(); + npc &hostile = spawn_npc( player_character.pos().xy() + point_south, "thug" ); + REQUIRE( rl_dist( player_character.pos(), hostile.pos() ) <= 1 ); hostile.set_attitude( NPCATT_KILL ); hostile.name = "Enemy NPC"; @@ -443,5 +445,5 @@ TEST_CASE( "npc_can_target_player" ) hostile.regen_ai_cache(); REQUIRE( hostile.current_target() != nullptr ); - CHECK( hostile.current_target() == static_cast( &g->u ) ); + CHECK( hostile.current_target() == static_cast( &player_character ) ); } diff --git a/tests/player_helpers.cpp b/tests/player_helpers.cpp index 2ee69b55e0955..7619904eb3585 100644 --- a/tests/player_helpers.cpp +++ b/tests/player_helpers.cpp @@ -26,7 +26,7 @@ int get_remaining_charges( const std::string &tool_id ) { - const inventory crafting_inv = g->u.crafting_inventory(); + const inventory crafting_inv = get_player_character().crafting_inventory(); std::vector items = crafting_inv.items_with( [tool_id]( const item & i ) { return i.typeId() == itype_id( tool_id ); @@ -40,7 +40,7 @@ int get_remaining_charges( const std::string &tool_id ) bool player_has_item_of_type( const std::string &type ) { - std::vector matching_items = g->u.inv.items_with( + std::vector matching_items = get_player_character().inv.items_with( [&]( const item & i ) { return i.type->get_id() == itype_id( type ); } ); @@ -50,11 +50,12 @@ bool player_has_item_of_type( const std::string &type ) void clear_character( player &dummy, bool debug_storage ) { + dummy.set_body(); dummy.normalize(); // In particular this clears martial arts style // delete all worn items. dummy.worn.clear(); - dummy.reset_encumbrance(); + dummy.calc_encumbrance(); dummy.inv.clear(); dummy.remove_weapon(); dummy.clear_mutations(); @@ -102,7 +103,7 @@ void clear_character( player &dummy, bool debug_storage ) dummy.reset_bonuses(); dummy.set_speed_base( 100 ); dummy.set_speed_bonus( 0 ); - dummy.hp_cur.fill( dummy.get_hp_max() ); + dummy.set_all_parts_hp_to_max(); dummy.cash = 0; @@ -112,7 +113,7 @@ void clear_character( player &dummy, bool debug_storage ) void clear_avatar() { - clear_character( g->u ); + clear_character( get_avatar() ); } void process_activity( player &dummy ) @@ -128,7 +129,7 @@ void process_activity( player &dummy ) npc &spawn_npc( const point &p, const std::string &npc_class ) { const string_id test_guy( npc_class ); - const character_id model_id = g->m.place_npc( p, test_guy, true ); + const character_id model_id = get_map().place_npc( p, test_guy ); g->load_npcs(); npc *guy = g->find_npc( model_id ); diff --git a/tests/player_test.cpp b/tests/player_test.cpp index d3ffb68878053..15e64c69d73a2 100644 --- a/tests/player_test.cpp +++ b/tests/player_test.cpp @@ -3,9 +3,8 @@ #include #include -#include "avatar.h" #include "catch/catch.hpp" -#include "player.h" +#include "character.h" #include "weather.h" #include "bodypart.h" #include "calendar.h" @@ -13,7 +12,7 @@ // Set the stage for a particular ambient and target temperature and run update_bodytemp() until // core body temperature settles. -static void temperature_check( player *p, const int ambient_temp, const int target_temp ) +static void temperature_check( Character *p, const int ambient_temp, const int target_temp ) { get_weather().temperature = ambient_temp; for( int i = 0 ; i < num_bp; i++ ) { @@ -40,7 +39,7 @@ static void temperature_check( player *p, const int ambient_temp, const int targ CHECK( high > p->temp_cur[0] ); } -static void equip_clothing( player *p, const std::string &clothing ) +static void equip_clothing( Character *p, const std::string &clothing ) { const item article( clothing, 0 ); p->wear_item( article ); @@ -48,7 +47,7 @@ static void equip_clothing( player *p, const std::string &clothing ) // Run the tests for each of the temperature setpoints. // ambient_temps MUST have 7 values or we'll segfault. -static void test_temperature_spread( player *p, const std::array &ambient_temps ) +static void test_temperature_spread( Character *p, const std::array &ambient_temps ) { temperature_check( p, ambient_temps[0], BODYTEMP_FREEZING ); temperature_check( p, ambient_temps[1], BODYTEMP_VERY_COLD ); @@ -59,14 +58,15 @@ static void test_temperature_spread( player *p, const std::array &ambien temperature_check( p, ambient_temps[6], BODYTEMP_SCORCHING ); } -TEST_CASE( "Player body temperatures converge on expected values.", "[.bodytemp]" ) +TEST_CASE( "player body temperatures converge on expected values.", "[.bodytemp]" ) { - player &dummy = get_avatar(); + Character &dummy = get_player_character(); - // Remove first worn item until there are none left. - std::list temp; - while( dummy.takeoff( dummy.i_at( -2 ), &temp ) ) {} + // Strip off any potentially encumbering clothing. + dummy.remove_worn_items_with( []( item & ) { + return true; + } ); // See http://personal.cityu.edu.hk/~bsapplec/heat.htm for temperature basis. // As we aren't modeling metabolic rate, assume 2 METS when not sleeping. diff --git a/tests/point_test.cpp b/tests/point_test.cpp index 596d9c6d103bd..64449971fa390 100644 --- a/tests/point_test.cpp +++ b/tests/point_test.cpp @@ -2,6 +2,7 @@ #include #include "catch/catch.hpp" +#include "coordinates.h" #include "point.h" TEST_CASE( "rectangle_containment", "[point]" ) @@ -65,27 +66,27 @@ TEST_CASE( "tripoint_xy", "[point]" ) CHECK( p.xy() == point( 1, 2 ) ); } -TEST_CASE( "closest_tripoints_first", "[point]" ) +TEST_CASE( "closest_points_first_tripoint", "[point]" ) { const tripoint center = { 1, -1, 2 }; GIVEN( "min_dist > max_dist" ) { - const std::vector result = closest_tripoints_first( center, 1, 0 ); + const std::vector result = closest_points_first( center, 1, 0 ); CHECK( result.empty() ); } GIVEN( "min_dist = max_dist = 0" ) { - const std::vector result = closest_tripoints_first( center, 0, 0 ); + const std::vector result = closest_points_first( center, 0, 0 ); - CHECK( result.size() == 1 ); + REQUIRE( result.size() == 1 ); CHECK( result[0] == tripoint{ 1, -1, 2 } ); } GIVEN( "min_dist = 0, max_dist = 1" ) { - const std::vector result = closest_tripoints_first( center, 0, 1 ); + const std::vector result = closest_points_first( center, 0, 1 ); - CHECK( result.size() == 9 ); + REQUIRE( result.size() == 9 ); CHECK( result[0] == tripoint{ 1, -1, 2 } ); CHECK( result[1] == tripoint{ 2, -1, 2 } ); CHECK( result[2] == tripoint{ 2, 0, 2 } ); @@ -98,9 +99,9 @@ TEST_CASE( "closest_tripoints_first", "[point]" ) } GIVEN( "min_dist = 2, max_dist = 2" ) { - const std::vector result = closest_tripoints_first( center, 2, 2 ); + const std::vector result = closest_points_first( center, 2, 2 ); - CHECK( result.size() == 16 ); + REQUIRE( result.size() == 16 ); CHECK( result[0] == tripoint{ 3, -2, 2 } ); CHECK( result[1] == tripoint{ 3, -1, 2 } ); @@ -120,3 +121,36 @@ TEST_CASE( "closest_tripoints_first", "[point]" ) CHECK( result[15] == tripoint{ 3, -3, 2 } ); } } + +TEST_CASE( "closest_points_first_point_abs_omt", "[point]" ) +{ + const point_abs_omt center( 1, 3 ); + + GIVEN( "min_dist > max_dist" ) { + const std::vector result = closest_points_first( center, 1, 0 ); + + CHECK( result.empty() ); + } + + GIVEN( "min_dist = max_dist = 0" ) { + const std::vector result = closest_points_first( center, 0, 0 ); + + REQUIRE( result.size() == 1 ); + CHECK( result[0].raw() == point{ 1, 3 } ); + } + + GIVEN( "min_dist = 0, max_dist = 1" ) { + const std::vector result = closest_points_first( center, 0, 1 ); + + REQUIRE( result.size() == 9 ); + CHECK( result[0].raw() == point{ 1, 3 } ); + CHECK( result[1].raw() == point{ 2, 3 } ); + CHECK( result[2].raw() == point{ 2, 4 } ); + CHECK( result[3].raw() == point{ 1, 4 } ); + CHECK( result[4].raw() == point{ 0, 4 } ); + CHECK( result[5].raw() == point{ 0, 3 } ); + CHECK( result[6].raw() == point{ 0, 2 } ); + CHECK( result[7].raw() == point{ 1, 2 } ); + CHECK( result[8].raw() == point{ 2, 2 } ); + } +} diff --git a/tests/projectile_test.cpp b/tests/projectile_test.cpp index 8ba6c87fcb0ef..2c4f4dc318ade 100644 --- a/tests/projectile_test.cpp +++ b/tests/projectile_test.cpp @@ -1,7 +1,7 @@ #include "catch/catch.hpp" -#include "avatar.h" #include "ballistics.h" +#include "character.h" #include "dispersion.h" #include "game.h" #include "itype.h" @@ -21,7 +21,9 @@ static tripoint projectile_end_point( const std::vector &range, const dealt_projectile_attack attack; - attack = projectile_attack( test_proj, range[0], range[2], dispersion_sources(), &g->u, nullptr ); + attack = projectile_attack( test_proj, range[0], range[2], dispersion_sources(), + &get_player_character(), + nullptr ); return attack.end_point; } @@ -29,24 +31,25 @@ static tripoint projectile_end_point( const std::vector &range, const TEST_CASE( "projectiles_through_obstacles", "[projectile]" ) { clear_map(); + map &here = get_map(); // Move the player out of the way of the test area - g->u.setpos( { 2, 2, 0 } ); + get_player_character().setpos( { 2, 2, 0 } ); // Ensure that a projectile fired from a gun can pass through a chain link fence // First, set up a test area - three tiles in a row // One on either side clear, with a chainlink fence in the middle std::vector range = { tripoint_zero, tripoint_east, tripoint( 2, 0, 0 ) }; for( const tripoint &pt : range ) { - REQUIRE( g->m.inbounds( pt ) ); - g->m.ter_set( pt, ter_id( "t_dirt" ) ); - g->m.furn_set( pt, furn_id( "f_null" ) ); + REQUIRE( here.inbounds( pt ) ); + here.ter_set( pt, ter_id( "t_dirt" ) ); + here.furn_set( pt, furn_id( "f_null" ) ); REQUIRE_FALSE( g->critter_at( pt ) ); - REQUIRE( g->m.is_transparent( pt ) ); + REQUIRE( here.is_transparent( pt ) ); } // Set an obstacle in the way, a chain fence - g->m.ter_set( range[1], ter_id( "t_chainfence" ) ); + here.ter_set( range[1], ter_id( "t_chainfence" ) ); // Create a gun to fire a projectile from item gun( itype_id( "m1a" ) ); diff --git a/tests/ranged_balance_test.cpp b/tests/ranged_balance_test.cpp index fae734b679735..7c3e00c9dd189 100644 --- a/tests/ranged_balance_test.cpp +++ b/tests/ranged_balance_test.cpp @@ -258,7 +258,7 @@ static void assert_encumbrance( npc &shooter, int encumbrance ) { for( const bodypart_id &bp : shooter.get_all_body_parts() ) { INFO( "Body Part: " << body_part_name( bp ) ); - REQUIRE( shooter.encumb( bp->token ) == encumbrance ); + REQUIRE( shooter.encumb( bp ) == encumbrance ); } } @@ -268,6 +268,7 @@ TEST_CASE( "unskilled_shooter_accuracy", "[ranged] [balance] [slow]" ) { clear_map(); standard_npc shooter( "Shooter", shooter_pos, {}, 0, 8, 8, 8, 7 ); + shooter.set_body(); shooter.worn.push_back( item( "backpack" ) ); equip_shooter( shooter, { "bastsandals", "armguard_chitin", "armor_chitin", "beekeeping_gloves", "fencing_mask" } ); assert_encumbrance( shooter, 10 ); @@ -308,6 +309,7 @@ TEST_CASE( "competent_shooter_accuracy", "[ranged] [balance]" ) { clear_map(); standard_npc shooter( "Shooter", shooter_pos, {}, 5, 10, 10, 10, 10 ); + shooter.set_body(); equip_shooter( shooter, { "cloak_wool", "footrags_wool", "gloves_wraps_fur", "glasses_safety", "balclava" } ); assert_encumbrance( shooter, 5 ); @@ -347,6 +349,7 @@ TEST_CASE( "expert_shooter_accuracy", "[ranged] [balance]" ) { clear_map(); standard_npc shooter( "Shooter", shooter_pos, {}, 10, 20, 20, 20, 20 ); + shooter.set_body(); equip_shooter( shooter, { } ); assert_encumbrance( shooter, 0 ); diff --git a/tests/reading_test.cpp b/tests/reading_test.cpp index e13bb96ad78f3..a1ba79073aef1 100644 --- a/tests/reading_test.cpp +++ b/tests/reading_test.cpp @@ -48,6 +48,7 @@ TEST_CASE( "identifying unread books", "[reading][book][identify]" ) TEST_CASE( "reading a book for fun", "[reading][book][fun]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); GIVEN( "a fun book" ) { @@ -250,6 +251,7 @@ TEST_CASE( "estimated reading time for a book", "[reading][book][time]" ) TEST_CASE( "reasons for not being able to read", "[reading][reasons]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); std::vector reasons; std::vector expect_reasons; diff --git a/tests/reload_option_test.cpp b/tests/reload_option_test.cpp index d427c00432e60..01dafed6d5aec 100644 --- a/tests/reload_option_test.cpp +++ b/tests/reload_option_test.cpp @@ -58,6 +58,7 @@ TEST_CASE( "magazine_reload_option", "[reload],[reload_option],[gun]" ) TEST_CASE( "belt_reload_option", "[reload],[reload_option],[gun]" ) { avatar dummy; + dummy.set_body(); dummy.worn.push_back( item( "backpack" ) ); item &belt = dummy.i_add( item( "belt308", 0, 0 ) ); diff --git a/tests/reloading_test.cpp b/tests/reloading_test.cpp index 2121acd958e12..deab69b37e401 100644 --- a/tests/reloading_test.cpp +++ b/tests/reloading_test.cpp @@ -20,7 +20,7 @@ TEST_CASE( "reload_gun_with_integral_magazine", "[reload],[gun]" ) { - player &dummy = g->u; + player &dummy = get_avatar(); clear_avatar(); // Make sure the player doesn't drop anything :P @@ -41,7 +41,7 @@ TEST_CASE( "reload_gun_with_integral_magazine", "[reload],[gun]" ) TEST_CASE( "reload_gun_with_integral_magazine_using_speedloader", "[reload],[gun]" ) { - player &dummy = g->u; + player &dummy = get_avatar(); clear_avatar(); // Make sure the player doesn't drop anything :P @@ -74,7 +74,7 @@ TEST_CASE( "reload_gun_with_integral_magazine_using_speedloader", "[reload],[gun TEST_CASE( "reload_gun_with_swappable_magazine", "[reload],[gun]" ) { - player &dummy = g->u; + player &dummy = get_avatar(); clear_avatar(); // Make sure the player doesn't drop anything :P @@ -150,7 +150,7 @@ static void reload_a_revolver( player &dummy, item &gun, item &ammo ) TEST_CASE( "automatic_reloading_action", "[reload],[gun]" ) { - player &dummy = g->u; + player &dummy = get_avatar(); clear_avatar(); // Make sure the player doesn't drop anything :P diff --git a/tests/rot_test.cpp b/tests/rot_test.cpp index f7adda96cdb56..8e9438ed128c7 100644 --- a/tests/rot_test.cpp +++ b/tests/rot_test.cpp @@ -37,9 +37,9 @@ TEST_CASE( "Rate of rotting" ) set_map_temperature( 65 ); // 18,3 C - normal_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); - sealed_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); - freeze_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); + normal_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); + sealed_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); + freeze_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); // Item should exist with no rot when it is brand new CHECK( normal_item.get_rot() == 0_turns ); @@ -49,9 +49,9 @@ TEST_CASE( "Rate of rotting" ) INFO( "Initial turn: " << to_turn( calendar::turn ) ); calendar::turn += 20_minutes; - normal_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); - sealed_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); - freeze_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::FREEZER ); + normal_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); + sealed_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); + freeze_item.process( nullptr, tripoint_zero, 1, temperature_flag::FREEZER ); // After 20 minutes the normal item should have 20 minutes of rot CHECK( to_turns( normal_item.get_rot() ) @@ -62,8 +62,8 @@ TEST_CASE( "Rate of rotting" ) // Move time 110 minutes calendar::turn += 110_minutes; - sealed_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::NORMAL ); - freeze_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::FREEZER ); + sealed_item.process( nullptr, tripoint_zero, 1, temperature_flag::NORMAL ); + freeze_item.process( nullptr, tripoint_zero, 1, temperature_flag::FREEZER ); // In freezer and in preserving container still should be no rot CHECK( sealed_item.get_rot() == 0_turns ); CHECK( freeze_item.get_rot() == 0_turns ); @@ -85,7 +85,7 @@ TEST_CASE( "Items rot away" ) item test_item( "meat_cooked" ); // Process item once to set all of its values. - test_item.process( nullptr, tripoint_zero, false, 1, temperature_flag::HEATER ); + test_item.process( nullptr, tripoint_zero, 1, temperature_flag::HEATER ); // Set rot to >2 days and process again. process_temperature_rot should return true. calendar::turn += 20_minutes; diff --git a/tests/simple_pathfinding_test.cpp b/tests/simple_pathfinding_test.cpp new file mode 100644 index 0000000000000..bf028575985dc --- /dev/null +++ b/tests/simple_pathfinding_test.cpp @@ -0,0 +1,31 @@ +#include "catch/catch.hpp" +#include "simple_pathfinding.h" + +#include "coordinates.h" + +template +static void test_path() +{ + Point start; + Point finish( point( 3, 0 ) ); + Point max( point( 10, 10 ) ); + + const auto estimate = + [&]( const pf::node &, const pf::node * ) { + return 1; + }; + + pf::path pth = pf::find_path( start, finish, max, estimate ); + REQUIRE( pth.nodes.size() == 4 ); + CHECK( pth.nodes[3].pos == Point() ); + // NOLINTNEXTLINE(cata-use-named-point-constants) + CHECK( pth.nodes[2].pos == Point( point( 1, 0 ) ) ); + CHECK( pth.nodes[1].pos == Point( point( 2, 0 ) ) ); + CHECK( pth.nodes[0].pos == Point( point( 3, 0 ) ) ); +} + +TEST_CASE( "simple_line_path" ) +{ + test_path(); + test_path(); +} diff --git a/tests/stomach_contents_test.cpp b/tests/stomach_contents_test.cpp index 33c80899df04a..05f0da0ced676 100644 --- a/tests/stomach_contents_test.cpp +++ b/tests/stomach_contents_test.cpp @@ -4,7 +4,6 @@ #include "avatar.h" #include "catch/catch.hpp" #include "calendar.h" -#include "game.h" #include "player.h" #include "player_helpers.h" #include "item.h" @@ -15,13 +14,13 @@ static void reset_time() { calendar::turn = calendar::start_of_cataclysm; - player &p = g->u; - p.set_stored_kcal( p.get_healthy_kcal() ); - p.set_hunger( 0 ); + Character &player_character = get_player_character(); + player_character.set_stored_kcal( player_character.get_healthy_kcal() ); + player_character.set_hunger( 0 ); clear_avatar(); } -static void pass_time( player &p, time_duration amt ) +static void pass_time( Character &p, time_duration amt ) { for( auto turns = 1_turns; turns < amt; turns += 1_turns ) { calendar::turn += 1_turns; @@ -29,13 +28,13 @@ static void pass_time( player &p, time_duration amt ) } } -static void clear_stomach( player &p ) +static void clear_stomach( Character &p ) { p.stomach.empty(); p.guts.empty(); } -static void set_all_vitamins( int target, player &p ) +static void set_all_vitamins( int target, Character &p ) { p.vitamin_set( vitamin_id( "vitA" ), target ); p.vitamin_set( vitamin_id( "vitB" ), target ); @@ -46,7 +45,7 @@ static void set_all_vitamins( int target, player &p ) // time (in minutes) it takes for the player to feel hungry // passes time on the calendar -static time_duration time_until_hungry( player &p ) +static time_duration time_until_hungry( Character &p ) { unsigned int thirty_minutes = 0; do { @@ -58,7 +57,7 @@ static time_duration time_until_hungry( player &p ) return thirty_minutes * 30_minutes; } -static void print_stomach_contents( player &p, const bool print ) +static void print_stomach_contents( Character &p, const bool print ) { if( !print ) { return; @@ -87,7 +86,7 @@ static void eat_all_nutrients( player &p ) // player does not thirst or tire or require vitamins TEST_CASE( "starve_test", "[starve][slow]" ) { - player &dummy = g->u; + Character &dummy = get_player_character(); reset_time(); clear_stomach( dummy ); @@ -125,7 +124,7 @@ TEST_CASE( "starve_test", "[starve][slow]" ) // player does not thirst or tire or require vitamins TEST_CASE( "starve_test_hunger3", "[starve][slow]" ) { - player &dummy = g->u; + Character &dummy = get_player_character(); reset_time(); clear_stomach( dummy ); while( !( dummy.has_trait( trait_id( "HUNGER3" ) ) ) ) { @@ -164,7 +163,7 @@ TEST_CASE( "all_nutrition_starve_test", "[starve][slow]" ) { // change this bool when editing the test const bool print_tests = false; - player &dummy = g->u; + avatar &dummy = get_avatar(); reset_time(); clear_stomach( dummy ); eat_all_nutrients( dummy ); @@ -205,7 +204,7 @@ TEST_CASE( "tape_worm_halves_nutrients" ) { const efftype_id effect_tapeworm( "tapeworm" ); const bool print_tests = false; - player &dummy = g->u; + avatar &dummy = get_avatar(); reset_time(); clear_stomach( dummy ); eat_all_nutrients( dummy ); @@ -225,7 +224,7 @@ TEST_CASE( "hunger" ) { // change this bool when editing the test const bool print_tests = false; - player &dummy = g->u; + avatar &dummy = get_avatar(); reset_time(); clear_stomach( dummy ); dummy.initialize_stomach_contents(); @@ -268,8 +267,8 @@ TEST_CASE( "hunger" ) if( print_tests ) { printf( "%d minutes til hunger sets in\n", hunger_time ); } - CHECK( hunger_time <= 435 ); - CHECK( hunger_time >= 405 ); + CHECK( hunger_time <= 285 ); + CHECK( hunger_time >= 255 ); if( print_tests ) { print_stomach_contents( dummy, print_tests ); printf( "eat 16 veggy\n" ); diff --git a/tests/string_formatter_test.cpp b/tests/string_formatter_test.cpp index 001a83c06e95d..3ddf328dc156e 100644 --- a/tests/string_formatter_test.cpp +++ b/tests/string_formatter_test.cpp @@ -100,7 +100,10 @@ void mingw_test( const char *const old_pattern, const char *const new_pattern, c CHECK( original_result == new_result ); } -TEST_CASE( "string_formatter" ) +// Marking mayfail due to failure in Appveyor. Looks like a bug in the Visual +// Studio runtime libraries. Once that failure stops showing up on Appveyor, +// this can cease to be marked thus. +TEST_CASE( "string_formatter", "[!mayfail]" ) { test_typed_printf( "%hhi", "%i" ); test_typed_printf( "%hhu", "%u" ); @@ -144,19 +147,8 @@ TEST_CASE( "string_formatter" ) #pragma GCC diagnostic pop test_new_old_pattern( "%6$-*5$.*4$f%3$s%2$s%1$s", "%6$-*5$.*4$f", "", "", "", 7, 4, 100.44 ); } - CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3 ) ); - CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3, 4 ) ); - CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3, 4, 5 ) ); - - // invalid format specifier - CHECK_THROWS( test_for_error( "%k" ) ); - // can't print a void pointer - CHECK_THROWS( test_for_error( "%s", static_cast( nullptr ) ) ); - CHECK_THROWS( test_for_error( "%d", static_cast( nullptr ) ) ); - CHECK_THROWS( test_for_error( "%d", "some string" ) ); test_for_expected( "", "", "whatever", 5, 0.4 ); - CHECK_THROWS( test_for_error( "%d %d %d %d %d", 1, 2, 3, 4 ) ); test_for_expected( "1 2 3 4 5", "%d %d %d %d %d", 1, 2, 3, 4, 5 ); // test automatic type conversion @@ -570,3 +562,19 @@ TEST_CASE( "string_formatter" ) importet_test( 414, "1234ABCD ", "% -+0*.*X", 20, 5, 305441741 ); importet_test( 415, "00EDCB5433 ", "% -+0*.*X", 20, 10, 3989525555U ); } + +TEST_CASE( "string_formatter_errors" ) +{ + CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3 ) ); + CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3, 4 ) ); + CHECK_THROWS( test_for_error( "%6$-*5$.*4$f", 1, 2, 3, 4, 5 ) ); + + // invalid format specifier + CHECK_THROWS( test_for_error( "%k" ) ); + // can't print a void pointer + CHECK_THROWS( test_for_error( "%s", static_cast( nullptr ) ) ); + CHECK_THROWS( test_for_error( "%d", static_cast( nullptr ) ) ); + CHECK_THROWS( test_for_error( "%d", "some string" ) ); + + CHECK_THROWS( test_for_error( "%d %d %d %d %d", 1, 2, 3, 4 ) ); +} diff --git a/tests/stringmaker.h b/tests/stringmaker.h index f65d7fc3c2450..bf8cf7521a5dd 100644 --- a/tests/stringmaker.h +++ b/tests/stringmaker.h @@ -26,6 +26,13 @@ struct StringMaker { } }; +template<> +struct StringMaker { + static std::string convert( const point &p ) { + return string_format( "point( %d, %d )", p.x, p.y ); + } +}; + template<> struct StringMaker { static std::string convert( const rectangle &r ) { diff --git a/tests/test_main.cpp b/tests/test_main.cpp index f0ff30227e652..758a99316668b 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -141,17 +141,17 @@ static void init_global_game_state( const std::vector &mods, g->load_core_data( ui ); g->load_world_modfiles( ui ); - g->u = avatar(); - g->u.create( character_type::NOW ); + get_avatar() = avatar(); + get_avatar().create( character_type::NOW ); - g->m = map( get_option( "ZLEVELS" ) ); + get_map() = map(); overmap_special_batch empty_specials( point_zero ); overmap_buffer.create_custom_overmap( point_zero, empty_specials ); - g->m.load( tripoint( g->get_levx(), g->get_levy(), g->get_levz() ), false ); + get_map().load( tripoint( g->get_levx(), g->get_levy(), g->get_levz() ), false ); - g->weather.update_weather(); + get_weather().update_weather(); } // Checks if any of the flags are in container, removes them all diff --git a/tests/throwing_test.cpp b/tests/throwing_test.cpp index 15eca333b61e8..dc0e71d15bcb6 100644 --- a/tests/throwing_test.cpp +++ b/tests/throwing_test.cpp @@ -55,7 +55,7 @@ static std::ostream &operator<<( std::ostream &stream, const throw_test_pstats & static const skill_id skill_throw = skill_id( "throw" ); -static void reset_player( player &p, const throw_test_pstats &pstats, const tripoint &pos ) +static void reset_player( Character &p, const throw_test_pstats &pstats, const tripoint &pos ) { p.reset(); p.set_stamina( p.get_stamina_max() ); @@ -171,7 +171,7 @@ constexpr throw_test_pstats hi_skill_athlete_stats = { MAX_SKILL, 12, 12, 12 }; TEST_CASE( "basic_throwing_sanity_tests", "[throwing],[balance]" ) { - player &p = g->u; + avatar &p = get_avatar(); clear_map(); SECTION( "test_player_vs_zombie_rock_basestats" ) { @@ -216,7 +216,7 @@ TEST_CASE( "basic_throwing_sanity_tests", "[throwing],[balance]" ) TEST_CASE( "throwing_skill_impact_test", "[throwing],[balance]" ) { - player &p = g->u; + avatar &p = get_avatar(); clear_map(); // we already cover low stats in the sanity tests and we only cover a few @@ -304,7 +304,7 @@ static void test_player_kills_monster( TEST_CASE( "player_kills_zombie_before_reach", "[throwing],[balance][scenario]" ) { - player &p = g->u; + avatar &p = get_avatar(); clear_map(); SECTION( "test_player_kills_zombie_with_rock_basestats" ) { @@ -315,7 +315,7 @@ TEST_CASE( "player_kills_zombie_before_reach", "[throwing],[balance][scenario]" int throw_cost( const player &c, const item &to_throw ); TEST_CASE( "time_to_throw_independent_of_number_of_projectiles", "[throwing],[balance]" ) { - player &p = g->u; + player &p = get_avatar(); clear_avatar(); item thrown( "throwing_stick", calendar::turn, 10 ); diff --git a/tests/vehicle_drag_test.cpp b/tests/vehicle_drag_test.cpp index d749fb75c1498..a7268479d814e 100644 --- a/tests/vehicle_drag_test.cpp +++ b/tests/vehicle_drag_test.cpp @@ -3,11 +3,10 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" #include "catch/catch.hpp" -#include "game.h" +#include "character.h" #include "map.h" #include "map_helpers.h" #include "point.h" @@ -28,26 +27,28 @@ static void clear_game_drag( const ter_id &terrain ) clear_creatures(); clear_npcs(); + Character &player_character = get_player_character(); // Move player somewhere safe - CHECK( !g->u.in_vehicle ); - g->u.setpos( tripoint_zero ); + CHECK( !player_character.in_vehicle ); + player_character.setpos( tripoint_zero ); // Blind the player to avoid needless drawing-related overhead - g->u.add_effect( effect_blind, 1_turns, num_bp, true ); + player_character.add_effect( effect_blind, 1_turns, num_bp, true ); // Make sure the ST is 8 so that muscle powered results are consistent - g->u.str_cur = 8; + player_character.str_cur = 8; build_test_map( terrain ); + map &here = get_map(); // hard force a rebuild of caches - g->m.shift( point_south ); - g->m.shift( point_north ); + here.shift( point_south ); + here.shift( point_north ); } static vehicle *setup_drag_test( const vproto_id &veh_id ) { clear_vehicles(); const tripoint map_starting_point( 60, 60, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( veh_id, map_starting_point, -90, 0, 0 ); + vehicle *veh_ptr = get_map().add_vehicle( veh_id, map_starting_point, -90, 0, 0 ); REQUIRE( veh_ptr != nullptr ); if( veh_ptr == nullptr ) { diff --git a/tests/vehicle_efficiency_test.cpp b/tests/vehicle_efficiency_test.cpp index 50437ff9686d0..f3256deb70031 100644 --- a/tests/vehicle_efficiency_test.cpp +++ b/tests/vehicle_efficiency_test.cpp @@ -10,10 +10,10 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" #include "catch/catch.hpp" +#include "character.h" #include "enums.h" #include "game.h" #include "item.h" @@ -42,11 +42,12 @@ static void clear_game( const ter_id &terrain ) clear_npcs(); clear_vehicles(); + Character &player_character = get_player_character(); // Move player somewhere safe - REQUIRE_FALSE( g->u.in_vehicle ); - g->u.setpos( tripoint_zero ); + REQUIRE_FALSE( player_character.in_vehicle ); + player_character.setpos( tripoint_zero ); // Blind the player to avoid needless drawing-related overhead - g->u.add_effect( effect_blind, 1_turns, num_bp, true ); + player_character.add_effect( effect_blind, 1_turns, num_bp, true ); build_test_map( terrain ); } @@ -171,7 +172,8 @@ static int test_efficiency( const vproto_id &veh_id, int &expected_mass, clear_game( terrain ); const tripoint map_starting_point( 60, 60, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( veh_id, map_starting_point, -90, 0, 0 ); + map &here = get_map(); + vehicle *veh_ptr = here.add_vehicle( veh_id, map_starting_point, -90, 0, 0 ); REQUIRE( veh_ptr != nullptr ); if( veh_ptr == nullptr ) { @@ -221,18 +223,18 @@ static int test_efficiency( const vproto_id &veh_id, int &expected_mass, CHECK( veh.safe_velocity() > 0 ); while( veh.engine_on && veh.safe_velocity() > 0 && cycles_left > 0 ) { cycles_left--; - g->m.vehmove(); + here.vehmove(); veh.idle( true ); // If the vehicle starts skidding, the effects become random and test is RUINED REQUIRE( !veh.skidding ); for( const tripoint &pos : veh.get_points() ) { - REQUIRE( g->m.ter( pos ) ); + REQUIRE( here.ter( pos ) ); } // How much it moved tiles_travelled += square_dist( starting_point, veh.global_pos3() ); // Bring it back to starting point to prevent it from leaving the map const tripoint displacement = starting_point - veh.global_pos3(); - g->m.displace_vehicle( veh, displacement ); + here.displace_vehicle( veh, displacement ); if( reset_velocity_turn < 0 ) { continue; } @@ -430,7 +432,7 @@ TEST_CASE( "vehicle_efficiency", "[vehicle] [engine]" ) test_vehicle( "truck_swat", 5959334, 483800, 322700, 29610, 7604 ); test_vehicle( "tractor_plow", 723658, 482400, 482400, 113900, 113900 ); test_vehicle( "apc", 5801619, 1069000, 922400, 130800, 85590 ); - test_vehicle( "humvee", 5503245, 574300, 325900, 25620, 9171 ); + test_vehicle( "humvee", 5503345, 574300, 325900, 25620, 9171 ); test_vehicle( "road_roller", 8829220, 357200, 380200, 22760, 6925 ); test_vehicle( "golf_cart", 444630, 52460, 105500, 27250, 14200 ); } diff --git a/tests/vehicle_interact_test.cpp b/tests/vehicle_interact_test.cpp index 4caaaeb294134..93add711f3688 100644 --- a/tests/vehicle_interact_test.cpp +++ b/tests/vehicle_interact_test.cpp @@ -2,10 +2,9 @@ #include #include -#include "avatar.h" #include "calendar.h" #include "catch/catch.hpp" -#include "game.h" +#include "character.h" #include "inventory.h" #include "item.h" #include "map.h" @@ -23,15 +22,16 @@ static void test_repair( const std::vector &tools, bool expect_craftable ) clear_map(); const tripoint test_origin( 60, 60, 0 ); - g->u.setpos( test_origin ); + Character &player_character = get_player_character(); + player_character.setpos( test_origin ); const item backpack( "backpack" ); - g->u.wear( g->u.i_add( backpack ), false ); + player_character.wear_item( backpack ); for( const item &gear : tools ) { - g->u.i_add( gear ); + player_character.i_add( gear ); } const tripoint vehicle_origin = test_origin + tripoint_south_east; - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); + vehicle *veh_ptr = get_map().add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); REQUIRE( veh_ptr != nullptr ); // Find the frame at the origin. vehicle_part *origin_frame = nullptr; @@ -51,10 +51,11 @@ static void test_repair( const std::vector &tools, bool expect_craftable ) requirement_data reqs = vp.repair_requirements(); // Bust cache on crafting_inventory() - g->u.mod_moves( 1 ); - inventory crafting_inv = g->u.crafting_inventory(); - bool can_repair = vp.repair_requirements().can_make_with_inventory( g->u.crafting_inventory(), - is_crafting_component ); + player_character.mod_moves( 1 ); + inventory crafting_inv = player_character.crafting_inventory(); + bool can_repair = vp.repair_requirements().can_make_with_inventory( + player_character.crafting_inventory(), + is_crafting_component ); CHECK( can_repair == expect_craftable ); } diff --git a/tests/vehicle_power_test.cpp b/tests/vehicle_power_test.cpp index c51da30ba6bd8..f069d3ba1a01f 100644 --- a/tests/vehicle_power_test.cpp +++ b/tests/vehicle_power_test.cpp @@ -2,11 +2,10 @@ #include #include -#include "avatar.h" #include "bodypart.h" #include "calendar.h" #include "catch/catch.hpp" -#include "game.h" +#include "character.h" #include "map.h" #include "map_helpers.h" #include "point.h" @@ -18,13 +17,15 @@ static const itype_id fuel_type_battery( "battery" ); static const itype_id fuel_type_plut_cell( "plut_cell" ); static const efftype_id effect_blind( "blind" ); +// TODO: Move this into player_helpers to avoid character include. static void reset_player() { + Character &player_character = get_player_character(); // Move player somewhere safe - REQUIRE( !g->u.in_vehicle ); - g->u.setpos( tripoint_zero ); + REQUIRE( !player_character.in_vehicle ); + player_character.setpos( tripoint_zero ); // Blind the player to avoid needless drawing-related overhead - g->u.add_effect( effect_blind, 1_turns, num_bp, true ); + player_character.add_effect( effect_blind, 1_turns, num_bp, true ); } TEST_CASE( "vehicle power with reactor and solar panels", "[vehicle][power]" ) @@ -32,10 +33,11 @@ TEST_CASE( "vehicle power with reactor and solar panels", "[vehicle][power]" ) reset_player(); build_test_map( ter_id( "t_pavement" ) ); clear_vehicles(); + map &here = get_map(); SECTION( "vehicle with reactor" ) { const tripoint reactor_origin = tripoint( 10, 10, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "reactor_test" ), reactor_origin, 0, 0, 0 ); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "reactor_test" ), reactor_origin, 0, 0, 0 ); REQUIRE( veh_ptr != nullptr ); REQUIRE( !veh_ptr->reactors.empty() ); @@ -63,14 +65,14 @@ TEST_CASE( "vehicle power with reactor and solar panels", "[vehicle][power]" ) SECTION( "vehicle with solar panels" ) { const tripoint solar_origin = tripoint( 5, 5, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "solar_panel_test" ), solar_origin, 0, 0, 0 ); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "solar_panel_test" ), solar_origin, 0, 0, 0 ); REQUIRE( veh_ptr != nullptr ); GIVEN( "it is 3 hours after sunrise, with sunny weather" ) { calendar::turn = calendar::turn_zero + calendar::season_length() + 1_days; const time_point start_time = sunrise( calendar::turn ) + 3_hours; veh_ptr->update_time( start_time ); - g->weather.weather_override = WEATHER_SUNNY; + get_weather().weather_override = weather_type_id( "sunny" ); AND_GIVEN( "the battery has no charge" ) { veh_ptr->discharge_battery( veh_ptr->fuel_left( fuel_type_battery ) ); @@ -100,7 +102,7 @@ TEST_CASE( "vehicle power with reactor and solar panels", "[vehicle][power]" ) GIVEN( "it is 3 hours after sunset, with clear weather" ) { const time_point at_night = sunset( calendar::turn ) + 3_hours; - g->weather.weather_override = WEATHER_CLEAR; + get_weather().weather_override = WEATHER_CLEAR; veh_ptr->update_time( at_night ); AND_GIVEN( "the battery has no charge" ) { @@ -124,10 +126,11 @@ TEST_CASE( "maximum reverse velocity", "[vehicle][power][reverse]" ) reset_player(); build_test_map( ter_id( "t_pavement" ) ); clear_vehicles(); + map &here = get_map(); GIVEN( "a scooter with combustion engine and charged battery" ) { const tripoint origin = tripoint( 10, 0, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "scooter_test" ), origin, 0, 0, 0 ); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "scooter_test" ), origin, 0, 0, 0 ); REQUIRE( veh_ptr != nullptr ); veh_ptr->charge_battery( 500 ); REQUIRE( veh_ptr->fuel_left( fuel_type_battery ) == 500 ); @@ -152,7 +155,7 @@ TEST_CASE( "maximum reverse velocity", "[vehicle][power][reverse]" ) GIVEN( "a scooter with an electric motor and charged battery" ) { const tripoint origin = tripoint( 15, 0, 0 ); - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "scooter_electric_test" ), origin, 0, 0, 0 ); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "scooter_electric_test" ), origin, 0, 0, 0 ); REQUIRE( veh_ptr != nullptr ); veh_ptr->charge_battery( 5000 ); REQUIRE( veh_ptr->fuel_left( fuel_type_battery ) == 5000 ); diff --git a/tests/vehicle_ramp_test.cpp b/tests/vehicle_ramp_test.cpp new file mode 100644 index 0000000000000..7c44124012c66 --- /dev/null +++ b/tests/vehicle_ramp_test.cpp @@ -0,0 +1,328 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "avatar.h" +#include "catch/catch.hpp" +#include "itype.h" +#include "map.h" +#include "map_helpers.h" +#include "map_iterator.h" +#include "veh_type.h" +#include "vehicle.h" +#include "vpart_range.h" +#include "bodypart.h" +#include "calendar.h" +#include "enums.h" +#include "game.h" +#include "game_constants.h" +#include "item.h" +#include "line.h" +#include "mapdata.h" +#include "map_helpers.h" +#include "monster.h" +#include "mtype.h" +#include "units.h" +#include "type_id.h" +#include "point.h" +#include "vpart_position.h" +#include "player_helpers.h" +#include "map_helpers.h" + +static const efftype_id effect_blind( "blind" ); + +static void clear_game_and_set_ramp( const int transit_x, bool use_ramp, bool up ) +{ + // Set to turn 0 to prevent solars from producing power + calendar::turn = 0; + clear_creatures(); + clear_npcs(); + clear_vehicles(); + + Character &player_character = get_player_character(); + // Move player somewhere safe + REQUIRE_FALSE( player_character.in_vehicle ); + player_character.setpos( tripoint_zero ); + // Blind the player to avoid needless drawing-related overhead + //player_character.add_effect( effect_blind, 1_turns, num_bp, true ); + + map &here = get_map(); + wipe_map_terrain(); + build_test_map( ter_id( "t_pavement" ) ); + if( use_ramp ) { + const int upper_zlevel = up ? 1 : 0; + const int lower_zlevel = up - 1; + const int highx = transit_x + ( up ? 0 : 1 ); + const int lowx = transit_x + ( up ? 1 : 0 ); + + // up z1 ...... rdh rDl + // z0 rUh rul ................. + // down z0 rDl rdh ................. + // z-1 ...... rdl rUh + // 60 61 + for( int y = 0; y < SEEY * MAPSIZE; y++ ) { + for( int x = 0; x < transit_x; x++ ) { + const int mid = up ? upper_zlevel : lower_zlevel; + here.ter_set( tripoint( x, y, mid - 2 ), ter_id( "t_rock" ) ); + here.ter_set( tripoint( x, y, mid - 1 ), ter_id( "t_rock" ) ); + here.ter_set( tripoint( x, y, mid ), ter_id( "t_pavement" ) ); + here.ter_set( tripoint( x, y, mid + 1 ), ter_id( "t_open_air" ) ); + here.ter_set( tripoint( x, y, mid + 2 ), ter_id( "t_open_air" ) ); + } + const tripoint ramp_up_low = tripoint( lowx, y, lower_zlevel ); + const tripoint ramp_up_high = tripoint( highx, y, lower_zlevel ); + const tripoint ramp_down_low = tripoint( lowx, y, upper_zlevel ); + const tripoint ramp_down_high = tripoint( highx, y, upper_zlevel ); + here.ter_set( ramp_up_low, ter_id( "t_ramp_up_low" ) ); + here.ter_set( ramp_up_high, ter_id( "t_ramp_up_high" ) ); + here.ter_set( ramp_down_low, ter_id( "t_ramp_down_low" ) ); + here.ter_set( ramp_down_high, ter_id( "t_ramp_down_high" ) ); + for( int x = transit_x + 2; x < SEEX * MAPSIZE; x++ ) { + here.ter_set( tripoint( x, y, 1 ), ter_id( "t_open_air" ) ); + here.ter_set( tripoint( x, y, 0 ), ter_id( "t_pavement" ) ); + here.ter_set( tripoint( x, y, -1 ), ter_id( "t_rock" ) ); + } + } + } + here.invalidate_map_cache( 0 ); + here.build_map_cache( 0, true ); +} + +// Algorithm goes as follows: +// Clear map and create a ramp +// Spawn a vehicle +// Drive it over the ramp, and confirm that the vehicle changes z-levels +static void ramp_transition_angled( const vproto_id &veh_id, const int angle, + const int transition_x, bool use_ramp, bool up ) +{ + map &here = get_map(); + clear_game_and_set_ramp( transition_x, use_ramp, up ); + + const tripoint map_starting_point( transition_x + 4, 60, 0 ); + REQUIRE( here.ter( map_starting_point ) == ter_id( "t_pavement" ) ); + if( here.ter( map_starting_point ) != ter_id( "t_pavement" ) ) { + return; + } + vehicle *veh_ptr = here.add_vehicle( veh_id, map_starting_point, angle, 1, 0 ); + + REQUIRE( veh_ptr != nullptr ); + if( veh_ptr == nullptr ) { + return; + } + + vehicle &veh = *veh_ptr; + veh.check_falling_or_floating(); + + REQUIRE( !veh.is_in_water() ); + + veh.tags.insert( "IN_CONTROL_OVERRIDE" ); + veh.engine_on = true; + Character &player_character = get_player_character(); + player_character.setpos( map_starting_point ); + + REQUIRE( player_character.pos() == map_starting_point ); + if( player_character.pos() != map_starting_point ) { + return; + } + get_map().board_vehicle( map_starting_point, &player_character ); + REQUIRE( player_character.pos() == map_starting_point ); + if( player_character.pos() != map_starting_point ) { + return; + } + const int transition_cycle = 3; + veh.cruise_velocity = 0; + veh.velocity = 0; + here.vehmove(); + + const int target_velocity = 400; + veh.cruise_velocity = target_velocity; + veh.velocity = target_velocity; + CHECK( veh.safe_velocity() > 0 ); + int cycles = 0; + const int target_z = use_ramp ? ( up ? 1 : -1 ) : 0; + + std::set vpts = veh.get_points(); + while( veh.engine_on && veh.safe_velocity() > 0 && cycles < 10 ) { + for( const tripoint &checkpt : vpts ) { + int partnum = 0; + vehicle *check_veh = here.veh_at_internal( checkpt, partnum ); + CHECK( check_veh == veh_ptr ); + } + vpts.clear(); + here.vehmove(); + // If the vehicle starts skidding, the effects become random and test is RUINED + REQUIRE( !veh.skidding ); + for( const tripoint &pos : veh.get_points() ) { + REQUIRE( here.ter( pos ) ); + } + for( const vpart_reference &vp : veh.get_all_parts() ) { + if( vp.info().location != "structure" ) { + continue; + } + const point &pmount = vp.mount(); + const tripoint &ppos = vp.pos(); + if( cycles > ( transition_cycle - pmount.x ) ) { + CHECK( ppos.z == target_z ); + } else { + CHECK( ppos.z == 0 ); + } + if( pmount.x == 0 && pmount.y == 0 ) { + CHECK( player_character.pos() == ppos ); + } + } + vpts = veh.get_points(); + cycles++; + } + const cata::optional vp = here.veh_at( player_character.pos() ).part_with_feature( + VPFLAG_BOARDABLE, true ); + REQUIRE( vp ); + if( vp ) { + const int z_change = map_starting_point.z - player_character.pos().z; + here.unboard_vehicle( *vp, &player_character, false ); + here.ter_set( map_starting_point, ter_id( "t_pavement" ) ); + player_character.setpos( map_starting_point ); + if( z_change ) { + g->vertical_move( z_change, true ); + } + } +} + +static void test_ramp( std::string type, const int transition_x ) +{ + SECTION( type + " no ramp" ) { + ramp_transition_angled( vproto_id( type ), 180, transition_x, false, false ); + } + SECTION( type + " ramp up" ) { + ramp_transition_angled( vproto_id( type ), 180, transition_x, true, true ); + } + SECTION( type + " ramp down" ) { + ramp_transition_angled( vproto_id( type ), 180, transition_x, true, false ); + } + SECTION( type + " angled no ramp" ) { + ramp_transition_angled( vproto_id( type ), 225, transition_x, false, false ); + } + SECTION( type + " angled ramp down" ) { + ramp_transition_angled( vproto_id( type ), 225, transition_x, true, false ); + } + SECTION( type + " angled ramp up" ) { + ramp_transition_angled( vproto_id( type ), 225, transition_x, true, true ); + } +} + +static std::vector ramp_vehs_to_test = {{ + "motorcycle", + } +}; + +// I'd like to do this in a single loop, but that doesn't work for some reason +TEST_CASE( "vehicle_ramp_test_59", "[vehicle][ramp]" ) +{ + for( const std::string &veh : ramp_vehs_to_test ) { + test_ramp( veh, 59 ); + } +} +TEST_CASE( "vehicle_ramp_test_60", "[vehicle][ramp]" ) +{ + for( const std::string &veh : ramp_vehs_to_test ) { + test_ramp( veh, 60 ); + } +} +TEST_CASE( "vehicle_ramp_test_61", "[vehicle][ramp]" ) +{ + for( const std::string &veh : ramp_vehs_to_test ) { + test_ramp( veh, 61 ); + } +} + +static void level_out( const vproto_id &veh_id, const bool drop_pos ) +{ + map &here = get_map(); + clear_game_and_set_ramp( 75, drop_pos, false ); + const int start_z = drop_pos ? 1 : 0; + + const tripoint map_starting_point( 60, 60, start_z ); + vehicle *veh_ptr = here.add_vehicle( veh_id, map_starting_point, 180, 1, 0 ); + + REQUIRE( veh_ptr != nullptr ); + if( veh_ptr == nullptr ) { + return; + } + vehicle &veh = *veh_ptr; + veh.check_falling_or_floating(); + + REQUIRE( !veh.is_in_water() ); + + veh.tags.insert( "IN_CONTROL_OVERRIDE" ); + veh.engine_on = true; + + const int target_velocity = 800; + veh.cruise_velocity = target_velocity; + veh.velocity = target_velocity; + CHECK( veh.safe_velocity() > 0 ); + + std::vector all_parts; + for( const tripoint &pos : veh.get_points() ) { + for( vehicle_part *prt : veh.get_parts_at( pos, "", part_status_flag::any ) ) { + all_parts.push_back( prt ); + if( drop_pos && prt->mount.x < 0 ) { + prt->precalc[0].z = -1; + prt->precalc[1].z = -1; + } else if( !drop_pos && prt->mount.x > 1 ) { + prt->precalc[0].z = 1; + prt->precalc[1].z = 1; + } + } + } + std::set z_span; + for( vehicle_part *prt : all_parts ) { + z_span.insert( veh.global_part_pos3( *prt ).z ); + } + REQUIRE( z_span.size() > 1 ); + + monster *dmon_p = g->place_critter_at( mtype_id( "debug_mon" ), map_starting_point ); + monster &dmon = *dmon_p; + + for( int y = 0; y < SEEY * MAPSIZE; y++ ) { + for( int x = 0; x < SEEX * MAPSIZE; x++ ) { + here.ter_set( tripoint( x, y, 1 ), ter_id( "t_open_air" ) ); + here.ter_set( tripoint( x, y, 0 ), ter_id( "t_pavement" ) ); + } + } + + here.vehmove(); + for( vehicle_part *prt : all_parts ) { + CHECK( veh.global_part_pos3( *prt ).z == 0 ); + } + CHECK( dmon.posz() == 0 ); + CHECK( veh.global_pos3().z == 0 ); +} + +static void test_leveling( std::string type ) +{ + SECTION( type + " body drop" ) { + level_out( vproto_id( type ), true ); + } + SECTION( type + " edge drop" ) { + level_out( vproto_id( type ), false ); + } +} + +static std::vector level_vehs_to_test = {{ + "beetle", + } +}; + +TEST_CASE( "vehicle_level_test", "[vehicle][ramp]" ) +{ + for( const std::string &veh : level_vehs_to_test ) { + test_leveling( veh ); + } +} diff --git a/tests/vehicle_split_test.cpp b/tests/vehicle_split_test.cpp index 3a615b43603c2..de96ec8412166 100644 --- a/tests/vehicle_split_test.cpp +++ b/tests/vehicle_split_test.cpp @@ -2,9 +2,8 @@ #include #include -#include "avatar.h" #include "catch/catch.hpp" -#include "game.h" +#include "character.h" #include "map.h" #include "vehicle.h" #include "type_id.h" @@ -12,26 +11,28 @@ TEST_CASE( "vehicle_split_section" ) { + map &here = get_map(); + Character &player_character = get_player_character(); for( int dir = 0; dir < 360; dir += 15 ) { - CHECK( !g->u.in_vehicle ); + CHECK( !player_character.in_vehicle ); const tripoint test_origin( 15, 15, 0 ); - g->u.setpos( test_origin ); + player_character.setpos( test_origin ); tripoint vehicle_origin = tripoint( 10, 10, 0 ); - VehicleList vehs = g->m.get_vehicles(); + VehicleList vehs = here.get_vehicles(); vehicle *veh_ptr; for( auto &vehs_v : vehs ) { veh_ptr = vehs_v.v; - g->m.destroy_vehicle( veh_ptr ); + here.destroy_vehicle( veh_ptr ); } - REQUIRE( g->m.get_vehicles().empty() ); - veh_ptr = g->m.add_vehicle( vproto_id( "cross_split_test" ), vehicle_origin, dir, 0, 0 ); + REQUIRE( here.get_vehicles().empty() ); + veh_ptr = here.add_vehicle( vproto_id( "cross_split_test" ), vehicle_origin, dir, 0, 0 ); REQUIRE( veh_ptr != nullptr ); std::set original_points = veh_ptr->get_points( true ); - g->m.destroy( vehicle_origin ); + here.destroy( vehicle_origin ); veh_ptr->part_removal_cleanup(); REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() ); - vehs = g->m.get_vehicles(); + vehs = here.get_vehicles(); // destroying the center frame results in 4 new vehicles CHECK( vehs.size() == 4 ); if( vehs.size() == 4 ) { @@ -59,19 +60,19 @@ TEST_CASE( "vehicle_split_section" ) } } } - g->m.destroy_vehicle( vehs[ 3 ].v ); - g->m.destroy_vehicle( vehs[ 2 ].v ); - g->m.destroy_vehicle( vehs[ 1 ].v ); - g->m.destroy_vehicle( vehs[ 0 ].v ); + here.destroy_vehicle( vehs[ 3 ].v ); + here.destroy_vehicle( vehs[ 2 ].v ); + here.destroy_vehicle( vehs[ 1 ].v ); + here.destroy_vehicle( vehs[ 0 ].v ); } - REQUIRE( g->m.get_vehicles().empty() ); + REQUIRE( here.get_vehicles().empty() ); vehicle_origin = tripoint( 20, 20, 0 ); - veh_ptr = g->m.add_vehicle( vproto_id( "circle_split_test" ), vehicle_origin, dir, 0, 0 ); + veh_ptr = here.add_vehicle( vproto_id( "circle_split_test" ), vehicle_origin, dir, 0, 0 ); REQUIRE( veh_ptr != nullptr ); - g->m.destroy( vehicle_origin ); + here.destroy( vehicle_origin ); veh_ptr->part_removal_cleanup(); REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() ); - vehs = g->m.get_vehicles(); + vehs = here.get_vehicles(); CHECK( vehs.size() == 1 ); if( vehs.size() == 1 ) { CHECK( vehs[ 0 ].v->part_count() == 38 ); diff --git a/tests/vehicle_test.cpp b/tests/vehicle_test.cpp index b2e255bb83729..c6c5b63e0d31f 100644 --- a/tests/vehicle_test.cpp +++ b/tests/vehicle_test.cpp @@ -5,7 +5,6 @@ #include "catch/catch.hpp" #include "damage.h" #include "enums.h" -#include "game.h" #include "item.h" #include "map.h" #include "map_helpers.h" @@ -19,31 +18,35 @@ TEST_CASE( "detaching_vehicle_unboards_passengers" ) clear_map(); const tripoint test_origin( 60, 60, 0 ); const tripoint vehicle_origin = test_origin; - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); - g->m.board_vehicle( test_origin, &g->u ); - REQUIRE( g->u.in_vehicle ); - g->m.detach_vehicle( veh_ptr ); - REQUIRE( !g->u.in_vehicle ); + map &here = get_map(); + Character &player_character = get_player_character(); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); + here.board_vehicle( test_origin, &player_character ); + REQUIRE( player_character.in_vehicle ); + here.detach_vehicle( veh_ptr ); + REQUIRE( !player_character.in_vehicle ); } TEST_CASE( "destroy_grabbed_vehicle_section" ) { GIVEN( "A vehicle grabbed by the player" ) { + map &here = get_map(); const tripoint test_origin( 60, 60, 0 ); - g->place_player( test_origin ); + avatar &player_character = get_avatar(); + player_character.setpos( test_origin ); const tripoint vehicle_origin = test_origin + tripoint_south_east; - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); + vehicle *veh_ptr = here.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, -90, 0, 0 ); REQUIRE( veh_ptr != nullptr ); tripoint grab_point = test_origin + tripoint_east; - g->u.grab( object_type::VEHICLE, grab_point ); - REQUIRE( g->u.get_grab_type() != object_type::NONE ); - REQUIRE( g->u.grab_point == grab_point ); + player_character.grab( object_type::VEHICLE, grab_point ); + REQUIRE( player_character.get_grab_type() != object_type::NONE ); + REQUIRE( player_character.grab_point == grab_point ); WHEN( "The vehicle section grabbed by the player is destroyed" ) { - g->m.destroy( grab_point ); + here.destroy( grab_point ); REQUIRE( veh_ptr->get_parts_at( grab_point, "", part_status_flag::available ).empty() ); THEN( "The player's grab is released" ) { - CHECK( g->u.get_grab_type() == object_type::NONE ); - CHECK( g->u.grab_point == tripoint_zero ); + CHECK( player_character.get_grab_type() == object_type::NONE ); + CHECK( player_character.grab_point == tripoint_zero ); } } } @@ -54,7 +57,7 @@ TEST_CASE( "add_item_to_broken_vehicle_part" ) clear_map(); const tripoint test_origin( 60, 60, 0 ); const tripoint vehicle_origin = test_origin; - vehicle *veh_ptr = g->m.add_vehicle( vproto_id( "bicycle" ), vehicle_origin, 0, 0, 0 ); + vehicle *veh_ptr = get_map().add_vehicle( vproto_id( "bicycle" ), vehicle_origin, 0, 0, 0 ); REQUIRE( veh_ptr != nullptr ); const tripoint pos = vehicle_origin + tripoint_west; diff --git a/tests/vehicle_turrets_test.cpp b/tests/vehicle_turrets_test.cpp index 8f8afb3d43083..a1416f8983660 100644 --- a/tests/vehicle_turrets_test.cpp +++ b/tests/vehicle_turrets_test.cpp @@ -5,9 +5,8 @@ #include #include "ammo.h" -#include "avatar.h" #include "catch/catch.hpp" -#include "game.h" +#include "character.h" #include "item.h" #include "item_location.h" #include "itype.h" @@ -61,9 +60,11 @@ static const vpart_info *biggest_tank( const ammotype &ammo ) TEST_CASE( "vehicle_turret", "[vehicle] [gun] [magazine] [.]" ) { + map &here = get_map(); + Character &player_character = get_player_character(); for( auto e : turret_types() ) { SECTION( e->name() ) { - vehicle *veh = g->m.add_vehicle( vproto_id( "none" ), point( 65, 65 ), 270, 0, 0 ); + vehicle *veh = here.add_vehicle( vproto_id( "none" ), point( 65, 65 ), 270, 0, 0 ); REQUIRE( veh ); const int idx = veh->install_part( point_zero, e->get_id(), true ); @@ -94,10 +95,10 @@ TEST_CASE( "vehicle_turret", "[vehicle] [gun] [magazine] [.]" ) REQUIRE( qry.query() == turret_data::status::ready ); REQUIRE( qry.range() > 0 ); - g->u.setpos( veh->global_part_pos3( idx ) ); - REQUIRE( qry.fire( g->u, g->u.pos() + point( qry.range(), 0 ) ) > 0 ); + player_character.setpos( veh->global_part_pos3( idx ) ); + REQUIRE( qry.fire( player_character, player_character.pos() + point( qry.range(), 0 ) ) > 0 ); - g->m.destroy_vehicle( veh ); + here.destroy_vehicle( veh ); } } } diff --git a/tests/vision_test.cpp b/tests/vision_test.cpp index a9d218973675b..e711727bd13b3 100644 --- a/tests/vision_test.cpp +++ b/tests/vision_test.cpp @@ -8,7 +8,6 @@ #include #include -#include "avatar.h" #include "calendar.h" #include "catch/catch.hpp" #include "character.h" @@ -56,23 +55,24 @@ static void full_map_test( const std::vector &setup, const efftype_id effect_narcosis( "narcosis" ); const ter_id t_flat_roof( "t_flat_roof" ); + Character &player_character = get_player_character(); g->place_player( tripoint( 60, 60, 0 ) ); - g->u.worn.clear(); // Remove any light-emitting clothing - g->u.clear_effects(); + player_character.worn.clear(); // Remove any light-emitting clothing + player_character.clear_effects(); clear_map(); g->reset_light_level(); if( !!( flags & vision_test_flags::crouching ) ) { - g->u.set_movement_mode( move_mode_crouch ); + player_character.set_movement_mode( move_mode_crouch ); } else { - g->u.set_movement_mode( move_mode_walk ); + player_character.set_movement_mode( move_mode_walk ); } - REQUIRE( !g->u.is_blind() ); - REQUIRE( !g->u.in_sleep_state() ); - REQUIRE( !g->u.has_effect( effect_narcosis ) ); + REQUIRE( !player_character.is_blind() ); + REQUIRE( !player_character.in_sleep_state() ); + REQUIRE( !player_character.has_effect( effect_narcosis ) ); - g->u.recalc_sight_limits(); + player_character.recalc_sight_limits(); calendar::turn = time; @@ -96,13 +96,13 @@ static void full_map_test( const std::vector &setup, case 'V': case 'U': case 'u': - origin = g->u.pos() - point( x, y ); + origin = player_character.pos() - point( x, y ); if( setup[y][x] == 'V' ) { item headlamp( "wearable_light_on" ); item battery( "light_battery_cell" ); battery.ammo_set( battery.ammo_default(), -1 ); headlamp.put_in( battery, item_pocket::pocket_type::MAGAZINE_WELL ); - g->u.worn.push_back( headlamp ); + player_character.worn.push_back( headlamp ); } break; } @@ -112,7 +112,7 @@ static void full_map_test( const std::vector &setup, { // Sanity check on player placement REQUIRE( origin.z < OVERMAP_HEIGHT ); - tripoint player_offset = g->u.pos() - origin; + tripoint player_offset = player_character.pos() - origin; REQUIRE( player_offset.y >= 0 ); REQUIRE( player_offset.y < height ); REQUIRE( player_offset.x >= 0 ); @@ -121,6 +121,7 @@ static void full_map_test( const std::vector &setup, REQUIRE( ( player_char == 'U' || player_char == 'u' || player_char == 'V' ) ); } + map &here = get_map(); for( int y = 0; y < height; ++y ) { for( int x = 0; x < width; ++x ) { const tripoint p = origin + point( x, y ); @@ -129,21 +130,21 @@ static void full_map_test( const std::vector &setup, case ' ': break; case 'L': - g->m.ter_set( p, t_utility_light ); - g->m.ter_set( above, t_flat_roof ); + here.ter_set( p, t_utility_light ); + here.ter_set( above, t_flat_roof ); break; case '#': - g->m.ter_set( p, t_brick_wall ); - g->m.ter_set( above, t_flat_roof ); + here.ter_set( p, t_brick_wall ); + here.ter_set( above, t_flat_roof ); break; case '=': - g->m.ter_set( p, t_window_frame ); - g->m.ter_set( above, t_flat_roof ); + here.ter_set( p, t_window_frame ); + here.ter_set( above, t_flat_roof ); break; case '-': case 'u': - g->m.ter_set( p, t_floor ); - g->m.ter_set( above, t_flat_roof ); + here.ter_set( p, t_floor ); + here.ter_set( above, t_flat_roof ); break; case 'U': case 'V': @@ -159,17 +160,17 @@ static void full_map_test( const std::vector &setup, // player's vision_threshold is based on the previous lighting level (so // they might, for example, have poor nightvision due to having just been // in daylight) - g->m.update_visibility_cache( origin.z ); - g->m.invalidate_map_cache( origin.z ); - g->m.build_map_cache( origin.z ); - g->m.update_visibility_cache( origin.z ); - g->m.invalidate_map_cache( origin.z ); - g->m.build_map_cache( origin.z ); - - const level_cache &cache = g->m.access_cache( origin.z ); - const level_cache &above_cache = g->m.access_cache( origin.z + 1 ); + here.update_visibility_cache( origin.z ); + here.invalidate_map_cache( origin.z ); + here.build_map_cache( origin.z ); + here.update_visibility_cache( origin.z ); + here.invalidate_map_cache( origin.z ); + here.build_map_cache( origin.z ); + + const level_cache &cache = here.access_cache( origin.z ); + const level_cache &above_cache = here.access_cache( origin.z + 1 ); const visibility_variables &vvcache = - g->m.get_visibility_variables_cache(); + here.get_visibility_variables_cache(); std::ostringstream fields; std::ostringstream transparency; @@ -186,7 +187,7 @@ static void full_map_test( const std::vector &setup, for( int x = 0; x < width; ++x ) { const tripoint p = origin + point( x, y ); const map::apparent_light_info al = map::apparent_light_helper( cache, p ); - for( auto &pr : g->m.field_at( p ) ) { + for( auto &pr : here.field_at( p ) ) { fields << pr.second.name() << ','; } fields << ' '; @@ -208,10 +209,10 @@ static void full_map_test( const std::vector &setup, floor_above << '\n'; } - INFO( "zlevels: " << g->m.has_zlevels() ); + INFO( "zlevels: " << here.has_zlevels() ); INFO( "origin: " << origin ); - INFO( "player: " << g->u.pos() ); - INFO( "unimpaired_range: " << g->u.unimpaired_range() ); + INFO( "player: " << player_character.pos() ); + INFO( "unimpaired_range: " << player_character.unimpaired_range() ); INFO( "vision_threshold: " << vvcache.vision_threshold ); INFO( "fields:\n" << fields.str() ); INFO( "transparency:\n" << transparency.str() ); @@ -228,7 +229,7 @@ static void full_map_test( const std::vector &setup, for( int y = 0; y < height; ++y ) { for( int x = 0; x < width; ++x ) { const tripoint p = origin + point( x, y ); - const lit_level level = g->m.apparent_light_at( p, vvcache ); + const lit_level level = here.apparent_light_at( p, vvcache ); const char exp_char = expected_results[y][x]; if( exp_char < '0' || exp_char > '9' ) { FAIL( "unexpected result char '" << diff --git a/tests/visitable_remove_test.cpp b/tests/visitable_remove_test.cpp index 696208e169996..3dbd44a810414 100644 --- a/tests/visitable_remove_test.cpp +++ b/tests/visitable_remove_test.cpp @@ -4,11 +4,9 @@ #include #include -#include "avatar.h" #include "calendar.h" #include "cata_utility.h" #include "catch/catch.hpp" -#include "game.h" #include "inventory.h" #include "item.h" #include "item_contents.h" @@ -16,7 +14,7 @@ #include "map.h" #include "map_selector.h" #include "optional.h" -#include "player.h" +#include "character.h" #include "point.h" #include "rng.h" #include "type_id.h" @@ -46,25 +44,26 @@ TEST_CASE( "visitable_remove", "[visitable]" ) REQUIRE( item( container_id ).is_container() ); REQUIRE( item( worn_id ).is_container() ); - player &p = g->u; + Character &p = get_player_character(); p.worn.clear(); p.worn.push_back( item( "backpack" ) ); p.inv.clear(); p.remove_weapon(); p.wear_item( item( "backpack" ) ); // so we don't drop anything + map &here = get_map(); // check if all tiles within radius are loaded within current submap and passable - const auto suitable = []( const tripoint & pos, const int radius ) { - std::vector tiles = closest_tripoints_first( pos, radius ); - return std::all_of( tiles.begin(), tiles.end(), []( const tripoint & e ) { - if( !g->m.inbounds( e ) ) { + const auto suitable = [&here]( const tripoint & pos, const int radius ) { + std::vector tiles = closest_points_first( pos, radius ); + return std::all_of( tiles.begin(), tiles.end(), [&here]( const tripoint & e ) { + if( !here.inbounds( e ) ) { return false; } - if( const optional_vpart_position vp = g->m.veh_at( e ) ) { - g->m.destroy_vehicle( &vp->vehicle() ); + if( const optional_vpart_position vp = here.veh_at( e ) ) { + here.destroy_vehicle( &vp->vehicle() ); } - g->m.i_clear( e ); - return g->m.passable( e ); + here.i_clear( e ); + return here.passable( e ); } ); }; @@ -73,7 +72,7 @@ TEST_CASE( "visitable_remove", "[visitable]" ) // move player randomly until we find a suitable position while( !suitable( p.pos(), 1 ) ) { CHECK( !p.in_vehicle ); - p.setpos( random_entry( closest_tripoints_first( p.pos(), 1 ) ) ); + p.setpos( random_entry( closest_points_first( p.pos(), 1 ) ) ); } item temp_liquid( liquid_id ); @@ -296,7 +295,7 @@ TEST_CASE( "visitable_remove", "[visitable]" ) } GIVEN( "A player surrounded by several bottles of water" ) { - std::vector tiles = closest_tripoints_first( p.pos(), 1 ); + std::vector tiles = closest_points_first( p.pos(), 1 ); tiles.erase( tiles.begin() ); // player tile int our = 0; // bottles placed on player tile @@ -306,11 +305,11 @@ TEST_CASE( "visitable_remove", "[visitable]" ) if( i == 0 || tiles.empty() ) { // always place at least one bottle on player tile our++; - g->m.add_item( p.pos(), obj ); + here.add_item( p.pos(), obj ); } else { // randomly place bottles on adjacent tiles adj++; - g->m.add_item( random_entry( tiles ), obj ); + here.add_item( random_entry( tiles ), obj ); } } REQUIRE( our + adj == count ); @@ -413,16 +412,16 @@ TEST_CASE( "visitable_remove", "[visitable]" ) } GIVEN( "An adjacent vehicle contains several bottles of water" ) { - std::vector tiles = closest_tripoints_first( p.pos(), 1 ); + std::vector tiles = closest_points_first( p.pos(), 1 ); tiles.erase( tiles.begin() ); // player tile tripoint veh = random_entry( tiles ); - REQUIRE( g->m.add_vehicle( vproto_id( "shopping_cart" ), veh, 0, 0, 0 ) ); + REQUIRE( here.add_vehicle( vproto_id( "shopping_cart" ), veh, 0, 0, 0 ) ); - REQUIRE( std::count_if( tiles.begin(), tiles.end(), []( const tripoint & e ) { - return static_cast( g->m.veh_at( e ) ); + REQUIRE( std::count_if( tiles.begin(), tiles.end(), [&here]( const tripoint & e ) { + return static_cast( here.veh_at( e ) ); } ) == 1 ); - const cata::optional vp = g->m.veh_at( veh ).part_with_feature( "CARGO", true ); + const cata::optional vp = here.veh_at( veh ).part_with_feature( "CARGO", true ); REQUIRE( vp ); vehicle *const v = &vp->vehicle(); const int part = vp->part_index(); diff --git a/tests/weather_test.cpp b/tests/weather_test.cpp index 29b95858e1232..1e2befc78f779 100644 --- a/tests/weather_test.cpp +++ b/tests/weather_test.cpp @@ -70,7 +70,7 @@ TEST_CASE( "weather realism" ) int hour = to_hours( time_past_new_year( i ) ); hourly_precip[hour] += precip_mm_per_hour( - weather::precip( wgen.get_weather_conditions( w ) ) ) + wgen.get_weather_conditions( w )->precip ) / 60; } diff --git a/tests/wield_times_test.cpp b/tests/wield_times_test.cpp index c0bcb357550ff..9cd37fb745a8c 100644 --- a/tests/wield_times_test.cpp +++ b/tests/wield_times_test.cpp @@ -59,6 +59,7 @@ TEST_CASE( "Wield time test", "[wield]" ) item knife( "knife_hunting" ); avatar guy; + guy.set_body(); guy.worn.push_back( backpack ); item_location backpack_loc( guy, &guy.worn.back() ); backpack_loc->put_in( plastic_bag, item_pocket::pocket_type::CONTAINER ); @@ -86,8 +87,6 @@ TEST_CASE( "Wield time test", "[wield]" ) avatar guy; clear_character( guy ); - wield_check_from_inv( guy, itype_id( "halberd" ), 612 ); - clear_character( guy ); wield_check_from_inv( guy, itype_id( "aspirin" ), 375 ); clear_character( guy ); wield_check_from_inv( guy, itype_id( "knife_combat" ), 412 ); diff --git a/tools/clang-tidy-plugin/UsePointApisCheck.cpp b/tools/clang-tidy-plugin/UsePointApisCheck.cpp index 61c82088a8916..7f71e9994431a 100644 --- a/tools/clang-tidy-plugin/UsePointApisCheck.cpp +++ b/tools/clang-tidy-plugin/UsePointApisCheck.cpp @@ -54,7 +54,9 @@ void UsePointApisCheck::registerMatchers( MatchFinder *Finder ) isXParam() ).bind( "xparam" ) ), - hasDeclaration( cxxMethodDecl( unless( ofClass( isPointType() ) ) ).bind( "callee" ) ) + hasDeclaration( + cxxMethodDecl( unless( ofClass( isPointOrCoordPointType() ) ) ).bind( "callee" ) + ) ).bind( "constructorCall" ), this ); diff --git a/tools/clang-tidy-plugin/Utils.h b/tools/clang-tidy-plugin/Utils.h index f3f51afb4d6ea..13dd8d4c15462 100644 --- a/tools/clang-tidy-plugin/Utils.h +++ b/tools/clang-tidy-plugin/Utils.h @@ -95,6 +95,14 @@ inline auto isPointType() return cxxRecordDecl( anyOf( hasName( "point" ), hasName( "tripoint" ) ) ); } +inline auto isPointOrCoordPointType() +{ + using namespace clang::ast_matchers; + return cxxRecordDecl( + anyOf( hasName( "point" ), hasName( "tripoint" ), hasName( "coord_point" ) ) + ); +} + inline auto isPointConstructor() { using namespace clang::ast_matchers; diff --git a/tools/json_tools/table.py b/tools/json_tools/table.py new file mode 100755 index 0000000000000..2b4dbb6a0806b --- /dev/null +++ b/tools/json_tools/table.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python2 +"""Print a Markdown or CSV table of JSON values from the given keys. +Run this script with -h for full usage information. + +Examples with basic field names: + + %(prog)s --type=TOOL id volume weight longest_side + %(prog)s --type=ARMOR --format=csv id encumbrance coverage + %(prog)s --type=COMESTIBLE id fun calories quench healthy + +Examples with nested attributes: + + %(prog)s --type=ARMOR name.str pocket_data.moves + %(prog)s --type=MAGAZINE name.str pocket_data.ammo_restriction + +""" + +import argparse +import codecs +import sys +import util + +# Avoid (most) unicode frustrations +# https://pythonhosted.org/kitchen/unicode-frustrations.html +UTF8Writer = codecs.getwriter('utf8') +sys.stdout = UTF8Writer(sys.stdout) + +# Command-line arguments +parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) +parser.add_argument( + "columns", metavar="column_key", nargs="+", + help="list of JSON object keys to be columns in the table") +parser.add_argument( + "--fnmatch", + default="*.json", + help="override with glob expression to select a smaller fileset.") +parser.add_argument( + "-f", "--format", + default="md", + help="output format: 'md' for markdown, 'csv' for comma-separated") +parser.add_argument( + "-t", "--type", + help="only include JSON data matching this type") + + +def safe_value(value, format): + """Return values with special characters escaped for the given format. + + CSV values are "quoted" if they contain a comma or quote: + + >>> safe_value('bacon, eggs, spam', 'csv') + '"bacon, eggs, spam"' + >>> safe_value('Tim "The Enchanter" Jones', 'csv') + '"Tim ""The Enchanter"" Jones"' + + Markdown values have "|" escaped to prevent breaking table layout: + + >>> safe_value('x|y|z', 'md') + 'x\\\\|y\\\\|z' + + """ + if format == 'md': + return value.replace('|', '\|') + + elif format == 'csv': + if ',' in value or '"' in value: + return '"%s"' % value.replace('"', '""') + else: + return value + + else: + raise ValueError("Unknown format '%s'" % format) + + +def print_row(values, format, is_header=False): + """Print a row of string values in markdown or csv format. + + >>> print_row(['name', 'quest', 'favorite color'], 'md') + | name | quest | favorite color + + >>> print_row(['Lancelot', 'Holy Grail', 'blue'], 'csv') + Lancelot,Holy Grail,blue + + """ + safe_values = [safe_value(v, format) for v in values] + + # Markdown: | col1 | col2 | col3 + if format == 'md': + print("| " + " | ".join(safe_values)) + # Markdown table needs a separator after the header + if is_header: + print("| --- " * len(safe_values)) + + # CSV: col1,col2,col3 + elif format == 'csv': + print(",".join(safe_values)) + + else: + raise ValueError("Unknown format: '%s'" % format) + + +def item_values(item, fields): + """Return item values from within the given fields, converted to strings. + + Fields may be plain string or numeric values: + + >>> item_values({'name': 'sword', 'length_cm': 90}, + ... ['name', 'length_cm']) + ['sword', '90'] + + Fields may also be nested objects; subkeys may be referenced like key.subkey: + + >>> item_values({'loc': {'x': 5, 'y': 10}}, ['loc.x', 'loc.y']) + ['5', '10'] + + Fields with a nested object list have their values combined with "/": + + >>> item_values({'locs': [{'x': 4, 'y': 8}, {'x': 5, 'y': 10}] }, + ... ['locs.x', 'locs.y']) + ['4 / 5', '8 / 10'] + + Fields may include both plain and dotted keys: + + >>> item_values({'id': 'd6', 'name': {'str': 'die', 'str_pl': 'dice'}}, + ... ['id', 'name.str', 'name.str_pl']) + ['d6', 'die', 'dice'] + + """ + values = [] + for field in fields: + if "." in field: + subkeys = field.split(".") + else: + subkeys = [field] + # Descend into dotted keys + it = item + for subkey in subkeys: + # Is it a dict with this subkey? + if isinstance(it, dict) and subkey in it: + it = it[subkey] + # Is it a list of dicts having this subkey? + elif isinstance(it, list) and all(subkey in o for o in it): + # Pull from all subkeys, or just the one + if len(it) == 1: + it = it[0][subkey] + else: + it = [i[subkey] for i in it] + # Stop if any subkey is not found + else: + it = "None" + break + + # Make dict presentable + if isinstance(it, dict): + values.append("%s" % it.items()) + # Separate lists with slashes + elif isinstance(it, list): + values.append(" / ".join("%s" % i for i in it)) + # Otherwise just force string + else: + values.append("%s" % it) + + return values + + +if __name__ == "__main__": + args = parser.parse_args() + + # Get data (don't care about load errors) + json_data, _ = util.import_data(json_fmatch=args.fnmatch) + + # Header row + print_row(args.columns, args.format, is_header=True) + + # One row per item, matching type if given + for item in json_data: + if args.type and item.get('type') != args.type: + continue + + print_row(item_values(item, args.columns), args.format) + diff --git a/utilities/building-utility/Examples/office_template.json b/utilities/building-utility/Examples/office_template.json index e51049741c8bf..3a43af797385c 100644 --- a/utilities/building-utility/Examples/office_template.json +++ b/utilities/building-utility/Examples/office_template.json @@ -1,84 +1,75 @@ -{ - "type" : "mapgen", - "om_terrain" : ["office_tower_"], +[ + { + "type": "mapgen", + "om_terrain": [ "office_tower_" ], "method": "json", "weight": 250, "_Building_Utility": { - "cell_map": { - "object_replace": [ - "object", - "rows" - ] - }, - "cell_num": { - "string_format": { - "office_tower_%s": [ - "om_terrain" - ] - } - } + "cell_map": { "object_replace": [ "object", "rows" ] }, + "cell_num": { "string_format": { "office_tower_%s": [ "om_terrain" ] } } }, "object": { - "fill_ter": "t_floor", - "rows": [], - "terrain": { - "/": "t_sky", - "~": "t_rock", - ">": "t_stairs_down", - "<": "t_stairs_up", - ".": "t_floor", - " ": "t_dirt", - "x": "t_console_broken", - ",": "t_pavement_y", - "_": "t_pavement", - "%": "t_shrub", - "+": "t_door_c", - "{": "t_rubble", - ")": "t_wreckage", - "}": "t_manhole_cover", - "@": "t_floor", - "2": "t_utility_light", - "b": "t_dirt", - "c": "t_floor", - "D": "t_door_metal_c", - "d": "t_floor", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "h": "t_floor", - "I": "t_column", - "k": "t_floor", - "L": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "^": "t_floor", - "p": "t_floor", - "R": "t_railing_v", - "r": "t_floor", - "S": "t_floor", - "s": "t_sidewalk", - "T": "t_floor", - "u": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "z": "t_floor" - }, - "furniture": { - "@": "f_bed", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "^": "f_indoor_plant", - "r": "f_rack", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "z": "f_crate_c" - } + "fill_ter": "t_floor", + "rows": [ ], + "terrain": { + "/": "t_sky", + "~": "t_rock", + ">": "t_stairs_down", + "<": "t_stairs_up", + ".": "t_floor", + " ": "t_dirt", + "x": "t_console_broken", + ",": "t_pavement_y", + "_": "t_pavement", + "%": "t_shrub", + "+": "t_door_c", + "{": "t_rubble", + ")": "t_wreckage", + "}": "t_manhole_cover", + "@": "t_floor", + "2": "t_utility_light", + "b": "t_dirt", + "c": "t_floor", + "D": "t_door_metal_c", + "d": "t_floor", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "h": "t_floor", + "I": "t_column", + "k": "t_floor", + "L": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "^": "t_floor", + "p": "t_floor", + "R": "t_railing_v", + "r": "t_floor", + "S": "t_floor", + "s": "t_sidewalk", + "T": "t_floor", + "u": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "z": "t_floor" + }, + "furniture": { + "@": "f_bed", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "^": "f_indoor_plant", + "r": "f_rack", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "z": "f_crate_c" + } } -} + } +] diff --git a/utilities/building-utility/Examples/office_terrain_template.json b/utilities/building-utility/Examples/office_terrain_template.json index 42a483c55d15b..19c342d1488fc 100644 --- a/utilities/building-utility/Examples/office_terrain_template.json +++ b/utilities/building-utility/Examples/office_terrain_template.json @@ -1,19 +1,13 @@ -{ - "type" : "overmap_terrain", - "id" : "office_tower_", - "name" : "Office Tower", - "sym" : 84, - "color" : "white", - "see_cost" : 5, - "mondensity" : 2, - "sidewalk" : true, - "_Building_Utility" : { - "cell_num" : { - "string_format" : { - "office_tower_%d" : [ - "id" - ] - } - } - } -} +[ + { + "type": "overmap_terrain", + "id": "office_tower_", + "name": "Office Tower", + "sym": 84, + "color": "white", + "see_cost": 5, + "mondensity": 2, + "sidewalk": true, + "_Building_Utility": { "cell_num": { "string_format": { "office_tower_%d": [ "id" ] } } } + } +] diff --git a/utilities/building-utility/Examples/output_office_template.json b/utilities/building-utility/Examples/output_office_template.json index afd655c0584f9..74632d67ac7a5 100644 --- a/utilities/building-utility/Examples/output_office_template.json +++ b/utilities/building-utility/Examples/output_office_template.json @@ -1,1506 +1,1506 @@ [ - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~|--------------------", - "~~~|,_____,_____,_____,s", - "~~~|,_____,_____,_____,s", - "~~~|,_____,_____,_____,s", - "~~~|,_____,_____,_____,s", - "~~~|,_____,_____,_____,s", - "~~~|,_____,_____,_____,s", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|___,,___,____,____,s", - "~~~|__,,,,__,____,____,s", - "~~~|___,,___,____,____,s", - "~~~|___,,___,____,____,s", - "~~~|________,____,____,s", - "~~~|________,____,____,s", - "~~~|________|---|---|HHG", - "~~~|________|.R<|EEE|...", - "~~~|________|.R.|EEED..." - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_1", - "type": "mapgen", - "weight": 250 + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~|--------------------", + "~~~|,_____,_____,_____,s", + "~~~|,_____,_____,_____,s", + "~~~|,_____,_____,_____,s", + "~~~|,_____,_____,_____,s", + "~~~|,_____,_____,_____,s", + "~~~|,_____,_____,_____,s", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|___,,___,____,____,s", + "~~~|__,,,,__,____,____,s", + "~~~|___,,___,____,____,s", + "~~~|___,,___,____,____,s", + "~~~|________,____,____,s", + "~~~|________,____,____,s", + "~~~|________|---|---|HHG", + "~~~|________|.R<|EEE|...", + "~~~|________|.R.|EEED..." + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "--------------------|~~~", - "s,_____,_____,_____,|~~~", - "s,_____,_____,_____,|~~~", - "s,_____,_____,_____,|~~~", - "s,_____,_____,_____,|~~~", - "s,_____,_____,_____,|~~~", - "s,_____,_____,_____,|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "s,____,____,________|~~~", - "s,____,____,________|~~~", - "s,____,____,________|~~~", - "s,____,____,________|~~~", - "s,____,____,________|~~~", - "s,____,____,________|~~~", - "GHH|---|---|________|~~~", - "...|xEE|.R<|________|~~~", - "...DEEE|.R.|___,,___|~~~" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_2", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_1", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "--------------------|~~~", + "s,_____,_____,_____,|~~~", + "s,_____,_____,_____,|~~~", + "s,_____,_____,_____,|~~~", + "s,_____,_____,_____,|~~~", + "s,_____,_____,_____,|~~~", + "s,_____,_____,_____,|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "s,____,____,________|~~~", + "s,____,____,________|~~~", + "s,____,____,________|~~~", + "s,____,____,________|~~~", + "s,____,____,________|~~~", + "s,____,____,________|~~~", + "GHH|---|---|________|~~~", + "...|xEE|.R<|________|~~~", + "...DEEE|.R.|___,,___|~~~" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "~~~|________|...|EEED...", - "~~~|________|...|EEx|...", - "~~~|________|-+-|---|HHG", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|____________________", - "~~~|____,,______,,______", - "~~~|___,,,,_____,,______", - "~~~|____,,_____,,,,__xs_", - "~~~|____,,______,,___ss_", - "~~~|-|XXXXXX||XXXXXX|---", - "~~~|~|EEEEEE||EEEEEE|~~~", - "~~~|||EEEEEE||EEEEEE|~~~", - "~~~||xEEEEEE||EEEEEE||~~", - "~~~|||EEEEEE||EEEEEEx|~~", - "~~~|~|EEEEEE||EEEEEE||~~", - "~~~|~|EEEEEE||EEEEEE|~~~", - "~~~|~|------||------|~~~", - "~~~|--------------------", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_3", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_2", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "~~~|________|...|EEED...", + "~~~|________|...|EEx|...", + "~~~|________|-+-|---|HHG", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|____________________", + "~~~|____,,______,,______", + "~~~|___,,,,_____,,______", + "~~~|____,,_____,,,,__xs_", + "~~~|____,,______,,___ss_", + "~~~|-|XXXXXX||XXXXXX|---", + "~~~|~|EEEEEE||EEEEEE|~~~", + "~~~|||EEEEEE||EEEEEE|~~~", + "~~~||xEEEEEE||EEEEEE||~~", + "~~~|||EEEEEE||EEEEEEx|~~", + "~~~|~|EEEEEE||EEEEEE||~~", + "~~~|~|EEEEEE||EEEEEE|~~~", + "~~~|~|------||------|~~~", + "~~~|--------------------", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "...DEEE|...|___,,___|~~~", - "...|EEE|...|__,,,,__|~~~", - "GHH|---|-+-|___,,___|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "____________________|~~~", - "|___________________|~~~", - "|___________________|~~~", - "|,_____,_____,_____,|~~~", - "|,_____,_____,_____,|~~~", - "|,_____,_____,_____,|~~~", - "|,_____,_____,_____,|~~~", - "|,_____,_____,_____,|~~~", - "|,_____,_____,_____,|~~~", - "|-------------------|~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~", - "~~~~~~~~~~~~~~~~~~~~~~~~" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_4", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_3", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "...DEEE|...|___,,___|~~~", + "...|EEE|...|__,,,,__|~~~", + "GHH|---|-+-|___,,___|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "____________________|~~~", + "|___________________|~~~", + "|___________________|~~~", + "|,_____,_____,_____,|~~~", + "|,_____,_____,_____,|~~~", + "|,_____,_____,_____,|~~~", + "|,_____,_____,_____,|~~~", + "|,_____,_____,_____,|~~~", + "|,_____,_____,_____,|~~~", + "|-------------------|~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~", + "~~~~~~~~~~~~~~~~~~~~~~~~" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "ssssssssssssssssssssssss", - "ssssssssssssssssssssssss", - "ss ", - "ss%%%%%%%%%%%%%%%%%%%%%%", - "ss%|-HH-|-HH-|-HH-|HH|--", - "ss%Vdcxl|dxdl|lddx|..|.S", - "ss%Vdh..|dh..|..hd|..+..", - "ss%|-..-|-..-|-..-|..|--", - "ss%V.................|.T", - "ss%V.................|..", - "ss%|-..-|-..-|-..-|..|--", - "ss%V.h..|..hd|..hd|..|..", - "ss%Vdxdl|^dxd|.xdd|..G..", - "ss%|----|----|----|..G..", - "ss%|llll|..hnnh......|..", - "ss%V.................|..", - "ss%V.ddd..........|+-|..", - "ss%|..hd|.hh.ceocc|.l|..", - "ss%|----|---------|--|..", - "ss%Vcdcl|...............", - "ss%V.h..+...............", - "ss%V...^|...|---|---|...", - "ss%|----|...||EEE|...", - "ss%|rrrr|...|.R.|EEED..." - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_5", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_4", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "ssssssssssssssssssssssss", + "ssssssssssssssssssssssss", + "ss ", + "ss%%%%%%%%%%%%%%%%%%%%%%", + "ss%|-HH-|-HH-|-HH-|HH|--", + "ss%Vdcxl|dxdl|lddx|..|.S", + "ss%Vdh..|dh..|..hd|..+..", + "ss%|-..-|-..-|-..-|..|--", + "ss%V.................|.T", + "ss%V.................|..", + "ss%|-..-|-..-|-..-|..|--", + "ss%V.h..|..hd|..hd|..|..", + "ss%Vdxdl|^dxd|.xdd|..G..", + "ss%|----|----|----|..G..", + "ss%|llll|..hnnh......|..", + "ss%V.................|..", + "ss%V.ddd..........|+-|..", + "ss%|..hd|.hh.ceocc|.l|..", + "ss%|----|---------|--|..", + "ss%Vcdcl|...............", + "ss%V.h..+...............", + "ss%V...^|...|---|---|...", + "ss%|----|...||EEE|...", + "ss%|rrrr|...|.R.|EEED..." + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "ssssssssssssssssssssssss", - "ssssssssssssssssssssssss", - " ss", - "%%%%%%%%%%%%%%%%%%%%%%ss", - "--|---|--HHHH-HHHH--|%ss", - ".T|..l|............^|%ss", - "..|-+-|...hhhhhhh...V%ss", - "--|...G...nnnnnnn...V%ss", - ".S|...G...nnnnnnn...V%ss", - "..+...|...hhhhhhh...V%ss", - "--|...|.............|%ss", - "..|...|-------------|%ss", - "..G....|l.......dxd^|%ss", - "..G....G...h....dh..V%ss", - "..|....|............V%ss", - "..|....|------|llccc|%ss", - "..|...........|-----|%ss", - "..|...........|...ddV%ss", - "..|----|---|......hdV%ss", - ".......+...|..|l...dV%ss", - ".......|rrr|..|-----|%ss", - "...|---|---|..|l.dddV%ss", - "...|xEE||......hdV%ss", - "...DEEE|.R.|..|.....V%ss" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_6", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_5", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "ssssssssssssssssssssssss", + "ssssssssssssssssssssssss", + " ss", + "%%%%%%%%%%%%%%%%%%%%%%ss", + "--|---|--HHHH-HHHH--|%ss", + ".T|..l|............^|%ss", + "..|-+-|...hhhhhhh...V%ss", + "--|...G...nnnnnnn...V%ss", + ".S|...G...nnnnnnn...V%ss", + "..+...|...hhhhhhh...V%ss", + "--|...|.............|%ss", + "..|...|-------------|%ss", + "..G....|l.......dxd^|%ss", + "..G....G...h....dh..V%ss", + "..|....|............V%ss", + "..|....|------|llccc|%ss", + "..|...........|-----|%ss", + "..|...........|...ddV%ss", + "..|----|---|......hdV%ss", + ".......+...|..|l...dV%ss", + ".......|rrr|..|-----|%ss", + "...|---|---|..|l.dddV%ss", + "...|xEE||......hdV%ss", + "...DEEE|.R.|..|.....V%ss" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "ss%|....+...|...|EEED...", - "ss%|----|...|...|EEx|...", - "ss%Vcdc^|...|-+-|---|...", - "ss%Vch..+...............", - "ss%V....|...............", - "ss%|----|-|-+--ccc--|...", - "ss%|..C..C|.....h..r|-+-", - "sss=......+..h.....r|...", - "ss%|r..CC.|.ddd....r|T.S", - "ss%|------|---------|---", - "ss%|~~~~~~~~~~~~~~~~~~~~", - "ss%|~|------||------|~~~", - "ss%|~|EEEEEE||EEEEEE|~~~", - "ss%|||EEEEEE||EEEEEE|~~~", - "ss%||xEEEEEE||EEEEEE||~~", - "ss%|||EEEEEE||EEEEEEx|~~", - "ss%|~|EEEEEE||EEEEEE||~~", - "ss%|~|EEEEEE||EEEEEE|~~~", - "ss%|~|XXXXXX||XXXXXX|~~~", - "ss%|-|__,,__||__,,__|---", - "ss%% x_,,,,_ __,,__ %%", - "ss __,,__ _,,,,_ ", - "ssssss__,,__ss__,,__ssss", - "ssssss______ss______ssss" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_7", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_6", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "ss%|....+...|...|EEED...", + "ss%|----|...|...|EEx|...", + "ss%Vcdc^|...|-+-|---|...", + "ss%Vch..+...............", + "ss%V....|...............", + "ss%|----|-|-+--ccc--|...", + "ss%|..C..C|.....h..r|-+-", + "sss=......+..h.....r|...", + "ss%|r..CC.|.ddd....r|T.S", + "ss%|------|---------|---", + "ss%|~~~~~~~~~~~~~~~~~~~~", + "ss%|~|------||------|~~~", + "ss%|~|EEEEEE||EEEEEE|~~~", + "ss%|||EEEEEE||EEEEEE|~~~", + "ss%||xEEEEEE||EEEEEE||~~", + "ss%|||EEEEEE||EEEEEEx|~~", + "ss%|~|EEEEEE||EEEEEE||~~", + "ss%|~|EEEEEE||EEEEEE|~~~", + "ss%|~|XXXXXX||XXXXXX|~~~", + "ss%|-|__,,__||__,,__|---", + "ss%% x_,,,,_ __,,__ %%", + "ss __,,__ _,,,,_ ", + "ssssss__,,__ss__,,__ssss", + "ssssss______ss______ssss" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "...DEEE|...|..|-----|%ss", - "...|EEE|...|..|^...lV%ss", - "...|---|-+-|......hdV%ss", - "...........G..|..dddV%ss", - "...........G..|-----|%ss", - ".......|---|..|...ddV%ss", - "|+-|...|...+......hdV%ss", - "|.l|...|rr.|.^|l...dV%ss", - "|--|...|---|--|-----|%ss", - "|...........c.......V%ss", - "|.......cxh.c.bbbbb.Vsss", - "|.......ccccc.......Gsss", - "|...................Gsss", - "|...................Vsss", - "|b..................Gsss", - "|b..................Gsss", - "|b..................Vsss", - "|b............bbbbb.V%ss", - "|...................|%ss", - "--HHHHHGGHHGGHHHHH--|%ss", - "%%%%% ssssssss %%%%%%%ss", - " ssssssss ss", - "ssssssssssssssssssssssss", - "ssssssssssssssssssssssss" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_8", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_7", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "...DEEE|...|..|-----|%ss", + "...|EEE|...|..|^...lV%ss", + "...|---|-+-|......hdV%ss", + "...........G..|..dddV%ss", + "...........G..|-----|%ss", + ".......|---|..|...ddV%ss", + "|+-|...|...+......hdV%ss", + "|.l|...|rr.|.^|l...dV%ss", + "|--|...|---|--|-----|%ss", + "|...........c.......V%ss", + "|.......cxh.c.bbbbb.Vsss", + "|.......ccccc.......Gsss", + "|...................Gsss", + "|...................Vsss", + "|b..................Gsss", + "|b..................Gsss", + "|b..................Vsss", + "|b............bbbbb.V%ss", + "|...................|%ss", + "--HHHHHGGHHGGHHHHH--|%ss", + "%%%%% ssssssss %%%%%%%ss", + " ssssssss ss", + "ssssssssssssssssssssssss", + "ssssssssssssssssssssssss" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "///|-HHH-HHH-HHH--|HHHH|", - "///|^.........^ll^V....|", - "///V...x.hx..x....V..hd|", - "///V..hd..d.hd....V.ddx|", - "///V...d..d..d....G....|", - "///|..............V....|", - "///V..............Vllll|", - "///V...x..x..x....|----|", - "///V...d..d.hd....|.....", - "///|..hd..d..d....|...ch", - "///V..............|^..cc", - "///V....................", - "///V...x................", - "///|..hd....|--|--|-HH-G", - "///|l..d....|ST|..|.....", - "///|----|...+..|..+.....", - "///|rrCC|...|..|..|.....", - "///|....+...|--||-|-|...", - "///|rr..|...|>R<|EEE|...", - "///|----|...|.R.|EEED..." - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_9", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_8", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "///|-HHH-HHH-HHH--|HHHH|", + "///|^.........^ll^V....|", + "///V...x.hx..x....V..hd|", + "///V..hd..d.hd....V.ddx|", + "///V...d..d..d....G....|", + "///|..............V....|", + "///V..............Vllll|", + "///V...x..x..x....|----|", + "///V...d..d.hd....|.....", + "///|..hd..d..d....|...ch", + "///V..............|^..cc", + "///V....................", + "///V...x................", + "///|..hd....|--|--|-HH-G", + "///|l..d....|ST|..|.....", + "///|----|...+..|..+.....", + "///|rrCC|...|..|..|.....", + "///|....+...|--||-|-|...", + "///|rr..|...|>R<|EEE|...", + "///|----|...|.R.|EEED..." + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "HHHHH|--HHH-HHH-HHH-|///", - ".....Vll........h..^|///", - ".h.c.V.....h........V///", - "xccc.V....ddx..ddx..V///", - ".....G..............V///", - "..h..V.....h...h....|///", - "^...^V....ddx..ddx..V///", - "-----|.....h........V///", - ".....|..........h...V///", - ".c...|....ddx..ddx..|///", - "xc..^|..............V///", - "................h...V///", - "...............ddx..V///", - "G-HH-|--|--|........|///", - ".....|..|TS|.......^|///", - ".....+..|..+...|----|///", - ".....|..|..|...|..CC|///", - "...|-|-||--|...+....|///", - "...|xEE|>R.|...|rrrr|///", - "...DEEE|.R.|...|----|///" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_10", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_9", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "HHHHH|--HHH-HHH-HHH-|///", + ".....Vll........h..^|///", + ".h.c.V.....h........V///", + "xccc.V....ddx..ddx..V///", + ".....G..............V///", + "..h..V.....h...h....|///", + "^...^V....ddx..ddx..V///", + "-----|.....h........V///", + ".....|..........h...V///", + ".c...|....ddx..ddx..|///", + "xc..^|..............V///", + "................h...V///", + "...............ddx..V///", + "G-HH-|--|--|........|///", + ".....|..|TS|.......^|///", + ".....+..|..+...|----|///", + ".....|..|..|...|..CC|///", + "...|-|-||--|...+....|///", + "...|xEE|>R.|...|rrrr|///", + "...DEEE|.R.|...|----|///" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "///|....+...|...|EEED...", - "///|T.S.|...+...|EEx|...", - "///|----|...|---|-|-|...", - "///|lll.....Vdd..l|.....", - "///V....c...Vdh..r|.....", - "///V..h.c...Vx....|^....", - "///|ccc6c...|-HGH-|-HHHH", - "///V....................", - "///V....................", - "///V....................", - "///|.ddx..ddx..ddx|-HHHG", - "///V..h....h....h.|.....", - "///V..............|.....", - "///V.ddx..ddx..ddx|.hnn.", - "///|........h..h..|.hnn.", - "///V..h...........|.hnnn", - "///V.ddx..ddx..ddx|.hnnn", - "///V..h....h......|...hh", - "///|............h.|.....", - "///|-HHH-HHHH-HHH-|-HHHH", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_11", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_10", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "///|....+...|...|EEED...", + "///|T.S.|...+...|EEx|...", + "///|----|...|---|-|-|...", + "///|lll.....Vdd..l|.....", + "///V....c...Vdh..r|.....", + "///V..h.c...Vx....|^....", + "///|ccc6c...|-HGH-|-HHHH", + "///V....................", + "///V....................", + "///V....................", + "///|.ddx..ddx..ddx|-HHHG", + "///V..h....h....h.|.....", + "///V..............|.....", + "///V.ddx..ddx..ddx|.hnn.", + "///|........h..h..|.hnn.", + "///V..h...........|.hnnn", + "///V.ddx..ddx..ddx|.hnnn", + "///V..h....h......|...hh", + "///|............h.|.....", + "///|-HHH-HHHH-HHH-|-HHHH", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "...DEEE|...|...+....|///", - "...|EEE|...+...|.S.T|///", - "...|-|-|---|...|----|///", - ".....|c..rrV......ll|///", - ".....|ch...+...c....V///", - "....^|ddd..V...6h...V///", - "HHHH-|-HHH-|...ccccc|///", - "....................V///", - "....................V///", - "....................V///", - "GHHH-|----|GG|--++--|///", - ".....|ccSe|..|^....^V///", - ".....|....|..|......V///", - ".nnh.|.......|..ddxdV///", - ".nnh.|.......|....hdV///", - "nnnh.|hh...hh|l.....V///", - "nnnh.|nn...nn|-+----|///", - "hh...|nn...nn|r..H.l|///", - ".....|hh...hh|r....l|///", - "HHHH-|-HHHHH-|--HHH-|///", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_12", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_11", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "...DEEE|...|...+....|///", + "...|EEE|...+...|.S.T|///", + "...|-|-|---|...|----|///", + ".....|c..rrV......ll|///", + ".....|ch...+...c....V///", + "....^|ddd..V...6h...V///", + "HHHH-|-HHH-|...ccccc|///", + "....................V///", + "....................V///", + "....................V///", + "GHHH-|----|GG|--++--|///", + ".....|ccSe|..|^....^V///", + ".....|....|..|......V///", + ".nnh.|.......|..ddxdV///", + ".nnh.|.......|....hdV///", + "nnnh.|hh...hh|l.....V///", + "nnnh.|nn...nn|-+----|///", + "hh...|nn...nn|r..H.l|///", + ".....|hh...hh|r....l|///", + "HHHH-|-HHHHH-|--HHH-|///", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssss|---|sssssss", - "///sssssssss|.R>|sssssss", - "///sssssssss|.R.|sssssss" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_13", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_12", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssss|---|sssssss", + "///sssssssss|.R>|sssssss", + "///sssssssss|.R.|sssssss" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_14", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_13", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "///sssssssss|...|sssssss", - "///sssssssss|...|sssssss", - "///sssssssss|-+-|sssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "///sssssssssssssssssssss", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_15", - "type": "mapgen", - "weight": 250 + "om_terrain": "office_tower_14", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "///sssssssss|...|sssssss", + "///sssssssss|...|sssssss", + "///sssssssss|-+-|sssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "///sssssssssssssssssssss", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } }, - { - "method": "json", - "object": { - "fill_ter": "t_floor", - "furniture": { - "@": "f_bed", - "S": "f_sink", - "T": "f_toilet", - "U": "f_statue", - "^": "f_indoor_plant", - "b": "f_bench", - "c": "f_counter", - "d": "f_desk", - "h": "f_chair", - "l": "f_locker", - "n": "f_table", - "o": "f_bookcase", - "r": "f_rack", - "z": "f_crate_c" - }, - "rows": [ - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "sssssssssssssssssssss///", - "////////////////////////", - "////////////////////////", - "////////////////////////", - "////////////////////////" - ], - "terrain": { - " ": "t_dirt", - "%": "t_shrub", - ")": "t_wreckage", - "+": "t_door_c", - ",": "t_pavement_y", - ".": "t_floor", - "/": "t_sky", - "2": "t_utility_light", - "<": "t_stairs_up", - ">": "t_stairs_down", - "@": "t_floor", - "D": "t_door_metal_c", - "E": "t_elevator", - "G": "t_door_glass_c", - "H": "t_wall_glass_h", - "I": "t_column", - "L": "t_floor", - "R": "t_railing_v", - "S": "t_floor", - "T": "t_floor", - "V": "t_wall_glass_v", - "X": "t_door_metal_locked", - "^": "t_floor", - "_": "t_pavement", - "b": "t_dirt", - "c": "t_floor", - "d": "t_floor", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "r": "t_floor", - "s": "t_sidewalk", - "u": "t_floor", - "x": "t_console_broken", - "z": "t_floor", - "{": "t_rubble", - "}": "t_manhole_cover", - "~": "t_rock" - } - }, - "om_terrain": "office_tower_16", - "type": "mapgen", - "weight": 250 - } -] \ No newline at end of file + "om_terrain": "office_tower_15", + "type": "mapgen", + "weight": 250 + }, + { + "method": "json", + "object": { + "fill_ter": "t_floor", + "furniture": { + "@": "f_bed", + "S": "f_sink", + "T": "f_toilet", + "U": "f_statue", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_counter", + "d": "f_desk", + "h": "f_chair", + "l": "f_locker", + "n": "f_table", + "o": "f_bookcase", + "r": "f_rack", + "z": "f_crate_c" + }, + "rows": [ + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "sssssssssssssssssssss///", + "////////////////////////", + "////////////////////////", + "////////////////////////", + "////////////////////////" + ], + "terrain": { + " ": "t_dirt", + "%": "t_shrub", + ")": "t_wreckage", + "+": "t_door_c", + ",": "t_pavement_y", + ".": "t_floor", + "/": "t_sky", + "2": "t_utility_light", + "<": "t_stairs_up", + ">": "t_stairs_down", + "@": "t_floor", + "D": "t_door_metal_c", + "E": "t_elevator", + "G": "t_door_glass_c", + "H": "t_wall_glass_h", + "I": "t_column", + "L": "t_floor", + "R": "t_railing_v", + "S": "t_floor", + "T": "t_floor", + "V": "t_wall_glass_v", + "X": "t_door_metal_locked", + "^": "t_floor", + "_": "t_pavement", + "b": "t_dirt", + "c": "t_floor", + "d": "t_floor", + "h": "t_floor", + "k": "t_floor", + "l": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "r": "t_floor", + "s": "t_sidewalk", + "u": "t_floor", + "x": "t_console_broken", + "z": "t_floor", + "{": "t_rubble", + "}": "t_manhole_cover", + "~": "t_rock" + } + }, + "om_terrain": "office_tower_16", + "type": "mapgen", + "weight": 250 + } +] diff --git a/utilities/building-utility/Examples/output_office_terrain_template.json b/utilities/building-utility/Examples/output_office_terrain_template.json index 14c03c09f799d..2926461dfd25e 100644 --- a/utilities/building-utility/Examples/output_office_terrain_template.json +++ b/utilities/building-utility/Examples/output_office_terrain_template.json @@ -1,162 +1,162 @@ [ - { - "color": "white", - "id": "office_tower_1", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_2", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_3", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_4", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_5", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_6", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_7", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_8", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_9", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_10", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_11", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_12", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_13", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_14", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_15", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - }, - { - "color": "white", - "id": "office_tower_16", - "mondensity": 2, - "name": "Office Tower", - "see_cost": 5, - "sidewalk": true, - "sym": 84, - "type": "overmap_terrain" - } -] \ No newline at end of file + { + "color": "white", + "id": "office_tower_1", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_2", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_3", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_4", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_5", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_6", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_7", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_8", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_9", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_10", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_11", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_12", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_13", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_14", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_15", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + }, + { + "color": "white", + "id": "office_tower_16", + "mondensity": 2, + "name": "Office Tower", + "see_cost": 5, + "sidewalk": true, + "sym": 84, + "type": "overmap_terrain" + } +]